From 66e306d01c6820d4f4d8b2209438ec086b48ac51 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Sat, 2 Oct 2010 15:17:27 +0900 Subject: [PATCH] Add keyHintIcon attribute to BaseKeyboard.Key class This keyHintIcon attribute is used to specify hint icon drawable at top right corner of Key. Change-Id: Icaa91e63c4473b2513396bd3fbeb8ed6fd73586c --- java/res/drawable-mdpi/keyboard_hint_at.9.png | Bin 0 -> 1180 bytes .../drawable-mdpi/keyboard_hint_colon.9.png | Bin 0 -> 1082 bytes .../keyboard_hint_doublecross.9.png | Bin 0 -> 1157 bytes .../keyboard_hint_exclamation.9.png | Bin 0 -> 1095 bytes .../drawable-mdpi/keyboard_hint_greater.9.png | Bin 0 -> 1133 bytes .../drawable-mdpi/keyboard_hint_plus.9.png | Bin 0 -> 1116 bytes .../keyboard_hint_question.9.png | Bin 0 -> 1140 bytes .../drawable-mdpi/keyboard_hint_quote.9.png | Bin 0 -> 1077 bytes .../drawable-mdpi/keyboard_hint_smaller.9.png | Bin 0 -> 1130 bytes .../drawable-mdpi/keyboard_hint_star.9.png | Bin 0 -> 1136 bytes java/res/values/attrs.xml | 4 + java/res/values/strings.xml | 2 + java/res/xml-da/kbd_qwerty.xml | 10 +++ java/res/xml-da/kbd_qwerty_black.xml | 10 +++ java/res/xml-de/kbd_qwerty.xml | 10 +++ java/res/xml-de/kbd_qwerty_black.xml | 10 +++ java/res/xml-fr/kbd_qwerty.xml | 10 +++ java/res/xml-fr/kbd_qwerty_black.xml | 10 +++ java/res/xml-nb/kbd_qwerty.xml | 10 +++ java/res/xml-nb/kbd_qwerty_black.xml | 10 +++ java/res/xml-ru/kbd_qwerty.xml | 10 +++ java/res/xml-ru/kbd_qwerty_black.xml | 10 +++ java/res/xml-sr/kbd_qwerty.xml | 10 +++ java/res/xml-sr/kbd_qwerty_black.xml | 10 +++ java/res/xml-sv/kbd_qwerty.xml | 10 +++ java/res/xml-sv/kbd_qwerty_black.xml | 10 +++ java/res/xml-xlarge/kbd_qwerty.xml | 31 ++++++++ java/res/xml-xlarge/kbd_symbols.xml | 5 +- java/res/xml-xlarge/kbd_symbols_shift.xml | 5 +- java/res/xml/kbd_qwerty.xml | 10 +++ java/res/xml/kbd_qwerty_black.xml | 10 +++ .../inputmethod/latin/BaseKeyboard.java | 60 +++++++------- .../inputmethod/latin/LatinKeyboard.java | 74 +++--------------- .../latin/LatinKeyboardBaseView.java | 62 ++++++++------- .../inputmethod/latin/LatinKeyboardView.java | 4 +- .../inputmethod/latin/PointerTracker.java | 37 +++++++-- 36 files changed, 308 insertions(+), 136 deletions(-) create mode 100644 java/res/drawable-mdpi/keyboard_hint_at.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_colon.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_doublecross.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_exclamation.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_greater.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_plus.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_question.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_quote.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_smaller.9.png create mode 100644 java/res/drawable-mdpi/keyboard_hint_star.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_at.9.png b/java/res/drawable-mdpi/keyboard_hint_at.9.png new file mode 100644 index 0000000000000000000000000000000000000000..69baedef41cc26b8c719e3ec1b05cf76e8729bb1 GIT binary patch literal 1180 zcmeAS@N?(olHy`uVBq!ia0vp^ia@N(!3HE1)R;tolw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#24v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gtf;oFf&jvGt@IQ zHZeCh*HJJsFf`CNFw!?P(ls=ndS0-B(gnVDi`>E_~MYT)GJZ0uxaXz1eR=wxJW>1N<&Xy|I{ zYG7#y)9aF-T$-DjR|3v4~Pj*wm=R%;iu*SQ+p9GS%00qs+@s=QNYv1F{I+w zo9P?*nhXTmRwiBw4WB!AW@%|#sQjUu(?4j|aD>mDIk$AG==ERb|I`u`viQ0T%TLY^ za@yIS{W7+9tJ#DZhHUFMWSj|q+*McIctNJ&i}Dcx-x*FCElyV=UmQHnGt0?bqt$Pp z^2Ro|lDf8}jEAgE(M3$LFKiNB$}a3F?QrtzkoYCKrIl^Z{dTo|%MM#gf3ixpe{kzW ztz*o~JHE%;-cGuB(#z9l)+z3r8%$(hxW}+p*X`YGSW;7Y&g@^em4uZ?rFPouYeyCq z`COj3LM!T?%bLAai&kA)wR&IFT|;}_pC*l(Elz(-S}JqmHU&@l!E#NtVI5~{00$U# n>~G+h-|8C9ux{Q?ZUctR-vd7ITFgEKDla@;{an^LB{Ts5nJ|}% literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/keyboard_hint_colon.9.png b/java/res/drawable-mdpi/keyboard_hint_colon.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9d0d7cbab57dc6804aba90f75f4a174db0991ab0 GIT binary patch literal 1082 zcmaJ=O-K|`93L}G1wo=Lh2S|>RJ1!YJFd%&t{=Ozo2!k;y68#-jx%p{()n=a>5gJ# z5}^oD9qQ8eMd)DAp`eI5L{U>ZQV)znNf{n^1#1W* zmsAr;loXHivY~k;7vps_6SE1Trp_@Xxep@H4SQ5QNPd6(lmx00Bs=^fEt+B2t2T~U zux+FzA&>OQoI=*sf*Oa%0vbdTaI}8i=A9t9rpx2AdrgsG4TAcD3BVA8HGdE>* zd!tOaV3Z@76yv4clrlh3{6AFFHqkbU!>xG#DQqW(O-RL|Z46p6Zd|Iub!GBl3rfha z5{A*AsbXudfegFXFhRJ@4@5~;b=O|Qiy|M>Z6xV3j0r&!D|l5^;kl?F_~|ecW*q;gzM7qQUpiMiFvS+n-`Mv%-duk1SN(%@c)vbS_WB*iOr81o z@CP$H*?E>-O_f}@#1_0wFgLG^ez-G6JfANA*53Kq({wtwx?t=Yu^kXOSbuR(@$Hh5 dX`(4;7tloVZtY_3f#z}dHOC??!c3@Z{1378Tyg*a literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d24aa0f074b243ba7d0687180a65b2df0d24c469 GIT binary patch literal 1157 zcmeAS@N?(olHy`uVBq!ia0vp^ia@N(!3HE1)R;tolw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#24v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gtf;oFf&jvGt@IQ zHZeCh*HJJsFf`CNFw!?P(ls=ndS0-B(gnVDi`Xl&}@Z0>B}Z0zJ>Xz1eR=wxJW>1N<&Xy|I{ zYG7#y)9aF-T$-DjR|3v9z22~+{|N7{ z5Z^Nbt+H2~PcN`L5ORBw^9}zCOs|3(lmt$iZMpbad3&h3|Cu@NPlR@4*czt!SZ>yu zHDms?8k++gjve#cCTy>KnHTs<`omdKI;Vst00Z-i8vpxK(vInG?&LFdPrYrATR zD2cw9pc^|1CMQsF~{(MwMjrVmC?5Oha(tp{!3&b{aGo$q|-o^!_< z>Ms^KOPvHk6h-U!7~YTL<#H6_Kd2};g0~VBPM}7;9i>DQ61B4420>I6J75foa&Px* zSWOUnNhO{@3E>he>8e|_G48Z#;An!Vu1OoB)Cm!2gB^;-k?WafBv53IZ1M@TV1!^& zsp~UgV_$t->g$vOGFfvTRHs=?ph6^qwA!UvY?>oCd0Bk6-4qEnA*hohw?rj`1`yIs z2z+kZCDBzhsAAlVx6<$Tp9LP8p()x!F&-D=XT2Vlra|r_aW+$KXJdRMmkV1QnMBB7 zDJqppxl>-ZZgx;iAP}%QJRTQDxU60ciD{Q+mFF3FXi27GAVt@J%_z3%J%}T*(ybCy zW1Cj9a@T|}j7p0J#kgs^q&!d%{ts2vZM21A@UPw-iLH3A0jU_Y^d3{fjcYHrQyFZ? zgd)<-xUP5QZ?Pe%Bi%~s1_(9!fFMeWX4{*1L13erg+xt)QJy0)gIiH#mht-dkUvxz z@&7$I3XiimnZYc;2&XtUU^_+_ORf&@u39K8hO!&`PowiLJU#Ytdu*|>J@`<=({AFiE}C-6 z_(^1GIY>KhcdS0{d$`vBaVFC;?ig7dpqu9pM(BlGV@J!TCx+%nM_Wz| zyqjKMurjT)`&)nS^JdEm9T$k;qm?gLo%bt}QzwaI%NwPYrTSyd97@lf1lZ-M84T{qk73A*B?7F+|w5#pTxVhnots82PHO`#XLFdxUv0a6( z*!3xhZbXn#Q9||*B^YIeMLksFOA+=EMHC5wFFh2|8FQ_Nwt<;*{=@fu|MkrA`nt^p z`781Xf+&d9@NvAZ#;-Fk7k|OpxkY#>LDfyDK~JKTXhI?^>#Y#PRIv@lp(uCnehz~K zF^^OdO{htzWhGs8i8jWSRt?N1h+tLP5Ty=?Kr3uhv=BLYZoY7*)Jr<)LX zU9?l8eKhbfF2+;t_xsC$n`UT=c2kVo$@p21o26+m^N`q^DJR)DAD!`qtq|Fckik+^ zDwT4jJTBdAqnJP-U~9PDPKu!Ez=P zk!~h*y)#qA`gR@ZR=aKhuE7fgQBpM9p2iCT8`CT#Y7&g`ArdRN6h&rzbU4ECyqEJt zc!uGl;fUKGh|*DpsrFXW0Vc!cb*W2*8p?3xKU`l{u00B>fj#rkRQ5nQYU(POPMKA* z$KuJVH^Y^)$5Nh^OW|NByRm;YI&*}l$KKA4EjDHcA8L5oO+40TwpM(`SK@t)4=2)Z zC(gYncuX%m{I$Q7cBEdGJzBHl=$r~GS@^QHwPn+#XD2qCJXO@!_T@(W=Z`1C#VeQl zxe?yMtzR{@ZFqdL!r`35uUm5Dy4VXGtAiJ|FVdFwogIDJLbNn{j*XWjtGMq)IaFcc zyN#XKFE$zn?v5@PDyi9v`ul?USIsxMY-D4@t^1|Bj|}(9>niu&|-W$B#Ik9}%gM&90JoJY1B8v|#?gb+| kH`Pw=cWh{8UybJ!6GLNtm!}554cI?`Salsg5ZQI;7nS*U3IG5A literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/keyboard_hint_plus.9.png b/java/res/drawable-mdpi/keyboard_hint_plus.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d85ac87fdf46e693fe308a9cd4792637dacac9 GIT binary patch literal 1116 zcmaJ=OK1~87+&LpR$8rEUj=2{f?nM0PGTCeHr6DY)L^&NG+?}_+udoqru%Sr(xlNt zQ4~}JsRt?AN)Ljfcu_$js7MtnXbXB!Bc8meh>EDygR`-z9*hgKGym{?-~XIr9qp~P z3mXLHc)4DX{}Y3=09D zn`30Ii33g04ZWNEe*Z?`;ULFy9u|5S=;ys2p5wsGM-y+B(#3j=|Gqv7!|1i{z?I+k*bZa0<{1Z2yWYGT#UfuksO85ta;Nuwu9tGZ*C@S@1absI~%jN(F&CJJs`Q~Odn;FMmz%$i zAI>~~x$N!PFBgXPjI|!vJUn?Yo;}%EsP|sFG5T=Logs1c*#|c-e7fe^@b$_2?3;6{ zd3DL>;?Uyin!3Sn>8fdASCM&iaBjMKFgS-ebkz+~;|!QirmnkA<-3>frP?kZ+r7Uq Qam9J>@o2knHN5xGFOdIo*8l(j literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/keyboard_hint_question.9.png b/java/res/drawable-mdpi/keyboard_hint_question.9.png new file mode 100644 index 0000000000000000000000000000000000000000..37f6e5f366977583a0c01352f79253bc74a5c699 GIT binary patch literal 1140 zcmaJ>ZD`X#7!EpQPA60Rn2O_?i6E}|XzfZvt9DIm3uex)X#cq^xvp_07nAGSO+^_x zoq~!Vh>9SB3>CyF!yhVsq6pK8Fa&Xb2BM-Uir^3N<1*Lj4{IQ~dynUN-sj$XFTG8T zt1BxOR8SOEnTU%?GP=m?E}ufaV9BJ}WSEbmY21u5I4@g}3ah9Uf`l%&!6cN`&Ml8% zkfJ8jS}Kjx(i%ZQIwLz6rl6aIO;N#>1yfeqAqK6mO*2CD$LqIfps68xgHPflGXk?( zyvu^kU5zQFt6d4G^vV?=SP+PS4zUah`ewrx3L$z-S0Hm|nWe!P1h9 z6S9UqUM5m7wji4<&v4F`ia<&FKUCKz&^AuOKYsryY^OR+$R?qUa+X34E>r8IGKGi* zWsIy8LYs?KY|0{x>?|@tq}c}~SYtLkT7g48wyN_A(|*Knx+cjfG^_Z`Q;IB zgUIt@EZpGn2Vz`|=cB$T7vPIr5h*zx8o0<+|8R*w39i!$x=AvN(9$}f8nciN#Wy>N(q6nJxhyfmItTmLK^K=u_c+suwk5$t<3odVyG7di%%UAxawXm*#Bi$c z;{9=c#$9fDwEbx9?F#RnoySg@HR}a?>VbQMuEC+IrTY%YTl(fayQU6YNq#%me_BlC zuI$}=d-teoW-IwXTe`D3xr>{>AZ|Qk5a_-BM-j^Fs z>>5Z%th0x|=il`EGx6M)j_02bR)*H5zTJ8D_`4 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/keyboard_hint_quote.9.png b/java/res/drawable-mdpi/keyboard_hint_quote.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d2cb5e3d2cc22a07c537a5ec05600c3fef48dc GIT binary patch literal 1077 zcmaJ=T}TvB6du$}G)W>K3WV#3fza;E?7F+|p~Jl&dyxdVVxgmuI;Wx znMJGwJ`_SB6hSXOWC=ovhSASMP|!tuE1;Yxxasv{kI6z}zTIV#HW9~>z;h_^#1)Qfubev}eTNCag)4naf}6EF%zIWzPI zwh}}ssl<9wuW*W$bk!-^7-w2FFq zIz~*`Gtw24Mv{_WCfkmK)-;O+RER{7RtGhUO$W%FE{o5$n<7CDf|3DpE2&@FXLp~%|4&+C~(mXP0=ojaXAvpj;4e}p}qnUC)8|B0KSl9}X0|*%` zMWs?HXUgr=%>>2x{eD}+<#J$z!^&t#Ogl8Ip`gG+OEMJ$DY^!1MKP`qqX3CB-6}yf zin5xOzb1TPR9ZAB#!1^H6@Y^9f2gV!(H4rr?R<9>wqh9rQc-B>!={8A*WX}=GFZ-p zBGS#6t`8P&v3o#Ax;3C1fa~!9L6j8DwsUwvU?ZA^L`{MbK0smxr=rMgh;DXsjF;!! z?L5Qq;b6PV=MU3ih6#B>w4W((d0iS-p@s@vd7B&Bm1~cJYT(E`G?nvE4x73PawW6M z4!H#V9?s1$-d*+bTzU6gxLvsvPKL4@`%j|_E<8Qn_~6 z|7i7Y%hcZN2DccO*021ibzhFJeCqu0VxhEVlz3I2oql*M^lYW9yy65=f<0y6Qq}jL gf5Q8lE_PR!>?2;zM;bF9lgsu)j)c1SnfAW1zlu{{f&c&j literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/keyboard_hint_smaller.9.png b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png new file mode 100644 index 0000000000000000000000000000000000000000..76553cf96b26d63a20a05202a5b20f6b493471dc GIT binary patch literal 1130 zcmaJ=TWHfz7>-V54lCQdi{dexI>9zcv$i&_Ze7xDMN>ytUGXx^lCw2zxtN^VuHt3G zhv{Aw5ru&R@Ax314s|-_%U}#&R1i_Y7X?uSeGp$fnd|hy8aO%UKYZW!U(czQc$2Ga zbs0eru2{2>!25c<+@%ZfA8eev6mP3gB!yayPL!1_NQ4!m1A>?)b-@Ibl-@%Vu#O-~ zNHv*4DRCz!8=6OQFrJ)dVm3k4)#pq}?uH0-z%Eq}kzXD>CV{Gi$TpuyizW}#YIEL# zt@(IT&Uec}g{T()gPPV3QaE*B!Fbvb-?t|<~sLr`~!{2f$EYyrGsLE!Vy zZkhJez|VLXwl)w5Yyn=Hp()x+F&dbn!|I}#U@+)tc)f0naNE5)l5%d{t|}-9(3UOLM5>_!M^Wl9GAKmiNPnlGnX|IG zJyRxJFe)dR6yu?tlnOvm{6AFFX3;iEz(4W+Q`k=SnvhCB+sIflZd_-TPG^nEjSNX&B7v(ympqbdS04?<}RHBxlf$5YvwRkLS zQN0rkJUz~Fc5JaRJNQt?({AChUOO1xT;Y||?QCSz#}OV??!N5b8eY8l`o+r8hLt@{dH?C^C2V&2dXgFQ zK5Kh>_SnyTWHfz7!E44UN#3-Q9(V8(kZh|(%RK#i_$i!7R;P&#i0&Nle0C{TujbvHW5Sz zIs_G`=z~{K!52ZCGEoqH5g*hEf;dr8yglf=fG-N-$y}!o)VO$2DP3Fd!X|W?0vbdTaI`JD%{m-8qRZmFdrXmF1cHhj`8%jqu>~Xz3xY_H z4#;!^4H}pr6J8pPMwfsP&CnDbqL@&CiL&7kOVeQVA+a}0X=gKhYSb6DII@6{$x>9Q zR0@{DLBr~xm{=_4YJ@@oj0o6WI+C1#ZZ9Y+@X(em)kLbH16NVX8=Z(FaiqUf(9AJe z-5xCyE*RxVCdCA4H>EOA6#oy^v@x`eGVo8l{}i@!T_&V5&^9_P88@zdf$Pd-lNOYa zVdV^COSy_I1p^s&!7xEG8v&vutGa8C;6;&5>o$^f8K!xT#0o)GRoGBCE(pt#bTXU} z7=};96QO7hzN9yDRX&4?$n@;%3S3Sm#N5gM?o{OXC7MWHmIa5Ljxlzvuedy z5<*42QLa)kmPD!|m%_nNZe#yybomHRkGmZkTWpLCKGgBFTX?J&UGRU$SK@V=kLR4B z4@cuQw?VDY*mI=Vc71p#=}e#Ya_y$=9FG8{+_|}Z1~lyHD8n24GukZ>Y>b> zrGBzNo;i5nXZ?@r-Ou?(&lJy<3%>s0erux7Bk2z>e_^e+4gH_%cb+qAP7+5jg=YR@V)L$FQ>u66 literal 0 HcmV?d00001 diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 943a43b70..19002140c 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -106,8 +106,12 @@ + + + + diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 94fe76d54..a05d29192 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -212,6 +212,8 @@ ABC ALT + + More diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index 4aef4b448..431c5d7a6 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -34,44 +34,54 @@ diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml index dfa7ef600..fc0ede3c5 100644 --- a/java/res/xml-de/kbd_qwerty_black.xml +++ b/java/res/xml-de/kbd_qwerty_black.xml @@ -28,43 +28,53 @@ diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml index 80d4d25de..c18339cb3 100644 --- a/java/res/xml-fr/kbd_qwerty.xml +++ b/java/res/xml-fr/kbd_qwerty.xml @@ -28,43 +28,53 @@ diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml index 28bf3f9ef..c0f263f25 100644 --- a/java/res/xml-fr/kbd_qwerty_black.xml +++ b/java/res/xml-fr/kbd_qwerty_black.xml @@ -28,43 +28,53 @@ diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml index 8921d5353..ea7fb3042 100644 --- a/java/res/xml-nb/kbd_qwerty.xml +++ b/java/res/xml-nb/kbd_qwerty.xml @@ -34,44 +34,54 @@ diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml index 7d23dc540..8391ef761 100644 --- a/java/res/xml-xlarge/kbd_symbols.xml +++ b/java/res/xml-xlarge/kbd_symbols.xml @@ -30,6 +30,7 @@ @@ -102,7 +103,7 @@ @@ -102,7 +103,7 @@ diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml index fff409340..a35731815 100644 --- a/java/res/xml/kbd_qwerty_black.xml +++ b/java/res/xml/kbd_qwerty_black.xml @@ -28,43 +28,53 @@ diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index 6f32f9c1a..0bf4f4eaa 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -194,9 +194,13 @@ public class BaseKeyboard { /** Label to display */ public CharSequence label; + /** Label to display when keyboard is in temporary shift mode */ + public CharSequence temporaryShiftLabel; /** Icon to display instead of a label. Icon takes precedence over a label */ public Drawable icon; + /** Hint icon to display on the key in conjunction with the label */ + public Drawable hintIcon; /** Preview version of the icon, for the preview popup */ public Drawable iconPreview; /** Width of the key, not including the gap */ @@ -294,22 +298,17 @@ public class BaseKeyboard { TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard); - width = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyWidth, + width = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyWidth, keyboard.mDisplayWidth, parent.defaultWidth); - height = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyHeight, + height = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyHeight, keyboard.mDisplayHeight, parent.defaultHeight); - gap = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_horizontalGap, + gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, keyboard.mDisplayWidth, parent.defaultHorizontalGap); a.recycle(); - a = res.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.BaseKeyboard_Key); + a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard_Key); this.x += gap; TypedValue codesValue = new TypedValue(); - a.getValue(R.styleable.BaseKeyboard_Key_codes, - codesValue); + a.getValue(R.styleable.BaseKeyboard_Key_codes, codesValue); if (codesValue.type == TypedValue.TYPE_INT_DEC || codesValue.type == TypedValue.TYPE_INT_HEX) { codes = new int[] { codesValue.data }; @@ -318,29 +317,22 @@ public class BaseKeyboard { } iconPreview = a.getDrawable(R.styleable.BaseKeyboard_Key_iconPreview); - if (iconPreview != null) { - iconPreview.setBounds(0, 0, iconPreview.getIntrinsicWidth(), - iconPreview.getIntrinsicHeight()); - } - popupCharacters = a.getText( - R.styleable.BaseKeyboard_Key_popupCharacters); - popupResId = a.getResourceId( - R.styleable.BaseKeyboard_Key_popupKeyboard, 0); - repeatable = a.getBoolean( - R.styleable.BaseKeyboard_Key_isRepeatable, false); - modifier = a.getBoolean( - R.styleable.BaseKeyboard_Key_isModifier, false); - sticky = a.getBoolean( - R.styleable.BaseKeyboard_Key_isSticky, false); + setDefaultBounds(iconPreview); + popupCharacters = a.getText(R.styleable.BaseKeyboard_Key_popupCharacters); + popupResId = a.getResourceId(R.styleable.BaseKeyboard_Key_popupKeyboard, 0); + repeatable = a.getBoolean(R.styleable.BaseKeyboard_Key_isRepeatable, false); + modifier = a.getBoolean(R.styleable.BaseKeyboard_Key_isModifier, false); + sticky = a.getBoolean(R.styleable.BaseKeyboard_Key_isSticky, false); edgeFlags = a.getInt(R.styleable.BaseKeyboard_Key_keyEdgeFlags, 0); edgeFlags |= parent.rowEdgeFlags; - icon = a.getDrawable( - R.styleable.BaseKeyboard_Key_keyIcon); - if (icon != null) { - icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight()); - } + icon = a.getDrawable(R.styleable.BaseKeyboard_Key_keyIcon); + setDefaultBounds(icon); + hintIcon = a.getDrawable(R.styleable.BaseKeyboard_Key_keyHintIcon); + setDefaultBounds(hintIcon); + label = a.getText(R.styleable.BaseKeyboard_Key_keyLabel); + temporaryShiftLabel = a.getText(R.styleable.BaseKeyboard_Key_temporaryShiftKeyLabel); text = a.getText(R.styleable.BaseKeyboard_Key_keyOutputText); if (codes == null && !TextUtils.isEmpty(label)) { @@ -679,10 +671,12 @@ public class BaseKeyboard { return new int[0]; } + // TODO should be private protected Row createRowFromXml(Resources res, XmlResourceParser parser) { return new Row(res, this, parser); } + // TODO should be private protected Key createKeyFromXml(Resources res, Row parent, int x, int y, XmlResourceParser parser) { return new Key(res, parent, x, y, parser); @@ -707,6 +701,7 @@ public class BaseKeyboard { if (TAG_ROW.equals(tag)) { inRow = true; x = 0; + // TODO createRowFromXml should not be called from BaseKeyboard constructor. currentRow = createRowFromXml(res, parser); skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode; if (skipRow) { @@ -715,6 +710,7 @@ public class BaseKeyboard { } } else if (TAG_KEY.equals(tag)) { inKey = true; + // TODO createKeyFromXml should not be called from BaseKeyboard constructor. key = createKeyFromXml(res, currentRow, x, y, parser); mKeys.add(key); if (key.codes[0] == KEYCODE_SHIFT) { @@ -793,4 +789,10 @@ public class BaseKeyboard { } return defValue; } + + protected static void setDefaultBounds(Drawable drawable) { + if (drawable != null) + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight()); + } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 53ccf3629..3fc484d09 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -62,9 +62,6 @@ public class LatinKeyboard extends BaseKeyboard { private Key mF1Key; private Key mSpaceKey; private Key m123Key; - private final int NUMBER_HINT_COUNT = 10; - private Key[] mNumberHintKeys; - private Drawable[] mNumberHintIcons = new Drawable[NUMBER_HINT_COUNT]; private int mSpaceKeyIndex = -1; private int mSpaceDragStartX; private int mSpaceDragLastDiff; @@ -119,9 +116,7 @@ public class LatinKeyboard extends BaseKeyboard { mRes = res; mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); - mShiftLockPreviewIcon.setBounds(0, 0, - mShiftLockPreviewIcon.getIntrinsicWidth(), - mShiftLockPreviewIcon.getIntrinsicHeight()); + setDefaultBounds(mShiftLockPreviewIcon); mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space); mSpaceAutoCompletionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led); mSpacePreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_space); @@ -138,37 +133,11 @@ public class LatinKeyboard extends BaseKeyboard { mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty || xmlLayoutResId == R.xml.kbd_qwerty_black; mSpaceKeyIndex = indexOf(LatinIME.KEYCODE_SPACE); - initializeNumberHintResources(context); - } - - private void initializeNumberHintResources(Context context) { - final Resources res = context.getResources(); - mNumberHintIcons[0] = res.getDrawable(R.drawable.keyboard_hint_0); - mNumberHintIcons[1] = res.getDrawable(R.drawable.keyboard_hint_1); - mNumberHintIcons[2] = res.getDrawable(R.drawable.keyboard_hint_2); - mNumberHintIcons[3] = res.getDrawable(R.drawable.keyboard_hint_3); - mNumberHintIcons[4] = res.getDrawable(R.drawable.keyboard_hint_4); - mNumberHintIcons[5] = res.getDrawable(R.drawable.keyboard_hint_5); - mNumberHintIcons[6] = res.getDrawable(R.drawable.keyboard_hint_6); - mNumberHintIcons[7] = res.getDrawable(R.drawable.keyboard_hint_7); - mNumberHintIcons[8] = res.getDrawable(R.drawable.keyboard_hint_8); - mNumberHintIcons[9] = res.getDrawable(R.drawable.keyboard_hint_9); - } - - // TODO: delete this method and do initialization in constructor. - private void initializeMemberVariablesAsNeeded() { - if (mNumberHintKeys == null) - mNumberHintKeys = new Key[NUMBER_HINT_COUNT]; } @Override protected Key createKeyFromXml(Resources res, Row parent, int x, int y, XmlResourceParser parser) { - // TODO: This initialization is needed because this protected method is being called from - // the base class constructor before this class constructor gets called. We need to fix - // this. - initializeMemberVariablesAsNeeded(); - Key key = new LatinKey(res, parent, x, y, parser); switch (key.codes[0]) { case LatinIME.KEYCODE_ENTER: @@ -186,17 +155,6 @@ public class LatinKeyboard extends BaseKeyboard { break; } - // For number hints on the upper-right corner of key - int hintNumber = -1; - if (LatinKeyboardBaseView.isNumberAtLeftmostPopupChar(key)) { - hintNumber = key.popupCharacters.charAt(0) - '0'; - } else if (LatinKeyboardBaseView.isNumberAtRightmostPopupChar(key)) { - hintNumber = key.popupCharacters.charAt(key.popupCharacters.length() - 1) - '0'; - } - if (hintNumber >= 0 && hintNumber <= 9) { - mNumberHintKeys[hintNumber] = key; - } - return key; } @@ -251,11 +209,7 @@ public class LatinKeyboard extends BaseKeyboard { break; } // Set the initial size of the preview icon - if (mEnterKey.iconPreview != null) { - mEnterKey.iconPreview.setBounds(0, 0, - mEnterKey.iconPreview.getIntrinsicWidth(), - mEnterKey.iconPreview.getIntrinsicHeight()); - } + setDefaultBounds(mEnterKey.iconPreview); } } @@ -279,7 +233,7 @@ public class LatinKeyboard extends BaseKeyboard { public boolean isShiftLocked() { return mShiftState == SHIFT_LOCKED; } - + @Override public boolean setShifted(boolean shiftState) { boolean shiftChanged = false; @@ -314,6 +268,10 @@ public class LatinKeyboard extends BaseKeyboard { } } + public boolean isTemporaryUpperCase() { + return mIsAlphaKeyboard && isShifted() && !isShiftLocked(); + } + /* package */ boolean isAlphaKeyboard() { return mIsAlphaKeyboard; } @@ -335,11 +293,6 @@ public class LatinKeyboard extends BaseKeyboard { if (mSpaceKey != null) { updateSpaceBarForLocale(isAutoCompletion, isBlack); } - updateNumberHintKeys(); - } - - private void setDefaultBounds(Drawable drawable) { - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); } public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) { @@ -385,14 +338,6 @@ public class LatinKeyboard extends BaseKeyboard { return mSpaceKey; } - private void updateNumberHintKeys() { - for (int i = 0; i < mNumberHintKeys.length; ++i) { - if (mNumberHintKeys[i] != null) { - mNumberHintKeys[i].icon = mNumberHintIcons[i]; - } - } - } - public boolean isLanguageSwitchEnabled() { return mLocale != null; } @@ -828,8 +773,7 @@ public class LatinKeyboard extends BaseKeyboard { public SlidingLocaleDrawable(Drawable background, int width, int height) { mBackground = background; - mBackground.setBounds(0, 0, - mBackground.getIntrinsicWidth(), mBackground.getIntrinsicHeight()); + setDefaultBounds(mBackground); mWidth = width; mHeight = height; mTextPaint = new TextPaint(); @@ -887,7 +831,7 @@ public class LatinKeyboard extends BaseKeyboard { canvas.drawText(mNextLanguage, diff - width / 2, baseline, paint); canvas.drawText(mPrevLanguage, diff + width + width / 2, baseline, paint); - lArrow.setBounds(0, 0, lArrow.getIntrinsicWidth(), lArrow.getIntrinsicHeight()); + setDefaultBounds(lArrow); rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width, rArrow.getIntrinsicHeight()); lArrow.draw(canvas); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 264e2f18f..05b29b9b5 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -578,7 +578,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mKeys = mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), -getPaddingTop() + mVerticalCorrection); for (PointerTracker tracker : mPointerTrackers) { - tracker.setKeyboard(mKeys, mKeyHysteresisDistance); + tracker.setKeyboard(keyboard, mKeys, mKeyHysteresisDistance); } requestLayout(); // Hint to reallocate the buffer if the size changed @@ -802,8 +802,19 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); keyBackground.draw(canvas); - boolean shouldDrawIcon = true; + boolean drawHintIcon = true; if (label != null) { + // If keyboard is multi-touch capable and in temporary upper case state and key has + // tempoarary shift label, label should be hint character and hint icon should not + // be drawn. + if (mHasDistinctMultitouch + && mKeyboard instanceof LatinKeyboard + && ((LatinKeyboard)mKeyboard).isTemporaryUpperCase() + && key.temporaryShiftLabel != null) { + label = key.temporaryShiftLabel.toString(); + drawHintIcon = false; + } + // For characters, use large font. For labels like "Done", use small font. if (label.length() > 1 && key.codes.length < 2) { paint.setTextSize(mLabelTextSize); @@ -823,25 +834,26 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx paint); // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); - - // Usually don't draw icon if label is not null, but we draw icon for the number - // hint. - shouldDrawIcon = isNumberAtEdgeOfPopupChars(key); } - 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(); + Drawable icon = null; + if (key.label == null && key.icon != null) + icon = key.icon; + 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; canvas.translate(drawableX, drawableY); - key.icon.setBounds(0, 0, drawableWidth, drawableHeight); - key.icon.draw(canvas); + icon.setBounds(0, 0, drawableWidth, drawableHeight); + icon.draw(canvas); canvas.translate(-drawableX, -drawableY); } canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); @@ -906,16 +918,18 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } } + // TODO Must fix popup preview on xlarge layout private void showKey(final int keyIndex, PointerTracker tracker) { Key key = tracker.getKey(keyIndex); if (key == null) return; // Should not draw number hint icons - if (key.icon != null && !isNumberAtEdgeOfPopupChars(key)) { + if (key.icon != null && key.label == null) { mPreviewText.setCompoundDrawables(null, null, null, key.iconPreview != null ? key.iconPreview : key.icon); mPreviewText.setText(null); } else { + // TODO Should take care of temporaryShiftLabel here. mPreviewText.setCompoundDrawables(null, null, null, null); mPreviewText.setText(adjustCase(tracker.getPreviewText(key))); if (key.label.length() > 1 && key.codes.length < 2) { @@ -997,7 +1011,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * Invalidates a key so that it will be redrawn on the next repaint. Use this method if only * one key is changing it's content. Any changes that affect the position or size of the key * may not be honored. - * @param key key in the attached {@link Keyboard}. + * @param key key in the attached {@link BaseKeyboard}. * @see #invalidateAllKeys */ public void invalidateKey(Key key) { @@ -1182,11 +1196,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return false; } - private static boolean isNumberAtEdgeOfPopupChars(Key key) { - return isNumberAtLeftmostPopupChar(key) || isNumberAtRightmostPopupChar(key); - } - - /* package */ static boolean isNumberAtLeftmostPopupChar(Key key) { + private static boolean isNumberAtLeftmostPopupChar(Key key) { if (key.popupCharacters != null && key.popupCharacters.length() > 0 && isAsciiDigit(key.popupCharacters.charAt(0))) { return true; @@ -1194,14 +1204,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return false; } - /* package */ static boolean isNumberAtRightmostPopupChar(Key key) { - if (key.popupCharacters != null && key.popupCharacters.length() > 0 - && isAsciiDigit(key.popupCharacters.charAt(key.popupCharacters.length() - 1))) { - return true; - } - return false; - } - private static boolean isAsciiDigit(char c) { return (c < 0x80) && Character.isDigit(c); } @@ -1221,7 +1223,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx final PointerTracker tracker = new PointerTracker(i, mHandler, mKeyDetector, this, mHasDistinctMultitouch); if (keys != null) - tracker.setKeyboard(keys, mKeyHysteresisDistance); + tracker.setKeyboard(mKeyboard, keys, mKeyHysteresisDistance); if (listener != null) tracker.setOnKeyboardActionListener(listener); pointers.add(tracker); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 912af7e2a..f3d045bec 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -109,9 +109,9 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { @Override protected CharSequence adjustCase(CharSequence label) { BaseKeyboard keyboard = getKeyboard(); - if (keyboard.isShifted() - && keyboard instanceof LatinKeyboard + if (keyboard instanceof LatinKeyboard && ((LatinKeyboard) keyboard).isAlphaKeyboard() + && keyboard.isShifted() && !TextUtils.isEmpty(label) && label.length() < 3 && Character.isLowerCase(label.charAt(0))) { label = label.toString().toUpperCase(); diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index cf4f7d5c2..6517a206e 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -52,6 +52,7 @@ public class PointerTracker { private OnKeyboardActionListener mListener; private final boolean mHasDistinctMultitouch; + private BaseKeyboard mKeyboard; private Key[] mKeys; private int mKeyHysteresisDistanceSquared = -1; @@ -179,9 +180,10 @@ public class PointerTracker { mListener = listener; } - public void setKeyboard(Key[] keys, float keyHysteresisDistance) { - if (keys == null || keyHysteresisDistance < 0) + public void setKeyboard(BaseKeyboard keyboard, Key[] keys, float keyHysteresisDistance) { + if (keyboard == null || keys == null || keyHysteresisDistance < 0) throw new IllegalArgumentException(); + mKeyboard = keyboard; mKeys = keys; mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance); // Update current key index because keyboard layout has been changed. @@ -280,7 +282,7 @@ public class PointerTracker { mHandler.startKeyRepeatTimer(REPEAT_START_DELAY, keyIndex, this); mIsRepeatableKey = true; } - mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); + startLongPressTimer(keyIndex); } showKeyPreviewAndUpdateKey(keyIndex); } @@ -292,14 +294,15 @@ public class PointerTracker { return; KeyState keyState = mKeyState; int keyIndex = keyState.onMoveKey(x, y); - if (isValidKeyIndex(keyIndex)) { + Key key = getKey(keyIndex); + if (key != null) { if (keyState.getKeyIndex() == NOT_A_KEY) { keyState.onMoveToNewKey(keyIndex, x, y); - mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); + startLongPressTimer(keyIndex); } else if (!isMinorMoveBounce(x, y, keyIndex)) { resetMultiTap(); keyState.onMoveToNewKey(keyIndex, x, y); - mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); + startLongPressTimer(keyIndex); } } else { if (keyState.getKeyIndex() != NOT_A_KEY) { @@ -415,6 +418,20 @@ public class PointerTracker { } } + private void startLongPressTimer(int keyIndex) { + Key key = getKey(keyIndex); + // If keyboard is in temporary upper case state and the key has temporary shift label, + // long press should not be started. + if (isTemporaryUpperCase() && key.temporaryShiftLabel != null) + return; + mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); + } + + private boolean isTemporaryUpperCase() { + return mKeyboard instanceof LatinKeyboard + && ((LatinKeyboard)mKeyboard).isTemporaryUpperCase(); + } + private void detectAndSendKey(int index, int x, int y, long eventTime) { final OnKeyboardActionListener listener = mListener; final Key key = getKey(index); @@ -442,6 +459,14 @@ public class PointerTracker { } code = key.codes[mTapCount]; } + + // If keyboard is in temporary upper case state and key has temporary shift label, + // alternate character code should be sent. + if (isTemporaryUpperCase() && key.temporaryShiftLabel != null) { + code = key.temporaryShiftLabel.charAt(0); + codes[0] = code; + } + /* * Swap the first and second values in the codes array if the primary code is not * the first value but the second value in the array. This happens when key