diff --git a/tools/layoutlib/bridge/src/android/view/RectShadowPainter.java b/tools/layoutlib/bridge/src/android/view/RectShadowPainter.java index 30512aad4509e..ea9a255e85618 100644 --- a/tools/layoutlib/bridge/src/android/view/RectShadowPainter.java +++ b/tools/layoutlib/bridge/src/android/view/RectShadowPainter.java @@ -44,6 +44,11 @@ public class RectShadowPainter { private static final float PERPENDICULAR_ANGLE = 90f; public static void paintShadow(Outline viewOutline, float elevation, Canvas canvas) { + Rect outline = new Rect(); + if (!viewOutline.getRect(outline)) { + throw new IllegalArgumentException("Outline is not a rect shadow"); + } + float shadowSize = elevationToShadow(elevation); int saved = modifyCanvas(canvas, shadowSize); if (saved == -1) { @@ -54,8 +59,7 @@ public class RectShadowPainter { cornerPaint.setStyle(Style.FILL); Paint edgePaint = new Paint(cornerPaint); edgePaint.setAntiAlias(false); - Rect outline = viewOutline.mRect; - float radius = viewOutline.mRadius; + float radius = viewOutline.getRadius(); float outerArcRadius = radius + shadowSize; int[] colors = {START_COLOR, START_COLOR, END_COLOR}; cornerPaint.setShader(new RadialGradient(0, 0, outerArcRadius, colors, diff --git a/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java b/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java index 51d32e351eb87..23caaf85eb8e1 100644 --- a/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java @@ -64,7 +64,7 @@ public class ViewGroup_Delegate { private static void drawShadow(ViewGroup parent, Canvas canvas, View child, Outline outline) { float elevation = getElevation(child, parent); - if(outline.mRect != null) { + if(outline.mMode == Outline.MODE_ROUND_RECT && outline.mRect != null) { RectShadowPainter.paintShadow(outline, elevation, canvas); return; } 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 d8ead233b4ec5..0e788e0c82641 100644 Binary files a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png and b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png differ diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets_tab.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets_tab.png index 65d1dc5b1edb8..bad296bf4a66c 100644 Binary files a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets_tab.png and b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets_tab.png differ diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml index 2da2cb983a6c9..adb58a322abb7 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml @@ -197,6 +197,14 @@ android:inputType="numberPassword" android:text="numeric password" /> + + sRenderMessages = Lists.newArrayList(); + + @Rule + public static TestWatcher sRenderMessageWatcher = new TestWatcher() { + @Override + protected void succeeded(Description description) { + // We only check error messages if the rest of the test case was successful. + if (!sRenderMessages.isEmpty()) { + fail(description.getMethodName() + " render error message: " + sRenderMessages.get + (0)); + } + } + }; + static { // Test that System Properties are properly set. PLATFORM_DIR = getPlatformDir(); @@ -279,6 +301,11 @@ public class Main { ConfigGenerator.getEnumMap(attrs), getLayoutLog()); } + @Before + public void beforeTestCase() { + sRenderMessages.clear(); + } + /** Test activity.xml */ @Test public void testActivity() throws ClassNotFoundException { @@ -289,6 +316,9 @@ public class Main { @Test public void testAllWidgets() throws ClassNotFoundException { renderAndVerify("allwidgets.xml", "allwidgets.png"); + + // We expect fidelity warnings for Path.isConvex. Fail for anything else. + sRenderMessages.removeIf(message -> message.equals("Path.isConvex is not supported.")); } @Test @@ -299,6 +329,9 @@ public class Main { @Test public void testAllWidgetsTablet() throws ClassNotFoundException { renderAndVerify("allwidgets.xml", "allwidgets_tab.png", ConfigGenerator.NEXUS_7_2012); + + // We expect fidelity warnings for Path.isConvex. Fail for anything else. + sRenderMessages.removeIf(message -> message.equals("Path.isConvex is not supported.")); } private static void gc() { @@ -649,6 +682,6 @@ public class Main { } private static void failWithMsg(@NonNull String msgFormat, Object... args) { - fail(args == null ? "" : String.format(msgFormat, args)); + sRenderMessages.add(args == null ? msgFormat : String.format(msgFormat, args)); } }