From 031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7b Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Mon, 7 Feb 2011 21:30:53 -0800 Subject: LayoutLib: Adapt the HC layoutlib to GB. do not merge. Change-Id: I0b2016987a65fabbc0ce7011514543349e9fb929 --- .../layoutlib/bridge/resources/bars/action_bar.xml | 9 - .../resources/bars/mdpi/ic_sysbar_back_default.png | Bin 3900 -> 0 bytes .../resources/bars/mdpi/ic_sysbar_home_default.png | Bin 3991 -> 0 bytes .../bars/mdpi/ic_sysbar_recent_default.png | Bin 3140 -> 0 bytes .../bridge/resources/bars/tablet_system_bar.xml | 24 -- .../animation/PropertyValuesHolder_Delegate.java | 59 --- .../bridge/src/android/app/Fragment_Delegate.java | 104 ----- .../android/graphics/BitmapFactory_Delegate.java | 8 - .../android/graphics/BitmapShader_Delegate.java | 7 - .../src/android/graphics/Bitmap_Delegate.java | 23 +- .../src/android/graphics/Canvas_Delegate.java | 46 +-- .../src/android/graphics/ColorFilter_Delegate.java | 2 +- .../graphics/ColorMatrixColorFilter_Delegate.java | 6 - .../android/graphics/ComposeShader_Delegate.java | 14 - .../graphics/LightingColorFilter_Delegate.java | 6 - .../android/graphics/LinearGradient_Delegate.java | 23 +- .../src/android/graphics/Paint_Delegate.java | 83 +--- .../graphics/PorterDuffColorFilter_Delegate.java | 7 - .../android/graphics/RadialGradient_Delegate.java | 14 - .../src/android/graphics/Region_Delegate.java | 10 - .../src/android/graphics/Shader_Delegate.java | 31 +- .../android/graphics/SweepGradient_Delegate.java | 14 - .../src/android/view/LayoutInflater_Delegate.java | 164 +++++--- .../src/com/android/layoutlib/bridge/Bridge.java | 4 +- .../layoutlib/bridge/BridgeRenderSession.java | 15 +- .../layoutlib/bridge/android/BridgeContext.java | 18 - .../layoutlib/bridge/android/BridgeInflater.java | 4 +- .../layoutlib/bridge/android/BridgeWindow.java | 5 - .../bridge/android/BridgeWindowSession.java | 57 +-- .../layoutlib/bridge/bars/FakeActionBar.java | 47 --- .../layoutlib/bridge/bars/PhoneSystemBar.java | 2 +- .../layoutlib/bridge/bars/TabletSystemBar.java | 54 --- .../layoutlib/bridge/impl/AnimationThread.java | 170 -------- .../android/layoutlib/bridge/impl/GcSnapshot.java | 7 - .../layoutlib/bridge/impl/PlayAnimationThread.java | 48 --- .../layoutlib/bridge/impl/RenderDrawable.java | 1 - .../layoutlib/bridge/impl/RenderSessionImpl.java | 440 ++++++--------------- .../bridge/src/libcore/icu/ICU_Delegate.java | 186 --------- .../android/tools/layoutlib/create/CreateInfo.java | 5 +- .../com/android/tools/layoutlib/create/Main.java | 1 - 40 files changed, 296 insertions(+), 1422 deletions(-) delete mode 100644 tools/layoutlib/bridge/resources/bars/action_bar.xml delete mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back_default.png delete mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home_default.png delete mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent_default.png delete mode 100644 tools/layoutlib/bridge/resources/bars/tablet_system_bar.xml delete mode 100644 tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java delete mode 100644 tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java delete mode 100644 tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java delete mode 100644 tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TabletSystemBar.java delete mode 100644 tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java delete mode 100644 tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java delete mode 100644 tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java (limited to 'tools') diff --git a/tools/layoutlib/bridge/resources/bars/action_bar.xml b/tools/layoutlib/bridge/resources/bars/action_bar.xml deleted file mode 100644 index 51983f2..0000000 --- a/tools/layoutlib/bridge/resources/bars/action_bar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back_default.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back_default.png deleted file mode 100644 index 4bcd2be..0000000 Binary files a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back_default.png and /dev/null differ diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home_default.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home_default.png deleted file mode 100644 index cfeba3e..0000000 Binary files a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home_default.png and /dev/null differ diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent_default.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent_default.png deleted file mode 100644 index 1d97e05..0000000 Binary files a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent_default.png and /dev/null differ diff --git a/tools/layoutlib/bridge/resources/bars/tablet_system_bar.xml b/tools/layoutlib/bridge/resources/bars/tablet_system_bar.xml deleted file mode 100644 index c5acddb..0000000 --- a/tools/layoutlib/bridge/resources/bars/tablet_system_bar.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java b/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java deleted file mode 100644 index 7b444aa..0000000 --- a/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2010 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.animation; - -import com.android.layoutlib.bridge.impl.DelegateManager; -import com.android.tools.layoutlib.annotations.LayoutlibDelegate; - -/** - * Delegate implementing the native methods of android.animation.PropertyValuesHolder - * - * Through the layoutlib_create tool, the original native methods of PropertyValuesHolder have been - * replaced by calls to methods of the same name in this delegate class. - * - * Because it's a stateless class to start with, there's no need to keep a {@link DelegateManager} - * around to map int to instance of the delegate. - * - * The main goal of this class' methods are to provide a native way to access setters and getters - * on some object. In this case we want to default to using Java reflection instead so the native - * methods do nothing. - * - */ -/*package*/ class PropertyValuesHolder_Delegate { - - @LayoutlibDelegate - /*package*/ static int nGetIntMethod(Class targetClass, String methodName) { - // return 0 to force PropertyValuesHolder to use Java reflection. - return 0; - } - - @LayoutlibDelegate - /*package*/ static int nGetFloatMethod(Class targetClass, String methodName) { - // return 0 to force PropertyValuesHolder to use Java reflection. - return 0; - } - - @LayoutlibDelegate - /*package*/ static void nCallIntMethod(Object target, int methodID, int arg) { - // do nothing - } - - @LayoutlibDelegate - /*package*/ static void nCallFloatMethod(Object target, int methodID, float arg) { - // do nothing - } -} diff --git a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java b/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java deleted file mode 100644 index aabd3f1..0000000 --- a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2010 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.app; - -import com.android.ide.common.rendering.api.IProjectCallback; -import com.android.tools.layoutlib.annotations.LayoutlibDelegate; - -import android.content.Context; -import android.os.Bundle; - -/** - * Delegate used to provide new implementation of a select few methods of {@link Fragment} - * - * Through the layoutlib_create tool, the original methods of Fragment have been replaced - * by calls to methods of the same name in this delegate class. - * - * The methods being re-implemented are the ones responsible for instantiating Fragment objects. - * Because the classes of these objects are found in the project, these methods need access to - * {@link IProjectCallback} object. They are however static methods, so the callback is set - * before the inflation through {@link #setProjectCallback(IProjectCallback)}. - */ -public class Fragment_Delegate { - - private static IProjectCallback sProjectCallback; - - /** - * Sets the current {@link IProjectCallback} to be used to instantiate classes coming - * from the project being rendered. - */ - public static void setProjectCallback(IProjectCallback projectCallback) { - sProjectCallback = projectCallback; - } - - /** - * Like {@link #instantiate(Context, String, Bundle)} but with a null - * argument Bundle. - */ - @LayoutlibDelegate - /*package*/ static Fragment instantiate(Context context, String fname) { - return instantiate(context, fname, null); - } - - /** - * Create a new instance of a Fragment with the given class name. This is - * the same as calling its empty constructor. - * - * @param context The calling context being used to instantiate the fragment. - * This is currently just used to get its ClassLoader. - * @param fname The class name of the fragment to instantiate. - * @param args Bundle of arguments to supply to the fragment, which it - * can retrieve with {@link #getArguments()}. May be null. - * @return Returns a new fragment instance. - * @throws InstantiationException If there is a failure in instantiating - * the given fragment class. This is a runtime exception; it is not - * normally expected to happen. - */ - @LayoutlibDelegate - /*package*/ static Fragment instantiate(Context context, String fname, Bundle args) { - try { - if (sProjectCallback != null) { - Fragment f = (Fragment) sProjectCallback.loadView(fname, - new Class[0], new Object[0]); - - if (args != null) { - args.setClassLoader(f.getClass().getClassLoader()); - f.mArguments = args; - } - return f; - } - - return null; - } catch (ClassNotFoundException e) { - throw new Fragment.InstantiationException("Unable to instantiate fragment " + fname - + ": make sure class name exists, is public, and has an" - + " empty constructor that is public", e); - } catch (java.lang.InstantiationException e) { - throw new Fragment.InstantiationException("Unable to instantiate fragment " + fname - + ": make sure class name exists, is public, and has an" - + " empty constructor that is public", e); - } catch (IllegalAccessException e) { - throw new Fragment.InstantiationException("Unable to instantiate fragment " + fname - + ": make sure class name exists, is public, and has an" - + " empty constructor that is public", e); - } catch (Exception e) { - throw new Fragment.InstantiationException("Unable to instantiate fragment " + fname - + ": make sure class name exists, is public, and has an" - + " empty constructor that is public", e); - } - } -} diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java index 080b85f..9c86e80 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java @@ -136,20 +136,17 @@ import java.io.InputStream; @LayoutlibDelegate /*package*/ static Bitmap nativeDecodeFileDescriptor(FileDescriptor fd, Rect padding, Options opts) { - opts.inBitmap = null; return null; } @LayoutlibDelegate /*package*/ static Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts) { - opts.inBitmap = null; return null; } @LayoutlibDelegate /*package*/ static Bitmap nativeDecodeByteArray(byte[] data, int offset, int length, Options opts) { - opts.inBitmap = null; return null; } @@ -159,9 +156,4 @@ import java.io.InputStream; // BitmapFactory.finishDecode(); return chunk; } - - @LayoutlibDelegate - /*package*/ static boolean nativeIsSeekable(FileDescriptor fd) { - return true; - } } diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java index 9a8cf04..8eb0693 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java @@ -79,13 +79,6 @@ public class BitmapShader_Delegate extends Shader_Delegate { return sManager.addNewDelegate(newDelegate); } - @LayoutlibDelegate - /*package*/ static int nativePostCreate(int native_shader, int native_bitmap, - int shaderTileModeX, int shaderTileModeY) { - // pass, not needed. - return 0; - } - // ---- Private delegate/helper methods ---- private BitmapShader_Delegate(java.awt.image.BufferedImage image, diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java index 66e59d8..87c3eb6 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java @@ -62,8 +62,6 @@ public final class Bitmap_Delegate { private final Config mConfig; private BufferedImage mImage; private boolean mHasAlpha = true; - private int mGenerationId = 0; - // ---- Public Helper methods ---- @@ -186,15 +184,6 @@ public final class Bitmap_Delegate { return mHasAlpha && mConfig != Config.RGB_565; } - /** - * Update the generationId. - * - * @see Bitmap#getGenerationId() - */ - public void change() { - mGenerationId++; - } - // ---- native methods ---- @LayoutlibDelegate @@ -395,16 +384,6 @@ public final class Bitmap_Delegate { } @LayoutlibDelegate - /*package*/ static int nativeGenerationId(int nativeBitmap) { - Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); - if (delegate == null) { - return 0; - } - - return delegate.mGenerationId; - } - - @LayoutlibDelegate /*package*/ static Bitmap nativeCreateFromParcel(Parcel p) { // This is only called by Bitmap.CREATOR (Parcelable.Creator), which is only // used during aidl call so really this should not be called. @@ -525,7 +504,7 @@ public final class Bitmap_Delegate { int nativeInt = sManager.addNewDelegate(delegate); // and create/return a new Bitmap with it - return new Bitmap(nativeInt, null /* buffer */, isMutable, null /*ninePatchChunk*/, density); + return new Bitmap(nativeInt, isMutable, null /*ninePatchChunk*/, density); } /** diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java index 4decd1a..02a2ddf 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java @@ -270,6 +270,13 @@ public final class Canvas_Delegate { } @LayoutlibDelegate + /*package*/ static void drawText(Canvas thisCanvas, + String text, float x, float y, Paint paint) { + native_drawText(thisCanvas.mNativeCanvas, text, 0, text.length(), x, y, + paint.mNativePaint); + } + + @LayoutlibDelegate /*package*/ static void drawPoints(Canvas thisCanvas, float[] pts, int offset, int count, Paint paint) { // FIXME @@ -323,6 +330,12 @@ public final class Canvas_Delegate { } @LayoutlibDelegate + /*package*/ static int initGL() { + // not supported. + return 0; + } + + @LayoutlibDelegate /*package*/ static void native_setBitmap(int nativeCanvas, int bitmap) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); @@ -340,6 +353,11 @@ public final class Canvas_Delegate { } @LayoutlibDelegate + /*package*/ static void nativeSetViewport(int nCanvas, int w, int h) { + // only useful in GL which is not supported, so no need to do anything. + } + + @LayoutlibDelegate /*package*/ static int native_saveLayer(int nativeCanvas, RectF bounds, int paint, int layerFlags) { // get the delegate from the native int. @@ -944,7 +962,7 @@ public final class Canvas_Delegate { @LayoutlibDelegate /*package*/ static void native_drawText(int nativeCanvas, final char[] text, final int index, final int count, - final float startX, final float startY, int flags, int paint) { + final float startX, final float startY, int paint) { draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/, new GcSnapshot.Drawable() { public void draw(Graphics2D graphics, Paint_Delegate paint) { @@ -1044,30 +1062,12 @@ public final class Canvas_Delegate { @LayoutlibDelegate /*package*/ static void native_drawText(int nativeCanvas, String text, int start, int end, float x, - float y, int flags, int paint) { + float y, int paint) { int count = end - start; char[] buffer = TemporaryBuffer.obtain(count); TextUtils.getChars(text, start, end, buffer, 0); - native_drawText(nativeCanvas, buffer, 0, count, x, y, flags, paint); - } - - @LayoutlibDelegate - /*package*/ static void native_drawTextRun(int nativeCanvas, String text, - int start, int end, int contextStart, int contextEnd, - float x, float y, int flags, int paint) { - int count = end - start; - char[] buffer = TemporaryBuffer.obtain(count); - TextUtils.getChars(text, start, end, buffer, 0); - - native_drawText(nativeCanvas, buffer, start, end, x, y, flags, paint); - } - - @LayoutlibDelegate - /*package*/ static void native_drawTextRun(int nativeCanvas, char[] text, - int start, int count, int contextStart, int contextCount, - float x, float y, int flags, int paint) { - native_drawText(nativeCanvas, text, start, count, x, y, flags, paint); + native_drawText(nativeCanvas, buffer, 0, count, x, y, paint); } @LayoutlibDelegate @@ -1094,7 +1094,7 @@ public final class Canvas_Delegate { char[] text, int index, int count, int path, float hOffset, - float vOffset, int bidiFlags, + float vOffset, int paint) { // FIXME Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, @@ -1106,7 +1106,7 @@ public final class Canvas_Delegate { String text, int path, float hOffset, float vOffset, - int flags, int paint) { + int paint) { // FIXME Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, "Canvas.drawTextOnPath is not supported.", null, null /*data*/); diff --git a/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java index e5a7ab6..4c692c2 100644 --- a/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java @@ -56,7 +56,7 @@ public abstract class ColorFilter_Delegate { // ---- native methods ---- @LayoutlibDelegate - /*package*/ static void finalizer(int native_instance, int nativeColorFilter) { + /*package*/ static void finalizer(int native_instance) { sManager.removeJavaReferenceFor(native_instance); } diff --git a/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java index 2de344b..d4c5b8d 100644 --- a/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java @@ -60,11 +60,5 @@ public class ColorMatrixColorFilter_Delegate extends ColorFilter_Delegate { return sManager.addNewDelegate(newDelegate); } - @LayoutlibDelegate - /*package*/ static int nColorMatrixFilter(int nativeFilter, float[] array) { - // pass - return 0; - } - // ---- Private delegate/helper methods ---- } diff --git a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java index f6e1d00..fcc12d7 100644 --- a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java @@ -78,20 +78,6 @@ public class ComposeShader_Delegate extends Shader_Delegate { return sManager.addNewDelegate(newDelegate); } - @LayoutlibDelegate - /*package*/ static int nativePostCreate1(int native_shader, int native_skiaShaderA, - int native_skiaShaderB, int native_mode) { - // pass, not needed. - return 0; - } - - @LayoutlibDelegate - /*package*/ static int nativePostCreate2(int native_shader, int native_skiaShaderA, - int native_skiaShaderB, int porterDuffMode) { - // pass, not needed. - return 0; - } - // ---- Private delegate/helper methods ---- } diff --git a/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java index 0ee883d..3afe965 100644 --- a/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java @@ -60,11 +60,5 @@ public class LightingColorFilter_Delegate extends ColorFilter_Delegate { return sManager.addNewDelegate(newDelegate); } - @LayoutlibDelegate - /*package*/ static int nCreateLightingFilter(int nativeFilter, int mul, int add) { - // pass - return 0; - } - // ---- Private delegate/helper methods ---- } diff --git a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java index a2ba758..a735ea1 100644 --- a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java @@ -54,7 +54,7 @@ public final class LinearGradient_Delegate extends Gradient_Delegate { // ---- native methods ---- @LayoutlibDelegate - /*package*/ static int nativeCreate1(LinearGradient thisGradient, + /*package*/ static int nativeCreate1( float x0, float y0, float x1, float y1, int colors[], float positions[], int tileMode) { LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1, @@ -63,30 +63,13 @@ public final class LinearGradient_Delegate extends Gradient_Delegate { } @LayoutlibDelegate - /*package*/ static int nativeCreate2(LinearGradient thisGradient, + /*package*/ static int nativeCreate2( float x0, float y0, float x1, float y1, int color0, int color1, int tileMode) { - return nativeCreate1(thisGradient, - x0, y0, x1, y1, new int[] { color0, color1}, null /*positions*/, + return nativeCreate1(x0, y0, x1, y1, new int[] { color0, color1}, null /*positions*/, tileMode); } - @LayoutlibDelegate - /*package*/ static int nativePostCreate1(LinearGradient thisGradient, - int native_shader, float x0, float y0, float x1, float y1, - int colors[], float positions[], int tileMode) { - // nothing to be done here. - return 0; - } - - @LayoutlibDelegate - /*package*/ static int nativePostCreate2(LinearGradient thisGradient, - int native_shader, float x0, float y0, float x1, float y1, - int color0, int color1, int tileMode) { - // nothing to be done here. - return 0; - } - // ---- Private delegate/helper methods ---- /** diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java index 373f482..d4cf1f6 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java @@ -23,7 +23,6 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Paint.FontMetrics; import android.graphics.Paint.FontMetricsInt; -import android.text.TextUtils; import java.awt.BasicStroke; import java.awt.Font; @@ -90,7 +89,6 @@ public class Paint_Delegate { private MaskFilter_Delegate mMaskFilter; private Rasterizer_Delegate mRasterizer; - // ---- Public Helper methods ---- public static Paint_Delegate getDelegate(int native_paint) { @@ -393,7 +391,7 @@ public class Paint_Delegate { } @LayoutlibDelegate - /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy, + /*package*/ static void setShadowLayer(Paint thisPaint, float radius, float dx, float dy, int color) { // FIXME Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, @@ -940,82 +938,7 @@ public class Paint_Delegate { } @LayoutlibDelegate - /*package*/ static float native_getTextRunAdvances(int native_object, - char[] text, int index, int count, int contextIndex, int contextCount, - int flags, float[] advances, int advancesIndex) { - // get the delegate from the native int. - Paint_Delegate delegate = sManager.getDelegate(native_object); - if (delegate == null) { - return 0.f; - } - - if (delegate.mFonts.size() > 0) { - // FIXME: handle multi-char characters (see measureText) - float totalAdvance = 0; - for (int i = 0; i < count; i++) { - char c = text[i + index]; - boolean found = false; - for (FontInfo info : delegate.mFonts) { - if (info.mFont.canDisplay(c)) { - float adv = info.mMetrics.charWidth(c); - totalAdvance += adv; - if (advances != null) { - advances[i] = adv; - } - - found = true; - break; - } - } - - if (found == false) { - // no advance for this char. - if (advances != null) { - advances[i] = 0.f; - } - } - } - - return totalAdvance; - } - - return 0; - - } - - @LayoutlibDelegate - /*package*/ static float native_getTextRunAdvances(int native_object, - String text, int start, int end, int contextStart, int contextEnd, - int flags, float[] advances, int advancesIndex) { - // FIXME: support contextStart, contextEnd and direction flag - int count = end - start; - char[] buffer = TemporaryBuffer.obtain(count); - TextUtils.getChars(text, start, end, buffer, 0); - - return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart, - contextEnd - contextStart, flags, advances, advancesIndex); - } - - @LayoutlibDelegate - /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text, - int contextStart, int contextLength, int flags, int offset, int cursorOpt) { - // FIXME - Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, - "Paint.getTextRunCursor is not supported.", null, null /*data*/); - return 0; - } - - @LayoutlibDelegate - /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text, - int contextStart, int contextEnd, int flags, int offset, int cursorOpt) { - // FIXME - Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, - "Paint.getTextRunCursor is not supported.", null, null /*data*/); - return 0; - } - - @LayoutlibDelegate - /*package*/ static void native_getTextPath(int native_object, int bidiFlags, + /*package*/ static void native_getTextPath(int native_object, char[] text, int index, int count, float x, float y, int path) { // FIXME Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, @@ -1023,7 +946,7 @@ public class Paint_Delegate { } @LayoutlibDelegate - /*package*/ static void native_getTextPath(int native_object, int bidiFlags, + /*package*/ static void native_getTextPath(int native_object, String text, int start, int end, float x, float y, int path) { // FIXME Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java index c45dbaa..65c65a1 100644 --- a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java @@ -60,12 +60,5 @@ public class PorterDuffColorFilter_Delegate extends ColorFilter_Delegate { return sManager.addNewDelegate(newDelegate); } - @LayoutlibDelegate - /*package*/ static int nCreatePorterDuffFilter(int nativeFilter, int srcColor, - int porterDuffMode) { - // pass - return 0; - } - // ---- Private delegate/helper methods ---- } diff --git a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java index 9bf78b4..bdc0ab1 100644 --- a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java @@ -68,20 +68,6 @@ public class RadialGradient_Delegate extends Gradient_Delegate { tileMode); } - @LayoutlibDelegate - /*package*/ static int nativePostCreate1(int native_shader, float x, float y, float radius, - int colors[], float positions[], int tileMode) { - // nothing to be done here. - return 0; - } - - @LayoutlibDelegate - /*package*/ static int nativePostCreate2(int native_shader, float x, float y, float radius, - int color0, int color1, int tileMode) { - // nothing to be done here. - return 0; - } - // ---- Private delegate/helper methods ---- /** diff --git a/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java index cb31b8f..b0ee5c2 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java @@ -469,16 +469,6 @@ public class Region_Delegate { return region1.mArea.equals(region2.mArea); } - @LayoutlibDelegate - /*package*/ static String nativeToString(int native_region) { - Region_Delegate region = sManager.getDelegate(native_region); - if (region == null) { - return "not found"; - } - - return region.mArea.toString(); - } - // ---- Private delegate/helper methods ---- } diff --git a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java index 368c0384..c6dd54b 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java @@ -76,13 +76,38 @@ public abstract class Shader_Delegate { // ---- native methods ---- @LayoutlibDelegate - /*package*/ static void nativeDestructor(int native_shader, int native_skiaShader) { + /*package*/ static void nativeDestructor(int native_shader) { sManager.removeJavaReferenceFor(native_shader); } @LayoutlibDelegate - /*package*/ static void nativeSetLocalMatrix(int native_shader, int native_skiaShader, - int matrix_instance) { + /*package*/ static boolean nativeGetLocalMatrix(int native_shader, int matrix_instance) { + // get the delegate from the native int. + Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader); + if (shaderDelegate == null) { + return false; + } + + // get the (optional) out matrix. + Matrix_Delegate outMatrixDelegate = Matrix_Delegate.getDelegate(matrix_instance); + + if (shaderDelegate.mLocalMatrix == null || shaderDelegate.mLocalMatrix.isIdentity()) { + if (outMatrixDelegate != null) { + outMatrixDelegate.reset(); + } + return false; + } + + if (outMatrixDelegate != null) { + outMatrixDelegate.set(shaderDelegate.mLocalMatrix); + } + + return true; + } + + + @LayoutlibDelegate + /*package*/ static void nativeSetLocalMatrix(int native_shader, int matrix_instance) { // get the delegate from the native int. Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader); if (shaderDelegate == null) { diff --git a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java index 966e06e..f70f9cf 100644 --- a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java @@ -62,20 +62,6 @@ public class SweepGradient_Delegate extends Gradient_Delegate { return nativeCreate1(x, y, new int[] { color0, color1 }, null /*positions*/); } - @LayoutlibDelegate - /*package*/ static int nativePostCreate1(int native_shader, float cx, float cy, - int[] colors, float[] positions) { - // nothing to be done here. - return 0; - } - - @LayoutlibDelegate - /*package*/ static int nativePostCreate2(int native_shader, float cx, float cy, - int color0, int color1) { - // nothing to be done here. - return 0; - } - // ---- Private delegate/helper methods ---- /** diff --git a/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java b/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java index 0f3cf57..d5266a5 100644 --- a/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java @@ -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; @@ -32,66 +35,131 @@ import java.io.IOException; * Through the layoutlib_create tool, the original methods of LayoutInflater have been replaced * by calls to methods of the same name in this delegate class. * + * Generally we don't want to copy-paste a huge method like that just for one small features, + * but because this is done after this platform is final and the next version (Honeycomb) has a + * better mechanism (or slightly less copy-paste), maintenance of this duplicated code is not + * a problem. + * */ public class LayoutInflater_Delegate { - /** - * Recursive method used to descend down the xml hierarchy and instantiate - * views, instantiate their children, and then call onFinishInflate(). - */ @LayoutlibDelegate - /*package*/ static void rInflate(LayoutInflater thisInflater, - XmlPullParser parser, View parent, final AttributeSet attrs, - boolean finishInflate) throws XmlPullParserException, IOException { - - if (finishInflate == false) { - // this is a merge rInflate! - if (thisInflater instanceof BridgeInflater) { - ((BridgeInflater) thisInflater).setIsInMerge(true); - } - } - - // ---- START DEFAULT IMPLEMENTATION. + /*package*/ static void parseInclude(LayoutInflater thisInflater, + XmlPullParser parser, View parent, AttributeSet attrs) + throws XmlPullParserException, IOException { - final int depth = parser.getDepth(); int type; - while (((type = parser.next()) != XmlPullParser.END_TAG || - parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { - - if (type != XmlPullParser.START_TAG) { - continue; - } - - final String name = parser.getName(); - - if (LayoutInflater.TAG_REQUEST_FOCUS.equals(name)) { - thisInflater.parseRequestFocus(parser, parent); - } else if (LayoutInflater.TAG_INCLUDE.equals(name)) { - if (parser.getDepth() == 0) { - throw new InflateException(" cannot be the root element"); + 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: "); + } else { + throw new InflateException("You must specifiy a valid layout " + + "reference. The layout ID " + value + " is not valid."); } - thisInflater.parseInclude(parser, parent, attrs); - } else if (LayoutInflater.TAG_MERGE.equals(name)) { - throw new InflateException(" must be the root element"); } else { - final View view = thisInflater.createViewFromTag(parent, name, attrs); - final ViewGroup viewGroup = (ViewGroup) parent; - final ViewGroup.LayoutParams params = viewGroup.generateLayoutParams(attrs); - thisInflater.rInflate(parser, view, attrs, true); - viewGroup.addView(view, params); + 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)) { + // ---- START MODIFICATIONS ---- + if (thisInflater instanceof BridgeInflater) { + ((BridgeInflater) thisInflater).setIsInMerge(true); + } + // ---- END MODIFICATIONS ---- + + // Inflate all children. + thisInflater.rInflate(childParser, parent, childAttrs); + + // ---- START MODIFICATIONS ---- + if (thisInflater instanceof BridgeInflater) { + ((BridgeInflater) thisInflater).setIsInMerge(false); + } + // ---- END MODIFICATIONS ---- + } else { + final View view = thisInflater.createViewFromTag(childName, childAttrs); + final ViewGroup group = (ViewGroup) parent; + + // We try to load the layout params set in the 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 tag, + // false means we need to rely on the included layout params. + ViewGroup.LayoutParams params = null; + try { + params = group.generateLayoutParams(attrs); + } catch (RuntimeException e) { + params = group.generateLayoutParams(childAttrs); + } finally { + if (params != null) { + view.setLayoutParams(params); + } + } + + // Inflate all children. + thisInflater.rInflate(childParser, view, childAttrs); + + // Attempt to override the included layout's android:id with the + // one set on the 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(" can only be used inside of a ViewGroup"); } - if (finishInflate) parent.onFinishInflate(); - - // ---- END DEFAULT IMPLEMENTATION. - - if (finishInflate == false) { - // this is a merge rInflate! - if (thisInflater instanceof BridgeInflater) { - ((BridgeInflater) thisInflater).setIsInMerge(false); - } + final int currentDepth = parser.getDepth(); + while (((type = parser.next()) != XmlPullParser.END_TAG || + parser.getDepth() > currentDepth) && type != XmlPullParser.END_DOCUMENT) { + // Empty } } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java index acc7379..2792100 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java @@ -194,9 +194,7 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge { Capability.RENDER, Capability.LAYOUT_ONLY, Capability.EMBEDDED_LAYOUT, - Capability.VIEW_MANIPULATION, - Capability.PLAY_ANIMATION, - Capability.ANIMATED_VIEW_MANIPULATION); + Capability.VIEW_MANIPULATION); BridgeAssetManager.initSystem(); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java index 765fd99..bf22c4d 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java @@ -126,19 +126,8 @@ public class BridgeRenderSession extends RenderSession { @Override public Result animate(Object targetObject, String animationName, boolean isFrameworkAnimation, IAnimationListener listener) { - try { - Bridge.prepareThread(); - mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); - if (mLastResult.isSuccess()) { - mLastResult = mSession.animate(targetObject, animationName, isFrameworkAnimation, - listener); - } - } finally { - mSession.release(); - Bridge.cleanupThread(); - } - - return mLastResult; + // Animation is only supported in API 11+ + return super.animate(targetObject, animationName, isFrameworkAnimation, listener); } @Override diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index 7d794bd..c4eee17 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -28,7 +28,6 @@ import com.android.resources.ResourceType; import com.android.util.Pair; import android.app.Activity; -import android.app.Fragment; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; @@ -45,7 +44,6 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.Resources.Theme; -import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.graphics.Bitmap; @@ -127,9 +125,6 @@ public final class BridgeContext extends Activity { mRenderResources = renderResources; - mFragments.mCurState = Fragment.CREATED; - mFragments.mActivity = this; - mApplicationInfo = new ApplicationInfo(); mApplicationInfo.targetSdkVersion = targetSdkVersion; } @@ -993,13 +988,6 @@ public final class BridgeContext extends Activity { } @Override - public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1, - CursorFactory arg2, DatabaseErrorHandler arg3) { - // TODO Auto-generated method stub - return null; - } - - @Override public Drawable peekWallpaper() { // TODO Auto-generated method stub return null; @@ -1137,12 +1125,6 @@ public final class BridgeContext extends Activity { } @Override - public void startActivities(Intent[] arg0) { - // TODO Auto-generated method stub - - } - - @Override public boolean isRestricted() { return false; } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java index 5740e8b..cb8d8dd 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java @@ -122,10 +122,10 @@ public final class BridgeInflater extends LayoutInflater { } @Override - public View createViewFromTag(View parent, String name, AttributeSet attrs) { + public View createViewFromTag(String name, AttributeSet attrs) { View view = null; try { - view = super.createViewFromTag(parent, name, attrs); + view = super.createViewFromTag(name, attrs); } catch (InflateException e) { // try to load the class from using the custom view loader try { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java index a8da377..0efa102 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java @@ -22,7 +22,6 @@ import android.os.Bundle; import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; -import android.view.DragEvent; import android.view.IWindow; import android.view.KeyEvent; import android.view.MotionEvent; @@ -82,10 +81,6 @@ public final class BridgeWindow implements IWindow { // pass for now. } - public void dispatchDragEvent(DragEvent event) { - // pass for now. - } - public void dispatchSystemUiVisibilityChanged(int visibility) { // pass for now. } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java index 8422d48..7866bfa 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java @@ -16,7 +16,6 @@ package com.android.layoutlib.bridge.android; -import android.content.ClipData; import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.Region; @@ -26,7 +25,6 @@ import android.os.RemoteException; import android.view.IWindow; import android.view.IWindowSession; import android.view.InputChannel; -import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceView; import android.view.WindowManager.LayoutParams; @@ -54,10 +52,6 @@ public final class BridgeWindowSession implements IWindowSession { // pass for now. } - public void finishKey(IWindow arg0) throws RemoteException { - // pass for now. - } - public boolean getInTouchMode() throws RemoteException { // pass for now. return false; @@ -68,16 +62,6 @@ public final class BridgeWindowSession implements IWindowSession { return false; } - public MotionEvent getPendingPointerMove(IWindow arg0) throws RemoteException { - // pass for now. - return null; - } - - public MotionEvent getPendingTrackballMove(IWindow arg0) throws RemoteException { - // pass for now. - return null; - } - public int relayout(IWindow arg0, LayoutParams arg1, int arg2, int arg3, int arg4, boolean arg4_5, Rect arg5, Rect arg6, Rect arg7, Configuration arg7b, Surface arg8) throws RemoteException { @@ -101,38 +85,6 @@ public final class BridgeWindowSession implements IWindowSession { // pass for now. } - public void setInsets(IWindow window, int touchable, Rect contentInsets, - Rect visibleInsets, Region touchableRegion) { - // pass for now. - } - - public IBinder prepareDrag(IWindow window, int flags, - int thumbnailWidth, int thumbnailHeight, Surface outSurface) - throws RemoteException { - // pass for now - return null; - } - - public boolean performDrag(IWindow window, IBinder dragToken, - float touchX, float touchY, float thumbCenterX, float thumbCenterY, - ClipData data) - throws RemoteException { - // pass for now - return false; - } - - public void reportDropResult(IWindow window, boolean consumed) throws RemoteException { - // pass for now - } - - public void dragRecipientEntered(IWindow window) throws RemoteException { - // pass for now - } - - public void dragRecipientExited(IWindow window) throws RemoteException { - // pass for now - } - public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) { // pass for now. @@ -152,18 +104,13 @@ public final class BridgeWindowSession implements IWindowSession { // pass for now. } - public void closeSystemDialogs(String reason) { - // pass for now. - } - public IBinder asBinder() { // pass for now. return null; } - public IBinder prepareDrag(IWindow arg0, boolean arg1, int arg2, int arg3, Surface arg4) - throws RemoteException { + public void setInsets(IWindow arg0, int arg1, Rect arg2, Rect arg3) throws RemoteException { // TODO Auto-generated method stub - return null; + } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java deleted file mode 100644 index 3af4e3a..0000000 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 com.android.layoutlib.bridge.bars; - -import com.android.resources.Density; - -import org.xmlpull.v1.XmlPullParserException; - -import android.content.Context; -import android.widget.TextView; - -public class FakeActionBar extends CustomBar { - - private TextView mTextView; - - public FakeActionBar(Context context, Density density, String label, String icon) - throws XmlPullParserException { - super(context, density, "/bars/action_bar.xml"); - - // Cannot access the inside items through id because no R.id values have been - // created for them. - // We do know the order though. - loadIcon(0, icon); - mTextView = setText(1, label); - - setStyle("actionBarStyle"); - } - - @Override - protected TextView getStyleableTextView() { - return mTextView; - } -} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java index 9fab51a..5507ef9 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java @@ -38,7 +38,7 @@ public class PhoneSystemBar extends CustomBar { // Cannot access the inside items through id because no R.id values have been // created for them. // We do know the order though. - // 0 is the spacer + // 0 is the spacer. loadIcon(1, "stat_sys_wifi_signal_4_fully.png", density); Drawable drawable = loadIcon(2, ResourceType.DRAWABLE, "stat_sys_battery_charge"); if (drawable instanceof LevelListDrawable) { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TabletSystemBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TabletSystemBar.java deleted file mode 100644 index 5ca68fa..0000000 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TabletSystemBar.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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 com.android.layoutlib.bridge.bars; - -import com.android.resources.Density; -import com.android.resources.ResourceType; - -import org.xmlpull.v1.XmlPullParserException; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LevelListDrawable; -import android.widget.TextView; - -public class TabletSystemBar extends CustomBar { - - public TabletSystemBar(Context context, Density density) throws XmlPullParserException { - super(context, density, "/bars/tablet_system_bar.xml"); - - setBackgroundColor(0xFF000000); - - // Cannot access the inside items through id because no R.id values have been - // created for them. - // We do know the order though. - loadIcon(0, "ic_sysbar_back_default.png", density); - loadIcon(1, "ic_sysbar_home_default.png", density); - loadIcon(2, "ic_sysbar_recent_default.png", density); - // 3 is the spacer - loadIcon(4, "stat_sys_wifi_signal_4_fully.png", density); - Drawable drawable = loadIcon(5, ResourceType.DRAWABLE, "stat_sys_battery_charge"); - if (drawable instanceof LevelListDrawable) { - ((LevelListDrawable) drawable).setLevel(100); - } - } - - @Override - protected TextView getStyleableTextView() { - return null; - } -} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java deleted file mode 100644 index 4c18656..0000000 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (C) 2010 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 com.android.layoutlib.bridge.impl; - -import com.android.ide.common.rendering.api.IAnimationListener; -import com.android.ide.common.rendering.api.RenderSession; -import com.android.ide.common.rendering.api.Result; -import com.android.ide.common.rendering.api.Result.Status; -import com.android.layoutlib.bridge.Bridge; - -import android.animation.ValueAnimator; -import android.os.Handler; -import android.os.Handler_Delegate; -import android.os.Message; -import android.os.Handler_Delegate.IHandlerCallback; - -import java.util.PriorityQueue; -import java.util.Queue; - -/** - * Abstract animation thread. - *

- * This does not actually start an animation, instead it fakes a looper that will play whatever - * animation is sending messages to its own {@link Handler}. - *

- * Classes should implement {@link #preAnimation()} and {@link #postAnimation()}. - *

- * If {@link #preAnimation()} does not start an animation somehow then the thread doesn't do - * anything. - * - */ -public abstract class AnimationThread extends Thread { - - private static class MessageBundle implements Comparable { - final Handler mTarget; - final Message mMessage; - final long mUptimeMillis; - - MessageBundle(Handler target, Message message, long uptimeMillis) { - mTarget = target; - mMessage = message; - mUptimeMillis = uptimeMillis; - } - - public int compareTo(MessageBundle bundle) { - if (mUptimeMillis < bundle.mUptimeMillis) { - return -1; - } - return 1; - } - } - - private final RenderSessionImpl mSession; - - private Queue mQueue = new PriorityQueue(); - private final IAnimationListener mListener; - - public AnimationThread(RenderSessionImpl scene, String threadName, - IAnimationListener listener) { - super(threadName); - mSession = scene; - mListener = listener; - } - - public abstract Result preAnimation(); - public abstract void postAnimation(); - - @Override - public void run() { - Bridge.prepareThread(); - try { - Handler_Delegate.setCallback(new IHandlerCallback() { - public void sendMessageAtTime(Handler handler, Message msg, long uptimeMillis) { - if (msg.what == ValueAnimator.ANIMATION_START || - msg.what == ValueAnimator.ANIMATION_FRAME) { - mQueue.add(new MessageBundle(handler, msg, uptimeMillis)); - } else { - // just ignore. - } - } - }); - - // call out to the pre-animation work, which should start an animation or more. - Result result = preAnimation(); - if (result.isSuccess() == false) { - mListener.done(result); - } - - // loop the animation - RenderSession session = mSession.getSession(); - do { - // check early. - if (mListener.isCanceled()) { - break; - } - - // get the next message. - MessageBundle bundle = mQueue.poll(); - if (bundle == null) { - break; - } - - // sleep enough for this bundle to be on time - long currentTime = System.currentTimeMillis(); - if (currentTime < bundle.mUptimeMillis) { - try { - sleep(bundle.mUptimeMillis - currentTime); - } catch (InterruptedException e) { - // FIXME log/do something/sleep again? - e.printStackTrace(); - } - } - - // check after sleeping. - if (mListener.isCanceled()) { - break; - } - - // ready to do the work, acquire the scene. - result = mSession.acquire(250); - if (result.isSuccess() == false) { - mListener.done(result); - return; - } - - // process the bundle. If the animation is not finished, this will enqueue - // the next message, so mQueue will have another one. - try { - // check after acquiring in case it took a while. - if (mListener.isCanceled()) { - break; - } - - bundle.mTarget.handleMessage(bundle.mMessage); - if (mSession.render(false /*freshRender*/).isSuccess()) { - mListener.onNewFrame(session); - } - } finally { - mSession.release(); - } - } while (mListener.isCanceled() == false && mQueue.size() > 0); - - mListener.done(Status.SUCCESS.createResult()); - - } catch (Throwable throwable) { - // can't use Bridge.getLog() as the exception might be thrown outside - // of an acquire/release block. - mListener.done(Status.ERROR_UNKNOWN.createResult("Error playing animation", throwable)); - - } finally { - postAnimation(); - Handler_Delegate.setCallback(null); - Bridge.cleanupThread(); - } - } -} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java index 21d6b1a..1cf64a8 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java @@ -166,12 +166,6 @@ public class GcSnapshot { return mOriginalCopy; } - void change() { - if (mBitmap != null) { - mBitmap.change(); - } - } - /** * Sets the clip for the graphics2D object associated with the layer. * This should be used over the normal Graphics2D setClip method. @@ -611,7 +605,6 @@ public class GcSnapshot { try { drawable.draw(configuredGraphics2D, paint); - layer.change(); } finally { // dispose Graphics2D object configuredGraphics2D.dispose(); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java deleted file mode 100644 index 35e5987..0000000 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2010 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 com.android.layoutlib.bridge.impl; - -import com.android.ide.common.rendering.api.IAnimationListener; -import com.android.ide.common.rendering.api.Result; -import com.android.ide.common.rendering.api.Result.Status; - -import android.animation.Animator; - -public class PlayAnimationThread extends AnimationThread { - - private final Animator mAnimator; - - public PlayAnimationThread(Animator animator, RenderSessionImpl scene, String animName, - IAnimationListener listener) { - super(scene, animName, listener); - mAnimator = animator; - } - - @Override - public Result preAnimation() { - // start the animation. This will send a message to the handler right away, so - // the queue is filled when this method returns. - mAnimator.start(); - - return Status.SUCCESS.createResult(); - } - - @Override - public void postAnimation() { - // nothing to be done. - } -} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java index 953d8cf..10a4368 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java @@ -87,7 +87,6 @@ public class RenderDrawable extends RenderAction { info.mHasWindowFocus = true; info.mWindowVisibility = View.VISIBLE; info.mInTouchMode = false; // this is so that we can display selections. - info.mHardwareAccelerated = false; content.dispatchAttachedToWindow(info, 0); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index 2fd58e4..cfc047f 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -16,7 +16,6 @@ package com.android.layoutlib.bridge.impl; -import static com.android.ide.common.rendering.api.Result.Status.ERROR_ANIM_NOT_FOUND; import static com.android.ide.common.rendering.api.Result.Status.ERROR_INFLATION; import static com.android.ide.common.rendering.api.Result.Status.ERROR_NOT_INFLATED; import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN; @@ -43,9 +42,7 @@ import com.android.layoutlib.bridge.android.BridgeLayoutParamsMapAttributes; import com.android.layoutlib.bridge.android.BridgeWindow; import com.android.layoutlib.bridge.android.BridgeWindowSession; import com.android.layoutlib.bridge.android.BridgeXmlBlockParser; -import com.android.layoutlib.bridge.bars.FakeActionBar; import com.android.layoutlib.bridge.bars.PhoneSystemBar; -import com.android.layoutlib.bridge.bars.TabletSystemBar; import com.android.layoutlib.bridge.bars.TitleBar; import com.android.resources.ResourceType; import com.android.resources.ScreenSize; @@ -53,11 +50,6 @@ import com.android.util.Pair; import org.xmlpull.v1.XmlPullParserException; -import android.animation.Animator; -import android.animation.AnimatorInflater; -import android.animation.LayoutTransition; -import android.animation.LayoutTransition.TransitionListener; -import android.app.Fragment_Delegate; import android.graphics.Bitmap; import android.graphics.Bitmap_Delegate; import android.graphics.Canvas; @@ -72,7 +64,6 @@ import android.view.View.MeasureSpec; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; import android.widget.LinearLayout; -import android.widget.QuickContactBadge; import android.widget.TabHost; import android.widget.TabWidget; import android.widget.TabHost.TabSpec; @@ -112,9 +103,7 @@ public class RenderSessionImpl extends RenderAction { private boolean mWindowIsFloating; private int mStatusBarSize; - private int mSystemBarSize; private int mTitleBarSize; - private int mActionBarSize; // information being returned through the API @@ -174,13 +163,11 @@ public class RenderSessionImpl extends RenderAction { findBackground(resources); findStatusBar(resources, metrics); - findActionBar(resources, metrics); - findSystemBar(resources, metrics); + findTitleBar(resources, metrics); // build the inflater and parser. mInflater = new BridgeInflater(context, params.getProjectCallback()); context.setBridgeInflater(mInflater); - mInflater.setFactory2(context); mBlockParser = new BridgeXmlBlockParser( params.getLayoutDescription(), context, false /* platformResourceFlag */); @@ -214,18 +201,16 @@ public class RenderSessionImpl extends RenderAction { * we're creating the following layout * +-------------------------------------------------+ - | System bar (only in phone UI) | + | System bar | +-------------------------------------------------+ | (Layout with background drawable) | | +---------------------------------------------+ | - | | Title/Action bar (optional) | | + | | Title (optional) | | | +---------------------------------------------+ | | | Content, vertical extending | | | | | | | +---------------------------------------------+ | +-------------------------------------------------+ - | System bar (only in tablet UI) | - +-------------------------------------------------+ */ @@ -257,20 +242,8 @@ public class RenderSessionImpl extends RenderAction { topLayout.addView(backgroundLayout); - // if the theme says no title/action bar, then the size will be 0 - if (mActionBarSize > 0) { - try { - FakeActionBar actionBar = new FakeActionBar(context, - params.getDensity(), - params.getAppLabel(), params.getAppIcon()); - actionBar.setLayoutParams( - new LinearLayout.LayoutParams( - LayoutParams.MATCH_PARENT, mActionBarSize)); - backgroundLayout.addView(actionBar); - } catch (XmlPullParserException e) { - - } - } else if (mTitleBarSize > 0) { + // if the theme says no title, then the size will be 0 + if (mTitleBarSize > 0) { try { TitleBar titleBar = new TitleBar(context, params.getDensity(), params.getAppLabel()); @@ -283,7 +256,6 @@ public class RenderSessionImpl extends RenderAction { } } - // content frame mContentRoot = new FrameLayout(context); layoutParams = new LinearLayout.LayoutParams( @@ -291,38 +263,17 @@ public class RenderSessionImpl extends RenderAction { layoutParams.weight = 1; mContentRoot.setLayoutParams(layoutParams); backgroundLayout.addView(mContentRoot); - - if (mSystemBarSize > 0) { - // system bar - try { - TabletSystemBar systemBar = new TabletSystemBar(context, - params.getDensity()); - systemBar.setLayoutParams( - new LinearLayout.LayoutParams( - LayoutParams.MATCH_PARENT, mSystemBarSize)); - topLayout.addView(systemBar); - } catch (XmlPullParserException e) { - - } - } } - // Sets the project callback (custom view loader) to the fragment delegate so that - // it can instantiate the custom Fragment. - Fragment_Delegate.setProjectCallback(params.getProjectCallback()); - View view = mInflater.inflate(mBlockParser, mContentRoot); - Fragment_Delegate.setProjectCallback(null); - // set the AttachInfo on the root view. AttachInfo info = new AttachInfo(new BridgeWindowSession(), new BridgeWindow(), new Handler(), null); info.mHasWindowFocus = true; info.mWindowVisibility = View.VISIBLE; info.mInTouchMode = false; // this is so that we can display selections. - info.mHardwareAccelerated = false; mViewRoot.dispatchAttachedToWindow(info, 0); // post-inflate process. For now this supports TabHost/TabWidget @@ -494,64 +445,6 @@ public class RenderSessionImpl extends RenderAction { } /** - * Animate an object - *

- * {@link #acquire(long)} must have been called before this. - * - * @throws IllegalStateException if the current context is different than the one owned by - * the scene, or if {@link #acquire(long)} was not called. - * - * @see RenderSession#animate(Object, String, boolean, IAnimationListener) - */ - public Result animate(Object targetObject, String animationName, - boolean isFrameworkAnimation, IAnimationListener listener) { - checkLock(); - - BridgeContext context = getContext(); - - // find the animation file. - ResourceValue animationResource = null; - int animationId = 0; - if (isFrameworkAnimation) { - animationResource = context.getRenderResources().getFrameworkResource( - ResourceType.ANIMATOR, animationName); - if (animationResource != null) { - animationId = Bridge.getResourceId(ResourceType.ANIMATOR, animationName); - } - } else { - animationResource = context.getRenderResources().getProjectResource( - ResourceType.ANIMATOR, animationName); - if (animationResource != null) { - animationId = context.getProjectCallback().getResourceId( - ResourceType.ANIMATOR, animationName); - } - } - - if (animationResource != null) { - try { - Animator anim = AnimatorInflater.loadAnimator(context, animationId); - if (anim != null) { - anim.setTarget(targetObject); - - new PlayAnimationThread(anim, this, animationName, listener).start(); - - return SUCCESS.createResult(); - } - } catch (Exception e) { - // get the real cause of the exception. - Throwable t = e; - while (t.getCause() != null) { - t = t.getCause(); - } - - return ERROR_UNKNOWN.createResult(t.getMessage(), t); - } - } - - return ERROR_ANIM_NOT_FOUND.createResult(); - } - - /** * Insert a new child into an existing parent. *

* {@link #acquire(long)} must have been called before this. @@ -562,7 +455,7 @@ public class RenderSessionImpl extends RenderAction { * @see RenderSession#insertChild(Object, ILayoutPullParser, int, IAnimationListener) */ public Result insertChild(final ViewGroup parentView, ILayoutPullParser childXml, - final int index, IAnimationListener listener) { + final int index, final IAnimationListener listener) { checkLock(); BridgeContext context = getContext(); @@ -580,17 +473,33 @@ public class RenderSessionImpl extends RenderAction { invalidateRenderingSize(); if (listener != null) { - new AnimationThread(this, "insertChild", listener) { - + // there is no support for animating views in this API level, so we fake the animation + // through a no animation thread. + new Thread("not animated insertChild") { @Override - public Result preAnimation() { - parentView.setLayoutTransition(new LayoutTransition()); - return addView(parentView, child, index); - } + public void run() { + Result result = addView(parentView, child, index); + if (result.isSuccess() == false) { + listener.done(result); + } - @Override - public void postAnimation() { - parentView.setLayoutTransition(null); + // ready to do the work, acquire the scene. + result = acquire(250); + if (result.isSuccess() == false) { + listener.done(result); + return; + } + + try { + result = render(false /*freshRender*/); + if (result.isSuccess()) { + listener.onNewFrame(RenderSessionImpl.this.getSession()); + } + } finally { + release(); + } + + listener.done(result); } }.start(); @@ -662,72 +571,36 @@ public class RenderSessionImpl extends RenderAction { if (listener != null) { final LayoutParams params = layoutParams; - // there is no support for animating views across layouts, so in case the new and old - // parent views are different we fake the animation through a no animation thread. - if (previousParent != newParentView) { - new Thread("not animated moveChild") { - @Override - public void run() { - Result result = moveView(previousParent, newParentView, childView, index, - params); - if (result.isSuccess() == false) { - listener.done(result); - } - - // ready to do the work, acquire the scene. - result = acquire(250); - if (result.isSuccess() == false) { - listener.done(result); - return; - } - - try { - result = render(false /*freshRender*/); - if (result.isSuccess()) { - listener.onNewFrame(RenderSessionImpl.this.getSession()); - } - } finally { - release(); - } - + // there is no support for animating views in this API level, so we fake the animation + // through a no animation thread. + new Thread("not animated moveChild") { + @Override + public void run() { + Result result = moveView(previousParent, newParentView, childView, index, + params); + if (result.isSuccess() == false) { listener.done(result); } - }.start(); - } else { - new AnimationThread(this, "moveChild", listener) { - - @Override - public Result preAnimation() { - // set up the transition for the parent. - LayoutTransition transition = new LayoutTransition(); - previousParent.setLayoutTransition(transition); - - // tweak the animation durations and start delays (to match the duration of - // animation playing just before). - // Note: Cannot user Animation.setDuration() directly. Have to set it - // on the LayoutTransition. - transition.setDuration(LayoutTransition.DISAPPEARING, 100); - // CHANGE_DISAPPEARING plays after DISAPPEARING - transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 100); - transition.setDuration(LayoutTransition.CHANGE_DISAPPEARING, 100); - - transition.setDuration(LayoutTransition.CHANGE_APPEARING, 100); - // CHANGE_APPEARING plays after CHANGE_APPEARING - transition.setStartDelay(LayoutTransition.APPEARING, 100); - - transition.setDuration(LayoutTransition.APPEARING, 100); - - return moveView(previousParent, newParentView, childView, index, params); + // ready to do the work, acquire the scene. + result = acquire(250); + if (result.isSuccess() == false) { + listener.done(result); + return; } - @Override - public void postAnimation() { - previousParent.setLayoutTransition(null); - newParentView.setLayoutTransition(null); + try { + result = render(false /*freshRender*/); + if (result.isSuccess()) { + listener.onNewFrame(RenderSessionImpl.this.getSession()); + } + } finally { + release(); } - }.start(); - } + + listener.done(result); + } + }.start(); // always return success since the real status will come through the listener. return SUCCESS.createResult(layoutParams); @@ -763,66 +636,17 @@ public class RenderSessionImpl extends RenderAction { private Result moveView(ViewGroup previousParent, final ViewGroup newParent, final View movedView, final int index, final LayoutParams params) { try { - // check if there is a transition on the previousParent. - LayoutTransition previousTransition = previousParent.getLayoutTransition(); - if (previousTransition != null) { - // in this case there is an animation. This means we have to wait for the child's - // parent reference to be null'ed out so that we can add it to the new parent. - // It is technically removed right before the DISAPPEARING animation is done (if - // the animation of this type is not null, otherwise it's after which is impossible - // to handle). - // Because there is no move animation, if the new parent is the same as the old - // parent, we need to wait until the CHANGE_DISAPPEARING animation is done before - // adding the child or the child will appear in its new location before the - // other children have made room for it. - - // add a listener to the transition to be notified of the actual removal. - previousTransition.addTransitionListener(new TransitionListener() { - private int mChangeDisappearingCount = 0; - - public void startTransition(LayoutTransition transition, ViewGroup container, - View view, int transitionType) { - if (transitionType == LayoutTransition.CHANGE_DISAPPEARING) { - mChangeDisappearingCount++; - } - } - - public void endTransition(LayoutTransition transition, ViewGroup container, - View view, int transitionType) { - if (transitionType == LayoutTransition.CHANGE_DISAPPEARING) { - mChangeDisappearingCount--; - } - - if (transitionType == LayoutTransition.CHANGE_DISAPPEARING && - mChangeDisappearingCount == 0) { - // add it to the parentView in the correct location - if (params != null) { - newParent.addView(movedView, index, params); - } else { - newParent.addView(movedView, index); - } - } - } - }); - - // remove the view from the current parent. - previousParent.removeView(movedView); + // standard code with no animation. pretty simple. + previousParent.removeView(movedView); - // and return since adding the view to the new parent is done in the listener. - return SUCCESS.createResult(); + // add it to the parentView in the correct location + if (params != null) { + newParent.addView(movedView, index, params); } else { - // standard code with no animation. pretty simple. - previousParent.removeView(movedView); - - // add it to the parentView in the correct location - if (params != null) { - newParent.addView(movedView, index, params); - } else { - newParent.addView(movedView, index); - } - - return SUCCESS.createResult(); + newParent.addView(movedView, index); } + + return SUCCESS.createResult(); } catch (UnsupportedOperationException e) { // looks like this is a view class that doesn't support children manipulation! return ERROR_VIEWGROUP_NO_CHILDREN.createResult(); @@ -839,7 +663,7 @@ public class RenderSessionImpl extends RenderAction { * * @see RenderSession#removeChild(Object, IAnimationListener) */ - public Result removeChild(final View childView, IAnimationListener listener) { + public Result removeChild(final View childView, final IAnimationListener listener) { checkLock(); invalidateRenderingSize(); @@ -847,17 +671,33 @@ public class RenderSessionImpl extends RenderAction { final ViewGroup parent = (ViewGroup) childView.getParent(); if (listener != null) { - new AnimationThread(this, "moveChild", listener) { - + // there is no support for animating views in this API level, so we fake the animation + // through a no animation thread. + new Thread("not animated moveChild") { @Override - public Result preAnimation() { - parent.setLayoutTransition(new LayoutTransition()); - return removeView(parent, childView); - } + public void run() { + Result result = removeView(parent, childView); + if (result.isSuccess() == false) { + listener.done(result); + } - @Override - public void postAnimation() { - parent.setLayoutTransition(null); + // ready to do the work, acquire the scene. + result = acquire(250); + if (result.isSuccess() == false) { + listener.done(result); + return; + } + + try { + result = render(false /*freshRender*/); + if (result.isSuccess()) { + listener.onNewFrame(RenderSessionImpl.this.getSession()); + } + } finally { + release(); + } + + listener.done(result); } }.start(); @@ -902,50 +742,43 @@ public class RenderSessionImpl extends RenderAction { } } - private boolean isTabletUi() { - return getParams().getConfigScreenSize() == ScreenSize.XLARGE; - } - private void findStatusBar(RenderResources resources, DisplayMetrics metrics) { - if (isTabletUi() == false) { - boolean windowFullscreen = getBooleanThemeValue(resources, - "windowFullscreen", false /*defaultValue*/); - - if (windowFullscreen == false && mWindowIsFloating == false) { - // default value - mStatusBarSize = DEFAULT_STATUS_BAR_HEIGHT; - - // get the real value - ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN, - "status_bar_height"); - - if (value != null) { - TypedValue typedValue = ResourceHelper.getValue(value.getValue()); - if (typedValue != null) { - // compute the pixel value based on the display metrics - mStatusBarSize = (int)typedValue.getDimension(metrics); - } + boolean windowFullscreen = getBooleanThemeValue(resources, + "windowFullscreen", false /*defaultValue*/); + + if (windowFullscreen == false && mWindowIsFloating == false) { + // default value + mStatusBarSize = DEFAULT_STATUS_BAR_HEIGHT; + + // get the real value + ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN, + "status_bar_height"); + + if (value != null) { + TypedValue typedValue = ResourceHelper.getValue(value.getValue()); + if (typedValue != null) { + // compute the pixel value based on the display metrics + mStatusBarSize = (int)typedValue.getDimension(metrics); } } } } - private void findActionBar(RenderResources resources, DisplayMetrics metrics) { + private void findTitleBar(RenderResources resources, DisplayMetrics metrics) { if (mWindowIsFloating) { return; } - boolean windowActionBar = getBooleanThemeValue(resources, - "windowActionBar", true /*defaultValue*/); + boolean windowNoTitle = getBooleanThemeValue(resources, + "windowNoTitle", false /*defaultValue*/); - // if there's a value and it's false (default is true) - if (windowActionBar) { + if (windowNoTitle == false) { // default size of the window title bar - mActionBarSize = DEFAULT_TITLE_BAR_HEIGHT; + mTitleBarSize = DEFAULT_TITLE_BAR_HEIGHT; // get value from the theme. - ResourceValue value = resources.findItemInTheme("actionBarSize"); + ResourceValue value = resources.findItemInTheme("windowTitleSize"); // resolve it value = resources.resolveResValue(value); @@ -955,53 +788,7 @@ public class RenderSessionImpl extends RenderAction { TypedValue typedValue = ResourceHelper.getValue(value.getValue()); if (typedValue != null) { // compute the pixel value based on the display metrics - mActionBarSize = (int)typedValue.getDimension(metrics); - } - } - } else { - // action bar overrides title bar so only look for this one if action bar is hidden - boolean windowNoTitle = getBooleanThemeValue(resources, - "windowNoTitle", false /*defaultValue*/); - - if (windowNoTitle == false) { - - // default size of the window title bar - mTitleBarSize = DEFAULT_TITLE_BAR_HEIGHT; - - // get value from the theme. - ResourceValue value = resources.findItemInTheme("windowTitleSize"); - - // resolve it - value = resources.resolveResValue(value); - - if (value != null) { - // get the numerical value, if available - TypedValue typedValue = ResourceHelper.getValue(value.getValue()); - if (typedValue != null) { - // compute the pixel value based on the display metrics - mTitleBarSize = (int)typedValue.getDimension(metrics); - } - } - } - - } - } - - private void findSystemBar(RenderResources resources, DisplayMetrics metrics) { - if (isTabletUi() && mWindowIsFloating == false) { - - // default value - mSystemBarSize = 48; // ?? - - // get the real value - ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN, - "status_bar_height"); - - if (value != null) { - TypedValue typedValue = ResourceHelper.getValue(value.getValue()); - if (typedValue != null) { - // compute the pixel value based on the display metrics - mSystemBarSize = (int)typedValue.getDimension(metrics); + mTitleBarSize = (int)typedValue.getDimension(metrics); } } } @@ -1036,9 +823,6 @@ public class RenderSessionImpl extends RenderAction { throws PostInflateException { if (view instanceof TabHost) { setupTabHost((TabHost)view, projectCallback); - } else if (view instanceof QuickContactBadge) { - QuickContactBadge badge = (QuickContactBadge) view; - badge.setImageToDefault(); } else if (view instanceof ViewGroup) { ViewGroup group = (ViewGroup)view; final int count = group.getChildCount(); diff --git a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java deleted file mode 100644 index e6dc646..0000000 --- a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * 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 libcore.icu; - -import com.android.tools.layoutlib.annotations.LayoutlibDelegate; - -import java.util.Locale; - -/** - * Delegate implementing the native methods of libcore.icu.ICU - * - * Through the layoutlib_create tool, the original native methods of ICU have been replaced - * by calls to methods of the same name in this delegate class. - * - */ -public class ICU_Delegate { - - // --- Java delegates - - @LayoutlibDelegate - /*package*/ static String toLowerCase(String s, String localeName) { - return s.toLowerCase(); - } - - @LayoutlibDelegate - /*package*/ static String toUpperCase(String s, String localeName) { - return s.toUpperCase(); - } - - // --- Native methods accessing ICU's database. - - @LayoutlibDelegate - /*package*/ static String[] getAvailableBreakIteratorLocalesNative() { - return new String[0]; - } - - @LayoutlibDelegate - /*package*/ static String[] getAvailableCalendarLocalesNative() { - return new String[0]; - } - - @LayoutlibDelegate - /*package*/ static String[] getAvailableCollatorLocalesNative() { - return new String[0]; - } - - @LayoutlibDelegate - /*package*/ static String[] getAvailableDateFormatLocalesNative() { - return new String[0]; - } - - @LayoutlibDelegate - /*package*/ static String[] getAvailableLocalesNative() { - return new String[0]; - } - - @LayoutlibDelegate - /*package*/ static String[] getAvailableNumberFormatLocalesNative() { - return new String[0]; - } - - @LayoutlibDelegate - /*package*/ static String getCurrencyCodeNative(String locale) { - return ""; - } - - @LayoutlibDelegate - /*package*/ static int getCurrencyFractionDigitsNative(String currencyCode) { - return 0; - } - - @LayoutlibDelegate - /*package*/ static String getCurrencySymbolNative(String locale, String currencyCode) { - return ""; - } - - @LayoutlibDelegate - /*package*/ static String getDisplayCountryNative(String countryCode, String locale) { - return ""; - } - - @LayoutlibDelegate - /*package*/ static String getDisplayLanguageNative(String languageCode, String locale) { - return ""; - } - - @LayoutlibDelegate - /*package*/ static String getDisplayVariantNative(String variantCode, String locale) { - return ""; - } - - @LayoutlibDelegate - /*package*/ static String getISO3CountryNative(String locale) { - return ""; - } - - @LayoutlibDelegate - /*package*/ static String getISO3LanguageNative(String locale) { - return ""; - } - - @LayoutlibDelegate - /*package*/ static String[] getISOLanguagesNative() { - return Locale.getISOLanguages(); - } - - @LayoutlibDelegate - /*package*/ static String[] getISOCountriesNative() { - return Locale.getISOCountries(); - } - - @LayoutlibDelegate - /*package*/ static boolean initLocaleDataImpl(String locale, LocaleData result) { - - // Used by Calendar. - result.firstDayOfWeek = Integer.valueOf(1); - result.minimalDaysInFirstWeek = Integer.valueOf(1); - - // Used by DateFormatSymbols. - result.amPm = new String[] { "AM", "PM" }; - result.eras = new String[] { "BC", "AD" }; - - result.longMonthNames = new String[] { "January", "February", "March", "April", "May", - "June", "July", "August", "September", "October", "November", "December" }; - result.shortMonthNames = new String[] { "Jan", "Feb", "Mar", "Apr", "May", - "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - result.longStandAloneMonthNames = result.longMonthNames; - result.shortStandAloneMonthNames = result.shortMonthNames; - - result.longWeekdayNames = new String[] { - "Monday" ,"Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; - result.shortWeekdayNames = new String[] { - "Mon" ,"Tue", "Wed", "Thu", "Fri", "Sat", "Sun" }; - result.longStandAloneWeekdayNames = result.longWeekdayNames; - result.shortStandAloneWeekdayNames = result.shortWeekdayNames; - - result.fullTimeFormat = ""; - result.longTimeFormat = ""; - result.mediumTimeFormat = ""; - result.shortTimeFormat = ""; - - result.fullDateFormat = ""; - result.longDateFormat = ""; - result.mediumDateFormat = ""; - result.shortDateFormat = ""; - - // Used by DecimalFormatSymbols. - result.zeroDigit = '0'; - result.digit = '0'; - result.decimalSeparator = '.'; - result.groupingSeparator = ','; - result.patternSeparator = ' '; - result.percent = '%'; - result.perMill = '\u2030'; - result.monetarySeparator = ' '; - result.minusSign = '-'; - result.exponentSeparator = "e"; - result.infinity = "\u221E"; - result.NaN = "NaN"; - // Also used by Currency. - result.currencySymbol = "$"; - result.internationalCurrencySymbol = "USD"; - - // Used by DecimalFormat and NumberFormat. - result.numberPattern = "%f"; - result.integerPattern = "%d"; - result.currencyPattern = "%s"; - result.percentPattern = "%f"; - - return true; - } -} diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java index eff6bbc..4b62e43 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java @@ -94,13 +94,12 @@ public final class CreateInfo implements ICreateInfo { * The list of methods to rewrite as delegates. */ private final static String[] DELEGATE_METHODS = new String[] { - "android.app.Fragment#instantiate", //(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;", "android.content.res.Resources$Theme#obtainStyledAttributes", "android.content.res.Resources$Theme#resolveAttribute", "android.graphics.BitmapFactory#finishDecode", "android.os.Handler#sendMessageAtTime", "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 @@ -110,7 +109,6 @@ public final class CreateInfo implements ICreateInfo { * The list of classes on which to delegate all native methods. */ private final static String[] DELEGATE_CLASS_NATIVES = new String[] { - "android.animation.PropertyValuesHolder", "android.graphics.AvoidXfermode", "android.graphics.Bitmap", "android.graphics.BitmapFactory", @@ -150,7 +148,6 @@ public final class CreateInfo implements ICreateInfo { "android.graphics.Xfermode", "android.os.SystemClock", "android.util.FloatMath", - "libcore.icu.ICU", }; /** diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java index ce48069..0fce7ef 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java @@ -68,7 +68,6 @@ public class Main { AsmAnalyzer aa = new AsmAnalyzer(log, osJarPath, agen, new String[] { // derived from "android.view.View", - "android.app.Fragment" }, new String[] { // include classes "android.*", // for android.R -- cgit v1.1