From 3d20d999025bbaab96b41d172225a39f7a1017b7 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 12 Oct 2010 15:02:44 +0900 Subject: [PATCH] Specify keyboard metrics with physical unit "inch" (DO NOT MERGE) This change also introduces the key background drawables which has no fixed bottom padding. Instead of relying on bottom padding in drawable, this change also specifies Keyboard.verticalGap with physical unit. Other keyboard related length, distance and size are also specified by physical unit. Bug: 3066107 Change-Id: I44f3b2eef8086d6e0b0db53d38f08487549060c6 --- .../btn_keyboard_key_dark_normal.9.png | Bin 521 -> 511 bytes .../btn_keyboard_key_dark_normal_off.9.png | Bin 783 -> 760 bytes .../btn_keyboard_key_dark_normal_on.9.png | Bin 1112 -> 1088 bytes .../btn_keyboard_key_dark_pressed.9.png | Bin 747 -> 730 bytes .../btn_keyboard_key_dark_pressed_off.9.png | Bin 962 -> 940 bytes .../btn_keyboard_key_dark_pressed_on.9.png | Bin 1282 -> 1260 bytes .../btn_keyboard_key_light_normal.9.png | Bin 481 -> 461 bytes .../btn_keyboard_key_light_pressed.9.png | Bin 1643 -> 811 bytes .../btn_keyboard_key_dark_normal.9.png | Bin 385 -> 377 bytes .../btn_keyboard_key_dark_normal_off.9.png | Bin 550 -> 545 bytes .../btn_keyboard_key_dark_normal_on.9.png | Bin 813 -> 806 bytes .../btn_keyboard_key_dark_pressed.9.png | Bin 518 -> 514 bytes .../btn_keyboard_key_dark_pressed_off.9.png | Bin 700 -> 687 bytes .../btn_keyboard_key_dark_pressed_on.9.png | Bin 950 -> 940 bytes .../btn_keyboard_key_light_normal.9.png | Bin 358 -> 355 bytes .../btn_keyboard_key_light_pressed.9.png | Bin 530 -> 526 bytes java/res/layout/input_gingerbread.xml | 1 + java/res/values-land/dimens.xml | 14 ++- java/res/values/dimens.xml | 26 +++-- java/res/xml-da/kbd_qwerty.xml | 6 +- java/res/xml-da/kbd_qwerty_black.xml | 6 +- java/res/xml-de/kbd_qwerty.xml | 6 +- java/res/xml-de/kbd_qwerty_black.xml | 6 +- java/res/xml-fr/kbd_qwerty.xml | 6 +- java/res/xml-fr/kbd_qwerty_black.xml | 6 +- java/res/xml-iw/kbd_qwerty.xml | 6 +- java/res/xml-iw/kbd_qwerty_black.xml | 6 +- java/res/xml-nb/kbd_qwerty.xml | 6 +- java/res/xml-nb/kbd_qwerty_black.xml | 6 +- java/res/xml-ru/kbd_qwerty.xml | 6 +- java/res/xml-ru/kbd_qwerty_black.xml | 6 +- java/res/xml-sr/kbd_qwerty.xml | 6 +- java/res/xml-sr/kbd_qwerty_black.xml | 6 +- java/res/xml-sv/kbd_qwerty.xml | 6 +- java/res/xml-sv/kbd_qwerty_black.xml | 6 +- java/res/xml/kbd_phone.xml | 2 +- java/res/xml/kbd_phone_black.xml | 2 +- java/res/xml/kbd_phone_symbols.xml | 2 +- java/res/xml/kbd_phone_symbols_black.xml | 2 +- java/res/xml/kbd_popup_narrow_template.xml | 2 +- java/res/xml/kbd_popup_template.xml | 2 +- java/res/xml/kbd_qwerty.xml | 6 +- java/res/xml/kbd_qwerty_black.xml | 6 +- java/res/xml/kbd_symbols.xml | 2 +- java/res/xml/kbd_symbols_black.xml | 2 +- java/res/xml/kbd_symbols_shift.xml | 2 +- java/res/xml/kbd_symbols_shift_black.xml | 2 +- java/res/xml/popup_comma.xml | 2 +- java/res/xml/popup_domains.xml | 2 +- java/res/xml/popup_mic.xml | 2 +- java/res/xml/popup_punctuation.xml | 2 +- java/res/xml/popup_smileys.xml | 2 +- .../inputmethod/latin/LatinKeyboard.java | 32 +++++-- .../latin/LatinKeyboardBaseView.java | 89 ++++++++++++------ 54 files changed, 196 insertions(+), 104 deletions(-) diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png index 0c4820b34c55f88b8030693a2431cd553f7b9061..01fc8ca780342b16e22a395f702af499a2eb21b3 100644 GIT binary patch delta 462 zcmV;<0WtoG1pfn&7YaED1^@s6boh93ks&C5p-DtRRCwC#noDkjFc5~vV6j82NO#<% zIZSh|^f1Xy*fp#W5<aoR%S&Ve9#1`xWns!xI5L<|kIjdGLTi+tczAIMb5o{hoxvNj;qVhC> z5XftQu)%#qmV#vk6;qwvvMjTMRhp(y6a|!JIaCf_f9f<4oO7j33#v==J>5@G2_c@rE+|zo2B!)g%uHl?F>&}m#)HQ=0I#>UZ?C&R+k*AuVw<%N z#3B#^ArPez2!RmDGaz9Y!u#)}?TBB-xiy%f#EihqfnH>?7tNM&CV9KorN%LINltGZn1j z$R}Q-K1_Ws`!M!NWTZ2d`T-DzTaxa7ORQa%%Tg0haF@ws*qyNFmvbd2B8nnPatI;R z267*v&A-_mVDMgVmIhE#KcAxm84kpOB;$WhBM!uYY#E+uvejzQm+Nc#e0D|=7l)RA z$Ir({`hIsuola+U9qC=qx?gW@RN9}-W|VXZV-uMQg@QVNyS-gmHfkgY0vZm7>dXlw zpU+dZTHW2WCXGU)kAUzpU zt0yN^E|*{CD!xy?j8KEYfXY%Uh*qpYaOZ{80JNd+2jK&0Vx!TBd2%85 zM<8JH@>11KFryd-dm|(xY9So|qYGa=a@BtrGeNHhC`Fg34_ z2SRa8!wiJ%YpuT@Rva5-GJ}MF(Vv4G$Wku5>X%dK)#P%{o>^z-T&9qfX=!I}eq!e% zu`0Pa`x==Jr>$V>e{=MYtx*eaBTjX->X$Rs!J_d+bn@8|G z79CVheRez-w)$g*?kb+g;*tKEc5wQpBO%awfNVxk(<>acT8$cw#@0VHGihrCqu1+E vzu#Y7Hi2Z(N5n37{JlZ-cZN;lw*UhGH1u&6D+t5n00000NkvXXu0mjfX+TN^ delta 736 zcmV<60w4YO1&;=h7YalO1^@s6!$f9nks&C5u}MThRCwC#n(a>FKoo}0Kno}!$qIg8 zpAQez>2%iTQQm`9_xs(QD*Ln9jFN6);$)^mp`gw`?(f&8wTd{7L&M=vojHNz z^LeUPtJ}NQWHM1|e0Fp9Kf`rh^~1uptwHc199$s$4i^XP(oI{NK9ts&&*#+bc4<5w z(_*op2%6F zMqps`>Pq!aa3dcEYa=BiYat!~qX^fmg$|Ca*7dcDkKx-}HqtLt zLF>_MHdV@nDo_Kd7ju~@h<;^%d41igMPUsRr`OsEL@ZM=6O!FQJaoT|l-V7Gse2tB z2>Cq?GZ2d3YyEw(;@Du59>n#3{v6yumUhMKemSMyfL$ioGaKxj+Z2lBT7fgSIEfb{ zzLea8J;bK{*;df)e{+nF$gG7Y5`r*U1ljK$E29WEMOaq#2)oSov;i?7hXEo&>j>`0 zVh5GeK0EFU$NFQ1-BsL=#V!4i?cnrXM?zrh0k&yDb&qh=YBg#!8j*iXX3|y!qu1+E zzu#Y<)`4U(MoiW+AO^&MWM?4r8bu6<0XYy5YZ>(-qG9{eUM$SM)rUvl1sDKD(R460 Scd&>60000k7RCwC#nOkoYITXkL_Dm)TQOP2j zwg{;b;-cM!2OfFZewgKR!H0n-;0-~=1E{E6OVuW6+U#^@Z0|XCCM{|bIu#S#GHzWf zGj4o-KG*R8~dCtX}!UBy3t zYin3uTJk0ea8%m*_6<*;Ji+GX=INr=zYibUw4Wr29ZMBZjKmNVgfaYU|Ij>vD2nX( z_|c;iUo%l7N+}Em13Q)l!T>CkkgiMqEXAmHa`lr|grN;`5rQDV!otGoO)HLLs|~lH zC;?)m0rJow6x5~dQo8FbydnsdY8o|vbY|?x8_Tkt8boVtdl?Y92?t z3M>pS$(l$Lh4hd+kQzl7opxBRNd;**tt>9hq!=S$GZCmo5{*kCb%le$I+D0c>m~%# zM(gq&gkgKMv214A_Gxm>AA~sAgn}A5Z!IL@p z{vt(OvnG|LPMZdvfG`Q0Ec-^SF40+hjl1_Ef~b?0+?1<}Av#MTUcY>ccNVImsw-VC2C~6Ny4Dj z%Ixkp8e*ae^1aJ#g-;*M_adLTuIPqeqZ)wlso!;O>>sX(GO|9XHkoHR%HUoVTM8fKWx0aPbT&pE7vr^ z2&sai6bSeC1*xhLp zz-@f|P$$?PMXijqqMSywCmL~r@U}Z!>+5~m@f5wCzfo`2DaT0qoS@t7VSjJeY9pg8 zZ%Y+z{4p)-CpP$~vD2rt+Xwrx%@tyl$=Q^+XQ{Sx9Ee9gl7GK2d2y&AQ{f=QIQqNY zx6z7697V0OfQS;0SDZY5vf#@mlNX$19E*GKJHUmhHZQjN~d-{ldSK?O8Ha&VDYOeI8}XSv6AV?AJ^> zNA<{0iuuS<{ot3gPm$?Dy;d;i!9PwDwN6y)=Mm&$zp<(`;+sZ(yv*u9kgIwbnC5MdZv*(QQcD)ZazHaeZo z4V4;NcUGirsX0?;ApNu99V^N3@MG;n3R<3SZNs>5i z_yt7`5Hk&shek?Jm#$0cue0!)AarJbXf!anbt7*q%XVcDV~p!{Kolk7$a%XFy1fLk`T^CjStmz7rTKwHE#6t33#6wxCgXpw^ZFT?*pJwF zXb46)&7`Lm!$XZ$vOgf}p5r0s}$yTI=j5D2_{HQe{cY_0T|Oa#gE-5#Gu6WimC+ej}WH8D+|KHB#y9 z*Dg9o4aiTb`N&!Q5SFu-$aJe-E7+UhA6JQ57pnD}2y(mMST!1d2~8tGX7%^T)x4f= zKpK#{0U}EC2*0}*TydCf}R3*+PYBeAYNCR?n8mEXxBMnFcaz{Ya`QovxK%|20 mgVtgsm$RCwC#noX{PFc8NF#IJY@7cRYm z7jfyaTzV0&;L?Rl4`5>AN0jG~_kWpJ3Z;aW4{6dAFlFY)%(O5gk^2_^c6S2em?9y} z2au~4gw&DNgEXxL9%F?180llA2dS?`x{J%@k~W(SEf$N^4$2+JPNFsl{ze?59gjzU z+HSXWI2?+tTD#qjX0sW+Ua#c*{eCAMAg&-J40;%bN#`~g4Cs2j(t5p4P0?CpI-Sz( zc1u72p~Cn80R%dOux^E2iyo&S#q@?(v5Uh@!?uhhFr<4TuXxJEaC$ME0y}2 z6^M)lbl)KI9P)8&9qcNA1abMfkZxyDde>?ih+O7>ngU|l zggdj3bU)aex*?Vh_B6D(P18HFkf+A1$^K@zj{pe_Xjrb83U;ujTTC3^L RyR-lR002ovPDHLkV1hSvL<;}_ delta 700 zcmV;t0z>`U1?vTn7YalO1^@s6!$f9nks&C5jY&j7RCwC#noEwtFbqK55`N+qELd^{ zF2a&yvE(9Lfh7x;8~_Q4kD!dJ@yL_9O;a`LheV3f7Pa=nc9Pl!aNm;O?oL3GfMUXY z0J&;W3_WQ9q-`zo7$Xp3B*aJnX|5^h;&Qo!&1M6O#UitUVy9y#Q5!{nBOOya9*?kp z-EQGGnM|E z6$p<7>b^nvImxGE>tNRbIEc&FRvkoI97|io)SbT<=g73ONN+&O05t(pS*r;UC$m=DK>D3U39i*P5I)U+wFShq z2=`_k>3^`dbwR8g>_tGnK&11qAa)@}lCEsyP1A3r!vxoA`(CTc8(Uo#$|CG}GEl&$R~*IZur5#e!qv)>6E=q0_k82U(f}R01`j~NB{{S0i=~DdlYFyC~V{! i-HZL`Wz2MZ1Q-CRep7YaED1^@s6boh93ks&C5PDw;TRCwC#n#+pnKoEvYjgA*^1Yy*r zE)*9d_yqGJvz*6r>5I5=A-EA&vv4JX3pa{*8}*#O4<$|8xoHwJo)k3EKvMOks=7MW ziJi}9@>625m{9OnPfR)QnGP@*va%q6{JMRdon_;e>$DSV2}Wo zHJ1^O$Hjmo5(!$b*Yx@Md3A}_BbiKww%e@$VF(o_2oQ$g0T9^cIJ5w<-|xlEV6+V6 zw^wxD0049!4hL~`48l3U#xn??3&JCR0DvwWp$|uk74z9JgW&wYQ4KM#lYO(<&~P}U z#bO~Mp-?DLyWOTrrE;amOs^J14kMjcybP`7a!LJupYr*@ItcLtZ4$X z;Q)2AqIf6>7dLnYNiGZW67{TFtvUjU+a;r)7y%-9<01Y9psm353(m-US24bN?mO~SbAhOn+c-vW%Rpr!xu@ges2)G!JXL=87|?t8r+O(v7;%XA>WQ2v29cuEfiRlgb5$sYj*0PcSv UyOqQ((*OVf07*qoM6N<$f?kfF1ONa4 delta 916 zcmV;F18e-O2f_!C7YalO1^@s6!$f9nks&C5WJyFpRCwC#noVo+KoG|#X{=R2g@Ua| zJt#d?@Ducl^ytU(*e~M6gW#p~l;?I9!*E;Z!42S`V2*jZT3?z<3SVXWG5Cak;NTbnz zpjN9zwOZ|91?8PUR67D*@kIbDtN&mypmw`W@9*#aK;GWoD3{C8X0s8$x7)3l3=+e( zW-FgA=}DZE zGg%FPO(qjzEy(5M6FAsa02w5Vfh>e{imW6<@RPs0yW7h=_G;{SL3qtDMmC#u z4PaIrpni4~X9eNK4VFQW%L8$V^{i5<_yVzy1!I(RygD_wJv?Hb;=uC zSQc^9=Wkg=ZnmhEKeyje3{}3auXuFRC|5JM_R3Waw~BaJgDWVq4qgzxEW$Tp|5Qsf zQGv)MAyuD1AhN=8kR2=Uhv80YBNRnC87h!#$rmvc3yG_TsKNwxEmmGunA>k0GjX^U zTY`@sAo@N#m-JB;M-5hgZc)ei<%4XAbUID9x3>rF2TzNP$77*1U>HPgO~(bo?hFug zuu!enUZ?wn110^Jmlx6BQ{5;|5Y^pKx$ks3G#m~OFEgJx84v?vK&}cT5#RlqkNgdY q0r_hnJ~nc@b1Uk#!34vP00RIEp^KZ0{@YUk0000#o6d2&^)|<;*58OYma(dWTasYw*rZ&4Y>AItU;|K2m))v z#2^v_V!VLJXGJ~2Mr%*mo>tmG`wAXeVkM*;har38h}w!I9u-v1;O>utkoe$ZT4F_l z-AZ3`?`x-j0*Xu%fBya}niqc~4B8Z*5Apc%PuRG%iHN8eNEwYN9<78-kfe-%vb<76 zS`6V`1%~o~AbN|xUcJDhEkm`6N~Mm*KX35zj~D26pW*JEC*Y>yFmlIfq?H88@<U{_)_a9V$&~C-}_w^Azt39Rm^4rY~_B22eWcE3?i)MakziE5F zURRm1#Q!_}ul3O&JSyP*JcztHYjN_Rv`T?n@xHX4;LE8I7FH`82s?aEe%pFhkeO@j zvQR`d4DR9V> zo(eorGl-pc$t)PM7U4ltB3X^hY=xv%cq(t)XyT^xgGGrfsGJu>R{UB1g3d3JwdQqa z*d*3=Dlw&pjf+8hD#sXl}D(UvK_7%rY8vAQ!TK)5#4tXti>&qq}?RM z)E-Ipemd~PJ7sQvPbVR`@+N2!YAR_ZPZB6;r0k591`(L4r6tBE4VLXUiJ3)6OFSXR z9FXjNb~aeHsJq?nM_bg3{N+Q^6SZ0m)oK;K?@#WLMx$YkW*7lUZ%r=>MC8mM^?Du6 zW;6S|!Tr8L+1%X3&dv@hmCBHe773D;8~g)O`4biX f&EmN4d=Ov&E%;F~Lv|o)00000NkvXXu0mjfn!sPo delta 1239 zcmV;|1StFL34#ic7YalO1^@s6!$f9nks&C5q)9|URCwC#noDonI1tB&l>EpBZMNuZ zi*6U#6bK3w$hAO$A}G*n_Y>rpeyjABd(R8(C0`-C+e6R>DA0O~7C{=Pc4SK;cZST^ ziY(I)S#F$&HY3}y#QAalLk>j?D8A^kqbRHat$P>Ou)qaDL+9>VwY3FnYik2DC{=!4j76e%6ykg`u)n_#+uPf)x3@PQ$j;6VEH5uZ9LMIpQp!{Y znKeY;UeS9m>>rRqf|SyH?s*=xS}oYz+#I-spLOA-r6mZ0z<@AB8YaK>^b{6Cum}2N zy$6B_X@LlYY|AQ{AOz9vcFo1f=p@j8EWBckw}wj(dz@t?!5D4?qOc9H?F%IVTZb?V zjSXXia15~V48ot~^#~a)Jz;uUNDa~#;Grc(Lc(%rv{%L0R?P7zTXqSgou;6wo>Dw&k=S zQ&(k2p%`lv-hrc|pP>^B>OP7zG>!nP86N8MBT`sSj^{$z0BZYBtWD`f4^)-9Is^4b7+IGUU!*5Yu z!JGr10%)Qp5R-Rt77V-=p-Gb?SqvT7a!D(9DzEKqV$=ElqJ$Sz)(b2v`pmtc^Ye^a zv$`{^6Kgw>Na?}EMZZ1aaLJGJ$QU=KCu#T6fJnF`rIgk}fFy^1xr+iaY7$;3kGNni zf3VMOLY%-OQzwn1faV2~^}d`C7a>OU+*gS?JmLZoX_!)47d_W zORmV$t25VXZB`}Se%8L?$fU8icE;5|-Ra=he7C;HLhVpZ+Tem1%OiXt)+fUh4Z`gv zAtv@nviH-0$KEM_a(g-nL6tT^lTZ^$D|r$_aU(^KSZNT3nOItEe9~ave&d*#hqTxe zd~|?h@3WJ^yhYvVbk1#2&-0fLNl(;jHKZ-sDM79vh%*rsyvh9o4Rs}$WcU993;-nvZ!yF0Ey(}?002ovPDHLkV1n^x BUhe<^ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png index 7dc59bf82268abee3656297857d3e43da52115e3..1ad746053df532f5b8fa9f87c5558456dc2bd725 100644 GIT binary patch delta 412 zcmV;N0b~B*1I+`F7YaED1^@s6boh93ks&C5Z%IT!RCwC#noW*_Fbsul2(V_)0pI{! zhcyRc$DI%dV8I?(BJrO#nL(-sn6iOMGqzNzLTd4smuE*{glBNh;i^Ey_0RFD`#kRf z`2GDll6wLT&?NK$xzZnZgjDAQa`gj=+Z0h5L>on@YJG}N z2!ufH1W~bSy~{}(Mf84(LS`or0wJ@1Q$r+=oLpS3Ji>MH2>yhj@=N8H6d@1-ArJ!j z%)rAwB3=bg(**N8E0L*bn(}irz_1HaRh5M3`(6Sm(YYCulMi)W?@O|Z@OshnJP5;3 z{#d0E4zWA3EQ7KvHyqkb(4CsaeVN_;t25TyIg*C}0|0FvxR`EDp!NU&002n`MNUMn GLSTY{0J&`d delta 432 zcmV;h0Z;zT1K|UZ7YalO1^@s6!$f9nks&C5gGod|RCwC#n>~($Fc5{uU_wpL0pI{! zCp8D6<4%YJP|yP<5j}eG0>nJkL`q*(}Q_j$=yGbm{hg zwW<|G5jl=SP1Ddgj%sWj!ywzXWj^=&eZjG+$nAEcs;a2(ds3y(i0diNxm@7gTdS^X z>bmaxVvI2*K!g%vVJ*wr4e!*ZR9oS0zv=*2tfYMNpD4tz9Dg%A}WJuqX??j zr}zXQ067yx#j5o#Cv6nb`z{L14iJEU!0c#<@W{@^)ygB2E*@dOVNiZiexV3J00Izz zd}grCJ|Z3kKOPSnhCzu;P1BU0tpSErkfJCgMBBC!NQutPxtx3`%W_?kS%lYvuIo|| z1oFo!jc|zFkt7M_dA{Jl1RbgtK&}F!%iOOvilF?$>;Sn4$gbCgUS2Qyuk!jEcGUGt afB^ucy}znl#Q2i{0000gISnhUs()qtQrSc%E91yMd>c%5u4X zgxPEci^aljWnZt?(C_z!!T0-JRNpWhB93EG>E3R)gTY|%va%}`>GgVWyWNEGc#Vb= zh%XopK_J*R8Vv!2wpqK@<#Kr#O~!IX_a5a9tM%=ds!9Su3{F=KKSH%YiR_u#F zP!V0+&<;D%J&;D8TuT)vK7*Z&QFBi1UJ2IYr)oZ9&YX z$U6qRsZXnQB+p7)6o}3qhZspMs#g@JJ`Hb(skZvv{r*%m8V`4<&!2;y^g|EmblZb6 zwkWn+mFmx0?+T*px7smcv)}Qph-*w%M-f$y-R7k#UiZPke>!}q{(@*y z!M7sv+3%mHU(<_B=#phioX2;6LrlAcxE3W__%%<5@v~STg;H+3%62({&_Ob0jQA*- z&R~mhA<7$4rOcHxh@9?11@O1cd|osN*}{RGwkR|L+-IqiP#|bSk|YAe`4j~UxfAzK z%v#CWBwrw0354MTtC$?rdG_n|3Wvi1&gU~6k4KSqqc%h#5Ng})HZ+@PP3Uww_KIva zo5!E``~3rir`$rNr}+m1*dj=`+lB3RtNx$r6OQ3<2$RVKTCLWT0-^R<^0Z3|olYm1 v&*!jOtzKNKGGCcSHltfMsLeOSUjhsONWch?bA^ne00000NkvXXu0mjfJXm?P literal 1643 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSs!3HD`yQJj;DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49rTIArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yc06!V;*iRM zRQ;gT;{4L0WMIUlDTAykuyQU+O)SYT3dzsUfrVl~Mt(_taYlZDf^)E`f^TASW*&$S zR`2U;<(XGpl9-pA>gi&u1T;Y}Gc(1?#n{Ev$;{Bn$=KM@(9p%r!pPCW*~rn+*wD?w z$F! zZ)O|zy)qDJQ&(hFSRt@|fy0zJZL<~f4rOWxvWl`VSjfWY8Qs3Z^DhYA~`#~-D5)dj*0WSSf{x)h?&r=Ao54-h9ZNe0!8kXoI^d|-(UR4d{zR@`r?9GS zwyd(+Z`tczH;$zgi%fia!&h!q&AKPsARBK0=i_P!9AHS@w zp71gDQ%-01k9GZ-+eNM~O5xuB?4?1S*y}|Br+ULL>S+sDc^vBzlvlkgnIoy^Qt7;E z%Faz}f|p}gFw~jNJb#)^G1_9nRk2pLhTl4+kGNTKJtnCzZ?tng==AQ$U*XMRNoFTS zIl`F|e;n{qW3Qa|w{HL8mnBWFzj8hQZ0Wr_@bzK=j;(j|#BaSd`%-0F>{_<_?(5UX zAAe*$6r8v3(&ay`j5&f!?!P}=w|{!Q|2MAV6*g@*bJ*tkJ@;jd|E*JaOSM&RI=9Yr z?;AO0^6NzJ8Lf@xRA5wrCAG;8N|SjLu2vgP-f#L>IDsLkh+|pIy44+^;@{KN&t;uc GLK6U%hk8c< diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png index 53fe9c97d4ab0b350bbefd61883ce63cc2a4e489..4e337fa0836e56404e74b1c9e250e9088dfc1794 100644 GIT binary patch delta 327 zcmV-N0l5Bw1Nj1w7YZi`1^@s6YKoe1ks&C58%ab#RCwC#n9UA@APmO~a`82s$N3b# z_4XP*gGW!^gmyr-!+>oj+SnzM^g>Aa@o)Jk0Q)rB>Ok$~Xe-AFa)SIXNZsidDca$QOB@**Xx#ZtG%TAK_9yw4Exw{6K zK}!BL2x%wC&m38NffbCq(o3I<8OS&?j!@S%8%QYb!yIXCE#+GRRB7d2K4LycRND6t ZU;xg=0|;54gFFBL002ovPDHLkV1jZTk?8;c delta 335 zcmV-V0kHo00)YdN7YZ&21^@s6O@+(3ks&C5BS}O-RCwC#n6VOrAPj~BviKU-u|9=w zZC}G@aCCALNP%mI0&Vp)X9l>-;&I{gPlAa6=PW$xK%C|1D2D_ltAG@c-Br`~J>0tv zq@-gU#}OXG@bOH=n{I6j^E`twh6JLjDrlMplv1Fz{tmJ%OE5&5t3?PA0HgzgUm$va zUBMEm@y-F`0iqX8K&;zfk@lj^`AB1o(VZc@b27DZTA z4WD}iZ7|x;@O(ZKeUpp1>|or6-C&B hh#f5h>A6n<1^|Pt_z)2Y(*FPe002ovPDHLkV1jx;lBECu diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png index 649ef9773b893b964913e1b3aae6d734bffa72df..fe18497d82a1c7d9c1138230ffdd14c24b59ecba 100644 GIT binary patch delta 496 zcmVBujy~_2?%lGKte@A;;q*zRht+{&fiSW;Z}Pi%cDOZ8-8GP;}N}H599F|-ELRqK*<0qFIod4eUt(Mz8bd|~g8`C%{T{w#ftg@`tU}Ha4x7%uuVcj2SQW2v%o0)g z!3vqk{K)hC=ge(JBwABO_(EoaFYm~3FbjLh(7A4ira96^4PhqOv|ZG_RCBYPYr;qy zb>!A+R!2xEv&slH$q_-y?1qNi2n}fx)|zUrhlcJaUt=Krd3Hj+k7R^uiDbE3QP%kn zzZ+f-?MbiNF4lnXAjI>CEg(GH^BvXM+LeE3 m@N{o3=_AW^#H;Ro2`~V<4SC2?3d=kI0000jT!HOLs z5oK9U!L8{vI08bfSP-ZJBz8SksoKPlAjjZEEX@MT8h`xrzyr|E;<^r;wjAklxUgh( zARWlVRkK(u@G+mmb2BhT~OAcw<$ zK^o^~T8ra262KKexCfG7E?_OFk)|ou>ou}0Ll}k_kH-jtK;}R}0HrTl0b$|*(^TVh zI$^urVmKUPG#W{m&1Qo*Nn~hL{wpAyF=;yM>v%*IMd3$D?SExWrkUy$I$`J~i%D<~pMAxV)CUHz9BJ+bP zBoX;>KA(Tj)GH!rbrqotNeQ~VC&EE0?1e(tzQLO2NEXGinP&3 z>Q=Kp!kILqitr{m!nicEq2YFfhAR@*Sk>GQ4S!zwYJ+wvb; r2hxGma&!&NS`g=fCxg*@zXcco-vxKlbE=MA00000NkvXXu0mjf2Y=@O diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png index 93f7d87c2b238061186cc2a4a93cda10a4ecb3a3..00aab3d5af5cb97ad0bf3989b2a6f027887a3b40 100644 GIT binary patch delta 759 zcmVfA_JbA>p^5S1 zhcPKXh>;kL#s{cx;CuLf@)iQoH2%ece6)qOz`8qgy)!KZ+l6)u8&~6`(>9rzJ7>>5 z=VoSsyJ>ve0CZP@Zi_>qAgwS!{33w(@bUFO%m`8ci)h?e&JoP^Gubt@S`9DO*P)bu zni+($K$QJ^iH2o&WBMSrx3;kHY2#)_s;jGLHk;5|X9ht^KuGs|<+}1{_?Q-iPK^8~ zRI614L4Y`puLsiYc3o%AR$43oyRjd52R&%&ckdnIh%Qq}7z%d`2n&U_XBLQy$WEloD~EXbD#X)g zp&MFS@)3p+PS2V+?W}+_|0d*gATu&TgLQWO;-ZiH%ihq!A{VSwJe13Un?oso@zYb2 zkr79;wyuB^V!QnaM~6Eol?;NA5JimrAD+0eA{y*LiJnHykjh9_$Jp6@AmWTjV{ezS zz4->MW?j;BjKhNpzVED|b#(5WUeBf>^jMsQIv+p;_a`eCo?ij9l4qwi-I>v8JHp$*JP8@R2nG=5LcLt$yp<&*o^R)ka9k;^EIbpc)B_^Yh}Ir z)ciq4it8HW3?wc7|F;2u&ua;L`?5VR!P>)8k|blt(J>&6MnjJM<=lYS%e~!W^ln|0 pcWCym!)f$!&UIw;>Wg0j3;^|4(za@KTp9oX002ovPDHLkV1g%tb3Fh6 delta 766 zcmV&^L zIcH=Cm`vk`2B1j=dMFNslC&w1;r98} zLZi_@5Cn+h_;w)ue&2QGe5J(#up9e={D3f1Q3$JDoE(3b7djSyrs|k`^jap(x!BAaG)k<-<}xQ6HmD(n5CG*9 zDzj&J{$d@=pL{%dT1RU;!Pbv&*xCJvIHK!R60U@s0>VO}?YRZwBC-?dV(kE{Z$rF% z6}q8?1s`D;;q#q|&(HgKyy#t7Smc6Q-9xn+xH*)65kEUM zIT>*@YwHR)A$GgZaCoqdO2r@u2~ot@`|XJv>!QIEDAChRGh{N7*D-eX0Ejpv(%9W$ zY_7jYr@bXNzz9ly4h(K$SK&hbgROb&08W<=P?%LpzjW<1bIj}3lq&0>G=gJ>f} zbRMDG5f}B&9Z-mM3t?pN0`3r-W4SiJfn0ImOfP*tnH- z@~QccjFi_kC>Tgq{OKjUv_MiCv9~YVixR9oEG0>jI*z7*v|24W_E!r7VlVf0kDGVv wviyfO1u_LP634Wll@yL<%i+RJ#s}mB^75%k z(-h)32Bnn#JxvqL^Q`UA0~|-2>$*?9q9`ECvTcw&&tV+LA0`3fd7g&B4f?(hNs>T7 z+qTdDDSKhlG|+V&48x!ecR*e_3W5Lxffk0Lo;N}8fqma=Pap`+5+LXi(nkneZvjG{ zKmY=g05Nk7HSMtglL!GEf8NqktMByhSlV{DMqucyo*LU5(jH;u2*KF%8IRbyY>!+W z8di>65gPN@vO{Bs~fi&SXLu)qBtIdp2cB7ZhV*dVVYnPjrgckzhBh545` zvRf)%4f5N|PwiboX3cr_LNjd_gi3$Y%(~)C6;HhlY3_pH0`ppzU#Q}-g)m`Qp`muu ztgIyZ8iHY6@pWD6P7iw;=}r$Jf*{aZsJ#hNmL)_{BoY=I1_#1aRi!t2$8TuhtnK!( jgG<34&s-eAF98Mspz#+8-DX;q00000NkvXXu0mjfEzrck delta 445 zcmV;u0Yd(Q1cn5V7YZ&21^@s6O@+(3ks&C5s7XXYRCwC#n9GfXFbswbgrOCB;Y<dXx<;c);v1DyL<%HhIA#tm|Vyu53Y zB!MW3Kq;kvkK+i_G-=!Q0LRhhy6#gi&vQuAbR8tiG8l&8he?2Vo~L2(1%2O#IF6w} zX`1K%l)bR7YiQdR`o7nOZ$Mtz3xWUyfffXTo>xKefnC>WPap`+5+LXi(nkneZw5l1 zKmY=g05Nk7HSIA2lL!GEe_qp4i{JF`SlYI`MqubH?i$-0(jH;u2*KF%5s%oqY>%8B z8di>+5gK#bvO{Bs-!yOfp%gt9ZoW!u-n| z*(?>$2Knvdr?w6uv*tW{pqaJ_LZ!cHW?gZlil^R&G&ezTfqAS;V^s0jLYOeD&``T+ zR#p;y4Z*OE_^PUOr-wa_bfG%88>-ETS9C|z+?5^vwzx4piVz+IZ9dU-kAq@rte~|HbO!xbL zold6{-EKEN28@yHPk>Y^#mQx}S;}NG)a`cZd_KRfanzeGmkaIpd%g(AfQbVH5b1Q9 za=9E83I#s*1-V|Ye1Y(HK^BVz&1N&&Y&KM>RH)r|9xWr8BA{R6>+0RuIJB3Pa% zw%u-NKA%&yTBUlu&I(VbQ|fd&tPbLT2ZA7bJX|<#imJ$JwW4ylOvPf6&ruhsk>zqp z`FviR*gp`_A*x3)NH4lgbPj3*-+RTfy+B0kzT;5ics#P2$R4$ZE-aNwuWJH9iwvS>8P!Dli}wh?P_%M??If;9 zP)wa^L3HbGYVxw^;yGS7Bmv_0BkFibsmf})H0lzCQY5LRiPSY-1si9vhVGiMm7ZwV zB&mp6e;;dKxg&KT?zhy4CBvvPezZoCF4k~eEWJHW+|iv>+IAWr#R7SYj|j>`)-P-H!J&n65DV z!cDsds)!hXI2;ZI?t?002ovPDHLkV1j+@E*<~? delta 652 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 T6{wb@00000NkvXXu0mjfZ=Kwx delta 481 zcmV<70UrL21d;@h7YZ&21^@s6O@+(3ks&C5v`IukRCwC#nC*>&FbswrNIMM!une1^ zuG1e~q$_lc{^Ogg;ey;Wp{6lcP9l;OA;Fsm$4;C8$h1CGKuHOOazwC^wu9^-i?il* zIzg6YptXL^&;GN-Qc68NcU=eP^BM9yp9i_!Zo|hoFtwn+edtk(q6m^Cfubm;ceMR~ zQQNiyH4biiDG&s}7RNCh4u^RV9K30o3BbUFf*=HH87R9sK@5PTM^FP{3=j(hr$-8g z#)i>hd4x_0_0Gq;;jbsCw(F;y9S(CR zO5e3ocv1S&7uNz|#mHL0`cA{U#7n0yUEIE!zVEc64V>~Ok0=UbmjTjK<6Gi4bDa1} z*04Pyv9I{F*z1VBTe|AYkloj(r+uZrtFj6`(@ - 47dip + + 0.250in + 0.020in + 0.270in + 0.0in 38dip 63dip 2dip - - 79.9dip - - -47dip + + 0.459in + + -0.270in diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 1378be72c..c00c56a89 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -19,7 +19,11 @@ --> - 54dip + + 0.290in + 0.035in + 0.325in + 0.06in 22dip 42dip 63dip @@ -27,18 +31,20 @@ 2.5in - 22sp - 14sp - 0dip - 80dip + 0.13in + 0.083in + 0.236in + 0.000in + + 0.464in - - 91.8dip - - -54dip + + 0.553in + + -0.325in 0.05in - -0.06in + -0.05in 0.3in diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index 084795463..6e2e69208 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -28,10 +28,12 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="9.09%p" android:horizontalGap="0px" - android:verticalGap="0px" + android:verticalGap="@dimen/key_bottom_gap" android:keyHeight="@dimen/key_height" > - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml index aca46930f..a287be1fd 100644 --- a/java/res/xml/kbd_popup_template.xml +++ b/java/res/xml/kbd_popup_template.xml @@ -22,6 +22,6 @@ android:keyWidth="10%p" android:horizontalGap="0px" android:verticalGap="0px" - android:keyHeight="@dimen/key_height" + android:keyHeight="@dimen/popup_key_height" > diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index c6113abf7..a2c9b2b8e 100644 --- a/java/res/xml/kbd_qwerty.xml +++ b/java/res/xml/kbd_qwerty.xml @@ -22,10 +22,12 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="10%p" android:horizontalGap="0px" - android:verticalGap="0px" + android:verticalGap="@dimen/key_bottom_gap" android:keyHeight="@dimen/key_height" > - + - + mTextHeightCache = new HashMap(); + // Distance from horizontal center of the key, proportional to key label text height. + private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f; + private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H"; private final UIHandler mHandler = new UIHandler(); @@ -465,7 +474,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mPreviewPopup = new PopupWindow(context); if (previewLayout != 0) { mPreviewText = (TextView) inflate.inflate(previewLayout, null); - mPreviewTextSizeLarge = (int) mPreviewText.getTextSize(); + mPreviewTextSizeLarge = (int) res.getDimension(R.dimen.key_preview_text_size_large); mPreviewPopup.setContentView(mPreviewText); mPreviewPopup.setBackgroundDrawable(null); } else { @@ -576,6 +585,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx LatinImeLogger.onSetKeyboard(keyboard); mKeys = mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), -getPaddingTop() + mVerticalCorrection); + mKeyboardVerticalGap = (int)getResources().getDimension(R.dimen.key_bottom_gap); for (PointerTracker tracker : mPointerTrackers) { tracker.setKeyboard(mKeys, mKeyHysteresisDistance); } @@ -720,7 +730,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx int dimensionSum = 0; for (int i = 0; i < length; i++) { Key key = keys[i]; - dimensionSum += Math.min(key.width, key.height) + key.gap; + dimensionSum += Math.min(key.width, key.height + mKeyboardVerticalGap) + key.gap; } if (dimensionSum < 0 || length == 0) return; mKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length)); @@ -772,13 +782,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx paint.setColor(mKeyTextColor); boolean drawSingleKey = false; if (invalidKey != null && canvas.getClipBounds(clipRegion)) { - // Is clipRegion completely contained within the invalidated key? - if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && - invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && - invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && - invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { - drawSingleKey = true; - } + // TODO we should use Rect.inset and Rect.contains here. + // Is clipRegion completely contained within the invalidated key? + if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && + invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && + invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && + invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { + drawSingleKey = true; + } } canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR); final int keyCount = keys.length; @@ -794,8 +805,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx String label = key.label == null? null : adjustCase(key.label).toString(); final Rect bounds = keyBackground.getBounds(); - if (key.width != bounds.right || - key.height != bounds.bottom) { + if (key.width != bounds.right || key.height != bounds.bottom) { keyBackground.setBounds(0, 0, key.width, key.height); } canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); @@ -804,22 +814,34 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx boolean shouldDrawIcon = true; if (label != null) { // For characters, use large font. For labels like "Done", use small font. + final int labelSize; if (label.length() > 1 && key.codes.length < 2) { - paint.setTextSize(mLabelTextSize); + labelSize = mLabelTextSize; paint.setTypeface(Typeface.DEFAULT_BOLD); } else { - paint.setTextSize(mKeyTextSize); + labelSize = mKeyTextSize; paint.setTypeface(mKeyTextStyle); } + paint.setTextSize(labelSize); + + Integer labelHeightValue = mTextHeightCache.get(labelSize); + final int labelHeight; + if (labelHeightValue != null) { + labelHeight = labelHeightValue; + } else { + Rect textBounds = new Rect(); + paint.getTextBounds(KEY_LABEL_HEIGHT_REFERENCE_CHAR, 0, 1, textBounds); + labelHeight = textBounds.height(); + mTextHeightCache.put(labelSize, labelHeight); + } + // Draw a drop shadow for the text paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); - // Draw the text - canvas.drawText(label, - (key.width - padding.left - padding.right) / 2 - + padding.left, - (key.height - padding.top - padding.bottom) / 2 - + (paint.getTextSize() - paint.descent()) / 2 + padding.top, - paint); + final int centerX = (key.width + padding.left - padding.right) / 2; + final int centerY = (key.height + padding.top - padding.bottom) / 2; + final float baseline = centerY + + labelHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR; + canvas.drawText(label, centerX, baseline, paint); // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); @@ -829,15 +851,23 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } if (key.icon != null && shouldDrawIcon) { // Special handing for the upper-right number hint icons - final int drawableWidth = isNumberAtEdgeOfPopupChars(key) ? - key.width : key.icon.getIntrinsicWidth(); - final int drawableHeight = isNumberAtEdgeOfPopupChars(key) ? - key.height : key.icon.getIntrinsicHeight(); - - final int drawableX = (key.width - padding.left - padding.right - - drawableWidth) / 2 + padding.left; - final int drawableY = (key.height - padding.top - padding.bottom - - drawableHeight) / 2 + padding.top; + final int drawableWidth; + final int drawableHeight; + final int drawableX; + final int drawableY; + if (isNumberAtEdgeOfPopupChars(key)) { + drawableWidth = key.width; + drawableHeight = key.height; + drawableX = 0; + drawableY = NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL; + } else { + drawableWidth = key.icon.getIntrinsicWidth(); + drawableHeight = key.icon.getIntrinsicHeight(); + drawableX = (key.width - padding.left - padding.right - drawableWidth) + / 2 + padding.left; + drawableY = (key.height - padding.top - padding.bottom - drawableHeight) + / 2 + padding.top; + } canvas.translate(drawableX, drawableY); key.icon.setBounds(0, 0, drawableWidth, drawableHeight); key.icon.draw(canvas); @@ -1003,6 +1033,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx if (key == null) return; mInvalidatedKey = key; + // TODO we should clean up this and record key's region to use in onBufferDraw. mDirtyRect.union(key.x + getPaddingLeft(), key.y + getPaddingTop(), key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); onBufferDraw();