Add missing native methods.
Change-Id: I7b34e2ec0164520efc658053a80f307791a992b1
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
index b76b8cf..96616aa 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
@@ -61,6 +61,7 @@
private final Config mConfig;
private BufferedImage mImage;
private boolean mHasAlpha = true;
+ private boolean mHasMipMap = false; // TODO: check the default.
private int mGenerationId = 0;
@@ -185,6 +186,10 @@
return mHasAlpha && mConfig != Config.RGB_565;
}
+ public boolean hasMipMap() {
+ // TODO: check if more checks are required as in hasAlpha.
+ return mHasMipMap;
+ }
/**
* Update the generationId.
*
@@ -336,6 +341,17 @@
}
@LayoutlibDelegate
+ /*package*/ static boolean nativeHasMipMap(int nativeBitmap) {
+ // get the delegate from the native int.
+ Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
+ if (delegate == null) {
+ return true;
+ }
+
+ return delegate.mHasMipMap;
+ }
+
+ @LayoutlibDelegate
/*package*/ static int nativeGetPixel(int nativeBitmap, int x, int y) {
// get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -469,6 +485,17 @@
}
@LayoutlibDelegate
+ /*package*/ static void nativeSetHasMipMap(int nativeBitmap, boolean hasMipMap) {
+ // get the delegate from the native int.
+ Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
+ if (delegate == null) {
+ return;
+ }
+
+ delegate.mHasMipMap = hasMipMap;
+ }
+
+ @LayoutlibDelegate
/*package*/ static boolean nativeSameAs(int nb0, int nb1) {
Bitmap_Delegate delegate1 = sManager.getDelegate(nb0);
if (delegate1 == null) {
@@ -524,7 +551,7 @@
int nativeInt = sManager.addNewDelegate(delegate);
// and create/return a new Bitmap with it
- return new Bitmap(nativeInt, null /* buffer */, isMutable, null /*ninePatchChunk*/,
+ return new Bitmap(nativeInt, null /* buffer */, isMutable, null /*ninePatchChunk*/,
density);
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
index 9aed8c8..4171bb5 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
@@ -330,20 +330,19 @@
}
@LayoutlibDelegate
- /*package*/ static void native_setBitmap(int nativeCanvas, int bitmap) {
+ /*package*/ static void copyNativeCanvasState(int srcCanvas, int dstCanvas) {
// get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
+ Canvas_Delegate srcCanvasDelegate = sManager.getDelegate(srcCanvas);
+ if (srcCanvasDelegate == null) {
return;
}
// get the delegate from the native int.
- Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
- if (bitmapDelegate == null) {
+ Canvas_Delegate dstCanvasDelegate = sManager.getDelegate(dstCanvas);
+ if (dstCanvasDelegate == null) {
return;
}
-
- canvasDelegate.setBitmap(bitmapDelegate);
+ // TODO: actually copy the canvas state.
}
@LayoutlibDelegate
@@ -572,16 +571,14 @@
@LayoutlibDelegate
/*package*/ static boolean native_quickReject(int nativeCanvas,
- RectF rect,
- int native_edgeType) {
+ RectF rect) {
// FIXME properly implement quickReject
return false;
}
@LayoutlibDelegate
/*package*/ static boolean native_quickReject(int nativeCanvas,
- int path,
- int native_edgeType) {
+ int path) {
// FIXME properly implement quickReject
return false;
}
@@ -589,8 +586,7 @@
@LayoutlibDelegate
/*package*/ static boolean native_quickReject(int nativeCanvas,
float left, float top,
- float right, float bottom,
- int native_edgeType) {
+ float right, float bottom) {
// FIXME properly implement quickReject
return false;
}
@@ -994,7 +990,8 @@
float x = startX;
float y = startY;
if (paintDelegate.getTextAlign() != Paint.Align.LEFT.nativeInt) {
- float m = paintDelegate.measureText(text, index, count);
+ // TODO: check the value of bidiFlags.
+ float m = paintDelegate.measureText(text, index, count, 0);
if (paintDelegate.getTextAlign() == Paint.Align.CENTER.nativeInt) {
x -= m / 2;
} else if (paintDelegate.getTextAlign() == Paint.Align.RIGHT.nativeInt) {
diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
index 1382641..c9c9800 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
@@ -569,29 +569,30 @@
@LayoutlibDelegate
/*package*/ static float native_measureText(Paint thisPaint, char[] text, int index,
- int count) {
+ int count, int bidiFlags) {
// get the delegate
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
if (delegate == null) {
return 0;
}
- return delegate.measureText(text, index, count);
+ return delegate.measureText(text, index, count, bidiFlags);
}
@LayoutlibDelegate
- /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) {
- return native_measureText(thisPaint, text.toCharArray(), start, end - start);
+ /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end,
+ int bidiFlags) {
+ return native_measureText(thisPaint, text.toCharArray(), start, end - start, bidiFlags);
}
@LayoutlibDelegate
- /*package*/ static float native_measureText(Paint thisPaint, String text) {
- return native_measureText(thisPaint, text.toCharArray(), 0, text.length());
+ /*package*/ static float native_measureText(Paint thisPaint, String text, int bidiFlags) {
+ return native_measureText(thisPaint, text.toCharArray(), 0, text.length(), bidiFlags);
}
@LayoutlibDelegate
/*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count,
- float maxWidth, float[] measuredWidth) {
+ float maxWidth, int bidiFlags, float[] measuredWidth) {
// get the delegate
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -614,7 +615,7 @@
}
// measure from start to end
- float res = delegate.measureText(text, start, end - start + 1);
+ float res = delegate.measureText(text, start, end - start + 1, bidiFlags);
if (measuredWidth != null) {
measuredWidth[measureIndex] = res;
@@ -634,9 +635,9 @@
@LayoutlibDelegate
/*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards,
- float maxWidth, float[] measuredWidth) {
+ float maxWidth, int bidiFlags, float[] measuredWidth) {
return native_breakText(thisPaint, text.toCharArray(), 0, text.length(), maxWidth,
- measuredWidth);
+ bidiFlags, measuredWidth);
}
@LayoutlibDelegate
@@ -921,7 +922,7 @@
@LayoutlibDelegate
/*package*/ static int native_getTextWidths(int native_object, char[] text, int index,
- int count, float[] widths) {
+ int count, int bidiFlags, float[] widths) {
// get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object);
if (delegate == null) {
@@ -963,8 +964,9 @@
@LayoutlibDelegate
/*package*/ static int native_getTextWidths(int native_object, String text, int start,
- int end, float[] widths) {
- return native_getTextWidths(native_object, text.toCharArray(), start, end - start, widths);
+ int end, int bidiFlags, float[] widths) {
+ return native_getTextWidths(native_object, text.toCharArray(), start, end - start,
+ bidiFlags, widths);
}
@LayoutlibDelegate
@@ -977,7 +979,7 @@
@LayoutlibDelegate
/*package*/ static float native_getTextRunAdvances(int native_object,
char[] text, int index, int count, int contextIndex, int contextCount,
- int flags, float[] advances, int advancesIndex, int reserved) {
+ int flags, float[] advances, int advancesIndex) {
// get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object);
if (delegate == null) {
@@ -1021,14 +1023,14 @@
@LayoutlibDelegate
/*package*/ static float native_getTextRunAdvances(int native_object,
String text, int start, int end, int contextStart, int contextEnd,
- int flags, float[] advances, int advancesIndex, int reserved) {
+ int flags, float[] advances, int advancesIndex) {
// FIXME: support contextStart, contextEnd and direction flag
int count = end - start;
char[] buffer = TemporaryBuffer.obtain(count);
TextUtils.getChars(text, start, end, buffer, 0);
return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart,
- contextEnd - contextStart, flags, advances, advancesIndex, reserved);
+ contextEnd - contextStart, flags, advances, advancesIndex);
}
@LayoutlibDelegate
@@ -1067,13 +1069,14 @@
@LayoutlibDelegate
/*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start,
- int end, Rect bounds) {
- nativeGetCharArrayBounds(nativePaint, text.toCharArray(), start, end - start, bounds);
+ int end, int bidiFlags, Rect bounds) {
+ nativeGetCharArrayBounds(nativePaint, text.toCharArray(), start, end - start, bidiFlags,
+ bounds);
}
@LayoutlibDelegate
/*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index,
- int count, Rect bounds) {
+ int count, int bidiFlags, Rect bounds) {
// get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(nativePaint);
@@ -1182,7 +1185,8 @@
}
}
- /*package*/ float measureText(char[] text, int index, int count) {
+ /*package*/ float measureText(char[] text, int index, int count, int bidiFlags) {
+ // TODO: find out what bidiFlags actually does.
// WARNING: the logic in this method is similar to Canvas_Delegate.native_drawText
// Any change to this method should be reflected there as well
diff --git a/tools/layoutlib/bridge/src/android/os/Looper_Accessor.java b/tools/layoutlib/bridge/src/android/os/Looper_Accessor.java
index 2961f97..09f3e47 100644
--- a/tools/layoutlib/bridge/src/android/os/Looper_Accessor.java
+++ b/tools/layoutlib/bridge/src/android/os/Looper_Accessor.java
@@ -15,6 +15,8 @@
*/
package android.os;
+import java.lang.reflect.Field;
+
/**
* Class allowing access to package-protected methods/fields.
*/
@@ -23,5 +25,23 @@
public static void cleanupThread() {
// clean up the looper
Looper.sThreadLocal.remove();
+ try {
+ Field sMainLooper = Looper.class.getDeclaredField("sMainLooper");
+ sMainLooper.setAccessible(true);
+ sMainLooper.set(null, null);
+ } catch (SecurityException e) {
+ catchReflectionException();
+ } catch (IllegalArgumentException e) {
+ catchReflectionException();
+ } catch (NoSuchFieldException e) {
+ catchReflectionException();
+ } catch (IllegalAccessException e) {
+ catchReflectionException();
+ }
+
+ }
+
+ private static void catchReflectionException() {
+ assert(false);
}
}
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 bf8658e..42257c5 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -428,7 +428,7 @@
// we need to make sure the Looper has been initialized for this thread.
// this is required for View that creates Handler objects.
if (Looper.myLooper() == null) {
- Looper.prepare();
+ Looper.prepareMainLooper();
}
}
diff --git a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java
index fb2fc85..cd4f82b 100644
--- a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java
+++ b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java
@@ -44,6 +44,16 @@
// --- Native methods accessing ICU's database.
@LayoutlibDelegate
+ /*package*/ static String getBestDateTimePattern(String skeleton, String localeName) {
+ return ""; // TODO: check what the right value should be.
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static String getCldrVersion() {
+ return "22.1.1"; // TODO: check what the right value should be.
+ }
+
+ @LayoutlibDelegate
/*package*/ static String getIcuVersion() {
return "unknown_layoutlib";
}