From a4d7ad8663e624d46f53ac0e5948348348d82204 Mon Sep 17 00:00:00 2001 From: Diego Perez Date: Wed, 6 Apr 2016 12:17:34 +0100 Subject: [PATCH] Fix rect shadow detection ViewGroup_Delegate was trying to use a rect shadow even in cases where we needed to use a path. This caused that using a ToggleButton would throw an exception with radius < 0. Also, changed the tests so we can detect certain render errors and ignore other (like known fidelity warnings). Change-Id: I900d45f9efa892ad0aebc8f4ef73fc9f21ab9d92 --- .../src/android/view/RectShadowPainter.java | 8 +++- .../src/android/view/ViewGroup_Delegate.java | 2 +- .../MyApplication/golden/allwidgets.png | Bin 10663 -> 10819 bytes .../MyApplication/golden/allwidgets_tab.png | Bin 7214 -> 7305 bytes .../src/main/res/layout/allwidgets.xml | 8 ++++ .../layoutlib/bridge/intensive/Main.java | 37 +++++++++++++++++- 6 files changed, 50 insertions(+), 5 deletions(-) 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 d8ead233b4ec5d2c49feb03f38d843ff065c25a4..0e788e0c8264144c0a0bbae244ca3154df9eecd9 100644 GIT binary patch literal 10819 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 literal 7214 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 Dds?!< 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)); } }