From dab59a2aecc37ba30581805c630c150f359dacab Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Fri, 9 Jun 2017 08:20:41 -0400 Subject: [PATCH] Adding a few random AOSP 9 patch images to more test suite more robust. --- .../res/decoder/Res9patchStreamDecoder.java | 8 ++-- .../brut/androlib/BuildAndDecodeTest.java | 44 +++++++++++++++++- .../ic_notification_overlay.9.png | Bin 0 -> 1823 bytes .../recents_lower_gradient.9.png | Bin 0 -> 265 bytes .../drawable-xxhdpi/screenshot_panel.9.png | Bin 0 -> 2060 bytes .../search_bg_transparent.9.png | Bin 0 -> 1246 bytes .../drawable-xxhdpi/status_background.9.png | Bin 0 -> 179 bytes 7 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/ic_notification_overlay.9.png create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/recents_lower_gradient.9.png create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/screenshot_panel.9.png create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/search_bg_transparent.9.png create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/status_background.9.png diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/Res9patchStreamDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/Res9patchStreamDecoder.java index 26dc9de2..130c590e 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/Res9patchStreamDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/Res9patchStreamDecoder.java @@ -176,16 +176,16 @@ public class Res9patchStreamDecoder implements ResStreamDecoder { } public static NinePatch decode(ExtDataInput di) throws IOException { - di.skipBytes(1); + di.skipBytes(1); // wasDeserialized byte numXDivs = di.readByte(); byte numYDivs = di.readByte(); - di.skipBytes(1); - di.skipBytes(8); + di.skipBytes(1); // numColors + di.skipBytes(8); // xDivs/yDivs offset int padLeft = di.readInt(); int padRight = di.readInt(); int padTop = di.readInt(); int padBottom = di.readInt(); - di.skipBytes(4); + di.skipBytes(4); // colorsOffset int[] xDivs = di.readIntArray(numXDivs); int[] yDivs = di.readIntArray(numYDivs); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java index b2482807..0d0622a0 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java @@ -389,12 +389,50 @@ public class BuildAndDecodeTest { final int[] controlImageGrid = controlImage.getRGB(0, 0, w, h, null, 0, w); final int[] testImageGrid = testImage.getRGB(0, 0, w, h, null, 0, w); - for (int i = 0; i < controlImageGrid.length; i++) { assertEquals("Image lost Optical Bounds at i = " + i, controlImageGrid[i], testImageGrid[i]); } } + @Test + public void robust9patchTest() throws BrutException, IOException { + String[] ninePatches = {"ic_notification_overlay.9.png", "status_background.9.png", + "search_bg_transparent.9.png", "screenshot_panel.9.png", "recents_lower_gradient.9.png"}; + + char slash = File.separatorChar; + String location = slash + "res" + slash + "drawable-xxhdpi" + slash; + + for (String ninePatch : ninePatches) { + File control = new File((sTestOrigDir + location), ninePatch); + File test = new File((sTestNewDir + location), ninePatch); + + BufferedImage controlImage = ImageIO.read(control); + BufferedImage testImage = ImageIO.read(test); + + int w = controlImage.getWidth(), h = controlImage.getHeight(); + + // Check the entire horizontal line + for (int i = 1; i < w; i++) { + if (isTransparent(controlImage.getRGB(i, 0))) { + assertTrue(isTransparent(testImage.getRGB(i, 0))); + } else { + assertEquals("Image lost npTc chunk on image " + ninePatch + " at (x, y) (" + i + "," + 0 + ")", + controlImage.getRGB(i, 0), testImage.getRGB(i, 0)); + } + } + + // Check the entire vertical line + for (int i = 1; i < h; i++) { + if (isTransparent(controlImage.getRGB(0, i))) { + assertTrue(isTransparent(testImage.getRGB(0, i))); + } else { + assertEquals("Image lost npTc chunk on image " + ninePatch + " at (x, y) (" + 0 + "," + i + ")", + controlImage.getRGB(0, i), testImage.getRGB(0, i)); + } + } + } + } + @Test public void drawableXxhdpiTest() throws BrutException, IOException { compareResFolder("drawable-xxhdpi"); @@ -515,6 +553,10 @@ public class BuildAndDecodeTest { assertTrue(f.isDirectory()); } + private boolean isTransparent(int pixel) { + return pixel >> 24 == 0x00; + } + private void compareXmlFiles(String path, ElementQualifier qualifier) throws BrutException { DetailedDiff diff; try { diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/ic_notification_overlay.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/ic_notification_overlay.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7de0ed0d87fe33eeee43b57b72fbace37f16ef GIT binary patch literal 1823 zcmbVNc~BE~6i!71K@^euC~J@kElGBBkpv+6SfFLNKEXhJbNH!*m1WHFu1?tfe z3suAeg>S_LzrfKX{S9JYTr{?VP?{T=(h?|tw6-kaSS z6}igJ#@&WQBH4+<;TU4%m>=tT#Jjd2=tE*~!$k@BS}YCEMzknNAj48oK&(R2(HInw zo9HjNBS znczx3d0JG0Bnk+{v?#!$GAL3If&ey~3Ncx1HWUERL5NNRiJMJDnM-K#ME;8Xw zD@)_Wz+p4Kh!vkK$8imhM$695re-s!m^PgTak*SG2c1qKEGW7hHIC>hYMsw41B~jV zT7?EzU~0h3h@@g!IG;=?oen{zkx1SWt93JpB2q@vBN`e+1!*dkIj$*d9Ug=JE90Hk zy4V~IN{c~tSe8~woJX3^ESSjM`yH7L2{pV=wF=@;kW3hpW~op$E{6GJ;tN%#knun^ zhsa_e6AYviQwZWhAXf;oSu8drWOEtJS&nyMMX*2sF-0&4GuaR%VhC7)95{?2$u*iq$$CQA^QTzY47%)f|az$_`Q^+OMPh(~O zCu=l949#2~|0$Q*Eusd^)3?P>EZ(*cswR3yOEd?UQ*)Z=If)n+#Ok}Bm0e%sEO5P) z-empsbAE~MJ@Msc>KpLH@guyr!b(5e7e&_d-LkGkiY$|DmQ^mCzdzT1*W|WG$_?(x zt0|`H8?-r_D4=X&#rf;)BQJ(7G@WHkbgtYqHdfX*G^|KVPfx$JIXQk{PcP@?48eB@RWD;e@q)i3I{CmSXwL?)-7w~0+Qzqh%Z zpp=47jS9`2X2&z@qSt+qRWaYQr#yPAm(`Cc_IdH$Sp&IW-b2~jcUN5N5{ieH1kVlp zZu#+n%1=^HkNbjlRKJp{`VXG8IhIS~Zd!ynWzLoMIA4}~meBJS^14Qv=PueFm~tST z7G(6})F+w(^fnpr__4cr?JW7?XY)n{-_$16wG^oD7_0;r!R2p~iXDuql-hPme4TG$ z%W2ra4BjjM(7!mT*r)MK5nvonDFg#!6R`&eBly3`8ST#kOeGlg&xrm;OYO$^LEFzF ze0EtX1>ZI-PjBh3Xz4I`Rdkb$87J507X4vA(pOy%@au<8M>XVI{nTifxE5Sr=3W@T z_^Qp2(@5IhJt<8c1_|Ae7~q__z_I$!_fn1C+YK*UnD@ue*lul1FjYmk9BEF_tPa!MPBm_JGaeor*(ZR~y3!L6>##ymVNh6^I=_v*g-!Sej;hyD$j zMV@zrYYyFNycji@q$=%Aub(a2%+VPkyUOwo{>s}dH+Q|9M(pRqCH^%fzPGteiwJ?cRXd2yrPu&S?rKjQzYAU?k$q?vTT zv&(L9hn&=Wgx>1`o*OLj);ld-?nu$sEKT^ewp%5Si+LFGX44I(;8FDVzIBtman`LL djn;?ESwNbQT_UY&?`<*vvc#fD_@pq!@DCFd!(ada literal 0 HcmV?d00001 diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/recents_lower_gradient.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/recents_lower_gradient.9.png new file mode 100644 index 0000000000000000000000000000000000000000..427cad9f63269ec2d16235be481e6edd2a687d96 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^d_eq$gAGW!9GM;gq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMgu!1LD6UcB|q?ekqiq9Z}(IDwa#7&P7c8M#=6DF?UGgxt40isZ}$1zZn?^u6t w4xd|(gyBB!FbO`lcAyflv|N6|FYk+tk9FB@eE3o20(3Tmr>mdKI;Vst0M@%#r2qf` literal 0 HcmV?d00001 diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/screenshot_panel.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/screenshot_panel.9.png new file mode 100644 index 0000000000000000000000000000000000000000..45259d7ff0b93034e598faf08c9d137c4c7ffb23 GIT binary patch literal 2060 zcmbVNdr(tX8oz|7Ayz6CAptY1Q5XA~ zQm@_)N5N`sddd}8006EDx|mojR<<6}81!_tQ-^NR8*wxM2tqAJwI&J1DDm)i9U`RK zFEmjpI<1hZ;>bXmQ4A;Q)?}b?bcQ@elaZw1YpJ0j6oCc83G^_grdagJhzYU?sjqk; zTy}0VsFYVKSdx%Br&A&5jWXFAV#M@1QFzK27PXPVq=O8--Wk^` zZ4(v+|K`S9wM{YUMwk%=n+&O_2EUJl#nWIscYkcisfc?6DNr4LDe7d2L6fS75iC+7 zq~a%ZtxgMptYDDI>0A->9Gnf($ zMv6F^Ly@U9I>fnlUe8pt5*XE`!CEP5&{JOJ7t+1OJ{a_8aZh2j|4+^sxHAlAar~}W zrnm44bc%0EA78v_9vHzp2E|*WEcT}&03Zq?C88M1ohQfkqrH^5xuRxyR>h}HjW7Mn zI=SC0J>@Azp+1+W2emyH*u1B~-z?5bo_|1p`h8;O-l}u=ugJf?$bIIwiI6!P^}h?} ztW%xBYW_Jw*w$X~;@>is7m{B+heGh)7H#F4O1eQ>%fQ$ym+yLj_b^pz0UWx^>vhH4EQWLZ+c9hHzNQg^ePIoB)oCLvtKYDH_OL+ zKTtjPS^lJcBKC%VsDJ5S#H9aTiTz$rj}XkG7UH04!N$<= zXT59racCVp973ogy=aAGR~fgYYcIz?B-vIN^%BiGU&QNi!RjnvP$fKYt>V()lG5&b zw+8ZKfkxu6CZ8{rYaTvYns4@Ux9@IwclYNXmIaVX3S>mpye4EJ}w&vT836)yCnB#`^-tCu}(ecFdle@Cq zNLH5sf)U6E0&szZkELUs?MK|6qb-g@KIZ0#!=)>ivD|liYJ;=IfV)je8yQdP^qD_- zPFrH^T-FTwC&Fzvl!oZdu}x@%r7GX8VfGj2y*EWtjKU zg?CnrudFBc92X3I5>R#S=ZXi#l_3g;?(c=spMu5ZqR#t!u+i%7cxprUxAj#=UkJK7 zW11=^_+5pSjn@Nx{6F3~OiusTZMSzum)zW=JUx^$G=|K0&L=2R_a4gRf<5)}7_5%V z^7Z|7kknNq@ZbNvCH^1QSr-Qsque~(VZX5YR*`|}-#s?+}ZWqXO6h5X5>l=1obB^~I7%`In!SKlvlgfA7cdpG`I z@}muoVU`^O^x9>@N{sd6L+?gCv!y)nb{80U!T*tRT(_;(Sn7!A<0@K z^q}A8De0*vBUcp?|J(XiF2UZBF{k^BRkD!wg&QN*E(k5UD$kC~$;W$SXi<`#^Vm#&K~V64=hgT`y0@!;tO2+w?A!QPt@#c zJKI!JQQJ-_{8H(6?ADfb2O*Dj1wH*6e(v9p*La6H-~VvJF=TzFYiF18z}J(zXc@n3 zK|Dv=lJ9=yeMD(b${p*=&4_Tl+c0T4lKL2G9*n{Z>wRFBkz{?T;G8qrzL(dqW+Dj% dBb&2bfa>}k4f&OU_{$9dk>PSlP1v@b{{s|$GT;CJ literal 0 HcmV?d00001 diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/search_bg_transparent.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/search_bg_transparent.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c0bf31d02f30241ba24831fb13928a8b7beff888 GIT binary patch literal 1246 zcmeAS@N?(olHy`uVBq!ia0vp^lR%h*4M?u5p4{( zJaZG%Q-e|yQz{EjrrIzturzqOIEGZ*dUMCnU)oTj;o)ah#wgcCYZZ9z-dcI;-Z>6K zgU{?UX3Y4Z=;QN8v?U_&c-V^I<6f$cfgwwERb%cL-&kd6$02mJc4u|`NiJU5Mf&{T zSX(vLmO7OOd%3btKJRTf_r#tC7yrOh92_1jDojFx6R^=r3Kxa1rm&c6e*J&{$B!H4 zf_|T8EZJiy=plOe)I~Q3B_<)p&IT83^wb+?_Q-pN{yb~*eR<=Tl8lgp*Gn0eD9tdL zu#A1lw(Z-ctE;Qui;0QdGn48S|5>|s)?2s7I;Y#j#l_>x%ggu6$jGFKUHm#{%Y^SY zXYuEWeokB>r&PR}kDvec>eZ`XTP_HXX;ks#%POd;soAk_pWUVzTSR==g0uuL9y{hH z?6Tc>vw`u=Teq@yT6*p()2Vgm5|F&H>iX-_>C>m*Km0uJZ{7do<(DnDT3>QGbWSDB z{Zrkcb%wfndixrEY^-OS%!qtBl}mGz^vtU>X3u`?p{+6hthcdpewLz*7j_gQZ?a4qEBYS%5M{rX1sX#+?Pj*bApKVrO9tSzV313s_%Zg|IhK0 zA@&XBWlN0ocPx!jZUrl2-MsqmMX|#!mt%!gf($%wPZUx(`|M26Lgq!1vqQBCG!kYV ztSn6Qc2H6foX`OZWHfrw%=VOjccvK%Sc4-06p5h7fYDznJfgDyxy-sT5frf?&Ddx+ z2Xu3{woOTuoSz+ep~B`|L&zL{cYd~J`3aroGJNh2_cVksyn6EFiFL}O%FTjXv$fZr zuC&oQ?_{<*^ZJ~~xqi=ozI^$zed*GrW+neh>+1e(zWsLIm#V$-KkfD3?%I@{G)?az zr>XqL*l&GHl($>SU%C41*|X<=zNy#b8Ern1{^{hIV`o<;v~9gJF=T`C);F`vSKrM$ z|Ni~^{c+LJ(Q%QHmDjSiW_{H%-oIhqoVj!V+F4n>djIB4jdZVD{ioe`rEWic@3Cu* z>`D`lZ;U$@uN9QbzgP6#{7n(V>N&RyjdsgSJDsrew{i6v-&0iwd=;55zw7zl_MA=P z-+e3RPw9`JEp1-BZrX%H2Y=33$7JyCx1CC;qr*d+8jo<+4zKl^JQFuHf7-a?z3Cgn z6)>_ga* zJQcPe#$`9S1Vg`ObSHM{3U;_Sav7+yR=nDwd^A9Hl0av32*avZyDub{sTVf5IL{Ia zw>3F?LfFK3f=Ah&^x2T)0?C^Sf~Yilo}IO6*%9_syE~JXFSGcZ>2OKzay%m&L+zn8 Vb)hb6?g0xd22WQ%mvv4FO#ow18UO$Q literal 0 HcmV?d00001 diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/status_background.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/status_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..727c8040ddf09d4c853cf30885f1f76ab2cdcb97 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^%s}kR!3HFgtL`lZQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jib6eI978H@CH?sS-=10EPx~bvg(A(4w4{UvZi53B|0h`P zNbPv?N7b)QCiTmsKMO<7+k5#g)_X4hmS=&5?1afj{spgkW54uNfCbMKEoIj>M$3F= b772#fePL}&U$K7%TEO7x>gTe~DWM4f{8vB` literal 0 HcmV?d00001