Loading tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading tools/layoutlib/bridge/src/android/os/HandlerThread_Delegate.java 0 → 100644 +80 −0 Original line number Diff line number Diff line /* * 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; } } tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java +129 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(). Loading Loading @@ -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 } } } tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +1 −1 Original line number Diff line number Diff line Loading @@ -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, Loading tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +59 −55 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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*/); Loading @@ -530,11 +528,13 @@ public final class BridgeContext extends Activity { item = mRenderResources.resolveResValue(item); if (item instanceof StyleResourceValue) { defStyleValues = (StyleResourceValue)item; customStyleValues = (StyleResourceValue)item; } } if (defStyleValues == null) { // resolve the defStyleAttr value into a IStyleResourceValue StyleResourceValue defStyleValues = null; if (defStyleAttr != 0) { // get the name from the int. String defStyleName = searchAttr(defStyleAttr); Loading Loading @@ -600,7 +600,6 @@ public final class BridgeContext extends Activity { null /*data*/); } } } String namespace = BridgeConstants.NS_RESOURCES; if (frameworkAttributes[0] == false) { Loading @@ -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); } Loading Loading
tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading
tools/layoutlib/bridge/src/android/os/HandlerThread_Delegate.java 0 → 100644 +80 −0 Original line number Diff line number Diff line /* * 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; } }
tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java +129 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(). Loading Loading @@ -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 } } }
tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +1 −1 Original line number Diff line number Diff line Loading @@ -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, Loading
tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +59 −55 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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*/); Loading @@ -530,11 +528,13 @@ public final class BridgeContext extends Activity { item = mRenderResources.resolveResValue(item); if (item instanceof StyleResourceValue) { defStyleValues = (StyleResourceValue)item; customStyleValues = (StyleResourceValue)item; } } if (defStyleValues == null) { // resolve the defStyleAttr value into a IStyleResourceValue StyleResourceValue defStyleValues = null; if (defStyleAttr != 0) { // get the name from the int. String defStyleName = searchAttr(defStyleAttr); Loading Loading @@ -600,7 +600,6 @@ public final class BridgeContext extends Activity { null /*data*/); } } } String namespace = BridgeConstants.NS_RESOURCES; if (frameworkAttributes[0] == false) { Loading @@ -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); } Loading