From 73203ebf976c403e40deabc15beb5ef01ac20cb0 Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Tue, 15 Apr 2014 16:14:46 -0400 Subject: [PATCH] Interim quick settings update. Make existing QS panel available via pulldown from header (or keyguard status view on keyguard), update the affordances as a hint. Don't allow QS to scroll, cap to max rows. Add scrim over panel to indicate that this is purely temporary. Bug:14081801 Bug:14059974 Change-Id: I166033975cbc44b91f45ee70ea5c7540390670dd --- .../drawable-hdpi/ic_notify_open_normal.png | Bin 1297 -> 685 bytes .../ic_notify_quicksettings_normal.png | Bin 1510 -> 623 bytes .../ic_notify_open_normal.png | Bin 1254 -> 0 bytes .../ic_notify_quicksettings_normal.png | Bin 1489 -> 0 bytes .../ic_notify_open_normal.png | Bin 893 -> 0 bytes .../ic_notify_quicksettings_normal.png | Bin 1097 -> 0 bytes .../ic_notify_open_normal.png | Bin 1607 -> 0 bytes .../ic_notify_quicksettings_normal.png | Bin 1931 -> 0 bytes .../ic_notify_open_normal.png | Bin 3524 -> 0 bytes .../ic_notify_quicksettings_normal.png | Bin 3868 -> 0 bytes .../drawable-mdpi/ic_notify_open_normal.png | Bin 940 -> 537 bytes .../ic_notify_quicksettings_normal.png | Bin 1147 -> 506 bytes .../drawable-xhdpi/ic_notify_open_normal.png | Bin 1647 -> 939 bytes .../ic_notify_quicksettings_normal.png | Bin 1969 -> 812 bytes .../drawable-xxhdpi/ic_notify_open_normal.png | Bin 1758 -> 3651 bytes .../ic_notify_quicksettings_normal.png | Bin 2083 -> 3614 bytes .../SystemUI/res/layout/flip_settings.xml | 18 +- .../res/layout/status_bar_expanded.xml | 2 +- .../SystemUI/res/layout/super_status_bar.xml | 4 +- packages/SystemUI/res/values-land/config.xml | 3 + .../SystemUI/res/values-sw600dp/config.xml | 3 + packages/SystemUI/res/values/config.xml | 6 + packages/SystemUI/res/values/dimens.xml | 3 + packages/SystemUI/res/values/internal.xml | 22 + .../phone/NotificationPanelView.java | 36 +- .../statusbar/phone/PhoneStatusBar.java | 401 +++++++++++------- .../phone/QuickSettingsContainerView.java | 141 +++++- 27 files changed, 467 insertions(+), 172 deletions(-) delete mode 100644 packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_open_normal.png delete mode 100644 packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_quicksettings_normal.png delete mode 100644 packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_open_normal.png delete mode 100644 packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_quicksettings_normal.png delete mode 100644 packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_open_normal.png delete mode 100644 packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_quicksettings_normal.png delete mode 100644 packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_open_normal.png delete mode 100644 packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_quicksettings_normal.png create mode 100644 packages/SystemUI/res/values/internal.xml diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-hdpi/ic_notify_open_normal.png index 092b5613931b1869b66cdd436404571cb785e54c..3c0dc4e00b5b0e1ba31dba5474959ffa870019a4 100644 GIT binary patch delta 593 zcmbQpwU$+}Gr-TCmrII^fq{Y7)59eQNE?GN2OE&IT4YWU|i(s;uw-~@9ow7ej3gkI-esl5M!L(RcRPj#3M>dYRy&E?+M!i{ZnaRUs_I%d# z$6jfCr{BGq_pEx?Ov}&v?i(9h8k>o+I0}H#1(}GW=4+L8 z=-&Fbyw`kbdUf9sk-n#v$3k94&KH__bml#a!#OW!zIG8Sytvq-om*$xyuTYyNUbw= zu0I#E`&d+Fd*2DZcUf$Io5M5jzAlM5DqH5&Efex4LbfjP^~GOnOZIh{@p*Y{DVX%L zWZj0K;`dy2Der6@vqO}MEza|N7UlL&(OFVoS~@2=?}n21jx#(TIgM@8&Mx^{8k3Y6 zq4avk$tm>*ju;!Of3TZe+5B~xYgu7@@DJ%~=4bDh&e3|e@%EGx3xCPJRyUJ=b{t4r zysTaE(p4Mlxm9wT?K3_EhTpL6;SXN2y4>b#sYRAj$)&^pA3W7i(fSp?RI+y?e7jT@qQ9O}q9De{v0000;07l7cJ^%m%;Ymb6 zRA}Dq*-eZkQxpgAU%mHQ&$Kq0#1M>#m>2{>Y(>}!2|EkIN+Mw~R>sE6f>>B!e9TfZ zGKr0qJxdwE#+VI}5JLMl#?aGUWpVF)bzi;LpQw6~K1t=>y6@hq^S|fZbN=@f+p;bH zi4>a|Tz^$ne%p&zmr};729haRLSApWG$XCk&?)VkC{s8saJSWaHF;2>tfdmuLY!x?UVQz z=L!2DC7ZLD$7lG!CX;AelA=}u^qk;6*Wk}MW)|PzVC!`8kfG zXaY$Jr|eA~5T>7N4PlP6TWVJl_tUELJCHF~ngpVp(9Wf=eU8$V8eL@uLg8k0mYoT0K ztVJ4|G=6HCZ?5ddmtwrM+NGpZs(+%P*hYYj(E4eStyJR^`@Itn<9F>_ro_2;4{vC& z-^&F?S*|j_|3QsIs%s{!X0*@KIWo__-K6&MHw z?h{=ry&90TM;^z$_|3S_r#4nJa0`PlBg3pY5)2HC8J;eVArXh)PO|lLa+Gk@S70@{4NdN<9i;VOU^OpI?<9*J|d3W}X_4Bh&ChLfG zA5Hqn{Ndu0Uk(36>wRl(Cxexi!dp2-#)k0fo3(D~n+|8*AYW%H+dy@7F|TH+c} zl9E`GYL#4+3Zxi}3=EBR4Gnb-O+ySUt&GjAjE!{-OsxzI96$M5qiD#@PsvQH#I3<# T{nvJ&1_n=8Hb0kjP6H delta 1432 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 diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_open_normal.png deleted file mode 100644 index c98911c903cd87c4d36b6c90e6dc428c8243a214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Nu!3HGf><~N!q*&4&eH|GXHuiJ>Nn{1`8HnTu$sZZAf7)d{-_&JEnAYe zy9>jA5L~c#`DCC7XMsm#F#`j)FbFd;%$g&?z`#`G>Eaj?aro@@o!w%N0<0hI*SuS| zLgSwJB8iR_jWa4$7A>l8OHk-gQkyla!~I#Sf>IkBS6fr(!ih?88ft1v_cq7`kM3yimT;Nq@aKqo zO_l%)&(Y#ai`b_88$F^H6Xv@Jp1YiJ=+oXZwubEwKbvk#5S_REV8_Qb%Ae%JPD5`>BCRTV;=%>W8%#*fNxE z6y04I5xYWm3a5+s{Etf=1!}93t{zpJ6J-2E=9~Kk*H!n9++60)mBD^))yto3uM0W5 z1ODo7jFNo$l5NNQtef-v*Q>3vIP`FTfkB|vr@wj+#ruvF2dtIszv!v3jO~)w=2lCA z&x|phd%v?Zup7$ziQHXq?zZ{ak_gph57WBLuKhANFTwbG{@kf&3fWTwMOLkn5?mc} z);D_BkxvQkPi{$UytVY)>j&9S?=J52kimTt^z@TyZfVdt(X+c8&G-t?!n(OF49S+ zpW+*hZ>-oi+v;PTUf(09*-56+{%ibJWIvcLXZ`D=jeV#4js=k$XX#aW+&O#WWBXRM zFyWHW$Bk>%j`Dw8vf=(8&--6?U)f&=Op>Z4t`Q|Ei6yC4$wjF^iowXh&{)^NQrEyF x#L&#j$lS`nLe~ID8f^2>0%Zq;hTQy=%(P0}8jg!j+6mOa;OXk;vd$@?2>_(hb=3d> diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_quicksettings_normal.png deleted file mode 100644 index bb9902248db32e58a67487598cb47e4de66333d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1097 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z!tfsi7wla=87RV8;1OBOz`!jG!i)^F=14FwFxz>$IEF+VK70LacC4!e+lTu*<$YiF znuQ6hY6@U={Kd|Z#l6~@jG|c*GXZYfr0V!ndS2;_owmQ*5O?;<<-u(nfacFD!9^Y zgI?dPd%5Yr+#B8XkE;*y{pniIRBWAhXzD4USoPOi_wg6<%@;Yaz*X%b=bhgA3&(|? zeaLftAZXLEpDEbSU{y(68!~PLXAqF7gpH$Z4mJi(>mjn@Q?55;R|0?_Z?Tt zJ1CpDw|nC|uNPaz8sp}ylCND`*ZVS2{oLcqnrlWsb1iymH-22OH2rBpbCA#M4>>t; z9->Y5k4}F0y`kvpGyx5}zaD+PjyqQ8Ia^lvvy_GYD&4t2{&V)u1$GXcXVeN}Kbh*C z_-HWE!SK9xg|1(KkIjVUb>8Q~#Uit2$uLd4<@(&!(jeW6bBe2?efe7@|E|IzDTIKj4ZBK*vN5glV@%3GoD`eQ6?uTXzY7|B4nTTsK9iEZz zE!-u4cx{Dj{_$D07G1wTwsRWISg<90YslB^GZsln>Ty#~ziuq>JT$*T*#5-R+GAFi z3v7-0wsQJEZdNE=HI^zr*DmQ zZ~Bu1^P;-apRC%tI!jr*_(#;9=I=?(N0((zdtxr=>A>f=kTT{rG%vB2!5TH+c}l9E`GYL#4+3Zxi}3=EBR4J>sH xOhOFJtc=X93`}(mfTY3o`QArSH00)|WTsW(*0Ai*=SrXk22WQ%mvv4FO#sF)(qaGr diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_open_normal.png deleted file mode 100644 index d9d8b137164922f0cfd540a790cd0e017ca1503d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1607 zcmZ`(dsNZ~6#k*00&0?3qSg>pOw-{bO{^IP{h;z0K8of0kt+i8tu-Dg;-g%-CYGt3 zTACG_GgH(>7c@YaApig{ zpi#+z8ur%Upq`GVOUlIK8iK}?d`JNBs0g_p3DamuQXuFJNE8-R8i9$X2KoR%rZoU? zF9E>XriL|s3IPD7BLILX0)QQ?YvDf~*39Ze9RPfbu$j=J!@38z#;`MI_NqE3%2#8SG`MZ z$yXbD3BqRJa9osOlR=Z=(7_Vg&PN7iTP|o>T>cSBYeF?anxI3_A7NkU4(4|v^4Kz( zD*LHZX=8`=r=qu7xL$>=hC42#XN7ZR){13TlIwY=$v9`p1Ve{sZqtsZ=$I6IrE zs#@4^GlH1G<9R*3rH=O1jY|BhB3T;KN{&_SRUutNLffu>h&CU}`64iUslsKm1*UzM zo;%nO5O=%MR(}()64RU=ET}C81uk3H{TAwSxPsyj{l-@< zMaf6M-J#v1#R6Emcl0sA)o%XRYvvFpzYp4Nb%d3Jj5&LyEoZb-h{GvRgU|K`i4nNB zun5?I?O(h@8|t*(!a|~_r=y&j{<4^DcI#}?hXneonG9#P;%(U(1Jt1Vo?=j*@Xvny z#DNY=l|+^FBC0RaFV~)15&(C!vRoR#j_+2Lt2Tm-c=#w-(~YnHkO~_d=(0AG>uSgy z1G30<#n5cIfQ(4tmgC>zRKP;*Wu*>QpO0_>d#lLdB~!FI_ZT(r{Wo=U`#AR?RBm+n zw;cg%inZtYb@<*Db94ZOCH*qF9~Ha&TQf9$VDntej7?ECWNQQgE3HQC2QL~YjLq5? z#Noz8n;!v_t473KhIN9U$AU`JhN;REVMsq6c_BscN1+#wRYT=|onuEj+6S9%+0&&o zth2;&+7BG+XXZM;;rgC9+}^O$!u%1v#A#suIRBi>`5<}Wwvm2QVW&sdtp8Hj?EqWj zlc`6@(N0spG!7UYP1z#8`BD)$S|xbSve6EMU%bKI6X9ROfJrC=71BSE_SaX^v16xF zj4dTNH|6%mxxiDp4^zBfhw%PJ@9H*m==23x8JzE_HOL~O+z$Mq=ey-@*`$ityV}U8N|Y=+Kkh42Q8{ ze~_z~$=VQ|?rN$Z@h>*TFInOp!T%RU C3BQ2= diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_quicksettings_normal.png deleted file mode 100644 index 09e0a3c4d28e2f7d51e1a025a5af076d036064a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1931 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 RWjp`?002ovPDHLkV1h)#-U9#t diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-xhdpi/ic_notify_open_normal.png index 990f8bbf7a3b950db2b4ce0aabbfed6317b5592f..6d46fddcc195269d44f051eed9297fc99f3be585 100644 GIT binary patch delta 849 zcmaFQvzlG8Gr-TCmrII^fq{Y7)59eQNV|YA2OE&I5T3kgqN0YPDg#49GXulV|3LaB z14F3+1H-EX1_rAc3=HD=lj4uMP0W(1=N4vQ;1*_Nm^DX&fq`j(r;B4q#jUq9_WFec zinM%u$fEBtGK$bVBF0dEM||RQrKS!Y zQLfgrH)bWx3S^ts$Xu(-{Pf1Iq?v|{IUlU054hyiR?fc2U&HcBTq5ZD_g_h`&m8XH zd!W0)-RgdW>jLF%?*h`MG-?%O7%V>6xbElnBGwldb1e2YN%H!Y=K9M;bz9E3sIPS1 z<;lE`DYrBNFKzYTdhI@E0F#`==lVyh_g%VidDdHrY^5hHJsl^ubS&xpr7l>htkkXa z$@1xD+o)od1@Ce$?wMiopTnXASMLL|1AB2<=*7F<13i;8yKC>I{wYE ztzY_V;kS1^Z=Icgh-}ETI9Zyor}x+6U1q($30m7EnGa0+DB^zG(sk~>z{g*5BbVv7 z2&zunbHjYj9UFrwj^`C0OkH??Ulw;+xTXG@$xmiKI8l(aRma~)eN)IyS3zqQMFz#Z?cya00aZRanA=&vF#%zt2hhNInGp%O%)9Ur6w2( zit*E})%-LSBPwI4!TJKe{$$NP3oZ0nIH(}w*lYAeH`uFT;I@Xl+ z>(Y{9#vQVYW-{26H@;VSX?s}y2MhNL=4GLe`LD`sNo1{%sea5hx4*$FM;0~FSe&ar zqOVuNae*^BX~N_?tdbIj2D(O;A%-SaM#fgA2D%33Rt5%#7I7O*=4F#qL6$VJgh;+R T`|U6=moRv``njxgN@xNA_)T=V delta 1562 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 delta 1875 zcmV-Z2dwz42C)wziBL{Q4GJ0x0000DNk~Le0000$0000$2nGNE0IF$m-jN|pe+FVp zM??Vs0RI60puMM)00009a7bBm0000;0000;07l7cJ^%m)fk{L`RCwC$nro<4MHI(> zbIyJFin1d6P}+yI$e%Z5mS@WNPp7f+A zN3)oAKV(@}`uh=<%ow9K;QSwJPi9Pcm%bv$olaRr0JL?eqfX;}8Yi`?J*ryz3cfQ4 z(zgH$fd&%?R1-KBcnVnWjGF=rfZKq7fx1Ue0?Ytb0Pi_I1p%Nk7q|@Ae-{Zr>p(H{ zwh5dFyjjq97H|ddPaput0iQW~q5)_iXomujIy$v|Vx6i50?`BpfU$z##(+J9M?eiY z;2W?EfSMhs?g1dRdZr>M?*#VSelw6aI%17UJ-Ra6uLvyT*y96$5;fJ_vh$S5075JPDKh8R056fhU8z%TwPlPM_rI0Ig0L5O99doJe^gv;#;)%*Yxv9L zd0?FLMbZL74cLMdDbuMq3St0AfoVum`@!~2e9jkufCX+fG9~(`FbZM-(6{})b=-tH z-y)fPwgNvR`6Lv8Eb{S6%rdBz)i%eND6!jGok|U)XbO#h8Zd}diXoNYU_iU*Iv@iY z?p{61vgkd!btVHwfAL45=7_J66(ppPN-Y52I%6I-0BZO&b>64kV_;^D^d&*nzr{YC zNY?-u0OqvxZ${|Q0;!3t0LLSnoRBCod=6|vc7E3*OPX;Wf6c@x(2wjE??aMb1}p-O zLAJOd`-02@*HwuHAhnJx2EIU6h5Icq*V^Alk+7~={ewvL_Xtw_fV}w|$g4r$xEXM^ z9b=fVBsc|F3w%n4gh-LpkT-sb1>r^O#Dl!jd ztZ$<}rJVwx^YI>F9WXL(zFfUIxk~rJ;i+*7=pd-PU<^NGY&Z8r}VDEIp>%=o+#t z-ip-se?wG6jD!H7&aX$PEGv2o1%sF$vbozfR-r8KNMe)i5BhK z&Til7ut83EvN9#z!h(GHY+X4Npx9bL^F~|g^K=Fz+WwTW&vkXe0!vwZ(D(1 zi6lg{@y*E2E#!)fX5Gc)mz(sBEkcOX-T0TUCU639C-A;AZUS74tP(o|^d!h-t0#fy zVgXQzIcD;;nQVFv%A~ofQkC=osM>(4f29XN)do~8JpigUplUhl0q_+<%B=XLjDd0W z_%=lop(hvsJ<<+2ywFm(UZUp!VWsfYHg@TS>_&i|#J24}900ZhKM{6_nIh!re*4)) z{%>S+vo}Cbf?T55Q=n(J)w3tio*8!RQYmAErXpv58UB#dHv5b*V=a8Z6!L4aJ|TK) zR?ldQotbD}9RFQQ$hvbv=wm=bducEW!ZSy`o?cDj1flb-Yhfd2r( z6hqI}gTu9xz5*E-FgPtTHB>S&Ix{yqFf}bOH##sdy0tcllkWlR8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`? N002ovPDHLkV1oWUL1+K~ diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-xxhdpi/ic_notify_open_normal.png index 60579f916d5f24c4667d996a647c397d4787687d..774220779087dc2be4e1c49b86519d4732980cd7 100644 GIT binary patch literal 3651 zcmZuzXEdCP7X5_iExI7lqBFXyGo#mNK}f;~Lqyc5Av4iNxq2C8)G&IK7)Hw|(Tx%% zj1oNv?o}d*_Hy5P>-~A}$3A=QwSS$x_F3!1-8a*xqrOcI005n#fsW;GcKZjE_^23-kbK4StQOt3balzN28)oSNlEZT zRtpK*c<$#tR2^@_QvI2_80H+Zb=sIv;5^xfJz4ZxzqkrUtkpK=E ze5@ozsQ@ptD^dq=R|RUuAH?edcG3Wgn{l5q@L3X&Hnep!0P0%+Jb{s>5ul_6q%Dxq zq5xSK;4~;85DY}+04#b(wrYQi*D-F3{Z1;UQ4J@ktc!4+zqdWU3?|Um5eSM&So$ZDyC2A}`JvGDtIhFhA1we_ z4TzY$k^nW`hO3gpy{<~`9gw*{rYU-Pmf+UNpw$c%?JU?H`}~uQZgC23etvUfu+Qr%Fm##HIgzO`PKG}~iJ)Dw{WA@cuvE#4M=qq_ zjfENQ0`O~R0C3dq-90TrNeXw5TpbU(KGeL_FS-Z7-3-%w0pPKYpp^A+ljZ;=0O%AU z#Ok%VPP#cH@Z{XxHy68UE}Rsjz=C}}U`8~UJ&%|ZXj+R$9&h0u zlkP(=)nn62ukOR}%bBvETciU)MW#JS$?VLxfFyy&+X*C5vgbtq;OjOZV@eR@9YV5L z@EfNp7|2-0Tl3l&@Eoc8-B6Bo)N4ys9Ry_GT*P$f%VZ!LE!3xJn<2OgrQ1<@B{UOH z17vcO*^2Te{NCSIPgE@4o~U+bSV-1@3`pa@a!|lKl?bKvNExD1`-0ZOv%h3#xNwLPf3s|4k9azOSxg#@YZ^YX-aSEg{8obL}i}5 z!EJ%`p@pZOjTFim61?Jr(HrQE-VM18t_{8;2Wm7_%lGXMt2GhJ;b%sin~a0($T2aqrk&O8nZ4j5+;$2*isIp?PY&H-y_C7C_cb`C?1 zw~d_`R_qmP>M(VtQKnEPml(*pvZ}mlxr)Z-*k;5!x$?19c%7b&oYi_I)pS<1O%?k7 zo)woBtWvciwhC6^ZLRq>!u~Rj+`iYO*BtWJqNw4?dPhGmjSFW}umqncU3JV$ghHQC z!`S?*K(ThzB~N>TdR1kyGDOZu&bG<&IKxeoVjboCBR{~5YFh-8eH;7t|WWr7Kw$;4V5{4SX zW~#1oS|?TIS;ke|t`qd(1?B)%(DfKzVB(Eg4(Z(f#T^d1w7&HEg*nxywIgq$6(lFp z5;)X8D)@S<@qh-1e_KEv^=d)NoHL!XSEEvKlWL_idVlIMBzp8at_!Yv^?UV~3Xu!( z2^pL2njYj@n&Qeu%T-NOO$NqB$4bU#a}@H_W#(kJ^S1Nm@>W`$9tJ;@z*b;eT@4#I z9+ul5U^`w!KUB6av$J{ls7bFDU3+h~y|x{53xhLDH>)m~h4t3|jUB>Pws6*OekLc@ zVZE^7&M+uDtmR`}??HNJdU#v-pO@+sbg}dF)jSV*BK+U`v8X&yS@b{vRZZ!s?MAb*)_gv_!X{etg9(4%P!kL8CAl!47QAz_j(sRiC%%c7Px+T9eO

CCl=wfS+$ej)V|s5uH|zd{FYM7ceafp zq!K*nqwhz2ot>a?-f~Xpji42dj*YgB(M<9|+TEU%$yNxOT!i?q=={>j(pk=f$(Sp@ zlQdEg)2NbqrnaEeCf}ynFXd)GI%9{nGkk8$tt=&0r}*M|*UH8IaqJp;jb=TJ9R(VE z!3i!rv9tEK22UAPU&T~IrOdfEBb$plqHbZpi zIJ?vs>LS{Z*qF|^&A6T$o;RIo*2Pur{Kz`@dQ@xX<-0#XIz@U(AwZ9v!%ffdOsQL2 zCeMoR>C+F~?YcrA21(K>(%Jl(-@hi{qZ6{Rb4Imtc85-7AuutlW|iX8-9R1~59k>< z_b68{&noxa0qW3ZKB_S}ySp5Ep-;TakT0)hA7XTDJ>;>l^X5}J>}Wg@orw;Qkovjk zL@dFEZMzUwo-ueIwlM~*PU&7JY^!#t5*&|O1CAPro6NSYwz=O&S*MZEq*>+eEkd`RCGMKsDDNt9XWoLdYa4txtW}kJQ70} zvsdtkhO+XSrr+hx1qL$ybX=%_{i@_@q>h~p6!BwbZ;mjDnk>#f%1-~_^{VW07r)2( zj@aMRf2V6GSWf2g$%FI#?x4jWp2N}=2J?+qyst&B-G4TmT1{Zi(>c@AugOSJ#}_Vg zlEmNtCa;Tur6~Y}-U9%5Bmn%p{>?i8@KPE8cAWq~1qA@?-f2%h>Hz@h3qu`k>)?fN z`KHD;+8hIg>8mu;{Vn+BcZGZ){s=^1G?LQtF5e<$T3mP(^1(f5-NKAsy-A-g?m=G{ z+{59~iRUEJviyvY@9$Q3c1@}jI^J@pq@cuA7$JvCV~Hm z6psHVqWTOH|LuHgUHpy{8EJg0LL#3x?So?3p=w$a9>G5IE8Px5M40C{(Z9zC zm2b(^!DO^R^&=m?-RNXu#x(Wf`L4GaIkHfGsw(vPKI+2w);^Y%Zdz1npc}#jN*&(; zzjqO`UZNB?)ZoH{CtrO1k!Sc9XC!Bk5J+&(CTvqa(9v}(ZVu*0mVWY!YlGNq@d7* zhuh)Uw=UQ%(BkyP^zkoKxv&)1`QkLxwigHRUH$O8mD4YlpG%JGWe(XrAr=;wvumrXPhe-pT^a`)E)D36(7cLhX^kP|FeXvb2^2F>;id zWN99_Ts0TP9XS1DF$^`myc^ht{n;4oi z`%^ghWS9g5^`KF|E1miu@$Y{BkN9u%|8YvhA{c<>8uYG|F1`5gD+LU7&2;L(PH+AN D7-7!| literal 1758 zcmbVNc~BEq7|*D~L<#~PRV<^+QaWlO+1(_YO*BA45)MtIK;;mXB)dpTlFhN0KvhPq z3TUf9ZKranC-wYigE0Ih9FOtq|*IBS+)Ga2!T6;AXLwMLNtHT@J-ST57%CB!TapIs-#` zQUa$4REWwPO=at2^Q}};zB*Z#pQ96zaAX9u%pnE>j1;4R97co5CU!{RF}Y%}_Z)L! zXbi&SNZ{8-rK%F3Xxd6a0uC=+hoC5g;~bPPz;QGT!VnbWBH+WrQNCD!i!mWI{=h(+ zmCO<+%9Z1~040I58OAK;a_x3I$Ij!>*7aOeBocXKU|2Xngxm5=jK&devV}}YkW)6D zRc~hWv8Z#H=AY7x-OoR8205+EHBu%fPA-AL4Tsc|Vgx5Z z6oq_5h=DDNicmx(LvVorM`gH($Dfe#CSJajufPeO0^t)liYjW>Y>dXFqbBs~f!=Xm`CEC#(N;>s(AH#{HcV7NLN?9NwrtuAMJEX$l}4vGd1z01 zUVAI2tojWUskG8YXe_>B{TuWP3BEv1AUr~VVIIE;43iSLLLiJLM7Ufeg2#Eu{}VGV zFox?Xj{g+P#1W`K&vvr(0WsM;lnHc<6|_c!xBDM{wKlPhL-*ZtV6+fh(Z zP4ITGtB(v;T;hDvlipd?xXz%rg>f}04$1NpKYi-z_kl0;1+V(3p>lURp}bi%I=tZM ziL%Dn&OP(&7Gis-7Zz6g4b_tqQq!I}ykO`=$$2BPK{(Ryeo7*bV*vf&Qs(e&aNo+! zaUK)?9Kfx+sC02HVr|BmjV%L~9VyqErli>vmuu2j2S)5{d+BpyV0L@GV4Z9AqDNQL zg8a*!YP6=UySKH6*%rU6?0U=P0#(M`@7k;=&oBykwf0?HITW^5S-MaQ`Ip@r4DCI2 z{g$ub)%%%)LBC7~Ap!3eA8l@BiTdmJ)~x8X9TcWi9C#jiR_Uju90Bc4p#|CLKl-e% z*_@>Nwq7o;zO?9z!j4Djuh5zghtoIJ8`qQL#l>f54W#Gf5K6 zQ>dGsnRFIL6*lf3DS=B3{yBAo+O@{A#CloTOavVme5!LjV+R)%p6$u8B&6MC`QB4e}pcsYfra-Z@A-F=b^clSAB z&OM`!%{ukDD{@F#9V#QrWnNO(XkO=iKSN$Ne{*H=4RYfQ|JucmcQg5|cN!Eg3efRVohbWoi1)qt2+3%=Z_PoP|LrUWp4ckHLag( diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-xxhdpi/ic_notify_quicksettings_normal.png index abb9b1801f74772768ba122cb8307a8e47e6cd56..a2e8fe1b2d255755eafa57b5908cb0b406e7b03e 100644 GIT binary patch literal 3614 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 literal 2083 zcmbVLdsGu=7XKn351$7Wt6jT8Sb{brnMufNBnlx=0|r?VEC^LYGC+i6LNY)C3TZ*R zxE|Eh79-XJwDn1K)!jv_AiCHRx(l{oOA(>+5Iw60i4+XPbtfS1?m3?Rv2)Iy?|w7) z_q*@%g!p$B_^tE<04$JhkR+1lcDMMApfq40QjMo$kW{P8 z#1b*3+MH|0!U6Ee&?u6LWZ6bkg=?8gw++*z)stud!q=PhN>w&SK7%eL&4xk)CNGRvs0y=HLN#^$Iw;(Pk_1|eP(mhcj?RdhMAT_sl+@jy zSyX7+gvb_AXM#$WB|uTQ0fV?qn4yAsFvLTc2q%os=Z8XU7=c+Zn}x6$2p{FJQ5c3^ zK2*}1L7jmnN@8C6B5xvU7D4Dy7OSA3fLXv{;)YBXA`}YU9Bej&v|t#`Iznk;=!`+L z3=+(!GHCRK2G>DuMrAslM~J9oq%$dK^)lHjVx942p~#Z4OiDcqVZtn})}7b1wUJ1~ z{u9P)t&Iw^9%Ch9Mm*1;BKwgMGz%tc_v?<_hGaD8CWD4-iZVxntMas%j*v=3RPql~ ztx=;ePXHqbKMdxxNfkka2rLxCJT8}qh30Sj9rLSLG|GS}3EZH-@toNSNXWto+?a*yp(r^Q zk||Xho%`-?&rG%w%%I7~)G-EJ3r*J-)x5?(KS}~eMho~7;Y{8FJ`y7ob75G*5%9=# zs4ubV|EFdwG8mS7IR0x`WSoeMFpAEKs zi@S{{^%+r&T*+DP^FdMuM)?%R@(Hx*(O_eu4^;1?e0la{dIywsPx z%wIcaN9p+;@B3dkbUoGfSqj?QxMjo|M3Xo;MUM~CYx{DKM$Qi~G52(atd9!5_HAN( z+#@`+c2`>UFX8(>9hq3QJ$t#i>U{orfotbP*XWczUgcM^nUlpne-a(CSlW?s@tPo*@OFAuGptMBbu?F z0%;d(q(a{6n!1j%y7M z`t-fA#3NStMg5loYJv1zL~~fDi(cK3{=unvd*forUTz-V24Al{(EhC>rmmaPgM2}^ z#~!OV?t}UJ(-K#jpIlEQ`w!0H9ea04${XKUb*7@l~+B=+iBWA_mXUhla0(^{F3> wS7;vB(*j)Vl+Ha=Ps*zeCc%q=qVivUFwnxcyOV-a+`A2=(eaYA;_V;&8)0cHbpQYW diff --git a/packages/SystemUI/res/layout/flip_settings.xml b/packages/SystemUI/res/layout/flip_settings.xml index 1b8898c502ed4..28d962500411b 100644 --- a/packages/SystemUI/res/layout/flip_settings.xml +++ b/packages/SystemUI/res/layout/flip_settings.xml @@ -14,18 +14,12 @@ limitations under the License. --> - - - \ No newline at end of file + android:background="#5f000000" + android:animateLayoutChanges="true" + android:columnCount="@integer/quick_settings_num_columns" /> \ No newline at end of file diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index 8f4417ee83331..8a3f090375408 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -41,7 +41,7 @@ android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="right|top" - android:layout_marginTop="@*android:dimen/status_bar_height" + android:layout_marginTop="@dimen/status_bar_height" android:visibility="gone" /> + android:layout_height="@dimen/status_bar_height" /> + android:layout_marginBottom="@dimen/navigation_bar_height"> 6 + + 2 + 2 diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml index 440ead6f1331d..c6bc44d5a9f51 100644 --- a/packages/SystemUI/res/values-sw600dp/config.xml +++ b/packages/SystemUI/res/values-sw600dp/config.xml @@ -26,6 +26,9 @@ 3 + + 4 + 1 diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 73e3e051de114..f908a1ead9d0a 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -81,6 +81,12 @@ 3 + + 4 + + + 3 + 1 diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index e7959ab858f16..9aacf42221b6a 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -269,4 +269,7 @@ 100dp + + 8dp + 30dp diff --git a/packages/SystemUI/res/values/internal.xml b/packages/SystemUI/res/values/internal.xml new file mode 100644 index 0000000000000..ddaab9422d79b --- /dev/null +++ b/packages/SystemUI/res/values/internal.xml @@ -0,0 +1,22 @@ + + + + + @*android:dimen/status_bar_height + @*android:dimen/navigation_bar_height + @*android:drawable/notification_quantum_bg + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 6f93bedbaf5db..45ac50b6f6866 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -30,11 +30,14 @@ public class NotificationPanelView extends PanelView { public static final boolean DEBUG_GESTURES = true; PhoneStatusBar mStatusBar; + private View mHeader; + private View mKeyguardStatusView; + private NotificationStackScrollLayout mNotificationStackScroller; private int[] mTempLocation = new int[2]; private int[] mTempChildLocation = new int[2]; private View mNotificationParent; - + private boolean mTrackingSettings; public NotificationPanelView(Context context, AttributeSet attrs) { super(context, attrs); @@ -59,6 +62,8 @@ public class NotificationPanelView extends PanelView { protected void onFinishInflate() { super.onFinishInflate(); + mHeader = findViewById(R.id.header); + mKeyguardStatusView = findViewById(R.id.keyguard_status_view); mNotificationStackScroller = (NotificationStackScrollLayout) findViewById(R.id.notification_stack_scroller); mNotificationParent = findViewById(R.id.notification_container_parent); @@ -98,10 +103,39 @@ public class NotificationPanelView extends PanelView { return mTempChildLocation[1] - mTempLocation[1]; } + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + // intercept for quick settings + if (event.getAction() == MotionEvent.ACTION_DOWN) { + final View target = mStatusBar.isOnKeyguard() ? mKeyguardStatusView : mHeader; + final boolean inTarget = PhoneStatusBar.inBounds(target, event, true); + if (inTarget && !isInSettings()) { + mTrackingSettings = true; + return true; + } + if (!inTarget && isInSettings()) { + mTrackingSettings = true; + return true; + } + } + return super.onInterceptTouchEvent(event); + } + @Override public boolean onTouchEvent(MotionEvent event) { // TODO: Handle doublefinger swipe to notifications again. Look at history for a reference // implementation. + if (mTrackingSettings) { + mStatusBar.onSettingsEvent(event); + if (event.getAction() == MotionEvent.ACTION_UP + || event.getAction() == MotionEvent.ACTION_CANCEL) { + mTrackingSettings = false; + } + return true; + } + if (isInSettings()) { + return true; + } return super.onTouchEvent(event); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 5f71516992772..d5770702e6a5b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -73,6 +73,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; +import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewPropertyAnimator; @@ -97,11 +98,9 @@ import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.GestureRecorder; import com.android.systemui.statusbar.InterceptedNotifications; -import com.android.systemui.statusbar.LatestItemView; import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.NotificationData.Entry; import com.android.systemui.statusbar.NotificationOverflowContainer; -import com.android.systemui.statusbar.NotificationOverflowIconsView; import com.android.systemui.statusbar.SignalClusterView; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.policy.BatteryController; @@ -233,8 +232,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { int mKeyguardMaxNotificationCount; View mDateTimeView; View mClearButton; - ImageView mSettingsButton, mNotificationButton; - View mKeyguardSettingsFlipButton; + FlipperButton mHeaderFlipper, mKeyguardFlipper; // carrier/wifi label private TextView mCarrierLabel; @@ -314,9 +312,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { if (MULTIUSER_DEBUG) Log.d(TAG, String.format("User setup changed: " + "selfChange=%s userSetup=%s mUserSetup=%s", selfChange, userSetup, mUserSetup)); - if (mSettingsButton != null && mHasFlipSettings) { - mSettingsButton.setVisibility(userSetup ? View.VISIBLE : View.INVISIBLE); - } + mHeaderFlipper.userSetup(userSetup); + mKeyguardFlipper.userSetup(userSetup); + if (mSettingsPanel != null) { mSettingsPanel.setEnabled(userSetup); } @@ -371,6 +369,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { private Runnable mOnFlipRunnable; private InterceptedNotifications mIntercepted; + private VelocityTracker mSettingsTracker; + private float mSettingsDownY; + private boolean mSettingsCancelled; + private boolean mSettingsClosing; + private int mNotificationPadding; private final OnChildLocationsChangedListener mOnChildLocationsChangedListener = new OnChildLocationsChangedListener() { @@ -631,35 +634,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mDateTimeView.setEnabled(true); } - mSettingsButton = (ImageView) mStatusBarWindow.findViewById(R.id.settings_button); - if (mSettingsButton != null) { - mSettingsButton.setOnClickListener(mSettingsButtonListener); - if (mHasSettingsPanel) { - if (mStatusBarView.hasFullWidthNotifications()) { - // the settings panel is hiding behind this button - mSettingsButton.setImageResource(R.drawable.ic_notify_quicksettings); - mSettingsButton.setVisibility(View.VISIBLE); - } else { - // there is a settings panel, but it's on the other side of the (large) screen - final View buttonHolder = mStatusBarWindow.findViewById( - R.id.settings_button_holder); - if (buttonHolder != null) { - buttonHolder.setVisibility(View.GONE); - } - } - } else { - // no settings panel, go straight to settings - mSettingsButton.setVisibility(View.VISIBLE); - mSettingsButton.setImageResource(R.drawable.ic_notify_settings); - } - } - if (mHasFlipSettings) { - mNotificationButton = (ImageView) mStatusBarWindow.findViewById( - R.id.notification_button); - if (mNotificationButton != null) { - mNotificationButton.setOnClickListener(mNotificationButtonListener); - } - } + mHeaderFlipper = new FlipperButton(mNotificationPanelHeader + .findViewById(R.id.settings_button_holder)); + ViewStub flipStub = (ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_flip_stub); + mKeyguardFlipper = new FlipperButton(flipStub.inflate()); if (!mNotificationPanelIsFullScreenWidth) { mNotificationPanel.setSystemUiVisibility( @@ -735,6 +713,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } // Quick Settings (where available, some restrictions apply) + mNotificationPadding = mContext.getResources() + .getDimensionPixelSize(R.dimen.notification_side_padding); if (mHasSettingsPanel) { // first, figure out where quick settings should be inflated final View settings_stub; @@ -803,6 +783,87 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { return mStatusBarView; } + public boolean onSettingsEvent(MotionEvent event) { + if (mSettingsTracker != null) { + mSettingsTracker.addMovement(event); + } + + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mSettingsTracker = VelocityTracker.obtain(); + mSettingsDownY = event.getY(); + mSettingsCancelled = false; + mSettingsClosing = mFlipSettingsView.getVisibility() == View.VISIBLE; + mFlipSettingsView.setVisibility(View.VISIBLE); + mStackScroller.setVisibility(View.VISIBLE); + positionSettings(0); + if (!mSettingsClosing) { + mFlipSettingsView.setTranslationY(-mNotificationPanel.getMeasuredHeight()); + } + dispatchSettingsEvent(event); + } else if (mSettingsTracker != null && (event.getAction() == MotionEvent.ACTION_UP + || event.getAction() == MotionEvent.ACTION_CANCEL)) { + final float dy = event.getY() - mSettingsDownY; + final FlipperButton flipper = mOnKeyguard ? mKeyguardFlipper : mHeaderFlipper; + final boolean inButton = flipper.inHolderBounds(event); + final int slop = ViewConfiguration.get(mContext).getScaledTouchSlop(); + final boolean qsTap = mSettingsClosing && Math.abs(dy) < slop; + if (!qsTap && !inButton) { + mSettingsTracker.computeCurrentVelocity(1000); + final float vy = mSettingsTracker.getYVelocity(); + if (dy <= slop || vy <= 0) { + flipToNotifications(); + } else { + flipToSettings(); + } + } + mSettingsTracker.recycle(); + mSettingsTracker = null; + dispatchSettingsEvent(event); + } else if (mSettingsTracker != null && event.getAction() == MotionEvent.ACTION_MOVE) { + final float dy = event.getY() - mSettingsDownY; + positionSettings(dy); + if (mSettingsClosing) { + final boolean qsTap = + Math.abs(dy) < ViewConfiguration.get(mContext).getScaledTouchSlop(); + if (!mSettingsCancelled && !qsTap) { + MotionEvent cancelEvent = MotionEvent.obtainNoHistory(event); + cancelEvent.setAction(MotionEvent.ACTION_CANCEL); + dispatchSettingsEvent(cancelEvent); + mSettingsCancelled = true; + } + } else { + dispatchSettingsEvent(event); + } + } + return true; + } + + private void dispatchSettingsEvent(MotionEvent event) { + final View target = mSettingsClosing ? mFlipSettingsView : mNotificationPanelHeader; + final int[] targetLoc = new int[2]; + target.getLocationInWindow(targetLoc); + final int[] panelLoc = new int[2]; + mNotificationPanel.getLocationInWindow(panelLoc); + final int dx = targetLoc[0] - panelLoc[0]; + final int dy = targetLoc[1] - panelLoc[1]; + event.offsetLocation(-dx, -dy); + target.dispatchTouchEvent(event); + } + + private void positionSettings(float dy) { + final int h = mFlipSettingsView.getMeasuredHeight(); + final int ph = mNotificationPanel.getMeasuredHeight(); + if (mSettingsClosing) { + dy = Math.min(Math.max(-ph, dy), 0); + mFlipSettingsView.setTranslationY(dy); + mStackScroller.setTranslationY(ph + dy); + } else { + dy = Math.min(Math.max(0, dy), ph); + mFlipSettingsView.setTranslationY(-h + dy - mNotificationPadding * 2); + mStackScroller.setTranslationY(dy); + } + } + private void startKeyguard() { KeyguardViewMediator keyguardViewMediator = getComponent(KeyguardViewMediator.class); mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, @@ -1163,17 +1224,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { ((ImageView)mClearButton).setImageResource(R.drawable.ic_notify_clear); } - if (mSettingsButton != null) { - // Force asset reloading - mSettingsButton.setImageDrawable(null); - mSettingsButton.setImageResource(R.drawable.ic_notify_quicksettings); - } - - if (mNotificationButton != null) { - // Force asset reloading - mNotificationButton.setImageDrawable(null); - mNotificationButton.setImageResource(R.drawable.ic_notifications); - } + mHeaderFlipper.refreshLayout(); + mKeyguardFlipper.refreshLayout(); refreshAllStatusBarIcons(); } @@ -1228,9 +1280,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } } - if (mSettingsButton != null) { - mSettingsButton.setEnabled(isDeviceProvisioned()); - } + mHeaderFlipper.provisionCheck(provisioned); + mKeyguardFlipper.provisionCheck(provisioned); } @Override @@ -1647,6 +1698,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mStatusBarWindow.cancelExpandHelper(); mStatusBarView.collapseAllPanels(true); + if (isFlippedToSettings()) { + flipToNotifications(); + } } } @@ -1694,8 +1748,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { final int FLIP_DURATION_IN = 225; final int FLIP_DURATION = (FLIP_DURATION_IN + FLIP_DURATION_OUT); - Animator mScrollViewAnim, mFlipSettingsViewAnim, mNotificationButtonAnim, - mSettingsButtonAnim, mClearButtonAnim; + Animator mScrollViewAnim, mFlipSettingsViewAnim, mClearButtonAnim; @Override public void animateExpandNotificationsPanel() { @@ -1715,33 +1768,29 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { public void flipToNotifications() { if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel(); if (mScrollViewAnim != null) mScrollViewAnim.cancel(); - if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel(); - if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel(); + mHeaderFlipper.cancel(); + mKeyguardFlipper.cancel(); if (mClearButtonAnim != null) mClearButtonAnim.cancel(); mStackScroller.setVisibility(View.VISIBLE); + final int h = mNotificationPanel.getMeasuredHeight(); + final float settingsY = mSettingsTracker != null ? mFlipSettingsView.getTranslationY() : 0; + final float scrollerY = mSettingsTracker != null ? mStackScroller.getTranslationY() : h; mScrollViewAnim = start( - startDelay(FLIP_DURATION_OUT, + startDelay(0, interpolator(mDecelerateInterpolator, - ObjectAnimator.ofFloat(mStackScroller, View.SCALE_X, 0f, 1f) - .setDuration(FLIP_DURATION_IN) + ObjectAnimator.ofFloat(mStackScroller, View.TRANSLATION_Y, scrollerY, 0) + .setDuration(FLIP_DURATION) ))); mFlipSettingsViewAnim = start( setVisibilityWhenDone( - interpolator(mAccelerateInterpolator, - ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 1f, 0f) + interpolator(mDecelerateInterpolator, + ObjectAnimator.ofFloat(mFlipSettingsView, View.TRANSLATION_Y, settingsY, -h) ) - .setDuration(FLIP_DURATION_OUT), - mFlipSettingsView, View.INVISIBLE)); - mNotificationButtonAnim = start( - setVisibilityWhenDone( - ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 0f) .setDuration(FLIP_DURATION), - mNotificationButton, View.INVISIBLE)); - mSettingsButton.setVisibility(View.VISIBLE); - mSettingsButtonAnim = start( - ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f) - .setDuration(FLIP_DURATION)); + mFlipSettingsView, View.INVISIBLE)); + mHeaderFlipper.flipToNotifications(); + mKeyguardFlipper.flipToNotifications(); mClearButton.setVisibility(View.VISIBLE); mClearButton.setAlpha(0f); setAreThereNotifications(); // this will show/hide the button as necessary @@ -1767,7 +1816,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { if (mHasFlipSettings) { mNotificationPanel.expand(); - if (mFlipSettingsView.getVisibility() != View.VISIBLE) { + if (mFlipSettingsView.getVisibility() != View.VISIBLE + || mFlipSettingsView.getTranslationY() < 0) { flipToSettings(); } } else if (mSettingsPanel != null) { @@ -1777,23 +1827,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { if (false) postStartTracing(); } - public void switchToSettings() { - // Settings are not available in setup - if (!mUserSetup) return; - - mFlipSettingsView.setScaleX(1f); - mFlipSettingsView.setVisibility(View.VISIBLE); - mSettingsButton.setVisibility(View.GONE); - mStackScroller.setVisibility(View.GONE); - mStackScroller.setScaleX(0f); - mNotificationButton.setVisibility(View.VISIBLE); - mNotificationButton.setAlpha(1f); - mClearButton.setVisibility(View.GONE); - if (mOnFlipRunnable != null) { - mOnFlipRunnable.run(); - } - } - public boolean isFlippedToSettings() { if (mFlipSettingsView != null) { return mFlipSettingsView.getVisibility() == View.VISIBLE; @@ -1807,34 +1840,29 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel(); if (mScrollViewAnim != null) mScrollViewAnim.cancel(); - if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel(); - if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel(); + mHeaderFlipper.cancel(); + mKeyguardFlipper.cancel(); if (mClearButtonAnim != null) mClearButtonAnim.cancel(); mFlipSettingsView.setVisibility(View.VISIBLE); - mFlipSettingsView.setScaleX(0f); + final int h = mNotificationPanel.getMeasuredHeight(); + final float settingsY = mSettingsTracker != null ? mFlipSettingsView.getTranslationY() : -h; + final float scrollerY = mSettingsTracker != null ? mStackScroller.getTranslationY() : 0; mFlipSettingsViewAnim = start( - startDelay(FLIP_DURATION_OUT, - interpolator(mDecelerateInterpolator, - ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 0f, 1f) - .setDuration(FLIP_DURATION_IN) - ))); + startDelay(0, + interpolator(mDecelerateInterpolator, + ObjectAnimator.ofFloat(mFlipSettingsView, View.TRANSLATION_Y, settingsY, 0f) + .setDuration(FLIP_DURATION) + ))); mScrollViewAnim = start( setVisibilityWhenDone( - interpolator(mAccelerateInterpolator, - ObjectAnimator.ofFloat(mStackScroller, View.SCALE_X, 1f, 0f) + interpolator(mDecelerateInterpolator, + ObjectAnimator.ofFloat(mStackScroller, View.TRANSLATION_Y, scrollerY, h) ) - .setDuration(FLIP_DURATION_OUT), - mStackScroller, View.INVISIBLE)); - mSettingsButtonAnim = start( - setVisibilityWhenDone( - ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 0f) .setDuration(FLIP_DURATION), mStackScroller, View.INVISIBLE)); - mNotificationButton.setVisibility(View.VISIBLE); - mNotificationButtonAnim = start( - ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f) - .setDuration(FLIP_DURATION)); + mHeaderFlipper.flipToSettings(); + mKeyguardFlipper.flipToSettings(); mClearButtonAnim = start( setVisibilityWhenDone( ObjectAnimator.ofFloat(mClearButton, View.ALPHA, 0f) @@ -1883,18 +1911,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // reset things to their proper state if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel(); if (mScrollViewAnim != null) mScrollViewAnim.cancel(); - if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel(); - if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel(); if (mClearButtonAnim != null) mClearButtonAnim.cancel(); - mStackScroller.setScaleX(1f); mStackScroller.setVisibility(View.VISIBLE); - mSettingsButton.setAlpha(1f); - mSettingsButton.setVisibility(View.VISIBLE); mNotificationPanel.setVisibility(View.GONE); mFlipSettingsView.setVisibility(View.GONE); - mNotificationButton.setVisibility(View.GONE); + setAreThereNotifications(); // show the clear button + + mHeaderFlipper.reset(); + mKeyguardFlipper.reset(); } mExpandedVisible = false; @@ -2947,15 +2973,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } mKeyguardStatusView.setVisibility(View.VISIBLE); mNotificationPanelHeader.setVisibility(View.GONE); - if (mKeyguardSettingsFlipButton == null) { - ViewStub flipStub = (ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_flip_stub); - mKeyguardSettingsFlipButton = flipStub.inflate(); - installSettingsButton(mKeyguardSettingsFlipButton); - } - mKeyguardSettingsFlipButton.setVisibility(View.VISIBLE); - mKeyguardSettingsFlipButton.findViewById(R.id.settings_button).setVisibility(View.VISIBLE); - mKeyguardSettingsFlipButton.findViewById(R.id.notification_button) - .setVisibility(View.INVISIBLE); + + mKeyguardFlipper.setVisibility(View.VISIBLE); + mSettingsContainer.setKeyguardShowing(true); updateRowStates(); } @@ -2963,9 +2983,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mOnKeyguard = false; mKeyguardStatusView.setVisibility(View.GONE); mNotificationPanelHeader.setVisibility(View.VISIBLE); - if (mKeyguardSettingsFlipButton != null) { - mKeyguardSettingsFlipButton.setVisibility(View.GONE); - } + + mKeyguardFlipper.setVisibility(View.GONE); + mSettingsContainer.setKeyguardShowing(false); updateRowStates(); instantCollapseNotificationPanel(); } @@ -3030,39 +3050,112 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } } - private void installSettingsButton(View parent) { - final ImageView settingsButton = - (ImageView) mStatusBarWindow.findViewById(R.id.settings_button); - final ImageView notificationButton = - (ImageView) mStatusBarWindow.findViewById(R.id.notification_button); - if (settingsButton != null) { - settingsButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - animateExpandSettingsPanel(); - v.setVisibility(View.INVISIBLE); - notificationButton.setVisibility(View.VISIBLE); + public static boolean inBounds(View view, MotionEvent event, boolean orAbove) { + final int[] location = new int[2]; + view.getLocationInWindow(location); + final int rx = (int) event.getRawX(); + final int ry = (int) event.getRawY(); + return rx >= location[0] && rx <= location[0] + view.getMeasuredWidth() + && (orAbove || ry >= location[1]) && ry <= location[1] + view.getMeasuredHeight(); + } + + private final class FlipperButton { + private final View mHolder; + + private ImageView mSettingsButton, mNotificationButton; + private Animator mSettingsButtonAnim, mNotificationButtonAnim; + + public FlipperButton(View holder) { + mHolder = holder; + mSettingsButton = (ImageView) holder.findViewById(R.id.settings_button); + if (mSettingsButton != null) { + mSettingsButton.setOnClickListener(mSettingsButtonListener); + if (mHasSettingsPanel) { + // the settings panel is hiding behind this button + mSettingsButton.setImageResource(R.drawable.ic_notify_quicksettings); + mSettingsButton.setVisibility(View.VISIBLE); + } else { + // no settings panel, go straight to settings + mSettingsButton.setVisibility(View.VISIBLE); + mSettingsButton.setImageResource(R.drawable.ic_notify_settings); + } + } + if (mHasFlipSettings) { + mNotificationButton = (ImageView) holder.findViewById(R.id.notification_button); + if (mNotificationButton != null) { + mNotificationButton.setOnClickListener(mNotificationButtonListener); } - }); - settingsButton.setVisibility(View.VISIBLE); - if (mHasSettingsPanel) { - // the settings panel is hiding behind this button - settingsButton.setImageResource(R.drawable.ic_notify_quicksettings); - } else { - // no settings panel, go straight to settings - settingsButton.setImageResource(R.drawable.ic_notify_settings); } } - if (notificationButton != null) { - notificationButton.setVisibility(View.INVISIBLE); - notificationButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - flipToNotifications(); - v.setVisibility(View.INVISIBLE); - settingsButton.setVisibility(View.VISIBLE); - } - }); + + public boolean inHolderBounds(MotionEvent event) { + return inBounds(mHolder, event, false); + } + + public void provisionCheck(boolean provisioned) { + if (mSettingsButton != null) { + mSettingsButton.setEnabled(provisioned); + } + } + + public void userSetup(boolean userSetup) { + if (mSettingsButton != null && mHasFlipSettings) { + mSettingsButton.setVisibility(userSetup ? View.VISIBLE : View.INVISIBLE); + } + } + + public void reset() { + cancel(); + mSettingsButton.setVisibility(View.VISIBLE); + mNotificationButton.setVisibility(View.GONE); + } + + public void refreshLayout() { + if (mSettingsButton != null) { + // Force asset reloading + mSettingsButton.setImageDrawable(null); + mSettingsButton.setImageResource(R.drawable.ic_notify_quicksettings); + } + + if (mNotificationButton != null) { + // Force asset reloading + mNotificationButton.setImageDrawable(null); + mNotificationButton.setImageResource(R.drawable.ic_notifications); + } + } + + public void flipToSettings() { + mSettingsButtonAnim = start( + setVisibilityWhenDone( + ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 0f) + .setDuration(FLIP_DURATION), + mStackScroller, View.INVISIBLE)); + mNotificationButton.setVisibility(View.VISIBLE); + mNotificationButtonAnim = start( + ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f) + .setDuration(FLIP_DURATION)); + } + + public void flipToNotifications() { + mNotificationButtonAnim = start( + setVisibilityWhenDone( + ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 0f) + .setDuration(FLIP_DURATION), + mNotificationButton, View.INVISIBLE)); + + mSettingsButton.setVisibility(View.VISIBLE); + mSettingsButtonAnim = start( + ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f) + .setDuration(FLIP_DURATION)); + } + + public void cancel() { + if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel(); + if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel(); + } + + public void setVisibility(int vis) { + mHolder.setVisibility(vis); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java index 17ee0177252eb..02e9c0d7ce57f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java @@ -19,7 +19,13 @@ package com.android.systemui.statusbar.phone; import android.animation.LayoutTransition; import android.content.Context; import android.content.res.Resources; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.Typeface; import android.util.AttributeSet; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -31,30 +37,58 @@ import com.android.systemui.R; */ class QuickSettingsContainerView extends FrameLayout { + private static boolean sShowScrim = true; + + private final Context mContext; + // The number of columns in the QuickSettings grid private int mNumColumns; + private boolean mKeyguardShowing; + private int mMaxRows; + private int mMaxRowsOnKeyguard; + // The gap between tiles in the QuickSettings grid private float mCellGap; + private ScrimView mScrim; + public QuickSettingsContainerView(Context context, AttributeSet attrs) { super(context, attrs); - + mContext = context; updateResources(); } @Override protected void onFinishInflate() { super.onFinishInflate(); - + mScrim = new ScrimView(mContext); + addView(mScrim); + mScrim.setAlpha(sShowScrim ? 1 : 0); // TODO: Setup the layout transitions LayoutTransition transitions = getLayoutTransition(); } + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mScrim.getAlpha() == 1) { + mScrim.animate().alpha(0).setDuration(1000).start(); + sShowScrim = false; + } + return super.onTouchEvent(event); + } + void updateResources() { Resources r = getContext().getResources(); mCellGap = r.getDimension(R.dimen.quick_settings_cell_gap); mNumColumns = r.getInteger(R.integer.quick_settings_num_columns); + mMaxRows = r.getInteger(R.integer.quick_settings_max_rows); + mMaxRowsOnKeyguard = r.getInteger(R.integer.quick_settings_max_rows_keyguard); + requestLayout(); + } + + void setKeyguardShowing(boolean showing) { + mKeyguardShowing = showing; requestLayout(); } @@ -71,10 +105,18 @@ class QuickSettingsContainerView extends FrameLayout { final int N = getChildCount(); int cellHeight = 0; int cursor = 0; + int maxRows = mKeyguardShowing ? mMaxRowsOnKeyguard : mMaxRows; + for (int i = 0; i < N; ++i) { + if (getChildAt(i).equals(mScrim)) { + continue; + } // Update the child's width QuickSettingsTileView v = (QuickSettingsTileView) getChildAt(i); if (v.getVisibility() != View.GONE) { + int row = (int) (cursor / mNumColumns); + if (row >= maxRows) continue; + ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); int colSpan = v.getColumnSpan(); lp.width = (int) ((colSpan * cellWidth) + (colSpan - 1) * mCellGap); @@ -102,6 +144,7 @@ class QuickSettingsContainerView extends FrameLayout { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + mScrim.bringToFront(); final int N = getChildCount(); final boolean isLayoutRtl = isLayoutRtl(); final int width = getWidth(); @@ -109,8 +152,18 @@ class QuickSettingsContainerView extends FrameLayout { int x = getPaddingStart(); int y = getPaddingTop(); int cursor = 0; + int maxRows = mKeyguardShowing ? mMaxRowsOnKeyguard : mMaxRows; for (int i = 0; i < N; ++i) { + if (getChildAt(i).equals(mScrim)) { + int w = right - left - getPaddingLeft() - getPaddingRight(); + int h = bottom - top - getPaddingTop() - getPaddingBottom(); + mScrim.measure( + MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY)); + mScrim.layout(getPaddingLeft(), getPaddingTop(), right, bottom); + continue; + } QuickSettingsTileView child = (QuickSettingsTileView) getChildAt(i); ViewGroup.LayoutParams lp = child.getLayoutParams(); if (child.getVisibility() != GONE) { @@ -121,6 +174,7 @@ class QuickSettingsContainerView extends FrameLayout { final int childHeight = lp.height; int row = (int) (cursor / mNumColumns); + if (row >= maxRows) continue; // Push the item to the next row if it can't fit on this one if ((col + colSpan) > mNumColumns) { @@ -150,4 +204,87 @@ class QuickSettingsContainerView extends FrameLayout { } } } + + private static final class ScrimView extends View { + private static final int COLOR = 0xaf4285f4; + + private final Paint mLinePaint; + private final int mStrokeWidth; + private final Rect mTmp = new Rect(); + private final Paint mTextPaint; + private final int mTextSize; + + public ScrimView(Context context) { + super(context); + setFocusable(false); + final Resources res = context.getResources(); + mStrokeWidth = res.getDimensionPixelSize(R.dimen.quick_settings_tmp_scrim_stroke_width); + mTextSize = res.getDimensionPixelSize(R.dimen.quick_settings_tmp_scrim_text_size); + + mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mLinePaint.setColor(COLOR); + mLinePaint.setStrokeWidth(mStrokeWidth); + mLinePaint.setStrokeJoin(Paint.Join.ROUND); + mLinePaint.setStrokeCap(Paint.Cap.ROUND); + mLinePaint.setStyle(Paint.Style.STROKE); + + mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mTextPaint.setColor(COLOR); + mTextPaint.setTextSize(mTextSize); + mTextPaint.setTypeface(Typeface.create("sans-serif-condensed", Typeface.BOLD)); + } + + @Override + protected void onDraw(Canvas canvas) { + final int w = getMeasuredWidth(); + final int h = getMeasuredHeight(); + final int f = mStrokeWidth * 3 / 4; + + canvas.drawPath(line(f, h / 2, w - f, h / 2), mLinePaint); + canvas.drawPath(line(w / 2, f, w / 2, h - f), mLinePaint); + + final int s = mStrokeWidth; + mTextPaint.setTextAlign(Paint.Align.RIGHT); + canvas.drawText("FUTURE", w / 2 - s, h / 2 - s, mTextPaint); + mTextPaint.setTextAlign(Paint.Align.LEFT); + canvas.drawText("SITE OF", w / 2 + s, h / 2 - s , mTextPaint); + mTextPaint.setTextAlign(Paint.Align.RIGHT); + drawUnder(canvas, "QUANTUM", w / 2 - s, h / 2 + s); + mTextPaint.setTextAlign(Paint.Align.LEFT); + drawUnder(canvas, "SETTINGS", w / 2 + s, h / 2 + s); + } + + private void drawUnder(Canvas c, String text, float x, float y) { + if (mTmp.isEmpty()) { + mTextPaint.getTextBounds(text, 0, text.length(), mTmp); + } + c.drawText(text, x, y + mTmp.height() * .85f, mTextPaint); + } + + private Path line(float x1, float y1, float x2, float y2) { + final int a = mStrokeWidth * 2; + final Path p = new Path(); + p.moveTo(x1, y1); + p.lineTo(x2, y2); + if (y1 == y2) { + p.moveTo(x1 + a, y1 + a); + p.lineTo(x1, y1); + p.lineTo(x1 + a, y1 - a); + + p.moveTo(x2 - a, y2 - a); + p.lineTo(x2, y2); + p.lineTo(x2 - a, y2 + a); + } + if (x1 == x2) { + p.moveTo(x1 - a, y1 + a); + p.lineTo(x1, y1); + p.lineTo(x1 + a, y1 + a); + + p.moveTo(x2 - a, y2 - a); + p.lineTo(x2, y2); + p.lineTo(x2 + a, y2 - a); + } + return p; + } + } } \ No newline at end of file