From 434cd38f96a4a87220a8218901622f31e567354a Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Tue, 16 Oct 2012 19:56:03 -0700 Subject: [PATCH] Update layoutlib for jb mr1. do not merge. Status bar displayed on all devices. Update logic for displaying nav bar to whether or not device has soft button. Update navigation buttons to new look. Remove battery and signal from navigation bar. (cherry picked from commit 891b703f7b1e0e396d16477cc66a286da7161b49) Change-Id: Id7cc9ad4255d2c4d2e6461a565dfe2cc17e12e75 --- .../resources/bars/hdpi/ic_sysbar_back.png | Bin 0 -> 1053 bytes .../bars/hdpi/ic_sysbar_back_default.png | Bin 1007 -> 0 bytes .../resources/bars/hdpi/ic_sysbar_home.png | Bin 0 -> 1064 bytes .../bars/hdpi/ic_sysbar_home_default.png | Bin 852 -> 0 bytes .../resources/bars/hdpi/ic_sysbar_recent.png | Bin 0 -> 711 bytes .../bars/hdpi/ic_sysbar_recent_default.png | Bin 574 -> 0 bytes .../resources/bars/mdpi/ic_sysbar_back.png | Bin 0 -> 774 bytes .../bars/mdpi/ic_sysbar_back_default.png | Bin 782 -> 0 bytes .../resources/bars/mdpi/ic_sysbar_home.png | Bin 0 -> 836 bytes .../bars/mdpi/ic_sysbar_home_default.png | Bin 695 -> 0 bytes .../resources/bars/mdpi/ic_sysbar_recent.png | Bin 0 -> 591 bytes .../bars/mdpi/ic_sysbar_recent_default.png | Bin 534 -> 0 bytes .../bridge/resources/bars/navigation_bar.xml | 20 +++ .../{phone_system_bar.xml => status_bar.xml} | 0 .../resources/bars/xhdpi/ic_sysbar_back.png | Bin 0 -> 1421 bytes .../bars/xhdpi/ic_sysbar_back_default.png | Bin 1283 -> 0 bytes .../resources/bars/xhdpi/ic_sysbar_home.png | Bin 0 -> 1421 bytes .../bars/xhdpi/ic_sysbar_home_default.png | Bin 1029 -> 0 bytes .../resources/bars/xhdpi/ic_sysbar_recent.png | Bin 0 -> 749 bytes .../bars/xhdpi/ic_sysbar_recent_default.png | Bin 644 -> 0 bytes .../com/android/layoutlib/bridge/Bridge.java | 3 +- .../layoutlib/bridge/bars/CustomBar.java | 14 +- .../layoutlib/bridge/bars/FakeActionBar.java | 3 +- .../layoutlib/bridge/bars/NavigationBar.java | 54 +++++++ .../{PhoneSystemBar.java => StatusBar.java} | 7 +- .../bridge/bars/TabletSystemBar.java | 10 +- .../layoutlib/bridge/bars/TitleBar.java | 3 +- .../layoutlib/bridge/impl/RenderAction.java | 25 +-- .../layoutlib/bridge/impl/RenderDrawable.java | 12 +- .../bridge/impl/RenderSessionImpl.java | 151 ++++++++++++++---- 30 files changed, 242 insertions(+), 60 deletions(-) create mode 100644 tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back.png delete mode 100644 tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back_default.png create mode 100644 tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_home.png delete mode 100644 tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_home_default.png create mode 100644 tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent.png delete mode 100644 tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent_default.png create mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back.png delete mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back_default.png create mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home.png delete mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home_default.png create mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent.png delete mode 100644 tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent_default.png create mode 100644 tools/layoutlib/bridge/resources/bars/navigation_bar.xml rename tools/layoutlib/bridge/resources/bars/{phone_system_bar.xml => status_bar.xml} (100%) create mode 100644 tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_back.png delete mode 100644 tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_back_default.png create mode 100644 tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_home.png delete mode 100644 tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_home_default.png create mode 100644 tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_recent.png delete mode 100644 tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_recent_default.png create mode 100644 tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java rename tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/{PhoneSystemBar.java => StatusBar.java} (86%) diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back.png new file mode 100644 index 0000000000000000000000000000000000000000..84e6bc89c0829a1dd61d9045baeca62b12199c4a GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0vp^6+rC4!2%?wi~sxrq?nSt-CY>|xA&jf59DzcctjR6 zFmMZjFyp1Wb$=Kbn8iF@978H@y`5p5ArdIkwtwc$s~HAv!WY##ZmgKgrIoQdL6vQb zprC8A;*luF9F@HqON1RgS{6iTnJFz1;MQ$X(0ayb_#|=O?3_t=f9j@PThruu;!bIM z!9LApGk1Qk`Cj>s^{@dCGFseKk=Gskstuu(xVi=GW|) z^vD0wWVMd(+8409=+)INd27n=dc5xgGS|H0OnstSnn*C2QVT!D6kl)@}mr@t{Oxp5r`=?spET`}m zqm#;|SJL7{7P4>o)b{qzlHSQ8AFl7yt6KWw7w3shXMLBPW9wuWcw~Iov?^m!qn@A8 zq(2Q34ZHtbI;iloc|wDuUSXTf);BF%-=9$WS8eX<ib;2Fw{V%q%|)T>`K7Kc z;M*O!WzM&Pnrii$8i5z@qfg(zUZXAk^yvKUo7!FXeJFhSz0||TFRR2``Bku=c&w`2 zy5}Fdln$_&>0J(&bKQ37fF9qaGj(b=UDf?R2&t^TDy-(*DE7{1kIz{p=V?-A6Vn^r ztTIX^5By&~&FxTXc3;{C_XFl~mmDwN{kTEukfodC-}JLe36nh4UM!q#e&*rhf}Ow4 zzx<)~%%DOiXn{n%u)wlcUCWcs3Z+K)rLI=k^Qv}7j==Iw{>Vu*=!kylgijU|gQQe| z*+#U)HKN41C^fMpGe1uuBr`Xa!BF4OSl`g_-^F$1Kn1EG1u2OosaDA#RjCX{28M>Z zh6cJuW+8^AR>qcA#s<0u=2iv<>wT@7Q8eV{r(~v8qH8d>GBkx~xNu}v7*K-@$cEtj uw370~qErUQl>DSr1-Hzi)bjkI>|zDyVAH~_kIjJU7(8A5T-G@yGywp7CCL>4 literal 0 HcmV?d00001 diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back_default.png b/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back_default.png deleted file mode 100644 index ac5a97b24a93193ee6e8603bd5c1f19a08240f24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1007 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 diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9f3009c32c276a07213cc6daebfac891af2e61 GIT binary patch literal 711 zcmeAS@N?(olHy`uVBq!ia0vp^6+rC4!2%?wi~sxrq?nSt-CY>|xA&jf59DzcctjR6 zFmMZjFyp1Wb$=Kb7!P>5IEGZ*dOOoGPsEYOb$&XR$dzWcB^}HK0y}u;H1nz_94~ZlPaATUWXk&O*wC~oZn8J^P0^gZT+8aF8_8<*>)()qv;8E zb{S8^TJt#vMBlTz|C*+J??X#z;+A%2w@I^Y&Th6j>pRK$sp5$b|EB!a?U|_lByQ(x zzeNrj?|$q%es)D2o8|ZW%!YF|zwVT%U;4*!LX4MaXdCCGPXCHsm)+n|c^#{m-;b=rCvBv7IYX|z%MUBP)PAyvr+n9<^ZJRlEF5tKXR`L}nx0S* zXMEqV@T6$7=st$Sj0I=edv7t_x-|Fp`G?V`S+^|RYkM(ik=dSy>bmakr+Y0{DIK2M zDLnC-N~|e24|^}$riuG6XSDB?dpF_gO*^B5OW)M8{7?KU+P`0gcj2i5U!_f6HxOa1 z_>tRgXT`lRL2F)M1dEoqMwB=gr6!hS=I1GdWag$a80s4u>l+&WyST0#s6Z8@ASJOR z)hZdJDwV;=z|c_F&_LJ7EX2^%%GlD%*g)67+{(aUy{}a>iiX_$l+3hBbPeWKhNch= z7mmyd18R@~*$|wcR#Ki=l*-_klAn~S;FejGTAp8&U98|7Y+AVWu^CVugQu&X%Q~lo FCIA(u8jAn` literal 0 HcmV?d00001 diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent_default.png b/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent_default.png deleted file mode 100644 index cb3c4331089fe9e411ba5c79a68bf7548a8e5d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^6+rC4!2%?wi~sxrq?nSt-CY>|xA&jf59DzcctjR6 zFmMZjFyp1Wb$>vDWd)AuKpL!<;S}@t6$}iFN}eu`Ar-gY-thHfaujHLxZQejiq91Z zA^+!!dm6((aL66V-tk0DP0z>Vg~3~wd#<#&4vV?wS`Z* z%)_3DOpxB0p~}TAw{vaGbbiSl&pSmeA9eS{E#-dyr^TEnJ}~j)?I3seKOZ&x`EPP@ zTZx+0yvzA<=ji%Nt()vq+0^6;54-QvJt}Wwr}*bV;YlkkonJb(Z=EW3oMIC{Izl?+mq%3x$*XsByorfXyzVqj=xXkcXu>?y);RzG diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back.png new file mode 100644 index 0000000000000000000000000000000000000000..a00bc5b5f33b14abf8557c06538666d47bbc6b59 GIT binary patch literal 774 zcmeAS@N?(olHy`uVBq!ia0vp^0YGfP!2%?8-k8<^DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5&-9#{Zr!jv*0;-%j73E#fHQaR1HQnHe2YqT1XC%@UMvaGGgFL~3^J zRcPYK$`{-)VTw|cI?K^R_6{Ph+}hrbvlq0oD5^`CPXGN;=UtJd^OU)!+UjR!=S|Pw zZ~pmhoi%f(i_%076`}ve3w0!$)xwG&MH}PSyx22QSI}dl)j%8N1a@y zl3K+g?N>!iYw#(UA{kdOFR$cShv*yA8Np^b6`pg7HXXR}Zb`N6n>D=qD>r?Y3s>#f zS#j}w-KU6){V4`px!3(T6A+m#m1S(6WBGnzhuP%r$NN5Yvv>QinUiE7{C-uwZGg_r zgrxE-!bxi@&aK$lay6%5Ci|PTX`H(RSx+x`mACiX?%R)+RLjKY?rnZ8-FqhH&a-Us zx$8C@c`d@N@AhALXVPu;y)Pc!{8VwUVedET0}szC<}BUUSUPv^o98;qBa_+={$FBr z@Zjzr+NM@_p73UAGY{MIi?V41Y>43m82Ic2e=uV#hDe{Ku0TbX1s zhvtj@^RiW59Q>?f>rQQne>K%h{Pe*Q)5B)ZD10bx@w*9|J_FN-Xo+h?iE~kEVo7Fx zo&k%&R6z<-5=&C8l0m9c8H@}J4Rs9-bdAhH3{9%y{W;-5-!(S%G6ZkOu2zI40H1%fP_+$HN_s-b=-&6TnVWNkMP^XL1M2{oMhn!6$R-SNmQ{SL}{*k-3PEf+j zc~4cu4*OlvWZoe7N#>E*`ig@kFSwLlj}|zYZ&~PjmMe1RsYbp&Q@6_Sua5Gi(I-|^ z?VI>FywmjZ@;!IvoVHnV(A&zyFhtYj%Zw?R=D~#d)_PP*E_~y z_ws^!QETNsX34b-of9sn&1PS-LB8x{?*d<$^OnbDtM)vTOh2LheE0oD{ssp#_l1fr zuVCXUb)Q|e+S@7l$1|oode+*7^Rr8Kp0v6-p<7JSIK_RBkYs#?{Ji!=J*kD9wxQvx zX9;bpf2XE=TzSSA9+dyGoSAH}ffLkKS)Oex*|#6d8dZxO;W)zx-}=^fE9hh?clUlsFfqCYEI8 z=P86_=B6?j>KhvC8yfz*xUL+iKoz7QC9x#cDjB3ImBGls&`{UFOxMUb#K6$X(7?(R z$ThbzFxXOYMgm1cZhlH;S|x4`M^#If05!;fYzWRzD=AMbN@Z|N$xljEaLX)8Ezd8? ZE>>_3HZ9!x*bJzS!PC{xWt~$(696LsHKPCk diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home.png new file mode 100644 index 0000000000000000000000000000000000000000..dc3183bf640f88beb25982fe24e431b241d19a83 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^0YGfP!2%?8-k8<^DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5;O|TTd6qkch)?r*F&_aTICaf77<9HQhtNWwwdZtYg3aF>nX=bS!Nx zGYeZ}HcgE2KeMaOny0&;Y@N^|9DK;J3{a2^#eUanhnY;JSNUG;P zy6%h(a^t-Jvzdvr!q+e_ymRJ`Ri5-m51V(s z@jrZHzs|gFo2GG3^82jK>sDpkeQ$g0>JK!Tt>t>$DntF>H}qeXKcBPZVF3I7UW1gw zp3na*tSh_aEvL2SvZG>~@6BtU)|T7m?lsQ&)c$5o^(kw;8$sfGpG$s!I`7mm?xeG~ z_Z7zeeKAGcHo{@~Z1Hv4lDB5C?|I;CzvA`2Z(;xT)Er2>zxz?}`l>D3LD5gH$4YNbOA>I8DY*CR8{=e+b5dfzTeh4~__H{p zBvIAatU~8wn$J%@S{2Elvc73!s)1gU!+PoP7n|gC9`I#fXFm2UVPDu@(OV54 zcM9@reAy;?V<#`4fpWld*R%Kj&6#y2dHX|&0}h8cHh=kdT*cs&S5Ga^0v+aW9}`)P z!Xo-QADTT664}33digdxg;d`1F9HT0M_o4T@qGWqa8=M!P?X-<`-{~)t>>*okC_KB zb%~a^MwB=gr6!hS=I1GdWag$a80s4u>l+&WyST0#s6Z8@ASJOR)hZdJDwV;=z|c_F z&_LJ7EX2^%%GlD%*g)67+{(aUy{}a>iiX_$l+3hBbPeWKhNch=7mmyd18R@~*$|wc tR#Ki=l*-_klAn~S;FejGTAp8&U98|7Y+AVWu^CVugQu&X%Q~loCIH(yVyXZD literal 0 HcmV?d00001 diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home_default.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home_default.png deleted file mode 100644 index 62ca4276f326843a5f799dd78dfa2ccaea92a958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^0YGfP!2%?8-k8<^DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zI40H1%fP@m+tbA{B;xSfYyR27juOW|o`0h@E#!;B ziV&MG3&OuHX{r!hSs&M{e{{MqQ&k{~U`yQBJI;HzFy?wpepBI*)Z0~7W`5~#js9+f z&(-tp+Zgj3rx?xjQJZ`+<(fx^y3d??F2=yCaW9SqJ~Hy#XtK>9>TLTgwTuP-o400{ zu`pM^y}4#-&*}M22F&8NAFjksFL=dJ&lgHBPSmtA zW39gT;`fV+)Uu*OEkF0?W)>XoJD&GSN-{ck60dFW{5?h=B14K#2lKYIp4XPEd^C;w znA@X6w_bhmy0H1->R9IWZ+{CW*0Nc?-}n68&YY|iHI08tt6Y}OTc>~Tb@lVxzqBG& z-1&AXv{iX>eZ=ppY1fyX+9zHny3lIrrz@J%x^HfJd*Oo5%munr(%SfPZ+mHbs~=SG z>6v=UM^yV=F1KZC_f9^~R2pY|Hsk5sxhKIvxcPxKhj)>sXx{-D zV4R7TxJHyX7o{eaWaj57gkAQq#z}+B-JVzq$-uc$iUE0 z*T78I$T-Bn(8|!j$`r^ow=yu;QgKECMMG|WN@iLmZVg9OOO^mN$bf7J&QB{TPb^Ah na7@WhN>y;nEJ`iUFUl@fa1J&t-1^uIsE)zY)z4*}Q$iB}eQz40 diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent.png new file mode 100644 index 0000000000000000000000000000000000000000..b07f611ab98c121a12873d2c6a8e2b9b351967fd GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^0YGfP!2%?8-k8<^DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5&-9Mh{OH$B>A_Z>Qh&JLDkHy5I3#%aL!b1|N6&K56aR_&~I5PsD@= z{zmEAy)%BUyKTEXJw0vv1QpLoDxO7WBmSk^kp# zc;~?_vqFVU#OAM3R|=O}yhLNsl?4xVDwd=ssO>4w;+b+*SHtOOins7vhX*$#a^E@x z@4g}VBI4s2o0Ltf43A0Z%>2G5No>NJ?4Ck4Z#{vJ;jg~knKL70t|Pn6ln3G7iym!J z=d_SsBC`B$Qu1-z4c)WnRCJ%Mytt&Knfcfx^Jj9h#-}e&u)MRWg?n|@g&7w&@U4$O zvnA)$=dzD_WmX4Tg-=M_xNwy(E3x5UL1f2DkL@p3JNa&~Yx)00eL5&G_8+%CZ=0dn z{<>~GFrYH4pg8DQjn5Zl4_L%y{W;-5-!(S%G6ZkOu2zI40H13*`Lrba4!cIQ(|1Z61@MNQ?dLH6kvJF0+lF zXsj%5oYOGrcR}A5OCEbx&n0JXX)bUuIbETuU=aUws*Uye$F=zfC6ap#kIj%)yW-uw zOnm!)={B_=E}P@O{HpmJoop^uu*2neQ~0(e^XAG1KdYJWB4o0~f&<+O>2*J@J${&| z6I1BDV8Z(~pdQx*MqN}uG0D^4q4Kbj^w zyNfAtdDK-=2@jQ>4j#X*?D%OIY`uc}>6(v4t9Ax7HnvTyIojy9f8#B+$jwvF8hu!r zt{C*~xKwaTuHuDHpFh-3^1Azx`<<2}$jvd+?d!9Rza6^0%NH05q9v{oCC){ui6xo& zc?uz!xv30>`i92(hKBzxt}6#BPz5PSNi0dVN(QM)WiT=@G}JXP(={>{(+%k(&%kzt} Zixr%MO$)a^HUp|-@O1TaS?83{1ORrS%9Q{B diff --git a/tools/layoutlib/bridge/resources/bars/navigation_bar.xml b/tools/layoutlib/bridge/resources/bars/navigation_bar.xml new file mode 100644 index 0000000000000..599ca08bf02cb --- /dev/null +++ b/tools/layoutlib/bridge/resources/bars/navigation_bar.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/tools/layoutlib/bridge/resources/bars/phone_system_bar.xml b/tools/layoutlib/bridge/resources/bars/status_bar.xml similarity index 100% rename from tools/layoutlib/bridge/resources/bars/phone_system_bar.xml rename to tools/layoutlib/bridge/resources/bars/status_bar.xml diff --git a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_back.png new file mode 100644 index 0000000000000000000000000000000000000000..bd60cd65878a39a6389697084a3843d0ef727f81 GIT binary patch literal 1421 zcmeAS@N?(olHy`uVBq!ia0vp^3xGI*g9S($=xr1NQcOwS?k)`f+xyS#2l6-zJR*x3 z7`TBl+(L|(?$-TbU|?zUba4!+xb^myZ-z{&%<+%!jg2carLuBZZ?CA>pvAaxtB7lt zzU!XtN^#sy-mZcyQv(dX^|yKlW!hLd3$TgZ1K%E zZ_aO@d3Rk^#-w+~H+%n|ci3dpZgc+g?R2Bhdm0RnNhJ4R5|_(j=1t{npY?i*^G~yd zPZ#}J74+-$Rr@vkJ8S<&W-*$YrLYQea$DYKnd|jZl*@L#VeB>iU5f;GCN2;W+@-ej$zXvnn! zTRZL#YApc@%kAb~EA7qn`CMhLz4=F;nslw-3+J;MVQV(|Wh94fyLL9aJhEmX)84h4 zxVlPxpKmd(t%ztazxd^Y#TrRbk=Lv0u6$c_X6v6*`zDosK5Fu)+ArL6VN=(yQ0tcK z+5r{Hr)(-_vvDY>JPh=^=ql=dBGGSiR0VgFLOW1{S$>ANM9`27p) zQ&)Wv_{fxgnZvs16Ms2(Q5zIQ7 zP8++VuJYyUU-Db1q_`#i@vJK=o_&pS*Pm(X`Xeh@ugLNH&zYxEH&1X_ctLtr*qTNA zg2Ua<`)s;dpittIdbG=Qt?{nCatoLLn!{$YNV7LP$p2^T*Kd0kyt@?Vcp%Wvh+#@) z&-WL;+aE{CCN18VdG3O@llksB*V8+`%W|>@IEPfs%)ikxBT@eSk5#vq?k$R0)ZLQz zZs}&`oSv?RO1=-mvjtT7KB{$Y_YG~Iq2SW;<@ejzy6PlTCN;|wEPqQ3k4MWadA0H1 zuj!9}iW*F3*lc%&L-L{MvWN#(s(l-#&zdfFrNL21Ce*9$_q59=Ti#eWH9eNG<`h)Q zDcRN<^8X`;sFT)_Pgb($-e$NamA{Hx6Ca5!!fUdj+q-@nXhzZu+rh zTSKM=c{ErYQs^!zoXNeVW{Uagj|G8JiI08Pu6(mUaL2E#bDy03{_pT;aF$8nyLjGR z=W2M$KlfMB&Z~Eoy{esRvNF*3^_p!Yh!zYZtiK ztFb9=ApcS`7x-vcZ*w%MV zm^nY0;U8N`z2y1n3K92!#gu4?Yeb22QEFmIW`3SRNM>#-gQ32mvA&_Q&rUU5(K%BskX?)y)fr0tCr;B4q#jUru{4-=yC60f5Z@u~M zo3zWJOEUZRa)@d^ihb*;(In0<_C-mgGr-aD)zM$=)PFyS4V_|N6xYzb{OVmSyglGAHbacR^6+MUTi@&STX!=XHAw zr`RJY~w?V77owh)24t!B6zY=MV2v z`qWmdghVE^wR~hev$wHHOkl&qu!X^=*(L;R=uLi;)GETUrf9Y<^Uv>`y3c-2>zT4> z^932U_ORVo!wpV8w+TFU{ol<5v2%>d0ncsPe>O85?!KUXfZ@uFreOfw)-P%T4m$vb?>b#lS3>{3+nN&=G)6;!uLVT`(3_O+s3K;EzVfJ z;1MuX{=#99u;=KO+lQ;S&oK=0Gd_OxM{rkoYfkr%WwSRO)6y^ONg8Bm-FWeVl=_cZsqf#iooBcm`a_BRbnFY=KZo_7x~t|}hGxxq%)|JZ=fX?d zg@5X1PA;0I8JFJ4lHBwD$JveM-yhZN-t(QAxv{CdqBWc4SmYy9u@!E=W`z7We`MX} z8uLS1@|)XL7o5BA^ZC7-xa8B9ZU5%awwckJ*I>K)klOLeNuo@T|D38@w_W*8Lc{A< z4?Ng!7|Z*AQtjWwWMX;#_Ldt5-gOFY(0U*II$7XEW|5Lkgpdq-j|Jm4(>06sQeZGb^O5R@i@XwT^wsW_> ze4OicAZXsQOYR?zN!Yh*i!~+l985`s-|2n?%=@Axt`Q~9MX8A;nfZANA(^?U42JrK#`=ba|1Pd8 z2P#knDM(2yNwrD_sY+!qGB7mMH89gPG7d2?v@$fXG6izYtqcsdRGg7O(U6;;l9^VC zTfa>QWe}Xi&D$;i?WLqoP$jZw>~xls$=kU^>bP0 Hl+XkKK|nf6 diff --git a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_home.png b/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_home.png new file mode 100644 index 0000000000000000000000000000000000000000..c5bc5c96ef05100de104df0ae7af7e9ad08acc78 GIT binary patch literal 1421 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 diff --git a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_recent.png new file mode 100644 index 0000000000000000000000000000000000000000..f621d9cc72428dba07d0231b5a2c80caacc556d3 GIT binary patch literal 749 zcmeAS@N?(olHy`uVBq!ia0vp^3xGI*g9S($=xr1NQcOwS?k)`f+xyS#2l6-zJR*x3 z7`TBl+(L|(?$-TbU|@Xa>EaktaqI1^i&=*p1X>>&ADf-<+hX5;<{vgnt;b%raz=M}A`!B5w2z%@7wa{eBE%7&h^!eVEe&sLFSylWo zXIpv0Vn3^lP4kYebWE4E75v8Yp^Ve!h418@r|Q1`p8r*@v2JqEr@yYY%zJvdNvf;q;jx4hP>s)7A#kF0z5f021# zR(dX+ySH!aU^*=Y~0X4mnvBVwpw`e#97#ivt8t59C zg&3Mz8CzNz8|WICTNxOv_qA$9(U6;;l9^VCuEE^O&=jKK!jV~FKn*e=8-nxGO3D+9 pQW+dm@{>{(+%k(&%kzt}ixr%MO$)a^HUp|-@O1TaS?83{1OQ7Q&rUU5(K%BskX?)y)fq^l@)5S5Q;?~=n2YnA4h_rt^UzpKa z_2^Ke?2QJ;Q*1m3rF0H;s!FglwzOR7a`QaP+UY#e!lG{Ch40Z1p8id?-o`vh#S<0P zdV7oNsdz1(=9Lf~8?m&0Rs5E!G}F%pK0Z7Xb#=rO(jK+3-%G1$>*SW(xjelmEBU72 zjm?Sn*$vXyHtOzR3yUga>3fqV*O<+>QCDYoZ{{aKPv<9Q$7&Nww+ghnynNwjlpXkg zxm%Lg(%d-{vmZ=MPS~mt$f(A3J;spb+`2=v(&J{Y6?KSdm^smU+vdF4|BZ@H>iR#K zcKg){%|8dZ-#^(o8%Dg6}VJgpt zNsM7#yc@RIhW!m%zw^Z67Zf$`e3&fz`@-p#&)@c&E9Wl>fATM%a z-`uQ>4$KHr=iSD8Vf_Y_VA=YC_2_%|hm1EbgCb9~#5JPCxhOTUBr`uxAtW<5mBCQo z&{*Hl@ZZICnC}Q!>*kacelLTCxPFK?Y<)aDG}zd16s2gJVj5QmTSmW>IQ+eo=O@f^)EG;nv4y PKy?hBu6{1-oD!M<@=5Y% diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java index daf520b5415ab..bf8658e402b06 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java @@ -210,7 +210,8 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge { Capability.PLAY_ANIMATION, Capability.ANIMATED_VIEW_MANIPULATION, Capability.ADAPTER_BINDING, - Capability.EXTENDED_VIEWINFO); + Capability.EXTENDED_VIEWINFO, + Capability.FIXED_SCALABLE_NINE_PATCH); BridgeAssetManager.initSystem(); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java index 62c886b903067..ec9ec75283eb0 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java @@ -56,15 +56,19 @@ import java.io.InputStream; * * It also provides a few utility methods to configure the content of the layout. */ -abstract class CustomBar extends LinearLayout { +public abstract class CustomBar extends LinearLayout { protected abstract TextView getStyleableTextView(); - protected CustomBar(Context context, Density density, String layoutPath, String name) - throws XmlPullParserException { + protected CustomBar(Context context, Density density, int orientation, String layoutPath, + String name) throws XmlPullParserException { super(context); - setOrientation(LinearLayout.HORIZONTAL); - setGravity(Gravity.CENTER_VERTICAL); + setOrientation(orientation); + if (orientation == LinearLayout.HORIZONTAL) { + setGravity(Gravity.CENTER_VERTICAL); + } else { + setGravity(Gravity.CENTER_HORIZONTAL); + } LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java index 68f5aba1fc121..226649dbc4069 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java @@ -21,6 +21,7 @@ import com.android.resources.Density; import org.xmlpull.v1.XmlPullParserException; import android.content.Context; +import android.widget.LinearLayout; import android.widget.TextView; public class FakeActionBar extends CustomBar { @@ -29,7 +30,7 @@ public class FakeActionBar extends CustomBar { public FakeActionBar(Context context, Density density, String label, String icon) throws XmlPullParserException { - super(context, density, "/bars/action_bar.xml", "action_bar.xml"); + super(context, density, LinearLayout.HORIZONTAL, "/bars/action_bar.xml", "action_bar.xml"); // Cannot access the inside items through id because no R.id values have been // created for them. diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java new file mode 100644 index 0000000000000..cc90d6b33abed --- /dev/null +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2011 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.layoutlib.bridge.bars; + +import com.android.resources.Density; + +import org.xmlpull.v1.XmlPullParserException; + +import android.content.Context; +import android.widget.LinearLayout; +import android.widget.TextView; + +public class NavigationBar extends CustomBar { + + public NavigationBar(Context context, Density density, int orientation) throws XmlPullParserException { + super(context, density, orientation, "/bars/navigation_bar.xml", "navigation_bar.xml"); + + setBackgroundColor(0xFF000000); + + // Cannot access the inside items through id because no R.id values have been + // created for them. + // We do know the order though. + // 0 is a spacer. + int back = 1; + int recent = 3; + if (orientation == LinearLayout.VERTICAL) { + back = 3; + recent = 1; + } + + loadIcon(back, "ic_sysbar_back.png", density); + loadIcon(2, "ic_sysbar_home.png", density); + loadIcon(recent, "ic_sysbar_recent.png", density); + } + + @Override + protected TextView getStyleableTextView() { + return null; + } +} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java similarity index 86% rename from tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java rename to tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java index 7521011c76e87..5c084121d123a 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java @@ -25,12 +25,13 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.LevelListDrawable; import android.view.Gravity; +import android.widget.LinearLayout; import android.widget.TextView; -public class PhoneSystemBar extends CustomBar { +public class StatusBar extends CustomBar { - public PhoneSystemBar(Context context, Density density) throws XmlPullParserException { - super(context, density, "/bars/phone_system_bar.xml", "phone_system_bar.xml"); + public StatusBar(Context context, Density density) throws XmlPullParserException { + super(context, density, LinearLayout.HORIZONTAL, "/bars/status_bar.xml", "status_bar.xml"); // FIXME: use FILL_H? setGravity(Gravity.START | Gravity.TOP | Gravity.RIGHT); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TabletSystemBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TabletSystemBar.java index 456ddb4983ce2..5ddb34eece8c3 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TabletSystemBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TabletSystemBar.java @@ -24,21 +24,23 @@ import org.xmlpull.v1.XmlPullParserException; import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.LevelListDrawable; +import android.widget.LinearLayout; import android.widget.TextView; public class TabletSystemBar extends CustomBar { public TabletSystemBar(Context context, Density density) throws XmlPullParserException { - super(context, density, "/bars/tablet_system_bar.xml", "tablet_system_bar.xml"); + super(context, density, LinearLayout.HORIZONTAL, + "/bars/tablet_system_bar.xml", "tablet_system_bar.xml"); setBackgroundColor(0xFF000000); // Cannot access the inside items through id because no R.id values have been // created for them. // We do know the order though. - loadIcon(0, "ic_sysbar_back_default.png", density); - loadIcon(1, "ic_sysbar_home_default.png", density); - loadIcon(2, "ic_sysbar_recent_default.png", density); + loadIcon(0, "ic_sysbar_back.png", density); + loadIcon(1, "ic_sysbar_home.png", density); + loadIcon(2, "ic_sysbar_recent.png", density); // 3 is the spacer loadIcon(4, "stat_sys_wifi_signal_4_fully.png", density); Drawable drawable = loadIcon(5, ResourceType.DRAWABLE, "stat_sys_battery_charge"); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TitleBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TitleBar.java index 5f5ebc48d9f4d..c27859f901c19 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TitleBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TitleBar.java @@ -21,6 +21,7 @@ import com.android.resources.Density; import org.xmlpull.v1.XmlPullParserException; import android.content.Context; +import android.widget.LinearLayout; import android.widget.TextView; public class TitleBar extends CustomBar { @@ -29,7 +30,7 @@ public class TitleBar extends CustomBar { public TitleBar(Context context, Density density, String label) throws XmlPullParserException { - super(context, density, "/bars/title_bar.xml", "title_bar.xml"); + super(context, density, LinearLayout.HORIZONTAL, "/bars/title_bar.xml", "title_bar.xml"); // Cannot access the inside items through id because no R.id values have been // created for them. diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java index 7323c6af88397..1db7994a5772c 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java @@ -20,11 +20,12 @@ import static com.android.ide.common.rendering.api.Result.Status.ERROR_LOCK_INTE import static com.android.ide.common.rendering.api.Result.Status.ERROR_TIMEOUT; import static com.android.ide.common.rendering.api.Result.Status.SUCCESS; +import com.android.ide.common.rendering.api.HardwareConfig; import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.RenderParams; import com.android.ide.common.rendering.api.RenderResources; -import com.android.ide.common.rendering.api.Result; import com.android.ide.common.rendering.api.RenderResources.FrameworkResourceIdProvider; +import com.android.ide.common.rendering.api.Result; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.android.BridgeContext; import com.android.resources.Density; @@ -98,19 +99,21 @@ public abstract class RenderAction extends FrameworkReso return result; } + HardwareConfig hardwareConfig = mParams.getHardwareConfig(); + // setup the display Metrics. DisplayMetrics metrics = new DisplayMetrics(); - metrics.densityDpi = mParams.getDensity().getDpiValue(); + metrics.densityDpi = hardwareConfig.getDensity().getDpiValue(); metrics.density = metrics.noncompatDensity = metrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT; metrics.scaledDensity = metrics.noncompatScaledDensity = metrics.density; - metrics.widthPixels = metrics.noncompatWidthPixels = mParams.getScreenWidth(); - metrics.heightPixels = metrics.noncompatHeightPixels = mParams.getScreenHeight(); - metrics.xdpi = metrics.noncompatXdpi = mParams.getXdpi(); - metrics.ydpi = metrics.noncompatYdpi = mParams.getYdpi(); + metrics.widthPixels = metrics.noncompatWidthPixels = hardwareConfig.getScreenWidth(); + metrics.heightPixels = metrics.noncompatHeightPixels = hardwareConfig.getScreenHeight(); + metrics.xdpi = metrics.noncompatXdpi = hardwareConfig.getXdpi(); + metrics.ydpi = metrics.noncompatYdpi = hardwareConfig.getYdpi(); RenderResources resources = mParams.getResources(); @@ -305,7 +308,9 @@ public abstract class RenderAction extends FrameworkReso private Configuration getConfiguration() { Configuration config = new Configuration(); - ScreenSize screenSize = mParams.getConfigScreenSize(); + HardwareConfig hardwareConfig = mParams.getHardwareConfig(); + + ScreenSize screenSize = hardwareConfig.getScreenSize(); if (screenSize != null) { switch (screenSize) { case SMALL: @@ -323,13 +328,13 @@ public abstract class RenderAction extends FrameworkReso } } - Density density = mParams.getDensity(); + Density density = hardwareConfig.getDensity(); if (density == null) { density = Density.MEDIUM; } - config.screenWidthDp = mParams.getScreenWidth() / density.getDpiValue(); - config.screenHeightDp = mParams.getScreenHeight() / density.getDpiValue(); + config.screenWidthDp = hardwareConfig.getScreenWidth() / density.getDpiValue(); + config.screenHeightDp = hardwareConfig.getScreenHeight() / density.getDpiValue(); if (config.screenHeightDp < config.screenWidthDp) { config.smallestScreenWidthDp = config.screenHeightDp; } else { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java index 813321080b7ba..b6771315b09b4 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java @@ -19,6 +19,7 @@ package com.android.layoutlib.bridge.impl; import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN; import com.android.ide.common.rendering.api.DrawableParams; +import com.android.ide.common.rendering.api.HardwareConfig; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.Result; import com.android.ide.common.rendering.api.Result.Status; @@ -59,6 +60,7 @@ public class RenderDrawable extends RenderAction { try { // get the drawable resource value DrawableParams params = getParams(); + HardwareConfig hardwareConfig = params.getHardwareConfig(); ResourceValue drawableResource = params.getDrawable(); // resolve it @@ -75,15 +77,15 @@ public class RenderDrawable extends RenderAction { // get the actual Drawable object to draw Drawable d = ResourceHelper.getDrawable(drawableResource, context); - content.setBackgroundDrawable(d); + content.setBackground(d); // set the AttachInfo on the root view. AttachInfo_Accessor.setAttachInfo(content); // measure - int w = params.getScreenWidth(); - int h = params.getScreenHeight(); + int w = hardwareConfig.getScreenWidth(); + int h = hardwareConfig.getScreenHeight(); int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY); int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY); content.measure(w_spec, h_spec); @@ -99,11 +101,11 @@ public class RenderDrawable extends RenderAction { // create an Android bitmap around the BufferedImage Bitmap bitmap = Bitmap_Delegate.createBitmap(image, - true /*isMutable*/, params.getDensity()); + true /*isMutable*/, hardwareConfig.getDensity()); // create a Canvas around the Android bitmap Canvas canvas = new Canvas(bitmap); - canvas.setDensity(params.getDensity().getDpiValue()); + canvas.setDensity(hardwareConfig.getDensity().getDpiValue()); // and draw content.draw(canvas); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index e93b41d27a9b1..7169db3ed98d4 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -24,6 +24,7 @@ import static com.android.ide.common.rendering.api.Result.Status.ERROR_VIEWGROUP import static com.android.ide.common.rendering.api.Result.Status.SUCCESS; import com.android.ide.common.rendering.api.AdapterBinding; +import com.android.ide.common.rendering.api.HardwareConfig; import com.android.ide.common.rendering.api.IAnimationListener; import com.android.ide.common.rendering.api.ILayoutPullParser; import com.android.ide.common.rendering.api.IProjectCallback; @@ -42,13 +43,16 @@ import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.android.BridgeContext; import com.android.layoutlib.bridge.android.BridgeLayoutParamsMapAttributes; import com.android.layoutlib.bridge.android.BridgeXmlBlockParser; +import com.android.layoutlib.bridge.bars.CustomBar; import com.android.layoutlib.bridge.bars.FakeActionBar; -import com.android.layoutlib.bridge.bars.PhoneSystemBar; +import com.android.layoutlib.bridge.bars.NavigationBar; +import com.android.layoutlib.bridge.bars.StatusBar; import com.android.layoutlib.bridge.bars.TabletSystemBar; import com.android.layoutlib.bridge.bars.TitleBar; import com.android.layoutlib.bridge.impl.binding.FakeAdapter; import com.android.layoutlib.bridge.impl.binding.FakeExpandableAdapter; import com.android.resources.ResourceType; +import com.android.resources.ScreenOrientation; import com.android.resources.ScreenSize; import com.android.util.Pair; @@ -120,7 +124,8 @@ public class RenderSessionImpl extends RenderAction { private boolean mWindowIsFloating; private int mStatusBarSize; - private int mSystemBarSize; + private int mNavigationBarSize; + private int mNavigationBarOrientation = LinearLayout.HORIZONTAL; private int mTitleBarSize; private int mActionBarSize; @@ -183,7 +188,7 @@ public class RenderSessionImpl extends RenderAction { findBackground(resources); findStatusBar(resources, metrics); findActionBar(resources, metrics); - findSystemBar(resources, metrics); + findNavigationBar(resources, metrics); // build the inflater and parser. mInflater = new BridgeInflater(context, params.getProjectCallback()); @@ -209,19 +214,57 @@ public class RenderSessionImpl extends RenderAction { try { SessionParams params = getParams(); + HardwareConfig hardwareConfig = params.getHardwareConfig(); BridgeContext context = getContext(); + // the view group that receives the window background. ViewGroup backgroundView = null; if (mWindowIsFloating || params.isForceNoDecor()) { backgroundView = mViewRoot = mContentRoot = new FrameLayout(context); } else { + if (hasSoftwareButtons() && mNavigationBarOrientation == LinearLayout.VERTICAL) { + /* + * This is a special case where the navigation bar is on the right. + +-------------------------------------------------+---+ + | Status bar (always) | | + +-------------------------------------------------+ | + | (Layout with background drawable) | | + | +---------------------------------------------+ | | + | | Title/Action bar (optional) | | | + | +---------------------------------------------+ | | + | | Content, vertical extending | | | + | | | | | + | +---------------------------------------------+ | | + +-------------------------------------------------+---+ + + So we create a horizontal layout, with the nav bar on the right, + and the left part is the normal layout below without the nav bar at + the bottom + */ + LinearLayout topLayout = new LinearLayout(context); + mViewRoot = topLayout; + topLayout.setOrientation(LinearLayout.HORIZONTAL); + + try { + NavigationBar navigationBar = new NavigationBar(context, + hardwareConfig.getDensity(), LinearLayout.VERTICAL); + navigationBar.setLayoutParams( + new LinearLayout.LayoutParams( + mNavigationBarSize, + LayoutParams.MATCH_PARENT)); + topLayout.addView(navigationBar); + } catch (XmlPullParserException e) { + + } + } + /* * we're creating the following layout * +-------------------------------------------------+ - | System bar (only in phone UI) | + | Status bar (except for xlarge tablets) | +-------------------------------------------------+ | (Layout with background drawable) | | +---------------------------------------------+ | @@ -231,20 +274,31 @@ public class RenderSessionImpl extends RenderAction { | | | | | +---------------------------------------------+ | +-------------------------------------------------+ - | System bar (only in tablet UI) | + | Navigation bar for soft buttons, maybe see above| +-------------------------------------------------+ */ LinearLayout topLayout = new LinearLayout(context); - mViewRoot = topLayout; topLayout.setOrientation(LinearLayout.VERTICAL); + // if we don't already have a view root this is it + if (mViewRoot == null) { + mViewRoot = topLayout; + } else { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( + LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); + layoutParams.weight = 1; + topLayout.setLayoutParams(layoutParams); + + // this is the case of soft buttons + vertical bar. + // this top layout is the first layout in the horizontal layout. see above) + mViewRoot.addView(topLayout, 0); + } if (mStatusBarSize > 0) { // system bar try { - PhoneSystemBar systemBar = new PhoneSystemBar(context, - params.getDensity()); + StatusBar systemBar = new StatusBar(context, hardwareConfig.getDensity()); systemBar.setLayoutParams( new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, mStatusBarSize)); @@ -268,7 +322,7 @@ public class RenderSessionImpl extends RenderAction { if (mActionBarSize > 0) { try { FakeActionBar actionBar = new FakeActionBar(context, - params.getDensity(), + hardwareConfig.getDensity(), params.getAppLabel(), params.getAppIcon()); actionBar.setLayoutParams( new LinearLayout.LayoutParams( @@ -280,7 +334,7 @@ public class RenderSessionImpl extends RenderAction { } else if (mTitleBarSize > 0) { try { TitleBar titleBar = new TitleBar(context, - params.getDensity(), params.getAppLabel()); + hardwareConfig.getDensity(), params.getAppLabel()); titleBar.setLayoutParams( new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, mTitleBarSize)); @@ -298,15 +352,23 @@ public class RenderSessionImpl extends RenderAction { mContentRoot.setLayoutParams(layoutParams); backgroundLayout.addView(mContentRoot); - if (mSystemBarSize > 0) { + if (mNavigationBarOrientation == LinearLayout.HORIZONTAL && + mNavigationBarSize > 0) { // system bar try { - TabletSystemBar systemBar = new TabletSystemBar(context, - params.getDensity()); - systemBar.setLayoutParams( + CustomBar navigationBar; + if (hardwareConfig.getScreenSize() == ScreenSize.XLARGE) { + navigationBar = new TabletSystemBar(context, + hardwareConfig.getDensity()); + } else { + navigationBar = new NavigationBar(context, + hardwareConfig.getDensity(), LinearLayout.HORIZONTAL); + } + + navigationBar.setLayoutParams( new LinearLayout.LayoutParams( - LayoutParams.MATCH_PARENT, mSystemBarSize)); - topLayout.addView(systemBar); + LayoutParams.MATCH_PARENT, mNavigationBarSize)); + topLayout.addView(navigationBar); } catch (XmlPullParserException e) { } @@ -334,7 +396,7 @@ public class RenderSessionImpl extends RenderAction { // get the background drawable if (mWindowBackground != null && backgroundView != null) { Drawable d = ResourceHelper.getDrawable(mWindowBackground, context); - backgroundView.setBackgroundDrawable(d); + backgroundView.setBackground(d); } return SUCCESS.createResult(); @@ -377,13 +439,14 @@ public class RenderSessionImpl extends RenderAction { } RenderingMode renderingMode = params.getRenderingMode(); + HardwareConfig hardwareConfig = params.getHardwareConfig(); // only do the screen measure when needed. boolean newRenderSize = false; if (mMeasuredScreenWidth == -1) { newRenderSize = true; - mMeasuredScreenWidth = params.getScreenWidth(); - mMeasuredScreenHeight = params.getScreenHeight(); + mMeasuredScreenWidth = hardwareConfig.getScreenWidth(); + mMeasuredScreenHeight = hardwareConfig.getScreenHeight(); if (renderingMode != RenderingMode.NORMAL) { int widthMeasureSpecMode = renderingMode.isHorizExpand() ? @@ -483,11 +546,11 @@ public class RenderSessionImpl extends RenderAction { // create an Android bitmap around the BufferedImage Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage, - true /*isMutable*/, params.getDensity()); + true /*isMutable*/, hardwareConfig.getDensity()); // create a Canvas around the Android bitmap mCanvas = new Canvas(bitmap); - mCanvas.setDensity(params.getDensity().getDpiValue()); + mCanvas.setDensity(hardwareConfig.getDensity().getDpiValue()); } if (freshRender && newImage == false) { @@ -960,12 +1023,14 @@ public class RenderSessionImpl extends RenderAction { } } - private boolean isTabletUi() { - return getParams().getConfigScreenSize() == ScreenSize.XLARGE; + private boolean hasSoftwareButtons() { + return getParams().getHardwareConfig().hasSoftwareButtons(); } private void findStatusBar(RenderResources resources, DisplayMetrics metrics) { - if (isTabletUi() == false) { + // status bar is on for all but x-large device + HardwareConfig hardwareConfig = getParams().getHardwareConfig(); + if (hardwareConfig.getScreenSize() != ScreenSize.XLARGE) { boolean windowFullscreen = getBooleanThemeValue(resources, "windowFullscreen", false /*defaultValue*/); @@ -1050,22 +1115,48 @@ public class RenderSessionImpl extends RenderAction { } } - private void findSystemBar(RenderResources resources, DisplayMetrics metrics) { - if (isTabletUi() && mWindowIsFloating == false) { + private void findNavigationBar(RenderResources resources, DisplayMetrics metrics) { + if (hasSoftwareButtons() && mWindowIsFloating == false) { // default value - mSystemBarSize = 48; // ?? + mNavigationBarSize = 48; // ?? + + HardwareConfig hardwareConfig = getParams().getHardwareConfig(); + + boolean barOnBottom = true; + + if (hardwareConfig.getOrientation() == ScreenOrientation.LANDSCAPE) { + // compute the dp of the screen. + int shortSize = hardwareConfig.getScreenHeight(); + + // compute in dp + int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / hardwareConfig.getDensity().getDpiValue(); + + if (shortSizeDp < 600) { + // 0-599dp: "phone" UI with bar on the side + barOnBottom = false; + } else { + // 600+dp: "tablet" UI with bar on the bottom + barOnBottom = true; + } + } + + if (barOnBottom) { + mNavigationBarOrientation = LinearLayout.HORIZONTAL; + } else { + mNavigationBarOrientation = LinearLayout.VERTICAL; + } // get the real value ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN, - "status_bar_height"); + barOnBottom ? "navigation_bar_height" : "navigation_bar_width"); if (value != null) { - TypedValue typedValue = ResourceHelper.getValue("status_bar_height", + TypedValue typedValue = ResourceHelper.getValue("navigation_bar_height", value.getValue(), true /*requireUnit*/); if (typedValue != null) { // compute the pixel value based on the display metrics - mSystemBarSize = (int)typedValue.getDimension(metrics); + mNavigationBarSize = (int)typedValue.getDimension(metrics); } } }