From cd7b7d3e8febcfbcab4628d1fc5b87e809ce56cc Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Tue, 12 Oct 2010 15:02:44 +0900
Subject: [PATCH] Specify keyboard metrics with physical unit "inch"

Cherrypick I44f3b2eef8086d6e0b0db53d38f08487549060c6 from Gingerbread

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: Ib38355ebfc2f8d5b1d26c4e90eba87196fbeddfa
---
 .../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-xlarge/dimens.xml             |  28 ++++--
 java/res/values/dimens.xml                    |  37 +++++---
 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-xlarge/kbd_qwerty.xml            |   2 +-
 java/res/xml-xlarge/popup_smileys.xml         |   2 +-
 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      |  65 ++++++++-----
 .../latin/LatinKeyboardBaseView.java          |  89 ++++++++++++------
 57 files changed, 240 insertions(+), 136 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<<Kj?1EAi^KdK3KxQJ#Qjo*{F&=x&1Ymg+ZCmaJLID49vo(O0
zGG@U}j6kp%TQNp}VuWIZK%Qq@_hk?S@P0hP+u?v_6_Bga*X;(^%LT$PoVRLyoK9+g
z+t2e{^(a6X1IKYx|9L+5E^9qfRTU&jqIygqwrzv!y7Q-2mSxHt-49@}x~|oOmD*;5
z$U(AUf#@<^*`zMrWj;0tlXaSgbP))FtO){$LBPl(?Ld?sF-cJ<MhJvJ2xOZe4AbkC
z|9}XY{UY+r-$AhM?k@)dT~31x1k7`Pt;Yuy$A~69NG-k_Hjq}AS@sL~-fWL)qF~=d
zuwzbBz-Vgy>aoR%S&Ve9#1`xWns!xI5L<|kIjdGLTi+tczAIMb5o{hoxvNj;qVhC>
z5XftQu)%#qmV#vk6;qwvvMjTMRhp(y6a|!JIaCf_f9f<4oO7j33#v==J<kI<-}fgE
zGi!T9S`<YP$8rBM;xm*P=bR_rJdLM<HX0}Yf^ipM0C|(<h8jeso&W#<07*qoM6N<$
Ef}5((IsgCw

delta 472
zcmV;}0Vn?d1BnEX7YalO1^@s6!$f9nks&C5t4TybRCwC#noDkjFc5|Zu-GA1q&sfX
z9Hu!}dYI%U>>5@G2_c@rE+|zo2B!)g%uHl?F>&}m#)HQ=0I#>UZ?C&R+k*AuVw<%N
z#3B#^ArPez2!RmDGaz9Y!u#<EZ-)aKLN4^{c7yBX0#Ot#1Nk_e#Ij!$h3IkIatmC4
z*A@Ne`8;wn*`T_vAx%@!V*+s;2RzS{`lTRwo{MM<KY+oSrV%%mYg-J$2l0jlVyJL=
z<GN&SrW%B-3{mPL5CT~f1Q3IORz&)NC?hiAryL;=0wEBCKrBpK$G?Dxw?&8|^E?RF
z)qQs$Fw`{2KtR9NdVElEC^X4In)bVYVFT%P=~cgg@2#Cm6D9j5k{xrI0$Nk+SC1`E
z^m1efCAMUr&}4%l#$?gLm>)}?TBB-xiy%f#EihqfnH>?7tNM&CV<JKz1VSK6vnJOO
zeiY14P%)je+qSK@vC6Ux%Cdy2s-}*E*Pl8a1Y=BSlY+|1eBbvW2!h$o%-Rt{;TFd+
zBuO%MBi=*laS{lD5Xe42m<h`|{mGv|2xLznONzp-U~B(d=-hYi0t^6!3Ke;+26%%2
O0000<MNUMnLSTXd1Irx%

diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png
index 5a20da1dbb60d404790a46b704f8fccccaf995b4..af4017e2c6f7e8ec7b98fb9641d81b25e9bc138f 100644
GIT binary patch
delta 713
zcmV;)0yh1R2KWV#7YaED1^@s6boh93ks&C5nn^@KRCwC#n(I>9KorN%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+dZTHW2WCX<QM##<M6|1-icR5uo~?F@p8aBzW$D_k6q%e3rmx+twNpU<h=?b3KW
zrp01G$45tWesMvSN@Yc+b#lEs2u!7abAL~zQi&S%I^}XXHP?N3pt}72>GU)kAUzpU
zt0yN^E|*{CD!xy?j8KEYfXY%Uh*qpYaOZ{80JNd+2jK&0Vx!TBd<nJ}2&JeI-}6*Z
zG41EQT6=-8(#TRPNsnT&NP`V~VO}?@$fiU|%d}uJd1+dq%nxvKU4}qLFeJc#>2%85
zM<8JH@>11KFryd-dm|(xY9So|qY<uA3l&7W-KHNhkHGl@nebq8t*a~LAH(P8Y=mEE
z1*J!`*;FAHT7fnYda;(7gcxV`Ur$dvl_;!1Y-+8&K*TZ>Ga=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*eaB<L_%1Uc-EmD30}jj+t>TjX->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
z<QKQ07qecMdok{nNMw^0{Q(H!tF80SQkN}LN?BV^VTLpfoxq%j_k7W*@H~%_96|`S
zfLuoeu7BDZV6avfO9LpWug}q*3<F|7l8HZ~hygJm5yR45Y_(c+b9+nYXJ_Pb321qL
z{C<9>pAQez>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(_*op<D(<GxV)rFrLtyIm|b5E0$1sOJU&vXRH8<`PPtr8UF$wQQC+_Oc6yo(ke*Db
z)sqt{m&+g5Dz;6w%us{DfXY%8WGmJn_~nIE0BQu+gYk}ZvC(KmwglS=gi=(*wk(xY
zbn96wa~}|~6j`d0^e7gKG}y2ft_R)9i_@Z{<yvr=ymT#B)&~T6&<00lFciRl>2%6F
zMqps`>Pq!aa3dcEYa=BiYat!~qX^fmg$|<KZqqMWM-cpuEO>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&>60000<MNUMnLSTY1$zFf}

diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png
index 4ec703d6ceac885c2895b9b0f1919d615498cc90..4c35aca95dd88e92c4bc76673d2509917b0383c3 100644
GIT binary patch
delta 1043
zcmV+u1nm3R2*3!C7YaED1^@s6boh93ks&C5;z>k7RCwC#nOkoYITXkL_Dm)TQOP2j
zwg{;b;-cM!2OfFZewgKR!H0n-;0-~=1E{E6OVuW6+U#^@Z0|XCCM{|bIu#S#GHzWf
zGj4o-KG*R8<u^0x<t<<g!efig1E{PfBrZs+KzwUrjy{6QM=BqwKz>~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?<HU*CcB701@>t
z3M>pS$(l$Lh4hd+kQzl7opxBRNd;**tt>9hq!=S$GZCmo5{*kCb%le$I+D0c>m~%#
zM(gq&gkgKMv214A_Gxm>AA~sAgn}A5Z!<u%6(b6t;obv@n|C7AY7stvin0EG>IL@p
z{vt(OvnG|LPMZdvfG`Q0Ec-^SF40+hjl1_Ef~b?0+?1<}Av#MTUcY>ccN<qoQz2v^
z@-XHBh;T8Lom>VIms<O{c`L^1jm8)vZ_6t+3=cGRcDHe`cimNm0>w-VC2C~6Ny4Dj
z%Ixkp8e*ae^1aJ#g-;*M_<vD<$VY(EK{zsL)wG(hT+;%iX*y@u&e08gFfHREkj)91
zLa*1t)>adLTuIPqeqZ)wlso!;O>>sX(GO|9XHkoHR%HUoVTM8fKWx0aPbT&pE7vr^
z2&<Xo(4f1k@Mir_Y<)F$t_5Mu80`xPtTs|A9O7Y$_Zty1wT6{1>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;0SDZY5v<CYOXZ!Tn(@}o^*z-u9+s*`HgqWIuel}2{WLg-+_;uX%
z`+^{^X*>f#@mlNX$19E*GKJHUmhHZQjN~d-{ldSK?O8Ha&VDYOeI8}XSv6AV?AJ^>
zNA<{0iuuS<{ot3gPm$?Dy;d;i!9PwDwN6y)=Mm&$zp<(`;+sZ(yv*u9kgIw<U4c{}
zzXynznn(D(-K-<Zxl1a9Jr^$YU^N^Lk)|oKESvT^c>bnC5MdZv*(QQcD)ZazHaeZo
z4<Bactr2e9+uP{(`zLRE{0vo$(;ij}F?09n{x1b3xx_3jvE2U)FaU=Y2<t<<6+Zv~
N002ovPDHLkV1m=9@lgN(

delta 1068
zcmV+{1k?M#2-paa7YalO1^@s6!$f9nks&C5`bk7VRCwC#ncZ&NHWbJIq-fc$k$T1A
zB*lOLL$_jEd(q3?EDy6jSNAa8)wa7~4R*02L%MEDgT!{6c#0&FJBPHK46)KEm|P|i
z6Na$FnCHjyDGI2+*;%h|0c)YoEw&7xx|)!<C9MGot%)W22pS)0e53*Sa7`_`xVgE1
ziEp;Hu)ekyOcda#wD;~EzJK`=ySuwri(214f9}$Lnx<~7RX{NlLo5)+@~`_t^915J
zcH?(1UR?N^g&NUXV=|ezu`Un>V4;NcUGirsX0?;ApNu99V^N3@MG;n3R<3SZNs>5i
z_yt7`5Hk&shek?Jm#$0cue0!)AarJbXf!anbt7*q%XVcDV~p!{Kolk<BnjV=Xtg86
z)Kwfg7+#V!k);~hDR&^Vnl5_nuw07@QdL$K*Je_T5wV#Fv|@?QJw;vPWU`Gk8Pd8b
z!SvC){}@X3XB*3AW?V0mYxy9=!6p>7$a%XFy1fLk`T<YBmU#3yMynO$&$kJGwtx8v
zM@L_hA|5)E$}_J`i$Fk_giV%xqt%uetiHmNr!hgaNlSjp$Eym1HHB9{|AyB)4@grA
zG7?1?3jjp;n95ErBZ+&xV?6pS!RDu(IYiOcH(HpU7#tk#<K*ZQUlj^eGcDApk@+SG
zi(W5xyWi=Eg(k@N?)Np`zOnOv|3xJq0cr=~$YgZaX~J=p1xVZV&ThP;TZCX*)<+<h
z6LO8wsE571E<SpYqSO6v*_Tu97>^CjStmz7rTKwHE#6t33#6wxCgXpw^ZFT?*pJwF
zXb46)&7`Lm!$XZ<x4*#N-`34_Agmc{LIHu(Mn;80GR^S&PK;b{VdJlVZLAK46n=9Y
z9`p&|bNun9O|T=1S~+P&dySYtG~xx}ZTGe|HpjH%8Ab<Rq1|m$j*;{^#c(*n@zJ5v
zMowAYl`6)DV_MEnT=3Czr_X4&PmU9pE5t05vng@UGvnrXkbr!o_<muF;?O{5!b6C8
z^!K~(q7{!gi(1zK5j7rvuXuTA4fYw%_Sw0oqvHO#=aC|}T?@ntQJR4MZ=g!av@(bd
z>$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<x?1*ydk_zF@g)2Q+O{Y_2S%y5%%U%aB-*gB<Ddl8a2)d}u@Avx{
z3<mFgm|3<)xb5%nV>}*TydCf}R3*+PYBeAYNCR?n8mEXxBMnFcaz{Ya`QovxK%|20
mgVtgsm$<Bu<o2%@00RJ!lLiIVIQ_E#0000<MNUMnLSTZcZUtTd

diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png
index 93322d2e279dc2efe8de56c94f008f6077520cb0..174f3452c684ba190fc3aa012a825ba1dd3c1e06 100644
GIT binary patch
delta 683
zcmV;c0#yC$1=<CW7YaED1^@s6boh93ks&C5d`Uz>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^E2iy<D5M{+Y(S^~MYiq0Agz_OpuXEGKBK@327fZ&=Bi!cDo
z;*sU?sK$&`H_C!QeDJ8cn2%tGHB>o&S#q@?(v5Uh@!?uhhFr<4TuXxJEaC$ME0y}2
z6^M)lbl)KI9P)8&9qcNA1abM<s)Fb?$HEpdb?4v388WRb(ixB<Ky`rRxmT+!k|+B+
zKum&M?(DXDMP;6d53AV9EA3i!fmFU~)dAvU)v5!;$*R>fkZxyDde>?ih+O7>ngU|l
zggdj3bU)aex*?Vh_B<e8AiDE@Lu^Bg#BF(vH!Z(`3e&q*)8Dnqe6dw!kt}__%Obio
zrTTSdN?}%=h%lv2qr98Qf{V<MXJy2zYN(A!9ZdOOqeXBd_@^%2?*c@Y-c)_8K%~Ml
z$V}<|D%?pegmMj0LRq<%oCGL;Sxs^s8@h_FwQE6nsW8fKh#4QQ1xsMe0nyjlSz(l@
z@Avz^61C5NK1fT9$733eMifO+af_VK=R|3S0f<_f_5}iWW{}BbLYK=$KM(ONFV5$4
zTCG+z91c@%<P$`7H~z!Ge!r*F>6D(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-EQG<IFy^UcDo(SW;1xbUg`P!{Z2c9xPss?)Z;i#JGQ}K0N3jk*6VfV7SSTp=@f3a
zTM9xDI*bnxf}oBds9R~*LWsxXkv<HS=0L8kB3T0gQ1<irOvln76a%C@fzUM{7C``%
zg(J$tQI8p}uF8X;_`p$jF(1KB*3jjD<jEC5xEo1U@!?ur2A|2ST#JK97V!Z>GnM|E
z6$p<7>b^nvImxGE>tNRbIEc&FRvkoI97|io)SbT<=g73ONN+&O05t(p<X)Y!NRjOC
z05J)2xw6~prK<cRKCEIZud-`31ycL0)dYx>S*r;UC$m=DK>D3U39i*P5I)U+wFShq
z2=`_k>3^`dbwR8g>_tGnK&11qAa)@}lCEsyP1A3r!vxoA`(CTc8(Uo#$<yb%EFz^T
z^|v!q3bXD+gei5ZiXOrXE<8h?ml3b4QEi0lV9Ng*EkX|>|CG}GE<kwcP1nZ?ge%O0
z%#_}*!=3a(DAo`;l$C4on+S@3SCd@FhE&nDb}dq#D@^4#iWwiSMV6qk07R~{qrz08
zzTfZvO4L5TeBhQCkH;_?jX)_?-XiDoIaL~A2t+SU`vM_%Mv%#50+-80zK`OWU!2e9
zuv)EPI2>l&$R~*IZur5#e!qv)>6E=q0_k82U(f}R01`j~NB{{S0i=~DdlYFyC~V{!
i-HZL`Wz2MZ1Q-CRep<na0yk^`0000<MNUMnLSTZU&PW#k

diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png
index 5a9c722cefb461a02dced268bf12e418a38f0e54..1fcbd9a887085ef01807d36e6309f95457beab4a 100644
GIT binary patch
delta 894
zcmV-^1A+X)2doE>7YaED1^@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{JMRdo<t&$2*jWKi#!s6L?AX|=uWm;E&BR@
z`l5QhepNwvCE(YJfGa+ZYW4sA{-#c+L!;5?`Z^e-R^4v5OSxQ*j>n_;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*<m?aIv5a$Mi0X3UVaZaAe
zT!oelqVtGXAh^ePJf?EFOvPgHk{fStZ(`P*PN!5VmFV^L^)?VW7kKyqf+wGUOeQae
z$~6ig2($ToF1!W3Jo&gzb`?Md@j@^QVLHXEBt!6%Pp8utop!Irh82X>@ItcLtZ4$X
z;Q)2AqIf6>7dLnYNiGZW67{TFtvUjU+a;r)<LBpxYPFhJb|4=(jPQH4T8Tslpp%Ce
ze*}O$VCeh%yU+_DOaSl(009DjSSQi&(9q(rg5ixuLqKt&?{+&;D0w2d3&bw$yb^#Q
zlynP5r*;|l<cFW)R-bWCjywXywMU!)1r1_V6n~XRe3`Yv2J+lplqj^q2BN+jgaO2^
z2tQ37dH!S%YeBp@*{y(r0@3}C3S#JU#BBdNtR681!50ZCOcYvSUu)fe^2X+sN6hT`
zzdRyuwy2#yv;TgGs$aLSXuD{XyBXYj<*tTVN8Bsn4vK7p6@(*?@QpY=)fSCkAaYAc
zwZ|2RY_ObUcI|yH!b#l-MUzg3aur(gMGVDCg4#n=VO)n68!sEo+i#pRL4+22f{zv;
z`h9k8>7y%-9<01Y9psm353(m-US24bN?mO~SbAhOn+c-<!yxL`bWk81&H%v<7P|G?
z>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~<iV2&9=s@}*4IA&<r!JlO-yVOHQj}6Y9N{UWnOkO
z6Kl8IQIx~7EFs{Z97{PLnhY>l;?I9!*E;Z!42S`V2*jZT3?z<3SVXWG5Cak;NTbnz
zpjN9zwOZ|91?8PUR67D*@kIbDtN&mypmw`W@9*#aK;GWoD3{C8X0s8$x7)3l3=+e(
zW<PD)78B#<=7v5$Kk4=L_23e1`pslAv{)<z2t%kaaey!cPk=x--Oz#nV!2$3n?Y$A
zC~B+dtN{SXUaeN*=o^G%fR$$uJ{O07MF0R<I6@wd9y{ip;|9U;furhTVF&xy*BABs
zeVR_E!V`+cA~l;$DwoR#a@^!<L1Z`5StU%@n$2d^?RF`j&x<VSIF2~i>-FgA=}DZE
zGg%<ll0kG92@3@G`1tss$HzyyzrWwdMyXU1S#vZR(Zj<76$*vZK;&5983hP`o_s2m
z+AAurQ2>FPO(qjzEy(5M6FAsa02w5Vfh>e{imW6<@RPs0yW7h=_G;{SL3qtDMmC#u
z4PaIrpni4~X9eNK4VFQW%L8$V^{i5<_yVzy1!I(Ry<StbS{2(4!~?q#{-4k1BG3Wo
z=i%As0FWmXeSUrxash+{0BZn$5Fmi{;|*tZEp{s?Ua!{$6bJhE_qSLmIT8E{<e1xq
zH2?xv(rp<1>gD_<J|eD+1d`|cCPvNy64)YsfZ_)6S`@F!B9UaRO9QbfA;Y-VRe-4P
z2A2SGY!Ob(I+FZgztjcs<Y4y#iVH;d+boC|A0uwPkxR9RD~M?ADlo=>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<MNUMnLSTYNtE0#O

diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png
index 99b6cb17068737696c287a2f12f821afc8bb815f..072753f37dfc12ec6c24858aae888bbd9f58d426 100644
GIT binary patch
delta 1217
zcmV;y1U~zM3hW7x7YaED1^@s6boh93ks&C5j!8s8RCwC#np<ldM-<2ZGrPLDrg2NI
zC2gS&m_Wg=fkH8XzNVkRkIuJp-u&L@LSOt9+%^xUF%(iYq!`C?Bum=M<eV8FX|r0b
zE~`~6S0jyAlC?YMH|KxO%<Kp#znH69UIWHJB^q1WLLh1dvI1Fw<dzl43S<Q`3&{3=
z_BQtR_OP|JH8g^9mDlB1r20qIH_w&h<74da@8js`Xflw4g9EIuuOo^g`#z3iTLom^
z5CeNv|Gjd5pp}N!+J5eN9$Kvyc6WD&F5zcgcx`PBoleJs2t*pDxb^&04nm0s24wvQ
zfhg^O7=&%hDw!Y*(d+f>#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@<<U7
zZCFm)Wh6SDzWW7Fe((sQM#1d9bNh~uyZ3y&BrgTgBl6sBE4i5T#&u$lWGqOXTjpW_
zV^bEwxPgb?oZ;K=>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><e@|!@3VcgXX!R#PGfSZXD&Oem(B)#Jnr_Y-}MSblN?C1eeb!OKH5n
zh^_Gv8GPA}@%BxKcc)L$xx8h+%jekf#at6<@rWH$|3ze6kK}Z5zCp5jj#uZuVg2*h
z@N|!Y{3{v=e?-vvnn1dgdaq*3sOf^eOb|YmQB0`pOtp2<LD2IF;%Cy6Z%2Jj_m^#&
zCUxJF6deHNy8e`DYLIb%vMc13tKPMPZ5UIWoVkf3kNQSD;MDJCz{YjLtm(Hbuh5)>
zo(eorGl-pc$t)PM7U4ltB3X^hY=xv%cq(t)XyT^xgGGrfsGJu>R{UB1g3d3JwdQqa
z*d*3=Dlw&pjf+8hD#s<C&Lb1tn4YHH8v~+oL&{28O97HhbJqobWZWRUR36ELx%t7q
zumN!jkIX!290#;0kgWHs0dW~(#4LQ3SimEBASw;BlGb&fYvm14WqV|lJ^wF{$SN(l
zB1^B%@>Xl}D(UvK_7%rY8vAQ!TK)5#4tXti>&q<M4%eg&c@PtML@p%y6qvF>q}?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~<S7@bC~PCnv)!r)7aGVNq(5o>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<v%YlpxMhf|MX7$TT2-
z>+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?P7zT<Np+he2?B&@nBs
zJi%_HFRAyX)jtBox(WaO{U<a}K0p+<F+T6Zqem}b<@zebNJT(GONiBQC1iqsBxRK4
zl|0fS2=6Q~ga;7DU*O&Q*YI#nW357^QisN;&+zu2*U;&_gxj~C05zqe*d8a5RuUx3
zBY8liCOJtvBH{7y+Z%ZD)I*3G2DAOn&09X)zT?AN^imi<M9<wcl2fQRs$+vBV}a|;
zMlJ%-X2^m_HQ@e(Blzw2dJlqs%iUip&~7RC@8cf)RC|u?x!ZLHdm11KGJVc%qnRGk
zZ<^k(*F|P5(f<y=w$4q$!vfxSLAdI)#mWPRRSevUcf)vsE+>XqSgou;6wo>Dw&k=S
zQ&(k2p%`lv-hrc|pP>^B>OP7zG><h743EusRqP)6<*2(8v#!*$%0R?_5VX4xp1#CU
zO2YROWsHx};M2B(FP|g$cK95E)9dEDbdH%{^aYU?&DaY2FGl0KD5sO-6_nL0cz^sC
zEMNNwp6p_f-@}RU8HB;F2-3l!_bj%wm@L?f1ff$2MMuJ9s;!d%!mf`Hf1sXxGwaiE
zf7-@0sq-DBXaR7n>!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<O;AO9WSBiy%Oku>
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(;jHK<mr;QRjg9%(ch#%O|Jko4B{yg*pa1X8cp
zq1kL^pVz<N*DtH9tFW=L0hLN+Kt}TfNz09XFtEG33kL^62ZN_&fh=GtK}wJk<f?%9
zmtieZ{>Z-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$xzZnZg<v3$kVgpQpMbEvi$M@T9LM1MzEa5+MFDA=LZ0Vax9?Sd
ztt3gnbzSJX4whw6W9t|OIF2LpiK1x3v8#w}+t4%(jN=HZ^ciuUVvNZJKE1WtwuNCB
zz7AuEN`MF@#KKyZbsj{hpjyXYb2`Y2>jDA<LLdb4dro>Qa`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<5<dYp_AXMiz=j6aF>j<u5mLf@ett6u22RhIriqRU#@PJl?5OiR
z&q3_x`*9@a1T#pJ&<Es5f1DM90Um)z0CEu!zIM>}eG0>nJkL`q*(}Q_j$=yGbm{hg
zwW<|G5jl=SP1Ddgj%sWj!ywzXWj^=&eZjG+$nAEcs;a2(ds3y(i0diNxm@7gTdS^X
z>bmaxVvI2*K!g%vVJ*wr4<b}ht>e!*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{0000<MNUMnLSTZ5KgX&7

diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png
index c150341e364f8a3a291a90e8f9c2767920775dbe..ccd59d5fa6e3b25756993299aac599a65e636685 100644
GIT binary patch
delta 765
zcmV<Z0s{T(466o^7YaED1^@s6boh93ks&940?kQ8K~#9!?3%%j!XOZar?m$)dNRI+
z2jkJF@lA|x;?sCE9z6K~UOZ~l7`40O?vN3ILbp)2mV{87SmxuO0m?K=(-eG`D2g5(
zeD@Q1?FT`qv;SIfkYcDvsX=Ox8l(oPK}so!>gISnhUs()qtQrSc%E91yMd>c%5u4X
zgxPEci^aljWnZt?(C_z!!T0-JRNpWhB93EG>E3R)gTY|%va%}`>GgVWyWNEGc#Vb=
zh%XopK_J*R8Vv!2wpqK@<#Kr#O~!IX_<f&>a5a9tM%=ds!9Su3{F=KKSH%YiR_u#F
zP!V0+&<;D%J&;D8TuT)vK7*Z<puTi}N*EO(<845Sg5o2M*Rt|_;&E~<syyHcLie!3
z7B@)^?pC^i(}L)NJp_nq8qSJMqaq}wtdQ?ur$Fa@5|}fH+^VYQ*VmUAads_}@nwM6
z^q1s?C<`Q)Yh^)&1j(B2GhNH(;l4mjzdy^hY=J_9sP<Xb>&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#<jQWkCqVE>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{<S3ODsN@GWpo&B*kqDoPEm@(W3>%1*XSQL?vFu&J;D8jzb>
zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq
zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6N<iC+Qqrt~T-=~`0eQAc86_nJR{Hwo
z<>h+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz
zEwNPsx)kDt+yc0<dBxCR0tT3VMPh-zp`HQAOE87LzW9~q=E7AMmjtCE+>6!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$<o9Wrq?AuximL5uLPzy1)<j&r(RG}$SnZc?2=lPS(cjOR+OKs0QRy~CT_P_;xrGc
zHwCv_9C7N^2RcR{6tPGV4HE*U9uO0rY=Inj!cWZuruHIWvVOnywk!h!(|u1D$B>F!
zZ)O|zy)qDJQ&(hFSRt@|fy0zJZL<~f4rOWxvWl`VSjfWY<Zw^AOkJwy?Two^PNwCa
zEb3sHcm99R+X|;C%QScB1d8mn`f=a?$rgE*h3D$B4?1=&R8(zXnZO|Az~rH-I`Qrt
zzvTw=&nFtq?BG5h{kp*X!?mEu_18B<=p<~7nz{DP?YClWhZEC2eExZ6Rkj45;PJw+
zm-ikPG+fO1vT>8Qs3Z^DhYA~`#~-D5)dj*0WSSf{<Zg|U6u6c4CTjcbx2YzQr$rxr
zkJUPK^~bkaZ}u5-)Cq<@xPE8r4lO;04N37VO<gM<wUyoIe8rym<mA?r!be6oJUL%^
zFKr1EG`h#KL`TE!QiZP8d38DM>x)h?&r=Ao54-h9ZN<U6UZw?J0-+mzGfeb7T)A;&
zXv-22(IVM5A}{v%Gi_!QjE*e*^W&GG^0jqKjrVa0O#U}%kw9ppNYPpwjrj_dmuuH$
z&-}APTj1{V{ZFHoIqY*x`K|M~bcvr~(q08KzlpnaJ6c6nCU1EC%OuLZYt5F_#uaZi
zc1*moz{+*wtKiQqGqhIUzWYAhb@9i7_FsRjUU>e0!8kXoI^d|-(UR4d{zR@`r?9GS
zwyd(+Z`tczH;$zgi%fia!&h!q&AK<cswFw(POgrV_~F~me>PsARBK0=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)SIXNZ<Ex?K;p}
zv&}jT1Ke-7w?2~&y0k4!(*({r7Ko~<plKQ~#(=f<Gsry8(TIpC1}Xw*4+P&p?6LrV
zGO6*(0T%$0g=Qe=2O#n0ZpnWJLWt2gTgiV8B1MrH8fHasts=y%2(41Y)1Hcm+%<B}
z5yEJ^p;?n7NYQvhLoz}`g@hHnYovgL>sidDca$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^`A<O5+F+C`=RXDEqDTl0u_AV>B1o(VZc@b27DZTA
z4WD}iZ7|x<Y{?Oe!DvH+JVJw+gk@YcTtNKinaxM<Dn&3!B;rOn=U=@VXyn(AT&M`&
zssUn<oc}U%vIR+UWOW0UH|j|*ZWj|ekZGEru4^(7KivB>;@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
zcmV<M0T2GB1fc|w7YZi`1^@s6YKoe1ks&C5!%0LzRCwC#Sj%q0Fc6$PiWER_;)WVT
zIhL>Bujy~_2?%lGKte@A;;q*zRht+{<rsXx(jH=2>&fiSW;Z}Pi%cDOZ8<W<;lq*j
z1o8y(Z`CXo3%t+g@O^t2SF061mdihTVfE14Y=+%#hq5fKfCz#B)9Dmp7@{bO%Rth9
zG*w1qr?hyUrvUg85Uv3!PA7;K*hrED>-8GP;}N}H599F|-ELRqK*<0qFIod4<N;yG
zMwVsRZnqc?hZv1U3e0A+K|GnL(CGZvfRGT%OxEY&fPTM^D2miGGr}P`@9X^6fwaKL
zOQ(ZEhWEFhKqe>eUt(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+<BuChLo5qDJs%RqGgpChNUKx#R1k^>f-?MbiNF4lnXAjI>CEg(GH^BvXM+LeE3
m@N{o3=_AW^#H;Ro2`~V<4SC2?3d=kI0000<MNUMnLSTY$9_x<)

delta 501
zcmV<R0Sf-11f~R#7YZ&21^@s6O@+(3ks&C5$Vo&&RCwC#m`iTLFc60SJc>jT!HOLs
z5oK9U!L8{vI08bfSP-ZJBz8SksoKPlAjjZEEX@MT8h`xrzyr|E;<^r;wjAklxUgh(
zARWlVRkK(u@G+mmb<HuZRx5lim;d(s@}c+H47=S9MNt@m@H`LG=@h>2BhT~OAcw<$
zK^o^~T8ra262KKexCfG7E?_OFk)|ou>ou}0Ll}k_kH-jtK;}R}0HrTl0b$|*(^TVh
zI$^urVmKUPG#W{m&1Qo*Nn~hL{wpAyF=;yM>v%*IMd<hY@-rzyA-V3W{8vF*P~@%G
zLoUMm*N-QXllE^Zt`3c+B7?yI>3$D?SExWrkUy$I$`J~i%D<~pMAxV)CUHz9BJ+bP
zBoX;>KA(Tj)GH!rbrqotNeQ~VC&EE0?1e(tzQLO2NE<zblps^SqMlVXwa>XGinP&3
z>Q=Kp!kILqitr{m!nicEq2YFfhAR@*Sk>GQ4S!zwYJ<?vvlZq0N=0}jkqkdzlvV!y
zp9eIzuCu;U5qql!hCx*RyOGmckV=kR#DGO+deSRD7b_q%2+=%Z3WSDxx}!W>+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
zcmV<T0to%B2Brp(7YZi`1^@s6YKoe1ks&C5$Vo&&RCwC#SnW;|K@>fA_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$43oyRjd52<AM5%7gEF4xj~*7=!qymd$NX;K{rjfh00$
zGP2<k%*v(04+wK5g|OU4@8pX-(1|dARl&l&=Q3%*#b(x^Nn$lNml@fxK@Bm404SeO
znm@ziC!1J%@8iM43K}~J>R&%&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#(5W<CAuoyt>UeBf>^jMsQIv<GxNhZ1Al<kAwZUqKy#I
zd4zULT+}&tKq1!6g^~UP$l64IJ3y{(BwcildoFKIcfwX8T_+5WtRW_7WG2^Kq{on3
ztF;ujn4B{%48>+p;_a`eCo?ij9l4qwi-<HiE79m#(hZB2%oMI+;f&c}=EjrHooVq?
zQq!j|&&FojI>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<a0s;M|2CW8=7YZ&21^@s6O@+(3ks&C5&q+i<RCwC#Sldn;F%UiDy^sK<BvRGO
zLscm}psEP9YSj-&|DgZT|0{n{K&?<;X`oz^K*D9aYfr}xmy}%y8?x#?#EO%ZY>&^L
zIcH=Cm`vk`2B1j=dMFNslC&w1;r98<yYevNPh530_##UC$~l7Benz{d*=*v?$_kW!
zQe%Tq7KpNs*JxOFH)a50b7KQ*U)Sztq_MPwcDoI&b#4%(1cY?YSFS6Mu3poE(20>}
zLZi_@5Cn+h_;w)ue&2QGe5J(#up9e<hhWA-s66<-=Kxv|i7|-(XxZHM1fI;h6G$S1
zCMO#%!K_>={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<JH(_Rgv`5z%?0~wPMx>#q|&(HgKyy#t7Smc6Q-9xn+xH*)65kEUM
zIT>*@YwHR)A$GgZaCoqdO2r@u2~ot@`|XJv>!QIEDAChRGh{N7*D-eX0Ejpv(%9W$
zY_7jYr@bX<I>Nzz9ly4h(K$SK&hbgROb&08W<=P?%LpzjW<1bIj}3lq&0>G=gJ>f}
zbRMDG5f}B&9Z-mM3t?pN0<t!L(GHNS8%ZC%qZ5}mr#oRQk**VlN7fJ{G%}WJF4JSk
zt<_qJTTIRwmxf|<QR3~dr$;j~P8}Iek3~e9oR#S2S<(%Qmdrg|!@?P}!Pt#QpF6YS
zXQXC8Uy+T?ed`Dp4CKNTg}5f4l<uXGk^pgq$(VvQV#>`3r-W4SiJfn0ImOfP*tnH-
z@~QccjFi_kC>Tgq{OKjUv_MiCv9~YVixR9oEG0>jI*z7*v|24W_E!r7VlVf0kDGVv
wviyfO1u_LP634Wll@<u)I5HHv?_U8103?6VzIxHCp#T5?07*qoM6N<$f}c=nPyhe`

diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed.9.png
index 8560b3ba70053c37e19ef7beb7d11e00ba082b6a..ac0bfd3c1e754d21c87d5e6f7e9ba1e93153dbe8 100644
GIT binary patch
delta 441
zcmV;q0Y?6Y1cC&R7YZi`1^@s6YKoe1ks&C5q)9|URCwC#n9GfXFbswb1Zag`I8y}m
z&<HoKbU`B=c(dbZJ<0|aJYY2JY9d+DNRyv0wi9dsWX60}z>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<E<XK#i>~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<<K
zLnGX{(glrh;LXa>dXx<;c);v1D<WCZNRyur+X;36WX5z<z>yL<%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<E<XK#I9Kii&SXLu)qBr*|lr9A|IP0Y>-!yOfp%gt9ZoW!u-n|
z*(?>$2Knvdr?w6uv*tW{pqaJ_LZ!cHW?gZlil^R&G&ezTfqAS;V^s0jLYOeD&``T+
zR#p;y4Z*OE_^PUOr-wa_bf<?9kH<r6q4p|BQ4|n{p-5P47#s*wmZg5tE8d~q7d1D?
neb4&&w~Dhb_g_EvOMn3Y7poB)q0SWN00000NkvXXu0mjfaLvxD

diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off.9.png
index 778abaf2491f0f97dadb4d71c3f50790c225f683..ea2f357895aa2c321234be50fe45c019bd8eb31e 100644
GIT binary patch
delta 639
zcmV-_0)YLz1+N8=7YZi`1^@s6YKoe1ks&C5QAtEWRCwC#n7gXNKoEu}F<uZ01qH3O
zvG4_~t!#W0pTw83)XG+{@g+nX1@G4!|ACcd&*tVPXyL$MBFW^Ne`n&XMDdtw8o-Jx
zkST{vUt&LyA4ue`>G%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<Q>|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-aNwuWJH9<adYs
z8O5;-jYfk3*6TIHG@DJ|cTyrtgW5u?wpuN2Q-Fx>iwvS>8P!Dli}wh?P_%M??If;9
zP)wa^L3HbGYVxw^;yGS7Bmv_0BkFibsmf})H0lzCQY5LRiPSY-1si9vhVGiMm7ZwV
zB&mp6e;;dKxg&KT?zhy4CBvvPezZoCF4k~e<Kd=%6$Hg|H25#K<a5)_lN6W2C?YmO
z!ZGBS8e+(fxS>EWJHW+|i<?bqc6xG53`)A>v>+IAWr#R7SYj|j>`)-P-H!J&n65DV
z!cDsds)!hXI2;Z<I{Jc)MkAgz#TyXH#07#_NOCfn@aH%Fhennz+h+!ef<2#Uso(tx
ZFaQQ6KzDQ{>I?t?002ovPDHLkV1j+@E*<~?

delta 652
zcmV;70(1SZ1-u227YZ&21^@s6O@+(3ks&C5UP(kjRCwC#n9Z)iP!Pul^$`&vAz{tN
z!V6ei*?1JMa9_a7*jn32Y%IKjup#mN*?a$!dzy3Wl-6l4l1?(A(oTQpKQlF_ME;nm
z8zACWAYG0SBn0_fkWQyV?RJ|C!=UT+%5It_`*U}Qut%d&cEsuRderT9@3(Ki->1ue
z<wE=Yp3dhpe+P_?0U#EO@#2!nBqb6FYPDK)I2^2V4EsgL<B>L-4WESXfbjza5b=1N
zQmGVWG8sO;3vxQ0_ypn4f=s7V8jVJ@TrR0tEK;M<pmMp)X@Vkly8*$C0RuIJB1n%H
zTdh_!9*?P1Dp93UVTFgoAvK##RtNEaAA(@@xVdm#<W-URd`^WzfpWPVAEPc%BeU6z
z(&@BvVK*S6L+tLwAid}|(K)CM{O%Mh>I5QM_Zf#8yWNh}#OhIN=)!zHZ=LfHM1FS2
zpI#hks8*{Cuvjb@rdF%neI^Bx8q^kAwO+4tn*v01pJx#JD!rO$fAJgv7>ZVZuARUY
zc@$G+N)T1vbxlr-DxTqVK@cGK{zMHYDebcArpBHkSBeCc8c$v0RIq*)tLv_DTj_yz
zO^}M%>+falD|e&{#C(?;iO4W^8DCl>K^LpLu5obPR|Sva847&MBl5BCD+ehqxlu%H
zgoI<r(KW=79dTWOV0M6uAr}{S>+JO8m>85)i&KJN$dw`d*kFml2(ev(tk-Ma&tSU3
z@C(=N8mJ;-0Ajn{^62;{eZQYy7TJ$<*=&{p<h`$si<U(!EOIay&}1@s%XerYNC*<X
m%=>&0)j#)t)TU+M0t^77=X0c~ds62B0000<MNUMnLSTZ9gEtTW

diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on.9.png
index 2a23945e503eec0a6cb07ab6880123bea34d3d96..6195ac0d4f52af9ae965d5a31e1ad9b88f1e3b84 100644
GIT binary patch
delta 894
zcmV-^1A+Xu2doE>7YZi`1^@s6YKoe1ks&C5PDw;TRCwC#n7eM&Koo}m@r=ER0}BKp
zx+pXhNC^muH-Lgr1PMCcffT$(cnCV`6ckAn9)L2DkmwK*f<%#6doR8W=S+51#%r%l
z>=j#J<;1&6eCC_~TxP~VJC|<iK(ytkDTjjvx&DJ>uNSW$E{-Cq^{f*Yzl4~sD^n4F
zTJukJ)$Hu-V0(KTN-3miYD}Al_1}Svy$b^+;80x%GObhW?d@TA_w8(ugM$MkNrJ&(
zfH;oLXNIW<Axs@Q4&TKX0tSFV97n=)J-Dumt*vKfjMC7IMk544fZ=dxJ~K=m5DOut
z1F6_Z1?fyc=o{T7qR4~4yh1Pv8IEaxkSK}_gtfXLtb!v2lq;DA=jUH=eDnc9c!F+s
z9rrh%qkH8JqFB%vBcs^NWaWVwhSji&aCoZvGlM9XB~eI5-_h&8$K$6Gw{EZE+t)LE
z`TP#P|AunpD&iy_D}_noPJ!_3d2nkCRi%h=$YF3aWXdBPWAlNFwRO+@t=m<9@Vp_;
zejH(?^9Tv~6QV*9TOoO?T=g>l>-!F_U6+#*rX0nMRf+yD1)b`8eZ)GmrE9G!H1w27
z)+A0K^gW!Ne!|jH3fB{qYZ|9NNgdq1s6w**<O)M$dq?(OEr~!vKoNx}=uuUizC;*&
z#Ik>au(w8zpP(O73JLaq(bTekEUkscD4q~-q%jDGIM+Afue?GOD3hF{VMJkx;VMar
zq*EbkCo~)#o*^Y_N|w+-ag<O$>O+isjC2%rYYLB+6Gi5ftURDLA!2TxwQcnbq7;9o
z{E)>y3qkT~)NS$Ea!$-bW1F300F_jw{tA=zGNGBN79}vRH5{_CMO2l4^@Mz=8i9<T
zpB3uT@@-R*d|RjmQkJky6{+&4>d4qONbRlSycEgj-`vZ$Do4u7S1(GAh%8KA#($b4
z^G?=!Ra0V3UlmmOQ-!P7*hKbw(^n1|zo?@KFHl*Nv?FhNv5%~oMX(MCAAs2G?wudL
zY@V1?UdAV%Ad4nf2;zBZ-X9Q6`-lbUbUMa&Es$QXXU;QxxZ<M(ThppxRjdz&2*c1E
zRc3<h@9$${V`I_*lY$-hWkJ{%PxA2a(A*dC9UARr3uY_K=5u}*jhTOYg5LrR07xM+
UR;~fqvH$=807*qoM6N<$f`h`M0RR91

delta 904
zcmV;319$wa2et>07YZ&21^@s6O@+(3ks&C5SV=@dRCwC#n7wY(P!z}i_rp$`f`KB$
zR+WW;p&%sQ00zoXB-nTdI`9HKKzRr@<_;{~kh(Ia5>hurg&<WWV&}sjmve4&BR7p>
zQzvSXV&%k+TA%y7|MPKu4b0{+bsdOVIjYOC04a!!1-UeP_4Y9&uE?S15^VY!1wE&K
zxsAUu{3)-R?d@%BZEZnojV#No8GEz&H;|!sVW9-1kaU*hC&TXUE_QZ4Ob6N9+e4bB
z==FL?lEhv!Of?7^l!7fKpT!UY7JxydRPa3?p66k6^MxIwFf@a~0AU!S-|yRNhN%ML
zAe53&nvGOYas)!Z=&TUOKAOub1f!9E<2Vlz$FYTQRuzO*kV-&%ifM3ia)^W0XN1ua
zf?ypFH(nyRb`NnPXpDhXY-+OdzzoA`I7K)-WnF+lw8xTYq=TR6bU)$gbA>y1SMlTf
zF%G|dM6>yha^yOaG#M&|QR1Eh;o0-x&KRmp5$lk{APrQ;BOGAkk%zT)-~KIs2sC`Z
zkK<o0tTdh=C4WMcDB>z)+)7uy-2XP45;tzDQ3+Fy;?}A{_m76jOtn7ZoVn6<Ru&q%
z%O-1@q!8u-j@w_cw3NZ~1?8GS`!}hB`=?b%Ha@wDp>e$<e=e6qASIxf!V`9=D%!6R
zg<r7TJVMl2BgfCsjVOf#`#)`eYI&BKg~lqL5^!wLi~2Y*x6xdAgE-VSIS2ii!jiz#
ziWJGtg=jXR;pp%TDN!@Blm<%Tl=@K@V%TGp)YPphJVuQanNzazfX0T1xp~&E)ia3J
zd`<bGCi|QSGOk9|7N0NY)Gjox*+~nil`ix*F<CDXnyG400`pqKAuC#cM0HV57!Oq~
zkm3E)LS0zCvs7ffEmQ(2O4z!Jl=;(DWSlif<wwPNDKegab1&br94RVab5(Lg<YC5T
zywn_-cd}NingXl)s-VoDp167qP2_*q-Pq>*qKYECK;=!*6M5Z(edNt9f>l6x1H|T@
z-udQ>=84_q<$UrEa?<2;CW83Be+Hs%A8{a!M#K891k&kr?0$wfSG<*At6Md!iu1t`
zQ54y&%9-#D&+kWMBwY{$79hX(tz)ia*%wc8e}5mXR_jW>LtB6>Ko;*=|9_B~zvQp_
err8~T1sDJ?wSr{R=ZyLQ0000<MNUMnLSTX_@V6!a

diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_normal.9.png
index 6af2d8d0c2ee2ef405fa05dc3757b2541165fd7b..50cd06ae3685154ecdf450fe3055e3bc4adf5035 100644
GIT binary patch
delta 305
zcmV-10nYyB0^<UZ7YZi`1^@s6YKoe1ks&C51xZ9fRCwC#nB574Fc5^tDA<L?Scvb|
zBv^|D_-rfUZ|)+T9QhGJH|}v+@I}Jr%Z!msfO|?_Z4lkn=qg752_U}<QWOR9JVzYI
zBr{4W(KHR}x<1~%RaIe{Camj90wRP!nx-hr65}}T?-PAs-}e}Xfz*e2o(;tfkY!na
zHZ`K%wfn76bLeG&C<tm0o9&5fFjcAEw*Gt-VFTil?tiWM&{C>mEAQ607U{HxvRHhq
zrxo!9qR+wC8Xr4`l{Eq642a|c5`Du2Yq)?2FsT4?3dHxJ$eHxiLm4?$Z#`rgAZ^<s
z%Q7-m6iC-~TfROF;g8)**jD~N!As&C|A-M0UIGjNOzaskvYPO+00000NkvXXu0mjf
DbB~DL

delta 308
zcmV-40n7g50_Fmc7YZ&21^@s6O@+(3ks&C52uVaiRCwC#nB574Fc5?%D%gd^Scvb|
zBv^|D_-rfUZ;l9e9ElM{H|%k{;EROa&lw|5fM-hIZJ?fNbeAInlM)aCxx8zNqClSK
zh~t=Kpw=2q)1a>FW00z<FijKIb)~T&ijbx$%Cf{bj-UI9y|C|l48uTb!#vN9;tt4v
zvMie#N+~jH%nZ965CcICvS)kZTTE4^_g;U#im(CkN%z0jylE*_*{k5z_#V=04P~)-
zSx+kx3dEkl*P0MJhLtq}at1_m0a4#DVhtA%NqWBp68fjeoAk^@897aFJ7hT^ZQCNt
zGBQ;RNY`~+zCH}$Y>p)aL_jPK`LePf1@R?q9eVCdfB^uxR}w%$HfH|-0000<MNUMn
GLSTYVh=w2l

diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_pressed.9.png
index fdaf69966a8e87e7781ce70303605907e4c549b7..7ce52f0f585605e632f2e9810677c62098b77419 100644
GIT binary patch
delta 477
zcmV<30V4jA1dard7YZi`1^@s6YKoe1ks&C5ut`KgRCwC#m{HDxFbu~#7@md$a2anx
zybcdu#4C6V-T)CkI=-1YH!QA19$eBaCgZ=~x_0XXkZEJAfRYl5<w#&B?FaG$S)Dbf
z(+Q5pBWSIk^K<+xv6NCzzlULfs;ZzY%Vm)3^=dxGiK#`ccG9DkBnjks4o%ZM#%T9{
zqx=1CsBv=JOMxH&wlqy4%d%w<oV@S*2Y`i%1wjbZvQTdGf>;1akDvy^SRfV%ZjTfU
zjSZ{A@(A4$>Ya~o!+%duZQr829&v*;2E>=ftgUg$C1S*WzuF_NH)3OiW=lv<bG#wp
z71uMYV6|}~oi+44VQ0-&9tr7aU->zIj)P+{Aj+7Uiosb6OwS0`@x|h{X14iWoeecv
z>AO`5uS#D!a4Qg2jBFLG?=*r(ymb1~!|ki-`%Wv_!7K0K5k+C#GC+E3LPz{=o)cfm
z8n#Cy?v;=h`y6p^OJ98%bNhz$bg1<ARaUWY8fvV&h7P3Fw-gA=BXwPy2Ugceb>a^!
z><@>7vD@vo401l7p(qMgdAFu|w><(~E*EIqc9;L5f%2_%qTdv3n)4-f{sb5Ra5s2i
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;y9<hTp1jLobtf{fdC1S*Uzt|(TH$r2CW{XcxbG#wp
z727kcU^Q_foi%hlVQ0-+9`WgDSNYk0_nl=SAZjr6C<aF@7<xvq_AeGTHKUFD>S(CR
zO5e3ocv1S&7uNz|#mHL0`cA{U#7n0yUEIE!zVEc64V>~Ok0=UbmjTjK<6Gi4bDa1}
z*04Pyv9I{F*z1VBTe|AYkloj(r+uZrtFj6`(@<mWHS|SVeM^C`JaWI^hXYnjRaN2#
zEbNcR<6w1N&x2ep7f92TRo*SB-c64{*XtF^vfShy+77aV?Dwqy|5ow!l=a8s{s=Gt
XR10=%F1yEP00000NkvXXu0mjfQiSKQ

diff --git a/java/res/layout/input_gingerbread.xml b/java/res/layout/input_gingerbread.xml
index 8f59cae216..73cf0a3fac 100644
--- a/java/res/layout/input_gingerbread.xml
+++ b/java/res/layout/input_gingerbread.xml
@@ -25,6 +25,7 @@
         android:layout_alignParentBottom="true"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:paddingBottom="@dimen/keyboard_bottom_padding"
         android:background="@drawable/keyboard_dark_background"
         android:textStyle="bold"
 
diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
index 1396bff9bc..043f4b3632 100644
--- a/java/res/values-land/dimens.xml
+++ b/java/res/values-land/dimens.xml
@@ -19,13 +19,17 @@
 -->
 
 <resources>
-    <dimen name="key_height">47dip</dimen>
+    <!-- key_height + key_bottom_gap = popup_key_height -->
+    <dimen name="key_height">0.250in</dimen>
+    <dimen name="key_bottom_gap">0.020in</dimen>
+    <dimen name="popup_key_height">0.270in</dimen>
+    <dimen name="keyboard_bottom_padding">0.0in</dimen>
     <dimen name="candidate_strip_height">38dip</dimen>
     <dimen name="candidate_strip_fading_edge_length">63dip</dimen>
     <dimen name="spacebar_vertical_correction">2dip</dimen>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
-    <!-- key_height x 1.7 -->
-    <dimen name="mini_keyboard_slide_allowance">79.9dip</dimen>
-    <!-- -key_height x 1.0 -->
-    <dimen name="mini_keyboard_vertical_correction">-47dip</dimen>
+    <!-- popup_key_height x 1.7 -->
+    <dimen name="mini_keyboard_slide_allowance">0.459in</dimen>
+    <!-- popup_key_height x 1.0 -->
+    <dimen name="mini_keyboard_vertical_correction">-0.270in</dimen>
 </resources>
diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml
index 5674ef6286..d2cd6c7d15 100644
--- a/java/res/values-xlarge/dimens.xml
+++ b/java/res/values-xlarge/dimens.xml
@@ -19,18 +19,26 @@
 -->
 
 <resources>
-    <dimen name="key_height">72dip</dimen>
-    <dimen name="candidate_strip_height">46dip</dimen>
-    <dimen name="spacebar_vertical_correction">0dip</dimen>
-    <dimen name="key_text_size">28sp</dimen>
-    <dimen name="key_label_text_size">16sp</dimen>
-    <dimen name="key_preview_height">40dip</dimen>
+    <!-- key_height + key_bottom_gap = popup_key_height -->
+    <dimen name="key_height">0.450in</dimen>
+    <dimen name="key_bottom_gap">0.0in</dimen>
+    <dimen name="popup_key_height">0.450in</dimen>
+    <dimen name="keyboard_bottom_padding">0.10in</dimen>
+    <!-- key_height x 1.6 -->
+    <dimen name="key_preview_height">0.720in</dimen>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
-    <!-- key_height x 1.7 -->
-    <dimen name="mini_keyboard_slide_allowance">122.4dip</dimen>
-    <!-- -key_height x 1.0 -->
-    <dimen name="mini_keyboard_vertical_correction">-72dip</dimen>
+    <!-- popup_key_height x 1.7 -->
+    <dimen name="mini_keyboard_slide_allowance">0.765in</dimen>
+    <!-- popup_key_height x 1.0 -->
+    <dimen name="mini_keyboard_vertical_correction">-0.450in</dimen>
+
+    <dimen name="key_text_size">0.175in</dimen>
+    <dimen name="key_label_text_size">0.100in</dimen>
+    <dimen name="key_preview_text_size_large">0.245in</dimen>
     <!-- We use "inch", not "dip" because this value tries dealing with physical distance related
          to user's finger. -->
     <dimen name="keyboard_vertical_correction">0.0in</dimen>
+
+    <dimen name="candidate_strip_height">46dip</dimen>
+    <dimen name="spacebar_vertical_correction">0dip</dimen>
 </resources>
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 1378be72cd..2fa47ae529 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -19,26 +19,35 @@
 -->
 
 <resources>
-    <dimen name="key_height">54dip</dimen>
-    <dimen name="bubble_pointer_offset">22dip</dimen>
+    <!-- key_height + key_bottom_gap = popup_key_height -->
+    <dimen name="key_height">0.290in</dimen>
+    <dimen name="key_bottom_gap">0.035in</dimen>
+    <dimen name="popup_key_height">0.325in</dimen>
+    <dimen name="keyboard_bottom_padding">0.06in</dimen>
+    <!-- key_height x 1.6 -->
+    <dimen name="key_preview_height">0.464in</dimen>
+    <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
+    <!-- popup_key_height x 1.7 -->
+    <dimen name="mini_keyboard_slide_allowance">0.553in</dimen>
+    <!-- popup_key_height x 1.0 -->
+    <dimen name="mini_keyboard_vertical_correction">-0.325in</dimen>
+
+    <dimen name="key_text_size">0.13in</dimen>
+    <dimen name="key_label_text_size">0.083in</dimen>
+    <dimen name="key_preview_text_size_large">0.236in</dimen>
+    <dimen name="key_preview_offset">0.000in</dimen>
+    <!-- We use "inch", not "dip" because this value tries dealing with physical distance related
+         to user's finger. -->
+    <dimen name="keyboard_vertical_correction">-0.05in</dimen>
+
     <dimen name="candidate_strip_height">42dip</dimen>
     <dimen name="candidate_strip_fading_edge_length">63dip</dimen>
     <dimen name="spacebar_vertical_correction">4dip</dimen>
     <!-- If the screen height in landscape is larger than the below value, then the keyboard
          will not go into extract (fullscreen) mode. -->
     <dimen name="max_height_for_fullscreen">2.5in</dimen>
-    <dimen name="key_text_size">22sp</dimen>
-    <dimen name="key_label_text_size">14sp</dimen>
-    <dimen name="key_preview_offset">0dip</dimen>
-    <dimen name="key_preview_height">80dip</dimen>
-    <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
-    <!-- key_height x 1.7 -->
-    <dimen name="mini_keyboard_slide_allowance">91.8dip</dimen>
-    <!-- -key_height x 1.0 -->
-    <dimen name="mini_keyboard_vertical_correction">-54dip</dimen>
+    <dimen name="bubble_pointer_offset">22dip</dimen>
+
     <dimen name="key_hysteresis_distance">0.05in</dimen>
-    <!-- We use "inch", not "dip" because this value tries dealing with physical distance related
-         to user's finger. -->
-    <dimen name="keyboard_vertical_correction">-0.06in</dimen>
     <dimen name="candidate_min_touchable_width">0.3in</dimen>
 </resources>
diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml
index c66290c624..66771c2875 100644
--- a/java/res/xml-da/kbd_qwerty.xml
+++ b/java/res/xml-da/kbd_qwerty.xml
@@ -28,10 +28,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml
index 7f6ffaa2e5..d89204ae64 100644
--- a/java/res/xml-da/kbd_qwerty_black.xml
+++ b/java/res/xml-da/kbd_qwerty_black.xml
@@ -28,10 +28,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml
index 5d40d39b73..30d8de0cff 100644
--- a/java/res/xml-de/kbd_qwerty.xml
+++ b/java/res/xml-de/kbd_qwerty.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml
index 9842dd51d2..f394c8d02f 100644
--- a/java/res/xml-de/kbd_qwerty_black.xml
+++ b/java/res/xml-de/kbd_qwerty_black.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml
index 9b82e824d3..9a4a8796ba 100644
--- a/java/res/xml-fr/kbd_qwerty.xml
+++ b/java/res/xml-fr/kbd_qwerty.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="a"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml
index c3f122fa77..be2befbe8f 100644
--- a/java/res/xml-fr/kbd_qwerty_black.xml
+++ b/java/res/xml-fr/kbd_qwerty_black.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="a"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
index 8ae7187a2b..7f66eef569 100644
--- a/java/res/xml-iw/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="ק"
             latin:horizontalGap="5%p"
diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml
index 1435e1e13b..80ade2020a 100644
--- a/java/res/xml-iw/kbd_qwerty_black.xml
+++ b/java/res/xml-iw/kbd_qwerty_black.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="ק"
             latin:horizontalGap="5%p"
diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml
index 0efe2a1775..96a86b0130 100644
--- a/java/res/xml-nb/kbd_qwerty.xml
+++ b/java/res/xml-nb/kbd_qwerty.xml
@@ -28,10 +28,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml
index c7bbf943eb..4adeb48016 100644
--- a/java/res/xml-nb/kbd_qwerty_black.xml
+++ b/java/res/xml-nb/kbd_qwerty_black.xml
@@ -28,10 +28,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml
index e409828551..57114a8ea6 100644
--- a/java/res/xml-ru/kbd_qwerty.xml
+++ b/java/res/xml-ru/kbd_qwerty.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="й"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml
index 784f7457fd..8f2f599c3e 100644
--- a/java/res/xml-ru/kbd_qwerty_black.xml
+++ b/java/res/xml-ru/kbd_qwerty_black.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="й"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml
index 703c188ccb..1a657055a6 100644
--- a/java/res/xml-sr/kbd_qwerty.xml
+++ b/java/res/xml-sr/kbd_qwerty.xml
@@ -23,10 +23,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="Ñ™"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml
index fe80ef6763..e4b09c7170 100644
--- a/java/res/xml-sr/kbd_qwerty_black.xml
+++ b/java/res/xml-sr/kbd_qwerty_black.xml
@@ -23,10 +23,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="Ñ™"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml
index 24a2e06579..8819159e85 100644
--- a/java/res/xml-sv/kbd_qwerty.xml
+++ b/java/res/xml-sv/kbd_qwerty.xml
@@ -30,10 +30,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml
index ec83dec2a4..2532fca8cf 100644
--- a/java/res/xml-sv/kbd_qwerty_black.xml
+++ b/java/res/xml-sv/kbd_qwerty_black.xml
@@ -30,10 +30,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml
index 740e7f5f2e..b725034145 100644
--- a/java/res/xml-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-xlarge/kbd_qwerty.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="7.5%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <!-- This row is intentionally not marked as a top row -->
diff --git a/java/res/xml-xlarge/popup_smileys.xml b/java/res/xml-xlarge/popup_smileys.xml
index cf30a2461f..2cfcf741dd 100644
--- a/java/res/xml-xlarge/popup_smileys.xml
+++ b/java/res/xml-xlarge/popup_smileys.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="7.5%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/key_height"
+    latin:keyHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top"
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index dc88e2b24e..17e7ba20b2 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <Row
diff --git a/java/res/xml/kbd_phone_black.xml b/java/res/xml/kbd_phone_black.xml
index 52479459c8..6ade277d93 100644
--- a/java/res/xml/kbd_phone_black.xml
+++ b/java/res/xml/kbd_phone_black.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <Row
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
index 1400d36708..5062d4707f 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_symbols.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <Row
diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml
index 8b683cc6cf..2a6932a9ee 100644
--- a/java/res/xml/kbd_phone_symbols_black.xml
+++ b/java/res/xml/kbd_phone_symbols_black.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <Row
diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml/kbd_popup_narrow_template.xml
index ed3b130031..23c686e8bc 100644
--- a/java/res/xml/kbd_popup_narrow_template.xml
+++ b/java/res/xml/kbd_popup_narrow_template.xml
@@ -22,6 +22,6 @@
     android:keyWidth="9.45%p"
     android:horizontalGap="0px"
     android:verticalGap="0px"
-    android:keyHeight="@dimen/key_height"
+    android:keyHeight="@dimen/popup_key_height"
     >
 </Keyboard>
diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml
index cbb705835b..f1aa86f392 100644
--- a/java/res/xml/kbd_popup_template.xml
+++ b/java/res/xml/kbd_popup_template.xml
@@ -22,6 +22,6 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/key_height"
+    latin:keyHeight="@dimen/popup_key_height"
     >
 </Keyboard>
diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml
index c14c7fa0c6..21a7ccb781 100644
--- a/java/res/xml/kbd_qwerty.xml
+++ b/java/res/xml/kbd_qwerty.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml
index e1aa4f3235..adb10dcfb5 100644
--- a/java/res/xml/kbd_qwerty_black.xml
+++ b/java/res/xml/kbd_qwerty_black.xml
@@ -22,10 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
-    <Row>
+    <Row
+        latin:rowEdgeFlags="top"
+    >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/keyboard_hint_1"
diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
index 4cdc53947c..4ce9a867b5 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <Row
diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml
index cb695f5341..dedd2da08e 100644
--- a/java/res/xml/kbd_symbols_black.xml
+++ b/java/res/xml/kbd_symbols_black.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <Row
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index e346384aaf..52afa38e33 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <Row
diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml
index a157492122..c1bd4e395a 100644
--- a/java/res/xml/kbd_symbols_shift_black.xml
+++ b/java/res/xml/kbd_symbols_shift_black.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
-    latin:verticalGap="0px"
+    latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
     <Row
diff --git a/java/res/xml/popup_comma.xml b/java/res/xml/popup_comma.xml
index 4e88f26c44..cef836acde 100644
--- a/java/res/xml/popup_comma.xml
+++ b/java/res/xml/popup_comma.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/key_height"
+    latin:keyHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml/popup_domains.xml b/java/res/xml/popup_domains.xml
index c110ef6c26..5f92e2f746 100644
--- a/java/res/xml/popup_domains.xml
+++ b/java/res/xml/popup_domains.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="15%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/key_height"
+    latin:keyHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml/popup_mic.xml b/java/res/xml/popup_mic.xml
index f5ef6eeb00..99c97ce39d 100644
--- a/java/res/xml/popup_mic.xml
+++ b/java/res/xml/popup_mic.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/key_height"
+    latin:keyHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml/popup_punctuation.xml b/java/res/xml/popup_punctuation.xml
index ecbf09f721..76572b06a1 100644
--- a/java/res/xml/popup_punctuation.xml
+++ b/java/res/xml/popup_punctuation.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/key_height"
+    latin:keyHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top"
diff --git a/java/res/xml/popup_smileys.xml b/java/res/xml/popup_smileys.xml
index 33006f6ec2..2f082318ad 100644
--- a/java/res/xml/popup_smileys.xml
+++ b/java/res/xml/popup_smileys.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="15%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/key_height"
+    latin:keyHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top"
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
index e10346570e..246df5fc4e 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
@@ -86,6 +86,10 @@ public class LatinKeyboard extends BaseKeyboard {
     // TODO: generalize for any keyboardId
     private boolean mIsBlackSym;
 
+    // TODO: remove this attribute when either Keyboard.mDefaultVerticalGap or Key.parent becomes
+    // non-private.
+    private final int mVerticalGap;
+
     private static final int SHIFT_OFF = 0;
     private static final int SHIFT_ON = 1;
     private static final int SHIFT_LOCKED = 2;
@@ -133,6 +137,8 @@ public class LatinKeyboard extends BaseKeyboard {
         mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty
                 || xmlLayoutResId == R.xml.kbd_qwerty_black;
         mSpaceKeyIndex = indexOf(LatinIME.KEYCODE_SPACE);
+        // TODO remove this initialization after cleanup
+        mVerticalGap = super.getVerticalGap();
     }
 
     @Override
@@ -168,31 +174,30 @@ public class LatinKeyboard extends BaseKeyboard {
     }
 
     public void setImeOptions(Resources res, int mode, int options) {
-        if (mEnterKey != null) {
-            switch (options & (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {
-                case EditorInfo.IME_ACTION_GO:
-                    resetKeyAttributes(mEnterKey, res.getText(R.string.label_go_key));
-                    break;
-                case EditorInfo.IME_ACTION_NEXT:
-                    resetKeyAttributes(mEnterKey, res.getText(R.string.label_next_key));
-                    break;
-                case EditorInfo.IME_ACTION_DONE:
-                    resetKeyAttributes(mEnterKey, res.getText(R.string.label_done_key));
-                    break;
-                case EditorInfo.IME_ACTION_SEARCH:
-                    resetKeyAttributes(mEnterKey, null);
-                    mEnterKey.iconPreview = res.getDrawable(
-                            R.drawable.sym_keyboard_feedback_search);
-                    mEnterKey.icon = res.getDrawable(mIsBlackSym ?
-                            R.drawable.sym_bkeyboard_search : R.drawable.sym_keyboard_search);
-                    break;
-                case EditorInfo.IME_ACTION_SEND:
-                    resetKeyAttributes(mEnterKey, res.getText(R.string.label_send_key));
-                    break;
-            }
-            // Set the initial size of the preview icon
-            setDefaultBounds(mEnterKey.iconPreview);
+        if (mEnterKey == null)
+            return;
+        switch (options & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {
+        case EditorInfo.IME_ACTION_GO:
+            resetKeyAttributes(mEnterKey, res.getText(R.string.label_go_key));
+            break;
+        case EditorInfo.IME_ACTION_NEXT:
+            resetKeyAttributes(mEnterKey, res.getText(R.string.label_next_key));
+            break;
+        case EditorInfo.IME_ACTION_DONE:
+            resetKeyAttributes(mEnterKey, res.getText(R.string.label_done_key));
+            break;
+        case EditorInfo.IME_ACTION_SEARCH:
+            resetKeyAttributes(mEnterKey, null);
+            mEnterKey.iconPreview = res.getDrawable(R.drawable.sym_keyboard_feedback_search);
+            mEnterKey.icon = res.getDrawable(mIsBlackSym ? R.drawable.sym_bkeyboard_search
+                    : R.drawable.sym_keyboard_search);
+            break;
+        case EditorInfo.IME_ACTION_SEND:
+            resetKeyAttributes(mEnterKey, res.getText(R.string.label_send_key));
+            break;
         }
+        // Set the initial size of the preview icon
+        setDefaultBounds(mEnterKey.iconPreview);
     }
 
     public void enableShiftLock() {
@@ -663,6 +668,7 @@ public class LatinKeyboard extends BaseKeyboard {
         return textSize;
     }
 
+    // TODO LatinKey could be static class
     class LatinKey extends BaseKeyboard.Key {
 
         // functional normal state (with properties)
@@ -711,6 +717,8 @@ public class LatinKeyboard extends BaseKeyboard {
          */
         @Override
         public boolean isInside(int x, int y) {
+            // TODO This should be done by parent.isInside(this, x, y)
+            // if Key.parent were protected.
             boolean result = LatinKeyboard.this.isInside(this, x, y);
             return result;
         }
@@ -730,6 +738,15 @@ public class LatinKeyboard extends BaseKeyboard {
             }
             return super.getCurrentDrawableState();
         }
+
+        @Override
+        public int squaredDistanceFrom(int x, int y) {
+            // We should count vertical gap between rows to calculate the center of this Key.
+            final int verticalGap = LatinKeyboard.this.mVerticalGap;
+            final int xDist = this.x + width / 2 - x;
+            final int yDist = this.y + (height + verticalGap) / 2 - y;
+            return xDist * xDist + yDist * yDist;
+        }
     }
 
     /**
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index 83b7619044..660fe0ed0b 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -47,6 +47,7 @@ import android.widget.PopupWindow;
 import android.widget.TextView;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.WeakHashMap;
@@ -158,6 +159,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
     // Miscellaneous constants
     /* package */ static final int NOT_A_KEY = -1;
     private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable };
+    private static final int NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL = -1;
 
     // XML attribute
     private int mKeyTextSize;
@@ -178,6 +180,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
     // Main keyboard
     private BaseKeyboard mKeyboard;
     private Key[] mKeys;
+    // TODO this attribute should be gotten from Keyboard.
+    private int mKeyboardVerticalGap;
 
     // Key preview popup
     private TextView mPreviewText;
@@ -240,6 +244,11 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
     private final Paint mPaint;
     private final Rect mPadding;
     private final Rect mClipRegion = new Rect(0, 0, 0, 0);
+    // This map caches key label text height in pixel as value and key label text size as map key.
+    private final HashMap<Integer, Integer> mTextHeightCache = new HashMap<Integer, Integer>();
+    // 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();
 
@@ -468,7 +477,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 {
@@ -579,6 +588,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(keyboard, mKeys, mKeyHysteresisDistance);
         }
@@ -723,7 +733,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));
@@ -775,13 +785,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;
@@ -797,8 +808,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);
@@ -818,22 +828,34 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
                 }
 
                 // 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);
             }
@@ -843,16 +865,22 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
             if (icon == null && key.hintIcon != null && drawHintIcon)
                 icon = key.hintIcon;
             if (icon != null) {
-                // Hack for key hint icon displaying at the top right corner of the key.
-                final int drawableWidth = icon == key.hintIcon
-                        ? key.width : icon.getIntrinsicWidth();
-                final int drawableHeight = icon == key.hintIcon
-                        ? key.height : 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;
+                // Special handing for the upper-right number hint icons
+                final int drawableWidth;
+                final int drawableHeight;
+                final int drawableX;
+                final int drawableY;
+                if (icon == key.hintIcon) {
+                    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;
+                    drawableY = (key.height + padding.top - padding.bottom - drawableHeight) / 2;
+                }
                 canvas.translate(drawableX, drawableY);
                 icon.setBounds(0, 0, drawableWidth, drawableHeight);
                 icon.draw(canvas);
@@ -1020,6 +1048,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();
-- 
GitLab