From 6b244b093c2e5a00edfc045caf718c86db599bfa Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Mon, 4 Feb 2019 15:33:31 -0500 Subject: [PATCH] Add ClockOptionsProvider for more realistic previews. This change enables the picker app to move to the new ContentProvider but it doesn't change any of the assets. A follow-up change will dynamically generate a realistic preview image from the clock. Bug: 123704608 Test: atest on new tests ClockInfoTest and ClockOptionsProviderTest Change-Id: I744c8dd063f6aa112e290fcf54cdc0e0b1377a0e --- packages/SystemUI/AndroidManifest.xml | 8 + .../drawable-xxxhdpi/bubble_preview.png | Bin 0 -> 7680 bytes .../drawable-xxxhdpi/bubble_thumbnail.png | Bin 0 -> 2692 bytes .../drawable-xxxhdpi/default_preview.png | Bin 0 -> 27326 bytes .../drawable-xxxhdpi/default_thumbnail.png | Bin 0 -> 3528 bytes .../drawable-xxxhdpi/stretch_preview.png | Bin 0 -> 6756 bytes .../drawable-xxxhdpi/stretch_thumbnail.png | Bin 0 -> 2253 bytes .../drawable-xxxhdpi/type_preview.png | Bin 0 -> 20477 bytes .../drawable-xxxhdpi/type_thumbnail.png | Bin 0 -> 6315 bytes .../SystemUI/res-keyguard/values/strings.xml | 13 ++ .../com/android/keyguard/clock/ClockInfo.java | 117 +++++++++++ .../android/keyguard/clock/ClockManager.java | 41 ++++ .../keyguard/clock/ClockOptionsProvider.java | 185 +++++++++++++++++ .../android/keyguard/clock/ClockInfoTest.java | 84 ++++++++ .../clock/ClockOptionsProviderTest.java | 189 ++++++++++++++++++ 15 files changed, 637 insertions(+) create mode 100644 packages/SystemUI/res-keyguard/drawable-xxxhdpi/bubble_preview.png create mode 100644 packages/SystemUI/res-keyguard/drawable-xxxhdpi/bubble_thumbnail.png create mode 100644 packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_preview.png create mode 100644 packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_thumbnail.png create mode 100644 packages/SystemUI/res-keyguard/drawable-xxxhdpi/stretch_preview.png create mode 100644 packages/SystemUI/res-keyguard/drawable-xxxhdpi/stretch_thumbnail.png create mode 100644 packages/SystemUI/res-keyguard/drawable-xxxhdpi/type_preview.png create mode 100644 packages/SystemUI/res-keyguard/drawable-xxxhdpi/type_thumbnail.png create mode 100644 packages/SystemUI/src/com/android/keyguard/clock/ClockInfo.java create mode 100644 packages/SystemUI/src/com/android/keyguard/clock/ClockOptionsProvider.java create mode 100644 packages/SystemUI/tests/src/com/android/keyguard/clock/ClockInfoTest.java create mode 100644 packages/SystemUI/tests/src/com/android/keyguard/clock/ClockOptionsProviderTest.java diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 3453e798c7ae6..7f41f54bf1798 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -631,6 +631,14 @@ android:exported="true"> + + + + diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/bubble_preview.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/bubble_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..67f072f54795758ee5120c410ceda61dc038a747 GIT binary patch literal 7680 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 NO<7Cn^PQ)G{{gg$ar^)P literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/bubble_thumbnail.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/bubble_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0e6ed493e69bccd6aaf5f387c2a7f921337cb9 GIT binary patch literal 2692 zcmb7G3pA8zA0N|HgRQ11D;mNK%81US$n3IAEQV>;H8YL27#1PMHDy?} z6B-kvrs0z@*2-lFNfMey3Atrl+sF5vvuF1^yWctA`=0l_&-4F3&;S3tzxVgQFx_0S zTa?t5AP~qFC!D=I1fl>34+OpmNbsd&8Q`_a*9B`2`MiGL5|(8GiDDS;>_rGfdB^&r z0Ld#*1;Wi#r;`qwM-{d!>{kwZRC)@Cv;t3iQje2ELi|IiUczz10ABM4oqr8aX?uElZoPd&$x!)PNuG}?KGOW4u72K{ z(6RFI{cBOf=goVI9l4rH)dl>k{@bS72E+^1+DfgHPd^@2jP#fBX9s9GxrN6oy5CWu zufLojD4-CRF%YN%9QN12f6xE3;%^qNEB@BP|4{tZ)gR9P-X}2rC&hJB2hQc$m`@+h zewdhOnw$*%Nz~ixZPgfPg;yEJ{Hg@`T!xc|2ujI_k%=%US zLvLe!ef<$}ipKQYe6o0M?tw~<*+bW|ZmzoAY9hj_ZuQeZE&Vf1Q(ODy@((|km5rA3 zUnTVs>DH8o1u6#+C4*wI4UyJ_m;e+>5)!VmkM@G|*rTR*SO&O@^_wzBA zKJ}Bhe10F#pTOynzsbbw6)lvT(>Aj!(mPj9zBW)+>HKQ9=k9J5UOZFz%$;+<(32jVaX;nLZB5n z^~ziqYMb#=5NXoh-i|z&U07J?dH%flKBz4c;2HJtwQaF@ZgpWOUzLGUq{)X9M8Vc8 z;RlNINuhd(g6`Gjg&jvKN9tHT|g2>4QPRFtJp>_oMF zY6y+?3Z@8K{Up{Pqs_csTwL_As4;$NX{jjAD{Q>iNQME}xEbym?Jf6Ws^M?D;hsgo z;txy-7hWYhmu4h#A1_Y|>VyES8kOmW%{p^&nmitFy4`9j2f;uE234PX`8b+KZq-p& zPm)UgcjzL}JqbEARb^#mYhvhaw?wH_s;aGhSP^RLE~Pw_kFnEyBO+=@t%h07;j;F^ zI|PnCidm$%ZA$vtJikpo(`qs*E27sulip~R)?Spk7I%#8gfm{7tjI^xxK&li6i4=W zrLeYEl}{c@O;6u`;2a9aVYAutrSVF?kdX2N7U^1AS}6m3GPaz+qil@7XK87fI90c7 zOgM9fxM*ty*d7oNF!Hu7pZnm!&Z~9}N-FTGJCX~crKOl)GP$|E-E{>}R1#FZCL4M) zyQm5HTMOp|;si?$_6U?sBOmE?&uMZ4!y>y#*0Q z;rK~ARFnh0$R-6`7Y^qSu3nZ>4w{>*czAdasxa3bV`F2vLZKFG@f7%sl>Yv+3rqyO ztGN4}h>cD2rPJ#TS~WB^e_C9O7HC3k)q_Jr#SIO%c-9ecfa-H?3Qup`7e+cvOiq3} zx^??@5{bmEsfpOf?*f#Hj}dBHSy{z-(Rlqo5$UVuu6X>(Ynbb3kUtJvSg?m;v&#tw zdV72A?NGQ3p-@;s&x)4d9=~t#gu_@5=0Cn^$+S452zATY0W{V_}bVU_7Y($#={P}Z)BI8!RqobqQ ztj|sC$j6VJA|=?Mn=$Lq4~@@V%XZ}F=j-VrsKLCkmS^0=V~)OlerywqVHLQUbZLG(H;xQ;TE~hLFxQ==lp|uX*lc;Nrltl!SDTod zo2#m+xl<7q&pHufqtg>)p48;~^B%51@O{C=P|fVY08x%#gFQv+1o;GofHun+0vySc3*p9Kc84ByNm}hzMA>;^<4G+3?Z< zhq%?%{>2-iUPzNOm3@O@j^G3!>A%ArrL8hl0hsxb4sK{q|ek`Hudu7uA?BX8N6;pu4X!ew}Fwgffhn z%D>IDQD9JjD+9H-Y11ZmHAP@AMwQvr)C7>Yt9Ef$(KbBiI{FLj?bx`yejG-8%u^^!aGs=(cMGto8$W!}cvQul*SPzG-0YExACQ+ECcq1SRK#rJ}Pmd}ONdtp}4J(NC zH-AYM!=P*ads9hs?}I>b61^=91Z#|IotxU!BT7bVn$}KPdk2i6O6UMmN%1HfU1D*PB5n M2Uq(FyKmxu2Y-{SCIA2c literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_preview.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..035a4dffb026b56d1c41e801f69c96e64654bac5 GIT binary patch literal 27326 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 lm6o*9l2$}+v literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_thumbnail.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac01135c2116beea83116d114f3dc3f92f84ad1 GIT binary patch literal 3528 zcmdT{XH-+!7LLe3s8R%^1w^F^ib$_g1dQ||9i>VO#e{^=1`&aw3eua3bSZ*>grY+S zfegKa3Bw==#DIYGcX+dA)|=S!86 zAg7?AT_+byqpn8@Ct!w_&MK0Iy>>B-H`YBwRQCjog|#80rX{E z%^RkeskPZ@6O-|_Nb(h$oBZbmgrpy8(PjwTx+lzT&15~ri7d^jLm#p#qB=_^#!jop zUA?MMSIeFl{zxNSjfIJZiLr;&%AsxFt^b~qB|rt8$z&tB-!r8cSot!djZg)-ODC91 z0imRTghAB!AxzNk9w8K`epG|-GeMw~-#z}L5K#4xLcgo}8>Bz+{|4y~{O`>BQ|RCJ z|1Z$Le)(7YKh%FGza56meb_7|D_cY+`-)$_EX)MG@9S&iQe$aeW(Jl_mR?6kNA;v< zEH$OTfW54Ry2azM~MFt zj*V>L_O?F*14G9e`RHKN;D_)V($}xA>hdJHDbdlePFAP zTh?oCZtnf?!9+`|qe8`?M+WA?6kSVF{f$0C9sBLe^9uWSupPO#vj|{YSI}`^U!Rv= zjiRFB;uaRY)^Mwnd^P+o)sw5h&5_wgw6wG|+fJ9ArRCt^{!acJX{5vi#I3id=Shcy zk?`4}*4Bqjc9k%dpyGxG`L?&pAqN)rA-m44d1X$#1}`}^Z{B>YpDjloSQzNbp{1pr%N@$NT|K=9mZ*rx;C$$DIrSNs zW>B^(KDVT$1(;z;6Wo&It3>dTBhnK;4d&x~2oxp|f5|#m6v~X3mlp&RZozZ0q_Xk~ z(ThDsi{pyj%o|CsJ-lRwsfkH`X{l%%dbY?QPw*fB-bubJE-rGG)+=E8xkls!j;4Lv z_FafAFl(^LoP?n;2o7#m`S$U2K|z5RZml(fZW?=Pd~|gA3!#nKdw#_x4g*x2;|;Bv zUh|w?b?~&;(ux4i5rVVzi+=j)CnVsI_c)hGbYSD)@VIyHMsRTO3W+p6G?e7$=Vxkc zTwUIEEvx^;(bd(}y6v_Lme$t82M0~7{(*hxZv)k{32IDHywnaDj0G&gb=ZrVk;l-{ zF~7IB_qu`tSK7R5&7|p_J4I7dRt>Z3ym>QD*Mk#K;aD>9#0)_pAvVUyOS)b0ye2>h zKpG>I`uHb0bfO9i3-w6Z5fKr4gh)P9bMw@6p(!V0H@D@wc`sQWCCo2hUgwi{gK*fb zQY9Gvvz$)l!0}t`mV4j0(Zvs#SapYM8E^Sx)mCl%{p$vDmG}4X;F#e27H=89`%Fo3 zs*QY(CPLla+dBcX@@;PqH#I$d0rmx6N7l@`;pFP-9q@{B)uH`Wb+xgHiAia3abg=m zXD_sJaQF0}O!4HTMWx6J24oXRMKq5^yH#eER6Z~f` zN=Zo-&L@9LE+DDiT@!g$63Sn)*e_9I!B*5Q2{dI2lq(9lIczjQE5uT+l$FP%G=}@tC}+si|~V zu0Um=j84}mG;+|ety}UG)1=>bm?_&E)4J;Rll^j*b#JNC_~EC)Yi6n z@hq;i^cG*}f$y!jE@39c=(a2>Dk|jKlyt>eXR0Snz_qP!WXCq!hk*X{GgaVJFRxD4 zh>D2~x3@pCYr=pWVC*6I2&<~9E_Nn=Lh&DjyaN@nToVIt*vcF)h(EtkTWwggOziWg$#O0 zJKP~$0?oM9>1E^!NL@gZm9=&9JSlCSG(ItrE+{BSA9~c2EaWH0qp0HeRE-~@1WQ27 zHMwDK=8w9Y!Qt>*w*y(_b2m0N#>e{(Hu0*N+1WF1;HdQ(`5cwty)}*?ERKgU5-j~Z zm2wa=V6Esm`kM!~p@&->VejWaS7-=1K18=A2*{4vR#}zDE*%RP8XLbzN@59Uwo?w+ z(A3b-07>bNK*TTq=xS-15znVu;W1vJHRF|$o12PXGO@FpYYDX75V^^co|`-7{qE4^ zZC^`|)6lqmXbubf*;)r?V{;QlX#L^v+d{(LdLyZ>cE-lVr4R&yp5*xEE@PNlD=503 z!1r+&^Jib(4Z=MGka^CvRdRo;!o7f#ybLF)7lMZrZ z*d(+T1vKY_?P)e48rOoBeIPS-MWd%h=pNSnYBFvFaoOn=G6!RR!n{kLsNtoa} z9-;)t0o%EBK#}8AdOWXUC&uBbvT}J#iweV;Gi6OpHgR!rq_3Ep9E7dImbWdwGolDg#*~ zo4E|+c*a1ZZd%Mt6%!NV;^Z_62-uB>?H}jG?FzN>-+ylhghF zeM2`lx8B$yVE^&aJ}I>x1ax^IM-dmayHPim*%W#lV#8hyTKCh~w(jmI#4K*hoJVF( zo;1_o_%_P3IX$DI-6bU=vpAGkVMaTER8Ua(3Q{R*=k=tg?{1-w3lnDTxBjfh z+{u95j+4fC>7!#xR#w>s?Rd|C>6I1tkxFh*^GBjtg#^}Jg@!Q~OP)W!QC?oo?9Io` zJ#3(Q_!5Uxkk1*=TcD*1=i=oxL!;3nzGkMTtJ5i!G@1|FH~I;PdPT(2w>vhzX7i72kyg2|a#Sv!a5AeN|Lepy-Bl{BK0i_3a1v6h^gl2Y&??MfHwH^=(v zt+o33!geh`N($eAqPRN#-rdb5)W`Q>PkHh>90m*EX{Pq}#{)uA!QTjxdw?1ABK(mY zRoF`-8=F_~G>PQ|)gz3Dy^@$1dz$fc#Fzaka3J`G-Apr>y~-ZjIb*p@&6 z*&5X5D;SYXpG{8bz=Sf=CEc)d~g#WKb)!qCh|(l*tfc1X`%5AW=XG zAu0(G5h(Lapj1H+kV)pr6e9DS03pde3GI8fYu&!L-k)!E<;zOW`Sv+y@89|Dz0bG5 z+vlvzWVR`8gFqlM=riBgLLd^U5Xe7zwn~AXGj87ufgh0iOX6R<u4n#p93Jd6OPT1e*n;FF4rvy{j3#}7A zsLv>~Rwr-$vQI4nd)w&?-TnK%I-GK=ykM+hBkCueeAeW*E+K=x4%zBW{daTdIxh{j zZ^uSe9Ht@py~V!KXKwrUPdKfUW@#M+jaEThPr+71gz;e6eAs#Zi^XOA zHMV1LOGO$xG%e5^9Sf=1;-mEs$QCH1RsvjKV70`#{I1eZLEB_WdsOr-A<~ zp}(5_Zx#ODh~G){S6o=tv&%U9M!_>Rp)8QCC>1Gr_O3Ny(r#jQwq<=~ssOh%Zn*w2 zeXRy+?4|_|-qw^aJ6OIxnRO@GF8jirteo=3yD!r{5?xlI*dGly=IbsMdbKqf7yAvC zr{ZVJqJObDfgRb7nk{AJ2T#4f7#{BBb=Zz!rF%GT8wcDd|M=_)#*9Yw>Ic4Y zwQv9Nyc5`43y$SM6E~HaODzU6V7AwDU-R^`F6JIb#HoqaLO$Y??W~P-tqm8x7Y%<@ zT0r*gFTO1UOb*9}!xd{KCO>?wEWaHdXUf64k@n!H^8gA%bAi*tBQU6ZiKMgD)a>jo zC9!&?snH{lNJ*BP9Q06I?ey?hPNiD$CW6vU#blQ!3TJ2i#9A!{AKxmA{dP;e0IYPk zf4aAz06TiJ7ASn%q(U{(Ja=`KGt*xXz%q?G35-|}iECjzkvx{9B>3l7;L+TOVNk|l zP=JtN+Jnf`GYFY(h?Y@;Z39*+!#(wY*l4&L2sVcXUS2BrZhe9wEgR{+MQg!R58B5J z5Q-PB4TqN>4#yY(bFo+_t5eup0c8Ea48GEK_@f&@thX$X!Smk^ciWgAzBN*F`Cstl z4$vC#Xi0sn(}FyO{Tl0bWzSndvwOUe$2qX1U}QR;572ln%_K@jO76(X$~xkih8w?0 zbr(tj&1L}p6(KW?>G8(iB6;IkrbKN7+Mupid2{CS^74GIwl8Zz@9p5xA9nYN?%xi5 z!YAwcyzgO(5R!{)!iYeiP$=Tjw?lzk#?#S6*9%5QMwgg3t4{1k)~xo3M%I0a)L?*C zX>dqLxljtAF%-e^55wb^8V%>tRNvS(wX z%7hsgvK0PX{X@(Ea=HQ@2~(dEsh0VhQMAoWi` zlE5cTn9yNDi5TnEk#&(9LF zv$g^B0rh3gG3NC>Oa_HZZ4X)e!o9v89(Y%z#`E}5#$3a^4ij!Ld!x0aqjO~(0WBf2 z1mGU>@M#+w*OU0zTUe0pX{g@OQM56B?3lH|$XKDPaJ^fE-pEK7XNBQ8ri;GjN}^%L zRVPX}$f6rh1daX57Q>n*dLf2^ZRhpbse%85Zh=nv&$*j44#iX_BXIrbW{h{(7@r&w z5%JQoq~#r$u4sZeC9Uf3oE%!2d5zf`CV%!6B9wAN4fB>H(A)akY z9AY$JDge+Iz$BVXb6j3tzClvX(Cr)m^f$f+JQ-$QB5;kOw}4I4A*?T_h7RF)gciv$ zX%`Ne4u}`U$qB9U0i?i3`{14hxnwZ;JEFn9=MDn?3059|_oC?6N1=k`!nD#~YD8WX z8OSXkjuWJJ-f!XZsmF?2b&qX_-w4jIB!|@S$^C*+oy?hD^qlN%b zk&`OG;cp2(#K%MDyAKwblW1$D1v)HJuKeDuvhYd}pd2egeAN=oqf0h?LWWm<$YWX? zElr*^V%14)jg*A4rwdw#=2${ucQ4Gi^vhH6!mHDztoB?wuH|vGNZ@^6U)Z}^G)d5J zLTSvYH?jI9t(XxckJu_ZJv>t~EQpQw?JHE}4iklU1Q(9XS+-i6q+Ge`R;WL- z)Uj5rWUGeDJmF5#RFtf&1R;NnWTEk<61U_6PjXQ2b|n(t=ei0>Lc9KMvUjT;#$e?I z0&Q21R!vmY-WYI@JdM38;o?%})WT&7`PX~%4}xUT{O;Yk_t}og@x%?*rLynFjtH3M zt^Ri2*R7f=rAY|&rJ;oHxTi9gjeVb2`X!QfzJ~0W|DdLOb(|@zFMO-a=R{m7H8H3r zUQ#2FVKLnYcPCwr+<98Ps^sQZT@mW(65f=AoH0E{=YR)ttL!<~uBwXmip6poiiE(V z5W-Lz{FK`H@~a@uqfk-(w*3`Gc0=Jf5)H?h$ds8e$Mv6zjv9fioS$`}W^l?d#v#k5 z?^OMrQbsL(Z1)U!BP;z%X;Kepa~G-BIG(g}x}TR-_aeC+8JtwR5BW9Wi$ubNGtM`b zKuFiDo~UOm@rNxlpSEFdIAhT=hirUHO%f?e?Zxv^Xmd>JQ4^VFUxlH+4HEDq=ya} zjH$*s`cquWs7RGhoiWqr1WH4gQH$-&kCBYgM&UzfsGknnSyf*-hAObKwAuT%VTr3G z8!6d&5mz65%!=}OoMlRME?oKLpaO0-%|6usI6O{GBeVAM6Jd@ftulD<l#nY-V1s*s>Rrjve@>deXBb1m-cXxKNY-3~2Hb z(8MliooZ>LU_N!*!Yn;-LqC(l*BGP3E6KJ1;}k3BqNnkb@AFs+$%F&V1-lesKtb1G zU+UQ+ZYY{$+tC^1j0;qBh(9V1@>XtNgIn0mFw5A*Aq3jJ9zAiRHPluu5f*bG$q0^g zO4lho(p5do@U6`U9PM@_Ip`lC&*{QNBO7y6+TWp!)KyZG5g0;Uh4$hGA(P{;4Ua>L zZ1&@(XkNS8B-~?kSeLd$7`AlhIc>u4ow%H{9-lcgv6s+R98C9Fi+z~lAOlkSWLCMS zS=a^V0t+tk%60J=uW z3nuIZ^XK*MWluQV3{>nx$$*qRnRQ`^oR-*4lUI=U zwc;tY<6gX;bcXV2-}_wjT<9JKA9 zysYSH+Hy|i@ys{`I>m#U7H7fq(}ITpV{M+GO4W<1`gO*dlU2|up47CycR3GBjIN5E zb8L16<4q-xyPNrMp)9_p17A4QRhu1Mce(bUE;4qRKe?pp?<)K`t3uzo$={sSdFeN< zap<9AMXH>Yd(|}zWoiqTs7H@BtsA``h?a@dE*cfshZrXn|DbGcYtFj6hVk+P)^u(9 z^#qS#+u4pH29RiD-!IwqmK{w@W58lgy#@=K%M9_dVJ3w7o`8Bhlai5BA}?axMVp-y z{IznRij#wY-7npUCGHAt3;L9XBYBUSgz@vY41q*1N?qIL99 zrz&h`@P~Y*lMcT57@FPHsL&gpD~?3xLyQul-%nulM=KHNsf||(I6-yZoLf{_09vMD zR@b$$VSKm}Yj4ixRg*I~xXnH8RGX+8Yqjg|Fj{~8?tNm*m>#{e(|a?f8ySFDQ%<{p zCLL?lKcX|lzZUh>Z+a9W-1R@X)@$YXJ)utPU4?HiUDX2lfyfUHKa^+^-eu|TgG$al zbIOq+j^ka8_>O|bl${48)0;8GQ>fh1{d7_Z%*6nYtZ6dybahoTvd)<4lmmQ6S(#^c z-XCSZR}{xjIy+QV_c-I)&_B_nB;4GYGTx|t81*>ZMVDP)b5rIe-yvEr8~AtShq;c< zfM?>>zWA^F1t9mqmnRW5>Ep-iL=pal%nA)~9UY87w;$sb205($9%-_LRyeo;-!zzEwUv{GWb>osorbKS9IDd77-rW;g z$?eBXhTZwi@Pr{M(XdNk2@GE<+zjU#3SuCAU5Vmw-gu5g+st3CQgs$Rb>Jb1Qe|MP z)I(BLaXqR?dCZ_4mh<>^jkg(hE8R~iGFr|q1$cryYVAZyVBdT&Iolk4>ht8zTc}Cq z6p>cB644fA>yAnueDr#vUSZS6)ft{$!Qco0Cqz9)9TBCrPt#Y$q$WsTSC<8;9J=c< zdBC+D+bM&s^ye`8$}jZvHhn>=Jul4)$2P4Ch?WF#oI7}*U_GcEV#vz(r{Uh8jQSV+ z*7{V%Os?(3nlFjg*?Bz7&daBwcB?GN)TUA$6^rSrjra$MdwW#qtg2yjroDD*_kO^( zUrar{F1{eN(nN_%fuB?KTi&Xb_*34ZFp*=~Tt<7z8?1|&lda^TSD(06{TD(5%b6vZ zDHbxB_56H0zKO~xX5g2b8QH*AfAh@DF6Zh!10rmOS{(c<)*bvmQLn$ zc=+;@JY7oDMcUI9d2#=XL~aInN>DYGG9`Biq6=GGuWLn0o+Bm>c>=xaZ9!_xXXU~C z%lps8U7;g>I0}hbzV|#&|8&vy?U9lY7MrAq?JS-DS$au@xTp*}iG>_8wXm?LUQEm# z-(51Ckd<5A_qD8@r6~md#-lkU(UHh0cuO(Rv^Er!Mj-1X9?6TIV<#&vuzlIoT-RTdNkz;$ax)Y57T$EiSCKB)!%UX2;4+1M+KwMWhr zb}S{tha;qSebrD7?H-FUSv`>kp7C}Yv1j~=c;nStxv|w9ajpKdWhzH5yliM__;J+o z+0Xf3O`UPs?Hpv&*3o~_u=uk3f}Gyax8gs`I!sL~m!I6G^+hM`yihOKg**Lohi@*Y z6V<|a>v#HZ2H@KU2ChdxD1p`HzdV5FkHnaKC0GLv6=E1X+4-S1X0KZHQYg_Cp_-DC z5}TOirz%)dF+R#kJ!p}%lNW6kdq=an2d07nCrtQ4j-bJ;y}eyKq%w4FXdtlFNPp?A z&I3fE`N5{-D&c7%JHc!(nr{1MV@*YI1hMc`V&wUJJ^m;=4etle^W6MaUkv6A!-W6% zp*ej3$7af>8Nr+KUv?J@esT>Itg)HD=8>7)sw-2)vsZ@a&jgH}zxcQtq2Ya!{li*mS+nY?lY1E;MG8?3!eR=Tv@N z$jHdBS4-T@pUL>*h&EAhyKH*c+56Um8W0zM?C$M-?C4jeir}4}ZQj)VBsd_c&4=^b51ApZ?M;E(Dg92_6T&LZP(u z)i)Y-`HB%RY9@Q`b<=!`)qp%lsfj|tHlD67f$5JXrCkB~6Sy3?RRJa`2kS$r?KIcCxO=ngq>L+k{5$RU z`{uhn;FaxHa;Q4>)WKBk>&J{@-)2NDy&fxM>=i0icg0cs11QT{3MPkug3vGq!7d;C zbN+Y4{|2fpAI$K79Lr0+&-sy>5c(sIzh6}8XKZ*}ZltY|n3iT(74WZBr*fGv#`X1E z<^25A;hzU5FNve-nwoI&vR_%k_+j@tvR#F9Al<%1{0%dbAqvZyf4P2hq38IKbM6~t zqD(^z3k6B#xF|lWQ4cUy>iz8*QiUg>+oz^Z7=fe%+PLB#|(?kc7;-2TM!Ma|i}v zlApJoHPqOIrHYlxV*n?Sx5LrV&XS4Hg1Mw2sdSs@C$i-o5PfJRhHiBqch3Efq<^>Q z!5A~~v?dcdk=JtQHDf1}fXvT1?Tn3$Z5F0gu{N?4 zZ7%A{P`SJVAd{61a6W;U37PA$FNM#Naa*=*ftZAX+3yB8TBmY>FV~VWF1PlnHGpk9 zrZq9Sr`#+3uauU8=;U3=I(dop5ga|Uk z96W2s+pnc&v&PJ9GrAwl#Z^3Tr}_{Vq!S2CeYlUH=wfzG$Zd_0o`_nPrmaW z3=M6anVGpyOKQ9VT6fxM*}&&NorwVy8B8ytnH?4E=CDZsqNBoxtzUST`V1e&b4P~4 z7A3cDyIilS!KwRcZ*QktVPS*J=QqCqBs~^({+SdTA8(9-F1T5RH-|1v5Aec`^`Hwu zL?Y4uTA;yFY+T&7@tK9nl3%d!lHY&4Hpy;gmovI+1%l5(h+39xHe18(kEo?<9Y0S@ zOcHwjqH;hRn5OQ2bnt-tvWls)|#4bE+cxgd!y}3@-|?toh_a`C4~Uk|6=kb->x)WF`0wlgd5abC=@FKL^aN*o#avTF0 zSbVlhOPH5wx*m(w)h#J00pioA0s0b;AE&F^t{j&P0Lx_Rj?INEkf>Ny6@0+cBUZT{lo8dX5VH|tzp@FRWruTP_u8yw=A34TOaYfHK^V_)U|;|QTW6d4 zZ~aUypDzCt2z_%HCyTXL>+^>|^ER0*j3QQ>SEr_?{t$3&qohen*Vb48IP_Q-bcFT` z;noSakQO!HFDnABSvpqN3`~G8g3zi^(7*GlY7GW$-HWEG+uF9Hn*L=et^f$))UNdc ze3otT1Kf77PIYyesfmfYhK7b}NY2%Y0j?bEk2b~L+V2Fd==AzEeacLLA7X;uEg|70_8a%g3k-aT%3B7{XOlSn6x(7~F6k_#E*eoqHWpVhP(q^*o_p_)zh#4u m9;xoAWpVFQe((iqceow7zJ0Xz%og=ug{Pa3Yt62R-2VcU2CupR literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/type_preview.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/type_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..a538149ca3d8951ec9bd2c8c2adefd9c1c140869 GIT binary patch literal 20477 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

p&0l$F=(Q?ZW@Hz$@o4>#fn8kSLA)*yK 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 UaSZEQeoz|lboFyt=akR{04>4x(f|Me literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/type_thumbnail.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/type_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..2bfd655e37de87d2e664da2e3abe90574560f3e6 GIT binary patch literal 6315 zcmb7}2{_dK+Q(5y5veR?%VQ@>L?MLid$w%Jl5HqsA6rjFlBEoju|1JtFf(P%*pkXJ zmKa8cp~w~nV{5GM&->@4mm^&wWd@Fw^Hadgdqt0|SSl zfvyz;1LG0!VmQJAj+htCz5u^i?ilOqGVCAx{LxsP4vw(hGjM=1FdRF1@M2^@=J0`o ztigt+daRR-Cm3ZFFTWNzI3(zE(>_=y5CZWG2nK&LFz5t%x&?cBh=lnBdyD8Bnp$|s zd$KYx@NpXIYTpbeFH-2{XT$c|R%!*iY^btYZ(5vM(%gOEp_R!p=Pmm&_;~t8 zf@RSnU8lOgv}hRRkRjodt`*0?!NRI@ZhE=J4YrXG(~ZdLy}R)JsD!$(RZKg>XZLHX z$X*Tk)(h;63>+%Lj0{Xn42+C%aSU2o3?d>7TwDxCjxZcP{O94nzxiL!|K-AeJ^zmn z`hTAPmxcWG{{L;E|L606z0d{oJ8_TkSxSnLx{&7D5T?8wj>TfF*Bw4j-scw-R2D2l zqn~eVgkqJLCOjgy*3fba3c_3SHC0tP_&5VGZrZn&L&Uc!DaV<9mtgr@z(m)y+uy&B z6H7N7!JUmimmj^6HD~YU_9|+*h1J2e_RX8LerBeL*JW62&(?bIRg7)@XaE|AD_)EH z??-U8UJw&XC6GuwGe?np`kny+W}?rZ^uv98d^+frL?V$p>61xYgA4Aajg9AS-A$Py z6D#f$Y=@bwEN<`Lb-8uxg`|02`@}>+ISywmlfixBL~7e_o}Qi)>yhGIM+`hYrygh` zETqH~T$_{xWu>K`_w@8=G@4!DgAWc4YQ#3-XijWLzCOKC7_>B|L3~RllXI9=vrIa_ zd`au~!PnGCEH$i}k@7hbT057@OG?s`colq`HMtYpDfMAfpOSdVxWK?bV=?aM24bSA zLK@upy^>2!+gNyJCUqNXD3RU?3$AnOA01uz6+)b=V&~xK`20D3?pJrV3M6(~wI@S@ z#lO0y<|$!HQP9!FrRPeK+Nq;H`Zx15WAj$Sz*=S6c4C?#95buEnzfC$7pUa?m@V|q z);w-|&j~~Yo{=GKvzwU6)`nZzp+m(5jEs$os;iZ8JsELvm=`a&ef<3gct}ow|XNzOc4C7wHp83h?Rl$q&<^#v)u6DXFQcYB9-g-(G}V>Rb$+ z8LaF7sAU_|>^eO&lc8oE7FG)xjPUZ3@C*OSf%$yrViCmk)~(X0SUH|_wJ_=vH@@lX z78W811=mazN&;P4`odmLVs&+u`*?ylA3HKW(i#nqTJ2U*R8=i$l!9J~-D?oh!ftOSQc7$f96Fpjl9%wxCGbFM%?uU*ROY1)-Ke||9LvYGD*{F0BK zA93UKkJdVFt~WNewh|#BAt?9k?Cgqn?@D&}Tw~~;)?(*B2`1`#Kp>FuT~6?^+(#e7 zH-C-6mO9P`Hn_or&YwR|+uL4}4YP2z8AmrYU7PwkFaY-t3>?{e=Eg^k`_gE8EmxND zL3ua3ByS})et9}O@M@{vYogE89Vr+;sPuy z3KiMxsF($xo0}_-mh1B#2rkFtZy}LLfkCB|d620K(jvjRiN?mpM&CIPGj-}=k3ISH zNv}wTLMHp-kD;ujrzQxb)z~j@par$HVdmZJ6lbT+GxTt*B!4bkzofL(sI;`y!_)Iq zuy&xozrp?cZx_#r8--RT?1p)7l)OP7Ar(9o!1{Js(nXLBHt4N*pcL&e_*wB?Z>K3tz$Sh(rS zGC4U(BRK|UrI?zSNF`0<@%SoPuhkVNpF6k52M0lRdp=Pl5^(dgqk+4aAcFROgS8M4@?4u^Dp)OI-O>FKdvtp$-k6nmM2g9G(EH(XsF3WZLr z(nFDg_1WH{%^^YLU22qu9TSs---%RV&C3)z0)Z&PV$Il&%nL9!k1MpcwxTvx78c5@ zYHMY?kJXM~*52Rs6~%7`?{2NT@B2r>U>UE*-@bjD8+VU#-80CCy*Z%4)pcC8l^mJ`9qAGZJ12%Pcit4x!AD@6&Lv< zWMjd>lRYLh)b{t5KY}(ZH?GVwN${~#pT++;TF|9u?cx$}wWgv%bbfxmZS1%vboyD2 zX6#t7T&@|R@@}t3P>_{F1BpmX4s5~xbBFaZqweD-(qIu)xyF;TA#jf2hhdp-W8eCFVldAn!V_F{p{JZ z_QjFfYMA1Jou1xfMWyu^g~G40NW)lQM^Y_fB=*_eTBly{+|%3dOml zCA*YVaI0i~R6)7==@Y|WzoxNr3bogc$CN2Cl1QZEAv08e!BiMMFZ~`?lC6*rCzD7C zSfNKLUb*4}d*I0H?cgUeYk{vF|6(A3k0@RjR4JUk|Cu1!(WKqZR8)rHVlY$g!c z#2ba&iMmx`qXh+`{Cs?>1L9w<<(u;#AH#rR>&aD{`L#}?11-DV%X=StM$6s3aPdwd zP%eF&z}k`XDgmQ!C_iIiFh?FB)EkQT z%uXN6=`rKvs=_`Uy)G2L&MX7psb1j{nA64v=^VBnM~d&Ah??ow=a zO$fBkiH2z2dCcj>Tb~Tcr9L&)`lf5w9j4j7QB{r3^@c!fYDRknBt-=H`1mY@yeqQZ z_-Mm-^RrS;^YC=C3P+`_hnUazw5SR=J39w`|L|C2Kc{W-;_mqTdgox7-Bg=!EW9gJ znnIxjtxV`KePF9k)~dAmG#XGlFf?TS^u7l$ZBERy_03HJeRT%Fi(V&zkWn0Rf{Wq7 zZ$O!gw=Ug2H5td=ng%oo)Sv!deg9n5$2)JWhaKW4rDG$kAHK}aPB#!MQ1UEK^&n>D zSeb0=?DZUL-Pvi7JAXc_$=2S!Bzn*Da?5QCkT<4nGP1ItW>%-B9;;lu zcnO=v74}sn?>*C1E1&Eq9 zXy>{(&-Com9oi>eSE;Z)qtg7mdTxTt}qx31#xJ5yKzbopMN$3ak&cN7}GOM4zmztd286p{*_; z>OML@<2&xWeK}eO)h|!wl$Mf8BOnxvt*z4m&>I43q|+nV5?Z<0Sxf~J(Kn5n=+kHU z1q6bFEkTwd_r^&i3E(4E_V!W-ga}Y9hVjJnwp3xjs%cN39<@&Q32V9K>}+%ON=PfI zK3jHiagjE@zh^f`c$t&aRd?A9R1-Zr?+SFf+MalCZzrNIcE4$E)ydg8?CO3*C^ANPfTm?{9T&S8EVM|q@24a~_EnjgX)~Jp4rk7sftN0TnE7a1N?gbX zWpn_mS2h5)_N{5u29Dc$SskcQZ$$0F{CxWN?`}m|&*!fX4GLXVQ-cWWMsZnNTa&+a zp_-dr0V-~;Z!ZX)R=svD?~+Kca&k@0<)Y?qssvXT<%_y8u&<@njrDbP=ut~R>6lzy zl36Z=x7B4^7+9CssiV?MD~+3Dge|2-Aea&0TV_;|Y@{oJX<2+Y2h9UmMlN=9gni^Z z=mYYE@eK`f-|v0hxC?x^#@O~Kbca264|2~4jBjlfg}MMmD@m+|-YeL*JQig5NQ{YAQ6<#+-)w@q%mEl=#K zyk@wgN*GT(dc^teM1TJa+BsGx#wpPu=8vEaw1W6SAj;waG8tBT?V%c72`55r&4e6W zEiGRSAX7?N+`?w^^YUsMkIf@_ag&kpV`F0)A+|rMKS)EWR2l*i%_S;oV`F1wV{_n9 zsAG}t?yUp&y&9L#o;mZns_G`_#?WLyz2eUeURn(qu8N*XmN{2ZT`evgyYqGuI!s|1 zrOd&T+9o^d#>9y#7PoHsMw&{t7Hnr^y{}Yz1A4$`$;pPXvCVTZz!K=LW+?>)&HmHR z@Al+aBDKw~wLbj$H@IFKPH1&=0I4k@E6&YUC8Uh_E4J1BPYxmMl`fiN% zkw@3h4UdiSq_$0l2f?wWx2&v0|IX$oV=p>2gj)ic+<%#p{Os9+k}!}m_|N-cVVi!9 z)ati0>$?p`cc0aAlPRkjD_=HL~dD@-W_B4FFQF+|YXf&nL2^n;CrIj`=c*14+gE32XDz79z&$~T{UHz^eeng- z-Vb9sVI)o!wo%^Clb@TbTphBwB@oPblAR^&hE5Q(A!wu{JkPU6e9vf;TsC90A71o_JnP zPHNDu{@7?_l%Jn*z4}nV*Y2qxpH1~&VEiEHYVlX%Z|rZgd4kzkcJ- zg_>=wh36vqZQb47J0B?`2pJ*B$b%1XF}vH?&e3XN>rL*y+!Y*5^}=jjR#x`ev}pg* zE#PEtp9b5cPVM{#`oH$D@o32o533tDZv5C-93fZlo+Y_IY8v$ zT22lQeJOa)Z24TUtGGiGz;7I2O-V^fmGVzJlx?mI4G}s!;cQx>&Ff!dX&sWCGJ4O) zL!U%0e|r$My;y5x1BE~qzrtuCC*Oc=^$ZWUcWDSe2V9#v-mCx!(z<7;6o>2GqVw|b zx*I~3*J5%eZ>VR5DfEtT}SPbU;Jf&l4lK^N!V8|jE>r^MI;L>2>#oQD{ zw`$s<5po?;#l^+BlW&M~CwdbbOG*q_SXfe`IUh|=dwFsr0az}7*CDO|k5t3zeLes6 z=iHoS4P280JYUfy5E7cJ7S_|}Cm2R2YzwMYIDf43WdQzIlb!;cCdhV0@m$E{XO0nc z@5smqm}y8|x^$_cp`mvQnQ3C1hAo=(T zTH_$Mw&Ru~8_66V8banhr+P?iS+Y*$HjOPUEz!>QplhamPY{-oT~8qj?=2_joDHp- z_pdybLi`Z$sNj!3-iID~9VHhVA)_cl}_z)n=>Rs}Y!#QWHlIt3d)F(-UM<#u@~+Tufa=}vo2 z@gWMbsug&=%)v}4`G#k7v@<|qFaE2nxCKlBCkX(%v>j2L}VE> zK{+=`_dvs+zg6sZl1p_RV0(V-p2HQh88Jr2c7T5sm-+!yLh|phFfkQB!EW3mOWtV2 zzGQu%0fg>gY(^Y#t{rKd$wI60zcgg~b58p2M%Mq>Tm93d_&<)M|KrFRJoZ1H|ECZ7 p$C3KK@BRL~?cbljcV?Hf;QJwNrrsy12mdoL)HBn?UcdeOe*tN_0pb7v literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index 7432f9cde639a..0c4b67c3514d1 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -485,4 +485,17 @@ number">%d remaining attempts before SIM becomes permanently unusable. Fifty\nNine + + Default + + Bubble + + Stretch + + Type + diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockInfo.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockInfo.java new file mode 100644 index 0000000000000..812f2156d5d96 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockInfo.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.keyguard.clock; + +import android.graphics.Bitmap; + +import java.util.function.Supplier; + +/** + * Metadata about an available clock face. + */ +final class ClockInfo { + + private final String mName; + private final String mTitle; + private final String mId; + private final Supplier mThumbnail; + private final Supplier mPreview; + + private ClockInfo(String name, String title, String id, + Supplier thumbnail, Supplier preview) { + mName = name; + mTitle = title; + mId = id; + mThumbnail = thumbnail; + mPreview = preview; + } + + /** + * Gets the non-internationalized name for the clock face. + */ + String getName() { + return mName; + } + + /** + * Gets the name (title) of the clock face to be shown in the picker app. + */ + String getTitle() { + return mTitle; + } + + /** + * Gets the ID of the clock face, used by the picker to set the current selection. + */ + String getId() { + return mId; + } + + /** + * Gets a thumbnail image of the clock. + */ + Bitmap getThumbnail() { + return mThumbnail.get(); + } + + /** + * Gets a potentially realistic preview image of the clock face. + */ + Bitmap getPreview() { + return mPreview.get(); + } + + static Builder builder() { + return new Builder(); + } + + static class Builder { + private String mName; + private String mTitle; + private String mId; + private Supplier mThumbnail; + private Supplier mPreview; + + public ClockInfo build() { + return new ClockInfo(mName, mTitle, mId, mThumbnail, mPreview); + } + + public Builder setName(String name) { + mName = name; + return this; + } + + public Builder setTitle(String title) { + mTitle = title; + return this; + } + + public Builder setId(String id) { + mId = id; + return this; + } + + public Builder setThumbnail(Supplier thumbnail) { + mThumbnail = thumbnail; + return this; + } + + public Builder setPreview(Supplier preview) { + mPreview = preview; + return this; + } + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index 3217ca6f489c8..95981427b6423 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -17,12 +17,15 @@ package com.android.keyguard.clock; import android.content.ContentResolver; import android.content.Context; +import android.content.res.Resources; import android.database.ContentObserver; +import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.view.LayoutInflater; +import com.android.keyguard.R; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.statusbar.policy.ExtensionController; import com.android.systemui.statusbar.policy.ExtensionController.Extension; @@ -45,6 +48,7 @@ public final class ClockManager { private final LayoutInflater mLayoutInflater; private final ContentResolver mContentResolver; + private final List mClockInfos = new ArrayList<>(); /** * Observe settings changes to know when to switch the clock face. */ @@ -76,6 +80,36 @@ public final class ClockManager { mExtensionController = extensionController; mLayoutInflater = LayoutInflater.from(context); mContentResolver = context.getContentResolver(); + + Resources res = context.getResources(); + mClockInfos.add(ClockInfo.builder() + .setName("default") + .setTitle(res.getString(R.string.clock_title_default)) + .setId("default") + .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.default_thumbnail)) + .setPreview(() -> BitmapFactory.decodeResource(res, R.drawable.default_preview)) + .build()); + mClockInfos.add(ClockInfo.builder() + .setName("bubble") + .setTitle(res.getString(R.string.clock_title_bubble)) + .setId(BubbleClockController.class.getName()) + .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.bubble_thumbnail)) + .setPreview(() -> BitmapFactory.decodeResource(res, R.drawable.bubble_preview)) + .build()); + mClockInfos.add(ClockInfo.builder() + .setName("stretch") + .setTitle(res.getString(R.string.clock_title_stretch)) + .setId(StretchAnalogClockController.class.getName()) + .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.stretch_thumbnail)) + .setPreview(() -> BitmapFactory.decodeResource(res, R.drawable.stretch_preview)) + .build()); + mClockInfos.add(ClockInfo.builder() + .setName("type") + .setTitle(res.getString(R.string.clock_title_type)) + .setId(TypeClockController.class.getName()) + .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.type_thumbnail)) + .setPreview(() -> BitmapFactory.decodeResource(res, R.drawable.type_preview)) + .build()); } /** @@ -101,6 +135,13 @@ public final class ClockManager { } } + /** + * Get information about available clock faces. + */ + List getClockInfos() { + return mClockInfos; + } + private void setClockPlugin(ClockPlugin plugin) { for (int i = 0; i < mListeners.size(); i++) { // It probably doesn't make sense to supply the same plugin instances to multiple diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockOptionsProvider.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockOptionsProvider.java new file mode 100644 index 0000000000000..5ef35be8df51a --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockOptionsProvider.java @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.keyguard.clock; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.os.ParcelFileDescriptor; +import android.os.ParcelFileDescriptor.AutoCloseOutputStream; +import android.text.TextUtils; +import android.util.Log; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.Dependency; + +import java.io.FileNotFoundException; +import java.util.List; +import java.util.function.Supplier; + +/** + * Exposes custom clock face options and provides realistic preview images. + * + * APIs: + * + * /list_options: List the available clock faces, which has the following columns + * name: name of the clock face + * title: title of the clock face + * id: value used to set the clock face + * thumbnail: uri of the thumbnail image, should be /thumbnail/{name} + * preview: uri of the preview image, should be /preview/{name} + * + * /thumbnail/{id}: Opens a file stream for the thumbnail image for clock face {id}. + * + * /preview/{id}: Opens a file stream for the preview image for clock face {id}. + */ +public final class ClockOptionsProvider extends ContentProvider { + + private static final String TAG = "ClockOptionsProvider"; + private static final String KEY_LIST_OPTIONS = "/list_options"; + private static final String KEY_PREVIEW = "preview"; + private static final String KEY_THUMBNAIL = "thumbnail"; + private static final String COLUMN_NAME = "name"; + private static final String COLUMN_TITLE = "title"; + private static final String COLUMN_ID = "id"; + private static final String COLUMN_THUMBNAIL = "thumbnail"; + private static final String COLUMN_PREVIEW = "preview"; + private static final String MIME_TYPE_PNG = "image/png"; + private static final String CONTENT_SCHEME = "content"; + private static final String AUTHORITY = "com.android.keyguard.clock"; + + private final Supplier> mClocksSupplier; + + public ClockOptionsProvider() { + this(() -> Dependency.get(ClockManager.class).getClockInfos()); + } + + @VisibleForTesting + ClockOptionsProvider(Supplier> clocksSupplier) { + mClocksSupplier = clocksSupplier; + } + + @Override + public boolean onCreate() { + return true; + } + + @Override + public String getType(Uri uri) { + List segments = uri.getPathSegments(); + if (segments.size() > 0 && (KEY_PREVIEW.equals(segments.get(0)) + || KEY_THUMBNAIL.equals(segments.get(0)))) { + return MIME_TYPE_PNG; + } + return "vnd.android.cursor.dir/clock_faces"; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, + String[] selectionArgs, String sortOrder) { + if (!KEY_LIST_OPTIONS.equals(uri.getPath())) { + return null; + } + MatrixCursor cursor = new MatrixCursor(new String[] { + COLUMN_NAME, COLUMN_TITLE, COLUMN_ID, COLUMN_THUMBNAIL, COLUMN_PREVIEW}); + List clocks = mClocksSupplier.get(); + for (int i = 0; i < clocks.size(); i++) { + ClockInfo clock = clocks.get(i); + cursor.newRow() + .add(COLUMN_NAME, clock.getName()) + .add(COLUMN_TITLE, clock.getTitle()) + .add(COLUMN_ID, clock.getId()) + .add(COLUMN_THUMBNAIL, createThumbnailUri(clock)) + .add(COLUMN_PREVIEW, createPreviewUri(clock)); + } + return cursor; + } + + @Override + public Uri insert(Uri uri, ContentValues initialValues) { + return null; + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { + List segments = uri.getPathSegments(); + if (segments.size() != 2 || !(KEY_PREVIEW.equals(segments.get(0)) + || KEY_THUMBNAIL.equals(segments.get(0)))) { + throw new FileNotFoundException("Invalid preview url"); + } + String id = segments.get(1); + if (TextUtils.isEmpty(id)) { + throw new FileNotFoundException("Invalid preview url, missing id"); + } + ClockInfo clock = null; + List clocks = mClocksSupplier.get(); + for (int i = 0; i < clocks.size(); i++) { + if (id.equals(clocks.get(i).getId())) { + clock = clocks.get(i); + break; + } + } + if (clock == null) { + throw new FileNotFoundException("Invalid preview url, id not found"); + } + return openPipeHelper(uri, MIME_TYPE_PNG, null, KEY_PREVIEW.equals(segments.get(0)) + ? clock.getPreview() : clock.getThumbnail(), new MyWriter()); + } + + private Uri createThumbnailUri(ClockInfo clock) { + return new Uri.Builder() + .scheme(CONTENT_SCHEME) + .authority(AUTHORITY) + .appendPath(KEY_THUMBNAIL) + .appendPath(clock.getId()) + .build(); + } + + private Uri createPreviewUri(ClockInfo clock) { + return new Uri.Builder() + .scheme(CONTENT_SCHEME) + .authority(AUTHORITY) + .appendPath(KEY_PREVIEW) + .appendPath(clock.getId()) + .build(); + } + + private static class MyWriter implements ContentProvider.PipeDataWriter { + @Override + public void writeDataToPipe(ParcelFileDescriptor output, Uri uri, String mimeType, + Bundle opts, Bitmap bitmap) { + try (AutoCloseOutputStream os = new AutoCloseOutputStream(output)) { + bitmap.compress(Bitmap.CompressFormat.PNG, 100, os); + } catch (Exception e) { + Log.w(TAG, "fail to write to pipe", e); + } + } + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockInfoTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockInfoTest.java new file mode 100644 index 0000000000000..d2b265401cc4c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockInfoTest.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.keyguard.clock; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.verify; + +import android.graphics.Bitmap; +import android.test.suitebuilder.annotation.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper.RunWithLooper; + +import com.android.systemui.SysuiTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.function.Supplier; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@RunWithLooper +public final class ClockInfoTest extends SysuiTestCase { + + @Mock + private Supplier mMockSupplier; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testGetName() { + final String name = "name"; + ClockInfo info = ClockInfo.builder().setName(name).build(); + assertThat(info.getName()).isEqualTo(name); + } + + @Test + public void testGetTitle() { + final String title = "title"; + ClockInfo info = ClockInfo.builder().setTitle(title).build(); + assertThat(info.getTitle()).isEqualTo(title); + } + + @Test + public void testGetId() { + final String id = "id"; + ClockInfo info = ClockInfo.builder().setId(id).build(); + assertThat(info.getId()).isEqualTo(id); + } + + @Test + public void testGetThumbnail() { + ClockInfo info = ClockInfo.builder().setThumbnail(mMockSupplier).build(); + info.getThumbnail(); + verify(mMockSupplier).get(); + } + + @Test + public void testGetPreview() { + ClockInfo info = ClockInfo.builder().setPreview(mMockSupplier).build(); + info.getPreview(); + verify(mMockSupplier).get(); + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockOptionsProviderTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockOptionsProviderTest.java new file mode 100644 index 0000000000000..0cd6f9af8ffb0 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockOptionsProviderTest.java @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.keyguard.clock; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.verify; + +import android.database.Cursor; +import android.graphics.Bitmap; +import android.net.Uri; +import android.test.suitebuilder.annotation.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper.RunWithLooper; + +import com.android.systemui.SysuiTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@RunWithLooper +public final class ClockOptionsProviderTest extends SysuiTestCase { + + private static final String CONTENT_SCHEME = "content"; + private static final String AUTHORITY = "com.android.keyguard.clock"; + private static final String LIST_OPTIONS = "list_options"; + private static final String PREVIEW = "preview"; + private static final String THUMBNAIL = "thumbnail"; + private static final String MIME_TYPE_LIST_OPTIONS = "vnd.android.cursor.dir/clock_faces"; + private static final String MIME_TYPE_PNG = "image/png"; + private static final String NAME_COLUMN = "name"; + private static final String TITLE_COLUMN = "title"; + private static final String ID_COLUMN = "id"; + private static final String PREVIEW_COLUMN = "preview"; + private static final String THUMBNAIL_COLUMN = "thumbnail"; + + private ClockOptionsProvider mProvider; + private Supplier> mMockSupplier; + private List mClocks; + private Uri mListOptionsUri; + @Mock + private Supplier mMockBitmapSupplier; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mClocks = new ArrayList<>(); + mProvider = new ClockOptionsProvider(() -> mClocks); + mListOptionsUri = new Uri.Builder() + .scheme(CONTENT_SCHEME) + .authority(AUTHORITY) + .appendPath(LIST_OPTIONS) + .build(); + } + + @Test + public void testGetType_listOptions() { + Uri uri = new Uri.Builder() + .scheme(CONTENT_SCHEME) + .authority(AUTHORITY) + .appendPath(LIST_OPTIONS) + .build(); + assertThat(mProvider.getType(uri)).isEqualTo(MIME_TYPE_LIST_OPTIONS); + } + + @Test + public void testGetType_preview() { + Uri uri = new Uri.Builder() + .scheme(CONTENT_SCHEME) + .authority(AUTHORITY) + .appendPath(PREVIEW) + .appendPath("id") + .build(); + assertThat(mProvider.getType(uri)).isEqualTo(MIME_TYPE_PNG); + } + + @Test + public void testGetType_thumbnail() { + Uri uri = new Uri.Builder() + .scheme(CONTENT_SCHEME) + .authority(AUTHORITY) + .appendPath(THUMBNAIL) + .appendPath("id") + .build(); + assertThat(mProvider.getType(uri)).isEqualTo(MIME_TYPE_PNG); + } + + @Test + public void testQuery_noClocks() { + Cursor cursor = mProvider.query(mListOptionsUri, null, null, null); + assertThat(cursor.getCount()).isEqualTo(0); + } + + @Test + public void testQuery_listOptions() { + mClocks.add(ClockInfo.builder() + .setName("name_a") + .setTitle("title_a") + .setId("id_a") + .build()); + mClocks.add(ClockInfo.builder() + .setName("name_b") + .setTitle("title_b") + .setId("id_b") + .build()); + Cursor cursor = mProvider.query(mListOptionsUri, null, null, null); + assertThat(cursor.getCount()).isEqualTo(2); + cursor.moveToFirst(); + assertThat(cursor.getString( + cursor.getColumnIndex(NAME_COLUMN))).isEqualTo("name_a"); + assertThat(cursor.getString( + cursor.getColumnIndex(TITLE_COLUMN))).isEqualTo("title_a"); + assertThat(cursor.getString( + cursor.getColumnIndex(ID_COLUMN))).isEqualTo("id_a"); + assertThat(cursor.getString( + cursor.getColumnIndex(PREVIEW_COLUMN))) + .isEqualTo("content://com.android.keyguard.clock/preview/id_a"); + assertThat(cursor.getString( + cursor.getColumnIndex(THUMBNAIL_COLUMN))) + .isEqualTo("content://com.android.keyguard.clock/thumbnail/id_a"); + cursor.moveToNext(); + assertThat(cursor.getString( + cursor.getColumnIndex(NAME_COLUMN))).isEqualTo("name_b"); + assertThat(cursor.getString( + cursor.getColumnIndex(TITLE_COLUMN))).isEqualTo("title_b"); + assertThat(cursor.getString( + cursor.getColumnIndex(ID_COLUMN))).isEqualTo("id_b"); + assertThat(cursor.getString( + cursor.getColumnIndex(PREVIEW_COLUMN))) + .isEqualTo("content://com.android.keyguard.clock/preview/id_b"); + assertThat(cursor.getString( + cursor.getColumnIndex(THUMBNAIL_COLUMN))) + .isEqualTo("content://com.android.keyguard.clock/thumbnail/id_b"); + } + + @Test + public void testOpenFile_preview() throws Exception { + mClocks.add(ClockInfo.builder() + .setId("id") + .setPreview(mMockBitmapSupplier) + .build()); + Uri uri = new Uri.Builder() + .scheme(CONTENT_SCHEME) + .authority(AUTHORITY) + .appendPath(PREVIEW) + .appendPath("id") + .build(); + mProvider.openFile(uri, "r").close(); + verify(mMockBitmapSupplier).get(); + } + + @Test + public void testOpenFile_thumbnail() throws Exception { + mClocks.add(ClockInfo.builder() + .setId("id") + .setThumbnail(mMockBitmapSupplier) + .build()); + Uri uri = new Uri.Builder() + .scheme(CONTENT_SCHEME) + .authority(AUTHORITY) + .appendPath(THUMBNAIL) + .appendPath("id") + .build(); + mProvider.openFile(uri, "r").close(); + verify(mMockBitmapSupplier).get(); + } +}