From f96811cdf564469a7a654a0c876288c9fd14f35e Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Wed, 18 Mar 2009 17:39:48 -0700 Subject: [PATCH] auto import from //branches/cupcake_rel/...@140373 --- res/drawable-land/delete_handle.png | Bin 2104 -> 859 bytes res/drawable-land/delete_handle_normal.png | Bin 2768 -> 3587 bytes res/drawable-land/ic_delete.png | Bin 1445 -> 651 bytes res/drawable-land/ic_tray_collapse.png | Bin 1333 -> 1229 bytes res/drawable-land/ic_tray_expand.png | Bin 1324 -> 1225 bytes res/drawable-land/tray_handle_normal.png | Bin 1420 -> 5811 bytes res/drawable-land/tray_handle_pressed.png | Bin 2354 -> 1792 bytes res/drawable-land/tray_handle_selected.png | Bin 2451 -> 1828 bytes res/drawable-port/delete_handle.png | Bin 2135 -> 982 bytes res/drawable-port/delete_handle_normal.png | Bin 2976 -> 3249 bytes res/drawable-port/ic_delete.png | Bin 1441 -> 646 bytes res/drawable-port/ic_tray_collapse.png | Bin 1112 -> 1182 bytes res/drawable-port/ic_tray_expand.png | Bin 1101 -> 1190 bytes res/drawable-port/tray_handle_normal.png | Bin 1615 -> 5261 bytes res/drawable-port/tray_handle_pressed.png | Bin 2470 -> 1649 bytes res/drawable-port/tray_handle_selected.png | Bin 2529 -> 1672 bytes res/drawable/box_launcher_bottom.9.png | Bin 962 -> 833 bytes res/drawable/box_launcher_top_normal.9.png | Bin 1388 -> 1685 bytes res/drawable/box_launcher_top_pressed.9.png | Bin 1786 -> 2023 bytes res/drawable/box_launcher_top_selected.9.png | Bin 1821 -> 2033 bytes res/drawable/pattern_carbon_fiber_dark.png | Bin 0 -> 419 bytes res/drawable/texture_brushed_steel.png | Bin 6726 -> 0 bytes res/drawable/wallpaper_dale_chihuly.jpg | 0 res/drawable/wallpaper_dale_chihuly_small.jpg | 0 res/drawable/wallpaper_john_maeda.jpg | 0 res/drawable/wallpaper_john_maeda_small.jpg | 0 res/drawable/wallpaper_marc_ecko.jpg | 0 res/drawable/wallpaper_marc_ecko_small.jpg | 0 res/layout-land/launcher.xml | 2 +- res/layout-port/launcher.xml | 2 +- res/values/attrs.xml | 8 + res/xml/default_workspace.xml | 71 ++++ src/com/android/launcher/AddAdapter.java | 6 +- src/com/android/launcher/Launcher.java | 129 ++++-- src/com/android/launcher/LauncherModel.java | 370 ++++++++++++++++-- .../android/launcher/LauncherProvider.java | 185 +++++---- src/com/android/launcher/Workspace.java | 38 +- 37 files changed, 639 insertions(+), 172 deletions(-) create mode 100644 res/drawable/pattern_carbon_fiber_dark.png delete mode 100644 res/drawable/texture_brushed_steel.png delete mode 100644 res/drawable/wallpaper_dale_chihuly.jpg delete mode 100644 res/drawable/wallpaper_dale_chihuly_small.jpg delete mode 100644 res/drawable/wallpaper_john_maeda.jpg delete mode 100644 res/drawable/wallpaper_john_maeda_small.jpg delete mode 100644 res/drawable/wallpaper_marc_ecko.jpg delete mode 100644 res/drawable/wallpaper_marc_ecko_small.jpg create mode 100644 res/xml/default_workspace.xml diff --git a/res/drawable-land/delete_handle.png b/res/drawable-land/delete_handle.png index 5784c26fed837fdb72ed171e5ce200bb3fc03391..43a908170bc02cbe03b4d009497b06bcdef04b10 100644 GIT binary patch delta 800 zcmdlXaGPy{M?KSDPZ!6Kid%2)80JeEO0Xr|zQd>{z@o#Lx?+Noh-PGfR9o0otp+vPs; z>93{Z3!iBJt6Sf@zVfc?jURs#1mE4^-L^ou(w&Qw&vE@8>5?_|!CN|Wxy)>)NOtZi zW;bZodpRX{iLKb%|1S3?B`YfIU^if1_aeme$?dy$4=QW^ew(y0TyW9iOCfq<+{Z3W z*{G6u>WgoQefPWnb!Wd!P3m#ExH$Ke^{?9hHLLIbV-~zAdE>&(D=TN)YYA6{uvz~Ju zY+zvGP@n>F$n5L>GxaT}q}?VsuJ?MEc8J$THF8ylkkujHy2Qydd?u%y@?LsJXZaKb zo`kedZy!BkUmaH5YS6IrT*&iNPcCPCi8PVw;hs4A=@fw@{&Ty(AAWeea;;hN)~E{| zO}4*SJvLoRknih1FJEr8HgEAq1?|?9S0)#G{a%~i+~j`qB7g0Dd#4{u>-DB(&8nU6 zbFM6U?X$4G_fFo+cxB1jk?`i*t<)?FIsbiq$K$sx)!DN2j-E^4k;gx(++HZW7j$HQ ze`^1ZQ%=inP16=l`!zM-bnDNn&oct$J~tGw-dzwv2Mm7{20vF_Ic+`rH4NMf9R zVYj!TbNTjDu7=M4zuuWPHD>!qN$xENB%kXuvN5Pl%cyA$lt0Y?1fH&bF6*2UngG?6 BdNBY1 delta 2054 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 XHBz&(Mmen^00000NkvXXu0mjf@6^h) delta 2724 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 delta 1390 zcmV-!1(EuT1*Hp+NPh)KNklyRzBE5M1T~3f zE*x*}x##?T-}!#et6^D|y6c*nn!58n_8WP5d6wO7SGUPB41YrfgF$tEevY5UoeKN= z`(yVk_3+CuP1Ca3YBZP94-q@khV z=Z=n!zXO4Q382xp28`?!6%|E&KHn!JBO@;&k%&7tH&>Xsz5q&HU0tc!+1V%9^R%n0 z>-FjB>DyyW0Dt)X{-}6BPf809vmEa78Vv7*4Nj+?C$P<&3DOs zJ0)NcWGgHzjOczucJ}x86;5AMTwJUGZp!QRehx4;5*1%(!@BU;*w~K%{Wu&BS6^OU zs;a807>jZMu&qu`PHfl{Ng0^&|7D+?ob(Ze3hlsNLP&ru_VTwX(9( zG&(x^4d${fhAI?tBi4oCfA8ny9t4N>_4fAuishG-of0sZ z#+sgd!#@0<&c6N4b-09Rf7>5=d^iPE(ZBSRrro?8e ztgOtxy}ixN1otnL2k1X^S}M>}h(xO}BJbsy_kXyLSzykI@gC<&N=p2eW{RZ15J^T` zTbmC)G6X+*$L)6iiTx!I=%5}Qm?%y*M`pm<1rBkzv9a+ftgz+rczo2AGGjai7&>om zZXO{U$Vs^f|KAS}51VLOU7?sqXNm0S%<|3v!9iCB2M0fEZEgLF?vF;nV&+LdmzY!&=3_c%0v+rGxYf^ z0YGK!Di|=bj?X**4i*BNCe3QyPzKEV)=3U3si~>?0mXR;iqC|#`uh6sG4~9BjyQ*i zzG!c6{{m}A$Z%pky|Luo2bh=zxrc20Q-4=i_ZyOCAYNKjMMcF+MDkB4SzDZgPlXUP zF9B$o@8j%e4w#-ag*8NKHiiSrSzcla;e#g3nnMs|2;lfG4~?Ro=GOOT1Xv=d_^A!? zCjmxZr0)=r4nWq3qbH`72Qwz7lp*tADyCGQ)7MHTq0eQcAJa3toLUE%*sBRUI)Bqz zglDc%)a#qhg5F68XdQ%}%Ti_RLFqzgL^mfH)0yR*96*>#tg{&hrdJ1HMTQPoXHO23 zamI9j%;?DAvEnO0$yWUP(bBpMLk|eu7c7VBttc6J7qmzM|d6?EOj;#2MGv$L}(fM&(bm5cAs?`X=}+FJ2J z2S)g|e;K3&j3)&H0d$*NsEsaypd!@9>%N{{E{eFxvc&hCXIsvBVVS^S>SryCKw`Ud zZ(v|4($mxP9A+ATxwt=?*gosMnC?sQXA^S5XqkS&H)n)?nh_s^Lt8B^Ew8}Dt7Ko( w$vPAie%o!i>^{zaofhs3OiQ%43V0*H0NbJpHJ0dfTL1t607*qoM6N<$f-|_OWB>pF diff --git a/res/drawable-land/ic_tray_collapse.png b/res/drawable-land/ic_tray_collapse.png index 15c625748d67a0faca4b65ee204c560e56267601..c11f8b3f9f096e57635d286241013fdd46946620 100644 GIT binary patch delta 1209 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 T0)#_^00000NkvXXu0mjfkrPmz delta 1305 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 literal 1420 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 C#!D&y diff --git a/res/drawable-land/tray_handle_selected.png b/res/drawable-land/tray_handle_selected.png index 106c8f41ea62d0c4057127022a444232b82b075d..1dfdf1ece906758b446b0999fb2896308e55762f 100644 GIT binary patch literal 1828 zcmb`I`#Tc~1IOn$zsHP!MsDWi}u z=WO9QTgzo0riR%`M=mp)Tr`$)ZnUDPA9;zi*X*jbTq-Kc)5hT_X4@WklH(tI>b&S!|{){E46Ie|Fuwp8&3$ zi&E?(uX>pI+kP1086H0u%Uf^Czw^VTlSG^)QeM#mZRAJVNOgcjo1oF@yQN@Q7X{+bVe-c{fZp%5nn- zRL%}6ISEf|v8PYfc<@3%cx~s_#nq}jhtwNyu8~?GcKy+JT0qlZJj_0PV4S5yHs&{x zOn8*3*Y8vbx&BLPLN>5ElIeKZ#R|kSVTA(HAI1IiczonR*Ax_jWuj(AxSbuU@hiH^ z$`>oAMBW>5HR5)Y&u$$L|5-bBSP+K3hF4oHx~IFG*2W|($Ar+}twCoydy}UX>UsyN z#eD-#MxcS)DfNtW;%@wo{F+kcc``LrlZm26Tn1d#H4(QZHgIuZpOPQ@{!T6$l0-HI z3?E6vA^VzRaX=>eem^5SQ&j^?U9)7)g`oeUIW!TH|*URtv z?oQO537#i&{(8S-AMstmlI3y@{r5dCNaR~w{euReFOym7K@EI9ZgorFmV~Iky#a_K&>B=e+PlLJN$5vY6jzAj?z+e2sKVk zTU~&8*?nW_dhx;5gJA3WYSD$Tak$79OUB0a&?aG*!1LO8o5XTRdo4?cAV3{RLV-$i zzB*6NL2m?3@Gs%Zql8rr+Q;OSK6`TUsOl%K*V-|}QXx@Mp9YWpxiF=LPkX6<{i}Jg zz%aPGytIZ-K_9?hVcbJE`M9zv0Z=?(P9n^a_uOo@>TS`-)6tla1cT~)v;R>jvD6~q zA&$goy!}%@qDhFJ*Ve3m{%ONpc5X0RvA9T(hVCq9#3Rio_|~DAgrIj`ml>*2v|zm! z*z-GXZkOKN*ak_Jzp6q@S)HfqUd{H6R8%?YhJ`t(&keudFe8yzdVhHX2^|HS#M}JA zx*m>De@%Y)W`$p>6u8FGPy40bGgTGT+;L+)rgsa2hmZgIUfU8GvYT~T5k-H~a9o#_ znPE{{H&pSc8_^!f49lL`BF=9O3&;z%3M)evh-0%~%7RJGh)Vyg^1J}!@P!lS9m^_w z43mvM4*C`*WuIQ2;iqH5H|?pTqv3!ujyTvwf;_Y)A5vFexYZW-!Wq@5!KlAFwSLhr z!s|ltm}$3llDbRq_C+D@wl#?HS>LjtaRVPkFF~Glm54Fp0Z@^?IAQAKN{;KsbYU3& zX%b9kFvQ!DVE1u_QjYiD27990Sz~g`MQvjk47F}0^QcNdhmwJD8tiJ;V+SiayaY-Y zcQk(n7gb!e$rt=>5vO62wHjlD;tnd(<}@4If6mtH%$e6xV${B|`v39;Q*B}P*PU@bJpcdaq&YqS literal 2451 zcmb`J`9Bkm1I9;^GUP00j^s$9awNy5&5;bFT)AR|SdOeY5;6BNxv$kUXY^rxB4_k9 zM=^3NIm!$(gwI@I+qb{q`@{G3`Q>?@U!Gr|=bd5;GZ#1|bqW9g2v}M`;D1~n0N_&L zY6B*_y$QJC>tZSaWtTU+Mhk^#>Y1-V~?nXkq()@9Q5p(fc&`S)D5CvV!yC+Sx0 zW@$0Xxwl2OM_i*H$ev9UZt=h0d|U(+WY>my*q4W}bYCB=bF*wK75wnph$eXbW^K05 zLi1+wwSmQdicr4#Grd4j(~+B;1L~WX{C>$x?6XHGuQK{qk55h44~7)sm+rD}*qy#9P60}eGd1StooKeVWX z7h-y72`TH5=k;759Ygn^*Lr@x^eQszaS$vZY<4to&vdBHu~qEqf_X8c_94cVierVi zr_7ET(aU!zojVC*(Z1sZHFS6{v5c82nO{_Iao^}D*4dqKmB~FiVIr!7bcJehw|ddc z5Vh=mI;A{vd4ImSQ+x8DA&jgxikaz{z}8rss`#iK*W>R4R@317T-buvBOF^9`37+; zueHhyxn};>IE?0q?A-j7PBgH(xC0RX*&h5z-~0aQUU;x7x}tzPD%%hrVI*g9ivgJ4i_rYiN{HB}N83S(QH~G%d)a&1#Qg@SO1h6e_$_RU zx%D3b%L1TvsUSU}ISxzlVC@P$37mR$!|@QyOoKF)S-U6P>zXNh6^w{4wkc1YHwm&C zBlYX+__{}BD}-`-mlOhoCaR5Nz5=Pmnn{t~SGS>eJpCCX-G0v}{nufJp{3i`WgGMm zpH}q+ADgRqPfO!(&&-csvLVfNF)~gs4@Q*G8`GcOxh3l$T?BAe7s%l44JFq15okUm z?#DUbK-%|NCM=tgS+f@CEVF09(At~yrTJtfO}1h#-_RfV*DzwSGE!HC;5Dz-oTu@! zs-0q=x%bbpbJ4jbQ3PB#G`=eQlQTCy(CEWF7mTtUcD(kJovv1!u%8r2N^|OAV>-T2 z9E=s|e%J4hr%M^!jg%p0;`xy5o-TDc6Z5}@#K71_@@LijH$RVUfCPzas&{`I?D*8J zM&x_aic4H8MDHqoy?{r&t6wLZsn?(7<9^1yiKabb?c!Cd>S1 z-&*R|WKG0j#W%D&Iy!F9{W)o)l;Y>Gs^!(`xh{;V)w~nzrfbIN85z zE5kS*icVr~G=&0ZpLg@oWu2ck21wU`<2rdV?f9bc=QukK%KX{C2dPX^>73ErLxUxE;6@nxvoU z2m}2;)A2D$QuTDV8yVQSo_6QNBeBF(?jre!i}C(SPEA)-$;Q~rN-Yz|({gv(u@=%5 zxqcqQ7RBbcOZB4lUq6Nm-u?82NV?RRo?LW+W|8hueD+tC;YDV5*wVR}O6f%38>(sI z8grFk7dD-k352xiJkn&+iFvCK{;&f(KeQQ67$G#TmTGT~^Ji2A&OV|ua9V5Au!Y=2 zaf$Uf9b1|OBMB{rn|Kx^Y9WEUcxoIR_<#o2SA_tk)WjZ6#xVB#vdd&l@Z&=<2@B<7>$j$Y zsOlS6B&UDS^A4|afHow>mR9j$K8NDl=jvR~H(?A^d7qWTliDG=YA^h?x_jDdgkK(0KvUD*Z#}0X9Jr><>OFZD&MBw4WFJ}9DzB zpP{`NBPiqdma>2ltwCh0@l@vRJs5|5w88FZiHIZNW|<8(s$YfsjIX@vouytjO`+cVSkpe|;q%sXk7oSE0Tkgu);=3!koi*h|5KE#B< zUb-}lvQ9d*m8?J=)G9~CO1pu1ULor?afhrwuV(cAMAgR~EI%hZraLiCQL1e;$?o>> zun6?=LX{tq1=i$1SSukDE7hnFk%g|D{mp{q>c@M=BTI3PsJ2YT;#>*l;O7{`@$z@0 zKh5)tu9@FDu)92q1TbRYKg0o5^sUd}RF vNh3!6q!7&6%UAz>K=_})f!f?L;o=48a0T)bJ*9;IP!_-v3WGG5ddB}3`08`l diff --git a/res/drawable-port/delete_handle.png b/res/drawable-port/delete_handle.png index 9ce09241127fd43d11d00812572764fcdf1e45a8..94a5cd0c0fead37f71891eb119b5da95130fa5b8 100644 GIT binary patch delta 924 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 diff --git a/res/drawable-port/ic_delete.png b/res/drawable-port/ic_delete.png index 88330e75b7870f7b5125c0008f8f196b9d1717e7..382cba974ccb307c8d29bf954f836917e6b04f75 100644 GIT binary patch delta 585 zcmV-P0=E633x)-dNPhw-Nkl3jFGJ{08kZm1TKX(|@#8Y;R|nZjdeHy{`lk ziNt2J*=$FnQ6Znt_pNNo<#JF_ls4Jg^=q3zC=`lA^irvmP%4$4tZb^)>VCamC)=>A z9zdO=5GO!(%ywTfnu@vL9$RNB!7lK+SD=EZ$tFJ87~3jjU@2K zG#u!{&|P}X0M+r`RMVaV-P8<-GYE(#_@Q%5U{Vde=o}F+&vHL>i$`GYJuvqSSRL1( zL!GBP;V^|^43-_!`PLlhL@xveJcWHpl8#BC>w4dzZs58EnM_9ITNMs_1nj$9*PWqL z$9y=?07Bku3g$R#G#c{QKVf{%Pt&nAKzceR&6Js>G zn9W?c+}!V;@0{QHoyT|7uq;cx$;(u4_<9TAEdaaxn4FwUDSwD+F|xC>Er-LQuB#lw zFjOEAP=3E3KaG^-)z{beI)GbThH09X&1Opp05ZaCI4uTl@ZQYH$x*YjvmdRjtn>p! zUJ?VgNF;JnUtj-odwcueKA+D7pvb)e(A$E7f{54a{lw$(JPU`zwOLtN;%WSXadmll zsb*$o9%0Yp&VSC%m#3$v_ht*)*<1`D+v9UXzv($fE!3qm`M!)WB-;J`gUKVQGT zzW!xbSJz8^yQ$OK6Jlt~&(9C*ai+KX`}+#sR23E$Du9^m@9+N{Ms0LFCTD|OXmoV+ zM}T`63WX{!E-q9>MMabq0Sfli$;pWgd%{-$82?|6iGPWS{^R50kKs9mm~__p`MKKN z-EGXx%~i|G%Z(!=Bi~>x!(wSbF*iakg#36vGc!}|?d>&=jg5UvM*!5IdIE-X-kzSG zUm<=$-LC-vrPkEcRM+_U_%r-=Qjx@#iptB&RdI1KJ$f)VH}`;`=)KU)yRx!U!3az7 z-NnVlr+>@=uG{T)MMkjx6@Cx&_V)gfi~)6YbmVrqTuxHQO?v#83j~svm!}#U8dNYC zjPDaUks(v4hNz7G4f>s^4tLTVAe->qq~}hjlZ-^YPj+QwWJK?j$pr^^Ye~xdQD|lc zZCwcggshU1lGW|)Z3+>@zcAuse3?8{q?e{thktk|-{qapSPocVA_w<-Tq`OnTD3H4 z;{cGkMr&)U7cm?{oZqRft^E^nMcC-1J{^D1yX_!O*ex!rCrZCzo2 zsNk``sj10B?@-fOD68KO4-Xp|5?!&-s(Vdub*A`aqQar&!NI}LT3TBE;&ok?FkGY zaSau8-qzOk1!O&BEb+WZdms@yQM>f+pMRQ~n%~e|e6g0Q%F4=~qjG*itKQ-oVje{D zK8N8Yevh%4J^;PB2n(o;4BSo_VOxzVMvj;WM<$KYV}RhdYz!n0hDqO_7Jx+KF)s{> zw*X+SFt#+T8xk2wxWsb3H3Jd?xn&)mN0sYqx~!ah`dV7^fZplE3mr(}tRUX%%ztSW zmHt4Y_ix=R{p1sHx-q>M+?Ih`m7(sT9tJX?GsQIlDxN2vBXv{TX06I0KXJ2OCP@eJUY_DRXnJG@`wutB2?gkmwbD1#Oq zkWP4~Dv(^1*wg!kg@q3{H#dhc)qmu0V&b>y>FG{%NEbS#3!^(H9>?(T@T0Z0wGX&Q zOHw0U0Hl;&aTbV9NIN?_14~Ow1DJZ_QxQh+ug}iTA^>EM(VT_9AHHJO3+Sa>kJ8EkB$n0O-24Kby|~Z+k;noL sFxz##AXO5^%k8cJw1#x8f>#0z0BQ6JL$K-f$p8QV07*qoM6N<$f*7W$K>z>% diff --git a/res/drawable-port/ic_tray_collapse.png b/res/drawable-port/ic_tray_collapse.png index b6b8a77a7ed3d33b8baf0a8959c13bca465d2ba1..712d18981b61678aaa8cb1a7ef18ba0c5a69b0ed 100644 GIT binary patch delta 1125 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 delta 1044 zcmV+v1nc{z3C#$QNPh$GNkl+mL0k_c;6gMezP3?xoqeD` zAjEw`_5n94VnFb1!hj1G5oWDlFkdi@;#=pOqHa^E=~klyGYbQk>ZGggJ$35Ty*G)M zmlx+>eiB~*dI7Mou;60I!LrF@GGo4bety2ha1QGn92^9H6@LH%r!jbaeSJlki{K6| zkw}Dd=m#L2r>Cdj@$s>R?>>P1{4{|1`T24xmGWRN%mDypHV6ZN0|3tb{e1uM9mQB!Jo3*)oFH7?_4<$eLDFAfHvjwdUifes+JyPW>D=Q4{0Wfvb1>*YpI)LSE zVWuMdD8X^pq@C1iQB^iJHkz*qYIAdwz^cp3%a;IO7k?0B58qw*@bI+~%RsSMq|$$k zjEuO$!@~*y-$P6d1h1M4=jP^IyxW0s%(q&tE>@P7mTK@*W^mC2jv~NOeB0mO59cN= z73X+{qI3oa?E&cb?cL(HRm{uah|(C>?Dr6#5933`{Ip0TnVOoS%GV^gGb{3byxfTF_>8}NwOG#WamEQ+S2QZmMCN6^vtKBP?NcCXh?2Z21S3+saP3K%=F z0DrK{003GPjwvqYcHDr{dxK9*Oq8&;tnYmYfWFNv7+DJt+{Z-K`3QabuGir>!>o9A zb{1KT#>dCGhP5ONF6A43xqJUzDKHrv`A0#BIJO|6Na+-w;rv8{Pm)On8*MGzR8o+M>1^`Yv7W=`!2@PQY O0000y}NPiSBNkl?%tib z=bSk+yVsvFI>%n^-r4!yo!_2wX6BsM=H@0SJ=)Z2wUW1mbAL;?ue3GV6s|Yfbv&_- zuSa`q=>s~j0N6suNOkaQ1;CvHL3cc4$0h?r1waKrrCkI-_rn3*XmyzC7-b-+0JwAD zw}B2@9UBM?1CCI~mja;D&H*6i_#Ehs<;Qq+j8%sN#g=k{J0kvK@LR8rHFRJgB;25m zF9krQodrM#Zhr;PwezE!AD!ylt`5uzDi^qY5Of@#1HLRjdeu=}uU6p>BozP^0F`za z03GM&xV{4P4(G>2brjc!s_^kDo&w;`0idk_umHRt^5Z@_9#r9u8+4qY0^lP~M!VqP z;2;9Pb_IAx^5bZA9I3)2094u@0B#}x>{Wo*sXjy_5PwdPL?=a*6abaB27WCh`gSX> zuK>R3{Fr+4%{O11ot^#7i4!MIKK|3ke>O5UVmkR4%}U0kPxyE0UM%jgas0KVZ`v^V z#p>6zj;VZ`mhZ0DR@c_9U%&p}4?q0yllR|$|DVm#Ep*-AMKGn@5O*f@araFa#jb#fTRdHLTs z4;+Td6wBgu$m4e`twSC0IyWvWR_BJ)>2%7YZQ7e({pYKHy!YOFfBxc&FaDk1`Zhnl z%a41NcwFcNtpebqPb1m|2TuGQuQogzqr5h#Kdjsz{@S24uKYa7%E}7dy??j$)YDJRz4OjHf6Te=rz&o|TRodm zRewDw04nVc2)YT7LI-&0jW^!-{mBz2XS4fR34ELb;=t!Q9~S08umUi0zxs_q2;Y~0 z)rC2bDbJPxqy>>flk#@?NZ=LJ4S|1%vP?4o{PNlk0N%&TPeq^49H04h@eE)v z6F*ixBLzPNK&4&a0R8fpx88c|x2Jw_>VMT@a7v^D9glT5A+iE$bmTl(q)7U}^imWJ#08tUunfE9ylG_DEjgh5IKIwZ>Cdm{I08`RaxACuNbYk#D8 z79j7!QBnX@+669fbZTnqS*$w~0gC@NAz+9=Vj1|@$TbHCE2M`+y_)0&HSvuc4~xP< z{=5tmsjrOyAqy{_1%!*wl@tJ#b^!!SAndd|KPQ8?4pdC!35;}l8?fJ(aneEwKpTOSv>7=s2U z8o+L_da$U{xbU9o#Rq@&+k*^*`HR5n$`Z=O=ODa}TSM)2_3xT4Z7Xh{0K%^RzF%wv zXc=eg`z!w|$}Bj|^@ruNXbFds0-(|^0pei5R{(;~UFZ%5yZc?Gao5FQc7NAh+YJE8 zgO?qolK{tq15XDqsE13#!B8L%#th_0{c!#W(24`Mm2<(aTvxBMO;vs=P;}t$;`??D zKw1Is0Fv$mIjG==0O7NR&tRjs0o`sFol6I8G#mpht`i3=5B@^CaJ~f8UPWU zOHtMIK`=;Tx+1`kv*}Vj9ujALeigvEa&WppXNS|Wc45x1@*`5v zgOvyUuoo}Vel?%~sDA*cv>#8-gTo@ga{lK4q!`4vmTwKXuPPn^2TOHdo=Y-uPz)vk z5ch}6!9Ym>8xU~XP_O2~eH~!{zmh@>Qjs*6>?z}-2_IZ1E^>dr_&qH@r&}wx z%6MgeSLN5PrBr%kNhd)LI0xvts|o}>&^XZ&feD%Q1J`szqn6o2w;q78)4|)JmAm-vZ=3GfS7tSV&_=jRxqY6sO0V-{ioRNZJ zKwe$AS}N;1-449=@@wV5y!y!??A*C?;-mr=3CT<-pB+VD=>gP+U?E=HUNlas9sy^{ z@{`V-ljOjQL4T6mGd;o;yL$@@3;jMkocH0}xiYTn>tbSL_S~#;fC_+0`$2Bd6$AE( z=_gA4Utx*P4c=o%k3oC7uNNdsKo}4?t_X9GI4%Yd0)%LZj86;UBuef5nlP!%*hEdR zw1&4k>jewMxj2lu!(-FOyl&OqFT$jck&*(S(q40b)qlqR+4HkLeED{N5@ddU-ap;t zTkVbxVMmC#zqZMn zmD-zJ_kVWA_9SxvV`~A)qG}B05NQMI69;g(3=&r5sXD-eOF9X1fH}Y@h)7mjV*7m& zpb_H=0x$&m#Q=;OMPPY|h6+riem2o2V8$GHIg$4Ga3PJ@Z?QU9Wh0aWRNCJsmk+{g zpI$3XN)_hXXXj^2k?h*vufhEv?!!c9!iTwZ&VQ=26QkXk+t|YfPQ4vHl-?Ul1!_!{ z`{%%ANnlCpfvisxaUa(OUmLj|C6^3go+KW~;9a&a&)4_sp}b#Ts`?f6_4)bpaSm8X z0Z?fd2@Sf5sR@|Q|JL$9H@GK`=3x`lrGX}Iw!ZSeflc5$KOdN5>X?pCIDea9uI51x}1ydnFJy0+42dK5FXTI=(UP^DM#& zS}Q$Z>I8@apwhmJ!k6bS!`f(npx(T5vjhbfR?H0FyK~QjS7{Qy0tW1i$Z=9J@bLE_ zBmO+R9?WD!FX^~50$fhiHV8PGLnLqBo_{%Da%B_XGXri7gDnp8fabVf!#F~d5hqKo z&PCYV{2Ywue?>puTkiMa+{<%iKbK**@979q094v94$uwso8R6X4BSeTT)wj$fCIiy zIJnBhJBd@6+BekTss|J&uHwA0FAfJPC{GVSmI7nIh1x9OAc7;TUC*Qw=n^?$En7zQs7GTC4db8m1Y40%)wbahtFLrTj5M$-EQ z^+x>pcbQz2SpwhnR z{+wtwIXPMC`bv)!6<|#MBoCW}07wE3C$b<|0wE4&UNmK(Ox`Y51_n*fL4P?glhz&@ z3UH#yd(26)a|~F6B{C+A8}wmLzOPw2B?UmGJtQxR<%9UrrM|(_Vqh+Pztj)Ae9432 z(l<-gnK;v{Mg4;Sglh%?;=VvQ@bPOvKqvVLv5|ZX1kTr^bz#>8SYvNKn#jTZ;rkF! zzrK8_|Di#BtvWyjK&8Fr0DtX3uT=sZBNE0z$VOaBN+4nrZ%)d48bG~EO#^8MOE$q( zru>)07H5?GbqO{HtWKFJ8hCTYO9wK?@6=#Tj42W`iNz8GZwv6yJ|umuqyVV2PgD%RLlcMK=+UFFp8vV!8Z$>{ zV0~j9#_~VD&W(VC6@Rvs85t}vP~f$3WT7!$dx*B*r6yePZ@jL~*BQ``5X9|aVB<5v zQvP`DqEBzb1<+1ETJ&l0=lZn>o0*;|e~)d9k&lLw0-(}9=m86Q{dceT9U$d@Hx_S{ zgZaWM7ks?Ci+2eK5&%G;z(LNJVM4K(>;)EfU<3=VB{9;f}a?<``uj?e-!|g_Ko|i2I`HkZwy3G2Of)A z$f39;B{0~X5pZ8IFhP1l!llJP#b&`GYQN-#mto@ztNG3lvIB+h3PIc*Sqo?eyIZhc zQw&G-C_W~f+kamCdQmyQ9}(#!$U&ub2*fvRn@$>}cmXl7{K9urWDF3pEQrUqu1VX% zg6j-TI@mBTS8tM*O?nW(@_w;>K094v7XrQIcL=A8`Q*rH-fEv;ZtH86;Z*UH&QxU>VpA|U0!6SFeS!*Lk0IujUx zO&Mmz^*|o)_&P^lzmzdl5c-ONX5dahNp*lqyGz_zIT^4KQ}5!|wYu~?T;jGEu*JfY zruHMC9e(=pwixQfXpqW2zs_bSj=}voq73$PmtJ7 z6E3cb=>?Dx_a(>tkYK=%O;nf!uv$op*b=9yIzRP zihu|4$p{Ik2-hZ9ZswdJZv&pV3Cwq4>oJ0n1b=A)CuRaH0A?ixK&3q-WC|Xi-8BXd zzd#w!e%kOpPAlaT0G*KmPcnla%t%MTC|JM8)*i+tS^|F{CY*o~Z4z4fKCi1=Fz#pE zl@tJ#_K!{;Kj{Z&u#S!G@ZjQUxx0fI6D5m}Em|0jjj2itiX|(|e3^=sf!mc47*FL3 zvwu0j*)Tm{+)cz+yf%?pvnGZSEOin^0N;e-u&dMY$Byd@c|fW4!CyYuB>okK*xOj^ zVN24@fV}ThiZ@glEWMOY66GXsV_Ugj*Ve{uO0>cKUb(*lckbUQ&v+>Z--Ur^LWBE! zw+7npn~clikOjrU?hFzam?I?{sT&AD1%D9a&C3YDxvouk|8k=2*x5Uon(V;T#1u?U zOs3zn#Ka9r6Eojs>&I4;vD#!zHICmO z{(=(G2;!ZWBE%0x=w^Z_AmU_riAAk8l z%Q!q-4ly}zX?yv8+CXn-ggw3N855%irc?V~1lN!S4w(o?$##td@1+5eYYcXoSlWM4 z5R`m{m_#42{m|J;|F~|hhwla3ITHg0aU8|oXMo`x%X5cTHZi7zI+HP&Dtj2vlg?7! zk?}0yg7j|HVZ?~@4n`V^*n2L5V1M5V(&ls@#{$Wh0X$xVSQx+FQD#1~Bb5+#(|wRIli zcOZ5RS&o#>_ge;JmqV)Dx_`c_>({8sD`8?G_55OGHtLrMCzN^y$$Sm-=r&B>G!VUF z^@vTxMB@r$WUKwz^xcqrwiJ%sB~`+9o@*+uq+<=Z$qa&JSWTW~pcVm{TP2RH*axxP zePjv_(1u%#$Tla=wE%UZ&A+OAxq!Ggv%%g=&Ur~Qhe0^R!=-q!`+tGX&Sv8MpkrfR z(^wnu7bsSL&P_>M*QAFp)<3b#gO?l3lJfkltRsreLgdYpSiBdnAJ_GDf&V_t>-HZ6Wb(7JYv(Cr!lv$gF>|9yalgq?QdKuYBTI!5k#p zn;pXjX(8e*^`C$tK#YMvXj2YEf_ud&ks=f& z6-^w=b-dT37Rr3cgx&ldUw0C-38lm2(ibQ zWu6DU!X%5OnPr~+&F*+N;d!0_0GLPu0RjL5gm~^ipXg=X_kTqFCiGHAcr9Lg(QA(Z zgaDyu;)^O7R`Y8Fs851XxlQGT9%LXPKsdw17m2PfEGw+OCJ7=yee!easuq@0Cqoh; z0)#V2eaSlMrTj{Vl?p48VuB>7W%^q$KRc{yUDb<_G#Dc+x*&E$@>8PA_;tyzZ1_DB zR(%pA1$HjMD1YHa;ydu`U0AB055s?#P=tU0p$qA+UVch?1AgUHJ^t?T&4q=9#j(QJ z{NUi=lx11{^qO7~+O}OOl}dlT`s39vPkwmvyZ>+Hu%ZKulA!1BDwh<<6d3dhFp^(7 zl%Epc(9)fy8!Ia-tJlA{ez)e-vWJIzka;jrtv-@knE za!rmejDG~@0@Xev1)hJBbV024RYL+?zQ4Tc55!yLN?BC$^IWg-n&m0#XpDMhRVVGP zR;yB}RAgjiC9@j6TrAOeIg3GiqEbbo*Ul)BQ}@cq%_+#h zb$}+e8xY`yN-z<{&7zdHN>a0H@8=MIQ-3RENq#IZh4Dg55pWK$vwj2w2t5>_Q*)$H zD5xbFEw@+8HG+@KHH)tKv#};6XisB50s@5I3GnLFRmoq;OFEryxxM<>R_Wi8IIcqi zJfYp~_9Gxb=%D~>PE9t78`?x*ssP*VM?iqkLjmd*fvExn1PE~$z^<;#!2g%F_kW8` z2O8RLK!6u90d8(?%2shJI6>cvR4OH7g)tc)A14W&(C&8o5fC8sP=M8gs*H||O0q8* zJinqb?0DijZm>=B?;$`v{RjvUdMLnaGuI@a|H#$LQc2vVXZ0N2MB@^QlGC4WfS_H140@T!xfB>O~2~a(!_VUnWNhVuA<-m2_U>mLi zpWN=r zkARl-!Mh*RZa{zl00px%93jkmw{|PVv-V;QR@v(K``Tzg` M07*qoM6N<$f*so8%>V!Z diff --git a/res/drawable-port/tray_handle_pressed.png b/res/drawable-port/tray_handle_pressed.png index b9d8e02d8b110c09e43cd957b94150836360f0ba..bc6e03f87cd19a621e3d0641a14d808862d1ac99 100644 GIT binary patch delta 1596 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 literal 962 zcmeAS@N?(olHy`uVBq!ia0vp^$w2JO!3HEZ&AoLQNO2Z;L>4nJa0`PlBg3pY5)2H? zC7v#hAr*7p&UN&=?I7Y1FJ$0*WmU))A?_vbw4N#y@J*9xR9+CLaHomYyQ*W|4F$!8 zUM_1dO*2b4o}d=n<1Wd+aWa#y{SW(05%p=uPS*dcf3tB)<_3#n+&0&eFaMa&p2?`~ zAYH+_hAI2^@89x_-@bjzFq_@|qt0I_nP>Oz-3)Kuys2T^#~j~S{2=<@KPCw#&IwF2 z-9iMkoUtR{dEZQqZgw)pA&pBLh2p+qUyg^J$}ur!S!jeE1*#^?%fwPA^h>k= z5%R`}F%=>}q2eu0CHBWD^{<)8@Y;UjXtKU6GLMQUf<}@_>Ab!CA z%`D00n&093^bZOLg)ZY#)v|YBib+)6xn|c{>kvs-NzTbV5=oEEPJM4(n#Hr3y+Hl( zE$aiSu7a9o)pK~ZulI9`dCTvAXGW($_`IMTo5O|4dXn$56ppf4o#~L!R$4SevUKvp z%y)Cx>a0! z?7ec=d4{xfHlOJagEl@jtzWZZGKafGa-sB=4}5?8(#{BPal0@}b?rGNnet^5mTlS8 zd3Y!D^Xc<8iG2%K*SwsTe0V`S)4Mab?x`oFGOiE)kRE6j8u!!U(LTm2=`x#tzP|B~ Zap(Pnl%Eau%D_y?;OXk;vd$@?2>_cFj1vF= diff --git a/res/drawable/box_launcher_top_normal.9.png b/res/drawable/box_launcher_top_normal.9.png index abaff9597a51dcf8453586bbbe434dfd13e0979c..30b17b29f02d532bab1a3bd146974ef82c882080 100644 GIT binary patch delta 1632 zcmV-m2A}!t3Y86zNPh-5Nkl@E`<1 zBN9Yc|ADXv|Azbz5$OZ!DBp5G>hzN=+{>s6N8h`I}Rr*y|jWsph<2buJ z+V&JayQjN_srTvkeeYGb24f6@JPgBdroaq%2EzzCjOR2+&VL0@XIKxE1YHgcpZ%~8 z=Ccnhg%nv2gkYqwFvIb3KJzl^N-ro@njoYRWov4mbueL#2x(N=+S+FhMF(P~34$m9 zq*=;7$pJ|MAt9i}lzjOiaqfUtx`G}EDk9fl6!vu1`k4myzgWXe!LpyQ*5hlj5! zDk^@pEbHf7o`3cpx3{+oo12?|wzjtZg&!Te5k{07HKqXc?=zIBFclDa2L}hQs;a8~ z$d$xt4Z6I%{CjtI_utO`m1CD;do93xR^*HE&NT%LnIobI!m$EM=|9e?A6HjbVSRla zwzs!)F4smwLj$z5v_M;18`!q}ucIKpIfu`M{ii^=5r0v`a|pt)(vT=qMh1ew6AKFq zFfi~7jE;?qAY%~rKHd<&KYiMPk00kb4AV4!a1MSid$Ni&>5(UJqVyaBJ)l>=)dSpZsN(bt=o>3G#7XnLa zHbX|k;D11p7b)O7;qV(FPgla9N!90lGNndG0u0J*9vKv)0)d2m!O?J|gOH@!rbvLe z6zURH+JS^NAf23{M#mitCo(9?6cy3ISg0cdBZBt~$v!9$CP73z8s(HQ438vkCd!lx zf&&q9752~|#PI5Nql$So$nX%EQh_Kk<${pL(|K!yCkN0_2gLHJRdhTpvU;U!PiO#h>kAdjo7E7;rHgPNKe zC@3g+@HGg75XND+O5uA$`!1&5CsV$6JEN*h**u~9CGe*n9oN^_Fg-o(G;E)szP=tN zCx0g)KR-X|nyINN*x%oW#>Pf?{rYvnHLgs#Zu6P1ai5>9OuoDefPu{;!;VW;P-SUl zWraI-aBvV#Pfy|f`}Z(5HWqg_f|!|^;d8`mEX#tOogEHEmoVIFk&*Vu2!;#50pe_N z-==oF#0}y=ryd_4Lt$Yd2XJ_J$bpQGj(_s=Z{ED&Ksq`);Khp<5Q#*fwzd{xvDjT= zko|=N1AUS;7;56S1&|<@w?#!o(AU=o%gf7rP8AguaCCIUft;M2@LbW}-p(Q5=wKBO@9#B& zGB6Sl!ok4-l$4ZkI8q64&X_km)}G=y1AReEntd3uyk$x!uEPi#9CS7&>x+vEXliPT zM+MFoOWNJtT^Ju9_w7Rnp}ZM>1b-N=^J%;j_l}I906`G5v$GroR#&EJ#>-WlZ&_Ix zuejd5dj}H}6P`e1^P4FQk~s{Buhw!Xj3um9seqokVYT%3?OWbsVAF>nPm`Vxp&|a=F$!>Ce}SF%+}s?WCziU^)zt|l ztn9q~s;zIIGn56x`>Ls@45qTO5=KTwU}IwgdV6~lK*%Z!D=UPAWiR$47$NF4j|KzF zKPvJBQ$S?e>^z0!ja@g&6o2Lo)yeWk!ebaA!^6Wo$zz_;S8b_yFF;);$!cj!WdaX) zpMlQR9qiSIU`6G(D&dy-EcT0y-1z$b`EnS!|5y5I zFfz^=?qfy*#2{ecHsmsezQ7e*d_yGbIU^E@@??cjteE*M77D)3{wW{dY=7*D e1rf;q0t^6Qr4+CkTc* zs#zh!QF4Al#gfLMpCuriP7so@)X^rpmV+tOh>$E!9b>ZVgc1-gT^ggDEdh{>qt00i zND2rE0$P+hk5TuNqKeA^1SgtZW^yQn4nqzhA~Qz(9OOXsLY!(!mVzF5K z@bK{8)6>)cyk76$!bjJFy@-AUg_?psPT+ot)sdp!V1KYI>%kiX0|VbI5XwTopnpgW z;5e6XK;s2-3RZ%C6#Z$FrLD9DJSk0CuFgul6f|P}kc>`KnlKoJ$Z%MG%}V8>!$V@t z2r5Jdqqnt{qQiobotz?wfS6qz)OH|g8=$9V(9vNja}|pwfv_uVlr>>63Ps#z`86v! zC{x-Xzkm6gm0m$>q$wJRrOd_2AlTGi9i?ke8L(aezE`ZwRDH_o_)?}IU>qGC!SV62 z<`}%6Zj6ovt?JKo-ISut{_UV#!^6W630$n4Fx< z28!nATs9A%PcW{ouArx<2Wo0+;N|57_V)I07k>>C6BBP^R#sMEYikPz2M57!x5L4~ z0rdCxLuY5F;l(9m#p7{h#Ekhe89KMNwic?Ys-Uv65{iq9VRv_zEI0&$AT~EQp}oDG z0CTxq(Ad~W#^D$v7p9?+VaAAQYHEU^p&_`tyMx!)SF)hGySrg$XNTP1*w_HC*9+Cv z)qez5MMVX)wzfijeZA_U{1TC2R{4BB5+T>u*AR_H$?EUw>Vk`l3j)I9@el~*<>llW zqvRueU>FQDrYKsN|1q+$hD0I};(VvmN#O82PYgk{wY8;W0HZR3Au#A)IG9--9UbuS z@BlYAH>8N;oLH6xzu%uWB8-^7VKDMRSbwayx3@`@U_qDW_4M=vi;IhJdwUC`qoZFN zM!tYpUtfoomKJb09K;X?T1iO>G&D4jVjd2MVSIf2!`_=@EX<>6cQ_`Bmeti&SX)~o zEo)g>8I+cmk{Z$5+Y2WrC!~fT5WJ5-a50XJjeQLm_;C4>qOfDa4IS<^5CFEXn17ec8yt?~NNU2iwWz2F+-^52TEFBA>y0)ZDXz5ekKp9*90Kr07tacTQnoWJtU4eEZh#J(3{c z`>dQt25lAyCdqPMGcY=67=;K$a=Ziqqavp;aG!x7EEvi#a+;?6e*cwKAubGW1{mvq rEWT2dePn9U_~~d)R+`yh{1IRPqb4$~+&~tL00000NkvXXu0mjf0j7Uf diff --git a/res/drawable/box_launcher_top_pressed.9.png b/res/drawable/box_launcher_top_pressed.9.png index 4e163d4271bb0705f8a3a2840f8be2fdd52c4f02..033cd48972460e7258cec5c93c369c2a3a1db1e4 100644 GIT binary patch delta 1973 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 diff --git a/res/drawable/box_launcher_top_selected.9.png b/res/drawable/box_launcher_top_selected.9.png index 01b1c4e1e0be0cda9609b429dc744b0732559475..3ef394c09b4b4d537996ee181a5f7c50111293fb 100644 GIT binary patch delta 1983 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 LNkvXXu0mjfh1Wx@ diff --git a/res/drawable/pattern_carbon_fiber_dark.png b/res/drawable/pattern_carbon_fiber_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..44e050f4c933f8d2870e7fc6ae1bd8c5b874b8a7 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1SGeyEo=o+k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7+pPG978H@y}544bwokL^`gtZ-9`Ub3;AjvS|Ty$yvT9C zJjs)f@2uULZMpaRS1G|)Go!qA+R1+n>9u@bRsQ#)=`jiY`;NAu-^KUJehs-BU$XY= z)BbgJv4@+Uh9u80Z4=X3-o|=*W#YjiEy+oWlB-fY+EOwOo|wQBYNX<9v?T$^2TMd5 z0QpmSPEO#_m5`jY(5nq7A=bllGCnkEhg;|}j% d(a*rl5GZ=*mdlwfF~Cq~@O1TaS?83{1OTPkoHhUe literal 0 HcmV?d00001 diff --git a/res/drawable/texture_brushed_steel.png b/res/drawable/texture_brushed_steel.png deleted file mode 100644 index 73b3dfe63e3764e92820356fb6d1ab49eb626d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6726 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 P5P||wRi;YXB + + + + + + + + diff --git a/res/xml/default_workspace.xml b/res/xml/default_workspace.xml new file mode 100644 index 0000000000..fd7adf7614 --- /dev/null +++ b/res/xml/default_workspace.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/android/launcher/AddAdapter.java b/src/com/android/launcher/AddAdapter.java index cbcb3380ab..996c619a90 100644 --- a/src/com/android/launcher/AddAdapter.java +++ b/src/com/android/launcher/AddAdapter.java @@ -79,8 +79,10 @@ public class AddAdapter extends BaseAdapter { mItems.add(new ListItem(res, R.string.group_shortcuts, R.drawable.ic_launcher_empty, ITEM_SHORTCUT)); - mItems.add(new ListItem(res, R.string.group_search, - R.drawable.ic_search_widget, ITEM_SEARCH)); + if (false) { + mItems.add(new ListItem(res, R.string.group_search, + R.drawable.ic_search_widget, ITEM_SEARCH)); + } mItems.add(new ListItem(res, R.string.group_widgets, R.drawable.ic_launcher_appwidget, ITEM_APPWIDGET)); diff --git a/src/com/android/launcher/Launcher.java b/src/com/android/launcher/Launcher.java index 17f16a7a3d..50c785d085 100644 --- a/src/com/android/launcher/Launcher.java +++ b/src/com/android/launcher/Launcher.java @@ -57,6 +57,7 @@ import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.method.TextKeyListener; import android.util.Log; +import static android.util.Log.*; import android.view.Display; import android.view.Gravity; import android.view.KeyEvent; @@ -112,6 +113,9 @@ public final class Launcher extends Activity implements View.OnClickListener, On static final String EXTRA_SHORTCUT_DUPLICATE = "duplicate"; + static final String EXTRA_CUSTOM_WIDGET = "custom_widget"; + static final String SEARCH_WIDGET = "search_widget"; + static final int SCREEN_COUNT = 3; static final int DEFAULT_SCREN = 1; static final int NUMBER_CELLS_X = 4; @@ -603,7 +607,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On Bundle extras = data.getExtras(); int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); - Log.d(LOG_TAG, "dumping extras content="+extras.toString()); + d(LOG_TAG, "dumping extras content="+extras.toString()); AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); @@ -671,7 +675,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On final int id = resources.getIdentifier(iconResource.resourceName, null, null); icon = resources.getDrawable(id); } catch (Exception e) { - Log.w(LOG_TAG, "Could not load shortcut icon: " + extra); + w(LOG_TAG, "Could not load shortcut icon: " + extra); } } } @@ -794,7 +798,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On try { mAppWidgetHost.stopListening(); } catch (NullPointerException ex) { - Log.w(LOG_TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex); + w(LOG_TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex); } TextKeyListener.getInstance().release(); @@ -903,21 +907,36 @@ public final class Launcher extends Activity implements View.OnClickListener, On } } + private void updateShortcutsForPackage(String packageName) { + if (packageName != null && packageName.length() > 0) { + mWorkspace.updateShortcutsForPackage(packageName); + } + } + void addAppWidget(Intent data) { // TODO: catch bad widget exception when sent int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); - AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId); - if (appWidget.configure != null) { - // Launch over to configure widget, if needed - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); - intent.setComponent(appWidget.configure); - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); - - startActivityForResult(intent, REQUEST_CREATE_APPWIDGET); + String customWidget = data.getStringExtra(EXTRA_CUSTOM_WIDGET); + if (SEARCH_WIDGET.equals(customWidget)) { + // We don't need this any more, since this isn't a real app widget. + mAppWidgetHost.deleteAppWidgetId(appWidgetId); + // add the search widget + addSearch(); } else { - // Otherwise just add it - onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data); + AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId); + + if (appWidget.configure != null) { + // Launch over to configure widget, if needed + Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); + intent.setComponent(appWidget.configure); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + + startActivityForResult(intent, REQUEST_CREATE_APPWIDGET); + } else { + // Otherwise just add it + onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data); + } } } @@ -1008,7 +1027,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On final int id = resources.getIdentifier(iconResource.resourceName, null, null); icon = resources.getDrawable(id); } catch (Exception e) { - Log.w(LOG_TAG, "Could not load live folder icon: " + extra); + w(LOG_TAG, "Could not load live folder icon: " + extra); } } @@ -1107,8 +1126,11 @@ public final class Launcher extends Activity implements View.OnClickListener, On switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: mWorkspace.dispatchKeyEvent(event); - closeFolder(); - closeDrawer(); + if (mDrawer.isOpened()) { + closeDrawer(); + } else { + closeFolder(); + } return true; case KeyEvent.KEYCODE_HOME: return true; @@ -1163,7 +1185,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On void onDesktopItemsLoaded() { if (mDestroyed) return; -android.util.Log.d("Home", "setting grid adapter"); +d("Home", "setting grid adapter"); mAllAppsGrid.setAdapter(sModel.getApplicationsAdapter()); bindDesktopItems(); } @@ -1313,7 +1335,7 @@ android.util.Log.d("Home", "setting grid adapter"); final AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); item.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); - if (LOGD) Log.d(LOG_TAG, String.format("about to setAppWidget for id=%d, info=%s", appWidgetId, appWidgetInfo)); + if (LOGD) d(LOG_TAG, String.format("about to setAppWidget for id=%d, info=%s", appWidgetId, appWidgetInfo)); item.hostView.setAppWidget(appWidgetId, appWidgetInfo); item.hostView.setTag(item); @@ -1704,6 +1726,23 @@ android.util.Log.d("Home", "setting grid adapter"); Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + // add the search widget + ArrayList customInfo = + new ArrayList(); + AppWidgetProviderInfo info = new AppWidgetProviderInfo(); + info.provider = new ComponentName(getPackageName(), "XXX.YYY"); + info.label = getString(R.string.group_search); + info.icon = R.drawable.ic_search_widget; + customInfo.add(info); + pickIntent.putParcelableArrayListExtra( + AppWidgetManager.EXTRA_CUSTOM_INFO, customInfo); + ArrayList customExtras = new ArrayList(); + Bundle b = new Bundle(); + b.putString(EXTRA_CUSTOM_WIDGET, SEARCH_WIDGET); + customExtras.add(b); + pickIntent.putParcelableArrayListExtra( + AppWidgetManager.EXTRA_CUSTOM_EXTRAS, customExtras); + // start the pick activity startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET); break; } @@ -1742,23 +1781,47 @@ android.util.Log.d("Home", "setting grid adapter"); private class ApplicationsIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - boolean reloadWorkspace = false; -android.util.Log.d("Home", "application intent received: " + intent.getAction()); -android.util.Log.d("Home", " --> " + intent.getData()); - if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) { - if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { - removeShortcutsForPackage(intent.getData().getSchemeSpecificPart()); - } else { - reloadWorkspace = true; - } + final String action = intent.getAction(); + final String packageName = intent.getData().getSchemeSpecificPart(); + final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); + + if (LauncherModel.DEBUG_LOADERS) { + d(LauncherModel.LOG_TAG, "application intent received: " + action + + ", replacing=" + replacing); + d(LauncherModel.LOG_TAG, " --> " + intent.getData()); } - removeDialog(DIALOG_CREATE_SHORTCUT); - if (!reloadWorkspace) { -android.util.Log.d("Home", " --> loading apps"); - sModel.loadApplications(false, Launcher.this, false); + + if (!Intent.ACTION_PACKAGE_CHANGED.equals(action)) { + if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { + if (!replacing) { + removeShortcutsForPackage(packageName); + if (LauncherModel.DEBUG_LOADERS) { + d(LauncherModel.LOG_TAG, " --> remove package"); + } + sModel.removePackage(Launcher.this, packageName); + } + // else, we are replacing the package, so a PACKAGE_ADDED will be sent + // later, we will update the package at this time + } else { + if (!replacing) { + if (LauncherModel.DEBUG_LOADERS) { + d(LauncherModel.LOG_TAG, " --> add package"); + } + sModel.addPackage(Launcher.this, packageName); + } else { + if (LauncherModel.DEBUG_LOADERS) { + d(LauncherModel.LOG_TAG, " --> update package " + packageName); + } + sModel.updatePackage(Launcher.this, packageName); + updateShortcutsForPackage(packageName); + } + } + removeDialog(DIALOG_CREATE_SHORTCUT); } else { -android.util.Log.d("Home", " --> loading workspace"); - sModel.loadUserItems(false, Launcher.this, false, true); + if (LauncherModel.DEBUG_LOADERS) { + d(LauncherModel.LOG_TAG, " --> sync package " + packageName); + } + sModel.syncPackage(Launcher.this, packageName); } } } diff --git a/src/com/android/launcher/LauncherModel.java b/src/com/android/launcher/LauncherModel.java index 70b4c10f4c..de84560be8 100644 --- a/src/com/android/launcher/LauncherModel.java +++ b/src/com/android/launcher/LauncherModel.java @@ -28,8 +28,9 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; import android.net.Uri; -import android.util.Log; +import static android.util.Log.*; import android.os.Process; import java.util.ArrayList; @@ -46,13 +47,14 @@ import java.net.URISyntaxException; * for the Launcher. */ public class LauncherModel { + static final boolean DEBUG_LOADERS = false; + static final String LOG_TAG = "HomeLoaders"; + private static final int UI_NOTIFICATION_RATE = 4; private static final int DEFAULT_APPLICATIONS_NUMBER = 42; private static final long APPLICATION_NOT_RESPONDING_TIMEOUT = 5000; private static final int INITIAL_ICON_CACHE_CAPACITY = 50; - private static final boolean DEBUG = false; - private static final Collator sCollator = Collator.getInstance(); private boolean mApplicationsLoaded; @@ -101,14 +103,16 @@ public class LauncherModel { */ synchronized boolean loadApplications(boolean isLaunching, Launcher launcher, boolean localeChanged) { -android.util.Log.d("Home", "load applications"); + + if (DEBUG_LOADERS) d(LOG_TAG, "load applications"); + if (isLaunching && mApplicationsLoaded && !localeChanged) { mApplicationsAdapter = new ApplicationsAdapter(launcher, mApplications); -android.util.Log.d("Home", " --> applications loaded, return"); + if (DEBUG_LOADERS) d(LOG_TAG, " --> applications loaded, return"); return false; } - waitForApplicationsLoader(); + stopAndWaitForApplicationsLoader(); if (localeChanged) { dropApplicationCache(); @@ -129,9 +133,9 @@ android.util.Log.d("Home", " --> applications loaded, return"); return true; } - private synchronized void waitForApplicationsLoader() { + private synchronized void stopAndWaitForApplicationsLoader() { if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) { - android.util.Log.d("Home", " --> wait for applications loader"); + if (DEBUG_LOADERS) d(LOG_TAG, " --> wait for applications loader"); mApplicationsLoader.stop(); // Wait for the currently running thread to finish, this can take a little @@ -145,14 +149,310 @@ android.util.Log.d("Home", " --> applications loaded, return"); } private synchronized void startApplicationsLoader(Launcher launcher) { -android.util.Log.d("Home", " --> starting applications loader"); - waitForApplicationsLoader(); + if (DEBUG_LOADERS) d(LOG_TAG, " --> starting applications loader"); + + stopAndWaitForApplicationsLoader(); mApplicationsLoader = new ApplicationsLoader(launcher); mApplicationsLoaderThread = new Thread(mApplicationsLoader, "Applications Loader"); mApplicationsLoaderThread.start(); } + synchronized void addPackage(Launcher launcher, String packageName) { + if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) { + startApplicationsLoader(launcher); + return; + } + + if (packageName != null && packageName.length() > 0) { + final PackageManager packageManager = launcher.getPackageManager(); + final List matches = findActivitiesForPackage(packageManager, packageName); + + if (matches.size() > 0) { + final ApplicationsAdapter adapter = mApplicationsAdapter; + final HashMap cache = mAppInfoCache; + + for (ResolveInfo info : matches) { + adapter.setNotifyOnChange(false); + adapter.add(makeAndCacheApplicationInfo(packageManager, cache, info)); + } + + adapter.sort(new ApplicationInfoComparator()); + adapter.notifyDataSetChanged(); + } + } + } + + synchronized void removePackage(Launcher launcher, String packageName) { + if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) { + dropApplicationCache(); // TODO: this could be optimized + startApplicationsLoader(launcher); + return; + } + + if (packageName != null && packageName.length() > 0) { + final ApplicationsAdapter adapter = mApplicationsAdapter; + + final List toRemove = new ArrayList(); + final int count = adapter.getCount(); + + for (int i = 0; i < count; i++) { + final ApplicationInfo applicationInfo = adapter.getItem(i); + final Intent intent = applicationInfo.intent; + final ComponentName component = intent.getComponent(); + if (packageName.equals(component.getPackageName())) { + toRemove.add(applicationInfo); + } + } + + final HashMap cache = mAppInfoCache; + for (ApplicationInfo info : toRemove) { + adapter.setNotifyOnChange(false); + adapter.remove(info); + cache.remove(info.intent.getComponent()); + } + + if (toRemove.size() > 0) { + adapter.sort(new ApplicationInfoComparator()); + adapter.notifyDataSetChanged(); + } + } + } + + synchronized void updatePackage(Launcher launcher, String packageName) { + if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) { + startApplicationsLoader(launcher); + return; + } + + if (packageName != null && packageName.length() > 0) { + final PackageManager packageManager = launcher.getPackageManager(); + final ApplicationsAdapter adapter = mApplicationsAdapter; + + final List matches = findActivitiesForPackage(packageManager, packageName); + final int count = matches.size(); + + boolean changed = false; + + for (int i = 0; i < count; i++) { + final ResolveInfo info = matches.get(i); + final ApplicationInfo applicationInfo = findIntent(adapter, + info.activityInfo.applicationInfo.packageName, info.activityInfo.name); + if (applicationInfo != null) { + updateAndCacheApplicationInfo(packageManager, info, applicationInfo); + changed = true; + } + } + + if (changed) { + adapter.sort(new ApplicationInfoComparator()); + adapter.notifyDataSetChanged(); + } + } + } + + private void updateAndCacheApplicationInfo(PackageManager packageManager, ResolveInfo info, + ApplicationInfo applicationInfo) { + + updateApplicationInfoTitleAndIcon(packageManager, info, applicationInfo); + + ComponentName componentName = new ComponentName( + info.activityInfo.applicationInfo.packageName, info.activityInfo.name); + mAppInfoCache.put(componentName, applicationInfo); + } + + synchronized void syncPackage(Launcher launcher, String packageName) { + if (mApplicationsLoader != null && mApplicationsLoader.isRunning()) { + startApplicationsLoader(launcher); + return; + } + + if (packageName != null && packageName.length() > 0) { + final PackageManager packageManager = launcher.getPackageManager(); + final List matches = findActivitiesForPackage(packageManager, packageName); + + if (matches.size() > 0) { + final ApplicationsAdapter adapter = mApplicationsAdapter; + + // Find disabled activities and remove them from the adapter + boolean removed = removeDisabledActivities(packageName, matches, adapter); + // Find enable activities and add them to the adapter + // Also updates existing activities with new labels/icons + boolean added = addEnabledAndUpdateActivities(matches, adapter, launcher); + + if (added || removed) { + adapter.sort(new ApplicationInfoComparator()); + adapter.notifyDataSetChanged(); + } + } + } + } + + private static List findActivitiesForPackage(PackageManager packageManager, + String packageName) { + + final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); + mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); + + final List apps = packageManager.queryIntentActivities(mainIntent, 0); + final List matches = new ArrayList(); + + if (apps != null) { + // Find all activities that match the packageName + int count = apps.size(); + for (int i = 0; i < count; i++) { + final ResolveInfo info = apps.get(i); + final ActivityInfo activityInfo = info.activityInfo; + if (packageName.equals(activityInfo.packageName)) { + matches.add(info); + } + } + } + + return matches; + } + + private boolean addEnabledAndUpdateActivities(List matches, + ApplicationsAdapter adapter, Launcher launcher) { + + final List toAdd = new ArrayList(); + final int count = matches.size(); + + boolean changed = false; + + for (int i = 0; i < count; i++) { + final ResolveInfo info = matches.get(i); + final ApplicationInfo applicationInfo = findIntent(adapter, + info.activityInfo.applicationInfo.packageName, info.activityInfo.name); + if (applicationInfo == null) { + toAdd.add(makeAndCacheApplicationInfo(launcher.getPackageManager(), + mAppInfoCache, info)); + changed = true; + } else { + updateAndCacheApplicationInfo(launcher.getPackageManager(), info, applicationInfo); + changed = true; + } + } + + for (ApplicationInfo info : toAdd) { + adapter.setNotifyOnChange(false); + adapter.add(info); + } + + return changed; + } + + private boolean removeDisabledActivities(String packageName, List matches, + ApplicationsAdapter adapter) { + + final List toRemove = new ArrayList(); + final int count = adapter.getCount(); + + boolean changed = false; + + for (int i = 0; i < count; i++) { + final ApplicationInfo applicationInfo = adapter.getItem(i); + final Intent intent = applicationInfo.intent; + final ComponentName component = intent.getComponent(); + if (packageName.equals(component.getPackageName())) { + if (!findIntent(matches, component)) { + toRemove.add(applicationInfo); + changed = true; + } + } + } + + final HashMap cache = mAppInfoCache; + for (ApplicationInfo info : toRemove) { + adapter.setNotifyOnChange(false); + adapter.remove(info); + cache.remove(info.intent.getComponent()); + } + + return changed; + } + + private static ApplicationInfo findIntent(ApplicationsAdapter adapter, String packageName, + String name) { + + final int count = adapter.getCount(); + for (int i = 0; i < count; i++) { + final ApplicationInfo applicationInfo = adapter.getItem(i); + final Intent intent = applicationInfo.intent; + final ComponentName component = intent.getComponent(); + if (packageName.equals(component.getPackageName()) && + name.equals(component.getClassName())) { + return applicationInfo; + } + } + + return null; + } + + private static boolean findIntent(List apps, ComponentName component) { + final String className = component.getClassName(); + for (ResolveInfo info : apps) { + final ActivityInfo activityInfo = info.activityInfo; + if (activityInfo.name.equals(className)) { + return true; + } + } + return false; + } + + Drawable getApplicationInfoIcon(PackageManager manager, ApplicationInfo info) { + final ResolveInfo resolveInfo = manager.resolveActivity(info.intent, 0); + if (resolveInfo == null) { + return null; + } + + ComponentName componentName = new ComponentName( + resolveInfo.activityInfo.applicationInfo.packageName, + resolveInfo.activityInfo.name); + ApplicationInfo application = mAppInfoCache.get(componentName); + + if (application == null) { + return resolveInfo.activityInfo.loadIcon(manager); + } + + return application.icon; + } + + private static ApplicationInfo makeAndCacheApplicationInfo(PackageManager manager, + HashMap appInfoCache, ResolveInfo info) { + + ComponentName componentName = new ComponentName( + info.activityInfo.applicationInfo.packageName, + info.activityInfo.name); + ApplicationInfo application = appInfoCache.get(componentName); + + if (application == null) { + application = new ApplicationInfo(); + application.container = ItemInfo.NO_ID; + + updateApplicationInfoTitleAndIcon(manager, info, application); + + application.setActivity(componentName, + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + + appInfoCache.put(componentName, application); + } + + return application; + } + + private static void updateApplicationInfoTitleAndIcon(PackageManager manager, ResolveInfo info, + ApplicationInfo application) { + + application.title = info.loadLabel(manager); + if (application.title == null) { + application.title = info.activityInfo.name; + } + + application.icon = info.activityInfo.loadIcon(manager); + application.filtered = false; + } + private class ApplicationsLoader implements Runnable { private final WeakReference mLauncher; @@ -176,7 +476,7 @@ android.util.Log.d("Home", " --> starting applications loader"); android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); + final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); final Launcher launcher = mLauncher.get(); @@ -185,6 +485,8 @@ android.util.Log.d("Home", " --> starting applications loader"); if (apps != null && !mStopped) { final int count = apps.size(); + // Can be set to null on the UI thread by the unbind() method + // Do not access without checking for null first final ApplicationsAdapter applicationList = mApplicationsAdapter; ChangeNotifier action = new ChangeNotifier(applicationList, true); @@ -192,28 +494,10 @@ android.util.Log.d("Home", " --> starting applications loader"); for (int i = 0; i < count && !mStopped; i++) { ResolveInfo info = apps.get(i); - ComponentName componentName = new ComponentName( - info.activityInfo.applicationInfo.packageName, - info.activityInfo.name); - ApplicationInfo application = appInfoCache.get(componentName); - if (application == null) { - application = new ApplicationInfo(); - application.title = info.loadLabel(manager); - if (application.title == null) { - application.title = info.activityInfo.name; - } - application.setActivity(componentName, - Intent.FLAG_ACTIVITY_NEW_TASK | - Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); - application.container = ItemInfo.NO_ID; - application.icon = info.activityInfo.loadIcon(manager); - if (DEBUG) { - Log.d(Launcher.LOG_TAG, "Loaded ApplicationInfo for " + componentName); - } - appInfoCache.put(componentName, application); - } + ApplicationInfo application = + makeAndCacheApplicationInfo(manager, appInfoCache, info); - if (action.add(application)) { + if (action.add(application) && !mStopped) { launcher.runOnUiThread(action); action = new ChangeNotifier(applicationList, false); } @@ -229,7 +513,7 @@ android.util.Log.d("Home", " --> starting applications loader"); } } - private static class ChangeNotifier implements Runnable, Comparator { + private static class ChangeNotifier implements Runnable { private final ApplicationsAdapter mApplicationList; private final ArrayList mBuffer; @@ -243,6 +527,8 @@ android.util.Log.d("Home", " --> starting applications loader"); public void run() { final ApplicationsAdapter applicationList = mApplicationList; + // Can be set to null on the UI thread by the unbind() method + if (applicationList == null) return; if (mFirst) { applicationList.setNotifyOnChange(false); @@ -260,7 +546,7 @@ android.util.Log.d("Home", " --> starting applications loader"); buffer.clear(); - applicationList.sort(this); + applicationList.sort(new ApplicationInfoComparator()); applicationList.notifyDataSetChanged(); } @@ -269,7 +555,9 @@ android.util.Log.d("Home", " --> starting applications loader"); buffer.add(application); return buffer.size() >= UI_NOTIFICATION_RATE; } + } + private static class ApplicationInfoComparator implements Comparator { public final int compare(ApplicationInfo a, ApplicationInfo b) { return sCollator.compare(a.title.toString(), b.title.toString()); } @@ -285,10 +573,10 @@ android.util.Log.d("Home", " --> starting applications loader"); */ void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged, boolean loadApplications) { -android.util.Log.d("Home", "loading user items"); + if (DEBUG_LOADERS) d(LOG_TAG, "loading user items"); if (isLaunching && isDesktopLoaded()) { -android.util.Log.d("Home", " --> items loaded, return"); + if (DEBUG_LOADERS) d(LOG_TAG, " --> items loaded, return"); if (loadApplications) startApplicationsLoader(launcher); // We have already loaded our data from the DB launcher.onDesktopItemsLoaded(); @@ -306,7 +594,7 @@ android.util.Log.d("Home", " --> items loaded, return"); } } -android.util.Log.d("Home", " --> starting workspace loader"); + if (DEBUG_LOADERS) d(LOG_TAG, " --> starting workspace loader"); mDesktopItemsLoaded = false; mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged, loadApplications); mDesktopLoaderThread = new Thread(mDesktopItemsLoader, "Desktop Items Loader"); @@ -563,7 +851,7 @@ android.util.Log.d("Home", " --> starting workspace loader"); container = c.getInt(containerIndex); if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP) { - Log.e(Launcher.LOG_TAG, "Widget found where container " + e(Launcher.LOG_TAG, "Widget found where container " + "!= CONTAINER_DESKTOP ignoring!"); continue; } @@ -589,7 +877,7 @@ android.util.Log.d("Home", " --> starting workspace loader"); container = c.getInt(containerIndex); if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP) { - Log.e(Launcher.LOG_TAG, "Widget found where container " + e(Launcher.LOG_TAG, "Widget found where container " + "!= CONTAINER_DESKTOP -- ignoring!"); continue; } @@ -599,7 +887,7 @@ android.util.Log.d("Home", " --> starting workspace loader"); break; } } catch (Exception e) { - Log.w(Launcher.LOG_TAG, "Desktop items loading interrupted:", e); + w(Launcher.LOG_TAG, "Desktop items loading interrupted:", e); } } } finally { @@ -699,6 +987,8 @@ android.util.Log.d("Home", " --> starting workspace loader"); * Home screen on orientation change. */ void unbind() { + // Interrupt the applications loader before setting the adapter to null + stopAndWaitForApplicationsLoader(); mApplicationsAdapter = null; unbindAppDrawables(mApplications); unbindDrawables(mDesktopItems); diff --git a/src/com/android/launcher/LauncherProvider.java b/src/com/android/launcher/LauncherProvider.java index 5cd7a0ff98..21ef1e0f19 100644 --- a/src/com/android/launcher/LauncherProvider.java +++ b/src/com/android/launcher/LauncherProvider.java @@ -24,6 +24,8 @@ import android.content.Intent; import android.content.ComponentName; import android.content.ContentUris; import android.content.ContentResolver; +import android.content.res.XmlResourceParser; +import android.content.res.TypedArray; import android.content.pm.PackageManager; import android.content.pm.ActivityInfo; import android.database.sqlite.SQLiteOpenHelper; @@ -33,19 +35,17 @@ import android.database.Cursor; import android.database.SQLException; import android.util.Log; import android.util.Xml; +import android.util.AttributeSet; import android.net.Uri; import android.text.TextUtils; import android.os.*; import android.provider.Settings; -import java.io.FileReader; -import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; -import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParser; import com.android.internal.util.XmlUtils; import com.android.launcher.LauncherSettings.Favorites; @@ -162,19 +162,10 @@ public class LauncherProvider extends ContentProvider { } private static class DatabaseHelper extends SQLiteOpenHelper { - /** - * Path to file containing default favorite packages, relative to ANDROID_ROOT. - */ - private static final String DEFAULT_FAVORITES_PATH = "etc/favorites.xml"; - private static final String TAG_FAVORITES = "favorites"; private static final String TAG_FAVORITE = "favorite"; - private static final String TAG_PACKAGE = "package"; - private static final String TAG_CLASS = "class"; - - private static final String ATTRIBUTE_SCREEN = "screen"; - private static final String ATTRIBUTE_X = "x"; - private static final String ATTRIBUTE_Y = "y"; + private static final String TAG_CLOCK = "clock"; + private static final String TAG_SEARCH = "search"; private final Context mContext; private final AppWidgetHost mAppWidgetHost; @@ -217,7 +208,7 @@ public class LauncherProvider extends ContentProvider { if (!convertDatabase(db)) { // Populate favorites table with initial favorites - loadFavorites(db, DEFAULT_FAVORITES_PATH); + loadFavorites(db); } } @@ -445,115 +436,121 @@ public class LauncherProvider extends ContentProvider { * Loads the default set of favorite packages from an xml file. * * @param db The database to write the values into - * @param subPath The relative path from ANDROID_ROOT to the file to read */ - private int loadFavorites(SQLiteDatabase db, String subPath) { - FileReader favReader; - - // Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system". - final File favFile = new File(Environment.getRootDirectory(), subPath); - try { - favReader = new FileReader(favFile); - } catch (FileNotFoundException e) { - Log.e(LOG_TAG, "Couldn't find or open favorites file " + favFile); - return 0; - } - + private int loadFavorites(SQLiteDatabase db) { Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_LAUNCHER); ContentValues values = new ContentValues(); PackageManager packageManager = mContext.getPackageManager(); - ActivityInfo info; int i = 0; try { - XmlPullParser parser = Xml.newPullParser(); - parser.setInput(favReader); - + XmlResourceParser parser = mContext.getResources().getXml(R.xml.default_workspace); + AttributeSet attrs = Xml.asAttributeSet(parser); XmlUtils.beginDocument(parser, TAG_FAVORITES); - while (true) { - XmlUtils.nextElement(parser); + final int depth = parser.getDepth(); - String name = parser.getName(); - if (!TAG_FAVORITE.equals(name)) { - break; + int type; + while (((type = parser.next()) != XmlPullParser.END_TAG || + parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) { + + if (type != XmlPullParser.START_TAG) { + continue; } - String pkg = parser.getAttributeValue(null, TAG_PACKAGE); - String cls = parser.getAttributeValue(null, TAG_CLASS); - try { - ComponentName cn = new ComponentName(pkg, cls); - info = packageManager.getActivityInfo(cn, 0); - intent.setComponent(cn); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - values.put(LauncherSettings.Favorites.INTENT, intent.toURI()); - values.put(LauncherSettings.Favorites.TITLE, - info.loadLabel(packageManager).toString()); - values.put(LauncherSettings.Favorites.CONTAINER, - LauncherSettings.Favorites.CONTAINER_DESKTOP); - values.put(LauncherSettings.Favorites.ITEM_TYPE, - LauncherSettings.Favorites.ITEM_TYPE_APPLICATION); - values.put(LauncherSettings.Favorites.SCREEN, - parser.getAttributeValue(null, ATTRIBUTE_SCREEN)); - values.put(LauncherSettings.Favorites.CELLX, - parser.getAttributeValue(null, ATTRIBUTE_X)); - values.put(LauncherSettings.Favorites.CELLY, - parser.getAttributeValue(null, ATTRIBUTE_Y)); - values.put(LauncherSettings.Favorites.SPANX, 1); - values.put(LauncherSettings.Favorites.SPANY, 1); - db.insert(TABLE_FAVORITES, null, values); - i++; - } catch (PackageManager.NameNotFoundException e) { - Log.w(LOG_TAG, "Unable to add favorite: " + pkg + "/" + cls, e); + boolean added = false; + final String name = parser.getName(); + + TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Favorite); + + values.clear(); + values.put(LauncherSettings.Favorites.CONTAINER, + LauncherSettings.Favorites.CONTAINER_DESKTOP); + values.put(LauncherSettings.Favorites.SCREEN, + a.getString(R.styleable.Favorite_screen)); + values.put(LauncherSettings.Favorites.CELLX, + a.getString(R.styleable.Favorite_x)); + values.put(LauncherSettings.Favorites.CELLY, + a.getString(R.styleable.Favorite_y)); + + if (TAG_FAVORITE.equals(name)) { + added = addShortcut(db, values, a, packageManager, intent); + } else if (TAG_SEARCH.equals(name)) { + added = addSearchWidget(db, values); + } else if (TAG_CLOCK.equals(name)) { + added = addClockWidget(db, values); } + + if (added) i++; + + a.recycle(); } } catch (XmlPullParserException e) { Log.w(LOG_TAG, "Got exception parsing favorites.", e); } catch (IOException e) { Log.w(LOG_TAG, "Got exception parsing favorites.", e); } - + + return i; + } + + private boolean addShortcut(SQLiteDatabase db, ContentValues values, TypedArray a, + PackageManager packageManager, Intent intent) { + + ActivityInfo info; + String packageName = a.getString(R.styleable.Favorite_packageName); + String className = a.getString(R.styleable.Favorite_className); + try { + ComponentName cn = new ComponentName(packageName, className); + info = packageManager.getActivityInfo(cn, 0); + intent.setComponent(cn); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + values.put(Favorites.INTENT, intent.toURI()); + values.put(Favorites.TITLE, info.loadLabel(packageManager).toString()); + values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_APPLICATION); + values.put(Favorites.SPANX, 1); + values.put(Favorites.SPANY, 1); + db.insert(TABLE_FAVORITES, null, values); + } catch (PackageManager.NameNotFoundException e) { + Log.w(LOG_TAG, "Unable to add favorite: " + packageName + + "/" + className, e); + return false; + } + return true; + } + + private boolean addSearchWidget(SQLiteDatabase db, ContentValues values) { // Add a search box - values.clear(); - values.put(LauncherSettings.Favorites.CONTAINER, - LauncherSettings.Favorites.CONTAINER_DESKTOP); - values.put(LauncherSettings.Favorites.ITEM_TYPE, - LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH); - values.put(LauncherSettings.Favorites.SCREEN, 2); - values.put(LauncherSettings.Favorites.CELLX, 0); - values.put(LauncherSettings.Favorites.CELLY, 0); - values.put(LauncherSettings.Favorites.SPANX, 4); - values.put(LauncherSettings.Favorites.SPANY, 1); + values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_WIDGET_SEARCH); + values.put(Favorites.SPANX, 4); + values.put(Favorites.SPANY, 1); db.insert(TABLE_FAVORITES, null, values); - + + return true; + } + + private boolean addClockWidget(SQLiteDatabase db, ContentValues values) { final int[] bindSources = new int[] { Favorites.ITEM_TYPE_WIDGET_CLOCK, }; - + final ArrayList bindTargets = new ArrayList(); bindTargets.add(new ComponentName("com.android.alarmclock", "com.android.alarmclock.AnalogAppWidgetProvider")); - + boolean allocatedAppWidgets = false; - + // Try binding to an analog clock widget try { int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); - - values.clear(); - values.put(LauncherSettings.Favorites.CONTAINER, - LauncherSettings.Favorites.CONTAINER_DESKTOP); - values.put(LauncherSettings.Favorites.ITEM_TYPE, - LauncherSettings.Favorites.ITEM_TYPE_WIDGET_CLOCK); - values.put(LauncherSettings.Favorites.SCREEN, 1); - values.put(LauncherSettings.Favorites.CELLX, 1); - values.put(LauncherSettings.Favorites.CELLY, 0); - values.put(LauncherSettings.Favorites.SPANX, 2); - values.put(LauncherSettings.Favorites.SPANY, 2); - values.put(LauncherSettings.Favorites.APPWIDGET_ID, appWidgetId); + + values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_WIDGET_CLOCK); + values.put(Favorites.SPANX, 2); + values.put(Favorites.SPANY, 2); + values.put(Favorites.APPWIDGET_ID, appWidgetId); db.insert(TABLE_FAVORITES, null, values); - + allocatedAppWidgets = true; } catch (RuntimeException ex) { Log.e(LOG_TAG, "Problem allocating appWidgetId", ex); @@ -563,8 +560,8 @@ public class LauncherProvider extends ContentProvider { if (allocatedAppWidgets) { launchAppWidgetBinder(bindSources, bindTargets); } - - return i; + + return allocatedAppWidgets; } } diff --git a/src/com/android/launcher/Workspace.java b/src/com/android/launcher/Workspace.java index bc5347e7a5..359767aea7 100644 --- a/src/com/android/launcher/Workspace.java +++ b/src/com/android/launcher/Workspace.java @@ -26,6 +26,7 @@ import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Rect; import android.graphics.Region; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.VelocityTracker; @@ -34,6 +35,7 @@ import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.Scroller; +import android.widget.TextView; import android.os.Parcelable; import android.os.Parcel; @@ -1240,7 +1242,41 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag } } } - + + void updateShortcutsForPackage(String packageName) { + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + final CellLayout layout = (CellLayout) getChildAt(i); + int childCount = layout.getChildCount(); + for (int j = 0; j < childCount; j++) { + final View view = layout.getChildAt(j); + Object tag = view.getTag(); + if (tag instanceof ApplicationInfo) { + ApplicationInfo info = (ApplicationInfo) tag; + // We need to check for ACTION_MAIN otherwise getComponent() might + // return null for some shortcuts (for instance, for shortcuts to + // web pages.) + final Intent intent = info.intent; + final ComponentName name = intent.getComponent(); + if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION && + Intent.ACTION_MAIN.equals(intent.getAction()) && name != null && + packageName.equals(name.getPackageName())) { + + final Drawable icon = Launcher.getModel().getApplicationInfoIcon( + mLauncher.getPackageManager(), info); + if (icon != null && icon != info.icon) { + info.icon.setCallback(null); + info.icon = Utilities.createIconThumbnail(icon, mContext); + info.filtered = true; + ((TextView) view).setCompoundDrawablesWithIntrinsicBounds(null, + info.icon, null, null); + } + } + } + } + } + } + // TODO: remove widgets when appwidgetmanager tells us they're gone // void removeAppWidgetsForProvider() { // }