From ba5a02c5aa3c9850cdd72e592e9fa8a8d92db7ef Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 22 May 2015 15:47:16 -0700 Subject: [PATCH] LayoutLib: Support getting resource arrays. [DO NOT MERGE] - Don't crash when Resources.getArray() is called. - If the IDE supports it, actually return the value. - Add tests for getArray. - Update test app to latest gradle plugin version. - Switch to using AppTheme for tests, since the tests depend on some custom theme attributes. The AppTheme now inherits from Material.Light.DarkActionBar, so other tests should be unaffected. Depends on a newer version of sdk-common, which fixes the parsing of array resource in value files. Bug: 12372031 Change-Id: I313b61511e98ac1402d75056ebfdeeb005ebb96d (cherry picked from commit 642cff50f8f7a67eed09eac1e56d7133b26a192c) --- .../src/android/content/res/BridgeResources.java | 165 ++++++++++++++++++++- .../tests/res/testApp/MyApplication/build.gradle | 8 +- .../test/myapplication/ArraysCheckWidget.class | Bin 0 -> 2317 bytes .../layoutlib/test/myapplication/MyActivity.class | Bin 1157 -> 1157 bytes .../layoutlib/test/myapplication/R$array.class | Bin 0 -> 519 bytes .../layoutlib/test/myapplication/R$attr.class | Bin 406 -> 456 bytes .../layoutlib/test/myapplication/R$dimen.class | Bin 527 -> 527 bytes .../layoutlib/test/myapplication/R$drawable.class | Bin 473 -> 473 bytes .../layoutlib/test/myapplication/R$id.class | Bin 1978 -> 1978 bytes .../layoutlib/test/myapplication/R$integer.class | Bin 0 -> 492 bytes .../layoutlib/test/myapplication/R$layout.class | Bin 598 -> 554 bytes .../layoutlib/test/myapplication/R$menu.class | Bin 452 -> 452 bytes .../layoutlib/test/myapplication/R$string.class | Bin 538 -> 538 bytes .../layoutlib/test/myapplication/R$style.class | Bin 461 -> 461 bytes .../android/layoutlib/test/myapplication/R.class | Bin 897 -> 1041 bytes .../testApp/MyApplication/golden/array_check.png | Bin 0 -> 9786 bytes .../test/myapplication/ArraysCheckWidget.java | 41 +++++ .../src/main/res/layout/array_check.xml | 6 + .../MyApplication/src/main/res/values/arrays.xml | 25 ++++ .../MyApplication/src/main/res/values/attrs.xml | 4 + .../MyApplication/src/main/res/values/styles.xml | 3 +- .../android/layoutlib/bridge/intensive/Main.java | 6 +- 22 files changed, 244 insertions(+), 14 deletions(-) create mode 100644 tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/ArraysCheckWidget.class create mode 100644 tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$array.class create mode 100644 tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$integer.class create mode 100644 tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/array_check.png create mode 100644 tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/java/com/android/layoutlib/test/myapplication/ArraysCheckWidget.java create mode 100644 tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/array_check.xml create mode 100644 tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/arrays.xml create mode 100644 tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/attrs.xml diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java b/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java index 2c2c6723f981..e5b47d64fc3b 100644 --- a/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java +++ b/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java @@ -16,6 +16,8 @@ package android.content.res; +import com.android.SdkConstants; +import com.android.ide.common.rendering.api.ArrayResourceValue; import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutlibCallback; import com.android.ide.common.rendering.api.ResourceValue; @@ -32,6 +34,8 @@ import com.android.util.Pair; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -42,6 +46,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; +import java.util.Iterator; /** * @@ -242,6 +247,145 @@ public final class BridgeResources extends Resources { } @Override + public CharSequence[] getTextArray(int id) throws NotFoundException { + ResourceValue resValue = getArrayResourceValue(id); + if (resValue == null) { + // Error already logged by getArrayResourceValue. + return new CharSequence[0]; + } else if (!(resValue instanceof ArrayResourceValue)) { + return new CharSequence[]{ + resolveReference(resValue.getValue(), resValue.isFramework())}; + } + ArrayResourceValue arv = ((ArrayResourceValue) resValue); + return fillValues(arv, new CharSequence[arv.getElementCount()]); + } + + @Override + public String[] getStringArray(int id) throws NotFoundException { + ResourceValue resValue = getArrayResourceValue(id); + if (resValue == null) { + // Error already logged by getArrayResourceValue. + return new String[0]; + } else if (!(resValue instanceof ArrayResourceValue)) { + return new String[]{ + resolveReference(resValue.getValue(), resValue.isFramework())}; + } + ArrayResourceValue arv = ((ArrayResourceValue) resValue); + return fillValues(arv, new String[arv.getElementCount()]); + } + + /** + * Resolve each element in resValue and copy them to {@code values}. The values copied are + * always Strings. The ideal signature for the method should be <T super String>, but java + * generics don't support it. + */ + private T[] fillValues(ArrayResourceValue resValue, T[] values) { + int i = 0; + for (Iterator iterator = resValue.iterator(); iterator.hasNext(); i++) { + @SuppressWarnings("unchecked") + T s = (T) resolveReference(iterator.next(), resValue.isFramework()); + values[i] = s; + } + return values; + } + + @Override + public int[] getIntArray(int id) throws NotFoundException { + ResourceValue rv = getArrayResourceValue(id); + if (rv == null) { + // Error already logged by getArrayResourceValue. + return new int[0]; + } else if (!(rv instanceof ArrayResourceValue)) { + // This is an older IDE that can only give us the first element of the array. + String firstValue = resolveReference(rv.getValue(), rv.isFramework()); + try { + return new int[]{getInt(firstValue)}; + } catch (NumberFormatException e) { + Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, + "Integer resource array contains non-integer value: " + + firstValue, null); + return new int[1]; + } + } + ArrayResourceValue resValue = ((ArrayResourceValue) rv); + int[] values = new int[resValue.getElementCount()]; + int i = 0; + for (Iterator iterator = resValue.iterator(); iterator.hasNext(); i++) { + String element = resolveReference(iterator.next(), resValue.isFramework()); + try { + values[i] = getInt(element); + } catch (NumberFormatException e) { + Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, + "Integer resource array contains non-integer value: " + element, null); + } + } + return values; + } + + /** + * Try to find the ArrayResourceValue for the given id. + *

+ * If the ResourceValue found is not of type {@link ResourceType#ARRAY}, the method logs an + * error and return null. However, if the ResourceValue found has type {@code + * ResourceType.ARRAY}, but the value is not an instance of {@link ArrayResourceValue}, the + * method returns the ResourceValue. This happens on older versions of the IDE, which did not + * parse the array resources properly. + *

+ * @throws NotFoundException if no resource if found + */ + @Nullable + private ResourceValue getArrayResourceValue(int id) throws NotFoundException { + Pair v = getResourceValue(id, mPlatformResourceFlag); + + if (v != null) { + ResourceValue resValue = v.getSecond(); + + assert resValue != null; + if (resValue != null) { + final ResourceType type = resValue.getResourceType(); + if (type != ResourceType.ARRAY) { + Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE, + String.format( + "Resource with id 0x%1$X is not an array resource, but %2$s", + id, type == null ? "null" : type.getDisplayName()), + null); + return null; + } + if (!(resValue instanceof ArrayResourceValue)) { + Bridge.getLog().warning(LayoutLog.TAG_UNSUPPORTED, + "Obtaining resource arrays via getTextArray, getStringArray or getIntArray is not fully supported in this version of the IDE.", + null); + } + return resValue; + } + } + + // id was not found or not resolved. Throw a NotFoundException. + throwException(id); + + // this is not used since the method above always throws + return null; + } + + @NonNull + private String resolveReference(@NonNull String ref, boolean forceFrameworkOnly) { + if (ref.startsWith(SdkConstants.PREFIX_RESOURCE_REF) || ref.startsWith + (SdkConstants.PREFIX_THEME_REF)) { + ResourceValue rv = + mContext.getRenderResources().findResValue(ref, forceFrameworkOnly); + rv = mContext.getRenderResources().resolveResValue(rv); + if (rv != null) { + return rv.getValue(); + } else { + Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE, + "Unable to resolve resource " + ref, null); + } + } + // Not a reference. + return ref; + } + + @Override public XmlResourceParser getLayout(int id) throws NotFoundException { Pair v = getResourceValue(id, mPlatformResourceFlag); @@ -431,13 +575,8 @@ public final class BridgeResources extends Resources { if (resValue != null) { String v = resValue.getValue(); if (v != null) { - int radix = 10; - if (v.startsWith("0x")) { - v = v.substring(2); - radix = 16; - } try { - return Integer.parseInt(v, radix); + return getInt(v); } catch (NumberFormatException e) { // return exception below } @@ -610,7 +749,6 @@ public final class BridgeResources extends Resources { } } - @Override public InputStream openRawResource(int id) throws NotFoundException { Pair value = getResourceValue(id, mPlatformResourceFlag); @@ -691,7 +829,7 @@ public final class BridgeResources extends Resources { resourceInfo = mLayoutlibCallback.resolveResourceId(id); } - String message = null; + String message; if (resourceInfo != null) { message = String.format( "Could not find %1$s resource matching value 0x%2$X (resolved name: %3$s) in current configuration.", @@ -703,4 +841,15 @@ public final class BridgeResources extends Resources { throw new NotFoundException(message); } + + private int getInt(String v) throws NumberFormatException { + int radix = 10; + if (v.startsWith("0x")) { + v = v.substring(2); + radix = 16; + } else if (v.startsWith("0")) { + radix = 8; + } + return Integer.parseInt(v, radix); + } } diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build.gradle b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build.gradle index 0f37fce20104..4561e1b80125 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build.gradle +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.3' + classpath 'com.android.tools.build:gradle:1.2.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -19,12 +19,12 @@ allprojects { apply plugin: 'com.android.application' android { - compileSdkVersion 21 + compileSdkVersion 22 buildToolsVersion '21.1.2' defaultConfig { applicationId 'com.android.layoutlib.test.myapplication' - minSdkVersion 19 - targetSdkVersion 21 + minSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName '1.0' } diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/ArraysCheckWidget.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/ArraysCheckWidget.class new file mode 100644 index 0000000000000000000000000000000000000000..e0373cba84a7c352d69f3a03a1616093b16164d5 GIT binary patch literal 2317 zcmbVNOIKS}7~O|FP7*GU0tqBQOYMvIRV=gxtYQ>RO{o$}ZSi$UZsE2e!Q_U54xBi! zvyNo$#Icj$(zW^n9Qq$z%b~-LTKBm(xq(pYTCA*f?s@F9zwg`MzBhk7|LrM&DQra0 zjd#?r5J8U`-bK>)ogawcJ-n|D7S&Ry*VH&C-gop65)NK@-n7aB^XY7HORq=F8+*ly zowwF?+brAq)}FDwowu@vZ50dpLaAizm6Mxh_Te2Xx520a(#dhx7KnSMzV{_;N*-b;`+n0V|>==69C~W9SZe`4` zD`p{UvT(mqDxGK5Yp;Oh%>p4U76)N*vc|N6Wp=Hwp_LhG3LUm; znU4f6ze2f2&PVi6JqRg}x(p33JaUYp*U6bsB;(|^XenpLj(KWQMbHq%kQ&ZOENi%p zRpzVV4nEZ|i#ZKqfruJ4U`@-lB+6f?j6gc2c?MTIg6)XwTRK|Lrv8 zC|PzZpyb1c0v*X*;aY3BjP(sY?*QT#&RfvOF~TR%4v7xLIU90uNT8o9-oO9`$)aYbafWEcJ5=Mn zjR2W}FnI?_+|o?k#cSOT@u&;*h{GOnxJFDG7VsJqP$AB_A;g~y5n+gZ6(Z_CfN!h{ z|7;*0=n7O3oDIfStb+@A3%N|5eOwBn(2(|XJtR&b-cl*O!0gg!52&~ zEb*qqWr=AaBxWS82s-8&63@{oaaD+C7<8uB)HFeAe)4J-Dp5XVp~UZKyE}G(_N9sO zDmo^*I;%J}Ize?Bo{BLnC{&nIwX^&l3KeJZN=DaT39p=lS5AUbTwu&FPGKHzIsUrN I8!dSIU+g~_Z2$lO literal 0 HcmV?d00001 diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/MyActivity.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/MyActivity.class index 8af93ebda1e42cc9a75984b06bae1ef7a729b6db..ec42017bad67ec0cb7c507eb91579f0c66bcb724 100644 GIT binary patch delta 27 icmZqWY~`GwD!|3Sz{Q}+pvBFg&7i|v&$iJtfCT_Q5Cm-i delta 27 icmZqWY~`GwD!{?Oz{Q}+pvBFg&7i|v&$`hxfCT_P;{<8| diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$array.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$array.class new file mode 100644 index 0000000000000000000000000000000000000000..b87f193c68a0a4e05136bffa46d4887be2ef5121 GIT binary patch literal 519 zcmb7AO-sW-6r7hPtxZ!~>u2@qL3=RTtKy{~6pBKXUS*RmbxXQil8w-lzsZx}!5`p{ z5?_K~k9yeIoq2EPJ?8W4{R2QBM?NaptKp!AF2NINDpmv<5}E^}Gb^;6h$NSl7Z)JZ zm9~#%Qy~x`$ZV?g>{oLL)hnfyy(UynPA3F+V5XAL8YwMr^F<`n2N5N#bVeo?$wZ{8 z;6I{kpH#-aL#<^xNJN%Nru|WD7NOA7)Tn8gh?U80qN32s%!Z4VSS}M43#*I{$H(P< zmjwUbS?OxWd|HZz7MxyZmDleelLL;n%s}O}}*v2F1RT70nCmu>nZu8BV zbI#1we9Y|od%l1vqXH0sRU7jqdbY zK40LH=4v2LjC{s7ac7gPQ8@dn?$v6qU3Af~FJBontWdvc|} O-$m|ap^!_cwa+Wr6bst` diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$dimen.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$dimen.class index 7ad860522790a8f15748a4668561374a63912899..0e208f2dc7defe988c6ff6ecea87d33aa37414ae 100644 GIT binary patch delta 23 ecmeBY>1UbX!N@w%Q=XA^V`e2Iquk`jj5+{I@CI4{ delta 23 ecmeBY>1UbX!N@YvQ=XA!V`e2IBk$zLj5+{IfCfhZ diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$drawable.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$drawable.class index e9e0a3341ee2ea1789276887b548eab313ebe748..2b77af367a385a982e2a486a9129e1de75e1ca54 100644 GIT binary patch delta 13 Ucmcb~e3N;@8b(H?$!i&P03~k(rT_o{ delta 13 Ucmcb~e3N;@8b(IJ$!i&P03{j(l>h($ diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$id.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$id.class index 069f9f7e826bfeacb722bdc4ab6b1587b5246abb..fd01b445df0db719cb7b86147cabcbdb9464710d 100644 GIT binary patch delta 819 zcmY+C$4&z=6h&#huL@z>YfdX)5sN(5ap42Fj%m!&loS;UgzVawg8>dQi{`U9=9@S#6p(9AHA(bbv`@3j)TL*1Y0&%r+Q*ld^#!fwKgz`g+Xl L_0sa^dv50k=JM1^ delta 819 zcmY+C$4&z=6h&=95<&<==q>avkmyB-O%R9$OT>xQjl#)Kb&izJJzM}4-#50-)cl=e~ z3;u#QL&-oOSj5$}h%{HodZCpELSr53EF}f2&Fmb2)RF@%$vY*72>KjwgrMMnV+8#U zI6+W!z$t`&fd{xrF<)POoznuKK}w2`iZ%Hydy_45u186Ks6@~uLtqGrHC=`# z(PSa7cG4S$T?W~j5eOy{F=whfXOxnX%TklZ7)*~u(us5&ravheDxM@&W)hu%VGc5F zlmD5Caq2%aNlsHzer^fBaVcXB&Z{g4Ii@i~Q&Lnc5VC7y76v%TEUJJt#k7dSziZ|o zpu|@)imcgrBw*FATe1MZDdD{F*RqK6NyKschb*Cd5vlg;dw9xnTZ1$kS3qi3yOD`` zkX1^u8s5#6ZbMoq?4mWe&T7-V?f?_Yh679@n-DOzv?_|*FiZ$H L+e=5kKJweYoU_ym diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$integer.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$integer.class new file mode 100644 index 0000000000000000000000000000000000000000..91cf5b6d824bee2ed42a406e13d4464e461b4d84 GIT binary patch literal 492 zcmb7AJx>Bb6r9J`>2V0+C)O59!9`-Hu^}-bA)27l?;RUlvh0$(Jq(q<$;!mSAK;HN zzPnIZYBRetvu}3tzP>*`0rYX=ql^O&M;?v|WhV`RhJ?nzn$!v7CPHVj{OSROntPFY zRWM?9t&DOvJau+HAyfu-DhbVzGV(54L^634k!Gbmva!$;k*J(+#EN@XDZx|5$(c+D z!O$3)475m7$;RanYwVX7R#kpv2ewEWD5AGIoUS-*a$*5^orc9aK=ww^%SPgsoqE yn;q_tI%B{u!h!?U?mOtM7-=xpSO%W3!x$9zDw=2){$7Fm*yYn_uY^Oi(D?ypUveA( literal 0 HcmV?d00001 diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class index 14997511584bd61067f1e2e030c103ed18b4ee8e..e172b2d9d571769f04b9d7f6867c0f3bbb29a29e 100644 GIT binary patch delta 170 zcmcb{vWi9Y)W2Q(7#J9g7-YE^m>DG48Kl@5q$i46$a5za6(v^2CugK4XEWC`GcYkS zu;nCH=9iX$c+3+!7P9d%@Ut_>Ox99> delta 221 zcmZ3*a*ajw)W2Q(7#J9g805Jam>Hzl8D!WQWG9MRSo5Y<6eQ-Q#OEYd=9iW**E2IP zF)|221R2Y`EaVhm5M*bNV`MO#9LuOR*?}>Dk#+J!M#l_E20jK> z2B3PNrA!R`Ko%ndP%V%Y0*dH^`3wxKTH6^IH-eQ214%ZZFav`Ng9wo10kc^dL>a`v W@)BTDl0ghea{=X;7^Hz#NCE&{Qz7mE diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$menu.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$menu.class index ca438add633e4ae7fb40467164128fb9b5a0f58c..aecbff6add3bc839b355bca71601a1106aa0aa64 100644 GIT binary patch delta 18 ZcmX@Ye1v&|0VCH&!!$<5_{lREbpSU(1zP|B delta 18 ZcmX@Ye1v&|0VBso!!$-l&&e|wbpSTK1w#M; diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$string.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$string.class index a98abf57306ae2df51961cff64c1c95469cfc50f..fc3f23600d86d0207214d58820117db0bee3e3cb 100644 GIT binary patch delta 53 zcmbQmGK*z`tqKPN10w@RVnIQCUSe)4b3F$GBO?QMMruw@etda;QBDd_Xk%gzBV*F! HcZ@m!ZEX(h delta 53 zcmbQmGK*z`tqL0h10w@RVnIQCUSe)4b3GdaBO?QMMruw@etda;QBDd_Xk%gzBcspc HcZ@m!Y*7x- diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$style.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$style.class index 7d8cc846433492c1d7a163946d848216d153f3d0..83ad35bd0ab198309d490a997d5fe23d688b1267 100644 GIT binary patch delta 18 ZcmX@he3p5F86)RL^Grs@^vMeubpSa>1&jay delta 18 ZcmX@he3p5F86*2f^Grs@z{v|4bpSZS1#|!a diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R.class index 7e6113b3aa11cebbb22d998435ee7146ba463172..d5b81c48b40438f690851bba4decc2d826eabccb 100644 GIT binary patch delta 327 zcmXX>%SyvQ6g@X-drRoTP1X8-KT_+XF5D{O!mWQWk|6|Qgh`471aQ2-wsicQ6qVq4J8i!!x>-gTB)cbS?zx4B|R z(8&vzWU*pb(7LnPM6t(dYRdabq1YE_k`*?#P7w;cBvK3o-N=~-bDLVl0qdiLt9`|Y zC8j8tJ>=9lXUgg0YiEE3L0COYSe?m_jH!mff309t+v>`D^99GXj+#ZBz~eXSBfRV& zF4CPg9%zRjkarF|ED-~8jV;7jrs^@q5LU2C_ORCAIy&SV1l5IqK7&3VX4ySQp2y%1 DlC(Iy delta 258 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 pM-9b`k@A4)|A1r;0v4Vz&e+fc+ic&AzA#}(N^ + + + \ No newline at end of file diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/arrays.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/arrays.xml new file mode 100644 index 000000000000..f6e14d2b83b9 --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/arrays.xml @@ -0,0 +1,25 @@ + + + + first + second + + + 1 + 0xaB + 010 + @integer/ten + ?attr/myattr + + + mystring + @string/hello_world + + ?android:attr/candidatesTextStyleSpans + @android:string/unknownName + + + + 10 + 12 + \ No newline at end of file diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/attrs.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/attrs.xml new file mode 100644 index 000000000000..894e18cfe48b --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/attrs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/styles.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/styles.xml index ff6c9d2c0fb9..88c9cbcb250a 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/styles.xml +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/styles.xml @@ -1,7 +1,8 @@ - diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java index 9394253322ee..b9a2e31793f3 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java @@ -296,6 +296,11 @@ public class Main { renderAndVerify("allwidgets.xml", "allwidgets.png"); } + @Test + public void testArrayCheck() throws ClassNotFoundException { + renderAndVerify("array_check.xml", "array_check.png"); + } + /** Test expand_layout.xml */ @Test public void testExpand() throws ClassNotFoundException { @@ -388,7 +393,6 @@ public class Main { ResourceResolver.create(mProjectResources.getConfiguredResources(config), mFrameworkRepo.getConfiguredResources(config), themeName, false); - return new SessionParams( layoutParser, renderingMode, -- 2.11.0