From 7b1e486e8778c042eb95e1517ed4ff8cac461759 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 31 Jul 2015 11:33:25 -0700 Subject: [PATCH 1/5] Fix bugs introduced in 78aa664. Fix a couple of bugs (ArrayIndexOutOfBoundsException due to miscalculation and a typo - swapped src and dst) introduced in the CL: 78aa664 Poor implementation of Path.approximate() Change-Id: Iff7dbbf66d2714df51699ddb9a4169c38feefa7b --- .../src/android/graphics/Path_Delegate.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java index 34d09859e2b4f..3c9a062719e27 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java @@ -36,7 +36,6 @@ import java.awt.geom.PathIterator; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; -import java.util.ArrayList; /** * Delegate implementing the native methods of android.graphics.Path @@ -504,13 +503,13 @@ public final class Path_Delegate { switch (type) { case PathIterator.SEG_MOVETO: case PathIterator.SEG_LINETO: - store(coords, tmp, 1, isFirstPoint); + store(tmp, coords, 1, isFirstPoint); break; case PathIterator.SEG_QUADTO: - store(coords, tmp, 2, isFirstPoint); + store(tmp, coords, 2, isFirstPoint); break; case PathIterator.SEG_CUBICTO: - store(coords, tmp, 3, isFirstPoint); + store(tmp, coords, 3, isFirstPoint); break; case PathIterator.SEG_CLOSE: // No points returned. @@ -528,14 +527,14 @@ public final class Path_Delegate { private static void store(float[] src, float[] dst, int count, boolean isFirst) { if (isFirst) { - dst[0] = 0; - dst[1] = src[0]; - dst[2] = src[1]; + dst[0] = 0; // fraction + dst[1] = src[0]; // abscissa + dst[2] = src[1]; // ordinate } if (count > 1 || !isFirst) { dst[3] = 1; - dst[4] = src[2 * count]; - dst[5] = src[2 * count + 1]; + dst[4] = src[2 * count - 2]; + dst[5] = src[2 * count - 1]; } } From 5a8f33f1b09b0311f1bbd1ec6b90db706edb5219 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 31 Jul 2015 13:10:18 -0700 Subject: [PATCH 2/5] Fix typo: s/FullScreen/Fullscreen/ in LayoutLib. Change-Id: Ia8d223ae01f08df945ab05615b07075b98a54a32 --- .../bridge/src/com/android/layoutlib/bridge/impl/Layout.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java index 8c7ea8a110853..c58e312b69dc3 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java @@ -83,7 +83,7 @@ class Layout extends RelativeLayout { // Theme attributes used for configuring appearance of the system decor. private static final String ATTR_WINDOW_FLOATING = "windowIsFloating"; private static final String ATTR_WINDOW_BACKGROUND = "windowBackground"; - private static final String ATTR_WINDOW_FULL_SCREEN = "windowFullScreen"; + private static final String ATTR_WINDOW_FULL_SCREEN = "windowFullscreen"; private static final String ATTR_NAV_BAR_HEIGHT = "navigation_bar_height"; private static final String ATTR_NAV_BAR_WIDTH = "navigation_bar_width"; private static final String ATTR_STATUS_BAR_HEIGHT = "status_bar_height"; From c2622d8923d961e20e3141950d8a90e6dd989c91 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 31 Jul 2015 13:11:23 -0700 Subject: [PATCH 3/5] Update test image for upated nav icons. The image shows the nav icons to be separated by a significant distance. This is because the switch to wide-screen layout happens based on shortest width. The layout has a small shortest width and hence it uses the phone layout for a horizontal nav bar and it doesn't look nice. Real devices will never have this config, so it's okay. Change-Id: Ic494ee7fdfb1116db39bcab6d6ee7a1e514b23df --- .../MyApplication/golden/expand_horz_layout.png | Bin 636 -> 566 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png index 92eb3e10148b3882c11b5dbfbb27e8f490a7e91f..0c16215448704ed40558a8b5fbd35f47957ab4cd 100644 GIT binary patch delta 469 zcmV;`0V@9d1hxc_BYy$?Nkl5>$*Zj@y=ohL_jB^ zxIyetj<2|nH*p+absu5A;@tP}Jbc|{+7v`PJ0E z0{IFP#d%Mv-@fT|zmd^OlMn$0fBy>oc0NmB+p2r@Y_S8yeZGio2deuF3l!(QhUXFJ z?tHs(D=8xG8An7wCnAN=2ZMnSQM|LlhY(ThV+ce*|D!}A!SIOU3O$)jO26Ni>-8$> zbeaJws#>keVzDsQ>vd+Ls8lK?o6Sb1)2V4PnLG}9rBadIZf8C)N9MZSuIX?%JpRYH=z5{o z>zV6ymY}C-U$t6I8jS|KD^pmhRFZPJY$_Iu{Jlm*Kqmq^5yh`>O3_`lJX3XG00000 LNkvXXu0mjfJrwLO delta 542 zcmV+(0^$9(1pEY$BYy%zNkl$ay8k?$Un>>-it5P$xm(2u*FTwK@c?tNF> zi^V;C71zC3-BZxT;{5yIbzJOjcRcb{Qbc@b91#JXh%AKOYPE!jZaXLV5hA+zcoT?# zPX9%fN=1glq4D!Wp^(0Wo6TlAb*yG4Yh|-p>2x};y1ToRa5&6f0i8_B<#MuEETr9T zYoMmKbTCKjCsdEK7(CMA!^Lg29Hv0EVnM|@@K&L Date: Mon, 3 Aug 2015 10:23:56 -0700 Subject: [PATCH 4/5] Fix Matrix_Delegate.native_getValues() The bug manifested itself by not rendering the wifi icon in the status bar. Change-Id: I7debf3eef387965d774bf66e856812e67c8552a7 --- .../layoutlib/bridge/src/android/graphics/Matrix_Delegate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java index 1105c7b0fb19a..a503e50407ede 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java @@ -673,7 +673,7 @@ public final class Matrix_Delegate { return; } - System.arraycopy(d.mValues, 0, d.mValues, 0, MATRIX_SIZE); + System.arraycopy(d.mValues, 0, values, 0, MATRIX_SIZE); } @LayoutlibDelegate From 89a045c31f4f08bc0d9d533ef47f321e6423f656 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Mon, 3 Aug 2015 11:25:45 -0700 Subject: [PATCH 5/5] Revert to using AppTheme for LayoutLib tests. Use AppTheme for all tests other than testExpand. AppTheme contains an attribute needed by testArrayCheck. Also, since the AppTheme extends Theme.Material.Light.DarkActionBar, other tests should be unaffected. Also, update the golden image for the testArrayCheck. Change-Id: Ib5f53f3b029c5aceef2b622e5ac63952d6b1972a --- .../MyApplication/golden/array_check.png | Bin 9786 -> 5188 bytes .../layoutlib/bridge/intensive/Main.java | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/array_check.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/array_check.png index 9a135684f33e1d0d576adcdc33f66603f7cd029e..336f9d8b4798f6ecad746f262d9e660db59afdc4 100644 GIT binary patch literal 5188 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 pM-9b`k@A4)|A1r;0v4Vz&e+fc+ic&AzA#}(N^