Merge "Import the Layoutlib from hc-mr1." into honeycomb-mr2
This commit is contained in:
committed by
Android (Google) Code Review
commit
2a6dc7f19d
@ -425,7 +425,7 @@ public final class Canvas_Delegate {
|
||||
AffineTransform matrixTx = matrixDelegate.getAffineTransform();
|
||||
|
||||
// combine them so that the given matrix is applied after.
|
||||
currentTx.preConcatenate(matrixTx);
|
||||
currentTx.concatenate(matrixTx);
|
||||
|
||||
// give it to the graphics2D as a new matrix replacing all previous transform
|
||||
snapshot.setTransform(currentTx);
|
||||
@ -717,7 +717,7 @@ public final class Canvas_Delegate {
|
||||
/*package*/ static void native_drawCircle(int nativeCanvas,
|
||||
float cx, float cy, float radius, int paint) {
|
||||
native_drawOval(nativeCanvas,
|
||||
new RectF(cx - radius, cy - radius, radius*2, radius*2),
|
||||
new RectF(cx - radius, cy - radius, radius, radius),
|
||||
paint);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.os;
|
||||
|
||||
import com.android.layoutlib.bridge.android.BridgeContext;
|
||||
import com.android.layoutlib.bridge.impl.RenderAction;
|
||||
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Delegate overriding selected methods of android.os.HandlerThread
|
||||
*
|
||||
* Through the layoutlib_create tool, selected methods of Handler have been replaced
|
||||
* by calls to methods of the same name in this delegate class.
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class HandlerThread_Delegate {
|
||||
|
||||
private static Map<BridgeContext, List<HandlerThread>> sThreads =
|
||||
new HashMap<BridgeContext, List<HandlerThread>>();
|
||||
|
||||
public static void cleanUp(BridgeContext context) {
|
||||
List<HandlerThread> list = sThreads.get(context);
|
||||
if (list != null) {
|
||||
for (HandlerThread thread : list) {
|
||||
thread.quit();
|
||||
}
|
||||
|
||||
list.clear();
|
||||
sThreads.remove(context);
|
||||
}
|
||||
}
|
||||
|
||||
// -------- Delegate methods
|
||||
|
||||
@LayoutlibDelegate
|
||||
/*package*/ static void run(HandlerThread theThread) {
|
||||
// record the thread so that it can be quit() on clean up.
|
||||
BridgeContext context = RenderAction.getCurrentContext();
|
||||
List<HandlerThread> list = sThreads.get(context);
|
||||
if (list == null) {
|
||||
list = new ArrayList<HandlerThread>();
|
||||
sThreads.put(context, list);
|
||||
}
|
||||
|
||||
list.add(theThread);
|
||||
|
||||
// ---- START DEFAULT IMPLEMENTATION.
|
||||
|
||||
theThread.mTid = Process.myTid();
|
||||
Looper.prepare();
|
||||
synchronized (theThread) {
|
||||
theThread.mLooper = Looper.myLooper();
|
||||
theThread.notifyAll();
|
||||
}
|
||||
Process.setThreadPriority(theThread.mPriority);
|
||||
theThread.onLooperPrepared();
|
||||
Looper.loop();
|
||||
theThread.mTid = -1;
|
||||
}
|
||||
}
|
@ -22,7 +22,10 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import android.content.res.TypedArray;
|
||||
import android.content.res.XmlResourceParser;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Xml;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@ -35,6 +38,8 @@ import java.io.IOException;
|
||||
*/
|
||||
public class LayoutInflater_Delegate {
|
||||
|
||||
public static boolean sIsInInclude = false;
|
||||
|
||||
/**
|
||||
* Recursive method used to descend down the xml hierarchy and instantiate
|
||||
* views, instantiate their children, and then call onFinishInflate().
|
||||
@ -94,4 +99,128 @@ public class LayoutInflater_Delegate {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@LayoutlibDelegate
|
||||
public static void parseInclude(
|
||||
LayoutInflater thisInflater,
|
||||
XmlPullParser parser, View parent, AttributeSet attrs)
|
||||
throws XmlPullParserException, IOException {
|
||||
|
||||
int type;
|
||||
|
||||
if (parent instanceof ViewGroup) {
|
||||
final int layout = attrs.getAttributeResourceValue(null, "layout", 0);
|
||||
if (layout == 0) {
|
||||
final String value = attrs.getAttributeValue(null, "layout");
|
||||
if (value == null) {
|
||||
throw new InflateException("You must specifiy a layout in the"
|
||||
+ " include tag: <include layout=\"@layout/layoutID\" />");
|
||||
} else {
|
||||
throw new InflateException("You must specifiy a valid layout "
|
||||
+ "reference. The layout ID " + value + " is not valid.");
|
||||
}
|
||||
} else {
|
||||
final XmlResourceParser childParser =
|
||||
thisInflater.getContext().getResources().getLayout(layout);
|
||||
|
||||
try {
|
||||
final AttributeSet childAttrs = Xml.asAttributeSet(childParser);
|
||||
|
||||
while ((type = childParser.next()) != XmlPullParser.START_TAG &&
|
||||
type != XmlPullParser.END_DOCUMENT) {
|
||||
// Empty.
|
||||
}
|
||||
|
||||
if (type != XmlPullParser.START_TAG) {
|
||||
throw new InflateException(childParser.getPositionDescription() +
|
||||
": No start tag found!");
|
||||
}
|
||||
|
||||
final String childName = childParser.getName();
|
||||
|
||||
if (LayoutInflater.TAG_MERGE.equals(childName)) {
|
||||
// Inflate all children.
|
||||
thisInflater.rInflate(childParser, parent, childAttrs, false);
|
||||
} else {
|
||||
final View view = thisInflater.createViewFromTag(parent, childName, childAttrs);
|
||||
final ViewGroup group = (ViewGroup) parent;
|
||||
|
||||
// We try to load the layout params set in the <include /> tag. If
|
||||
// they don't exist, we will rely on the layout params set in the
|
||||
// included XML file.
|
||||
// During a layoutparams generation, a runtime exception is thrown
|
||||
// if either layout_width or layout_height is missing. We catch
|
||||
// this exception and set localParams accordingly: true means we
|
||||
// successfully loaded layout params from the <include /> tag,
|
||||
// false means we need to rely on the included layout params.
|
||||
ViewGroup.LayoutParams params = null;
|
||||
try {
|
||||
// ---- START CHANGES
|
||||
sIsInInclude = true;
|
||||
// ---- END CHANGES
|
||||
|
||||
params = group.generateLayoutParams(attrs);
|
||||
|
||||
} catch (RuntimeException e) {
|
||||
// ---- START CHANGES
|
||||
sIsInInclude = false;
|
||||
// ---- END CHANGES
|
||||
|
||||
params = group.generateLayoutParams(childAttrs);
|
||||
} finally {
|
||||
// ---- START CHANGES
|
||||
sIsInInclude = false;
|
||||
// ---- END CHANGES
|
||||
|
||||
if (params != null) {
|
||||
view.setLayoutParams(params);
|
||||
}
|
||||
}
|
||||
|
||||
// Inflate all children.
|
||||
thisInflater.rInflate(childParser, view, childAttrs, true);
|
||||
|
||||
// Attempt to override the included layout's android:id with the
|
||||
// one set on the <include /> tag itself.
|
||||
TypedArray a = thisInflater.mContext.obtainStyledAttributes(attrs,
|
||||
com.android.internal.R.styleable.View, 0, 0);
|
||||
int id = a.getResourceId(com.android.internal.R.styleable.View_id, View.NO_ID);
|
||||
// While we're at it, let's try to override android:visibility.
|
||||
int visibility = a.getInt(com.android.internal.R.styleable.View_visibility, -1);
|
||||
a.recycle();
|
||||
|
||||
if (id != View.NO_ID) {
|
||||
view.setId(id);
|
||||
}
|
||||
|
||||
switch (visibility) {
|
||||
case 0:
|
||||
view.setVisibility(View.VISIBLE);
|
||||
break;
|
||||
case 1:
|
||||
view.setVisibility(View.INVISIBLE);
|
||||
break;
|
||||
case 2:
|
||||
view.setVisibility(View.GONE);
|
||||
break;
|
||||
}
|
||||
|
||||
group.addView(view);
|
||||
}
|
||||
} finally {
|
||||
childParser.close();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
throw new InflateException("<include /> can only be used inside of a ViewGroup");
|
||||
}
|
||||
|
||||
final int currentDepth = parser.getDepth();
|
||||
while (((type = parser.next()) != XmlPullParser.END_TAG ||
|
||||
parser.getDepth() > currentDepth) && type != XmlPullParser.END_DOCUMENT) {
|
||||
// Empty
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge {
|
||||
Capability.UNBOUND_RENDERING,
|
||||
Capability.CUSTOM_BACKGROUND_COLOR,
|
||||
Capability.RENDER,
|
||||
//Capability.LAYOUT_ONLY, // disable to run on ADT 10.0 which doesn't include this.
|
||||
Capability.LAYOUT_ONLY,
|
||||
Capability.EMBEDDED_LAYOUT,
|
||||
Capability.VIEW_MANIPULATION,
|
||||
Capability.PLAY_ANIMATION,
|
||||
|
@ -71,7 +71,6 @@ import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
@ -342,7 +341,7 @@ public final class BridgeContext extends Activity {
|
||||
try {
|
||||
KXmlParser parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(xml));
|
||||
parser.setInput(new FileInputStream(xml), "UTF-8"); //$NON-NLS-1$);
|
||||
|
||||
// set the resource ref to have correct view cookies
|
||||
mBridgeInflater.setResourceReference(resource);
|
||||
@ -514,14 +513,13 @@ public final class BridgeContext extends Activity {
|
||||
BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length,
|
||||
isPlatformFile);
|
||||
|
||||
// resolve the defStyleAttr value into a IStyleResourceValue
|
||||
StyleResourceValue defStyleValues = null;
|
||||
|
||||
// look for a custom style.
|
||||
String customStyle = null;
|
||||
if (set != null) {
|
||||
customStyle = set.getAttributeValue(null /* namespace*/, "style");
|
||||
}
|
||||
|
||||
StyleResourceValue customStyleValues = null;
|
||||
if (customStyle != null) {
|
||||
ResourceValue item = mRenderResources.findResValue(customStyle,
|
||||
false /*forceFrameworkOnly*/);
|
||||
@ -530,75 +528,76 @@ public final class BridgeContext extends Activity {
|
||||
item = mRenderResources.resolveResValue(item);
|
||||
|
||||
if (item instanceof StyleResourceValue) {
|
||||
defStyleValues = (StyleResourceValue)item;
|
||||
customStyleValues = (StyleResourceValue)item;
|
||||
}
|
||||
}
|
||||
|
||||
if (defStyleValues == null) {
|
||||
if (defStyleAttr != 0) {
|
||||
// get the name from the int.
|
||||
String defStyleName = searchAttr(defStyleAttr);
|
||||
// resolve the defStyleAttr value into a IStyleResourceValue
|
||||
StyleResourceValue defStyleValues = null;
|
||||
|
||||
if (defaultPropMap != null) {
|
||||
defaultPropMap.put("style", defStyleName);
|
||||
if (defStyleAttr != 0) {
|
||||
// get the name from the int.
|
||||
String defStyleName = searchAttr(defStyleAttr);
|
||||
|
||||
if (defaultPropMap != null) {
|
||||
defaultPropMap.put("style", defStyleName);
|
||||
}
|
||||
|
||||
// look for the style in the current theme, and its parent:
|
||||
ResourceValue item = mRenderResources.findItemInTheme(defStyleName);
|
||||
|
||||
if (item != null) {
|
||||
// item is a reference to a style entry. Search for it.
|
||||
item = mRenderResources.findResValue(item.getValue(),
|
||||
false /*forceFrameworkOnly*/);
|
||||
|
||||
if (item instanceof StyleResourceValue) {
|
||||
defStyleValues = (StyleResourceValue)item;
|
||||
}
|
||||
} else {
|
||||
Bridge.getLog().error(null,
|
||||
String.format(
|
||||
"Failed to find style '%s' in current theme", defStyleName),
|
||||
null /*data*/);
|
||||
}
|
||||
} else if (defStyleRes != 0) {
|
||||
Pair<ResourceType, String> value = Bridge.resolveResourceId(defStyleRes);
|
||||
if (value == null) {
|
||||
value = mProjectCallback.resolveResourceId(defStyleRes);
|
||||
}
|
||||
|
||||
// look for the style in the current theme, and its parent:
|
||||
ResourceValue item = mRenderResources.findItemInTheme(defStyleName);
|
||||
|
||||
if (item != null) {
|
||||
// item is a reference to a style entry. Search for it.
|
||||
item = mRenderResources.findResValue(item.getValue(),
|
||||
false /*forceFrameworkOnly*/);
|
||||
|
||||
if (item instanceof StyleResourceValue) {
|
||||
defStyleValues = (StyleResourceValue)item;
|
||||
}
|
||||
} else {
|
||||
Bridge.getLog().error(null,
|
||||
String.format(
|
||||
"Failed to find style '%s' in current theme", defStyleName),
|
||||
null /*data*/);
|
||||
}
|
||||
} else if (defStyleRes != 0) {
|
||||
Pair<ResourceType, String> value = Bridge.resolveResourceId(defStyleRes);
|
||||
if (value == null) {
|
||||
value = mProjectCallback.resolveResourceId(defStyleRes);
|
||||
}
|
||||
|
||||
if (value != null) {
|
||||
if (value.getFirst() == ResourceType.STYLE) {
|
||||
// look for the style in the current theme, and its parent:
|
||||
ResourceValue item = mRenderResources.findItemInTheme(value.getSecond());
|
||||
if (item != null) {
|
||||
if (item instanceof StyleResourceValue) {
|
||||
if (defaultPropMap != null) {
|
||||
defaultPropMap.put("style", item.getName());
|
||||
}
|
||||
|
||||
defStyleValues = (StyleResourceValue)item;
|
||||
if (value != null) {
|
||||
if (value.getFirst() == ResourceType.STYLE) {
|
||||
// look for the style in the current theme, and its parent:
|
||||
ResourceValue item = mRenderResources.findItemInTheme(value.getSecond());
|
||||
if (item != null) {
|
||||
if (item instanceof StyleResourceValue) {
|
||||
if (defaultPropMap != null) {
|
||||
defaultPropMap.put("style", item.getName());
|
||||
}
|
||||
} else {
|
||||
Bridge.getLog().error(null,
|
||||
String.format(
|
||||
"Style with id 0x%x (resolved to '%s') does not exist.",
|
||||
defStyleRes, value.getSecond()),
|
||||
null /*data*/);
|
||||
|
||||
defStyleValues = (StyleResourceValue)item;
|
||||
}
|
||||
} else {
|
||||
Bridge.getLog().error(null,
|
||||
String.format(
|
||||
"Resouce id 0x%x is not of type STYLE (instead %s)",
|
||||
defStyleRes, value.getFirst().toString()),
|
||||
"Style with id 0x%x (resolved to '%s') does not exist.",
|
||||
defStyleRes, value.getSecond()),
|
||||
null /*data*/);
|
||||
}
|
||||
} else {
|
||||
Bridge.getLog().error(null,
|
||||
String.format(
|
||||
"Failed to find style with id 0x%x in current theme",
|
||||
defStyleRes),
|
||||
"Resouce id 0x%x is not of type STYLE (instead %s)",
|
||||
defStyleRes, value.getFirst().toString()),
|
||||
null /*data*/);
|
||||
}
|
||||
} else {
|
||||
Bridge.getLog().error(null,
|
||||
String.format(
|
||||
"Failed to find style with id 0x%x in current theme",
|
||||
defStyleRes),
|
||||
null /*data*/);
|
||||
}
|
||||
}
|
||||
|
||||
@ -623,8 +622,13 @@ public final class BridgeContext extends Activity {
|
||||
if (value == null) {
|
||||
ResourceValue resValue = null;
|
||||
|
||||
// look for the value in the defStyle first (and its parent if needed)
|
||||
if (defStyleValues != null) {
|
||||
// look for the value in the custom style first (and its parent if needed)
|
||||
if (customStyleValues != null) {
|
||||
resValue = mRenderResources.findItemInStyle(customStyleValues, name);
|
||||
}
|
||||
|
||||
// then look for the value in the default Style (and its parent if needed)
|
||||
if (resValue == null && defStyleValues != null) {
|
||||
resValue = mRenderResources.findItemInStyle(defStyleValues, name);
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileInputStream;
|
||||
|
||||
/**
|
||||
* Custom implementation of {@link LayoutInflater} to handle custom views.
|
||||
@ -177,7 +177,7 @@ public final class BridgeInflater extends LayoutInflater {
|
||||
try {
|
||||
KXmlParser parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(f));
|
||||
parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$
|
||||
|
||||
BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
|
||||
parser, bridgeContext, false);
|
||||
|
@ -46,7 +46,6 @@ import android.view.ViewGroup.LayoutParams;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
@ -244,7 +243,7 @@ public final class BridgeResources extends Resources {
|
||||
// give that to our XmlBlockParser
|
||||
parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(xml));
|
||||
parser.setInput(new FileInputStream(xml), "UTF-8"); //$NON-NLS-1$);
|
||||
}
|
||||
}
|
||||
|
||||
@ -282,7 +281,7 @@ public final class BridgeResources extends Resources {
|
||||
// give that to our XmlBlockParser
|
||||
parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(xml));
|
||||
parser.setInput(new FileInputStream(xml), "UTF-8"); //$NON-NLS-1$);
|
||||
|
||||
return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
|
||||
}
|
||||
@ -501,7 +500,7 @@ public final class BridgeResources extends Resources {
|
||||
try {
|
||||
KXmlParser parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(f));
|
||||
parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
|
||||
|
||||
return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
|
||||
} catch (XmlPullParserException e) {
|
||||
@ -536,7 +535,7 @@ public final class BridgeResources extends Resources {
|
||||
try {
|
||||
KXmlParser parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(f));
|
||||
parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
|
||||
|
||||
return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
|
||||
} catch (XmlPullParserException e) {
|
||||
|
@ -36,10 +36,11 @@ import android.content.res.TypedArray;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.TypedValue;
|
||||
import android.view.LayoutInflater_Delegate;
|
||||
import android.view.ViewGroup.LayoutParams;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
|
||||
@ -315,7 +316,7 @@ public final class BridgeTypedArray extends TypedArray {
|
||||
try {
|
||||
KXmlParser parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(f));
|
||||
parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
|
||||
|
||||
BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
|
||||
parser, mContext, resValue.isFramework());
|
||||
@ -471,40 +472,23 @@ public final class BridgeTypedArray extends TypedArray {
|
||||
*/
|
||||
@Override
|
||||
public int getDimensionPixelSize(int index, int defValue) {
|
||||
if (mResourceData[index] == null) {
|
||||
try {
|
||||
return getDimension(index);
|
||||
} catch (RuntimeException e) {
|
||||
if (mResourceData[index] != null) {
|
||||
String s = mResourceData[index].getValue();
|
||||
|
||||
if (s != null) {
|
||||
// looks like we were unable to resolve the dimension value
|
||||
Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
|
||||
String.format(
|
||||
"\"%1$s\" in attribute \"%2$s\" is not a valid format.",
|
||||
s, mNames[index]), null /*data*/);
|
||||
}
|
||||
}
|
||||
|
||||
return defValue;
|
||||
}
|
||||
|
||||
String s = mResourceData[index].getValue();
|
||||
|
||||
if (s == null) {
|
||||
return defValue;
|
||||
} else if (s.equals(BridgeConstants.MATCH_PARENT) ||
|
||||
s.equals(BridgeConstants.FILL_PARENT)) {
|
||||
return LayoutParams.MATCH_PARENT;
|
||||
} else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
|
||||
return LayoutParams.WRAP_CONTENT;
|
||||
} else if (RenderResources.REFERENCE_NULL.equals(s)) {
|
||||
return defValue;
|
||||
}
|
||||
|
||||
if (ResourceHelper.stringToFloat(s, mValue)) {
|
||||
float f = mValue.getDimension(mBridgeResources.mMetrics);
|
||||
|
||||
final int res = (int)(f+0.5f);
|
||||
if (res != 0) return res;
|
||||
if (f == 0) return 0;
|
||||
if (f > 0) return 1;
|
||||
return defValue; // this is basically unreachable.
|
||||
}
|
||||
|
||||
// looks like we were unable to resolve the dimension value
|
||||
Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
|
||||
String.format(
|
||||
"\"%1$s\" in attribute \"%2$s\" is not a valid format.",
|
||||
s, mNames[index]), null /*data*/);
|
||||
|
||||
return defValue;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -521,7 +505,20 @@ public final class BridgeTypedArray extends TypedArray {
|
||||
*/
|
||||
@Override
|
||||
public int getLayoutDimension(int index, String name) {
|
||||
return getDimensionPixelSize(index, 0);
|
||||
try {
|
||||
// this will throw an exception
|
||||
return getDimension(index);
|
||||
} catch (RuntimeException e) {
|
||||
|
||||
if (LayoutInflater_Delegate.sIsInInclude) {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
|
||||
"You must supply a " + name + " attribute.", null);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -529,6 +526,36 @@ public final class BridgeTypedArray extends TypedArray {
|
||||
return getDimensionPixelSize(index, defValue);
|
||||
}
|
||||
|
||||
private int getDimension(int index) {
|
||||
if (mResourceData[index] == null) {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
String s = mResourceData[index].getValue();
|
||||
|
||||
if (s == null) {
|
||||
throw new RuntimeException();
|
||||
} else if (s.equals(BridgeConstants.MATCH_PARENT) ||
|
||||
s.equals(BridgeConstants.FILL_PARENT)) {
|
||||
return LayoutParams.MATCH_PARENT;
|
||||
} else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
|
||||
return LayoutParams.WRAP_CONTENT;
|
||||
} else if (RenderResources.REFERENCE_NULL.equals(s)) {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
if (ResourceHelper.stringToFloat(s, mValue)) {
|
||||
float f = mValue.getDimension(mBridgeResources.mMetrics);
|
||||
|
||||
final int res = (int)(f+0.5f);
|
||||
if (res != 0) return res;
|
||||
if (f == 0) return 0;
|
||||
if (f > 0) return 1;
|
||||
}
|
||||
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a fractional unit attribute at <var>index</var>.
|
||||
*
|
||||
|
@ -73,7 +73,7 @@ abstract class CustomBar extends LinearLayout {
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(
|
||||
getClass().getResourceAsStream(layoutPath),
|
||||
"UTF8");
|
||||
"UTF8"); //$NON-NLS-1$
|
||||
|
||||
BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
|
||||
parser, (BridgeContext) context, false /*platformFile*/);
|
||||
|
@ -29,6 +29,7 @@ import com.android.layoutlib.bridge.Bridge;
|
||||
import com.android.layoutlib.bridge.android.BridgeContext;
|
||||
import com.android.resources.ResourceType;
|
||||
|
||||
import android.os.HandlerThread_Delegate;
|
||||
import android.util.DisplayMetrics;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@ -228,6 +229,10 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso
|
||||
private void tearDown() {
|
||||
// Make sure to remove static references, otherwise we could not unload the lib
|
||||
mContext.disposeResources();
|
||||
|
||||
// quit HandlerThread created during this session.
|
||||
HandlerThread_Delegate.cleanUp(sCurrentContext);
|
||||
|
||||
sCurrentContext = null;
|
||||
|
||||
Bridge.setLog(null);
|
||||
|
@ -44,7 +44,6 @@ import android.util.TypedValue;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.MalformedURLException;
|
||||
@ -124,7 +123,7 @@ public final class ResourceHelper {
|
||||
// providing an XmlPullParser
|
||||
KXmlParser parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(f));
|
||||
parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
|
||||
|
||||
BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
|
||||
parser, context, resValue.isFramework());
|
||||
@ -206,7 +205,7 @@ public final class ResourceHelper {
|
||||
// let the framework inflate the Drawable from the XML file.
|
||||
KXmlParser parser = new KXmlParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser.setInput(new FileReader(f));
|
||||
parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
|
||||
|
||||
BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
|
||||
parser, context, value.isFramework());
|
||||
|
@ -44,7 +44,7 @@ public class BridgeXmlBlockParserTest extends TestCase {
|
||||
|
||||
InputStream input = this.getClass().getClassLoader().getResourceAsStream(
|
||||
"com/android/layoutlib/testdata/layout1.xml");
|
||||
parser.setInput(input, null /*encoding*/);
|
||||
parser.setInput(input, "UTF-8"); //$NON-NLS-1$
|
||||
|
||||
assertEquals(XmlPullParser.START_DOCUMENT, parser.next());
|
||||
|
||||
|
@ -99,8 +99,10 @@ public final class CreateInfo implements ICreateInfo {
|
||||
"android.content.res.Resources$Theme#resolveAttribute",
|
||||
"android.graphics.BitmapFactory#finishDecode",
|
||||
"android.os.Handler#sendMessageAtTime",
|
||||
"android.os.HandlerThread#run",
|
||||
"android.os.Build#getString",
|
||||
"android.view.LayoutInflater#rInflate",
|
||||
"android.view.LayoutInflater#parseInclude",
|
||||
"android.view.View#isInEditMode",
|
||||
"com.android.internal.util.XmlUtils#convertValueToInt",
|
||||
// TODO: comment out once DelegateClass is working
|
||||
|
Reference in New Issue
Block a user