From d77b9ed7dcc42efca33b225c4594a30aab9e709c Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Tue, 12 May 2015 12:01:16 -0700 Subject: [PATCH] Add missing delegates for M preview. - Remove ICU dependency (use the version bundled with platform). - Restructure intelliJ project to move dependencies to module. - Minor fixes to layoutlib tests. TODO: - Load ICU data. - Hyphenator doesn't work. - High quality line breaker not present. Change-Id: I965e096e17bfc97ee995a649c3f4f6f64bb4f70d --- tools/layoutlib/.idea/libraries/asm_4_0.xml | 11 - .../.idea/libraries/framework_jar.xml | 13 -- tools/layoutlib/.idea/libraries/guava.xml | 11 - tools/layoutlib/.idea/libraries/icu4j.xml | 11 - .../layoutlib/.idea/libraries/kxml2_2_3_0.xml | 11 - .../libraries/layoutlib_api_prebuilt.xml | 11 - .../.idea/libraries/ninepatch_prebuilt.xml | 11 - .../.idea/libraries/tools_common_prebuilt.xml | 14 -- tools/layoutlib/bridge/Android.mk | 1 - tools/layoutlib/bridge/bridge.iml | 80 ++++++- .../android/content/res/BridgeTypedArray.java | 11 + .../src/android/graphics/BidiRenderer.java | 13 +- .../graphics/BitmapShader_Delegate.java | 59 ++--- .../src/android/graphics/Bitmap_Delegate.java | 51 ++--- .../src/android/graphics/Canvas_Delegate.java | 32 +-- .../android/graphics/NinePatch_Delegate.java | 19 +- .../src/android/graphics/Paint_Delegate.java | 102 ++++++++- .../src/android/graphics/Shader_Delegate.java | 5 +- .../android/text/AndroidBidi_Delegate.java | 2 +- .../src/android/text/GreedyLineBreaker.java | 2 +- .../src/android/text/Hyphenator_Delegate.java | 44 ++++ .../bridge/src/android/text/LineBreaker.java | 1 - .../android/text/StaticLayout_Delegate.java | 205 +++++++++++------- .../com/android/layoutlib/bridge/Bridge.java | 11 +- .../bridge/android/AndroidLocale.java | 4 +- .../bridge/impl/DelegateManager.java | 9 +- .../icu/DateIntervalFormat_Delegate.java | 74 ------- .../bridge/src/libcore/icu/ICU_Delegate.java | 12 +- tools/layoutlib/bridge/tests/Android.mk | 1 - .../MyApplication/golden/allwidgets.png | Bin 11038 -> 10472 bytes .../layoutlib/bridge/TestDelegates.java | 2 +- .../android/BridgeXmlBlockParserTest.java | 4 +- .../layoutlib/bridge/intensive/Main.java | 12 +- tools/layoutlib/create/create.iml | 15 +- .../tools/layoutlib/create/CreateInfo.java | 2 +- .../android/tools/layoutlib/create/Main.java | 1 + 36 files changed, 491 insertions(+), 376 deletions(-) delete mode 100644 tools/layoutlib/.idea/libraries/asm_4_0.xml delete mode 100644 tools/layoutlib/.idea/libraries/framework_jar.xml delete mode 100644 tools/layoutlib/.idea/libraries/guava.xml delete mode 100644 tools/layoutlib/.idea/libraries/icu4j.xml delete mode 100644 tools/layoutlib/.idea/libraries/kxml2_2_3_0.xml delete mode 100644 tools/layoutlib/.idea/libraries/layoutlib_api_prebuilt.xml delete mode 100644 tools/layoutlib/.idea/libraries/ninepatch_prebuilt.xml delete mode 100644 tools/layoutlib/.idea/libraries/tools_common_prebuilt.xml create mode 100644 tools/layoutlib/bridge/src/android/text/Hyphenator_Delegate.java delete mode 100644 tools/layoutlib/bridge/src/libcore/icu/DateIntervalFormat_Delegate.java diff --git a/tools/layoutlib/.idea/libraries/asm_4_0.xml b/tools/layoutlib/.idea/libraries/asm_4_0.xml deleted file mode 100644 index 7df287f69921e..0000000000000 --- a/tools/layoutlib/.idea/libraries/asm_4_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tools/layoutlib/.idea/libraries/framework_jar.xml b/tools/layoutlib/.idea/libraries/framework_jar.xml deleted file mode 100644 index 6695a3631ff13..0000000000000 --- a/tools/layoutlib/.idea/libraries/framework_jar.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/layoutlib/.idea/libraries/guava.xml b/tools/layoutlib/.idea/libraries/guava.xml deleted file mode 100644 index eb6071977c563..0000000000000 --- a/tools/layoutlib/.idea/libraries/guava.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tools/layoutlib/.idea/libraries/icu4j.xml b/tools/layoutlib/.idea/libraries/icu4j.xml deleted file mode 100644 index dbe0bd7b026fe..0000000000000 --- a/tools/layoutlib/.idea/libraries/icu4j.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tools/layoutlib/.idea/libraries/kxml2_2_3_0.xml b/tools/layoutlib/.idea/libraries/kxml2_2_3_0.xml deleted file mode 100644 index 2a65050969357..0000000000000 --- a/tools/layoutlib/.idea/libraries/kxml2_2_3_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tools/layoutlib/.idea/libraries/layoutlib_api_prebuilt.xml b/tools/layoutlib/.idea/libraries/layoutlib_api_prebuilt.xml deleted file mode 100644 index a8736000a513c..0000000000000 --- a/tools/layoutlib/.idea/libraries/layoutlib_api_prebuilt.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tools/layoutlib/.idea/libraries/ninepatch_prebuilt.xml b/tools/layoutlib/.idea/libraries/ninepatch_prebuilt.xml deleted file mode 100644 index f34f7ddf0e50d..0000000000000 --- a/tools/layoutlib/.idea/libraries/ninepatch_prebuilt.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tools/layoutlib/.idea/libraries/tools_common_prebuilt.xml b/tools/layoutlib/.idea/libraries/tools_common_prebuilt.xml deleted file mode 100644 index b325ad49c04b3..0000000000000 --- a/tools/layoutlib/.idea/libraries/tools_common_prebuilt.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/layoutlib/bridge/Android.mk b/tools/layoutlib/bridge/Android.mk index 80b4d59e0cdd3..0dbdd5627e634 100644 --- a/tools/layoutlib/bridge/Android.mk +++ b/tools/layoutlib/bridge/Android.mk @@ -22,7 +22,6 @@ LOCAL_JAVACFLAGS := -source 6 -target 6 LOCAL_JAVA_LIBRARIES := \ - icu4j \ layoutlib_api-prebuilt \ tools-common-prebuilt diff --git a/tools/layoutlib/bridge/bridge.iml b/tools/layoutlib/bridge/bridge.iml index 0baa5ab867599..d2b12595190a5 100644 --- a/tools/layoutlib/bridge/bridge.iml +++ b/tools/layoutlib/bridge/bridge.iml @@ -24,15 +24,79 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java index 7d4271bc7688f..572fdc9bc1066 100644 --- a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java +++ b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java @@ -758,6 +758,17 @@ public final class BridgeTypedArray extends TypedArray { return s != null && ResourceHelper.parseFloatAttribute(mNames[index], s, outValue, false); } + @Override + public int getType(int index) { + if (!hasValue(index)) { + return TypedValue.TYPE_NULL; + } + ResourceValue value = mResourceData[index]; + ResourceType resourceType = value.getResourceType(); + return 0; + // TODO: fixme. + } + /** * Determines whether there is an attribute at index. * diff --git a/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java b/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java index a4a3b7d41c453..21f36ceb0c1ba 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java +++ b/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java @@ -19,6 +19,12 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; +import android.graphics.Paint_Delegate.FontInfo; +import android.icu.lang.UScript; +import android.icu.lang.UScriptRun; +import android.icu.text.Bidi; +import android.icu.text.BidiRun; + import java.awt.Font; import java.awt.Graphics2D; import java.awt.Toolkit; @@ -29,13 +35,6 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import com.ibm.icu.lang.UScript; -import com.ibm.icu.lang.UScriptRun; -import com.ibm.icu.text.Bidi; -import com.ibm.icu.text.BidiRun; - -import android.graphics.Paint_Delegate.FontInfo; - /** * Render the text by breaking it into various scripts and using the right font for each script. * Can be used to measure the text without actually drawing it. diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java index e9b5d6efcef07..af47aebce3570 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java @@ -23,7 +23,15 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Shader.TileMode; +import java.awt.PaintContext; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.geom.NoninvertibleTransformException; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; import java.awt.image.ColorModel; +import java.awt.image.Raster; /** * Delegate implementing the native methods of android.graphics.BitmapShader @@ -67,9 +75,9 @@ public class BitmapShader_Delegate extends Shader_Delegate { // ---- native methods ---- @LayoutlibDelegate - /*package*/ static long nativeCreate(long native_bitmap, int shaderTileModeX, + /*package*/ static long nativeCreate(Bitmap androidBitmap, int shaderTileModeX, int shaderTileModeY) { - Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(native_bitmap); + Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(androidBitmap); if (bitmap == null) { return 0; } @@ -83,17 +91,17 @@ public class BitmapShader_Delegate extends Shader_Delegate { // ---- Private delegate/helper methods ---- - private BitmapShader_Delegate(java.awt.image.BufferedImage image, + private BitmapShader_Delegate(BufferedImage image, TileMode tileModeX, TileMode tileModeY) { mJavaPaint = new BitmapShaderPaint(image, tileModeX, tileModeY); } private class BitmapShaderPaint implements java.awt.Paint { - private final java.awt.image.BufferedImage mImage; + private final BufferedImage mImage; private final TileMode mTileModeX; private final TileMode mTileModeY; - BitmapShaderPaint(java.awt.image.BufferedImage image, + BitmapShaderPaint(BufferedImage image, TileMode tileModeX, TileMode tileModeY) { mImage = image; mTileModeX = tileModeX; @@ -101,29 +109,24 @@ public class BitmapShader_Delegate extends Shader_Delegate { } @Override - public java.awt.PaintContext createContext( - java.awt.image.ColorModel colorModel, - java.awt.Rectangle deviceBounds, - java.awt.geom.Rectangle2D userBounds, - java.awt.geom.AffineTransform xform, - java.awt.RenderingHints hints) { - - java.awt.geom.AffineTransform canvasMatrix; + public PaintContext createContext(ColorModel colorModel, Rectangle deviceBounds, + Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) { + AffineTransform canvasMatrix; try { canvasMatrix = xform.createInverse(); - } catch (java.awt.geom.NoninvertibleTransformException e) { + } catch (NoninvertibleTransformException e) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, "Unable to inverse matrix in BitmapShader", e, null /*data*/); - canvasMatrix = new java.awt.geom.AffineTransform(); + canvasMatrix = new AffineTransform(); } - java.awt.geom.AffineTransform localMatrix = getLocalMatrix(); + AffineTransform localMatrix = getLocalMatrix(); try { localMatrix = localMatrix.createInverse(); - } catch (java.awt.geom.NoninvertibleTransformException e) { + } catch (NoninvertibleTransformException e) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, "Unable to inverse matrix in BitmapShader", e, null /*data*/); - localMatrix = new java.awt.geom.AffineTransform(); + localMatrix = new AffineTransform(); } if (!colorModel.isCompatibleRaster(mImage.getRaster())) { @@ -134,16 +137,16 @@ public class BitmapShader_Delegate extends Shader_Delegate { return new BitmapShaderContext(canvasMatrix, localMatrix, colorModel); } - private class BitmapShaderContext implements java.awt.PaintContext { + private class BitmapShaderContext implements PaintContext { - private final java.awt.geom.AffineTransform mCanvasMatrix; - private final java.awt.geom.AffineTransform mLocalMatrix; - private final java.awt.image.ColorModel mColorModel; + private final AffineTransform mCanvasMatrix; + private final AffineTransform mLocalMatrix; + private final ColorModel mColorModel; public BitmapShaderContext( - java.awt.geom.AffineTransform canvasMatrix, - java.awt.geom.AffineTransform localMatrix, - java.awt.image.ColorModel colorModel) { + AffineTransform canvasMatrix, + AffineTransform localMatrix, + ColorModel colorModel) { mCanvasMatrix = canvasMatrix; mLocalMatrix = localMatrix; mColorModel = colorModel; @@ -154,13 +157,13 @@ public class BitmapShader_Delegate extends Shader_Delegate { } @Override - public java.awt.image.ColorModel getColorModel() { + public ColorModel getColorModel() { return mColorModel; } @Override - public java.awt.image.Raster getRaster(int x, int y, int w, int h) { - java.awt.image.BufferedImage image = new java.awt.image.BufferedImage( + public Raster getRaster(int x, int y, int w, int h) { + BufferedImage image = new BufferedImage( mColorModel, mColorModel.createCompatibleWritableRaster(w, h), mColorModel.isAlphaPremultiplied(), null); diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java index 970b9d042f605..874bc9d9565a4 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java @@ -16,6 +16,7 @@ package android.graphics; +import com.android.annotations.Nullable; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; @@ -82,6 +83,12 @@ public final class Bitmap_Delegate { return sManager.getDelegate(native_bitmap); } + @Nullable + public static Bitmap_Delegate getDelegate(@Nullable Bitmap bitmap) { + // refSkPixelRef is a hack to get the native pointer: see #nativeRefPixelRef() + return bitmap == null ? null : getDelegate(bitmap.refSkPixelRef()); + } + /** * Creates and returns a {@link Bitmap} initialized with the given file content. * @@ -180,18 +187,7 @@ public final class Bitmap_Delegate { return createBitmap(delegate, createFlags, density.getDpiValue()); } - public static int getBufferedImageType(int nativeBitmapConfig) { - switch (Config.nativeToConfig(nativeBitmapConfig)) { - case ALPHA_8: - return BufferedImage.TYPE_INT_ARGB; - case RGB_565: - return BufferedImage.TYPE_INT_ARGB; - case ARGB_4444: - return BufferedImage.TYPE_INT_ARGB; - case ARGB_8888: - return BufferedImage.TYPE_INT_ARGB; - } - + private static int getBufferedImageType() { return BufferedImage.TYPE_INT_ARGB; } @@ -218,10 +214,6 @@ public final class Bitmap_Delegate { return mHasAlpha && mConfig != Config.RGB_565; } - public boolean hasMipMap() { - // TODO: check if more checks are required as in hasAlpha. - return mHasMipMap; - } /** * Update the generationId. * @@ -236,7 +228,7 @@ public final class Bitmap_Delegate { @LayoutlibDelegate /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, int height, int nativeConfig, boolean isMutable) { - int imageType = getBufferedImageType(nativeConfig); + int imageType = getBufferedImageType(); // create the image BufferedImage image = new BufferedImage(width, height, imageType); @@ -264,7 +256,7 @@ public final class Bitmap_Delegate { int width = srcImage.getWidth(); int height = srcImage.getHeight(); - int imageType = getBufferedImageType(nativeConfig); + int imageType = getBufferedImageType(); // create the image BufferedImage image = new BufferedImage(width, height, imageType); @@ -353,22 +345,16 @@ public final class Bitmap_Delegate { /*package*/ static boolean nativeHasAlpha(long nativeBitmap) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); - if (delegate == null) { - return true; - } + return delegate == null || delegate.mHasAlpha; - return delegate.mHasAlpha; } @LayoutlibDelegate /*package*/ static boolean nativeHasMipMap(long nativeBitmap) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); - if (delegate == null) { - return true; - } + return delegate == null || delegate.mHasMipMap; - return delegate.mHasMipMap; } @LayoutlibDelegate @@ -488,11 +474,6 @@ public final class Bitmap_Delegate { Density.DEFAULT_DENSITY /*density*/); } - @LayoutlibDelegate - /*package*/ static void nativePrepareToDraw(long nativeBitmap) { - // nothing to be done here. - } - @LayoutlibDelegate /*package*/ static boolean nativeIsPremultiplied(long nativeBitmap) { // get the delegate from the native int. @@ -579,6 +560,14 @@ public final class Bitmap_Delegate { return Arrays.equals(argb1, argb2); } + // Only used by AssetAtlasService, which we don't care about. + @LayoutlibDelegate + /*package*/ static long nativeRefPixelRef(long nativeBitmap) { + // Hack: This is called by Bitmap.refSkPixelRef() and LayoutLib uses that method to get + // the native pointer from a Bitmap. So, we return nativeBitmap here. + return nativeBitmap; + } + // ---- Private delegate/helper methods ---- private Bitmap_Delegate(BufferedImage image, Config config) { diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java index e1091f0dda8ae..47acc42291015 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java @@ -16,6 +16,7 @@ package android.graphics; +import com.android.annotations.Nullable; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; @@ -114,7 +115,11 @@ public final class Canvas_Delegate { } @LayoutlibDelegate - /*package*/ static long initRaster(long nativeBitmapOrZero) { + /*package*/ static long initRaster(@Nullable Bitmap bitmap) { + long nativeBitmapOrZero = 0; + if (bitmap != null) { + nativeBitmapOrZero = bitmap.refSkPixelRef(); + } if (nativeBitmapOrZero > 0) { // get the Bitmap from the int Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(nativeBitmapOrZero); @@ -132,8 +137,7 @@ public final class Canvas_Delegate { } @LayoutlibDelegate - /*package*/ - static void native_setBitmap(long canvas, long bitmap, boolean copyState) { + /*package*/ static void native_setBitmap(long canvas, Bitmap bitmap) { Canvas_Delegate canvasDelegate = sManager.getDelegate(canvas); Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap); if (canvasDelegate == null || bitmapDelegate==null) { @@ -427,8 +431,7 @@ public final class Canvas_Delegate { canvasDelegate.mDrawFilter = DrawFilter_Delegate.getDelegate(nativeFilter); - if (canvasDelegate.mDrawFilter != null && - canvasDelegate.mDrawFilter.isSupported() == false) { + if (canvasDelegate.mDrawFilter != null && !canvasDelegate.mDrawFilter.isSupported()) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_DRAWFILTER, canvasDelegate.mDrawFilter.getSupportMessage(), null, null /*data*/); } @@ -444,7 +447,7 @@ public final class Canvas_Delegate { } Rectangle rect = canvasDelegate.getSnapshot().getClip().getBounds(); - if (rect != null && rect.isEmpty() == false) { + if (rect != null && !rect.isEmpty()) { bounds.left = rect.x; bounds.top = rect.y; bounds.right = rect.x + rect.width; @@ -720,7 +723,7 @@ public final class Canvas_Delegate { } @LayoutlibDelegate - /*package*/ static void native_drawBitmap(Canvas thisCanvas, long nativeCanvas, long bitmap, + /*package*/ static void native_drawBitmap(Canvas thisCanvas, long nativeCanvas, Bitmap bitmap, float left, float top, long nativePaintOrZero, int canvasDensity, @@ -742,7 +745,7 @@ public final class Canvas_Delegate { } @LayoutlibDelegate - /*package*/ static void native_drawBitmap(Canvas thisCanvas, long nativeCanvas, long bitmap, + /*package*/ static void native_drawBitmap(Canvas thisCanvas, long nativeCanvas, Bitmap bitmap, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, long nativePaintOrZero, int screenDensity, int bitmapDensity) { @@ -783,7 +786,7 @@ public final class Canvas_Delegate { } @LayoutlibDelegate - /*package*/ static void nativeDrawBitmapMatrix(long nCanvas, long nBitmap, + /*package*/ static void nativeDrawBitmapMatrix(long nCanvas, Bitmap bitmap, long nMatrix, long nPaint) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas); @@ -795,7 +798,7 @@ public final class Canvas_Delegate { Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(nPaint); // get the delegate from the native int. - Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(nBitmap); + Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap); if (bitmapDelegate == null) { return; } @@ -824,7 +827,7 @@ public final class Canvas_Delegate { } @LayoutlibDelegate - /*package*/ static void nativeDrawBitmapMesh(long nCanvas, long nBitmap, + /*package*/ static void nativeDrawBitmapMesh(long nCanvas, Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, long nPaint) { // FIXME @@ -1041,8 +1044,7 @@ public final class Canvas_Delegate { } /** - * Restores the {@link GcSnapshot} to saveCount - * @param saveCount the saveCount + * Restores the top {@link GcSnapshot} */ private void restore() { mSnapshot = mSnapshot.restore(); @@ -1105,7 +1107,7 @@ public final class Canvas_Delegate { // before drawing it. if (bitmap.getConfig() == Bitmap.Config.ALPHA_8) { fixAlpha8Bitmap(image); - } else if (bitmap.hasAlpha() == false) { + } else if (!bitmap.hasAlpha()) { // hasAlpha is merely a rendering hint. There can in fact be alpha values // in the bitmap but it should be ignored at drawing time. // There is two ways to do this: @@ -1125,7 +1127,7 @@ public final class Canvas_Delegate { } // if we can't force SRC mode, then create a temp bitmap of TYPE_RGB - if (forceSrcMode[0] == false) { + if (!forceSrcMode[0]) { image = Bitmap_Delegate.createCopy(image, BufferedImage.TYPE_INT_RGB, 0xFF); } } diff --git a/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java index e16dbdacfe8a7..e8d34d0562aac 100644 --- a/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java @@ -90,7 +90,7 @@ public final class NinePatch_Delegate { if (oos != null) { try { oos.close(); - } catch (IOException e) { + } catch (IOException ignored) { } } } @@ -136,7 +136,7 @@ public final class NinePatch_Delegate { if (ois != null) { try { ois.close(); - } catch (IOException e) { + } catch (IOException ignored) { } } } @@ -150,15 +150,12 @@ public final class NinePatch_Delegate { @LayoutlibDelegate /*package*/ static boolean isNinePatchChunk(byte[] chunk) { NinePatchChunk chunkObject = getChunk(chunk); - if (chunkObject != null) { - return true; - } + return chunkObject != null; - return false; } @LayoutlibDelegate - /*package*/ static long validateNinePatchChunk(long bitmap, byte[] chunk) { + /*package*/ static long validateNinePatchChunk(byte[] chunk) { // the default JNI implementation only checks that the byte[] has the same // size as the C struct it represent. Since we cannot do the same check (serialization // will return different size depending on content), we do nothing. @@ -173,7 +170,7 @@ public final class NinePatch_Delegate { } @LayoutlibDelegate - /*package*/ static void nativeDraw(long canvas_instance, RectF loc, long bitmap_instance, + /*package*/ static void nativeDraw(long canvas_instance, RectF loc, Bitmap bitmap_instance, long chunk, long paint_instance_or_null, int destDensity, int srcDensity) { draw(canvas_instance, (int) loc.left, (int) loc.top, (int) loc.right, (int) loc.bottom, @@ -182,7 +179,7 @@ public final class NinePatch_Delegate { } @LayoutlibDelegate - /*package*/ static void nativeDraw(long canvas_instance, Rect loc, long bitmap_instance, + /*package*/ static void nativeDraw(long canvas_instance, Rect loc, Bitmap bitmap_instance, long chunk, long paint_instance_or_null, int destDensity, int srcDensity) { draw(canvas_instance, loc.left, loc.top, loc.right, loc.bottom, @@ -191,7 +188,7 @@ public final class NinePatch_Delegate { } @LayoutlibDelegate - /*package*/ static long nativeGetTransparentRegion(long bitmap, long chunk, Rect location) { + /*package*/ static long nativeGetTransparentRegion(Bitmap bitmap, long chunk, Rect location) { return 0; } @@ -199,7 +196,7 @@ public final class NinePatch_Delegate { private static void draw(long canvas_instance, final int left, final int top, final int right, final int bottom, - long bitmap_instance, long chunk, long paint_instance_or_null, + Bitmap bitmap_instance, long chunk, long paint_instance_or_null, final int destDensity, final int srcDensity) { // get the delegate from the native int. final Bitmap_Delegate bitmap_delegate = Bitmap_Delegate.getDelegate(bitmap_instance); diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java index 0c8c0d6a18270..a2e9a85ecf0b1 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java @@ -16,6 +16,8 @@ package android.graphics; +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; @@ -83,6 +85,8 @@ public class Paint_Delegate { private float mTextScaleX; private float mTextSkewX; private int mHintingMode = Paint.HINTING_ON; + private int mHyphenEdit; + private float mLetterSpacing; // not used in actual text rendering. // Variant of the font. A paint's variant can only be compact or elegant. private FontVariant mFontVariant = FontVariant.COMPACT; @@ -100,6 +104,7 @@ public class Paint_Delegate { // ---- Public Helper methods ---- + @Nullable public static Paint_Delegate getDelegate(long native_paint) { return sManager.getDelegate(native_paint); } @@ -1088,18 +1093,107 @@ public class Paint_Delegate { @LayoutlibDelegate /*package*/ static float native_getLetterSpacing(long nativePaint) { - // TODO: throw a fidelity warning. - return 0; + Paint_Delegate delegate = sManager.getDelegate(nativePaint); + if (delegate == null) { + return 0; + } + return delegate.mLetterSpacing; } @LayoutlibDelegate /*package*/ static void native_setLetterSpacing(long nativePaint, float letterSpacing) { - // pass. + Bridge.getLog().fidelityWarning("textRendering", "Paint.setLetterSpacing() not supported.", + null, null); + Paint_Delegate delegate = sManager.getDelegate(nativePaint); + if (delegate == null) { + return; + } + delegate.mLetterSpacing = letterSpacing; } @LayoutlibDelegate /*package*/ static void native_setFontFeatureSettings(long nativePaint, String settings) { - // pass. + Bridge.getLog().fidelityWarning("textRendering", + "Paint.setFontFeatureSettings() not supported.", null, null); + } + + @LayoutlibDelegate + /*package*/ static int native_getHyphenEdit(long nativePaint) { + Paint_Delegate delegate = sManager.getDelegate(nativePaint); + if (delegate == null) { + return 0; + } + return delegate.mHyphenEdit; + } + + @LayoutlibDelegate + /*package*/ static void native_setHyphenEdit(long nativePaint, int hyphen) { + Paint_Delegate delegate = sManager.getDelegate(nativePaint); + if (delegate == null) { + return; + } + delegate.mHyphenEdit = hyphen; + } + + @LayoutlibDelegate + /*package*/ static boolean native_hasGlyph(long nativePaint, long nativeTypeface, int bidiFlags, + String string) { + Paint_Delegate delegate = sManager.getDelegate(nativePaint); + if (delegate == null) { + return false; + } + if (string.length() == 0) { + return false; + } + if (string.length() > 1) { + Bridge.getLog().fidelityWarning("textRendering", + "Paint.hasGlyph() is not supported for ligatures.", null, null); + return false; + } + assert nativeTypeface == delegate.mNativeTypeface; + Typeface_Delegate typeface_delegate = Typeface_Delegate.getDelegate(nativeTypeface); + + char c = string.charAt(0); + for (Font font : typeface_delegate.getFonts(delegate.mFontVariant)) { + if (font.canDisplay(c)) { + return true; + } + } + return false; + } + + + @LayoutlibDelegate + /*package*/ static float native_getRunAdvance(long nativePaint, long nativeTypeface, + @NonNull char[] text, int start, int end, int contextStart, int contextEnd, + boolean isRtl, int offset) { + int count = end - start; + float[] advances = new float[count]; + native_getTextRunAdvances(nativePaint, nativeTypeface, text, start, count, + contextStart, contextEnd - contextStart, isRtl, advances, 0); + float sum = 0; + for (int i = 0; i < offset; i++) { + sum += advances[i]; + } + return sum; + } + + @LayoutlibDelegate + /*package*/ static int native_getOffsetForAdvance(long nativePaint, long nativeTypeface, + char[] text, int start, int end, int contextStart, int contextEnd, boolean isRtl, + float advance) { + int count = end - start; + float[] advances = new float[count]; + native_getTextRunAdvances(nativePaint, nativeTypeface, text, start, count, + contextStart, contextEnd - contextStart, isRtl, advances, 0); + float sum = 0; + int i; + for (i = 0; i < count && sum < advance; i++) { + sum += advances[i]; + } + float distanceToI = sum - advance; + float distanceToIMinus1 = advance - (sum - advances[i]); + return distanceToI > distanceToIMinus1 ? i : i - 1; } // ---- 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 14e9960f82857..0d491a02721f4 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java @@ -81,14 +81,15 @@ public abstract class Shader_Delegate { } @LayoutlibDelegate - /*package*/ static void nativeSetLocalMatrix(long native_shader, long matrix_instance) { + /*package*/ static long nativeSetLocalMatrix(long native_shader, long matrix_instance) { // get the delegate from the native int. Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader); if (shaderDelegate == null) { - return; + return native_shader; } shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance); + return native_shader; } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java b/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java index 6247dae3a7d33..38171dc067955 100644 --- a/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java +++ b/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java @@ -19,8 +19,8 @@ package android.text; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; -import com.ibm.icu.text.Bidi; +import android.icu.text.Bidi; /** * Delegate used to provide new implementation for the native methods of {@link AndroidBidi} diff --git a/tools/layoutlib/bridge/src/android/text/GreedyLineBreaker.java b/tools/layoutlib/bridge/src/android/text/GreedyLineBreaker.java index c72efc20b83ce..b95cda67c4871 100644 --- a/tools/layoutlib/bridge/src/android/text/GreedyLineBreaker.java +++ b/tools/layoutlib/bridge/src/android/text/GreedyLineBreaker.java @@ -36,7 +36,7 @@ public class GreedyLineBreaker extends LineBreaker { } @Override - public void computeBreaks(LineBreaks lineBreaks) { + public void computeBreaks(@NonNull LineBreaks lineBreaks) { BreakInfo breakInfo = new BreakInfo(); int lineNum = 0; float width = 0, printedWidth = 0; diff --git a/tools/layoutlib/bridge/src/android/text/Hyphenator_Delegate.java b/tools/layoutlib/bridge/src/android/text/Hyphenator_Delegate.java new file mode 100644 index 0000000000000..5a595970e195d --- /dev/null +++ b/tools/layoutlib/bridge/src/android/text/Hyphenator_Delegate.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2015 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.text; + +import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + +import java.io.File; + +/** + * Delegate that overrides implementation for certain methods in {@link android.text.StaticLayout} + *

+ * Through the layoutlib_create tool, selected methods of StaticLayout have been replaced + * by calls to methods of the same name in this delegate class. + */ +public class Hyphenator_Delegate { + + private static final DelegateManager sDelegateManager = new + DelegateManager(Hyphenator_Delegate.class); + + @LayoutlibDelegate + /*package*/ static File getSystemHyphenatorLocation() { + // FIXME + return null; + } + + /*package*/ static long loadHyphenator(String patternData) { + return sDelegateManager.addNewDelegate(new Hyphenator_Delegate()); + } +} diff --git a/tools/layoutlib/bridge/src/android/text/LineBreaker.java b/tools/layoutlib/bridge/src/android/text/LineBreaker.java index 54445a423a652..edeef789b6f12 100644 --- a/tools/layoutlib/bridge/src/android/text/LineBreaker.java +++ b/tools/layoutlib/bridge/src/android/text/LineBreaker.java @@ -39,6 +39,5 @@ public abstract class LineBreaker { mTabStops = tabStops; } - @NonNull public abstract void computeBreaks(@NonNull LineBreaks breakInfo); } diff --git a/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java b/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java index 86d8da369d36d..7971902021d7b 100644 --- a/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java +++ b/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java @@ -8,15 +8,15 @@ import android.graphics.BidiRenderer; import android.graphics.Paint; import android.graphics.Paint_Delegate; import android.graphics.RectF; -import android.text.StaticLayout.LineBreaks; +import android.icu.text.BreakIterator; +import android.icu.util.ULocale; import android.text.Primitive.PrimitiveType; +import android.text.StaticLayout.LineBreaks; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import com.ibm.icu.text.BreakIterator; -import com.ibm.icu.util.ULocale; import javax.swing.text.Segment; /** @@ -38,15 +38,55 @@ public class StaticLayout_Delegate { new DelegateManager(Builder.class); @LayoutlibDelegate - /*package*/ static int nComputeLineBreaks(long nativeBuilder, - int length, float firstWidth, int firstWidthLineCount, float restWidth, - int[] variableTabStops, int defaultTabStop, boolean optimize, LineBreaks recycle, - int[] recycleBreaks, float[] recycleWidths, boolean[] recycleFlags, int recycleLength) { + /*package*/ static long nNewBuilder() { + return sBuilderManager.addNewDelegate(new Builder()); + } + @LayoutlibDelegate + /*package*/ static void nFreeBuilder(long nativeBuilder) { + sBuilderManager.removeJavaReferenceFor(nativeBuilder); + } + + @LayoutlibDelegate + /*package*/ static void nFinishBuilder(long nativeBuilder) { + } + + @LayoutlibDelegate + /*package*/ static long nLoadHyphenator(String patternData) { + return Hyphenator_Delegate.loadHyphenator(patternData); + } + + @LayoutlibDelegate + /*package*/ static void nSetLocale(long nativeBuilder, String locale, long nativeHyphenator) { Builder builder = sBuilderManager.getDelegate(nativeBuilder); + if (builder != null) { + builder.mLocale = locale; + builder.mNativeHyphenator = nativeHyphenator; + } + } + + @LayoutlibDelegate + /*package*/ static void nSetIndents(long nativeBuilder, int[] indents) { + // TODO. + } + + @LayoutlibDelegate + /*package*/ static void nSetupParagraph(long nativeBuilder, char[] text, int length, + float firstWidth, int firstWidthLineCount, float restWidth, + int[] variableTabStops, int defaultTabStop, int breakStrategy, + int hyphenationFrequency) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + if (builder == null) { + return; + } + + builder.mText = text; + builder.mWidths = new float[length]; + // compute all possible breakpoints. BreakIterator it = BreakIterator.getLineInstance(new ULocale(builder.mLocale)); it.setText(new Segment(builder.mText, 0, length)); + // average word length in english is 5. So, initialize the possible breaks with a guess. List breaks = new ArrayList((int) Math.ceil(length / 5d)); int loc; @@ -54,17 +94,73 @@ public class StaticLayout_Delegate { while ((loc = it.next()) != BreakIterator.DONE) { breaks.add(loc); } - LineWidth lineWidth = new LineWidth(firstWidth, firstWidthLineCount, restWidth); TabStops tabStopCalculator = new TabStops(variableTabStops, defaultTabStop); - List primitives = computePrimitives(builder.mText, builder.mWidths, length, breaks); - LineBreaker lineBreaker; - if (optimize) { - lineBreaker = new OptimizingLineBreaker(primitives, lineWidth, tabStopCalculator); - } else { - lineBreaker = new GreedyLineBreaker(primitives, lineWidth, tabStopCalculator); + List primitives = + computePrimitives(builder.mText, builder.mWidths, length, breaks); + BreakStrategy strategy = BreakStrategy.getStrategy(breakStrategy); + switch (strategy) { + case GREEDY: + builder.mLineBreaker = + new GreedyLineBreaker(primitives, lineWidth, tabStopCalculator); + break; + case HIGH_QUALITY: + // TODO + break; + case BALANCED: + builder.mLineBreaker = new OptimizingLineBreaker(primitives, lineWidth, + tabStopCalculator); + break; } - lineBreaker.computeBreaks(recycle); + } + + @LayoutlibDelegate + /*package*/ static float nAddStyleRun(long nativeBuilder, long nativePaint, long nativeTypeface, + int start, int end, boolean isRtl) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + + int bidiFlags = isRtl ? Paint.BIDI_FORCE_RTL : Paint.BIDI_FORCE_LTR; + return builder == null ? 0 : + measureText(nativePaint, builder.mText, start, end - start, builder.mWidths, + bidiFlags); + } + + @LayoutlibDelegate + /*package*/ static void nAddMeasuredRun(long nativeBuilder, int start, int end, float[] widths) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + if (builder != null) { + System.arraycopy(widths, start, builder.mWidths, start, end - start); + } + } + + @LayoutlibDelegate + /*package*/ static void nAddReplacementRun(long nativeBuilder, int start, int end, float width) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + if (builder == null) { + return; + } + builder.mWidths[start] = width; + Arrays.fill(builder.mWidths, start + 1, end, 0.0f); + } + + @LayoutlibDelegate + /*package*/ static void nGetWidths(long nativeBuilder, float[] floatsArray) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + if (builder != null) { + System.arraycopy(builder.mWidths, 0, floatsArray, 0, builder.mWidths.length); + } + } + + @LayoutlibDelegate + /*package*/ static int nComputeLineBreaks(long nativeBuilder, + LineBreaks recycle, int[] recycleBreaks, float[] recycleWidths, + int[] recycleFlags, int recycleLength) { + + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + if (builder == null) { + return 0; + } + builder.mLineBreaker.computeBreaks(recycle); return recycle.breaks.length; } @@ -109,63 +205,6 @@ public class StaticLayout_Delegate { return primitives; } - @LayoutlibDelegate - /*package*/ static long nNewBuilder() { - return sBuilderManager.addNewDelegate(new Builder()); - } - - @LayoutlibDelegate - /*package*/ static void nFinishBuilder(long nativeBuilder) { - } - - @LayoutlibDelegate - /*package*/ static void nFreeBuilder(long nativeBuilder) { - sBuilderManager.removeJavaReferenceFor(nativeBuilder); - } - - @LayoutlibDelegate - /*package*/ static void nSetLocale(long nativeBuilder, String locale) { - Builder builder = sBuilderManager.getDelegate(nativeBuilder); - builder.mLocale = locale; - } - - @LayoutlibDelegate - /*package*/ static void nSetText(long nativeBuilder, char[] text, int length) { - Builder builder = sBuilderManager.getDelegate(nativeBuilder); - builder.mText = text; - builder.mWidths = new float[length]; - } - - - @LayoutlibDelegate - /*package*/ static float nAddStyleRun(long nativeBuilder, long nativePaint, long nativeTypeface, - int start, int end, boolean isRtl) { - Builder builder = sBuilderManager.getDelegate(nativeBuilder); - - int bidiFlags = isRtl ? Paint.BIDI_FORCE_RTL : Paint.BIDI_FORCE_LTR; - return measureText(nativePaint, builder.mText, start, end - start, builder.mWidths, bidiFlags); - } - - - @LayoutlibDelegate - /*package*/ static void nAddMeasuredRun(long nativeBuilder, int start, int end, float[] widths) { - Builder builder = sBuilderManager.getDelegate(nativeBuilder); - System.arraycopy(widths, start, builder.mWidths, start, end - start); - } - - @LayoutlibDelegate - /*package*/ static void nAddReplacementRun(long nativeBuilder, int start, int end, float width) { - Builder builder = sBuilderManager.getDelegate(nativeBuilder); - builder.mWidths[start] = width; - Arrays.fill(builder.mWidths, start + 1, end, 0.0f); - } - - @LayoutlibDelegate - /*package*/ static void nGetWidths(long nativeBuilder, float[] floatsArray) { - Builder builder = sBuilderManager.getDelegate(nativeBuilder); - System.arraycopy(builder.mWidths, 0, floatsArray, 0, builder.mWidths.length); - } - private static float measureText(long nativePaint, char []text, int index, int count, float[] widths, int bidiFlags) { Paint_Delegate paint = Paint_Delegate.getDelegate(nativePaint); @@ -174,12 +213,32 @@ public class StaticLayout_Delegate { return bounds.right - bounds.left; } + // TODO: Rename to LineBreakerRef and move everything other than LineBreaker to LineBreaker. /** * Java representation of the native Builder class. */ - static class Builder { + private static class Builder { String mLocale; char[] mText; float[] mWidths; + LineBreaker mLineBreaker; + long mNativeHyphenator; + } + + private enum BreakStrategy { + GREEDY, HIGH_QUALITY, BALANCED; + + static BreakStrategy getStrategy(int strategy) { + switch (strategy) { + case 0: + return GREEDY; + case 1: + return HIGH_QUALITY; + case 2: + return BALANCED; + default: + throw new AssertionError("Unknown break strategy: " + strategy); + } + } } } 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 c6d60f8a76f6e..af67a4302c4f1 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java @@ -16,9 +16,6 @@ package com.android.layoutlib.bridge; -import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN; -import static com.android.ide.common.rendering.api.Result.Status.SUCCESS; - import com.android.annotations.NonNull; import com.android.ide.common.rendering.api.Capability; import com.android.ide.common.rendering.api.DrawableParams; @@ -36,13 +33,12 @@ import com.android.resources.ResourceType; import com.android.tools.layoutlib.create.MethodAdapter; import com.android.tools.layoutlib.create.OverrideMethod; import com.android.util.Pair; -import com.ibm.icu.util.ULocale; -import libcore.io.MemoryMappedFile_Delegate; import android.content.res.BridgeAssetManager; import android.graphics.Bitmap; import android.graphics.FontFamily_Delegate; import android.graphics.Typeface_Delegate; +import android.icu.util.ULocale; import android.os.Looper; import android.os.Looper_Accessor; import android.view.View; @@ -60,6 +56,11 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReentrantLock; +import libcore.io.MemoryMappedFile_Delegate; + +import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN; +import static com.android.ide.common.rendering.api.Result.Status.SUCCESS; + /** * Main entry point of the LayoutLib Bridge. *

To use this bridge, simply instantiate an object of type {@link Bridge} and call diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/AndroidLocale.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/AndroidLocale.java index ea5f1eabe5525..e589d9e70b8a1 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/AndroidLocale.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/AndroidLocale.java @@ -16,9 +16,9 @@ package com.android.layoutlib.bridge.android; -import java.util.Locale; +import android.icu.util.ULocale; -import com.ibm.icu.util.ULocale; +import java.util.Locale; /** * This class provides an alternate implementation for {@code java.util.Locale#toLanguageTag} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java index 261cc98030ec0..dbee9ea54e47f 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java @@ -16,6 +16,7 @@ package com.android.layoutlib.bridge.impl; +import com.android.annotations.Nullable; import com.android.layoutlib.bridge.util.Debug; import com.android.layoutlib.bridge.util.SparseWeakArray; @@ -48,7 +49,7 @@ import java.util.List; * int -> Delegate class link. * * Native methods usually always have the int as parameters. The first thing the delegate method - * will do is call {@link #getDelegate(int)} to get the Java object matching the int. + * will do is call {@link #getDelegate(long)} to get the Java object matching the int. * * Typical native init methods are returning a new int back to the Java class, so * {@link #addNewDelegate(Object)} does the same. @@ -57,7 +58,7 @@ import java.util.List; * the Java object needs to count as a reference (even though it only holds an int), we use the * following mechanism: * - * - {@link #addNewDelegate(Object)} and {@link #removeJavaReferenceFor(int)} adds and removes + * - {@link #addNewDelegate(Object)} and {@link #removeJavaReferenceFor(long)} adds and removes * the delegate to/from a list. This list hold the reference and prevents the GC from reclaiming * the delegate. * @@ -70,12 +71,13 @@ import java.util.List; * @param the delegate class to manage */ public final class DelegateManager { + @SuppressWarnings("FieldCanBeLocal") private final Class mClass; private final SparseWeakArray mDelegates = new SparseWeakArray(); /** list used to store delegates when their main object holds a reference to them. * This is to ensure that the WeakReference in the SparseWeakArray doesn't get GC'ed * @see #addNewDelegate(Object) - * @see #removeJavaReferenceFor(int) + * @see #removeJavaReferenceFor(long) */ private final List mJavaReferences = new ArrayList(); private int mDelegateCounter = 0; @@ -94,6 +96,7 @@ public final class DelegateManager { * @param native_object the native int. * @return the delegate or null if not found. */ + @Nullable public T getDelegate(long native_object) { if (native_object > 0) { T delegate = mDelegates.get(native_object); diff --git a/tools/layoutlib/bridge/src/libcore/icu/DateIntervalFormat_Delegate.java b/tools/layoutlib/bridge/src/libcore/icu/DateIntervalFormat_Delegate.java deleted file mode 100644 index d94c205df5f54..0000000000000 --- a/tools/layoutlib/bridge/src/libcore/icu/DateIntervalFormat_Delegate.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2013 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 java.text.FieldPosition; - -import com.android.ide.common.rendering.api.LayoutLog; -import com.android.layoutlib.bridge.Bridge; -import com.android.layoutlib.bridge.impl.DelegateManager; -import com.android.tools.layoutlib.annotations.LayoutlibDelegate; -import com.ibm.icu.text.DateIntervalFormat; -import com.ibm.icu.util.DateInterval; -import com.ibm.icu.util.TimeZone; -import com.ibm.icu.util.ULocale; - -public class DateIntervalFormat_Delegate { - - // ---- delegate manager ---- - private static final DelegateManager sManager = - new DelegateManager(DateIntervalFormat_Delegate.class); - - // ---- delegate data ---- - private DateIntervalFormat mFormat; - - - // ---- native methods ---- - - @LayoutlibDelegate - /*package*/static String formatDateInterval(long address, long fromDate, long toDate) { - DateIntervalFormat_Delegate delegate = sManager.getDelegate((int)address); - if (delegate == null) { - Bridge.getLog().error(LayoutLog.TAG_BROKEN, - "Unable for find native DateIntervalFormat", null); - return null; - } - DateInterval interval = new DateInterval(fromDate, toDate); - StringBuffer sb = new StringBuffer(); - FieldPosition pos = new FieldPosition(0); - delegate.mFormat.format(interval, sb, pos); - return sb.toString(); - } - - @LayoutlibDelegate - /*package*/ static long createDateIntervalFormat(String skeleton, String localeName, - String tzName) { - TimeZone prevDefaultTz = TimeZone.getDefault(); - TimeZone.setDefault(TimeZone.getTimeZone(tzName)); - DateIntervalFormat_Delegate newDelegate = new DateIntervalFormat_Delegate(); - newDelegate.mFormat = - DateIntervalFormat.getInstance(skeleton, new ULocale(localeName)); - TimeZone.setDefault(prevDefaultTz); - return sManager.addNewDelegate(newDelegate); - } - - @LayoutlibDelegate - /*package*/ static void destroyDateIntervalFormat(long address) { - sManager.removeJavaReferenceFor((int)address); - } - -} diff --git a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java index b8b5fed77e762..a6cbe56b59f88 100644 --- a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java +++ b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java @@ -17,9 +17,10 @@ package libcore.icu; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; -import com.ibm.icu.text.DateTimePatternGenerator; -import com.ibm.icu.util.Currency; -import com.ibm.icu.util.ULocale; + +import android.icu.text.DateTimePatternGenerator; +import android.icu.util.Currency; +import android.icu.util.ULocale; import java.util.Locale; @@ -252,4 +253,9 @@ public class ICU_Delegate { /*package*/ static String getDefaultLocale() { return ICU.getDefaultLocale(); } + + @LayoutlibDelegate + /*package*/ static String getTZDataVersion() { + return ICU.getTZDataVersion(); + } } diff --git a/tools/layoutlib/bridge/tests/Android.mk b/tools/layoutlib/bridge/tests/Android.mk index 11390c346e1ea..5eef24adbdefc 100644 --- a/tools/layoutlib/bridge/tests/Android.mk +++ b/tools/layoutlib/bridge/tests/Android.mk @@ -26,7 +26,6 @@ LOCAL_MODULE_TAGS := optional LOCAL_JAVA_LIBRARIES := layoutlib \ kxml2-2.3.0 \ - icu4j \ layoutlib_api-prebuilt \ tools-common-prebuilt \ sdk-common \ diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png index c9b76bed16bf26099ad73c822d45602284e6853c..cb725502657bd9b9495d51616bf9d098506f85b1 100644 GIT binary patch literal 10472 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%0AoCb;Bju|q8BfSgiw(qd0K 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 C5;ODw literal 11038 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 T;f@2Pdj(V#Uno?{K|}uwp8_Z@ diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/TestDelegates.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/TestDelegates.java index 8b362ec621a3d..d8937f49e3601 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/TestDelegates.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/TestDelegates.java @@ -192,12 +192,12 @@ public class TestDelegates extends TestCase { StringBuilder sb = new StringBuilder(method.getName() + "("); for (int j = 0; j < parameters.length; j++) { Class theClass = parameters[j]; - sb.append(theClass.getName()); int dimensions = 0; while (theClass.isArray()) { dimensions++; theClass = theClass.getComponentType(); } + sb.append(theClass.getName()); for (int i = 0; i < dimensions; i++) { sb.append("[]"); } diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParserTest.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParserTest.java index d87c99f9feea3..509f5eb5d4826 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParserTest.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParserTest.java @@ -40,7 +40,7 @@ import static org.junit.Assert.assertEquals; public class BridgeXmlBlockParserTest { @BeforeClass - public void setUp() { + public static void setUp() { ParserFactory.setLayoutlibCallback(new LayoutlibTestCallback()); } @@ -128,7 +128,7 @@ public class BridgeXmlBlockParserTest { } @AfterClass - public void tearDown() { + public static void tearDown() { ParserFactory.setLayoutlibCallback(null); } diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java index bd467ef2df296..91be0bd1ff8cf 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java @@ -17,6 +17,7 @@ package com.android.layoutlib.bridge.intensive; import com.android.annotations.NonNull; +import com.android.annotations.Nullable; import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.RenderSession; import com.android.ide.common.rendering.api.Result; @@ -364,13 +365,14 @@ public class Main { } @Override - public void fidelityWarning(String tag, String message, Throwable throwable, - Object data) { + public void fidelityWarning(@Nullable String tag, String message, + Throwable throwable, Object data) { + System.out.println("FidelityWarning " + tag + ": " + message); if (throwable != null) { throwable.printStackTrace(); } - failWithMsg(message); + failWithMsg(message == null ? "" : message); } @Override @@ -396,11 +398,11 @@ public class Main { if (sLogger == null) { sLogger = new ILogger() { @Override - public void error(Throwable t, String msgFormat, Object... args) { + public void error(Throwable t, @Nullable String msgFormat, Object... args) { if (t != null) { t.printStackTrace(); } - failWithMsg(msgFormat, args); + failWithMsg(msgFormat == null ? "" : msgFormat, args); } @Override diff --git a/tools/layoutlib/create/create.iml b/tools/layoutlib/create/create.iml index b7e8eb3cd5039..9b18e73aae90d 100644 --- a/tools/layoutlib/create/create.iml +++ b/tools/layoutlib/create/create.iml @@ -11,8 +11,17 @@ - + + + + + + + + + + + - - + \ No newline at end of file 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 f5e8292c23819..245cd6126998f 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 @@ -156,6 +156,7 @@ public final class CreateInfo implements ICreateInfo { "android.os.HandlerThread#run", "android.preference.Preference#getView", "android.text.format.DateFormat#is24HourFormat", + "android.text.Hyphenator#getSystemHyphenatorLocation", "android.util.Xml#newPullParser", "android.view.Choreographer#getRefreshRate", "android.view.Display#updateDisplayInfoLocked", @@ -231,7 +232,6 @@ public final class CreateInfo implements ICreateInfo { "android.text.AndroidBidi", "android.text.StaticLayout", "android.view.Display", - "libcore.icu.DateIntervalFormat", "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 fa570c89b0bec..7ca050b1d423b 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 @@ -118,6 +118,7 @@ public class Main { "android.app.DatePickerDialog", // b.android.com/28318 "android.app.TimePickerDialog", // b.android.com/61515 "com.android.internal.view.menu.ActionMenu", + "android.icu.**", // needed by LayoutLib }, excludeClasses, new String[] {