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();
|
AffineTransform matrixTx = matrixDelegate.getAffineTransform();
|
||||||
|
|
||||||
// combine them so that the given matrix is applied after.
|
// 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
|
// give it to the graphics2D as a new matrix replacing all previous transform
|
||||||
snapshot.setTransform(currentTx);
|
snapshot.setTransform(currentTx);
|
||||||
@ -717,7 +717,7 @@ public final class Canvas_Delegate {
|
|||||||
/*package*/ static void native_drawCircle(int nativeCanvas,
|
/*package*/ static void native_drawCircle(int nativeCanvas,
|
||||||
float cx, float cy, float radius, int paint) {
|
float cx, float cy, float radius, int paint) {
|
||||||
native_drawOval(nativeCanvas,
|
native_drawOval(nativeCanvas,
|
||||||
new RectF(cx - radius, cy - radius, radius*2, radius*2),
|
new RectF(cx - radius, cy - radius, radius, radius),
|
||||||
paint);
|
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.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.content.res.XmlResourceParser;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Xml;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -35,6 +38,8 @@ import java.io.IOException;
|
|||||||
*/
|
*/
|
||||||
public class LayoutInflater_Delegate {
|
public class LayoutInflater_Delegate {
|
||||||
|
|
||||||
|
public static boolean sIsInInclude = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursive method used to descend down the xml hierarchy and instantiate
|
* Recursive method used to descend down the xml hierarchy and instantiate
|
||||||
* views, instantiate their children, and then call onFinishInflate().
|
* 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.UNBOUND_RENDERING,
|
||||||
Capability.CUSTOM_BACKGROUND_COLOR,
|
Capability.CUSTOM_BACKGROUND_COLOR,
|
||||||
Capability.RENDER,
|
Capability.RENDER,
|
||||||
//Capability.LAYOUT_ONLY, // disable to run on ADT 10.0 which doesn't include this.
|
Capability.LAYOUT_ONLY,
|
||||||
Capability.EMBEDDED_LAYOUT,
|
Capability.EMBEDDED_LAYOUT,
|
||||||
Capability.VIEW_MANIPULATION,
|
Capability.VIEW_MANIPULATION,
|
||||||
Capability.PLAY_ANIMATION,
|
Capability.PLAY_ANIMATION,
|
||||||
|
@ -71,7 +71,6 @@ import java.io.File;
|
|||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -342,7 +341,7 @@ public final class BridgeContext extends Activity {
|
|||||||
try {
|
try {
|
||||||
KXmlParser parser = new KXmlParser();
|
KXmlParser parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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
|
// set the resource ref to have correct view cookies
|
||||||
mBridgeInflater.setResourceReference(resource);
|
mBridgeInflater.setResourceReference(resource);
|
||||||
@ -514,14 +513,13 @@ public final class BridgeContext extends Activity {
|
|||||||
BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length,
|
BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length,
|
||||||
isPlatformFile);
|
isPlatformFile);
|
||||||
|
|
||||||
// resolve the defStyleAttr value into a IStyleResourceValue
|
|
||||||
StyleResourceValue defStyleValues = null;
|
|
||||||
|
|
||||||
// look for a custom style.
|
// look for a custom style.
|
||||||
String customStyle = null;
|
String customStyle = null;
|
||||||
if (set != null) {
|
if (set != null) {
|
||||||
customStyle = set.getAttributeValue(null /* namespace*/, "style");
|
customStyle = set.getAttributeValue(null /* namespace*/, "style");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StyleResourceValue customStyleValues = null;
|
||||||
if (customStyle != null) {
|
if (customStyle != null) {
|
||||||
ResourceValue item = mRenderResources.findResValue(customStyle,
|
ResourceValue item = mRenderResources.findResValue(customStyle,
|
||||||
false /*forceFrameworkOnly*/);
|
false /*forceFrameworkOnly*/);
|
||||||
@ -530,75 +528,76 @@ public final class BridgeContext extends Activity {
|
|||||||
item = mRenderResources.resolveResValue(item);
|
item = mRenderResources.resolveResValue(item);
|
||||||
|
|
||||||
if (item instanceof StyleResourceValue) {
|
if (item instanceof StyleResourceValue) {
|
||||||
defStyleValues = (StyleResourceValue)item;
|
customStyleValues = (StyleResourceValue)item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (defStyleValues == null) {
|
// resolve the defStyleAttr value into a IStyleResourceValue
|
||||||
if (defStyleAttr != 0) {
|
StyleResourceValue defStyleValues = null;
|
||||||
// get the name from the int.
|
|
||||||
String defStyleName = searchAttr(defStyleAttr);
|
|
||||||
|
|
||||||
if (defaultPropMap != null) {
|
if (defStyleAttr != 0) {
|
||||||
defaultPropMap.put("style", defStyleName);
|
// 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:
|
if (value != null) {
|
||||||
ResourceValue item = mRenderResources.findItemInTheme(defStyleName);
|
if (value.getFirst() == ResourceType.STYLE) {
|
||||||
|
// look for the style in the current theme, and its parent:
|
||||||
if (item != null) {
|
ResourceValue item = mRenderResources.findItemInTheme(value.getSecond());
|
||||||
// item is a reference to a style entry. Search for it.
|
if (item != null) {
|
||||||
item = mRenderResources.findResValue(item.getValue(),
|
if (item instanceof StyleResourceValue) {
|
||||||
false /*forceFrameworkOnly*/);
|
if (defaultPropMap != null) {
|
||||||
|
defaultPropMap.put("style", item.getName());
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Bridge.getLog().error(null,
|
defStyleValues = (StyleResourceValue)item;
|
||||||
String.format(
|
|
||||||
"Style with id 0x%x (resolved to '%s') does not exist.",
|
|
||||||
defStyleRes, value.getSecond()),
|
|
||||||
null /*data*/);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Bridge.getLog().error(null,
|
Bridge.getLog().error(null,
|
||||||
String.format(
|
String.format(
|
||||||
"Resouce id 0x%x is not of type STYLE (instead %s)",
|
"Style with id 0x%x (resolved to '%s') does not exist.",
|
||||||
defStyleRes, value.getFirst().toString()),
|
defStyleRes, value.getSecond()),
|
||||||
null /*data*/);
|
null /*data*/);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Bridge.getLog().error(null,
|
Bridge.getLog().error(null,
|
||||||
String.format(
|
String.format(
|
||||||
"Failed to find style with id 0x%x in current theme",
|
"Resouce id 0x%x is not of type STYLE (instead %s)",
|
||||||
defStyleRes),
|
defStyleRes, value.getFirst().toString()),
|
||||||
null /*data*/);
|
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) {
|
if (value == null) {
|
||||||
ResourceValue resValue = null;
|
ResourceValue resValue = null;
|
||||||
|
|
||||||
// look for the value in the defStyle first (and its parent if needed)
|
// look for the value in the custom style first (and its parent if needed)
|
||||||
if (defStyleValues != null) {
|
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);
|
resValue = mRenderResources.findItemInStyle(defStyleValues, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileReader;
|
import java.io.FileInputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom implementation of {@link LayoutInflater} to handle custom views.
|
* Custom implementation of {@link LayoutInflater} to handle custom views.
|
||||||
@ -177,7 +177,7 @@ public final class BridgeInflater extends LayoutInflater {
|
|||||||
try {
|
try {
|
||||||
KXmlParser parser = new KXmlParser();
|
KXmlParser parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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(
|
BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
|
||||||
parser, bridgeContext, false);
|
parser, bridgeContext, false);
|
||||||
|
@ -46,7 +46,6 @@ import android.view.ViewGroup.LayoutParams;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -244,7 +243,7 @@ public final class BridgeResources extends Resources {
|
|||||||
// give that to our XmlBlockParser
|
// give that to our XmlBlockParser
|
||||||
parser = new KXmlParser();
|
parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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
|
// give that to our XmlBlockParser
|
||||||
parser = new KXmlParser();
|
parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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]);
|
return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
|
||||||
}
|
}
|
||||||
@ -501,7 +500,7 @@ public final class BridgeResources extends Resources {
|
|||||||
try {
|
try {
|
||||||
KXmlParser parser = new KXmlParser();
|
KXmlParser parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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]);
|
return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
|
||||||
} catch (XmlPullParserException e) {
|
} catch (XmlPullParserException e) {
|
||||||
@ -536,7 +535,7 @@ public final class BridgeResources extends Resources {
|
|||||||
try {
|
try {
|
||||||
KXmlParser parser = new KXmlParser();
|
KXmlParser parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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]);
|
return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
|
||||||
} catch (XmlPullParserException e) {
|
} catch (XmlPullParserException e) {
|
||||||
|
@ -36,10 +36,11 @@ import android.content.res.TypedArray;
|
|||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
|
import android.view.LayoutInflater_Delegate;
|
||||||
import android.view.ViewGroup.LayoutParams;
|
import android.view.ViewGroup.LayoutParams;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileReader;
|
import java.io.FileInputStream;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -315,7 +316,7 @@ public final class BridgeTypedArray extends TypedArray {
|
|||||||
try {
|
try {
|
||||||
KXmlParser parser = new KXmlParser();
|
KXmlParser parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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(
|
BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
|
||||||
parser, mContext, resValue.isFramework());
|
parser, mContext, resValue.isFramework());
|
||||||
@ -471,40 +472,23 @@ public final class BridgeTypedArray extends TypedArray {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int getDimensionPixelSize(int index, int defValue) {
|
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;
|
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
|
@Override
|
||||||
public int getLayoutDimension(int index, String name) {
|
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
|
@Override
|
||||||
@ -529,6 +526,36 @@ public final class BridgeTypedArray extends TypedArray {
|
|||||||
return getDimensionPixelSize(index, defValue);
|
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>.
|
* 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.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||||
parser.setInput(
|
parser.setInput(
|
||||||
getClass().getResourceAsStream(layoutPath),
|
getClass().getResourceAsStream(layoutPath),
|
||||||
"UTF8");
|
"UTF8"); //$NON-NLS-1$
|
||||||
|
|
||||||
BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
|
BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
|
||||||
parser, (BridgeContext) context, false /*platformFile*/);
|
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.layoutlib.bridge.android.BridgeContext;
|
||||||
import com.android.resources.ResourceType;
|
import com.android.resources.ResourceType;
|
||||||
|
|
||||||
|
import android.os.HandlerThread_Delegate;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -228,6 +229,10 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso
|
|||||||
private void tearDown() {
|
private void tearDown() {
|
||||||
// Make sure to remove static references, otherwise we could not unload the lib
|
// Make sure to remove static references, otherwise we could not unload the lib
|
||||||
mContext.disposeResources();
|
mContext.disposeResources();
|
||||||
|
|
||||||
|
// quit HandlerThread created during this session.
|
||||||
|
HandlerThread_Delegate.cleanUp(sCurrentContext);
|
||||||
|
|
||||||
sCurrentContext = null;
|
sCurrentContext = null;
|
||||||
|
|
||||||
Bridge.setLog(null);
|
Bridge.setLog(null);
|
||||||
|
@ -44,7 +44,6 @@ import android.util.TypedValue;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
@ -124,7 +123,7 @@ public final class ResourceHelper {
|
|||||||
// providing an XmlPullParser
|
// providing an XmlPullParser
|
||||||
KXmlParser parser = new KXmlParser();
|
KXmlParser parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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(
|
BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
|
||||||
parser, context, resValue.isFramework());
|
parser, context, resValue.isFramework());
|
||||||
@ -206,7 +205,7 @@ public final class ResourceHelper {
|
|||||||
// let the framework inflate the Drawable from the XML file.
|
// let the framework inflate the Drawable from the XML file.
|
||||||
KXmlParser parser = new KXmlParser();
|
KXmlParser parser = new KXmlParser();
|
||||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
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(
|
BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
|
||||||
parser, context, value.isFramework());
|
parser, context, value.isFramework());
|
||||||
|
@ -44,7 +44,7 @@ public class BridgeXmlBlockParserTest extends TestCase {
|
|||||||
|
|
||||||
InputStream input = this.getClass().getClassLoader().getResourceAsStream(
|
InputStream input = this.getClass().getClassLoader().getResourceAsStream(
|
||||||
"com/android/layoutlib/testdata/layout1.xml");
|
"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());
|
assertEquals(XmlPullParser.START_DOCUMENT, parser.next());
|
||||||
|
|
||||||
|
@ -99,8 +99,10 @@ public final class CreateInfo implements ICreateInfo {
|
|||||||
"android.content.res.Resources$Theme#resolveAttribute",
|
"android.content.res.Resources$Theme#resolveAttribute",
|
||||||
"android.graphics.BitmapFactory#finishDecode",
|
"android.graphics.BitmapFactory#finishDecode",
|
||||||
"android.os.Handler#sendMessageAtTime",
|
"android.os.Handler#sendMessageAtTime",
|
||||||
|
"android.os.HandlerThread#run",
|
||||||
"android.os.Build#getString",
|
"android.os.Build#getString",
|
||||||
"android.view.LayoutInflater#rInflate",
|
"android.view.LayoutInflater#rInflate",
|
||||||
|
"android.view.LayoutInflater#parseInclude",
|
||||||
"android.view.View#isInEditMode",
|
"android.view.View#isInEditMode",
|
||||||
"com.android.internal.util.XmlUtils#convertValueToInt",
|
"com.android.internal.util.XmlUtils#convertValueToInt",
|
||||||
// TODO: comment out once DelegateClass is working
|
// TODO: comment out once DelegateClass is working
|
||||||
|
Reference in New Issue
Block a user