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
This commit is contained in:
Deepanshu Gupta
2015-05-12 12:01:16 -07:00
parent a12ec8f1e2
commit d77b9ed7dc
36 changed files with 491 additions and 376 deletions

View File

@@ -1,11 +0,0 @@
<component name="libraryTable">
<library name="asm-4.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/misc/common/asm/asm-4.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/misc/common/asm/src.zip!/" />
</SOURCES>
</library>
</component>

View File

@@ -1,13 +0,0 @@
<component name="libraryTable">
<library name="framework.jar">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/../../core/java" />
<root url="file://$PROJECT_DIR$/../../graphics/java" />
<root url="file://$PROJECT_DIR$/../../../../libcore/luni/src/main/java" />
</SOURCES>
</library>
</component>

View File

@@ -1,11 +0,0 @@
<component name="libraryTable">
<library name="guava">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/tools/common/m2/repository/com/google/guava/guava/15.0/guava-15.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/tools/common/m2/repository/com/google/guava/guava/15.0/guava-15.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@@ -1,11 +0,0 @@
<component name="libraryTable">
<library name="icu4j">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/misc/common/icu4j/icu4j.jar!/" />
</CLASSES>
<JAVADOC>
<root url="http://icu-project.org/apiref/icu4j50rc/" />
</JAVADOC>
<SOURCES />
</library>
</component>

View File

@@ -1,11 +0,0 @@
<component name="libraryTable">
<library name="kxml2-2.3.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/misc/common/kxml2/kxml2-2.3.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/../../../../libcore/xml/src/main/java" />
</SOURCES>
</library>
</component>

View File

@@ -1,11 +0,0 @@
<component name="libraryTable">
<library name="layoutlib_api-prebuilt">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/misc/common/layoutlib_api/layoutlib_api-prebuilt.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/misc/common/layoutlib_api/layoutlib_api-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@@ -1,11 +0,0 @@
<component name="libraryTable">
<library name="ninepatch-prebuilt">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/misc/common/ninepatch/ninepatch-prebuilt.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$ANDROID_SRC$/tools/base/ninepatch/src/main/java" />
</SOURCES>
</library>
</component>

View File

@@ -1,14 +0,0 @@
<component name="libraryTable">
<library name="tools-common-prebuilt">
<ANNOTATIONS>
<root url="file://$PROJECT_DIR$" />
</ANNOTATIONS>
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../prebuilts/misc/common/tools-common/tools-common-prebuilt.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$ANDROID_SRC$/tools/base/common/src/main/java" />
</SOURCES>
</library>
</component>

View File

@@ -22,7 +22,6 @@ LOCAL_JAVACFLAGS := -source 6 -target 6
LOCAL_JAVA_LIBRARIES := \
icu4j \
layoutlib_api-prebuilt \
tools-common-prebuilt

View File

@@ -24,15 +24,79 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="icu4j" level="project" />
<orderEntry type="library" name="layoutlib_api-prebuilt" level="project" />
<orderEntry type="library" name="ninepatch-prebuilt" level="project" />
<orderEntry type="library" name="tools-common-prebuilt" level="project" />
<orderEntry type="library" name="framework.jar" level="project" />
<orderEntry type="library" scope="TEST" name="kxml2-2.3.0" level="project" />
<orderEntry type="library" scope="TEST" name="guava" level="project" />
<orderEntry type="module-library">
<library name="layoutlib_api-prebuilt">
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/layoutlib_api/layoutlib_api-prebuilt.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/layoutlib_api/layoutlib_api-sources.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="ninepatch-prebuilt">
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/ninepatch/ninepatch-prebuilt.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$ANDROID_SRC$/tools/base/ninepatch/src/main/java" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="tools-common-prebuilt">
<ANNOTATIONS>
<root url="file://$MODULE_DIR$/.." />
</ANNOTATIONS>
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/tools-common/tools-common-prebuilt.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$ANDROID_SRC$/tools/base/common/src/main/java" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="framework.jar">
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../../out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$MODULE_DIR$/../../../core/java" />
<root url="file://$MODULE_DIR$/../../../graphics/java" />
<root url="file://$MODULE_DIR$/../../../../../libcore/luni/src/main/java" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library>
<library name="kxml2-2.3.0">
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/kxml2/kxml2-2.3.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$MODULE_DIR$/../../../../../libcore/xml/src/main/java" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="guava">
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/tools/common/m2/repository/com/google/guava/guava/15.0/guava-15.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/tools/common/m2/repository/com/google/guava/guava/15.0/guava-15.0-sources.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library" scope="TEST">
<library name="sdk-common">
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/sdk-common/sdk-common.jar!/" />
</CLASSES>

View File

@@ -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 <var>index</var>.
*

View File

@@ -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.

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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 <var>saveCount</var>
* @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);
}
}

View File

@@ -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);

View File

@@ -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 ----

View File

@@ -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 ----

View File

@@ -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}

View File

@@ -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;

View File

@@ -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}
* <p/>
* 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<Hyphenator_Delegate> sDelegateManager = new
DelegateManager<Hyphenator_Delegate>(Hyphenator_Delegate.class);
@LayoutlibDelegate
/*package*/ static File getSystemHyphenatorLocation() {
// FIXME
return null;
}
/*package*/ static long loadHyphenator(String patternData) {
return sDelegateManager.addNewDelegate(new Hyphenator_Delegate());
}
}

View File

@@ -39,6 +39,5 @@ public abstract class LineBreaker {
mTabStops = tabStops;
}
@NonNull
public abstract void computeBreaks(@NonNull LineBreaks breakInfo);
}

View File

@@ -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>(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<Integer> breaks = new ArrayList<Integer>((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<Primitive> 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<Primitive> 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);
}
}
}
}

View File

@@ -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.
* <p/>To use this bridge, simply instantiate an object of type {@link Bridge} and call

View File

@@ -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}

View File

@@ -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 <T> the delegate class to manage
*/
public final class DelegateManager<T> {
@SuppressWarnings("FieldCanBeLocal")
private final Class<T> mClass;
private final SparseWeakArray<T> mDelegates = new SparseWeakArray<T>();
/** 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<T> mJavaReferences = new ArrayList<T>();
private int mDelegateCounter = 0;
@@ -94,6 +96,7 @@ public final class DelegateManager<T> {
* @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);

View File

@@ -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<DateIntervalFormat_Delegate> sManager =
new DelegateManager<DateIntervalFormat_Delegate>(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);
}
}

View File

@@ -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();
}
}

View File

@@ -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 \

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -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("[]");
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -11,8 +11,17 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="asm-4.0" level="project" />
<orderEntry type="module-library">
<library name="asm-4.0">
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/asm/asm-4.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$MODULE_DIR$/../../../../../prebuilts/misc/common/asm/src.zip!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="library" scope="TEST" name="JUnit4" level="application" />
</component>
</module>
</module>

View File

@@ -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",
};

View File

@@ -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[] {