From abd7bba981aa3edb1a71df5eaeba113533764d51 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 23 Sep 2010 12:42:15 +0900 Subject: [PATCH 001/287] Disable invoking VoiceIME using swipe right action Bug: 3028268 Change-Id: I4bcf35051d5e82b60bb6a346a80ad6c3c03c31cb --- .../android/inputmethod/latin/LatinIME.java | 42 +++++-------------- 1 file changed, 11 insertions(+), 31 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index d9cd7276b..2c0b80961 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -133,12 +133,7 @@ public class LatinIME extends InputMethodService private static final int MSG_START_TUTORIAL = 1; private static final int MSG_UPDATE_SHIFT_STATE = 2; private static final int MSG_VOICE_RESULTS = 3; - private static final int MSG_START_LISTENING_AFTER_SWIPE = 4; - private static final int MSG_UPDATE_OLD_SUGGESTIONS = 5; - - // If we detect a swipe gesture within N ms of typing, then swipe is - // ignored, since it may in fact be two key presses in quick succession. - private static final long MIN_MILLIS_AFTER_TYPING_BEFORE_SWIPE = 1000; + private static final int MSG_UPDATE_OLD_SUGGESTIONS = 4; // How many continuous deletes at which to start deleting at a higher speed. private static final int DELETE_ACCELERATE_AT = 20; @@ -245,7 +240,6 @@ public class LatinIME extends InputMethodService private String mSuggestPuncs; private VoiceInput mVoiceInput; private VoiceResults mVoiceResults = new VoiceResults(); - private long mSwipeTriggerTimeMillis; private boolean mConfigurationChanging; // Keeps track of most recently inserted text (multi-character key) for reverting @@ -339,10 +333,6 @@ public class LatinIME extends InputMethodService case MSG_VOICE_RESULTS: handleVoiceResults(); break; - case MSG_START_LISTENING_AFTER_SWIPE: - if (mLastKeyTime < mSwipeTriggerTimeMillis) { - startListening(true); - } } } }; @@ -2187,21 +2177,6 @@ public class LatinIME extends InputMethodService return mWord.isCapitalized(); } - public void swipeRight() { - if (userHasNotTypedRecently() && VOICE_INSTALLED && mEnableVoice && - fieldCanDoVoice(makeFieldContext())) { - startListening(true /* was a swipe */); - } - - if (LatinKeyboardView.DEBUG_AUTO_PLAY) { - ClipboardManager cm = ((ClipboardManager)getSystemService(CLIPBOARD_SERVICE)); - CharSequence text = cm.getText(); - if (!TextUtils.isEmpty(text)) { - mKeyboardSwitcher.getInputView().startPlaying(text.toString()); - } - } - } - private void toggleLanguage(boolean reset, boolean next) { if (reset) { mLanguageSwitcher.reset(); @@ -2233,6 +2208,16 @@ public class LatinIME extends InputMethodService } } + public void swipeRight() { + if (LatinKeyboardView.DEBUG_AUTO_PLAY) { + ClipboardManager cm = ((ClipboardManager)getSystemService(CLIPBOARD_SERVICE)); + CharSequence text = cm.getText(); + if (!TextUtils.isEmpty(text)) { + mKeyboardSwitcher.getInputView().startPlaying(text.toString()); + } + } + } + public void swipeLeft() { } @@ -2315,11 +2300,6 @@ public class LatinIME extends InputMethodService } } - private boolean userHasNotTypedRecently() { - return (SystemClock.uptimeMillis() - mLastKeyTime) - > MIN_MILLIS_AFTER_TYPING_BEFORE_SWIPE; - } - private void playKeyClick(int primaryCode) { // if mAudioManager is null, we don't have the ringer state yet // mAudioManager will be set by updateRingerMode From a96d8a11e84ef9219eb40a815e82ad8a3d852ca5 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 23 Sep 2010 13:06:03 +0900 Subject: [PATCH 002/287] Use SystemClock.uptimeMillis() for event time Change-Id: If20f289992f829ae3a0a2a1eb60a4fc9b35c308a --- .../com/android/inputmethod/latin/LatinKeyboardBaseView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index dafbb669e..eeccb965c 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -33,6 +33,7 @@ import android.inputmethodservice.Keyboard; import android.inputmethodservice.Keyboard.Key; import android.os.Handler; import android.os.Message; +import android.os.SystemClock; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; @@ -1157,7 +1158,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mMiniKeyboardPopup.showAtLocation(this, Gravity.NO_GRAVITY, x, y); // Inject down event on the key to mini keyboard. - long eventTime = System.currentTimeMillis(); + long eventTime = SystemClock.uptimeMillis(); mMiniKeyboardPopupTime = eventTime; MotionEvent downEvent = generateMiniKeyboardMotionEvent(MotionEvent.ACTION_DOWN, popupKey.x + popupKey.width / 2, popupKey.y + popupKey.height / 2, eventTime); From d1a8e3088bb6267a31e3351d304796d1507e3af6 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 23 Sep 2010 12:31:22 +0900 Subject: [PATCH 003/287] Fix ArrayIndexOutOfBoundsException in WordComposer Bug: 3028277 Change-Id: I1c4d8dca4db8a70f851589d1fbd45a16ea1bfc1b --- .../inputmethod/latin/WordComposer.java | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 6772d53ea..fe4c68576 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -25,14 +25,14 @@ public class WordComposer { /** * The list of unicode values for each keystroke (including surrounding keys) */ - private ArrayList mCodes; + private final ArrayList mCodes; /** * The word chosen from the candidate list, until it is committed. */ private String mPreferredWord; - private StringBuilder mTypedWord; + private final StringBuilder mTypedWord; private int mCapsCount; @@ -116,11 +116,14 @@ public class WordComposer { * Delete the last keystroke as a result of hitting backspace. */ public void deleteLast() { - mCodes.remove(mCodes.size() - 1); - final int lastPos = mTypedWord.length() - 1; - char last = mTypedWord.charAt(lastPos); - mTypedWord.deleteCharAt(lastPos); - if (Character.isUpperCase(last)) mCapsCount--; + final int codesSize = mCodes.size(); + if (codesSize > 0) { + mCodes.remove(codesSize - 1); + final int lastPos = mTypedWord.length() - 1; + char last = mTypedWord.charAt(lastPos); + mTypedWord.deleteCharAt(lastPos); + if (Character.isUpperCase(last)) mCapsCount--; + } } /** @@ -132,15 +135,6 @@ public class WordComposer { if (wordSize == 0) { return null; } -// StringBuffer sb = new StringBuffer(wordSize); -// for (int i = 0; i < wordSize; i++) { -// char c = (char) mCodes.get(i)[0]; -// if (i == 0 && mIsCapitalized) { -// c = Character.toUpperCase(c); -// } -// sb.append(c); -// } -// return sb; return mTypedWord; } From 77542988b809fba6a59aa86982eb4d9e4269477e Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 23 Sep 2010 15:53:05 +0900 Subject: [PATCH 004/287] Tune left and right padding of popup mini keyboard This change also fix popup window display position calculation. Bug: 3029284 Change-Id: I28bf3e4deb46a428dc8422a3a165183e00608604 --- java/res/layout/keyboard_popup.xml | 2 ++ .../com/android/inputmethod/latin/LatinKeyboardBaseView.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml index 9a52e2cbd..27388e06b 100644 --- a/java/res/layout/keyboard_popup.xml +++ b/java/res/layout/keyboard_popup.xml @@ -23,6 +23,8 @@ android:layout_height="wrap_content" android:orientation="horizontal" android:background="@drawable/keyboard_popup_panel_background" + android:paddingLeft="16dip" + android:paddingRight="16dip" > Date: Thu, 23 Sep 2010 20:04:13 +0900 Subject: [PATCH 005/287] Fixed popup mini-keyboard position This change reverts I28bf3e4deb46a428dc8422a3a165183e00608604 partly Bug: 3029284 Change-Id: I0701ab9dfa1cfddbecbef3d32e525c0a143fc297 --- .../com/android/inputmethod/latin/LatinKeyboardBaseView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 92266c5f1..eeccb965c 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -1129,7 +1129,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx if (isNumberAtLeftmost) { popupX -= container.getPaddingLeft(); } else { - popupX += popupKey.width + container.getPaddingLeft(); + popupX += popupKey.width + getPaddingLeft(); popupX -= container.getMeasuredWidth(); popupX += container.getPaddingRight(); } From 5339950bbcb4ed281d7c5eec7e3c9aa0ff1106c0 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 24 Sep 2010 15:02:28 +0900 Subject: [PATCH 006/287] Update mdpi visual assets of upper-right number hint Change-Id: I77e2b70f4ec954ea2a0822f7bdb92d8a4d405f7f --- java/res/drawable-mdpi/keyboard_hint_0.9.png | Bin 379 -> 307 bytes java/res/drawable-mdpi/keyboard_hint_1.9.png | Bin 301 -> 302 bytes java/res/drawable-mdpi/keyboard_hint_2.9.png | Bin 404 -> 334 bytes java/res/drawable-mdpi/keyboard_hint_3.9.png | Bin 413 -> 327 bytes java/res/drawable-mdpi/keyboard_hint_4.9.png | Bin 341 -> 329 bytes java/res/drawable-mdpi/keyboard_hint_5.9.png | Bin 388 -> 334 bytes java/res/drawable-mdpi/keyboard_hint_6.9.png | Bin 413 -> 329 bytes java/res/drawable-mdpi/keyboard_hint_7.9.png | Bin 367 -> 334 bytes java/res/drawable-mdpi/keyboard_hint_8.9.png | Bin 417 -> 332 bytes java/res/drawable-mdpi/keyboard_hint_9.9.png | Bin 417 -> 339 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/java/res/drawable-mdpi/keyboard_hint_0.9.png b/java/res/drawable-mdpi/keyboard_hint_0.9.png index 271264e92c36f17b72b7ee910cee45c351fc0bf4..61ad1b50a299d8c80f0acfff7ef06a42cc0893c9 100644 GIT binary patch delta 278 zcmey(w3$hR<84 z&3l3r%H%dKF?_52|H?%Di;})C9is0VwgSymY!W>BT`m8<=ez?gATF5rbNj{=p=xde Z2C;-M{;w^5{Q-KF!PC{xWt~$(69Dy1b$kE- delta 351 zcmdnY^qWbsGr-TCmrII^fq{Y7)59eQNE-pM3kMsJJnWK|J5f=+o>A7*#WAGf)|=aV z`I-y_4t%_3@Zd(ETey3CV|c-rmol}i@y_mUVQzO{U7h23_(%e0`+sje)ma|(MSnRM z->W3`tP81lzu*3y_gwdL54FNAmVCZ9wSPyUcIQ_IufG0B#mof(Q4S3Zj7(4ND_#|{ zGK`uceKKm(X|s7|3R2N0H`hA_*{JGI+Pn2qmT2L1pAC~&Ub|%}hB&K?oC5Gh*dp(Q!3y>RFI0O_N8vaPCtYdwosS9K>n8E}Z7&k3? rUI!MO(RE%~=H_eXu*3UVB^VBFusRefweSis%osdf{an^LB{Ts5EI5x0 diff --git a/java/res/drawable-mdpi/keyboard_hint_1.9.png b/java/res/drawable-mdpi/keyboard_hint_1.9.png index eaf3742627b21cbdb8442de2a012044e0c11b336..cd7772e712021c72a4d31482cd9d63479fceefb1 100644 GIT binary patch delta 272 zcmV+r0q_2;0CPLtYf;7@sqR`!(_z5=z$aOh7 zYIRqbkHJFb89Sdk|fexBH{*!W=2^r``bC0Ak??f5Qg|W1j9>I zlbqPGEgZq%Dm8GA58^Nj_RNY#e^jVCS&=?zks-V8X^1$Fw}NFyYWV@$r2*cMJP#&- z9@QaZ_8dYS%r4~+6L#!F9LxqaA{(;ypR`kUor^@&s5ZHgGP#mDyDs*`G=w1xVF(q% zfAI*0c_CE4pneBo2h$LSFoYotVF(Sv|34kf@ep7DxjE*xUapF8000002uVdwM6N<$ Eg8ANiF8}}l delta 376 zcmX@dG=*8QGr-TCmrII^fq{Y7)59eQNE-pM3kMsJJnWK|J5f=+p3%(H#WAGf)|=ak z{f8U`+8)L>Iff-oyfJyskx$wa)BTk;PTlI^r*u&F{)Eg+3mkM_e!1sqc6&<8yTfPR zi3Jq}O$iEGd&2U2{=Dp1_v;>?Lo7{x%z5QLb7|+15(U%e$K4gp0yT6M92yuHKiyaS zY{=_2`|~OO|0Tx@dD#UYMBlA<%YC?fomIKOGTz`QsSk$)#oV`EbF{A4b#q(OV)9^b zs^f9-<7;I%hgi32>N1}5mwaVh*tsVwcklaOJgvM7GsAzfz6NaGrrlH!S?x4+VST6wRcxnpOgq&o3_Er^xiLvy?+{id=mdR_OqgIK>alDK(6K-sO!!30yx&VfVnSMS{RKS#>_kjI#WpZ9=!^T^&Ulxk Q1`JFFPgg&ebxsLQ09FK@fdBvi diff --git a/java/res/drawable-mdpi/keyboard_hint_3.9.png b/java/res/drawable-mdpi/keyboard_hint_3.9.png index 34b5011091f55725d5f63f7f60bd7e9f3c7eaa75..0c7336cb75e620de28277728427cf146b7b077b7 100644 GIT binary patch delta 299 zcmV+`0o4AT1IGd(iBL{Q4GJ0x0000DNk~Le0000X0000j2nGNE03ap;6pOdkPCbsIhe9bvp(OLpZ<~j=md3-;N73z-4x@VbwSNPpEfDLK2clE?C|`%B-B9 xifKxR8knxABqSjTNk}5Ki+U$3)8Qq+0Cu0})3zf4`Tzg`07*qoM6N<$0fI!3cJlxL delta 385 zcmX@kG?!ViGr-TCmrII^fq{Y7)59eQNE-pM3kMsJJnWK|J5f=+p3&aZ#WAGf)|=T2 z*Bx>Ya4q*_^-%Fp`NJgC?eeMhMEXX5rHxY+CO(+9J7tzhsLiC>ms5%-pKMdRU~65R zKHIm`(Mz*6sLRmIUe5cj`*)5|4IN**wohJ*4Fq`Emn^aWC#oXddWnfez=47B$!*6~ z`+QuaKf4@0V;A@JNMSi^Qayw9(M837-3`>um!@jZUmPYQdiKforkT66bPvi{-HgaO zG4qsy`SdjLBX<s69*E(T=jlB*e@|JzjC?1e(xM7I-iM$L2O63 Vz2bHzS74|zc)I$ztaD0e0sv#0mVf{N diff --git a/java/res/drawable-mdpi/keyboard_hint_4.9.png b/java/res/drawable-mdpi/keyboard_hint_4.9.png index d4cc250dd60f767fcbd24a7745eca1500433439f..73ef06c0e07dc621b4e48599ff2fa299a4926554 100644 GIT binary patch delta 300 zcmcc0bdpK2Gr-TCmrII^fq{Y7)59eQNGk%dE(aTsR8V6QnW(5y|Ju{VF{I+wo9TvJ zha3c4jTKjL-0FzvO3~oY%qOaua^$Pm^j~(>og>hqpw+&B|4V?n6wA@&OJrxc zH!>{njanQQ8Ge>YYNL~RNxlB<9H|qnl9@ex?|aKC(?YE`ItXuZWHxb9FVSrI=l)*5 zAj#vE^7pu$i-K=ge$|+@$WdWmmyT!ptC;%UPY(oof6fP5!lKv_)DeE$r2AdVON%@I wUEVM*TkkB;1d_RUNAuUtuA_T6?N}ukieKt=xlcL)3IzsFS3j3^PD}|+0Dt&(=l}o! delta 312 zcmX@fbd^c5Gr-TCmrII^fq{Y7)59eQNE-pM3kMsJJnWK|J5f=i{=27(V@SoVH@Ell zH5rJsJ)E|~Vw2IXDo(3iR=cXE_Vujmxzn_Iao$&BIbkOgN1uhh_a@Jov&8x3W%&e# z_acfc;@W$@zdu*I=JgAybI03!1kayjnk1uA&JxYdA)w&Uz`$s9c0r$(cIw)~x$RC} zN7Bl&JLWI;;0RomGiCc4#jg6jSJk3D(!J+S`L3hr6tZoplb2)0%t*eEK3h^#LV%f(`r zL}dmZ>B389CbKJPnkJeM5x0S8_9-O#5bYuIkWfcSyMZ>Hd8NZ7Oyc{xBcu1-;Tll! z2ffin*Ps$a6DCmikJ$0QvlQ0RBFbR|R-6{J16^r>N_!3|MT~{)wHg>=t000002uVdwM6N<$ Ef(vAOMF0Q* delta 360 zcmX@d)WWRT8Q|y6%O%Cdz`(%k>ERLtq>X^sg@X-99(GB~ov5f@<;uunK>&@+r zd`$)d4G*swym)cy#H$ytUKCsWO0Z#9UjN|KiBq@M#(8>5sr9UU_^RGB*oo=O;_?QT zwG%(wn;nz5HnuFUSk}ESQEReg%7<%D`0EW?T`VWe`T8-~LqjBpn?pdsp@BhDWtAy)7OQx%@Hrv>3U8UgJbE!UNQ_dDAtC_8i#l3Tq->aOJ%2c0fI>}+4=iM(x)_0#- zo&Gz!HhJUyuoc-cdE1vnRp@W%mYjI-+v-NyrMo>=AHM4Sxz;7Vx8>2acXH?Vbg$fc zCpd0a*WIHct0tEQ?-B7|)nz+#rli_qN&7q3-m`sr>iK|G7VI2GCKiqf_RV%bf)u7* zVFGgCq5=x6wcow77#W#dLeI=EP^p){B=t@A07HNk5Y8_lehh9PO5`uUF!CMOT2o9dWRmH(obddTYb*v6QO(^`p zuLwkrqfqCOu{7ECBYq#!5k)y9?>5H zGr|&{u!mDn2?Pd&6>QNe~ug;FoHEwc?^j@48g5HT8X5gCGOB84Lf21nd^t% zm`AuU`wejnXSmhwAs+>(W^+yni|TX~eCJwM${Ukt-T#D1n1o4~#9xWewJ8#PCB)L< zN_p%8W~aj>Ou{5g!X(;TMZZt6m@mP%00RK-V>GEQK!nl&00009QzpC#L(#))^tRvk~Qw3+^Z*dmFKu7O;iBFqq_Iw(k7o$o~}Cg)BKc8OPk)U zx89vQ%Z$y{OY=&XMDowi5w9(*+$7phEj)KT!2Xg3k4hW!N=y4Vu9L#8mzbDXI0O{l z^GSYR>%7b1{8gVR<#$VC>hCzRM69~0k-qKqnm2YhaMPP`w{47IXByw#?k~?R(s6I1Cu} Xtq&9pKB&YG3{?hCS3j3^P6HnJR#MC+YhVUG zrrUixv)}%Rb1u__h%kf`%@~7BA8?3j5iuatG1LyAZD*`@7=%ImpF4hde@vQr^Pmcq z=!ui6&LD^t+Mx&XKm|IWdk{K?f6oJzn2_e^Rl`itp1Izk6SI{{Fj-E@>q!=*QwX4w zjS0Y(G(wk@?pUKMRVb1`P=yU?iOwm{3BMYL+=e@P`JONcgD?n#XoT=5mgWZ) zs}f@E@Ndl27nr%jAPmAF48kD#dy9U*Vkv)u9{~mcvBf~#J#JsG000002uVdwM6N<$ Eg3KX(kN^Mx delta 339 zcmX@d^qxtvGr-TCmrII^fq{Y7)59eQNE-pM3kMsJJnWK|J5f=+o>9=##WAGf)|=b* zT!#!qj(@aydFkTCzIA=Fd%MFw=*>HR@#@ya$?F5Q{|H{xp>V~^g!4YT;)0CNFRRzr zFPRlw@jiBq!RFu7qu0F6kX~0b(Yf1P-2TrQQK6>}N#Bn9D_(b7xTS%Ck%@(4g43d3 z- z{+hkX>ywR9q5Fs3Vgd>d5W58wDxGRH1r|e{0u%ReJg@mTC<>_Pq*h)(lilB1jq4k_ b8JHQShuAhQe&})w7)}hHu6{1-oD!M<*^-Zd diff --git a/java/res/drawable-mdpi/keyboard_hint_8.9.png b/java/res/drawable-mdpi/keyboard_hint_8.9.png index ea7f512fd6b4e0a7c538ffd9b422623e162f221d..28be2fb8668cca0c06e016bda42490815a269219 100644 GIT binary patch delta 304 zcmV-00nh%S1Iz*;iBL{Q4GJ0x0000DNk~Le0000X0000j2nGNE03ap;6p*KD zjBV}`G_Fy`P=z|InKOSUkz|x|e-nBzgAEKqGOwjGO2Q8uK?^RhWX>w@B>Y)kf(n!& zvFG{zYWXD6COnF1xbDLQ8gK4(#f*|T!j;VrscqQ9Dc5%*JZqmu7tXL?&Q2$$BqSjT zNkmILzG2Rkgd`*(2}wvo5|a3NiSU2=YaTZN1^_M%7sEk=gZcmf002ov22Mn-LSTX; CmV1=| delta 389 zcmX@Zw2)b`Gr-TCmrII^fq{Y7)59eQNE-pM3kMsJJnWK|J5f=+p3&LU#WAGf)|=ak z{f7)Bj(wb#Fd^beE$b7-^oi;Z4;RWacH2~cQz`OzlJZ`&a`uFkfdY&FmUi#YFWs|;TyB*pn122k&NyyI+2X{#0nM)pvfiW<(#h zn-#w{-7nCMz48(F12$QpD;pRXnOHa`m^Uw3>7WF4IYbO7srKcLK3FXL?KhoMckj3F e+4e*K07K)+I5yG!6|%sPW$<+Mb6Mw<&;$ToEu~xl diff --git a/java/res/drawable-mdpi/keyboard_hint_9.9.png b/java/res/drawable-mdpi/keyboard_hint_9.9.png index 0bf85de931823f0cefe4727c2c3e053cdaec786b..731d63b1bf11bc9abf7f9e575943770b2ae3f4ce 100644 GIT binary patch delta 311 zcmV-70m%NL1JeQ_iBL{Q4GJ0x0000DNk~Le0000X0000j2nGNE03ap;6pHG5k*L-qp2N0o6e%rVG<@$9|`I|h9wMx zm#9ae&1C~)c=3Fsl&@va#0=)Je}glu5$TpK(Q*4&cAtQonO>>sAZ~DnEj-}?Z*TgF z*mgbZqQ#{T3z)*5cO`iZEY!kmWNTssD>&r|gieQx2@K$Xz~!fOsC3lsf5Ie8!X!-M zuY}vNpz@gzONZ;CRW~rJ4wEnmlQ0RBsBahj9>uCW34R0^0Ea#{wPC774YmLP002ov JPDHLkV1j(Uf0qCN delta 389 zcmcc2w2)b`Gr-TCmrII^fq{Y7)59eQNE-pM3kMsJJnWK|J5f=+p3&LU#WAGf)|=TI z^9~t^xW4UL*b`~I$>Xa+&@{}uJx^veL2H0=Ur)O^Cq^ds(jDA{PiQaPM)ki zuNK(h=%v{j)MdyQFXt`mew<@`HToxSMf5$J1@6D9;T_<_}7r2L5&Hb(P`t071u}{~i&RCqj>duGCWm#`e zE!7e@T(j%q^|EF2ADxN0HnBJM#I2nt`eFZEoT6usX1 zoBw8ppUvC{nXMcc7+C}$#5^7qT~?JKn8U%Y2N60i_Qrd00~M|G+P}V_=bv53>PP(y a%naJLK~t_wd~Xj7Sq4v6KbLh*2~7ZT=b~)@ From 1bebdcb4e422c0d9e52833dfd3bc0a8b9e07a266 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 24 Sep 2010 15:46:06 +0900 Subject: [PATCH 007/287] Move RingCharBuffer as a singleton in Util Change-Id: I08d09555a99a64038374e62019777d331c48319b --- .../android/inputmethod/latin/LatinIME.java | 4 +- .../inputmethod/latin/LatinIMEUtil.java | 88 +++++++++++++++++++ .../inputmethod/latin/LatinImeLogger.java | 2 +- 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 2c0b80961..696f530d3 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.LatinIMEUtil.RingCharBuffer; import com.android.inputmethod.voice.FieldContext; import com.android.inputmethod.voice.SettingsUtil; import com.android.inputmethod.voice.VoiceInput; @@ -1197,7 +1198,8 @@ public class LatinIME extends InputMethodService if (primaryCode != KEYCODE_ENTER) { mJustAddedAutoSpace = false; } - LatinImeLogger.logOnInputChar((char)primaryCode, x, y); + RingCharBuffer.getInstance().push((char)primaryCode, x, y); + LatinImeLogger.logOnInputChar(); if (isWordSeparator(primaryCode)) { handleSeparator(primaryCode); } else { diff --git a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java index 34b52845e..85ecaee50 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java +++ b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java @@ -80,4 +80,92 @@ public class LatinIMEUtil { return ((InputMethodManager) context.getSystemService( Context.INPUT_METHOD_SERVICE)).getEnabledInputMethodList().size() > 1; } + + /* package */ static class RingCharBuffer { + private static RingCharBuffer sRingCharBuffer = new RingCharBuffer(); + private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC'; + private static final int INVALID_COORDINATE = -2; + /* package */ static final int BUFSIZE = 20; + private Context mContext; + private boolean mEnabled = false; + private int mEnd = 0; + /* package */ int mLength = 0; + private char[] mCharBuf = new char[BUFSIZE]; + private int[] mXBuf = new int[BUFSIZE]; + private int[] mYBuf = new int[BUFSIZE]; + + private RingCharBuffer() { + } + public static RingCharBuffer getInstance() { + return sRingCharBuffer; + } + public static RingCharBuffer init(Context context, boolean enabled) { + sRingCharBuffer.mContext = context; + sRingCharBuffer.mEnabled = enabled; + return sRingCharBuffer; + } + private int normalize(int in) { + int ret = in % BUFSIZE; + return ret < 0 ? ret + BUFSIZE : ret; + } + public void push(char c, int x, int y) { + if (!mEnabled) return; + mCharBuf[mEnd] = c; + mXBuf[mEnd] = x; + mYBuf[mEnd] = y; + mEnd = normalize(mEnd + 1); + if (mLength < BUFSIZE) { + ++mLength; + } + } + public char pop() { + if (mLength < 1) { + return PLACEHOLDER_DELIMITER_CHAR; + } else { + mEnd = normalize(mEnd - 1); + --mLength; + return mCharBuf[mEnd]; + } + } + public char getLastChar() { + if (mLength < 1) { + return PLACEHOLDER_DELIMITER_CHAR; + } else { + return mCharBuf[normalize(mEnd - 1)]; + } + } + public int getPreviousX(char c, int back) { + int index = normalize(mEnd - 2 - back); + if (mLength <= back + || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { + return INVALID_COORDINATE; + } else { + return mXBuf[index]; + } + } + public int getPreviousY(char c, int back) { + int index = normalize(mEnd - 2 - back); + if (mLength <= back + || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { + return INVALID_COORDINATE; + } else { + return mYBuf[index]; + } + } + public String getLastString() { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < mLength; ++i) { + char c = mCharBuf[normalize(mEnd - 1 - i)]; + if (!((LatinIME)mContext).isWordSeparator(c)) { + sb.append(c); + } else { + break; + } + } + return sb.reverse().toString(); + } + public void reset() { + mLength = 0; + } + } } diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 007d0ccdd..6d15d216c 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -50,7 +50,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnDelete() { } - public static void logOnInputChar(char c, int x, int y) { + public static void logOnInputChar() { } public static void logOnException(String metaData, Throwable e) { From 0ae817c9aee319584cbb4df5b1fa74bca684eb06 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 16 Sep 2010 14:54:45 +0900 Subject: [PATCH 008/287] Add enter/exit animation style to prevew and mini keyboard TODO This animation style API of PopupWindow can be called only in Gingrebread or later. We should refactor this using reflection to be able to be compatible with Froyo. Bug: 3004787 Bug: 2973989 Change-Id: I2abfcc853b1a0af2bccee7bdf5fbd723456b7d34 --- java/res/anim/key_preview_fadein.xml | 29 +++++++++++++++++++ java/res/anim/key_preview_fadeout.xml | 29 +++++++++++++++++++ java/res/anim/mini_keyboard_fadein.xml | 29 +++++++++++++++++++ java/res/anim/mini_keyboard_fadeout.xml | 29 +++++++++++++++++++ java/res/values/config.xml | 28 ++++++++++++++++++ java/res/values/styles.xml | 8 +++++ .../latin/LatinKeyboardBaseView.java | 27 ++++++++--------- 7 files changed, 166 insertions(+), 13 deletions(-) create mode 100644 java/res/anim/key_preview_fadein.xml create mode 100644 java/res/anim/key_preview_fadeout.xml create mode 100644 java/res/anim/mini_keyboard_fadein.xml create mode 100644 java/res/anim/mini_keyboard_fadeout.xml create mode 100644 java/res/values/config.xml diff --git a/java/res/anim/key_preview_fadein.xml b/java/res/anim/key_preview_fadein.xml new file mode 100644 index 000000000..9fad7b9a7 --- /dev/null +++ b/java/res/anim/key_preview_fadein.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/java/res/anim/key_preview_fadeout.xml b/java/res/anim/key_preview_fadeout.xml new file mode 100644 index 000000000..7de5123cd --- /dev/null +++ b/java/res/anim/key_preview_fadeout.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/java/res/anim/mini_keyboard_fadein.xml b/java/res/anim/mini_keyboard_fadein.xml new file mode 100644 index 000000000..9fad7b9a7 --- /dev/null +++ b/java/res/anim/mini_keyboard_fadein.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/java/res/anim/mini_keyboard_fadeout.xml b/java/res/anim/mini_keyboard_fadeout.xml new file mode 100644 index 000000000..7de5123cd --- /dev/null +++ b/java/res/anim/mini_keyboard_fadeout.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/java/res/values/config.xml b/java/res/values/config.xml new file mode 100644 index 000000000..6e941baaf --- /dev/null +++ b/java/res/values/config.xml @@ -0,0 +1,28 @@ + + + + + 0 + 10 + 0 + 90 + 0 + 100 + diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index 60fffe873..5e239482f 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -33,4 +33,12 @@ 0.5 white + + diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index eeccb965c..3761dab14 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -154,8 +154,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } // Timing constants - private static final int DELAY_BEFORE_PREVIEW = 0; - private static final int DELAY_AFTER_PREVIEW = 100; private static final int REPEAT_INTERVAL = PointerTracker.REPEAT_INTERVAL; // Miscellaneous constants @@ -194,6 +192,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private int mPopupPreviewOffsetY; private int mWindowY; private int mPopupPreviewDisplayedY; + private final int mDelayBeforePreview; + private final int mDelayAfterPreview; // Popup mini keyboard private PopupWindow mMiniKeyboardPopup; @@ -255,7 +255,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx showKey(msg.arg1, (PointerTracker)msg.obj); break; case MSG_DISMISS_PREVIEW: - mPreviewText.setVisibility(INVISIBLE); + mPreviewPopup.dismiss(); break; case MSG_REPEAT_KEY: { final PointerTracker tracker = (PointerTracker)msg.obj; @@ -460,6 +460,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } } + final Resources res = getResources(); + mPreviewPopup = new PopupWindow(context); if (previewLayout != 0) { mPreviewText = (TextView) inflate.inflate(previewLayout, null); @@ -470,10 +472,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mShowPreview = false; } mPreviewPopup.setTouchable(false); - mMiniKeyboardParent = this; + mPreviewPopup.setAnimationStyle(R.style.KeyPreviewAnimation); + mDelayBeforePreview = res.getInteger(R.integer.config_delay_before_preview); + mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview); + mMiniKeyboardParent = this; mMiniKeyboardPopup = new PopupWindow(context); mMiniKeyboardPopup.setBackgroundDrawable(null); + mMiniKeyboardPopup.setAnimationStyle(R.style.MiniKeyboardAnimation); mPaint = new Paint(); mPaint.setAntiAlias(true); @@ -485,7 +491,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mMiniKeyboardCache = new HashMap(); mKeyBackground.getPadding(mPadding); - final Resources res = getResources(); mSwipeThreshold = (int) (500 * res.getDisplayMetrics().density); // TODO: Refer frameworks/base/core/res/res/values/config.xml mDisambiguateSwipe = res.getBoolean(R.bool.config_swipeDisambiguation); @@ -657,9 +662,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx public void setPopupOffset(int x, int y) { mPopupPreviewOffsetX = x; mPopupPreviewOffsetY = y; - if (mPreviewPopup.isShowing()) { - mPreviewPopup.dismiss(); - } + mPreviewPopup.dismiss(); } /** @@ -895,9 +898,9 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx || (hidePreviewOrShowSpaceKeyPreview && isLanguageSwitchEnabled))) { if (keyIndex == NOT_A_KEY) { mHandler.cancelPopupPreview(); - mHandler.dismissPreview(DELAY_AFTER_PREVIEW); + mHandler.dismissPreview(mDelayAfterPreview); } else if (tracker != null) { - mHandler.popupPreview(DELAY_BEFORE_PREVIEW, keyIndex, tracker); + mHandler.popupPreview(mDelayBeforePreview, keyIndex, tracker); } } } @@ -1375,9 +1378,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } public void closing() { - if (mPreviewPopup.isShowing()) { - mPreviewPopup.dismiss(); - } + mPreviewPopup.dismiss(); mHandler.cancelAllMessages(); dismissPopupKeyboard(); From 336bc6bfebe8f965572682e5d5f1d66829ee7e17 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Thu, 16 Sep 2010 19:14:13 +0900 Subject: [PATCH 009/287] Keep addWordToDictionary from doing disk I/O on main thread bug: 2999524 Change-Id: Id8b04d38079cfa1dadd5955eb7f83085e60eb8e2 --- .../com/android/inputmethod/latin/UserDictionary.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java index 3315cf6c9..49b95e9aa 100644 --- a/java/src/com/android/inputmethod/latin/UserDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserDictionary.java @@ -89,13 +89,19 @@ public class UserDictionary extends ExpandableDictionary { super.addWord(word, frequency); // Update the user dictionary provider - ContentValues values = new ContentValues(5); + final ContentValues values = new ContentValues(5); values.put(Words.WORD, word); values.put(Words.FREQUENCY, frequency); values.put(Words.LOCALE, mLocale); values.put(Words.APP_ID, 0); - getContext().getContentResolver().insert(Words.CONTENT_URI, values); + final ContentResolver contentResolver = getContext().getContentResolver(); + new Thread("addWord") { + public void run() { + contentResolver.insert(Words.CONTENT_URI, values); + } + }.start(); + // In case the above does a synchronous callback of the change observer setRequiresReload(false); } From 5deb1678b2c6290956757dc97e566dea7f43f96a Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 24 Sep 2010 10:26:49 -0700 Subject: [PATCH 010/287] Import revised translations. DO NOT MERGE Change-Id: I1bf6a9e39adbe7d8e938f6dd5fe12227f8da4053 --- java/res/values-cs/strings.xml | 21 +++++++++++++++++++-- java/res/values-da/strings.xml | 21 +++++++++++++++++++-- java/res/values-de/strings.xml | 21 +++++++++++++++++++-- java/res/values-el/strings.xml | 21 +++++++++++++++++++-- java/res/values-es-rUS/strings.xml | 21 +++++++++++++++++++-- java/res/values-es/strings.xml | 21 +++++++++++++++++++-- java/res/values-fr/strings.xml | 21 +++++++++++++++++++-- java/res/values-it/strings.xml | 21 +++++++++++++++++++-- java/res/values-ja/strings.xml | 21 +++++++++++++++++++-- java/res/values-ko/strings.xml | 21 +++++++++++++++++++-- java/res/values-nb/strings.xml | 21 +++++++++++++++++++-- java/res/values-nl/strings.xml | 21 +++++++++++++++++++-- java/res/values-pl/strings.xml | 21 +++++++++++++++++++-- java/res/values-pt-rPT/strings.xml | 21 +++++++++++++++++++-- java/res/values-pt/strings.xml | 21 +++++++++++++++++++-- java/res/values-ru/strings.xml | 21 +++++++++++++++++++-- java/res/values-sv/strings.xml | 21 +++++++++++++++++++-- java/res/values-tr/strings.xml | 21 +++++++++++++++++++-- java/res/values-zh-rCN/strings.xml | 21 +++++++++++++++++++-- java/res/values-zh-rTW/strings.xml | 21 +++++++++++++++++++-- 20 files changed, 380 insertions(+), 40 deletions(-) diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index b398ce80d..497e0b8c6 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Klávesnice Android" "Nastavení klávesnice Android" + + "Při stisku klávesy vibrovat" "Zvuk při stisku klávesy" @@ -48,6 +50,17 @@ "Zobrazovat navržená slova během psaní" "Automatické dokončování" "Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo." + + + + + + + + + + + "Návrh Bigram" "Použít předchozí slovo ke zlepšení návrhu" @@ -118,6 +131,8 @@ ".org" ".net" ".eu" + + "Vstupní jazyky" "Jazyk můžete změnit posunutím prstu po mezerníku." "← Uložte slovo opětovným klepnutím" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 0751c67db..191f432c2 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-tastatur" "Indstillinger for Android-tastatur" + + "Vibration ved tastetryk" "Lyd ved tastetryk" @@ -48,6 +50,17 @@ "Vis ordforslag under indtastning" "Udfyld automatisk" "Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord" + + + + + + + + + + + "Bigram-forslag" "Brug forrige ord for at forbedre forslag" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Inputsprog" "Træk fingeren på mellemrumstasten for at skifte sprog" "← Tast igen for at gemme" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index a7be8fd34..5b8352d26 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-Tastatur" "Android-Tastatureinstellungen" + + "Vibrieren b. Tastendruck" "Ton bei Tastendruck" @@ -48,6 +50,17 @@ "Vorgeschlagene Wörter während des Tippens anzeigen" "Autom. vervollständigen" "Leertaste und Interpunktion fügen autom. ein markiertes Wort ein" + + + + + + + + + + + "Bigramm-Vorschläge" "Zur Verbesserung des Vorschlags vorheriges Wort verwenden" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Eingabesprachen" "Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln" "← Zum Speichern erneut tippen" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 6e6f3a754..7d4d7dd61 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Πληκτρολόγιο Android" "Ρυθμίσεις πληκτρολογίου Android" + + "Δόνηση κατά το πάτημα πλήκτρων" "Ήχος κατά το πάτημα πλήκτρων" @@ -48,6 +50,17 @@ "Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση" "Αυτόματη συμπλήρωση" "Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη" + + + + + + + + + + + "Προτάσεις bigram" "Χρήση προηγούμενης λέξης για τη βελτίωση πρότασης" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Γλώσσες εισόδου" "Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα" "← Πατήστε ξανά για αποθήκευση" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 54ec3b94c..e5c937f1a 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado de Android" "Configuración de teclado de Android" + + "Vibrar al pulsar teclas" "Sonar al pulsar las teclas" @@ -48,6 +50,17 @@ "Mostrar palabras sugeridas mientras escribe" "Completar automát." "La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada." + + + + + + + + + + + "Sugerencias de Vigoran" "Utiliza la palabra anterior para mejorar la sugerencia" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Idiomas de entrada" "Deslizarse manualmente por la barra espaciadora para cambiar el idioma" "← Presionar nuevamente para guardar" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index fe8578bc0..d5be1351b 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado de Android" "Ajustes del teclado de Android" + + "Vibrar al pulsar tecla" "Sonido al pulsar tecla" @@ -48,6 +50,17 @@ "Muestra las palabras sugeridas mientras se escribe." "Autocompletar" "La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada." + + + + + + + + + + + "Sugerencias de bigramas" "Usar palabra anterior para mejorar sugerencias" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Idiomas" "Deslizar el dedo por la barra espaciadora para cambiar el idioma" "← Volver a tocar para guardar" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index f5d18edf4..ef5a70884 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Clavier Android" "Paramètres du clavier Android" + + "Vibrer à chaque touche" "Son à chaque touche" @@ -48,6 +50,17 @@ "Afficher les suggestions de terme lors de la saisie" "Saisie semi-automatique" "Insérer auto. le terme surligné avec barre espace/ponctuation" + + + + + + + + + + + "Suggestions de type bigramme" "Améliorer la suggestion en fonction du mot précédent" @@ -118,6 +131,8 @@ ".org" ".gouv" ".edu" + + "Langues de saisie" "Faites glisser votre doigt sur la barre d\'espacement pour changer la langue." "← Appuyer de nouveau pour enregistrer" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index f710ca7fe..1f213fc05 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tastiera Android" "Impostazioni tastiera Android" + + "Vibrazione tasti" "Suono tasti" @@ -48,6 +50,17 @@ "Visualizza le parole suggerite durante la digitazione" "Completamento autom." "Barra spaziatrice e punteggiatura inseriscono la parola evidenziata" + + + + + + + + + + + "Suggerimenti sui bigrammi" "Utilizza parola precedente per migliorare il suggerimento" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Lingue comandi" "Scorri il dito sulla barra spaziatrice per cambiare la lingua" "← Tocca di nuovo per salvare" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index e2d6e2629..5a9e053cb 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Androidキーボード" "Androidキーボードの設定" + + "キー操作バイブ" "キー操作音" @@ -48,6 +50,17 @@ "入力時に入力候補を表示する" "オートコンプリート" "反転表示されている変換候補をスペースまたは句読点キーで挿入する" + + + + + + + + + + + "バイグラム入力候補表示" "直前の単語から入力候補を予測します" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "入力言語" "スペースバーで指をスライドさせて言語を変更する" "←保存するにはもう一度タップ" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 1e06e15ec..c6b66d00a 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 키보드" "Android 키보드 설정" + + "키를 누를 때 진동 발생" "키를 누를 때 소리 발생" @@ -48,6 +50,17 @@ "글자를 입력하는 동안 추천 단어를 표시" "자동 완성" "스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입" + + + + + + + + + + + "Bigram 추천" "이전 단어를 사용하여 추천 기능 개선" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "입력 언어" "손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경" "← 저장하려면 다시 누르세요." @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 5666521e4..0f33dd26f 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Skjermtastatur" "Innstillinger for skjermtastatur" + + "Vibrer ved tastetrykk" "Lyd ved tastetrykk" @@ -48,6 +50,17 @@ "Vis foreslåtte ord under skriving" "Autofullføring" "Mellomrom og punktum setter automatisk inn valgt ord" + + + + + + + + + + + "Bigram-forslag" "Bruk forrige ord til å forbedre forslaget" @@ -118,6 +131,8 @@ ".net" ".org" ".info" + + "Inndataspråk" "Dra fingeren på mellomromstasten for å endre språk" "← Trykk på nytt for å lagre" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index b45587d72..59eccd88e 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-toetsenbord" "Instellingen voor Android-toetsenbord" + + "Trillen bij druk op toets" "Geluid bij druk op een toets" @@ -48,6 +50,17 @@ "Voorgestelde woorden weergeven tijdens typen" "Auto-aanvullen" "Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie" + + + + + + + + + + + "Digram-suggesties" "Vorig woord gebruiken om suggestie te verbeteren" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Invoertalen" "Schuif uw vinger over de spatiebalk om de taal te wijzigen" "← Tik nogmaals om op te slaan" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 6417cd94a..2335858fd 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Klawiatura Android" "Ustawienia klawiatury Android" + + "Wibracja przy naciśnięciu" "Dźwięk przy naciśnięciu" @@ -48,6 +50,17 @@ "Wyświetl sugerowane słowa podczas wpisywania" "Autouzupełnianie" "Spacja i znaki przestankowe wstawiają wyróżnione słowo" + + + + + + + + + + + "Sugestie dla bigramów" "Używaj poprzedniego wyrazu, aby polepszyć sugestię" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Języki wprowadzania" "Przesuń palcem po spacji, aby zmienić język" "← Dotknij ponownie, aby zapisać" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 63259bc5e..473e9ada3 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado do Android" "Definições de teclado do Android" + + "Vibrar ao primir as teclas" "Som ao premir as teclas" @@ -48,6 +50,17 @@ "Apresentar sugestões de palavras ao escrever" "Conclusão automática" "A barra de espaços e a pontuação inserem automaticamente uma palavra realçada" + + + + + + + + + + + "Sugestões Bigram" "Utilizar a palavra anterior para melhorar a sugestão" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Idiomas de entrada" "Deslize o dedo pela barra de espaço para alterar o idioma" "← Toque novamente para guardar" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 734dc9cd5..4b998893c 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado Android" "Configurações de teclado Android" + + "Vibrar ao tocar a tecla" "Som ao tocar a tecla" @@ -48,6 +50,17 @@ "Exibir sugestões de palavras durante a digitação" "Conclusão automática" "Barra de espaço e pontuação inserem a palavra destacada" + + + + + + + + + + + "Sugestões de bigrama" "Usar palavra anterior para melhorar a sugestão" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Idiomas de entrada" "Deslize o dedo na barra de espaços para alterar o idioma" "← Toque novamente para salvar" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 11371f8b1..98b36ed4d 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Клавиатура Android" "Настройки клавиатуры Android" + + "Виброотклик клавиш" "Звук клавиш" @@ -48,6 +50,17 @@ "Предлагать варианты слов во время ввода" "Автозавершение" "При нажатии пробела вставлять предложенное слово" + + + + + + + + + + + "Биграммные подсказки " "Используйте предыдущее слово, чтобы исправить подсказку" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Языки ввода" "Для изменения языка проведите пальцем по пробелу" "← Нажмите повторно, чтобы сохранить" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 44ae2697d..6b7ffd9e8 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Androids tangentbord" "Inställningar för Androids tangentbord" + + "Vibrera vid tangenttryck" "Knappljud" @@ -48,6 +50,17 @@ "Visar ordförslag när du skriver" "Komplettera automatiskt" "Blanksteg och punkt infogar automatiskt markerat ord" + + + + + + + + + + + "Bigramförslag" "Förbättra förslaget med föregående ord" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Inmatningsspråk" "Dra med fingret på blanksteg om du vill ändra språk" "← Peka igen för att spara" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index d5ed22597..e0ec09445 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android klavyesi" "Android klavye ayarları" + + "Tuşa basıldığında titret" "Tuşa basıldığında ses çıkar" @@ -48,6 +50,17 @@ "Yazarken önerilen kelimeleri görüntüle" "Otomatik tamamla" "Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler" + + + + + + + + + + + "Bigram Önerileri" "Öneriyi geliştirmek için önceki kelimeyi kullanın" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Giriş dilleri" "Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın" "← Kaydetmek için tekrar dokunun" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 3cfd59996..b8973b220 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 键盘" "Android 键盘设置" + + "按键时振动" "按键时播放音效" @@ -48,6 +50,17 @@ "输入时启用联想提示" "自动填写" "按空格键和标点符号时自动插入突出显示的字词" + + + + + + + + + + + "双连词建议" "使用以前的字词改进建议" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "输入语言" "在空格键上滑动手指可更改语言" "← 再次点按即可保存" @@ -126,9 +141,11 @@ - + - + + + diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 3f9781154..d9e0dacaf 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 鍵盤" "Android 鍵盤設定" + + "按鍵時震動" "按鍵時播放音效" @@ -48,6 +50,17 @@ "打字時顯示建議字詞" "自動完成" "在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤" + + + + + + + + + + + "雙連詞建議" "根據前一個字詞自動找出更適合的建議" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "輸入語言" "以手指在空白鍵上滑動可變更語言" "← 再次輕按可儲存" @@ -126,9 +141,11 @@ - + - + + + From 30dd9b5d48255177e0e025334625e5e4fb585b23 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 24 Sep 2010 12:28:30 -0700 Subject: [PATCH 011/287] Import revised translations. Change-Id: I38532015c089c0a5c6c1b98fe44f282918aebe5e --- java/res/values-cs/strings.xml | 19 +++++++++++++++++++ java/res/values-da/strings.xml | 19 +++++++++++++++++++ java/res/values-de/strings.xml | 19 +++++++++++++++++++ java/res/values-el/strings.xml | 19 +++++++++++++++++++ java/res/values-es-rUS/strings.xml | 19 +++++++++++++++++++ java/res/values-es/strings.xml | 19 +++++++++++++++++++ java/res/values-fr/strings.xml | 19 +++++++++++++++++++ java/res/values-it/strings.xml | 19 +++++++++++++++++++ java/res/values-ja/strings.xml | 19 +++++++++++++++++++ java/res/values-ko/strings.xml | 19 +++++++++++++++++++ java/res/values-nb/strings.xml | 19 +++++++++++++++++++ java/res/values-nl/strings.xml | 19 +++++++++++++++++++ java/res/values-pl/strings.xml | 19 +++++++++++++++++++ java/res/values-pt-rPT/strings.xml | 19 +++++++++++++++++++ java/res/values-pt/strings.xml | 19 +++++++++++++++++++ java/res/values-rm/strings.xml | 19 +++++++++++++++++++ java/res/values-ru/strings.xml | 19 +++++++++++++++++++ java/res/values-sv/strings.xml | 19 +++++++++++++++++++ java/res/values-tr/strings.xml | 19 +++++++++++++++++++ java/res/values-zh-rCN/strings.xml | 19 +++++++++++++++++++ java/res/values-zh-rTW/strings.xml | 19 +++++++++++++++++++ 21 files changed, 399 insertions(+) diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 29b0faf77..497e0b8c6 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Klávesnice Android" "Nastavení klávesnice Android" + + "Při stisku klávesy vibrovat" "Zvuk při stisku klávesy" @@ -48,6 +50,17 @@ "Zobrazovat navržená slova během psaní" "Automatické dokončování" "Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo." + + + + + + + + + + + "Návrh Bigram" "Použít předchozí slovo ke zlepšení návrhu" @@ -118,6 +131,8 @@ ".org" ".net" ".eu" + + "Vstupní jazyky" "Jazyk můžete změnit posunutím prstu po mezerníku." "← Uložte slovo opětovným klepnutím" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 47397e103..191f432c2 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-tastatur" "Indstillinger for Android-tastatur" + + "Vibration ved tastetryk" "Lyd ved tastetryk" @@ -48,6 +50,17 @@ "Vis ordforslag under indtastning" "Udfyld automatisk" "Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord" + + + + + + + + + + + "Bigram-forslag" "Brug forrige ord for at forbedre forslag" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Inputsprog" "Træk fingeren på mellemrumstasten for at skifte sprog" "← Tast igen for at gemme" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 3353e5651..5b8352d26 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-Tastatur" "Android-Tastatureinstellungen" + + "Vibrieren b. Tastendruck" "Ton bei Tastendruck" @@ -48,6 +50,17 @@ "Vorgeschlagene Wörter während des Tippens anzeigen" "Autom. vervollständigen" "Leertaste und Interpunktion fügen autom. ein markiertes Wort ein" + + + + + + + + + + + "Bigramm-Vorschläge" "Zur Verbesserung des Vorschlags vorheriges Wort verwenden" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Eingabesprachen" "Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln" "← Zum Speichern erneut tippen" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index fd2e02a14..7d4d7dd61 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Πληκτρολόγιο Android" "Ρυθμίσεις πληκτρολογίου Android" + + "Δόνηση κατά το πάτημα πλήκτρων" "Ήχος κατά το πάτημα πλήκτρων" @@ -48,6 +50,17 @@ "Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση" "Αυτόματη συμπλήρωση" "Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη" + + + + + + + + + + + "Προτάσεις bigram" "Χρήση προηγούμενης λέξης για τη βελτίωση πρότασης" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Γλώσσες εισόδου" "Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα" "← Πατήστε ξανά για αποθήκευση" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 27589fb44..e5c937f1a 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado de Android" "Configuración de teclado de Android" + + "Vibrar al pulsar teclas" "Sonar al pulsar las teclas" @@ -48,6 +50,17 @@ "Mostrar palabras sugeridas mientras escribe" "Completar automát." "La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada." + + + + + + + + + + + "Sugerencias de Vigoran" "Utiliza la palabra anterior para mejorar la sugerencia" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Idiomas de entrada" "Deslizarse manualmente por la barra espaciadora para cambiar el idioma" "← Presionar nuevamente para guardar" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index e5c69e47f..d5be1351b 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado de Android" "Ajustes del teclado de Android" + + "Vibrar al pulsar tecla" "Sonido al pulsar tecla" @@ -48,6 +50,17 @@ "Muestra las palabras sugeridas mientras se escribe." "Autocompletar" "La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada." + + + + + + + + + + + "Sugerencias de bigramas" "Usar palabra anterior para mejorar sugerencias" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Idiomas" "Deslizar el dedo por la barra espaciadora para cambiar el idioma" "← Volver a tocar para guardar" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 9d4d1be0d..ef5a70884 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Clavier Android" "Paramètres du clavier Android" + + "Vibrer à chaque touche" "Son à chaque touche" @@ -48,6 +50,17 @@ "Afficher les suggestions de terme lors de la saisie" "Saisie semi-automatique" "Insérer auto. le terme surligné avec barre espace/ponctuation" + + + + + + + + + + + "Suggestions de type bigramme" "Améliorer la suggestion en fonction du mot précédent" @@ -118,6 +131,8 @@ ".org" ".gouv" ".edu" + + "Langues de saisie" "Faites glisser votre doigt sur la barre d\'espacement pour changer la langue." "← Appuyer de nouveau pour enregistrer" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 30cb2a3a6..1f213fc05 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tastiera Android" "Impostazioni tastiera Android" + + "Vibrazione tasti" "Suono tasti" @@ -48,6 +50,17 @@ "Visualizza le parole suggerite durante la digitazione" "Completamento autom." "Barra spaziatrice e punteggiatura inseriscono la parola evidenziata" + + + + + + + + + + + "Suggerimenti sui bigrammi" "Utilizza parola precedente per migliorare il suggerimento" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Lingue comandi" "Scorri il dito sulla barra spaziatrice per cambiare la lingua" "← Tocca di nuovo per salvare" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 6a5d643e8..5a9e053cb 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Androidキーボード" "Androidキーボードの設定" + + "キー操作バイブ" "キー操作音" @@ -48,6 +50,17 @@ "入力時に入力候補を表示する" "オートコンプリート" "反転表示されている変換候補をスペースまたは句読点キーで挿入する" + + + + + + + + + + + "バイグラム入力候補表示" "直前の単語から入力候補を予測します" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "入力言語" "スペースバーで指をスライドさせて言語を変更する" "←保存するにはもう一度タップ" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index cf9ebc8d8..c6b66d00a 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 키보드" "Android 키보드 설정" + + "키를 누를 때 진동 발생" "키를 누를 때 소리 발생" @@ -48,6 +50,17 @@ "글자를 입력하는 동안 추천 단어를 표시" "자동 완성" "스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입" + + + + + + + + + + + "Bigram 추천" "이전 단어를 사용하여 추천 기능 개선" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "입력 언어" "손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경" "← 저장하려면 다시 누르세요." @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index be0dcebaa..0f33dd26f 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Skjermtastatur" "Innstillinger for skjermtastatur" + + "Vibrer ved tastetrykk" "Lyd ved tastetrykk" @@ -48,6 +50,17 @@ "Vis foreslåtte ord under skriving" "Autofullføring" "Mellomrom og punktum setter automatisk inn valgt ord" + + + + + + + + + + + "Bigram-forslag" "Bruk forrige ord til å forbedre forslaget" @@ -118,6 +131,8 @@ ".net" ".org" ".info" + + "Inndataspråk" "Dra fingeren på mellomromstasten for å endre språk" "← Trykk på nytt for å lagre" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index afc66af08..59eccd88e 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-toetsenbord" "Instellingen voor Android-toetsenbord" + + "Trillen bij druk op toets" "Geluid bij druk op een toets" @@ -48,6 +50,17 @@ "Voorgestelde woorden weergeven tijdens typen" "Auto-aanvullen" "Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie" + + + + + + + + + + + "Digram-suggesties" "Vorig woord gebruiken om suggestie te verbeteren" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Invoertalen" "Schuif uw vinger over de spatiebalk om de taal te wijzigen" "← Tik nogmaals om op te slaan" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 1a2715b80..2335858fd 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Klawiatura Android" "Ustawienia klawiatury Android" + + "Wibracja przy naciśnięciu" "Dźwięk przy naciśnięciu" @@ -48,6 +50,17 @@ "Wyświetl sugerowane słowa podczas wpisywania" "Autouzupełnianie" "Spacja i znaki przestankowe wstawiają wyróżnione słowo" + + + + + + + + + + + "Sugestie dla bigramów" "Używaj poprzedniego wyrazu, aby polepszyć sugestię" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Języki wprowadzania" "Przesuń palcem po spacji, aby zmienić język" "← Dotknij ponownie, aby zapisać" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 886dd67c3..473e9ada3 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado do Android" "Definições de teclado do Android" + + "Vibrar ao primir as teclas" "Som ao premir as teclas" @@ -48,6 +50,17 @@ "Apresentar sugestões de palavras ao escrever" "Conclusão automática" "A barra de espaços e a pontuação inserem automaticamente uma palavra realçada" + + + + + + + + + + + "Sugestões Bigram" "Utilizar a palavra anterior para melhorar a sugestão" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Idiomas de entrada" "Deslize o dedo pela barra de espaço para alterar o idioma" "← Toque novamente para guardar" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index ee1340aba..4b998893c 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado Android" "Configurações de teclado Android" + + "Vibrar ao tocar a tecla" "Som ao tocar a tecla" @@ -48,6 +50,17 @@ "Exibir sugestões de palavras durante a digitação" "Conclusão automática" "Barra de espaço e pontuação inserem a palavra destacada" + + + + + + + + + + + "Sugestões de bigrama" "Usar palavra anterior para melhorar a sugestão" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Idiomas de entrada" "Deslize o dedo na barra de espaços para alterar o idioma" "← Toque novamente para salvar" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index 08c397202..da7b3a111 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tastatura Android" "Parameters da la tastatura Android" + + "Vibrar cun smatgar in buttun" "Tun cun smatgar in buttun" @@ -48,6 +50,17 @@ "Mussar pleds proponids durant l\'endataziun" "Cumplettaziun automatica" "Inserir auto. il pled marcà cun la tasta da vid/interpuncziun" + + + + + + + + + + + @@ -120,6 +133,8 @@ ".org" ".gov" ".edu" + + "Linguas da cumonds vocals" "Stritgar cun il det sur la tasta da vid per midar la lingua" "← Tippar danovamain per memorisar" @@ -128,6 +143,10 @@ + + + + diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index f225bee46..98b36ed4d 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Клавиатура Android" "Настройки клавиатуры Android" + + "Виброотклик клавиш" "Звук клавиш" @@ -48,6 +50,17 @@ "Предлагать варианты слов во время ввода" "Автозавершение" "При нажатии пробела вставлять предложенное слово" + + + + + + + + + + + "Биграммные подсказки " "Используйте предыдущее слово, чтобы исправить подсказку" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Языки ввода" "Для изменения языка проведите пальцем по пробелу" "← Нажмите повторно, чтобы сохранить" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 5652ee479..6b7ffd9e8 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Androids tangentbord" "Inställningar för Androids tangentbord" + + "Vibrera vid tangenttryck" "Knappljud" @@ -48,6 +50,17 @@ "Visar ordförslag när du skriver" "Komplettera automatiskt" "Blanksteg och punkt infogar automatiskt markerat ord" + + + + + + + + + + + "Bigramförslag" "Förbättra förslaget med föregående ord" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Inmatningsspråk" "Dra med fingret på blanksteg om du vill ändra språk" "← Peka igen för att spara" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 6d6b48388..e0ec09445 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android klavyesi" "Android klavye ayarları" + + "Tuşa basıldığında titret" "Tuşa basıldığında ses çıkar" @@ -48,6 +50,17 @@ "Yazarken önerilen kelimeleri görüntüle" "Otomatik tamamla" "Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler" + + + + + + + + + + + "Bigram Önerileri" "Öneriyi geliştirmek için önceki kelimeyi kullanın" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "Giriş dilleri" "Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın" "← Kaydetmek için tekrar dokunun" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 8e49da897..b8973b220 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 键盘" "Android 键盘设置" + + "按键时振动" "按键时播放音效" @@ -48,6 +50,17 @@ "输入时启用联想提示" "自动填写" "按空格键和标点符号时自动插入突出显示的字词" + + + + + + + + + + + "双连词建议" "使用以前的字词改进建议" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "输入语言" "在空格键上滑动手指可更改语言" "← 再次点按即可保存" @@ -126,6 +141,10 @@ + + + + diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index a9d37998a..d9e0dacaf 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -22,6 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 鍵盤" "Android 鍵盤設定" + + "按鍵時震動" "按鍵時播放音效" @@ -48,6 +50,17 @@ "打字時顯示建議字詞" "自動完成" "在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤" + + + + + + + + + + + "雙連詞建議" "根據前一個字詞自動找出更適合的建議" @@ -118,6 +131,8 @@ ".org" ".gov" ".edu" + + "輸入語言" "以手指在空白鍵上滑動可變更語言" "← 再次輕按可儲存" @@ -126,6 +141,10 @@ + + + + From bf96661d33d0126adb60a48880ceba1ff055d4a4 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 27 Sep 2010 12:55:21 +0900 Subject: [PATCH 012/287] Add Debug Settings Activity Bug:3033472 Change-Id: I311c66ac3c612a30d7da3be8ee35a352f49016ac --- java/AndroidManifest.xml | 6 ++ java/res/values/strings.xml | 4 + java/res/xml/prefs.xml | 16 ---- java/res/xml/prefs_for_debug.xml | 45 +++++++++++ .../android/inputmethod/latin/LatinIME.java | 7 +- .../latin/LatinIMEDebugSettings.java | 75 +++++++++++++++++++ .../inputmethod/latin/LatinIMESettings.java | 35 --------- 7 files changed, 136 insertions(+), 52 deletions(-) create mode 100644 java/res/xml/prefs_for_debug.xml create mode 100644 java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 642c717d3..b1e5ec6f6 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -26,6 +26,12 @@ + + + + + + diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 56dceef2d..17921ff33 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -372,4 +372,8 @@ keyboard voice + + + Android keyboard Debug settings + Debug Mode diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index a554ad27b..7bcf19334 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -51,14 +51,6 @@ android:defaultValue="true" /> - - - + + + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 696f530d3..4729585f6 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -40,6 +40,7 @@ import android.os.Debug; import android.os.Handler; import android.os.Message; import android.os.SystemClock; +import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.speech.SpeechRecognizer; import android.text.ClipboardManager; @@ -2399,7 +2400,11 @@ public class LatinIME extends InputMethodService launchSettings(LatinIMESettings.class); } - protected void launchSettings(Class settingsClass) { + public void launchDebugSettings() { + launchSettings(LatinIMEDebugSettings.class); + } + + protected void launchSettings (Class settingsClass) { handleClose(); Intent intent = new Intent(); intent.setClass(LatinIME.this, settingsClass); diff --git a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java b/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java new file mode 100644 index 000000000..cba1a0af9 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.PreferenceActivity; +import android.util.Log; + +public class LatinIMEDebugSettings extends PreferenceActivity + implements SharedPreferences.OnSharedPreferenceChangeListener { + + private static final String TAG = "LatinIMEDebugSettings"; + private static final String DEBUG_MODE_KEY = "debug_mode"; + + private CheckBoxPreference mDebugMode; + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + addPreferencesFromResource(R.xml.prefs_for_debug); + SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); + prefs.registerOnSharedPreferenceChangeListener(this); + + mDebugMode = (CheckBoxPreference) findPreference(DEBUG_MODE_KEY); + updateDebugMode(); + } + + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + if (key.equals(DEBUG_MODE_KEY)) { + if (mDebugMode != null) { + mDebugMode.setChecked(prefs.getBoolean(DEBUG_MODE_KEY, false)); + updateDebugMode(); + } + } + } + + private void updateDebugMode() { + if (mDebugMode == null) { + return; + } + boolean isDebugMode = mDebugMode.isChecked(); + String version = ""; + try { + PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); + version = "Version " + info.versionName; + } catch (NameNotFoundException e) { + Log.e(TAG, "Could not find version info."); + } + if (!isDebugMode) { + mDebugMode.setTitle(version); + mDebugMode.setSummary(""); + } else { + mDebugMode.setTitle(getResources().getString(R.string.prefs_debug_mode)); + mDebugMode.setSummary(version); + } + } +} diff --git a/java/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java index f9534d265..ffff33da2 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java +++ b/java/src/com/android/inputmethod/latin/LatinIMESettings.java @@ -24,8 +24,6 @@ import android.app.Dialog; import android.app.backup.BackupManager; import android.content.DialogInterface; import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; @@ -45,7 +43,6 @@ public class LatinIMESettings extends PreferenceActivity private static final String QUICK_FIXES_KEY = "quick_fixes"; private static final String PREDICTION_SETTINGS_KEY = "prediction_settings"; private static final String VOICE_SETTINGS_KEY = "voice_mode"; - private static final String DEBUG_MODE_KEY = "debug_mode"; /* package */ static final String PREF_SETTINGS_KEY = "settings_key"; private static final String TAG = "LatinIMESettings"; @@ -54,7 +51,6 @@ public class LatinIMESettings extends PreferenceActivity private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; private CheckBoxPreference mQuickFixes; - private CheckBoxPreference mDebugMode; private ListPreference mVoicePreference; private ListPreference mSettingsKeyPreference; private boolean mVoiceOn; @@ -77,9 +73,6 @@ public class LatinIMESettings extends PreferenceActivity mVoiceModeOff = getString(R.string.voice_mode_off); mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); mLogger = VoiceInputLogger.getLogger(this); - - mDebugMode = (CheckBoxPreference) findPreference(DEBUG_MODE_KEY); - updateDebugMode(); } @Override @@ -114,11 +107,6 @@ public class LatinIMESettings extends PreferenceActivity .equals(mVoiceModeOff)) { showVoiceConfirmation(); } - } else if (key.equals(DEBUG_MODE_KEY)) { - if (mDebugMode != null) { - mDebugMode.setChecked(prefs.getBoolean(DEBUG_MODE_KEY, false)); - updateDebugMode(); - } } mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); updateVoiceModeSummary(); @@ -131,29 +119,6 @@ public class LatinIMESettings extends PreferenceActivity [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]); } - private void updateDebugMode() { - if (mDebugMode == null) { - return; - } - boolean isDebugMode = mDebugMode.isChecked(); - String version = ""; - try { - PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); - version = "Version " + info.versionName; - } catch (NameNotFoundException e) { - Log.e(TAG, "Could not find version info."); - } - if (!isDebugMode) { - mDebugMode.setEnabled(false); - mDebugMode.setTitle(version); - mDebugMode.setSummary(""); - } else { - mDebugMode.setEnabled(true); - mDebugMode.setSummary(version); - mDebugMode.setSummary(""); - } - } - private void showVoiceConfirmation() { mOkClicked = false; showDialog(VOICE_INPUT_CONFIRM_DIALOG); From b1fcbec73050160c5cebf00c7daeee2c90ad1a44 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Mon, 27 Sep 2010 17:07:09 +0900 Subject: [PATCH 013/287] Add xlarge keyboard layouts (tentative) This keyboard layout is tentative for UX study. This change added xlarge keyboard layouts only for "regular text", "symbol/number mode" and "symbol/number mode shifted". TODO other text mode variants should have dedicated layout. Change-Id: I36077efcec4b57c3b5cada0a851e1409a289eeb9 --- java/res/values-xlarge/dimens.xml | 3 +- java/res/values/dimens.xml | 1 + java/res/values/styles.xml | 2 +- java/res/xml-xlarge/kbd_qwerty.xml | 218 ++++++++++++++++++ java/res/xml-xlarge/kbd_symbols.xml | 160 +++++++++++++ java/res/xml-xlarge/kbd_symbols_shift.xml | 161 +++++++++++++ .../inputmethod/latin/LatinKeyboard.java | 72 +++--- 7 files changed, 581 insertions(+), 36 deletions(-) create mode 100644 java/res/xml-xlarge/kbd_qwerty.xml create mode 100644 java/res/xml-xlarge/kbd_symbols.xml create mode 100644 java/res/xml-xlarge/kbd_symbols_shift.xml diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index 4e1c52877..37e6b9ef0 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -22,5 +22,6 @@ 72dip 46dip 0dip - 35sp + 28sp + 0dip diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index b399af489..75efddf6c 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -31,4 +31,5 @@ 91.8dip + -10dip diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index 5e239482f..f30c9f196 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -27,7 +27,7 @@ 14sp @layout/keyboard_popup 0.05in - -10dip + @dimen/keyboard_vertical_correction #BB000000 2.75 0.5 diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml new file mode 100644 index 000000000..e710b34c7 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml new file mode 100644 index 000000000..9ac7716e8 --- /dev/null +++ b/java/res/xml-xlarge/kbd_symbols.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml new file mode 100644 index 000000000..fbbf68ebd --- /dev/null +++ b/java/res/xml-xlarge/kbd_symbols_shift.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 14a503bc3..9e24ee322 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -36,6 +36,8 @@ import android.util.Log; import android.view.ViewConfiguration; import android.view.inputmethod.EditorInfo; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -48,7 +50,7 @@ public class LatinKeyboard extends Keyboard { private Drawable mShiftLockIcon; private Drawable mShiftLockPreviewIcon; - private Drawable mOldShiftIcon; + private final HashMap mOldShiftIcons = new HashMap(); private Drawable mSpaceIcon; private Drawable mSpaceAutoCompletionIndicator; private Drawable mSpacePreviewIcon; @@ -58,7 +60,7 @@ public class LatinKeyboard extends Keyboard { private Drawable m123MicPreviewIcon; private final Drawable mButtonArrowLeftIcon; private final Drawable mButtonArrowRightIcon; - private Key mShiftKey; + private ArrayList mShiftKeys; private Key mEnterKey; private Key mF1Key; private Key mSpaceKey; @@ -170,6 +172,13 @@ public class LatinKeyboard extends Keyboard { case LatinIME.KEYCODE_SPACE: mSpaceKey = key; break; + case KEYCODE_SHIFT: + // NOTE: This protected method is being called from the base class constructor before + // mShiftKeys gets initialized. + if (mShiftKeys == null) + mShiftKeys = new ArrayList(); + mShiftKeys.add(key); + break; case KEYCODE_MODE_CHANGE: m123Key = key; m123Label = key.label; @@ -195,7 +204,7 @@ public class LatinKeyboard extends Keyboard { return key; } - void setImeOptions(Resources res, int mode, int options) { + public void setImeOptions(Resources res, int mode, int options) { if (mEnterKey != null) { // Reset some of the rarely used attributes. mEnterKey.popupCharacters = null; @@ -253,61 +262,56 @@ public class LatinKeyboard extends Keyboard { } } } - - void enableShiftLock() { - int index = getShiftKeyIndex(); - if (index >= 0) { - mShiftKey = getKeys().get(index); - if (mShiftKey instanceof LatinKey) { - ((LatinKey)mShiftKey).enableShiftLock(); + + public void enableShiftLock() { + for (final Key key : mShiftKeys) { + if (key instanceof LatinKey) { + ((LatinKey)key).enableShiftLock(); } - mOldShiftIcon = mShiftKey.icon; + mOldShiftIcons.put(key, key.icon); } } - void setShiftLocked(boolean shiftLocked) { - if (mShiftKey != null) { - if (shiftLocked) { - mShiftKey.on = true; - mShiftKey.icon = mShiftLockIcon; - mShiftState = SHIFT_LOCKED; - } else { - mShiftKey.on = false; - mShiftKey.icon = mShiftLockIcon; - mShiftState = SHIFT_ON; - } + public void setShiftLocked(boolean shiftLocked) { + for (final Key key : mShiftKeys) { + key.on = shiftLocked; + key.icon = mShiftLockIcon; } + mShiftState = shiftLocked ? SHIFT_LOCKED : SHIFT_ON; } - boolean isShiftLocked() { + public boolean isShiftLocked() { return mShiftState == SHIFT_LOCKED; } @Override public boolean setShifted(boolean shiftState) { boolean shiftChanged = false; - if (mShiftKey != null) { + if (mShiftKeys.size() > 0) { + for (final Key key : mShiftKeys) { + if (shiftState == false) { + key.on = false; + key.icon = mOldShiftIcons.get(key); + } else if (mShiftState == SHIFT_OFF) { + key.icon = mShiftLockIcon; + } + } if (shiftState == false) { shiftChanged = mShiftState != SHIFT_OFF; mShiftState = SHIFT_OFF; - mShiftKey.on = false; - mShiftKey.icon = mOldShiftIcon; - } else { - if (mShiftState == SHIFT_OFF) { - shiftChanged = mShiftState == SHIFT_OFF; - mShiftState = SHIFT_ON; - mShiftKey.icon = mShiftLockIcon; - } + } else if (mShiftState == SHIFT_OFF) { + shiftChanged = mShiftState == SHIFT_OFF; + mShiftState = SHIFT_ON; } + return shiftChanged; } else { return super.setShifted(shiftState); } - return shiftChanged; } @Override public boolean isShifted() { - if (mShiftKey != null) { + if (mShiftKeys.size() > 0) { return mShiftState != SHIFT_OFF; } else { return super.isShifted(); From 0b4ae1f578e768eec4ada90aeb81d11acb10eb2e Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 28 Sep 2010 00:32:35 +0900 Subject: [PATCH 014/287] Capitalize the displayed text in the suggestion bar when all of the user typed chars are upper case bug:3014227 Change-Id: Ic453e2fde57ce51be00f3a506e1c9328103ca99a --- .../android/inputmethod/latin/LatinIME.java | 6 ++--- .../android/inputmethod/latin/Suggest.java | 12 ++++++--- .../inputmethod/latin/WordComposer.java | 26 ++++++++++++------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 4729585f6..01f3ba66c 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1389,7 +1389,7 @@ public class LatinIME extends InputMethodService if (mKeyboardSwitcher.getInputView().isShifted() && mKeyboardSwitcher.isAlphabetMode() && mComposing.length() == 0) { - mWord.setCapitalized(true); + mWord.setFirstCharCapitalized(true); } mComposing.append((char) primaryCode); mWord.add(primaryCode, keyCodes); @@ -2020,7 +2020,7 @@ public class LatinIME extends InputMethodService touching.word.charAt(i) }); } - foundWord.setCapitalized(Character.isUpperCase(touching.word.charAt(0))); + foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.word.charAt(0))); } // Found a match, show suggestions if (foundWord != null || alternatives != null) { @@ -2177,7 +2177,7 @@ public class LatinIME extends InputMethodService } public boolean preferCapitalization() { - return mWord.isCapitalized(); + return mWord.isFirstCharCapitalized(); } private void toggleLanguage(boolean reset, boolean next) { diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 92bbe4362..3b898941f 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -96,7 +96,10 @@ public class Suggest implements Dictionary.WordCallback { private boolean mHaveCorrection; private CharSequence mOriginalWord; private String mLowerOriginalWord; - private boolean mCapitalize; + + // TODO: Remove these member variables by passing more context to addWord() callback method + private boolean mIsFirstCharCapitalized; + private boolean mIsAllUpperCase; private int mCorrectionMode = CORRECTION_BASIC; @@ -219,7 +222,8 @@ public class Suggest implements Dictionary.WordCallback { boolean includeTypedWordIfValid, CharSequence prevWordForBigram) { LatinImeLogger.onStartSuggestion(prevWordForBigram); mHaveCorrection = false; - mCapitalize = wordComposer.isCapitalized(); + mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized(); + mIsAllUpperCase = wordComposer.isAllUpperCase(); collectGarbage(mSuggestions, mPrefMaxSuggestions); Arrays.fill(mPriorities, 0); Arrays.fill(mNextLettersFrequencies, 0); @@ -453,7 +457,9 @@ public class Suggest implements Dictionary.WordCallback { StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) : new StringBuilder(getApproxMaxWordLength()); sb.setLength(0); - if (mCapitalize) { + if (mIsAllUpperCase) { + sb.append(new String(word, offset, length).toUpperCase()); + } else if (mIsFirstCharCapitalized) { sb.append(Character.toUpperCase(word[offset])); if (length > 1) { sb.append(word, offset + 1, length - 1); diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index fe4c68576..2e415b771 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -39,9 +39,9 @@ public class WordComposer { private boolean mAutoCapitalized; /** - * Whether the user chose to capitalize the word. + * Whether the user chose to capitalize the first char of the word. */ - private boolean mIsCapitalized; + private boolean mIsFirstCharCapitalized; public WordComposer() { mCodes = new ArrayList(12); @@ -54,7 +54,7 @@ public class WordComposer { mTypedWord = new StringBuilder(copy.mTypedWord); mCapsCount = copy.mCapsCount; mAutoCapitalized = copy.mAutoCapitalized; - mIsCapitalized = copy.mIsCapitalized; + mIsFirstCharCapitalized = copy.mIsFirstCharCapitalized; } /** @@ -62,7 +62,7 @@ public class WordComposer { */ public void reset() { mCodes.clear(); - mIsCapitalized = false; + mIsFirstCharCapitalized = false; mPreferredWord = null; mTypedWord.setLength(0); mCapsCount = 0; @@ -138,18 +138,26 @@ public class WordComposer { return mTypedWord; } - public void setCapitalized(boolean capitalized) { - mIsCapitalized = capitalized; + public void setFirstCharCapitalized(boolean capitalized) { + mIsFirstCharCapitalized = capitalized; } /** * Whether or not the user typed a capital letter as the first letter in the word * @return capitalization preference */ - public boolean isCapitalized() { - return mIsCapitalized; + public boolean isFirstCharCapitalized() { + return mIsFirstCharCapitalized; } - + + /** + * Whether or not all of the user typed chars are upper case + * @return true if all user typed chars are upper case, false otherwise + */ + public boolean isAllUpperCase() { + return (mCapsCount > 0) && (mCapsCount == size()); + } + /** * Stores the user's selected word, before it is actually committed to the text field. * @param preferred From 2245c3a5a9a5e14c62ba39aad3f1b2c8f91525c8 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 27 Sep 2010 12:22:28 -0700 Subject: [PATCH 015/287] Trim unwanted whitespace from translations. DO NOT MERGE Change-Id: Ie380334bc725aa55beb8ec084d1ade881a50812c --- java/res/values-pl/strings.xml | 2 +- java/res/values-ru/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 2335858fd..d10b5c35e 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -103,7 +103,7 @@ "Problem z dźwiękiem" "Błąd serwera" "Nie wykryto mowy" - "Nie znaleziono żadnych wyników" + "Brak wyników" "Wyszukiwanie głosowe nie jest zainstalowane" "Wskazówka:"" przesuń palcem po klawiaturze, aby mówić." "Wskazówka:"" następnym razem spróbuj wypowiadać nazwy znaków interpunkcyjnych: „kropka”, „przecinek” lub „pytajnik”." diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 98b36ed4d..65f9d5f32 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -61,7 +61,7 @@ - "Биграммные подсказки " + "Биграммные подсказки" "Используйте предыдущее слово, чтобы исправить подсказку" "Нет" From 71ed85bce807b4ae5cfed4c9842cfabd6e4f3119 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Mon, 27 Sep 2010 15:12:01 -0700 Subject: [PATCH 016/287] Fix the non-working period key in the tablet layout. One of the edge flags was wrong. --- java/res/xml-xlarge/kbd_qwerty.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml index e710b34c7..d1dd6130e 100644 --- a/java/res/xml-xlarge/kbd_qwerty.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -186,7 +186,7 @@ android:keyWidth="12.5%p" android:isModifier="true" android:isSticky="true" - android:keyEdgeFlags="left" /> + android:keyEdgeFlags="right" /> Date: Tue, 28 Sep 2010 09:45:45 +0900 Subject: [PATCH 017/287] Fix NPE in LatinKeyboard when it represent phone keyboard Bug: 3041532 Change-Id: I1d846e9175bd033f056a8715287a936be2fe8f74 --- .../inputmethod/latin/LatinKeyboard.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 9e24ee322..76b90f8f3 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -158,9 +158,22 @@ public class LatinKeyboard extends Keyboard { 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]; + if (mShiftKeys == null) + mShiftKeys = new ArrayList(); + } + @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: @@ -173,10 +186,6 @@ public class LatinKeyboard extends Keyboard { mSpaceKey = key; break; case KEYCODE_SHIFT: - // NOTE: This protected method is being called from the base class constructor before - // mShiftKeys gets initialized. - if (mShiftKeys == null) - mShiftKeys = new ArrayList(); mShiftKeys.add(key); break; case KEYCODE_MODE_CHANGE: @@ -186,11 +195,6 @@ public class LatinKeyboard extends Keyboard { } // For number hints on the upper-right corner of key - if (mNumberHintKeys == null) { - // NOTE: This protected method is being called from the base class constructor before - // mNumberHintKeys gets initialized. - mNumberHintKeys = new Key[NUMBER_HINT_COUNT]; - } int hintNumber = -1; if (LatinKeyboardBaseView.isNumberAtLeftmostPopupChar(key)) { hintNumber = key.popupCharacters.charAt(0) - '0'; From b514d3f1f8e48fd82d4b895f840666aaeccd1408 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 28 Sep 2010 09:39:19 +0900 Subject: [PATCH 018/287] Fix wrong keyEdgeFlags in xlarge keyboard layouts Bug: 3040988 Change-Id: Ibcac874a96ed0bf35350b50a5dd862a8d03c8354 --- java/res/xml-xlarge/kbd_qwerty.xml | 17 ++++++++--------- java/res/xml-xlarge/kbd_symbols.xml | 14 ++++++-------- java/res/xml-xlarge/kbd_symbols_shift.xml | 14 ++++++-------- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml index d1dd6130e..9554925b6 100644 --- a/java/res/xml-xlarge/kbd_qwerty.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -26,6 +26,7 @@ android:keyHeight="@dimen/key_height" > + + android:popupCharacters="@string/alternates_for_q" /> - + + + android:popupCharacters=">" /> - + + @@ -136,11 +135,10 @@ android:keyWidth="12.5%p" android:isModifier="true" android:isSticky="true" - android:keyEdgeFlags="left" /> + android:keyEdgeFlags="right" /> - + + diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml index fbbf68ebd..68dc92e24 100644 --- a/java/res/xml-xlarge/kbd_symbols_shift.xml +++ b/java/res/xml-xlarge/kbd_symbols_shift.xml @@ -25,9 +25,8 @@ android:verticalGap="0px" android:keyHeight="@dimen/key_height" > - + + @@ -137,11 +136,10 @@ android:keyWidth="12.5%p" android:isModifier="true" android:isSticky="true" - android:keyEdgeFlags="left" /> + android:keyEdgeFlags="right" /> - + + From 2b4cc0db61e7b5cf11552b6f0e444f254a8a7628 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 28 Sep 2010 14:35:21 +0900 Subject: [PATCH 019/287] Fix xlarge min-keyboard layout Change-Id: Ia4d6cffa0c6cf710da577b75f6337836352959a0 --- java/res/values-xlarge/dimens.xml | 3 +++ java/res/values/dimens.xml | 4 ++++ java/res/values/styles.xml | 8 +++---- java/res/xml-xlarge/kbd_popup_template.xml | 27 ++++++++++++++++++++++ java/res/xml-xlarge/kbd_qwerty.xml | 1 - java/res/xml-xlarge/kbd_symbols_shift.xml | 1 - 6 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 java/res/xml-xlarge/kbd_popup_template.xml diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index 37e6b9ef0..7c26729b1 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -23,5 +23,8 @@ 46dip 0dip 28sp + 16sp + 0dip + 40dip 0dip diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 75efddf6c..cad4e2ada 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -28,8 +28,12 @@ will not go into extract (fullscreen) mode. --> 2.5in 22sp + 14sp + 0dip + 80dip 91.8dip + 0.05in -10dip diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index f30c9f196..0372b07cf 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -22,11 +22,11 @@ @dimen/key_text_size #FFFFFFFF @layout/key_preview - 0dip - 80dip - 14sp + @dimen/key_preview_offset + @dimen/key_preview_height + @dimen/key_label_text_size @layout/keyboard_popup - 0.05in + @dimen/key_hysteresis_distance @dimen/keyboard_vertical_correction #BB000000 2.75 diff --git a/java/res/xml-xlarge/kbd_popup_template.xml b/java/res/xml-xlarge/kbd_popup_template.xml new file mode 100644 index 000000000..0e67a18d4 --- /dev/null +++ b/java/res/xml-xlarge/kbd_popup_template.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml index 9554925b6..80fb8884e 100644 --- a/java/res/xml-xlarge/kbd_qwerty.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -30,7 +30,6 @@ From 008e9b3e1a8c037e0275b19f284a7d2e76c9e140 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 28 Sep 2010 11:27:44 +0900 Subject: [PATCH 020/287] Fix Null pointer exception on closing and update assets Change-Id: I30fdac74685beae06b5c61140452b26b29ae4c39 --- .../btn_keyboard_key_normal_off_stone.9.png | Bin 2348 -> 2389 bytes .../btn_keyboard_key_normal_on_stone.9.png | Bin 2379 -> 2408 bytes .../btn_keyboard_key_normal_stone.9.png | Bin 2211 -> 2213 bytes .../btn_keyboard_key_normal_off_stone.9.png | Bin 2348 -> 2389 bytes .../btn_keyboard_key_normal_on_stone.9.png | Bin 2379 -> 2408 bytes .../btn_keyboard_key_normal_stone.9.png | Bin 2211 -> 2213 bytes .../android/inputmethod/latin/LatinIME.java | 7 ++++++- .../inputmethod/latin/LatinImeLogger.java | 4 ++-- 8 files changed, 8 insertions(+), 3 deletions(-) diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png index b67732cd42da45d3f9b407efc2fb841b814357b9..fad0ec4586104a5cc559efe898d72ce436cd1df7 100644 GIT binary patch delta 2379 zcmV-R3AFaC64errBYz1TNklfRhd$JQ#H7&>?sD@Zs>2-}$%w`}ezj`}PIx-MhDe_Uzg7 zJ?-ATyMcD?+EtVA#_wV0#4<0;lM~@y2z5L|K6ZiD#)9@2Le*CzB z9zA;0Ko1{245AI%Lh6WW;D~q;q>Wc=ua+^*ToFheAoLW$B!UxY%9JUtOP4OLd-v|H zYuB!>Pk*02Ve-Fx`7-Fmix=P1^XJbidiLyD5b){%0T%&UF>>D9x8CFLy*~1KKaNUu z5H(2S^iZ!}yG63*F?&lU>iAJ>A;1Yb!9d0$G?MkQ4?GziI(e z@6|S@*t=ChxX3m*apFWbY}l}1e)a0rZvFc8L4W*t?%cVqZ{NNlkADb^9TjCj*@$?M ze|wK#di~Dp*Ky)k2T=ozM(^Ie-OQOY-O80K-MV$_0>p+58-iA>Sm7p2nBeBmpI>Oc zu@n=C9g(7igvG#vu>Afxrq_pYo|J=dks9FMFmT|&(DRG{X=Gtmty<-#PoEyr43nwp zB7cC!Qp*BpAz%TDAb;`tv?dVJM5`8m9xz})m>Z19nl)KBeY<_0ylEx$gm}`CacLV*LF0jEyZ}s z2H_5@8zADY+P{DQkUkh+vSdlnym|B7xPNiu!iZRd)s)_6Y)V;(^ahHjY!J2(=^dSo z8!0wo#0WQj{P+Mcbm-6k$9HtoOK*y`-W(YX3qhN92Y{z+5cWOVPidP%<4m~Cn>UAv z&wODcrxhnh_GViIVYe^Z!r&j6*MARKgbUeNi$0x8u5WLLOaWhb*z$pWP37CdExa3a%bP!beD(gT(~x6~>- zku?eeC^~R)3&;jJa^y&ZBd$H>rhlW8E(*2E&I3CN=@DATXwE>{AS|ooq&;^Fj39P& zbd*hxx{b*mfi(&ONYDOw;oOrALUn|kw1onJ5yTcDl*{QEznbhdwvZu!q9O&JvOy^A zFi(&w83H4S9i4P839v}%_iS;2HU(g-D)ND+Y!K>C%o9XzB0&i#O}QT;n}0$UfLMwv zA9%_JVPBUp7d&NyY~Q{;R1ni@qo6F1psZ|umlfpF z^bvrqVoG?yQ#Q!fty{zSLZwh7FaZ^%UXIe#DJ#RO6pN>95O%l>rRuZfr@&GmrGX@4 zWlFza1faUHtq%0@JzhvtM*xaLOvT3w zMUQL{PJbIWZgiVAZK_CMg0iEOreI^T*Qoccd1Bevc)?RP$nxdO8-Enxkib%)GzHUi zOw%MynIZsU+1Pl&Q#J?{64kF%kh4WO0uj`vpWtedy+-ZGJTVkc@$rJEY!Hgn)UTK; zlE6}+GzD!cS`~dq*INJ?x3Tepr)&`FxKt3yOG#iBNKk1S)*@YJdtU&=va#_(JuMrA za?jGGOWm?%%Yw*HB!9RRDwWKoD*A3}o*0U!_;|rnHpuMRvqO1Q6-62nSPGP;V2*UX z1(0#1_;|rnHpq+_Gs3eF@={8{ERIe*f%);uwgjf)RFWrIwb zG$}j}AuoCEAz3gBWk)MVx=sKxjci%uD}h-kfmzwqD3k4dYn~W3CO+_#4KilT7&mq5)F6PYEL_oOS=sa` zQxO0$kYeIv?0?v?`5-)M;{gs6ER_XRKnqqRn;d?T##2oh755`cqSM?Wq&GzD;veepe=-LhxQ}LcR3*6 z4jw!>Os+BknF{DsIUQilry0OC2BdRM4@3QzH+1XP%?%nfC|h(uv4%KC*^2a)cwq;l z62GVF(W8fJ*RI_a@9~dbpTw7HT9&&*R&juMn>nk)QO4*MFNr?c2Bi zSKGF2Cx3g7pL_i_zI@iA6vXQ-ujXE@ynYkuzwr92*FU@lcn$ms^|jYOz5ed?2d~fK zTXY}9_q9qvn#EV_T14tL@wKA*_^wpvIN^ROb&l!ud4%{lrd6xh;iYd}H;XSlz7xOP zI=*`MaeU$H()6PLO(5d_DyCB_1Mya4@4;J` x<`L-Km~JhbNG+m=<_4l!Q~o!j|NDPU`X3J;6hG1zg;D?j002ovPDHLkV1jnYmfZjV delta 2338 zcmV+-3ElS9608!CBYz0U2)uzuw=~tpW@F#eqkYMx9ZP@g(=%AGxXww}(NI~R1}!UcEn;>Gau{Q2|YJ05f9%$X9M zK7G1GXrHR7secLL0I4{5DhwVxdav($y%%B9ATW68(xp0GzI-|8%9Shb>eZ|6`t|GX z#*G`{=e29s!gmn2BS++apVS10@q-MMooDV(E1I}qAr`y3P zULO^Lpiy?hPSyOgXU{^2F^Vr)^0tv{sUY%o#H4H)+G|;bK zKR0O5AUAjJT(@-TQnzHu5;t|~RM)3ZAGdz}`g$-8L0OpG$Oy;}USD~&D+Iy8Jdusz z-ZEmuh+ux*x^-^j#*IO1*RFN*=g)To2M!DqvwvJP%0)#%iXcpCRmJpbUkHK;$14&V z!0-M0_jj{r&vt9ptZ^GQY;c=4ZK~6%Rjb^jNt4{dg$tWBXB0%Ep#T)TM3A4ox_Wge z1mPu?S1a7?h7KJXMjp`s2%l71#j6PxKZ&s&IZPe858EovSrJ{yZ{V@e=l0J z$c-8`%I)93zr<+Dv`X(mh(<&A6?n@A!A(bRLTCVMA4Fx^v}wWk^5x3|)Pe;I+=K}e zLPXS9uJop+LJ4MTPz5X|}%-2+63fX5Fc!IZV5PcGa_#i}>)WyJF<;uw(ZznS$ zQV(G8mJNbORGh%4H9|2;=tSoZC#1qPBt1vx0;50xeR6~+c*_Q{&+LR!AUl8Tg`pwo zIXVw4fYt;cc*_RC%}sYRHL(-`3xO;K!do^7Dtf34vTDd`A{t8p>0D}zY|%~uQdLZNf`7MckbV31 zh4Q7AHVKA?H9~~4bE=%|@mg6#+ca;>tndVH*&w@j?+(uvT5}~Bfo$6S8)^C|fUO0? z6IS5aAUk*NbbI&i4Z;XO1hYU4zs{*#>A5KY^vV9|2i~$lwr}6=cJ0~~A_HL*AT(rw z2xVof^Ep*|1wdcympL>vEWdHO7Z`mNIjA-3z^XAP#1VabtER}wZm8K0u^XQBH(g!P>*?%B-7H92>BA5lz z&}$l&Q|cTGK;!BGp5QGTWW|aVfgDvuN{ey|r0LgGu^kJ5KGg#}tz5Y>9|ZL(R1ZOq z$|8hD2&Yv>tpPI?a;4|8J+w{J5c`K0c!IYgkdkr`D(;91=pi(qU<6{dQNwT3QB`yt z+aZ7&hv);I;4QnZg@39#$WcwC2xft73N}SL`UIeHh#uexRnBY>6yHFOmpK%{6o^n1 z)1WcpxjOnZk3Q7{Ji%Kw2&(QNU%Ys6ozMv3ER+>Zm6JV3N1p)bPd&gByk&#ng$|0- zNHGeH5Ke(?3R=;iDs`NWJ^|35dVnW*%Lc(q8@%g)5K4-08hMLge{M}OKsJmIZ!HprAIQ{1dsvqBhE3TL5gDmGRr z0Q9H*!xLU%WP{+vCejOGRG}dPTBuYiHby*O0oWh=hbO!>%Lc(q9HbY*s6s;o)QF*D zl}*VU@mvDXIDduy;VEu&$^#icetbwTgpoocl!el0rBbp;YCZ)(^AvpGEm=0m*s)_n z2mxbd!ECfrDOn_i*YqKP4kQFm?8RS~3cQ_U0X#j38ZE)+nEglLx2$dMyUgj9xL z5~)MscNLE5+qbXl)~(xL-s?|ZT?#=eDk^^QFn_+O`+mK@zdLp6G}U|U;q_(Q4p<7} z^{!XTxPS5Svq=4&*RNg!y#DYS=2iU)H7x3Puiw0|f%%)bukn*2kQQ-IZR@zru4CNb zRT+1!RmF++s#O)!sYit99Mh^z(H{5~aW8GFcu?E83G$1$^{(q{RF{}e9U}xbW`0<- zp-2o5H0_&zZ-6NEq|Ky586^hhZ9S3ZU6uP07*qo IM6N<$f(0jFzW@LL diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png index 534f1cdfdb15db851eab5a61ad52f9d2b3c780f8..215f8157c3b7306760178bc0e1715afd675fbd76 100644 GIT binary patch delta 2397 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 P00000NkvXXu0mjfyAG}* delta 2368 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 bP5K8#U=nXWF4_LX00000NkvXXu0mjf!`3gI delta 2199 zcmV;I2x#}E5u*{1B!6m2L_t(|+U=W1Z=FRHh65>%ON#9j$4Gz#5tc%Y6Sg2Why@!Y zKmu0q16Z+TlSt{k_uh-sd+){Rz4zu7KLBZ%cQo(S>yz)h_YOiKh+OHBV|-`MdCr-y zjXpYbDE@IT5wAY4KCeEnKL5kdYcDA!KVNuSU$W~6IOF-s^M87|LTy8a3~@(}9BIeV zqetDbW5?X_&x z{_u41bQGb?PtTf~8h7&KNq6ehsRE}@pAMWkbH<%Ld)A#le?I)g@BEv7AGEf%wgYpL z6DLj-Kw$_9lz#_`*0*n8$h_m}EHe2b=gysT7cN`~T)cQOaOu*ez?Cak+|{dB-L-4i z!cY8u`SRrg{2t+Wz&Qbmfj9s~QBWWYiqp{00Ffq7*Vvg(c?We6L2^ixT)%!jaO1`e zck9+Icl-8jcjwL>clYky@Dsl)_>OY(=FI|_17JSR&wqm0q9`at6#3B8%~KgWQ@Aly zk=kzEx`lw67?K6|?%i|u@85S19z1Z59zAl8A3qM@-^#;>51#{L0LBB%WeZ`YRUYE~ z`t?J;pL*&&HJ%DOWQs6p!sL+<5`FUIiF^9=seAV9nQLonD}diE_#VMHpar0$$`KZj zvW<<6$ba{9Pa{@O>`HMFPG)7;i7b)7BSaaBs7#K?*PgdySE`DN=rKSU?Ftge>q?$T zmQ1m(s06^Wiy}XG`g?kNs*8$XkWOM{*cFv2h6Xj4>}gt$4VAE`UtDjJL~udG1xhc1+94}LA!4s7dDj-bu5d}IgkCrSa!MA- zy0T}<@R(7la>=?ds)Szo0dh(f(R(UFAuFTT8Wqbzzh|!(l%RmdMlQ%HSp+wA7|8n^ zy?;?u8NGecD{?99=`~Bj-gn8pR{0{hGqrcU6v|p^luE&#ktjg{d-sf-l12E;p|{*HOzTNHKy*q&J0E(%QU3w|#(toi6h{d?fW5?%WwbH2@~GLb~)6 zuI;RSVY@%90*JwQjE`K9Q?kgWO`F`dZQDX;2*oI*U7}bDcEg$iOk86lm(80ur;BXZ zu)%HFvL%2@0E$^5U4Dw)P0#uc$6Eo!VqE5doO<=@l_t{C(&9F5+!#6oP=5_TF$6+T zU4FU*OQB;p4+NMv<1s#RS+{Ooy2zR}Yux(v>jS6+pqLf1OE3kFR{^6dh{1S_50F!BZEc#!j2SaRS5O6F#Z*esB~c6=qXL*8 zu>fNumzgtXri)CQHZ4?O&YU>~Fd5}2rJc%x%fq7I(dsjK#$s&bGJX2=bdf1jri2R2 znl-BcCZn8oi`CO*kbgziaYh2;gAEUcXEn0BrhSpu3oK};04M~@z9A|pqR3>82-Ef6GD%y!O- z<}Fo~VB!j5jUGKZU1a$1;co2Mu|cL7S#o)uRN1VKS_z#GF|bOKMTQL<7Ak;t<^fS9 zPco&eDqzQ?ihtnUjz94#Ai9#ph!G=l!II1ZNmx)QqJ?3h^zQ)k;D*-c_r2%6QX+V@ zuBEA|$qgJhFoR~--2BflXwaZ`3?4kV9ro`71`L42mH3*|yYf;^t_WV{`p)yK=Qq#q zp0S=Kp6#B4o|0wj4=i?X52k`*M3upaeH~1=GhjO}76=mw< z!G%fQ_!nr5UFa2G0j!B{nszQF(lN?(iJhsAZ+3Q%VlSHRF@8-fZiT%2Tk`Xt`CpU% Z0)*n#a1boPs)+yq002ovPDHLkV1gVVHBtZo diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_stone.9.png index b67732cd42da45d3f9b407efc2fb841b814357b9..fad0ec4586104a5cc559efe898d72ce436cd1df7 100644 GIT binary patch delta 2379 zcmV-R3AFaC64errBYz1TNklfRhd$JQ#H7&>?sD@Zs>2-}$%w`}ezj`}PIx-MhDe_Uzg7 zJ?-ATyMcD?+EtVA#_wV0#4<0;lM~@y2z5L|K6ZiD#)9@2Le*CzB z9zA;0Ko1{245AI%Lh6WW;D~q;q>Wc=ua+^*ToFheAoLW$B!UxY%9JUtOP4OLd-v|H zYuB!>Pk*02Ve-Fx`7-Fmix=P1^XJbidiLyD5b){%0T%&UF>>D9x8CFLy*~1KKaNUu z5H(2S^iZ!}yG63*F?&lU>iAJ>A;1Yb!9d0$G?MkQ4?GziI(e z@6|S@*t=ChxX3m*apFWbY}l}1e)a0rZvFc8L4W*t?%cVqZ{NNlkADb^9TjCj*@$?M ze|wK#di~Dp*Ky)k2T=ozM(^Ie-OQOY-O80K-MV$_0>p+58-iA>Sm7p2nBeBmpI>Oc zu@n=C9g(7igvG#vu>Afxrq_pYo|J=dks9FMFmT|&(DRG{X=Gtmty<-#PoEyr43nwp zB7cC!Qp*BpAz%TDAb;`tv?dVJM5`8m9xz})m>Z19nl)KBeY<_0ylEx$gm}`CacLV*LF0jEyZ}s z2H_5@8zADY+P{DQkUkh+vSdlnym|B7xPNiu!iZRd)s)_6Y)V;(^ahHjY!J2(=^dSo z8!0wo#0WQj{P+Mcbm-6k$9HtoOK*y`-W(YX3qhN92Y{z+5cWOVPidP%<4m~Cn>UAv z&wODcrxhnh_GViIVYe^Z!r&j6*MARKgbUeNi$0x8u5WLLOaWhb*z$pWP37CdExa3a%bP!beD(gT(~x6~>- zku?eeC^~R)3&;jJa^y&ZBd$H>rhlW8E(*2E&I3CN=@DATXwE>{AS|ooq&;^Fj39P& zbd*hxx{b*mfi(&ONYDOw;oOrALUn|kw1onJ5yTcDl*{QEznbhdwvZu!q9O&JvOy^A zFi(&w83H4S9i4P839v}%_iS;2HU(g-D)ND+Y!K>C%o9XzB0&i#O}QT;n}0$UfLMwv zA9%_JVPBUp7d&NyY~Q{;R1ni@qo6F1psZ|umlfpF z^bvrqVoG?yQ#Q!fty{zSLZwh7FaZ^%UXIe#DJ#RO6pN>95O%l>rRuZfr@&GmrGX@4 zWlFza1faUHtq%0@JzhvtM*xaLOvT3w zMUQL{PJbIWZgiVAZK_CMg0iEOreI^T*Qoccd1Bevc)?RP$nxdO8-Enxkib%)GzHUi zOw%MynIZsU+1Pl&Q#J?{64kF%kh4WO0uj`vpWtedy+-ZGJTVkc@$rJEY!Hgn)UTK; zlE6}+GzD!cS`~dq*INJ?x3Tepr)&`FxKt3yOG#iBNKk1S)*@YJdtU&=va#_(JuMrA za?jGGOWm?%%Yw*HB!9RRDwWKoD*A3}o*0U!_;|rnHpuMRvqO1Q6-62nSPGP;V2*UX z1(0#1_;|rnHpq+_Gs3eF@={8{ERIe*f%);uwgjf)RFWrIwb zG$}j}AuoCEAz3gBWk)MVx=sKxjci%uD}h-kfmzwqD3k4dYn~W3CO+_#4KilT7&mq5)F6PYEL_oOS=sa` zQxO0$kYeIv?0?v?`5-)M;{gs6ER_XRKnqqRn;d?T##2oh755`cqSM?Wq&GzD;veepe=-LhxQ}LcR3*6 z4jw!>Os+BknF{DsIUQilry0OC2BdRM4@3QzH+1XP%?%nfC|h(uv4%KC*^2a)cwq;l z62GVF(W8fJ*RI_a@9~dbpTw7HT9&&*R&juMn>nk)QO4*MFNr?c2Bi zSKGF2Cx3g7pL_i_zI@iA6vXQ-ujXE@ynYkuzwr92*FU@lcn$ms^|jYOz5ed?2d~fK zTXY}9_q9qvn#EV_T14tL@wKA*_^wpvIN^ROb&l!ud4%{lrd6xh;iYd}H;XSlz7xOP zI=*`MaeU$H()6PLO(5d_DyCB_1Mya4@4;J` x<`L-Km~JhbNG+m=<_4l!Q~o!j|NDPU`X3J;6hG1zg;D?j002ovPDHLkV1jnYmfZjV delta 2338 zcmV+-3ElS9608!CBYz0U2)uzuw=~tpW@F#eqkYMx9ZP@g(=%AGxXww}(NI~R1}!UcEn;>Gau{Q2|YJ05f9%$X9M zK7G1GXrHR7secLL0I4{5DhwVxdav($y%%B9ATW68(xp0GzI-|8%9Shb>eZ|6`t|GX z#*G`{=e29s!gmn2BS++apVS10@q-MMooDV(E1I}qAr`y3P zULO^Lpiy?hPSyOgXU{^2F^Vr)^0tv{sUY%o#H4H)+G|;bK zKR0O5AUAjJT(@-TQnzHu5;t|~RM)3ZAGdz}`g$-8L0OpG$Oy;}USD~&D+Iy8Jdusz z-ZEmuh+ux*x^-^j#*IO1*RFN*=g)To2M!DqvwvJP%0)#%iXcpCRmJpbUkHK;$14&V z!0-M0_jj{r&vt9ptZ^GQY;c=4ZK~6%Rjb^jNt4{dg$tWBXB0%Ep#T)TM3A4ox_Wge z1mPu?S1a7?h7KJXMjp`s2%l71#j6PxKZ&s&IZPe858EovSrJ{yZ{V@e=l0J z$c-8`%I)93zr<+Dv`X(mh(<&A6?n@A!A(bRLTCVMA4Fx^v}wWk^5x3|)Pe;I+=K}e zLPXS9uJop+LJ4MTPz5X|}%-2+63fX5Fc!IZV5PcGa_#i}>)WyJF<;uw(ZznS$ zQV(G8mJNbORGh%4H9|2;=tSoZC#1qPBt1vx0;50xeR6~+c*_Q{&+LR!AUl8Tg`pwo zIXVw4fYt;cc*_RC%}sYRHL(-`3xO;K!do^7Dtf34vTDd`A{t8p>0D}zY|%~uQdLZNf`7MckbV31 zh4Q7AHVKA?H9~~4bE=%|@mg6#+ca;>tndVH*&w@j?+(uvT5}~Bfo$6S8)^C|fUO0? z6IS5aAUk*NbbI&i4Z;XO1hYU4zs{*#>A5KY^vV9|2i~$lwr}6=cJ0~~A_HL*AT(rw z2xVof^Ep*|1wdcympL>vEWdHO7Z`mNIjA-3z^XAP#1VabtER}wZm8K0u^XQBH(g!P>*?%B-7H92>BA5lz z&}$l&Q|cTGK;!BGp5QGTWW|aVfgDvuN{ey|r0LgGu^kJ5KGg#}tz5Y>9|ZL(R1ZOq z$|8hD2&Yv>tpPI?a;4|8J+w{J5c`K0c!IYgkdkr`D(;91=pi(qU<6{dQNwT3QB`yt z+aZ7&hv);I;4QnZg@39#$WcwC2xft73N}SL`UIeHh#uexRnBY>6yHFOmpK%{6o^n1 z)1WcpxjOnZk3Q7{Ji%Kw2&(QNU%Ys6ozMv3ER+>Zm6JV3N1p)bPd&gByk&#ng$|0- zNHGeH5Ke(?3R=;iDs`NWJ^|35dVnW*%Lc(q8@%g)5K4-08hMLge{M}OKsJmIZ!HprAIQ{1dsvqBhE3TL5gDmGRr z0Q9H*!xLU%WP{+vCejOGRG}dPTBuYiHby*O0oWh=hbO!>%Lc(q9HbY*s6s;o)QF*D zl}*VU@mvDXIDduy;VEu&$^#icetbwTgpoocl!el0rBbp;YCZ)(^AvpGEm=0m*s)_n z2mxbd!ECfrDOn_i*YqKP4kQFm?8RS~3cQ_U0X#j38ZE)+nEglLx2$dMyUgj9xL z5~)MscNLE5+qbXl)~(xL-s?|ZT?#=eDk^^QFn_+O`+mK@zdLp6G}U|U;q_(Q4p<7} z^{!XTxPS5Svq=4&*RNg!y#DYS=2iU)H7x3Puiw0|f%%)bukn*2kQQ-IZR@zru4CNb zRT+1!RmF++s#O)!sYit99Mh^z(H{5~aW8GFcu?E83G$1$^{(q{RF{}e9U}xbW`0<- zp-2o5H0_&zZ-6NEq|Ky586^hhZ9S3ZU6uP07*qo IM6N<$f(0jFzW@LL diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_stone.9.png index 534f1cdfdb15db851eab5a61ad52f9d2b3c780f8..215f8157c3b7306760178bc0e1715afd675fbd76 100644 GIT binary patch delta 2397 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 P00000NkvXXu0mjfyAG}* delta 2368 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 bP5K8#U=nXWF4_LX00000NkvXXu0mjf!`3gI delta 2199 zcmV;I2x#}E5u*{1B!6m2L_t(|+U=W1Z=FRHh65>%ON#9j$4Gz#5tc%Y6Sg2Why@!Y zKmu0q16Z+TlSt{k_uh-sd+){Rz4zu7KLBZ%cQo(S>yz)h_YOiKh+OHBV|-`MdCr-y zjXpYbDE@IT5wAY4KCeEnKL5kdYcDA!KVNuSU$W~6IOF-s^M87|LTy8a3~@(}9BIeV zqetDbW5?X_&x z{_u41bQGb?PtTf~8h7&KNq6ehsRE}@pAMWkbH<%Ld)A#le?I)g@BEv7AGEf%wgYpL z6DLj-Kw$_9lz#_`*0*n8$h_m}EHe2b=gysT7cN`~T)cQOaOu*ez?Cak+|{dB-L-4i z!cY8u`SRrg{2t+Wz&Qbmfj9s~QBWWYiqp{00Ffq7*Vvg(c?We6L2^ixT)%!jaO1`e zck9+Icl-8jcjwL>clYky@Dsl)_>OY(=FI|_17JSR&wqm0q9`at6#3B8%~KgWQ@Aly zk=kzEx`lw67?K6|?%i|u@85S19z1Z59zAl8A3qM@-^#;>51#{L0LBB%WeZ`YRUYE~ z`t?J;pL*&&HJ%DOWQs6p!sL+<5`FUIiF^9=seAV9nQLonD}diE_#VMHpar0$$`KZj zvW<<6$ba{9Pa{@O>`HMFPG)7;i7b)7BSaaBs7#K?*PgdySE`DN=rKSU?Ftge>q?$T zmQ1m(s06^Wiy}XG`g?kNs*8$XkWOM{*cFv2h6Xj4>}gt$4VAE`UtDjJL~udG1xhc1+94}LA!4s7dDj-bu5d}IgkCrSa!MA- zy0T}<@R(7la>=?ds)Szo0dh(f(R(UFAuFTT8Wqbzzh|!(l%RmdMlQ%HSp+wA7|8n^ zy?;?u8NGecD{?99=`~Bj-gn8pR{0{hGqrcU6v|p^luE&#ktjg{d-sf-l12E;p|{*HOzTNHKy*q&J0E(%QU3w|#(toi6h{d?fW5?%WwbH2@~GLb~)6 zuI;RSVY@%90*JwQjE`K9Q?kgWO`F`dZQDX;2*oI*U7}bDcEg$iOk86lm(80ur;BXZ zu)%HFvL%2@0E$^5U4Dw)P0#uc$6Eo!VqE5doO<=@l_t{C(&9F5+!#6oP=5_TF$6+T zU4FU*OQB;p4+NMv<1s#RS+{Ooy2zR}Yux(v>jS6+pqLf1OE3kFR{^6dh{1S_50F!BZEc#!j2SaRS5O6F#Z*esB~c6=qXL*8 zu>fNumzgtXri)CQHZ4?O&YU>~Fd5}2rJc%x%fq7I(dsjK#$s&bGJX2=bdf1jri2R2 znl-BcCZn8oi`CO*kbgziaYh2;gAEUcXEn0BrhSpu3oK};04M~@z9A|pqR3>82-Ef6GD%y!O- z<}Fo~VB!j5jUGKZU1a$1;co2Mu|cL7S#o)uRN1VKS_z#GF|bOKMTQL<7Ak;t<^fS9 zPco&eDqzQ?ihtnUjz94#Ai9#ph!G=l!II1ZNmx)QqJ?3h^zQ)k;D*-c_r2%6QX+V@ zuBEA|$qgJhFoR~--2BflXwaZ`3?4kV9ro`71`L42mH3*|yYf;^t_WV{`p)yK=Qq#q zp0S=Kp6#B4o|0wj4=i?X52k`*M3upaeH~1=GhjO}76=mw< z!G%fQ_!nr5UFa2G0j!B{nszQF(lN?(iJhsAZ+3Q%VlSHRF@8-fZiT%2Tk`Xt`CpU% Z0)*n#a1boPs)+yq002ovPDHLkV1gVVHBtZo diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 01f3ba66c..26f8a328b 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1487,7 +1487,12 @@ public class LatinIME extends InputMethodService mVoiceInput.cancel(); } requestHideSelf(0); - mKeyboardSwitcher.getInputView().closing(); + if (mKeyboardSwitcher != null) { + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView != null) { + inputView.closing(); + } + } TextEntryState.endSession(); } diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 6d15d216c..a8ab9cc98 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -37,8 +37,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void onDestroy() { } - public static void logOnManualSuggestion(String before, String after, int position - , List suggestions) { + public static void logOnManualSuggestion( + String before, String after, int position, List suggestions) { } public static void logOnAutoSuggestion(String before, String after) { From 6e5a3986854549a45c95770b5a88ae5577e93299 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 24 Sep 2010 20:45:24 +0900 Subject: [PATCH 021/287] Fixed key code and key coordinates when move debounce has been in action This change refactors a key index and pointer position variables into a separate static inner class KeyState . This change also disables time debouncing. Bug: 3033737 Change-Id: Ie4fc37316c260330d8f0861e0771ea903a99cfce --- .../inputmethod/latin/PointerTracker.java | 248 +++++++++--------- 1 file changed, 129 insertions(+), 119 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index cb717cbe7..b56974ccf 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -42,7 +42,6 @@ public class PointerTracker { /* package */ static final int REPEAT_INTERVAL = 50; // ~20 keys per second private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout(); private static final int MULTITAP_INTERVAL = 800; // milliseconds - private static final int KEY_DEBOUNCE_TIME = 70; // Miscellaneous constants private static final int NOT_A_KEY = LatinKeyboardBaseView.NOT_A_KEY; @@ -57,10 +56,7 @@ public class PointerTracker { private Key[] mKeys; private int mKeyHysteresisDistanceSquared = -1; - private int mCurrentKey = NOT_A_KEY; - private int mStartX; - private int mStartY; - private long mDownTime; + private final KeyState mKeyState; // true if event is already translated to a key action (long press or mini-keyboard) private boolean mKeyAlreadyProcessed; @@ -68,18 +64,6 @@ public class PointerTracker { // true if this pointer is repeatable key private boolean mIsRepeatableKey; - // for move de-bouncing - private int mLastCodeX; - private int mLastCodeY; - private int mLastX; - private int mLastY; - - // for time de-bouncing - private int mLastKey; - private long mLastKeyTime; - private long mLastMoveTime; - private long mCurrentKeyTime; - // For multi-tap private int mLastSentIndex; private int mTapCount; @@ -90,6 +74,95 @@ public class PointerTracker { // pressed key private int mPreviousKey = NOT_A_KEY; + // This class keeps track of a key index and a position where this pointer is. + private static class KeyState { + private final KeyDetector mKeyDetector; + + // The position and time at which first down event occurred. + private int mStartX; + private int mStartY; + private long mDownTime; + + // The current key index where this pointer is. + private int mKeyIndex = NOT_A_KEY; + // The position where mKeyIndex was recognized for the first time. + private int mKeyX; + private int mKeyY; + + // Last pointer position. + private int mLastX; + private int mLastY; + + public KeyState(KeyDetector keyDetecor) { + mKeyDetector = keyDetecor; + } + + public int getKeyIndex() { + return mKeyIndex; + } + + public int getKeyX() { + return mKeyX; + } + + public int getKeyY() { + return mKeyY; + } + + public int getStartX() { + return mStartX; + } + + public int getStartY() { + return mStartY; + } + + public long getDownTime() { + return mDownTime; + } + + public int getLastX() { + return mLastX; + } + + public int getLastY() { + return mLastY; + } + + public int onDownKey(int x, int y, long eventTime) { + mStartX = x; + mStartY = y; + mDownTime = eventTime; + + return onMoveToNewKey(onMoveKeyInternal(x, y), x, y); + } + + private int onMoveKeyInternal(int x, int y) { + mLastX = x; + mLastY = y; + return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); + } + + public int onMoveKey(int x, int y) { + return onMoveKeyInternal(x, y); + } + + public int onMoveToNewKey(int keyIndex, int x, int y) { + mKeyIndex = keyIndex; + mKeyX = x; + mKeyY = y; + return keyIndex; + } + + public int onUpKey(int x, int y) { + return onMoveKeyInternal(x, y); + } + + public void onSetKeyboard() { + mKeyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(mKeyX, mKeyY, null); + } + } + public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy, boolean hasDistinctMultitouch) { if (proxy == null || handler == null || keyDetector == null) @@ -98,6 +171,7 @@ public class PointerTracker { mProxy = proxy; mHandler = handler; mKeyDetector = keyDetector; + mKeyState = new KeyState(keyDetector); mHasDistinctMultitouch = hasDistinctMultitouch; resetMultiTap(); } @@ -112,7 +186,7 @@ public class PointerTracker { mKeys = keys; mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance); // Update current key index because keyboard layout has been changed. - mCurrentKey = mKeyDetector.getKeyIndexAndNearbyCodes(mStartX, mStartY, null); + mKeyState.onSetKeyboard(); } private boolean isValidKeyIndex(int keyIndex) { @@ -133,7 +207,7 @@ public class PointerTracker { } public boolean isModifier() { - return isModifierInternal(mCurrentKey); + return isModifierInternal(mKeyState.getKeyIndex()); } public boolean isOnModifierKey(int x, int y) { @@ -190,21 +264,16 @@ public class PointerTracker { public void onDownEvent(int x, int y, long eventTime) { if (DEBUG) debugLog("onDownEvent:", x, y); - int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); - mCurrentKey = keyIndex; - mStartX = x; - mStartY = y; - mDownTime = eventTime; + int keyIndex = mKeyState.onDownKey(x, y, eventTime); mKeyAlreadyProcessed = false; mIsRepeatableKey = false; - startMoveDebouncing(x, y); - startTimeDebouncing(eventTime); checkMultiTap(eventTime, keyIndex); if (mListener != null) { int primaryCode = isValidKeyIndex(keyIndex) ? mKeys[keyIndex].codes[0] : 0; mListener.onPress(primaryCode); - // This onPress call may have changed keyboard layout and have updated mCurrentKey - keyIndex = mCurrentKey; + // This onPress call may have changed keyboard layout and have updated mKeyIndex. + // If that's the case, mKeyIndex has been updated in setKeyboard(). + keyIndex = mKeyState.getKeyIndex(); } if (isValidKeyIndex(keyIndex)) { if (mKeys[keyIndex].repeatable) { @@ -215,7 +284,6 @@ public class PointerTracker { mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); } showKeyPreviewAndUpdateKey(keyIndex); - updateMoveDebouncing(x, y); } public void onMoveEvent(int x, int y, long eventTime) { @@ -223,44 +291,28 @@ public class PointerTracker { debugLog("onMoveEvent:", x, y); if (mKeyAlreadyProcessed) return; - int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); + KeyState keyState = mKeyState; + int keyIndex = keyState.onMoveKey(x, y); if (isValidKeyIndex(keyIndex)) { - if (mCurrentKey == NOT_A_KEY) { - updateTimeDebouncing(eventTime); - mCurrentKey = keyIndex; + if (keyState.getKeyIndex() == NOT_A_KEY) { + keyState.onMoveToNewKey(keyIndex, x, y); mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); - } else if (isMinorMoveBounce(x, y, keyIndex, mCurrentKey)) { - updateTimeDebouncing(eventTime); - } else { + } else if (!isMinorMoveBounce(x, y, keyIndex)) { resetMultiTap(); - resetTimeDebouncing(eventTime, mCurrentKey); - resetMoveDebouncing(); - mCurrentKey = keyIndex; + keyState.onMoveToNewKey(keyIndex, x, y); mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); } } else { - if (mCurrentKey != NOT_A_KEY) { - updateTimeDebouncing(eventTime); - mCurrentKey = keyIndex; + if (keyState.getKeyIndex() != NOT_A_KEY) { + keyState.onMoveToNewKey(keyIndex, x ,y); mHandler.cancelLongPressTimer(); - } else if (isMinorMoveBounce(x, y, keyIndex, mCurrentKey)) { - updateTimeDebouncing(eventTime); - } else { + } else if (!isMinorMoveBounce(x, y, keyIndex)) { resetMultiTap(); - resetTimeDebouncing(eventTime, mCurrentKey); - resetMoveDebouncing(); - mCurrentKey = keyIndex; + keyState.onMoveToNewKey(keyIndex, x ,y); mHandler.cancelLongPressTimer(); } } - /* - * While time debouncing is in effect, mCurrentKey holds the new key and this tracker - * holds the last key. At ACTION_UP event if time debouncing will be in effect - * eventually, the last key should be sent as the result. In such case mCurrentKey - * should not be showed as popup preview. - */ - showKeyPreviewAndUpdateKey(isMinorTimeBounce() ? mLastKey : mCurrentKey); - updateMoveDebouncing(x, y); + showKeyPreviewAndUpdateKey(mKeyState.getKeyIndex()); } public void onUpEvent(int x, int y, long eventTime) { @@ -270,23 +322,18 @@ public class PointerTracker { return; mHandler.cancelKeyTimers(); mHandler.cancelPopupPreview(); - int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); - if (isMinorMoveBounce(x, y, keyIndex, mCurrentKey)) { - updateTimeDebouncing(eventTime); - } else { - resetMultiTap(); - resetTimeDebouncing(eventTime, mCurrentKey); - mCurrentKey = keyIndex; - } - if (isMinorTimeBounce()) { - mCurrentKey = mLastKey; - x = mLastCodeX; - y = mLastCodeY; + int keyIndex = mKeyState.onUpKey(x, y); + if (isMinorMoveBounce(x, y, keyIndex)) { + // Use previous fixed key index and coordinates. + keyIndex = mKeyState.getKeyIndex(); + x = mKeyState.getKeyX(); + y = mKeyState.getKeyY(); } showKeyPreviewAndUpdateKey(NOT_A_KEY); if (!mIsRepeatableKey) { - detectAndSendKey(mCurrentKey, x, y, eventTime); + detectAndSendKey(keyIndex, x, y, eventTime); } + if (isValidKeyIndex(keyIndex)) mProxy.invalidateKey(mKeys[keyIndex]); } @@ -297,7 +344,7 @@ public class PointerTracker { mHandler.cancelKeyTimers(); mHandler.cancelPopupPreview(); showKeyPreviewAndUpdateKey(NOT_A_KEY); - int keyIndex = mCurrentKey; + int keyIndex = mKeyState.getKeyIndex(); if (isValidKeyIndex(keyIndex)) mProxy.invalidateKey(mKeys[keyIndex]); } @@ -312,44 +359,30 @@ public class PointerTracker { } public int getLastX() { - return mLastX; + return mKeyState.getLastX(); } public int getLastY() { - return mLastY; + return mKeyState.getLastY(); } public long getDownTime() { - return mDownTime; + return mKeyState.getDownTime(); } // These package scope methods are only for debugging purpose. /* package */ int getStartX() { - return mStartX; + return mKeyState.getStartX(); } /* package */ int getStartY() { - return mStartY; + return mKeyState.getStartY(); } - private void startMoveDebouncing(int x, int y) { - mLastCodeX = x; - mLastCodeY = y; - } - - private void updateMoveDebouncing(int x, int y) { - mLastX = x; - mLastY = y; - } - - private void resetMoveDebouncing() { - mLastCodeX = mLastX; - mLastCodeY = mLastY; - } - - private boolean isMinorMoveBounce(int x, int y, int newKey, int curKey) { + private boolean isMinorMoveBounce(int x, int y, int newKey) { if (mKeys == null || mKeyHysteresisDistanceSquared < 0) throw new IllegalStateException("keyboard and/or hysteresis not set"); + int curKey = mKeyState.getKeyIndex(); if (newKey == curKey) { return true; } else if (isValidKeyIndex(curKey)) { @@ -371,30 +404,6 @@ public class PointerTracker { return dx * dx + dy * dy; } - private void startTimeDebouncing(long eventTime) { - mLastKey = NOT_A_KEY; - mLastKeyTime = 0; - mCurrentKeyTime = 0; - mLastMoveTime = eventTime; - } - - private void updateTimeDebouncing(long eventTime) { - mCurrentKeyTime += eventTime - mLastMoveTime; - mLastMoveTime = eventTime; - } - - private void resetTimeDebouncing(long eventTime, int currentKey) { - mLastKey = currentKey; - mLastKeyTime = mCurrentKeyTime + eventTime - mLastMoveTime; - mCurrentKeyTime = 0; - mLastMoveTime = eventTime; - } - - private boolean isMinorTimeBounce() { - return mCurrentKeyTime < mLastKeyTime && mCurrentKeyTime < KEY_DEBOUNCE_TIME - && mLastKey != NOT_A_KEY; - } - private void showKeyPreviewAndUpdateKey(int keyIndex) { updateKey(keyIndex); // The modifier key, such as shift key, should not be shown as preview when multi-touch is @@ -497,7 +506,8 @@ public class PointerTracker { } private void debugLog(String title, int x, int y) { - Key key = getKey(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null)); + int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); + Key key = getKey(keyIndex); final String code; if (key == null) { code = "----"; @@ -505,7 +515,7 @@ public class PointerTracker { int primaryCode = key.codes[0]; code = String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode); } - Log.d(TAG, String.format("%s [%d] %3d,%3d %s %s", title, mPointerId, x, y, code, - isModifier() ? "modifier" : "")); + Log.d(TAG, String.format("%s [%d] %3d,%3d %3d(%s) %s", title, mPointerId, x, y, keyIndex, + code, isModifier() ? "modifier" : "")); } -} \ No newline at end of file +} From 46941882b2c3f7467ce3d77be6948cfa7aafe548 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Wed, 29 Sep 2010 12:19:51 +0900 Subject: [PATCH 022/287] Tune mini keyboard vertical correction to match with key height Bug: 3040529 Change-Id: I8e3cc635737224537a019e66c38e1e2ea7a8bb8b --- java/res/layout/keyboard_popup.xml | 2 +- java/res/values-land/dimens.xml | 4 +++- java/res/values/dimens.xml | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml index 27388e06b..c6594f6bf 100644 --- a/java/res/layout/keyboard_popup.xml +++ b/java/res/layout/keyboard_popup.xml @@ -36,6 +36,6 @@ latin:keyBackground="@drawable/btn_keyboard_key_gingerbread_popup" latin:keyHysteresisDistance="0dip" - latin:verticalCorrection="-20dip" + latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction" /> diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml index ac0e030d4..1396bff9b 100644 --- a/java/res/values-land/dimens.xml +++ b/java/res/values-land/dimens.xml @@ -24,6 +24,8 @@ 63dip 2dip - + 79.9dip + + -47dip diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index b399af489..502157dcf 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -29,6 +29,8 @@ 2.5in 22sp - + 91.8dip + + -54dip From afb353277928b9c13a97f2aefde7412f432e060a Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Wed, 29 Sep 2010 04:17:36 +0900 Subject: [PATCH 023/287] Mini keyboard works even while shift is being pressed Bug: 3038861 Change-Id: I94011ca80710ff6eb24e940104f7d9d3bb86840a --- .../inputmethod/latin/LatinKeyboardBaseView.java | 14 +++++++++++--- .../android/inputmethod/latin/PointerTracker.java | 5 +++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 3761dab14..75ef691c8 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -205,6 +205,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private long mMiniKeyboardPopupTime; private int[] mWindowOffset; private final float mMiniKeyboardSlideAllowance; + private int mMiniKeyboardTrackerId; /** Listener for {@link OnKeyboardActionListener}. */ private OnKeyboardActionListener mKeyboardActionListener; @@ -1023,6 +1024,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx if (result) { dismissKeyPreview(); tracker.setAlreadyProcessed(); + mMiniKeyboardTrackerId = tracker.mPointerId; } return result; } @@ -1258,9 +1260,15 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Needs to be called after the gesture detector gets a turn, as it may have // displayed the mini keyboard if (mMiniKeyboard != null) { - MotionEvent translated = generateMiniKeyboardMotionEvent(action, x, y, eventTime); - mMiniKeyboard.onTouchEvent(translated); - translated.recycle(); + final int miniKeyboardPointerIndex = me.findPointerIndex(mMiniKeyboardTrackerId); + if (miniKeyboardPointerIndex >= 0 && miniKeyboardPointerIndex < pointerCount) { + final int miniKeyboardX = (int)me.getX(miniKeyboardPointerIndex); + final int miniKeyboardY = (int)me.getY(miniKeyboardPointerIndex); + MotionEvent translated = generateMiniKeyboardMotionEvent(action, + miniKeyboardX, miniKeyboardY, eventTime); + mMiniKeyboard.onTouchEvent(translated); + translated.recycle(); + } return true; } diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index b56974ccf..b416a984c 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -515,7 +515,8 @@ public class PointerTracker { int primaryCode = key.codes[0]; code = String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode); } - Log.d(TAG, String.format("%s [%d] %3d,%3d %3d(%s) %s", title, mPointerId, x, y, keyIndex, - code, isModifier() ? "modifier" : "")); + Log.d(TAG, String.format("%s%s[%d] %3d,%3d %3d(%s) %s", title, + (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, keyIndex, code, + (isModifier() ? "modifier" : ""))); } } From 179ada958b0bb46c6b9c8eb8b220d84dd3db855a Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Wed, 29 Sep 2010 14:30:01 +0900 Subject: [PATCH 024/287] Refactor CandidateView touch event handling This change also fixes tha the touch slop value is applyed only for initial movement of scrolling suggestion bar. Bug: 3004920 Change-Id: I62afdedc210156e41e8c84c48cade442f9d5a1aa --- java/res/values/dimens.xml | 1 + .../inputmethod/latin/CandidateView.java | 186 +++++++----------- 2 files changed, 77 insertions(+), 110 deletions(-) diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 502157dcf..f83fc36a6 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -33,4 +33,5 @@ 91.8dip -54dip + 0.3in diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 0f5b43009..9bbd30e24 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -16,17 +16,13 @@ package com.android.inputmethod.latin; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Paint.Align; import android.graphics.Rect; import android.graphics.Typeface; -import android.graphics.Paint.Align; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; @@ -40,75 +36,82 @@ import android.view.ViewGroup.LayoutParams; import android.widget.PopupWindow; import android.widget.TextView; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class CandidateView extends View { private static final int OUT_OF_BOUNDS = -1; - private static final List EMPTY_LIST = new ArrayList(); private LatinIME mService; - private List mSuggestions = EMPTY_LIST; + private final ArrayList mSuggestions = new ArrayList(); private boolean mShowingCompletions; private CharSequence mSelectedString; private int mSelectedIndex; private int mTouchX = OUT_OF_BOUNDS; - private Drawable mSelectionHighlight; + private final Drawable mSelectionHighlight; private boolean mTypedWordValid; private boolean mHaveMinimalSuggestion; private Rect mBgPadding; - private TextView mPreviewText; - private PopupWindow mPreviewPopup; + private final TextView mPreviewText; + private final PopupWindow mPreviewPopup; + private final int mDelayAfterPreview; private int mCurrentWordIndex; private Drawable mDivider; private static final int MAX_SUGGESTIONS = 32; private static final int SCROLL_PIXELS = 20; - private static final int MSG_REMOVE_PREVIEW = 1; - private static final int MSG_REMOVE_THROUGH_PREVIEW = 2; - - private int[] mWordWidth = new int[MAX_SUGGESTIONS]; - private int[] mWordX = new int[MAX_SUGGESTIONS]; + private final int[] mWordWidth = new int[MAX_SUGGESTIONS]; + private final int[] mWordX = new int[MAX_SUGGESTIONS]; private int mPopupPreviewX; private int mPopupPreviewY; private static final int X_GAP = 10; - private int mColorNormal; - private int mColorRecommended; - private int mColorOther; - private Paint mPaint; - private int mDescent; + private final int mColorNormal; + private final int mColorRecommended; + private final int mColorOther; + private final Paint mPaint; + private final int mDescent; private boolean mScrolled; private boolean mShowingAddToDictionary; private CharSequence mAddToDictionaryHint; private int mTargetScrollX; - private int mMinTouchableWidth; + private final int mMinTouchableWidth; private int mTotalWidth; - private GestureDetector mGestureDetector; + private final GestureDetector mGestureDetector; + + private final UIHandler mHandler = new UIHandler(); + + private class UIHandler extends Handler { + private static final int MSG_DISMISS_PREVIEW = 1; - Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_REMOVE_PREVIEW: - mPreviewText.setVisibility(GONE); - break; - case MSG_REMOVE_THROUGH_PREVIEW: - mPreviewText.setVisibility(GONE); - if (mTouchX != OUT_OF_BOUNDS) { - removeHighlight(); - } + case MSG_DISMISS_PREVIEW: + mPreviewPopup.dismiss(); break; } } - }; + + public void dismissPreview(long delay) { + sendMessageDelayed(obtainMessage(MSG_DISMISS_PREVIEW), delay); + } + + public void cancelDismissPreview() { + removeMessages(MSG_DISMISS_PREVIEW); + } + } /** * Construct a CandidateView for showing suggested words for completion. @@ -129,6 +132,8 @@ public class CandidateView extends View { mPreviewPopup.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); mPreviewPopup.setContentView(mPreviewText); mPreviewPopup.setBackgroundDrawable(null); + mPreviewPopup.setAnimationStyle(R.style.KeyPreviewAnimation); + mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview); mColorNormal = res.getColor(R.color.candidate_normal); mColorRecommended = res.getColor(R.color.candidate_recommended); mColorOther = res.getColor(R.color.candidate_other); @@ -142,13 +147,10 @@ public class CandidateView extends View { mPaint.setStrokeWidth(0); mPaint.setTextAlign(Align.CENTER); mDescent = (int) mPaint.descent(); - // 50 pixels for a 160dpi device would mean about 0.3 inch - mMinTouchableWidth = (int) (getResources().getDisplayMetrics().density * 50); + mMinTouchableWidth = (int)res.getDimension(R.dimen.candidate_min_touchable_width); // Slightly reluctant to scroll to be able to easily choose the suggestion - // 50 pixels for a 160dpi device would mean about 0.3 inch - final int touchSlop = (int) (getResources().getDisplayMetrics().density * 50); - final int touchSlopSquare = touchSlop * touchSlop; + final int touchSlopSquare = mMinTouchableWidth * mMinTouchableWidth; mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { @Override public void onLongPress(MotionEvent me) { @@ -158,15 +160,25 @@ public class CandidateView extends View { } } } - + + @Override + public boolean onDown(MotionEvent e) { + mScrolled = false; + return false; + } + @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - final int deltaX = (int) (e2.getX() - e1.getX()); - final int deltaY = (int) (e2.getY() - e1.getY()); - final int distance = (deltaX * deltaX) + (deltaY * deltaY); - if (distance < touchSlopSquare) { - return false; + if (!mScrolled) { + // This is applied only when we recognize that scrolling is starting. + final int deltaX = (int) (e2.getX() - e1.getX()); + final int deltaY = (int) (e2.getY() - e1.getY()); + final int distance = (deltaX * deltaX) + (deltaY * deltaY); + if (distance < touchSlopSquare) { + return true; + } + mScrolled = true; } final int width = getWidth(); @@ -215,7 +227,6 @@ public class CandidateView extends View { super.onDraw(canvas); } mTotalWidth = 0; - if (mSuggestions == null) return; final int height = getHeight(); if (mBgPadding == null) { @@ -226,8 +237,8 @@ public class CandidateView extends View { mDivider.setBounds(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } - int x = 0; - final int count = Math.min(mSuggestions.size(), MAX_SUGGESTIONS); + + final int count = mSuggestions.size(); final Rect bgPadding = mBgPadding; final Paint paint = mPaint; final int touchX = mTouchX; @@ -238,25 +249,26 @@ public class CandidateView extends View { boolean existsAutoCompletion = false; + int x = 0; for (int i = 0; i < count; i++) { CharSequence suggestion = mSuggestions.get(i); if (suggestion == null) continue; + final int wordLength = suggestion.length(); + paint.setColor(mColorNormal); if (mHaveMinimalSuggestion && ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) { paint.setTypeface(Typeface.DEFAULT_BOLD); paint.setColor(mColorRecommended); existsAutoCompletion = true; - } else if (i != 0 || (suggestion.length() == 1 && count > 1)) { + } else if (i != 0 || (wordLength == 1 && count > 1)) { // HACK: even if i == 0, we use mColorOther when this suggestion's length is 1 and // there are multiple suggestions, such as the default punctuation list. paint.setColor(mColorOther); } - final int wordWidth; - if (mWordWidth[i] != 0) { - wordWidth = mWordWidth[i]; - } else { - float textWidth = paint.measureText(suggestion, 0, suggestion.length()); + int wordWidth; + if ((wordWidth = mWordWidth[i]) == 0) { + float textWidth = paint.measureText(suggestion, 0, wordLength); wordWidth = Math.max(mMinTouchableWidth, (int) textWidth + X_GAP * 2); mWordWidth[i] = wordWidth; } @@ -277,7 +289,7 @@ public class CandidateView extends View { } if (canvas != null) { - canvas.drawText(suggestion, 0, suggestion.length(), x + wordWidth / 2, y, paint); + canvas.drawText(suggestion, 0, wordLength, x + wordWidth / 2, y, paint); paint.setColor(mColorOther); canvas.translate(x + wordWidth, 0); // Draw a divider unless it's after the hint @@ -324,7 +336,12 @@ public class CandidateView extends View { boolean typedWordValid, boolean haveMinimalSuggestion) { clear(); if (suggestions != null) { - mSuggestions = new ArrayList(suggestions); + int insertCount = Math.min(suggestions.size(), MAX_SUGGESTIONS); + for (CharSequence suggestion : suggestions) { + mSuggestions.add(suggestion); + if (--insertCount == 0) + break; + } } mShowingCompletions = completions; mTypedWordValid = typedWordValid; @@ -355,50 +372,6 @@ public class CandidateView extends View { return true; } - public void scrollPrev() { - int i = 0; - final int count = Math.min(mSuggestions.size(), MAX_SUGGESTIONS); - int firstItem = 0; // Actually just before the first item, if at the boundary - while (i < count) { - if (mWordX[i] < getScrollX() - && mWordX[i] + mWordWidth[i] >= getScrollX() - 1) { - firstItem = i; - break; - } - i++; - } - int leftEdge = mWordX[firstItem] + mWordWidth[firstItem] - getWidth(); - if (leftEdge < 0) leftEdge = 0; - updateScrollPosition(leftEdge); - } - - public void scrollNext() { - int i = 0; - int scrollX = getScrollX(); - int targetX = scrollX; - final int count = Math.min(mSuggestions.size(), MAX_SUGGESTIONS); - int rightEdge = scrollX + getWidth(); - while (i < count) { - if (mWordX[i] <= rightEdge && - mWordX[i] + mWordWidth[i] >= rightEdge) { - targetX = Math.min(mWordX[i], mTotalWidth - getWidth()); - break; - } - i++; - } - updateScrollPosition(targetX); - } - - private void updateScrollPosition(int targetX) { - if (targetX != getScrollX()) { - // TODO: Animate - mTargetScrollX = targetX; - requestLayout(); - invalidate(); - mScrolled = true; - } - } - /* package */ List getSuggestions() { return mSuggestions; } @@ -406,7 +379,7 @@ public class CandidateView extends View { public void clear() { // Don't call mSuggestions.clear() because it's being used for logging // in LatinIME.pickSuggestionManually(). - mSuggestions = EMPTY_LIST; + mSuggestions.clear(); mTouchX = OUT_OF_BOUNDS; mSelectedString = null; mSelectedIndex = -1; @@ -414,9 +387,7 @@ public class CandidateView extends View { invalidate(); Arrays.fill(mWordWidth, 0); Arrays.fill(mWordX, 0); - if (mPreviewPopup.isShowing()) { - mPreviewPopup.dismiss(); - } + mPreviewPopup.dismiss(); } @Override @@ -433,7 +404,6 @@ public class CandidateView extends View { switch (action) { case MotionEvent.ACTION_DOWN: - mScrolled = false; invalidate(); break; case MotionEvent.ACTION_MOVE: @@ -453,7 +423,6 @@ public class CandidateView extends View { mSelectedIndex = -1; } } - invalidate(); break; case MotionEvent.ACTION_UP: if (!mScrolled) { @@ -473,8 +442,8 @@ public class CandidateView extends View { mSelectedString = null; mSelectedIndex = -1; removeHighlight(); - hidePreview(); requestLayout(); + mHandler.dismissPreview(mDelayAfterPreview); break; } return true; @@ -482,10 +451,7 @@ public class CandidateView extends View { private void hidePreview() { mCurrentWordIndex = OUT_OF_BOUNDS; - if (mPreviewPopup.isShowing()) { - mHandler.sendMessageDelayed(mHandler - .obtainMessage(MSG_REMOVE_PREVIEW), 60); - } + mPreviewPopup.dismiss(); } private void showPreview(int wordIndex, String altText) { @@ -496,6 +462,7 @@ public class CandidateView extends View { if (wordIndex == OUT_OF_BOUNDS) { hidePreview(); } else { + mHandler.cancelDismissPreview(); CharSequence word = altText != null? altText : mSuggestions.get(wordIndex); mPreviewText.setText(word); mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), @@ -508,7 +475,6 @@ public class CandidateView extends View { mPopupPreviewX = mWordX[wordIndex] - mPreviewText.getPaddingLeft() - getScrollX() + (mWordWidth[wordIndex] - wordWidth) / 2; mPopupPreviewY = - popupHeight; - mHandler.removeMessages(MSG_REMOVE_PREVIEW); int [] offsetInWindow = new int[2]; getLocationInWindow(offsetInWindow); if (mPreviewPopup.isShowing()) { From b8fa10080dfac777fce7c8a7fc3180e8b540f9f5 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Tue, 28 Sep 2010 16:35:29 -0700 Subject: [PATCH 025/287] Check recorrection on focusing into a text field that has text already. Bug: 3004827 Change-Id: I00e9d925fcf17fa9f7a9aefe6572a648e023be11 --- .../android/inputmethod/latin/LatinIME.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 26f8a328b..0bfcc0704 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -676,10 +676,33 @@ public class LatinIME extends InputMethodService inputView.setPreviewEnabled(mPopupOn); inputView.setProximityCorrectionEnabled(true); mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || mShowSuggestions); + // If we just entered a text field, maybe it has some old text that requires correction + checkReCorrectionOnStart(); checkTutorial(attribute.privateImeOptions); if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); } + private void checkReCorrectionOnStart() { + if (mReCorrectionEnabled && isPredictionOn()) { + // First get the cursor position. This is required by setOldSuggestions(), so that + // it can pass the correct range to setComposingRegion(). At this point, we don't + // have valid values for mLastSelectionStart/Stop because onUpdateSelection() has + // not been called yet. + InputConnection ic = getCurrentInputConnection(); + if (ic == null) return; + ExtractedTextRequest etr = new ExtractedTextRequest(); + etr.token = 0; // anything is fine here + ExtractedText et = ic.getExtractedText(etr, 0); + if (et == null) return; + + mLastSelectionStart = et.startOffset + et.selectionStart; + mLastSelectionEnd = et.startOffset + et.selectionEnd; + + // Then look for possible corrections in a delayed fashion + if (!TextUtils.isEmpty(et.text)) postUpdateOldSuggestions(); + } + } + @Override public void onFinishInput() { super.onFinishInput(); From bdfcb664f4167c60f0241a4cdf87ad3c2e63027d Mon Sep 17 00:00:00 2001 From: Ying Wang Date: Wed, 29 Sep 2010 15:21:28 -0700 Subject: [PATCH 026/287] Fix proguard flag file dependency. Change-Id: I26a639aea0e0b11ba65d621696c42e861847498e --- java/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/Android.mk b/java/Android.mk index e966fc7f3..03d48aaa7 100644 --- a/java/Android.mk +++ b/java/Android.mk @@ -17,6 +17,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-common LOCAL_SDK_VERSION := current -LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags +LOCAL_PROGUARD_FLAG_FILES := proguard.flags include $(BUILD_PACKAGE) From c9716b28ce438e06b5cacc07fc002944bcbe24a0 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 30 Sep 2010 12:10:03 +0900 Subject: [PATCH 027/287] Disable suggestion selection preview popup Bug: 3048642 Bug: 3004920 Change-Id: Ibfb495a246c9e2da6ebf3c03d10ed8acff00f54b --- .../inputmethod/latin/CandidateView.java | 111 ++++++++++-------- 1 file changed, 59 insertions(+), 52 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 9bbd30e24..56f9ba207 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -149,61 +149,69 @@ public class CandidateView extends View { mDescent = (int) mPaint.descent(); mMinTouchableWidth = (int)res.getDimension(R.dimen.candidate_min_touchable_width); - // Slightly reluctant to scroll to be able to easily choose the suggestion - final int touchSlopSquare = mMinTouchableWidth * mMinTouchableWidth; - mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { - @Override - public void onLongPress(MotionEvent me) { - if (mSuggestions.size() > 0) { - if (me.getX() + getScrollX() < mWordWidth[0] && getScrollX() < 10) { - longPressFirstWord(); - } - } - } - - @Override - public boolean onDown(MotionEvent e) { - mScrolled = false; - return false; - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - if (!mScrolled) { - // This is applied only when we recognize that scrolling is starting. - final int deltaX = (int) (e2.getX() - e1.getX()); - final int deltaY = (int) (e2.getY() - e1.getY()); - final int distance = (deltaX * deltaX) + (deltaY * deltaY); - if (distance < touchSlopSquare) { - return true; - } - mScrolled = true; - } - - final int width = getWidth(); - mScrolled = true; - int scrollX = getScrollX(); - scrollX += (int) distanceX; - if (scrollX < 0) { - scrollX = 0; - } - if (distanceX > 0 && scrollX + width > mTotalWidth) { - scrollX -= (int) distanceX; - } - mTargetScrollX = scrollX; - scrollTo(scrollX, getScrollY()); - hidePreview(); - invalidate(); - return true; - } - }); + mGestureDetector = new GestureDetector( + new CandidateStripGestureListener(mMinTouchableWidth)); setWillNotDraw(false); setHorizontalScrollBarEnabled(false); setVerticalScrollBarEnabled(false); scrollTo(0, getScrollY()); } - + + private class CandidateStripGestureListener extends GestureDetector.SimpleOnGestureListener { + private final int mTouchSlopSquare; + + public CandidateStripGestureListener(int touchSlop) { + // Slightly reluctant to scroll to be able to easily choose the suggestion + mTouchSlopSquare = touchSlop * touchSlop; + } + + @Override + public void onLongPress(MotionEvent me) { + if (mSuggestions.size() > 0) { + if (me.getX() + getScrollX() < mWordWidth[0] && getScrollX() < 10) { + longPressFirstWord(); + } + } + } + + @Override + public boolean onDown(MotionEvent e) { + mScrolled = false; + return false; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, + float distanceX, float distanceY) { + if (!mScrolled) { + // This is applied only when we recognize that scrolling is starting. + final int deltaX = (int) (e2.getX() - e1.getX()); + final int deltaY = (int) (e2.getY() - e1.getY()); + final int distance = (deltaX * deltaX) + (deltaY * deltaY); + if (distance < mTouchSlopSquare) { + return true; + } + mScrolled = true; + } + + final int width = getWidth(); + mScrolled = true; + int scrollX = getScrollX(); + scrollX += (int) distanceX; + if (scrollX < 0) { + scrollX = 0; + } + if (distanceX > 0 && scrollX + width > mTotalWidth) { + scrollX -= (int) distanceX; + } + mTargetScrollX = scrollX; + scrollTo(scrollX, getScrollY()); + hidePreview(); + invalidate(); + return true; + } + } + /** * A connection back to the service to communicate with the text field * @param listener @@ -282,7 +290,6 @@ public class CandidateView extends View { mSelectionHighlight.setBounds(0, bgPadding.top, wordWidth, height); mSelectionHighlight.draw(canvas); canvas.translate(-x, 0); - showPreview(i, null); } mSelectedString = suggestion; mSelectedIndex = i; @@ -443,7 +450,6 @@ public class CandidateView extends View { mSelectedIndex = -1; removeHighlight(); requestLayout(); - mHandler.dismissPreview(mDelayAfterPreview); break; } return true; @@ -501,6 +507,7 @@ public class CandidateView extends View { if (word.length() < 2) return; if (mService.addWordToDictionary(word.toString())) { showPreview(0, getContext().getResources().getString(R.string.added_word, word)); + mHandler.dismissPreview(mDelayAfterPreview); } } From e7cfc8ab8853e215b655f2184c47036e117aa8c7 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 30 Sep 2010 12:41:57 +0900 Subject: [PATCH 028/287] Eliminate compiler warning Change-Id: Ib3effaa6f4e8cfc3951ab5d5d099335fd3856a2f --- .../com/android/inputmethod/latin/SharedPreferencesCompat.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/SharedPreferencesCompat.java b/java/src/com/android/inputmethod/latin/SharedPreferencesCompat.java index 8364c90fa..1d36c0b98 100644 --- a/java/src/com/android/inputmethod/latin/SharedPreferencesCompat.java +++ b/java/src/com/android/inputmethod/latin/SharedPreferencesCompat.java @@ -30,8 +30,7 @@ public class SharedPreferencesCompat { private static Method findApplyMethod() { try { - Class cls = SharedPreferences.Editor.class; - return cls.getMethod("apply"); + return SharedPreferences.Editor.class.getMethod("apply"); } catch (NoSuchMethodException unused) { // fall through } From 11a578f4f130ebae66fb1bd9953874f421c3c09c Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 30 Sep 2010 16:01:53 +0900 Subject: [PATCH 029/287] Disable suggestion bar before invoke Voice input Bug: 3002817 Change-Id: I099dd63e58d5159a609c1d934dbb6f5aab914305 --- java/src/com/android/inputmethod/latin/LatinIME.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 0bfcc0704..fb9c47db2 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1567,7 +1567,9 @@ public class LatinIME extends InputMethodService if (mKeyboardSwitcher.getInputView() != null) { setInputView(mKeyboardSwitcher.getInputView()); } + setCandidatesViewShown(true); updateInputViewShown(); + postUpdateSuggestions(); }}); } @@ -1575,6 +1577,7 @@ public class LatinIME extends InputMethodService final boolean configChanged = mConfigurationChanging; mHandler.post(new Runnable() { public void run() { + setCandidatesViewShown(false); mRecognizing = true; View v = mVoiceInput.getView(); ViewParent p = v.getParent(); From fcba53ef7c874a4685c12c01404c91b779cae1e8 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 30 Sep 2010 14:26:12 +0900 Subject: [PATCH 030/287] Display feedback popup for saving word while the word is pressing. Bug: 3004696 Change-Id: Icc5bdd6945f3bf79f7234a0227d8036d6f6d4c1d --- .../inputmethod/latin/CandidateView.java | 40 ++----------------- 1 file changed, 3 insertions(+), 37 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 56f9ba207..89afd168e 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -24,8 +24,6 @@ import android.graphics.Paint.Align; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.Message; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.Gravity; @@ -59,7 +57,6 @@ public class CandidateView extends View { private final TextView mPreviewText; private final PopupWindow mPreviewPopup; - private final int mDelayAfterPreview; private int mCurrentWordIndex; private Drawable mDivider; @@ -90,29 +87,6 @@ public class CandidateView extends View { private final GestureDetector mGestureDetector; - private final UIHandler mHandler = new UIHandler(); - - private class UIHandler extends Handler { - private static final int MSG_DISMISS_PREVIEW = 1; - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_DISMISS_PREVIEW: - mPreviewPopup.dismiss(); - break; - } - } - - public void dismissPreview(long delay) { - sendMessageDelayed(obtainMessage(MSG_DISMISS_PREVIEW), delay); - } - - public void cancelDismissPreview() { - removeMessages(MSG_DISMISS_PREVIEW); - } - } - /** * Construct a CandidateView for showing suggested words for completion. * @param context @@ -133,7 +107,6 @@ public class CandidateView extends View { mPreviewPopup.setContentView(mPreviewText); mPreviewPopup.setBackgroundDrawable(null); mPreviewPopup.setAnimationStyle(R.style.KeyPreviewAnimation); - mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview); mColorNormal = res.getColor(R.color.candidate_normal); mColorRecommended = res.getColor(R.color.candidate_recommended); mColorOther = res.getColor(R.color.candidate_other); @@ -394,7 +367,6 @@ public class CandidateView extends View { invalidate(); Arrays.fill(mWordWidth, 0); Arrays.fill(mWordX, 0); - mPreviewPopup.dismiss(); } @Override @@ -448,8 +420,9 @@ public class CandidateView extends View { } mSelectedString = null; mSelectedIndex = -1; - removeHighlight(); requestLayout(); + hidePreview(); + invalidate(); break; } return true; @@ -468,7 +441,6 @@ public class CandidateView extends View { if (wordIndex == OUT_OF_BOUNDS) { hidePreview(); } else { - mHandler.cancelDismissPreview(); CharSequence word = altText != null? altText : mSuggestions.get(wordIndex); mPreviewText.setText(word); mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), @@ -496,18 +468,12 @@ public class CandidateView extends View { } } } - - private void removeHighlight() { - mTouchX = OUT_OF_BOUNDS; - invalidate(); - } - + private void longPressFirstWord() { CharSequence word = mSuggestions.get(0); if (word.length() < 2) return; if (mService.addWordToDictionary(word.toString())) { showPreview(0, getContext().getResources().getString(R.string.added_word, word)); - mHandler.dismissPreview(mDelayAfterPreview); } } From 36f97dd6897b17841c1e6aab4612f3905185a90c Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 30 Sep 2010 08:20:48 +0900 Subject: [PATCH 031/287] Fixed assets - Make the background of popup key a full transparent color - Updated the background mdpi asset of keyboard Bug: 2975027 Bug: 3048638 Change-Id: I8709a1ca403e5c3f862a8be9be1668d30c7687f8 --- .../keyboard_dark_background.9.png | Bin 232 -> 196 bytes java/res/layout/keyboard_popup.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/drawable-mdpi/keyboard_dark_background.9.png b/java/res/drawable-mdpi/keyboard_dark_background.9.png index a2136f7de4c0557d2f76f171b0f15105751d2c0f..4f81704c477775bba6b4edf866146dfa7783d2a5 100644 GIT binary patch delta 165 zcmaFCc!W{0Gr-TCmrII^fq{Y7)59eQNQ(loFb5lutoL*4o~Wo%o#yG{7*cWT%@jkv z1_K`Ew;cvh z?mbc_=dHP7tDpDT91nfpjRFVRmzXTo{5yY(|NJ#^D=wC#-INcXe?;#9gV9}8?#6#A R7C@UBJYD@<);T3K0RRhMJ)Hmm delta 202 zcmX@Y_<~WfGr-TCmrII^fq{Y7)59eQNGkxb3J$A*ol`>o{sPWUj(J@j$I29SJd7h2%`vWee?u|N zEt{9CzUQ#+j36h?RBng0R~gPUN(x(e$R=2vzRI|oJ)fOPfdPn4d=@of5BvXlMI!@8 zgMYcp`WKv)sRlpYdG9F5Uf|5UemDMga04U5`Fn;uYZtv(404{QtDnm{r-UW|%*aIx diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml index c6594f6bf..8d64bab37 100644 --- a/java/res/layout/keyboard_popup.xml +++ b/java/res/layout/keyboard_popup.xml @@ -32,7 +32,7 @@ android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/keyboard_dark_background" + android:background="@drawable/btn_keyboard_key_gingerbread_popup" latin:keyBackground="@drawable/btn_keyboard_key_gingerbread_popup" latin:keyHysteresisDistance="0dip" From a1cc4f0a8d9a70ff1515d1ddb1476f6ce630afe2 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 30 Sep 2010 17:57:23 +0900 Subject: [PATCH 032/287] Long pressing mic/comma key will show settings menue Bug: 3050703 Change-Id: I62773c10f435d13174f6ff6574912cb99303e83c --- java/res/values/bools.xml | 1 + .../inputmethod/latin/LatinKeyboardView.java | 30 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml index 1f8051bfd..5a24e4c60 100644 --- a/java/res/values/bools.xml +++ b/java/res/values/bools.xml @@ -29,4 +29,5 @@ true true + true diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 2872f6b46..c4afd9a27 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -17,6 +17,7 @@ package com.android.inputmethod.latin; import android.content.Context; +import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Paint; import android.inputmethodservice.Keyboard; @@ -41,6 +42,8 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { private Keyboard mPhoneKeyboard; + private final boolean mLongPressCommaForSettingsEnabled; + /** Whether we've started dropping move events because we found a big jump */ private boolean mDroppingEvents; /** @@ -54,11 +57,15 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { private int mLastRowY; public LatinKeyboardView(Context context, AttributeSet attrs) { - super(context, attrs); + this(context, attrs, 0); } public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + + Resources res = context.getResources(); + mLongPressCommaForSettingsEnabled = res.getBoolean( + R.bool.config_long_press_comma_for_settings_enabled); } public void setPhoneKeyboard(Keyboard phoneKeyboard) { @@ -90,22 +97,25 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { protected boolean onLongPress(Key key) { int primaryCode = key.codes[0]; if (primaryCode == KEYCODE_OPTIONS) { - getOnKeyboardActionListener().onKey(KEYCODE_OPTIONS_LONGPRESS, null, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE); - return true; + return invokeOnKey(KEYCODE_OPTIONS_LONGPRESS); } else if (primaryCode == '0' && getKeyboard() == mPhoneKeyboard) { // Long pressing on 0 in phone number keypad gives you a '+'. - getOnKeyboardActionListener().onKey( - '+', null, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE); - return true; + return invokeOnKey('+'); + } else if (primaryCode == KEYCODE_VOICE + || (primaryCode == ',' && mLongPressCommaForSettingsEnabled)) { + return invokeOnKey(KEYCODE_OPTIONS); } else { return super.onLongPress(key); } } + private boolean invokeOnKey(int primaryCode) { + getOnKeyboardActionListener().onKey(primaryCode, null, + LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, + LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE); + return true; + } + @Override protected CharSequence adjustCase(CharSequence label) { Keyboard keyboard = getKeyboard(); From a0a60b37b265988191083e1b5abbe616a67759b4 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 1 Oct 2010 09:46:04 +0900 Subject: [PATCH 033/287] Revert changes to keyboard_popup.xml for now. This unexpectedly bloated keys in mini popup keyboard. bug: 3048638 Change-Id: I2b717c9007ce7717bac514f1d8bcae1280130cf4 --- java/res/layout/keyboard_popup.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml index 8d64bab37..c6594f6bf 100644 --- a/java/res/layout/keyboard_popup.xml +++ b/java/res/layout/keyboard_popup.xml @@ -32,7 +32,7 @@ android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/btn_keyboard_key_gingerbread_popup" + android:background="@drawable/keyboard_dark_background" latin:keyBackground="@drawable/btn_keyboard_key_gingerbread_popup" latin:keyHysteresisDistance="0dip" From 4fa67efc790600cce51cee844875b185c16438c1 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 1 Oct 2010 12:42:44 +0900 Subject: [PATCH 034/287] Dismiss orange highlight after suggestion has been selected Bug: 3051311 Change-Id: Ia32cd8748a0afade07a9896ad77400cf42aed0f5 --- .../android/inputmethod/latin/CandidateView.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 89afd168e..68f288925 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -40,14 +40,15 @@ import java.util.List; public class CandidateView extends View { - private static final int OUT_OF_BOUNDS = -1; + private static final int OUT_OF_BOUNDS_WORD_INDEX = -1; + private static final int OUT_OF_BOUNDS_X_COORD = -1; private LatinIME mService; private final ArrayList mSuggestions = new ArrayList(); private boolean mShowingCompletions; private CharSequence mSelectedString; private int mSelectedIndex; - private int mTouchX = OUT_OF_BOUNDS; + private int mTouchX = OUT_OF_BOUNDS_X_COORD; private final Drawable mSelectionHighlight; private boolean mTypedWordValid; @@ -256,8 +257,8 @@ public class CandidateView extends View { mWordX[i] = x; - if (touchX + scrollX >= x && touchX + scrollX < x + wordWidth && !scrolled && - touchX != OUT_OF_BOUNDS) { + if (touchX != OUT_OF_BOUNDS_X_COORD && !scrolled + && touchX + scrollX >= x && touchX + scrollX < x + wordWidth) { if (canvas != null && !mShowingAddToDictionary) { canvas.translate(x, 0); mSelectionHighlight.setBounds(0, bgPadding.top, wordWidth, height); @@ -360,7 +361,7 @@ public class CandidateView extends View { // Don't call mSuggestions.clear() because it's being used for logging // in LatinIME.pickSuggestionManually(). mSuggestions.clear(); - mTouchX = OUT_OF_BOUNDS; + mTouchX = OUT_OF_BOUNDS_X_COORD; mSelectedString = null; mSelectedIndex = -1; mShowingAddToDictionary = false; @@ -429,7 +430,8 @@ public class CandidateView extends View { } private void hidePreview() { - mCurrentWordIndex = OUT_OF_BOUNDS; + mTouchX = OUT_OF_BOUNDS_X_COORD; + mCurrentWordIndex = OUT_OF_BOUNDS_WORD_INDEX; mPreviewPopup.dismiss(); } @@ -438,7 +440,7 @@ public class CandidateView extends View { mCurrentWordIndex = wordIndex; // If index changed or changing text if (oldWordIndex != mCurrentWordIndex || altText != null) { - if (wordIndex == OUT_OF_BOUNDS) { + if (wordIndex == OUT_OF_BOUNDS_WORD_INDEX) { hidePreview(); } else { CharSequence word = altText != null? altText : mSuggestions.get(wordIndex); From 88a045637a8aa812ec09e2fa6ad0b75dd401e1f9 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 1 Oct 2010 16:08:41 +0900 Subject: [PATCH 035/287] Make the background of keypopup transparent Change-Id: I5240ffdd8e48bcb99c2edf878d8efaba2cafeb07 --- java/res/layout/keyboard_popup.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml index c6594f6bf..9ecbcd4e9 100644 --- a/java/res/layout/keyboard_popup.xml +++ b/java/res/layout/keyboard_popup.xml @@ -32,7 +32,7 @@ android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/keyboard_dark_background" + android:background="@color/latinkeyboard_transparent" latin:keyBackground="@drawable/btn_keyboard_key_gingerbread_popup" latin:keyHysteresisDistance="0dip" From 8e1f1be0f3cfce4ed0623d3d137f53f034f5b718 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 1 Oct 2010 16:42:13 +0900 Subject: [PATCH 036/287] Long press mic/comma key bring mini keyboard with settings Bug: 3050703 Change-Id: I090b2bfebfb48e5ec461615d4c911024ea6d130a --- java/res/values/keycodes.xml | 1 + java/res/xml-da/kbd_qwerty.xml | 12 ------ java/res/xml-da/kbd_qwerty_black.xml | 24 +++-------- java/res/xml-de/kbd_qwerty.xml | 12 ------ java/res/xml-de/kbd_qwerty_black.xml | 24 +++-------- java/res/xml-fr/kbd_qwerty.xml | 12 ------ java/res/xml-fr/kbd_qwerty_black.xml | 24 +++-------- java/res/xml-iw/kbd_qwerty.xml | 12 ------ java/res/xml-iw/kbd_qwerty_black.xml | 24 +++-------- java/res/xml-nb/kbd_qwerty.xml | 12 ------ java/res/xml-nb/kbd_qwerty_black.xml | 24 +++-------- java/res/xml-ru/kbd_qwerty.xml | 12 ------ java/res/xml-ru/kbd_qwerty_black.xml | 24 +++-------- java/res/xml-sr/kbd_qwerty.xml | 12 ------ java/res/xml-sr/kbd_qwerty_black.xml | 24 +++-------- java/res/xml-sv/kbd_qwerty.xml | 12 ------ java/res/xml-sv/kbd_qwerty_black.xml | 24 +++-------- java/res/xml/kbd_qwerty.xml | 12 ------ java/res/xml/kbd_qwerty_black.xml | 24 +++-------- java/res/xml/popup_comma.xml | 39 ++++++++++++++++++ java/res/xml/popup_mic.xml | 40 +++++++++++++++++++ .../inputmethod/latin/LatinKeyboard.java | 2 + .../inputmethod/latin/LatinKeyboardView.java | 10 ----- 23 files changed, 136 insertions(+), 280 deletions(-) create mode 100644 java/res/xml/popup_comma.xml create mode 100644 java/res/xml/popup_mic.xml diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml index 9dded508a..c5d5b3cd1 100644 --- a/java/res/values/keycodes.xml +++ b/java/res/values/keycodes.xml @@ -27,5 +27,6 @@ -5 -100 + -102 -103 diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index a17d604bf..084795463 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -176,8 +176,6 @@ android:keyEdgeFlags="left" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + + + + + + + + diff --git a/java/res/xml/popup_mic.xml b/java/res/xml/popup_mic.xml new file mode 100644 index 000000000..f3cc63817 --- /dev/null +++ b/java/res/xml/popup_mic.xml @@ -0,0 +1,40 @@ + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 14a503bc3..43d0a7beb 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -367,11 +367,13 @@ public class LatinKeyboard extends Keyboard { mF1Key.label = null; mF1Key.icon = mMicIcon; mF1Key.iconPreview = mMicPreviewIcon; + mF1Key.popupResId = R.xml.popup_mic; } else { mF1Key.label = ","; mF1Key.codes = new int[] { ',' }; mF1Key.icon = null; mF1Key.iconPreview = null; + mF1Key.popupResId = R.xml.popup_comma; } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index c4afd9a27..22d39f7aa 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -17,7 +17,6 @@ package com.android.inputmethod.latin; import android.content.Context; -import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Paint; import android.inputmethodservice.Keyboard; @@ -42,8 +41,6 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { private Keyboard mPhoneKeyboard; - private final boolean mLongPressCommaForSettingsEnabled; - /** Whether we've started dropping move events because we found a big jump */ private boolean mDroppingEvents; /** @@ -62,10 +59,6 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - - Resources res = context.getResources(); - mLongPressCommaForSettingsEnabled = res.getBoolean( - R.bool.config_long_press_comma_for_settings_enabled); } public void setPhoneKeyboard(Keyboard phoneKeyboard) { @@ -101,9 +94,6 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { } else if (primaryCode == '0' && getKeyboard() == mPhoneKeyboard) { // Long pressing on 0 in phone number keypad gives you a '+'. return invokeOnKey('+'); - } else if (primaryCode == KEYCODE_VOICE - || (primaryCode == ',' && mLongPressCommaForSettingsEnabled)) { - return invokeOnKey(KEYCODE_OPTIONS); } else { return super.onLongPress(key); } From 4fc510a7890976d9968d73ceacf3983e77f489d2 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 1 Oct 2010 19:40:44 +0900 Subject: [PATCH 037/287] Unbundle Keyboard.java to BaseKeyboard.java Change-Id: I8b310c2c0cae1a151e53c22001c586697346982c --- java/res/values/attrs.xml | 56 ++ java/res/xml-da/kbd_qwerty.xml | 736 ++++++++-------- java/res/xml-da/kbd_qwerty_black.xml | 620 +++++++------- java/res/xml-de/kbd_qwerty.xml | 714 ++++++++-------- java/res/xml-de/kbd_qwerty_black.xml | 598 ++++++------- java/res/xml-fr/kbd_qwerty.xml | 714 ++++++++-------- java/res/xml-fr/kbd_qwerty_black.xml | 598 ++++++------- java/res/xml-iw/kbd_qwerty.xml | 632 +++++++------- java/res/xml-iw/kbd_qwerty_black.xml | 516 +++++------ java/res/xml-nb/kbd_qwerty.xml | 736 ++++++++-------- java/res/xml-nb/kbd_qwerty_black.xml | 620 +++++++------- java/res/xml-ru/kbd_qwerty.xml | 700 +++++++-------- java/res/xml-ru/kbd_qwerty_black.xml | 584 ++++++------- java/res/xml-sr/kbd_qwerty.xml | 686 +++++++-------- java/res/xml-sr/kbd_qwerty_black.xml | 570 ++++++------- java/res/xml-sv/kbd_qwerty.xml | 734 ++++++++-------- java/res/xml-sv/kbd_qwerty_black.xml | 620 +++++++------- java/res/xml-xlarge/kbd_popup_template.xml | 10 +- java/res/xml-xlarge/kbd_qwerty.xml | 280 +++--- java/res/xml-xlarge/kbd_symbols.xml | 164 ++-- java/res/xml-xlarge/kbd_symbols_shift.xml | 164 ++-- java/res/xml/kbd_phone.xml | 104 +-- java/res/xml/kbd_phone_black.xml | 104 +-- java/res/xml/kbd_phone_symbols.xml | 92 +- java/res/xml/kbd_phone_symbols_black.xml | 92 +- java/res/xml/kbd_popup_template.xml | 10 +- java/res/xml/kbd_qwerty.xml | 694 +++++++-------- java/res/xml/kbd_qwerty_black.xml | 578 ++++++------- java/res/xml/kbd_symbols.xml | 272 +++--- java/res/xml/kbd_symbols_black.xml | 248 +++--- java/res/xml/kbd_symbols_shift.xml | 226 ++--- java/res/xml/kbd_symbols_shift_black.xml | 202 ++--- java/res/xml/popup_comma.xml | 22 +- java/res/xml/popup_domains.xml | 32 +- java/res/xml/popup_mic.xml | 24 +- java/res/xml/popup_punctuation.xml | 50 +- java/res/xml/popup_smileys.xml | 86 +- .../inputmethod/latin/BaseKeyboard.java | 804 ++++++++++++++++++ .../inputmethod/latin/KeyDetector.java | 7 +- .../android/inputmethod/latin/LatinIME.java | 21 +- .../inputmethod/latin/LatinImeLogger.java | 3 +- .../inputmethod/latin/LatinKeyboard.java | 7 +- .../latin/LatinKeyboardBaseView.java | 23 +- .../inputmethod/latin/LatinKeyboardView.java | 16 +- .../latin/MiniKeyboardKeyDetector.java | 2 +- .../inputmethod/latin/PointerTracker.java | 11 +- .../latin/ProximityKeyDetector.java | 2 +- .../inputmethod/latin/TextEntryState.java | 3 +- 48 files changed, 7822 insertions(+), 6965 deletions(-) create mode 100644 java/src/com/android/inputmethod/latin/BaseKeyboard.java diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 995373e84..943a43b70 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -69,4 +69,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index 084795463..4aef4b448 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -25,498 +25,498 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" /> + latin:keyLabel="å" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel="æ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_ae" /> + latin:keyLabel="ø" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_oe" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml index 9a64e869d..e3b676802 100644 --- a/java/res/xml-da/kbd_qwerty_black.xml +++ b/java/res/xml-da/kbd_qwerty_black.xml @@ -25,440 +25,440 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" /> + latin:keyLabel="å" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel="æ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_ae" /> + latin:keyLabel="ø" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_oe" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml index b60c50dd6..6318a9d53 100644 --- a/java/res/xml-de/kbd_qwerty.xml +++ b/java/res/xml-de/kbd_qwerty.xml @@ -19,483 +19,483 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:horizontalGap="5%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml index 5cca5a622..dfa7ef600 100644 --- a/java/res/xml-de/kbd_qwerty_black.xml +++ b/java/res/xml-de/kbd_qwerty_black.xml @@ -19,425 +19,425 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:horizontalGap="5%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml index ab78b37bb..80d4d25de 100644 --- a/java/res/xml-fr/kbd_qwerty.xml +++ b/java/res/xml-fr/kbd_qwerty.xml @@ -19,484 +19,484 @@ --> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel="m" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="\'" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml index 97b55dccd..28bf3f9ef 100644 --- a/java/res/xml-fr/kbd_qwerty_black.xml +++ b/java/res/xml-fr/kbd_qwerty_black.xml @@ -19,426 +19,426 @@ --> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel="m" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="\'" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml index a48c849d0..97d9ccbf4 100644 --- a/java/res/xml-iw/kbd_qwerty.xml +++ b/java/res/xml-iw/kbd_qwerty.xml @@ -19,442 +19,442 @@ --> + latin:keyLabel="ק" + latin:horizontalGap="5%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ר" /> + latin:keyLabel="א" /> + latin:keyLabel="ט" /> + latin:keyLabel="ו" /> + latin:keyLabel="ן" /> + latin:keyLabel="ם" /> + latin:keyLabel="פ" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="13.75%p" + latin:isModifier="true" + latin:horizontalGap="1.25%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:keyLabel="ש" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ד" /> + latin:keyLabel="ג" /> + latin:keyLabel="כ" /> + latin:keyLabel="ע" /> + latin:keyLabel="י" /> + latin:keyLabel="ח" /> + latin:keyLabel="ל" /> + latin:keyLabel="ך" /> + latin:keyLabel="ף" + latin:keyEdgeFlags="right" /> + latin:keyLabel="ז" + latin:horizontalGap="5%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ס" /> + latin:keyLabel="ב" /> + latin:keyLabel="ה" /> + latin:keyLabel="נ" /> + latin:keyLabel="מ" /> + latin:keyLabel="צ" /> + latin:keyLabel="ת" /> + latin:keyLabel="ץ" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml index a72b036f4..a7c5a99ea 100644 --- a/java/res/xml-iw/kbd_qwerty_black.xml +++ b/java/res/xml-iw/kbd_qwerty_black.xml @@ -19,384 +19,384 @@ --> + latin:keyLabel="ק" + latin:horizontalGap="5%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ר" /> + latin:keyLabel="א" /> + latin:keyLabel="ט" /> + latin:keyLabel="ו" /> + latin:keyLabel="ן" /> + latin:keyLabel="ם" /> + latin:keyLabel="פ" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="13.75%p" + latin:horizontalGap="1.25%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:keyLabel="ש" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ד" /> + latin:keyLabel="ג" /> + latin:keyLabel="כ" /> + latin:keyLabel="ע" /> + latin:keyLabel="י" /> + latin:keyLabel="ח" /> + latin:keyLabel="ל" /> + latin:keyLabel="ך" /> + latin:keyLabel="ף" + latin:keyEdgeFlags="right" /> + latin:keyLabel="ז" + latin:horizontalGap="5%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ס" /> + latin:keyLabel="ב" /> + latin:keyLabel="ה" /> + latin:keyLabel="נ" /> + latin:keyLabel="מ" /> + latin:keyLabel="צ" /> + latin:keyLabel="ת" /> + latin:keyLabel="ץ" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml index 7e1610684..8921d5353 100644 --- a/java/res/xml-nb/kbd_qwerty.xml +++ b/java/res/xml-nb/kbd_qwerty.xml @@ -25,498 +25,498 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" /> + latin:keyLabel="å" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel="ø" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_oe" /> + latin:keyLabel="æ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_ae" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml index f6a034ee9..1497d6796 100644 --- a/java/res/xml-nb/kbd_qwerty_black.xml +++ b/java/res/xml-nb/kbd_qwerty_black.xml @@ -25,440 +25,440 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" /> + latin:keyLabel="å" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel="ø" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_oe" /> + latin:keyLabel="æ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_ae" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml index 9f16b9b7d..80ce4d0c6 100644 --- a/java/res/xml-ru/kbd_qwerty.xml +++ b/java/res/xml-ru/kbd_qwerty.xml @@ -19,482 +19,482 @@ --> + latin:keyLabel="й" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="1" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ц" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="2" /> + latin:keyLabel="у" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="3" /> + latin:keyLabel="к" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="4" /> + latin:keyLabel="е" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_cyrillic_e" /> + latin:keyLabel="н" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="6" /> + latin:keyLabel="г" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="7" /> + latin:keyLabel="ш" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="8" /> + latin:keyLabel="щ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="9" /> + latin:keyLabel="з" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="0" /> + latin:keyLabel="х" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="ф" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ы" /> + latin:keyLabel="в" /> + latin:keyLabel="а" /> + latin:keyLabel="п" /> + latin:keyLabel="р" /> + latin:keyLabel="о" /> + latin:keyLabel="л" /> + latin:keyLabel="д" /> + latin:keyLabel="ж" /> + latin:keyLabel="э" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="11.75%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="я" /> + latin:keyLabel="ч" /> + latin:keyLabel="с" /> + latin:keyLabel="м" /> + latin:keyLabel="и" /> + latin:keyLabel="т" /> + latin:keyLabel="ь" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> + latin:keyLabel="б" /> + latin:keyLabel="ю" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="11.75%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml index 73008befd..c3f120ad2 100644 --- a/java/res/xml-ru/kbd_qwerty_black.xml +++ b/java/res/xml-ru/kbd_qwerty_black.xml @@ -19,424 +19,424 @@ --> + latin:keyLabel="й" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="1" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ц" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="2" /> + latin:keyLabel="у" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="3" /> + latin:keyLabel="к" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="4" /> + latin:keyLabel="е" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_cyrillic_e" /> + latin:keyLabel="н" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="6" /> + latin:keyLabel="г" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="7" /> + latin:keyLabel="ш" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="8" /> + latin:keyLabel="щ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="9" /> + latin:keyLabel="з" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="0" /> + latin:keyLabel="х" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="ф" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ы" /> + latin:keyLabel="в" /> + latin:keyLabel="а" /> + latin:keyLabel="п" /> + latin:keyLabel="р" /> + latin:keyLabel="о" /> + latin:keyLabel="л" /> + latin:keyLabel="д" /> + latin:keyLabel="ж" /> + latin:keyLabel="э" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="11.75%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="я" /> + latin:keyLabel="ч" /> + latin:keyLabel="с" /> + latin:keyLabel="м" /> + latin:keyLabel="и" /> + latin:keyLabel="т" /> + latin:keyLabel="ь" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> + latin:keyLabel="б" /> + latin:keyLabel="ю" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="11.75%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml index c671166d1..7cc477070 100644 --- a/java/res/xml-sr/kbd_qwerty.xml +++ b/java/res/xml-sr/kbd_qwerty.xml @@ -20,474 +20,474 @@ + latin:keyLabel="љ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="1" + latin:keyEdgeFlags="left" /> + latin:keyLabel="њ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="2" /> + latin:keyLabel="е" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="3" /> + latin:keyLabel="р" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="4" /> + latin:keyLabel="т" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="5" /> + latin:keyLabel="з" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="6" /> + latin:keyLabel="у" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="7" /> + latin:keyLabel="и" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="8" /> + latin:keyLabel="о" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="9" /> + latin:keyLabel="п" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="0" /> + latin:keyLabel="ш" + latin:keyEdgeFlags="right" /> + latin:keyLabel="а" + latin:keyEdgeFlags="left" /> + latin:keyLabel="с" /> + latin:keyLabel="д" /> + latin:keyLabel="ф" /> + latin:keyLabel="г" /> + latin:keyLabel="х" /> + latin:keyLabel="ј" /> + latin:keyLabel="к" /> + latin:keyLabel="л" /> + latin:keyLabel="ч" /> + latin:keyLabel="ћ" /> + latin:keyLabel="ђ" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="11.75%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ж" /> + latin:keyLabel="џ" /> + latin:keyLabel="ц" /> + latin:keyLabel="в" /> + latin:keyLabel="б" /> + latin:keyLabel="н" /> + latin:keyLabel="м" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="11.75%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml index 5e5bceec0..d61ff3e8f 100644 --- a/java/res/xml-sr/kbd_qwerty_black.xml +++ b/java/res/xml-sr/kbd_qwerty_black.xml @@ -20,416 +20,416 @@ + latin:keyLabel="љ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="1" + latin:keyEdgeFlags="left" /> + latin:keyLabel="њ" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="2" /> + latin:keyLabel="е" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="3" /> + latin:keyLabel="р" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="4" /> + latin:keyLabel="т" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="5" /> + latin:keyLabel="з" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="6" /> + latin:keyLabel="у" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="7" /> + latin:keyLabel="и" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="8" /> + latin:keyLabel="о" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="9" /> + latin:keyLabel="п" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="0" /> + latin:keyLabel="ш" + latin:keyEdgeFlags="right" /> + latin:keyLabel="а" + latin:keyEdgeFlags="left" /> + latin:keyLabel="с" /> + latin:keyLabel="д" /> + latin:keyLabel="ф" /> + latin:keyLabel="г" /> + latin:keyLabel="х" /> + latin:keyLabel="ј" /> + latin:keyLabel="к" /> + latin:keyLabel="л" /> + latin:keyLabel="ч" /> + latin:keyLabel="ћ" /> + latin:keyLabel="ђ" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="11.75%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="ж" /> + latin:keyLabel="џ" /> + latin:keyLabel="ц" /> + latin:keyLabel="в" /> + latin:keyLabel="б" /> + latin:keyLabel="н" /> + latin:keyLabel="м" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="11.75%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml index 44117fc1f..2c584e26f 100644 --- a/java/res/xml-sv/kbd_qwerty.xml +++ b/java/res/xml-sv/kbd_qwerty.xml @@ -27,497 +27,497 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" /> + latin:keyLabel="å" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel="ö" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o_umlaut" /> + latin:keyLabel="ä" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a_umlaut" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml index 13ed3d1bf..90dca89bc 100644 --- a/java/res/xml-sv/kbd_qwerty_black.xml +++ b/java/res/xml-sv/kbd_qwerty_black.xml @@ -27,440 +27,440 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" /> + latin:keyLabel="å" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel="ö" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o_umlaut" /> + latin:keyLabel="ä" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a_umlaut" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-xlarge/kbd_popup_template.xml b/java/res/xml-xlarge/kbd_popup_template.xml index 0e67a18d4..382d90afc 100644 --- a/java/res/xml-xlarge/kbd_popup_template.xml +++ b/java/res/xml-xlarge/kbd_popup_template.xml @@ -18,10 +18,10 @@ */ --> - diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml index 80fb8884e..a76eff05a 100644 --- a/java/res/xml-xlarge/kbd_qwerty.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -19,198 +19,198 @@ --> + latin:codes="@integer/key_tab" + latin:keyLabel="Tab" + latin:keyEdgeFlags="left" /> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" /> + latin:keyLabel="=" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="+" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="10.5%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="8.75%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" /> + latin:keyLabel=";" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters=":" /> + latin:keyLabel="\'" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters=""" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="8.75%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="12.5%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:keyLabel="," + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="*" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="!" /> + latin:keyLabel="/" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="\?" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="12.5%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="right" /> + latin:keyLabel="(" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="<" + latin:horizontalGap="16.25%p" /> + latin:keyLabel=")" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters=">" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="37.5%p" + latin:isModifier="true" /> + latin:keyLabel="_" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="\@" /> + latin:keyLabel="-" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="#" /> diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml index 462672623..7d23dc540 100644 --- a/java/res/xml-xlarge/kbd_symbols.xml +++ b/java/res/xml-xlarge/kbd_symbols.xml @@ -19,140 +19,140 @@ --> + latin:codes="@integer/key_tab" + latin:keyLabel="Tab" + latin:keyEdgeFlags="left" /> + latin:keyLabel="1" /> + latin:keyLabel="2" /> + latin:keyLabel="3" /> + latin:keyLabel="4" /> + latin:keyLabel="5" /> + latin:keyLabel="6" /> + latin:keyLabel="7" /> + latin:keyLabel="8" /> + latin:keyLabel="9" /> + latin:keyLabel="0" /> + latin:keyLabel="~" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="10.5%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="8.75%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:keyLabel="#" /> + latin:keyLabel="$" /> + latin:keyLabel="%" /> + latin:keyLabel="^" /> + latin:keyLabel="&" /> + latin:keyLabel="*" /> + latin:keyLabel="-" /> + latin:keyLabel="+" /> + latin:keyLabel="(" /> + latin:keyLabel=")" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="8.75%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="12.5%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="!" /> + latin:keyLabel=""" /> + latin:keyLabel="\'" /> + latin:keyLabel=":" /> + latin:keyLabel=";" /> + latin:keyLabel="/" /> + latin:keyLabel="\\" /> + latin:keyLabel="," /> + latin:keyLabel="." /> + latin:keyLabel="\?" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="12.5%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="right" /> + latin:keyLabel="<" + latin:horizontalGap="16.25%p" /> + latin:keyLabel=">" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="37.5%p" + latin:isModifier="true" /> + latin:keyLabel="[" /> + latin:keyLabel="]" /> diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml index f02174a91..6680d9655 100644 --- a/java/res/xml-xlarge/kbd_symbols_shift.xml +++ b/java/res/xml-xlarge/kbd_symbols_shift.xml @@ -19,140 +19,140 @@ --> + latin:codes="@integer/key_tab" + latin:keyLabel="Tab" + latin:keyEdgeFlags="left" /> + latin:keyLabel="∞" /> + latin:keyLabel="±" /> + latin:keyLabel="|" /> + latin:keyLabel="•" /> + latin:keyLabel="√" /> + latin:keyLabel="π" /> + latin:keyLabel="÷" /> + latin:keyLabel="×" /> + latin:keyLabel="±" /> + latin:keyLabel="∆" /> + latin:keyLabel="≈" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="10.5%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="8.75%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="£" /> + latin:keyLabel="¢" /> + latin:keyLabel="¥" /> + latin:keyLabel="€" /> + latin:keyLabel="¼" /> + latin:keyLabel="½" /> + latin:keyLabel="¾" /> + latin:keyLabel="_" /> + latin:keyLabel="=" /> + latin:keyLabel="{" /> + latin:keyLabel="}" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="8.75%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="12.5%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="¡" /> + latin:keyLabel="°" /> + latin:keyLabel="©" /> + latin:keyLabel="®" /> + latin:keyLabel="¶" /> + latin:keyLabel="§" /> + latin:keyLabel="¤" /> + latin:keyLabel="¬" /> + latin:keyLabel="…" /> + latin:keyLabel="¿" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="12.5%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="right" /> + latin:keyLabel="≤" + latin:horizontalGap="16.25%p" /> + latin:keyLabel="≥" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="37.5%p" + latin:isModifier="true" /> + latin:keyLabel="²" /> + latin:keyLabel="³" /> diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml index 9f381b905..e036cd6d9 100644 --- a/java/res/xml/kbd_phone.xml +++ b/java/res/xml/kbd_phone.xml @@ -19,83 +19,83 @@ --> + latin:codes="49" + latin:keyIcon="@drawable/sym_keyboard_num1" + latin:keyEdgeFlags="left" /> + latin:codes="50" + latin:keyIcon="@drawable/sym_keyboard_num2" /> + latin:codes="51" + latin:keyIcon="@drawable/sym_keyboard_num3" /> + latin:keyLabel="-" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="52" + latin:keyIcon="@drawable/sym_keyboard_num4" + latin:keyEdgeFlags="left" /> + latin:codes="53" + latin:keyIcon="@drawable/sym_keyboard_num5" /> + latin:codes="54" + latin:keyIcon="@drawable/sym_keyboard_num6" /> + latin:keyLabel="." + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="55" + latin:keyIcon="@drawable/sym_keyboard_num7" + latin:keyEdgeFlags="left" /> + latin:codes="56" + latin:keyIcon="@drawable/sym_keyboard_num8" /> + latin:codes="57" + latin:keyIcon="@drawable/sym_keyboard_num9" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="20%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyIcon="@drawable/sym_keyboard_numalt" + latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" /> + latin:codes="48" + latin:keyIcon="@drawable/sym_keyboard_num0" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_phone_black.xml b/java/res/xml/kbd_phone_black.xml index 7a956b796..52479459c 100644 --- a/java/res/xml/kbd_phone_black.xml +++ b/java/res/xml/kbd_phone_black.xml @@ -19,83 +19,83 @@ --> + latin:codes="49" + latin:keyIcon="@drawable/sym_bkeyboard_num1" + latin:keyEdgeFlags="left" /> + latin:codes="50" + latin:keyIcon="@drawable/sym_bkeyboard_num2" /> + latin:codes="51" + latin:keyIcon="@drawable/sym_bkeyboard_num3" /> + latin:keyLabel="-" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="52" + latin:keyIcon="@drawable/sym_bkeyboard_num4" + latin:keyEdgeFlags="left" /> + latin:codes="53" + latin:keyIcon="@drawable/sym_bkeyboard_num5" /> + latin:codes="54" + latin:keyIcon="@drawable/sym_bkeyboard_num6" /> + latin:keyLabel="." + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="55" + latin:keyIcon="@drawable/sym_bkeyboard_num7" + latin:keyEdgeFlags="left" /> + latin:codes="56" + latin:keyIcon="@drawable/sym_bkeyboard_num8" /> + latin:codes="57" + latin:keyIcon="@drawable/sym_bkeyboard_num9" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="20%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyIcon="@drawable/sym_bkeyboard_numalt" + latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" /> + latin:codes="48" + latin:keyIcon="@drawable/sym_bkeyboard_num0" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml index 598e211f5..09146e7af 100644 --- a/java/res/xml/kbd_phone_symbols.xml +++ b/java/res/xml/kbd_phone_symbols.xml @@ -19,80 +19,80 @@ --> + latin:keyLabel="(" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:keyLabel=")" /> + latin:keyLabel="-" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="N" + latin:keyEdgeFlags="left" /> + latin:codes="44" + latin:keyLabel="Pause" /> + latin:keyLabel="," /> + latin:keyLabel="." + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="42" + latin:keyIcon="@drawable/sym_keyboard_numstar" + latin:keyEdgeFlags="left" /> + latin:codes="59" + latin:keyLabel="Wait" /> + latin:codes="35" + latin:keyIcon="@drawable/sym_keyboard_numpound" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="20%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_phone_key" + latin:keyEdgeFlags="left" /> + latin:keyLabel="+" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml index 5bc628965..8b683cc6c 100644 --- a/java/res/xml/kbd_phone_symbols_black.xml +++ b/java/res/xml/kbd_phone_symbols_black.xml @@ -19,80 +19,80 @@ --> + latin:keyLabel="(" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:keyLabel=")" /> + latin:keyLabel="-" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="N" + latin:keyEdgeFlags="left" /> + latin:codes="44" + latin:keyLabel="Pause" /> + latin:keyLabel="," /> + latin:keyLabel="." + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="42" + latin:keyIcon="@drawable/sym_bkeyboard_numstar" + latin:keyEdgeFlags="left" /> + latin:codes="59" + latin:keyLabel="Wait" /> + latin:codes="35" + latin:keyIcon="@drawable/sym_bkeyboard_numpound" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="20%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_phone_key" + latin:keyEdgeFlags="left" /> + latin:keyLabel="+" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml index aca46930f..cbb705835 100644 --- a/java/res/xml/kbd_popup_template.xml +++ b/java/res/xml/kbd_popup_template.xml @@ -18,10 +18,10 @@ */ --> - diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index 446467fa4..5e68fd688 100644 --- a/java/res/xml/kbd_qwerty.xml +++ b/java/res/xml/kbd_qwerty.xml @@ -19,473 +19,473 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:horizontalGap="5%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_keyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="/" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="\@" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_keyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml index f44c24fad..fff409340 100644 --- a/java/res/xml/kbd_qwerty_black.xml +++ b/java/res/xml/kbd_qwerty_black.xml @@ -19,415 +19,415 @@ --> + latin:keyLabel="q" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + latin:keyLabel="w" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_w" /> + latin:keyLabel="e" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_e" /> + latin:keyLabel="r" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_r" /> + latin:keyLabel="t" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_t" /> + latin:keyLabel="y" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_y" /> + latin:keyLabel="u" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_u" /> + latin:keyLabel="i" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_i" /> + latin:keyLabel="o" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_o" /> + latin:keyLabel="p" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_p" + latin:keyEdgeFlags="right" /> + latin:keyLabel="a" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_a" + latin:horizontalGap="5%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="s" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_s" /> + latin:keyLabel="d" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_d" /> + latin:keyLabel="f" /> + latin:keyLabel="g" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_g" /> + latin:keyLabel="h" /> + latin:keyLabel="j" /> + latin:keyLabel="k" /> + latin:keyLabel="l" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_l" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyIcon="@drawable/sym_bkeyboard_shift" + latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="z" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_z" /> + latin:keyLabel="x" /> + latin:keyLabel="c" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_c" /> + latin:keyLabel="v" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_v" /> + latin:keyLabel="b" /> + latin:keyLabel="n" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="@string/alternates_for_n" /> + latin:keyLabel="m" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="20%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" + latin:keyWidth="20%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="/" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="\@" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:popupKeyboard="@xml/popup_smileys" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_symbol_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:codes="@integer/key_tab" + latin:keyIcon="@drawable/sym_bkeyboard_tab" + latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="15%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml index cb8b3b38f..4cdc53947 100644 --- a/java/res/xml/kbd_symbols.xml +++ b/java/res/xml/kbd_symbols.xml @@ -19,194 +19,194 @@ --> + latin:keyLabel="1" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="¹½⅓¼⅛" + latin:keyEdgeFlags="left" /> + latin:keyLabel="2" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="²⅔" /> + latin:keyLabel="3" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="³¾⅜" /> + latin:keyLabel="4" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="⁴" /> + latin:keyLabel="5" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="⅝" /> + latin:keyLabel="6" /> + latin:keyLabel="7" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="⅞" /> + latin:keyLabel="8" /> + latin:keyLabel="9" /> + latin:keyLabel="0" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="ⁿ∅" + latin:keyEdgeFlags="right" /> + latin:keyLabel="\@" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\#" /> + latin:keyLabel="$" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="¢£€¥₣₤₱" /> + latin:keyLabel="%" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="‰" /> + latin:keyLabel="&" /> + latin:keyLabel="*" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="†‡★" /> + latin:keyLabel="-" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="_–—" /> + latin:keyLabel="+" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="±" /> + latin:keyLabel="(" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="[{<" /> + latin:keyLabel=")" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="]}>" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyLabel="@string/label_alt_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="!" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="¡" /> + latin:keyLabel=""" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="“”«»˝" /> + latin:keyLabel="\'" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="‘’" /> + latin:keyLabel=":" /> + latin:keyLabel=";" /> + latin:keyLabel="/" /> + latin:keyLabel="\?" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="¿" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:codes="@integer/key_f1" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml index bfb1646f4..cb695f534 100644 --- a/java/res/xml/kbd_symbols_black.xml +++ b/java/res/xml/kbd_symbols_black.xml @@ -19,182 +19,182 @@ --> + latin:keyLabel="1" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="¹½⅓¼⅛" + latin:keyEdgeFlags="left" /> + latin:keyLabel="2" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="²⅔" /> + latin:keyLabel="3" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="³¾⅜" /> + latin:keyLabel="4" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="⁴" /> + latin:keyLabel="5" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="⅝" /> + latin:keyLabel="6" /> + latin:keyLabel="7" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="⅞" /> + latin:keyLabel="8" /> + latin:keyLabel="9" /> + latin:keyLabel="0" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="ⁿ∅" + latin:keyEdgeFlags="right" /> + latin:keyLabel="\@" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\#" /> + latin:keyLabel="$" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="¢£€¥₣₤₱" /> + latin:keyLabel="%" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="‰" /> + latin:keyLabel="&" /> + latin:keyLabel="*" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="†‡★" /> + latin:keyLabel="-" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="_–—" /> + latin:keyLabel="+" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="±" /> + latin:keyLabel="(" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="[{<" /> + latin:keyLabel=")" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="]}>" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyLabel="@string/label_alt_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="!" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="¡" /> + latin:keyLabel=""" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="“”«»˝" /> + latin:keyLabel="\'" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="‘’" /> + latin:keyLabel=":" /> + latin:keyLabel=";" /> + latin:keyLabel="/" /> + latin:keyLabel="\?" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="¿" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="." + latin:popupKeyboard="@xml/popup_punctuation" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml index 21cbb7132..e346384aa 100644 --- a/java/res/xml/kbd_symbols_shift.xml +++ b/java/res/xml/kbd_symbols_shift.xml @@ -19,171 +19,171 @@ --> + latin:keyLabel="~" + latin:keyEdgeFlags="left" /> + latin:keyLabel="`" /> + latin:keyLabel="|" /> + latin:keyLabel="•" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="♪♥♠♦♣" /> + latin:keyLabel="√" /> + latin:keyLabel="π" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="Π" /> + latin:keyLabel="÷" /> + latin:keyLabel="×" /> + latin:keyLabel="{" /> + latin:keyLabel="}" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_tab" + latin:keyLabel="\u21E5" + latin:keyEdgeFlags="left" /> + latin:keyLabel="£" /> + latin:keyLabel="¢" /> + latin:keyLabel="€" /> + latin:keyLabel="°" /> + latin:keyLabel="^" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="↑↓←→" /> + latin:keyLabel="_" /> + latin:keyLabel="=" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="≠≈∞" /> + latin:keyLabel="[" /> + latin:keyLabel="]" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyLabel="@string/label_alt_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="™" /> + latin:keyLabel="®" /> + latin:keyLabel="©" /> + latin:keyLabel="¶" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="§" /> + latin:keyLabel="\\" /> + latin:keyLabel="<" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="≤«‹" /> + latin:keyLabel=">" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="≥»›" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_keyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="„" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" + latin:isModifier="true" /> + latin:keyLabel="…" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" + latin:isModifier="true" /> + latin:keyLabel="„" + latin:isModifier="true" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_keyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" + latin:isModifier="true" /> + latin:keyLabel="…" + latin:isModifier="true" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_keyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:isModifier="true" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml index d5d49ce0d..a15749212 100644 --- a/java/res/xml/kbd_symbols_shift_black.xml +++ b/java/res/xml/kbd_symbols_shift_black.xml @@ -19,159 +19,159 @@ --> + latin:keyLabel="~" + latin:keyEdgeFlags="left" /> + latin:keyLabel="`" /> + latin:keyLabel="|" /> + latin:keyLabel="•" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="♪♥♠♦♣" /> + latin:keyLabel="√" /> + latin:keyLabel="π" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="Π" /> + latin:keyLabel="÷" /> + latin:keyLabel="×" /> + latin:keyLabel="{" /> + latin:keyLabel="}" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_tab" + latin:keyLabel="\u21E5" + latin:keyEdgeFlags="left" /> + latin:keyLabel="£" /> + latin:keyLabel="¢" /> + latin:keyLabel="€" /> + latin:keyLabel="°" /> + latin:keyLabel="^" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="↑↓←→" /> + latin:keyLabel="_" /> + latin:keyLabel="=" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="≠≈∞" /> + latin:keyLabel="[" /> + latin:keyLabel="]" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_shift" + latin:keyLabel="@string/label_alt_key" + latin:keyWidth="15%p" + latin:isModifier="true" + latin:isSticky="true" + latin:keyEdgeFlags="left" /> + latin:keyLabel="™" /> + latin:keyLabel="®" /> + latin:keyLabel="©" /> + latin:keyLabel="¶" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="§" /> + latin:keyLabel="\\" /> + latin:keyLabel="<" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="≤«‹" /> + latin:keyLabel=">" + latin:popupKeyboard="@xml/kbd_popup_template" + latin:popupCharacters="≥»›" /> + latin:codes="@integer/key_delete" + latin:keyIcon="@drawable/sym_bkeyboard_delete" + latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyWidth="15%p" + latin:isRepeatable="true" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="20%p" + latin:keyEdgeFlags="left" /> + latin:keyLabel="„" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="40%p" /> + latin:keyLabel="…" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="20%p" + latin:keyEdgeFlags="right" /> + latin:codes="@integer/key_symbol" + latin:keyLabel="@string/label_alpha_key" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_bkeyboard_settings" + latin:iconPreview="@drawable/sym_keyboard_feedback_settings" /> + latin:keyLabel="„" /> + latin:codes="@integer/key_space" + latin:keyIcon="@drawable/sym_bkeyboard_space" + latin:iconPreview="@drawable/sym_keyboard_feedback_space" + latin:keyWidth="30%p" /> + latin:keyLabel="…" /> + latin:codes="@integer/key_return" + latin:keyIcon="@drawable/sym_bkeyboard_return" + latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyWidth="25%p" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/popup_comma.xml b/java/res/xml/popup_comma.xml index 540dc9615..4e88f26c4 100644 --- a/java/res/xml/popup_comma.xml +++ b/java/res/xml/popup_comma.xml @@ -19,21 +19,21 @@ --> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:keyEdgeFlags="left" /> + latin:keyLabel="," + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/popup_domains.xml b/java/res/xml/popup_domains.xml index 0f7d97691..c110ef6c2 100644 --- a/java/res/xml/popup_domains.xml +++ b/java/res/xml/popup_domains.xml @@ -19,28 +19,28 @@ --> + latin:keyLabel="@string/popular_domain_1" + latin:keyOutputText="@string/popular_domain_1" + latin:keyEdgeFlags="left" /> + latin:keyLabel="@string/popular_domain_2" + latin:keyOutputText="@string/popular_domain_2" /> + latin:keyLabel="@string/popular_domain_3" + latin:keyOutputText="@string/popular_domain_3" /> + latin:keyLabel="@string/popular_domain_4" + latin:keyOutputText="@string/popular_domain_4" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/popup_mic.xml b/java/res/xml/popup_mic.xml index f3cc63817..f5ef6eeb0 100644 --- a/java/res/xml/popup_mic.xml +++ b/java/res/xml/popup_mic.xml @@ -19,22 +19,22 @@ --> + latin:codes="@integer/key_settings" + latin:keyIcon="@drawable/sym_keyboard_settings" + latin:keyEdgeFlags="left" /> + latin:codes="@integer/key_voice" + latin:keyIcon="@drawable/sym_keyboard_mic" + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/popup_punctuation.xml b/java/res/xml/popup_punctuation.xml index ee1feabec..ecbf09f72 100644 --- a/java/res/xml/popup_punctuation.xml +++ b/java/res/xml/popup_punctuation.xml @@ -19,50 +19,50 @@ --> + latin:keyLabel=":" + latin:keyEdgeFlags="left" /> + latin:keyLabel="/" /> + latin:keyLabel="&" /> + latin:keyLabel="(" /> + latin:keyLabel=")" /> + latin:keyLabel="-" /> + latin:keyLabel="+" + latin:keyEdgeFlags="right" /> + latin:keyLabel=";" + latin:keyEdgeFlags="left" /> + latin:keyLabel="\@" /> + latin:keyLabel="\'" /> + latin:keyLabel=""" /> + latin:keyLabel="\?" /> + latin:keyLabel="!" /> + latin:keyLabel="," + latin:keyEdgeFlags="right" /> diff --git a/java/res/xml/popup_smileys.xml b/java/res/xml/popup_smileys.xml index 3b556da77..33006f6ec 100644 --- a/java/res/xml/popup_smileys.xml +++ b/java/res/xml/popup_smileys.xml @@ -19,71 +19,71 @@ --> + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:keyEdgeFlags="left" /> + latin:keyLabel=":-(" + latin:keyOutputText=":-( " /> + latin:keyLabel=";-)" + latin:keyOutputText=";-) " /> + latin:keyLabel=":-P" + latin:keyOutputText=":-P " /> + latin:keyLabel="=-O" + latin:keyOutputText="=-O " + latin:keyEdgeFlags="right" /> + latin:keyLabel=":-*" + latin:keyOutputText=":-* " + latin:keyEdgeFlags="left" /> + latin:keyLabel=":O" + latin:keyOutputText=":O " /> + latin:keyLabel="B-)" + latin:keyOutputText="B-) " /> + latin:keyLabel=":-$" + latin:keyOutputText=":-$ " /> + latin:keyLabel=":-!" + latin:keyOutputText=":-! " + latin:keyEdgeFlags="right" /> + latin:keyLabel=":-[" + latin:keyOutputText=":-[ " + latin:keyEdgeFlags="left" /> + latin:keyLabel="O:-)" + latin:keyOutputText="O:-) " /> + latin:keyLabel=":-\\" + latin:keyOutputText=":-\\ " /> + latin:keyLabel=":'(" + latin:keyOutputText=":'( " /> + latin:keyLabel=":-D" + latin:keyOutputText=":-D " + latin:keyEdgeFlags="right" /> diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java new file mode 100644 index 000000000..f1a08cb4a --- /dev/null +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -0,0 +1,804 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import org.xmlpull.v1.XmlPullParserException; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.Log; +import android.util.TypedValue; +import android.util.Xml; +import android.util.DisplayMetrics; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + + +/** + * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard + * consists of rows of keys. + *

The layout file for a keyboard contains XML that looks like the following snippet:

+ *
+ * <Keyboard
+ *         latin:keyWidth="%10p"
+ *         latin:keyHeight="50px"
+ *         latin:horizontalGap="2px"
+ *         latin:verticalGap="2px" >
+ *     <Row latin:keyWidth="32px" >
+ *         <Key latin:keyLabel="A" />
+ *         ...
+ *     </Row>
+ *     ...
+ * </Keyboard>
+ * 
+ */ +public class BaseKeyboard { + + static final String TAG = "BaseKeyboard"; + + // Keyboard XML Tags + private static final String TAG_KEYBOARD = "Keyboard"; + private static final String TAG_ROW = "Row"; + private static final String TAG_KEY = "Key"; + + public static final int EDGE_LEFT = 0x01; + public static final int EDGE_RIGHT = 0x02; + public static final int EDGE_TOP = 0x04; + public static final int EDGE_BOTTOM = 0x08; + + public static final int KEYCODE_SHIFT = -1; + public static final int KEYCODE_MODE_CHANGE = -2; + public static final int KEYCODE_CANCEL = -3; + public static final int KEYCODE_DONE = -4; + public static final int KEYCODE_DELETE = -5; + public static final int KEYCODE_ALT = -6; + + /** Horizontal gap default for all rows */ + private int mDefaultHorizontalGap; + + /** Default key width */ + private int mDefaultWidth; + + /** Default key height */ + private int mDefaultHeight; + + /** Default gap between rows */ + private int mDefaultVerticalGap; + + /** Is the keyboard in the shifted state */ + private boolean mShifted; + + /** Key instance for the shift key, if present */ + private Key mShiftKey; + + /** Key index for the shift key, if present */ + private int mShiftKeyIndex = -1; + + /** Total height of the keyboard, including the padding and keys */ + private int mTotalHeight; + + /** + * Total width of the keyboard, including left side gaps and keys, but not any gaps on the + * right side. + */ + private int mTotalWidth; + + /** List of keys in this keyboard */ + private List mKeys; + + /** List of modifier keys such as Shift & Alt, if any */ + private List mModifierKeys; + + /** Width of the screen available to fit the keyboard */ + private int mDisplayWidth; + + /** Height of the screen */ + private int mDisplayHeight; + + /** Keyboard mode, or zero, if none. */ + private int mKeyboardMode; + + // Variables for pre-computing nearest keys. + + private static final int GRID_WIDTH = 10; + private static final int GRID_HEIGHT = 5; + private static final int GRID_SIZE = GRID_WIDTH * GRID_HEIGHT; + private int mCellWidth; + private int mCellHeight; + private int[][] mGridNeighbors; + private int mProximityThreshold; + /** Number of key widths from current touch point to search for nearest keys. */ + private static float SEARCH_DISTANCE = 1.8f; + + /** + * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate. + * Some of the key size defaults can be overridden per row from what the {@link Keyboard} + * defines. + */ + public static class Row { + /** Default width of a key in this row. */ + public int defaultWidth; + /** Default height of a key in this row. */ + public int defaultHeight; + /** Default horizontal gap between keys in this row. */ + public int defaultHorizontalGap; + /** Vertical gap following this row. */ + public int verticalGap; + /** + * Edge flags for this row of keys. Possible values that can be assigned are + * {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM} + */ + public int rowEdgeFlags; + + /** The keyboard mode for this row */ + public int mode; + + private BaseKeyboard parent; + + public Row(BaseKeyboard parent) { + this.parent = parent; + } + + public Row(Resources res, BaseKeyboard parent, XmlResourceParser parser) { + this.parent = parent; + TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + defaultWidth = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyWidth, + parent.mDisplayWidth, parent.mDefaultWidth); + defaultHeight = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyHeight, + parent.mDisplayHeight, parent.mDefaultHeight); + defaultHorizontalGap = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_horizontalGap, + parent.mDisplayWidth, parent.mDefaultHorizontalGap); + verticalGap = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_verticalGap, + parent.mDisplayHeight, parent.mDefaultVerticalGap); + a.recycle(); + a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard_Row); + rowEdgeFlags = a.getInt(R.styleable.BaseKeyboard_Row_rowEdgeFlags, 0); + mode = a.getResourceId(R.styleable.BaseKeyboard_Row_keyboardMode, + 0); + } + } + + /** + * Class for describing the position and characteristics of a single key in the keyboard. + */ + public static class Key { + /** + * All the key codes (unicode or custom code) that this key could generate, zero'th + * being the most important. + */ + public int[] codes; + + /** Label to display */ + public CharSequence label; + + /** Icon to display instead of a label. Icon takes precedence over a label */ + public Drawable icon; + /** Preview version of the icon, for the preview popup */ + public Drawable iconPreview; + /** Width of the key, not including the gap */ + public int width; + /** Height of the key, not including the gap */ + public int height; + /** The horizontal gap before this key */ + public int gap; + /** Whether this key is sticky, i.e., a toggle key */ + public boolean sticky; + /** X coordinate of the key in the keyboard layout */ + public int x; + /** Y coordinate of the key in the keyboard layout */ + public int y; + /** The current pressed state of this key */ + public boolean pressed; + /** If this is a sticky key, is it on? */ + public boolean on; + /** Text to output when pressed. This can be multiple characters, like ".com" */ + public CharSequence text; + /** Popup characters */ + public CharSequence popupCharacters; + + /** + * Flags that specify the anchoring to edges of the keyboard for detecting touch events + * that are just out of the boundary of the key. This is a bit mask of + * {@link Keyboard#EDGE_LEFT}, {@link Keyboard#EDGE_RIGHT}, {@link Keyboard#EDGE_TOP} and + * {@link Keyboard#EDGE_BOTTOM}. + */ + public int edgeFlags; + /** Whether this is a modifier key, such as Shift or Alt */ + public boolean modifier; + /** The BaseKeyboard that this key belongs to */ + private BaseKeyboard keyboard; + /** + * If this key pops up a mini keyboard, this is the resource id for the XML layout for that + * keyboard. + */ + public int popupResId; + /** Whether this key repeats itself when held down */ + public boolean repeatable; + + + private final static int[] KEY_STATE_NORMAL_ON = { + android.R.attr.state_checkable, + android.R.attr.state_checked + }; + + private final static int[] KEY_STATE_PRESSED_ON = { + android.R.attr.state_pressed, + android.R.attr.state_checkable, + android.R.attr.state_checked + }; + + private final static int[] KEY_STATE_NORMAL_OFF = { + android.R.attr.state_checkable + }; + + private final static int[] KEY_STATE_PRESSED_OFF = { + android.R.attr.state_pressed, + android.R.attr.state_checkable + }; + + private final static int[] KEY_STATE_NORMAL = { + }; + + private final static int[] KEY_STATE_PRESSED = { + android.R.attr.state_pressed + }; + + /** Create an empty key with no attributes. */ + public Key(Row parent) { + keyboard = parent.parent; + height = parent.defaultHeight; + width = parent.defaultWidth; + gap = parent.defaultHorizontalGap; + edgeFlags = parent.rowEdgeFlags; + } + + /** Create a key with the given top-left coordinate and extract its attributes from + * the XML parser. + * @param res resources associated with the caller's context + * @param parent the row that this key belongs to. The row must already be attached to + * a {@link Keyboard}. + * @param x the x coordinate of the top-left + * @param y the y coordinate of the top-left + * @param parser the XML parser containing the attributes for this key + */ + public Key(Resources res, Row parent, int x, int y, XmlResourceParser parser) { + this(parent); + + this.x = x; + this.y = y; + + TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + + width = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyWidth, + keyboard.mDisplayWidth, parent.defaultWidth); + height = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyHeight, + keyboard.mDisplayHeight, parent.defaultHeight); + gap = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_horizontalGap, + keyboard.mDisplayWidth, parent.defaultHorizontalGap); + a.recycle(); + 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); + if (codesValue.type == TypedValue.TYPE_INT_DEC + || codesValue.type == TypedValue.TYPE_INT_HEX) { + codes = new int[] { codesValue.data }; + } else if (codesValue.type == TypedValue.TYPE_STRING) { + codes = parseCSV(codesValue.string.toString()); + } + + 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); + 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()); + } + label = a.getText(R.styleable.BaseKeyboard_Key_keyLabel); + text = a.getText(R.styleable.BaseKeyboard_Key_keyOutputText); + + if (codes == null && !TextUtils.isEmpty(label)) { + codes = new int[] { label.charAt(0) }; + } + a.recycle(); + } + + /** + * Informs the key that it has been pressed, in case it needs to change its appearance or + * state. + * @see #onReleased(boolean) + */ + public void onPressed() { + pressed = !pressed; + } + + /** + * Changes the pressed state of the key. If it is a sticky key, it will also change the + * toggled state of the key if the finger was release inside. + * @param inside whether the finger was released inside the key + * @see #onPressed() + */ + public void onReleased(boolean inside) { + pressed = !pressed; + if (sticky) { + on = !on; + } + } + + int[] parseCSV(String value) { + int count = 0; + int lastIndex = 0; + if (value.length() > 0) { + count++; + while ((lastIndex = value.indexOf(",", lastIndex + 1)) > 0) { + count++; + } + } + int[] values = new int[count]; + count = 0; + StringTokenizer st = new StringTokenizer(value, ","); + while (st.hasMoreTokens()) { + try { + values[count++] = Integer.parseInt(st.nextToken()); + } catch (NumberFormatException nfe) { + Log.e(TAG, "Error parsing keycodes " + value); + } + } + return values; + } + + /** + * Detects if a point falls inside this key. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return whether or not the point falls inside the key. If the key is attached to an edge, + * it will assume that all points between the key and the edge are considered to be inside + * the key. + */ + public boolean isInside(int x, int y) { + boolean leftEdge = (edgeFlags & EDGE_LEFT) > 0; + boolean rightEdge = (edgeFlags & EDGE_RIGHT) > 0; + boolean topEdge = (edgeFlags & EDGE_TOP) > 0; + boolean bottomEdge = (edgeFlags & EDGE_BOTTOM) > 0; + if ((x >= this.x || (leftEdge && x <= this.x + this.width)) + && (x < this.x + this.width || (rightEdge && x >= this.x)) + && (y >= this.y || (topEdge && y <= this.y + this.height)) + && (y < this.y + this.height || (bottomEdge && y >= this.y))) { + return true; + } else { + return false; + } + } + + /** + * Returns the square of the distance between the center of the key and the given point. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return the square of the distance of the point from the center of the key + */ + public int squaredDistanceFrom(int x, int y) { + int xDist = this.x + width / 2 - x; + int yDist = this.y + height / 2 - y; + return xDist * xDist + yDist * yDist; + } + + /** + * Returns the drawable state for the key, based on the current state and type of the key. + * @return the drawable state of the key. + * @see android.graphics.drawable.StateListDrawable#setState(int[]) + */ + public int[] getCurrentDrawableState() { + int[] states = KEY_STATE_NORMAL; + + if (on) { + if (pressed) { + states = KEY_STATE_PRESSED_ON; + } else { + states = KEY_STATE_NORMAL_ON; + } + } else { + if (sticky) { + if (pressed) { + states = KEY_STATE_PRESSED_OFF; + } else { + states = KEY_STATE_NORMAL_OFF; + } + } else { + if (pressed) { + states = KEY_STATE_PRESSED; + } + } + } + return states; + } + } + + /** + * Creates a keyboard from the given xml key layout file. + * @param context the application or service context + * @param xmlLayoutResId the resource file that contains the keyboard layout and keys. + */ + public BaseKeyboard(Context context, int xmlLayoutResId) { + this(context, xmlLayoutResId, 0); + } + + /** + * Creates a keyboard from the given xml key layout file. Weeds out rows + * that have a keyboard mode defined but don't match the specified mode. + * @param context the application or service context + * @param xmlLayoutResId the resource file that contains the keyboard layout and keys. + * @param modeId keyboard mode identifier + * @param width sets width of keyboard + * @param height sets height of keyboard + */ + public BaseKeyboard(Context context, int xmlLayoutResId, int modeId, int width, int height) { + mDisplayWidth = width; + mDisplayHeight = height; + + mDefaultHorizontalGap = 0; + mDefaultWidth = mDisplayWidth / 10; + mDefaultVerticalGap = 0; + mDefaultHeight = mDefaultWidth; + mKeys = new ArrayList(); + mModifierKeys = new ArrayList(); + mKeyboardMode = modeId; + loadKeyboard(context, context.getResources().getXml(xmlLayoutResId)); + } + + /** + * Creates a keyboard from the given xml key layout file. Weeds out rows + * that have a keyboard mode defined but don't match the specified mode. + * @param context the application or service context + * @param xmlLayoutResId the resource file that contains the keyboard layout and keys. + * @param modeId keyboard mode identifier + */ + public BaseKeyboard(Context context, int xmlLayoutResId, int modeId) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + mDisplayWidth = dm.widthPixels; + mDisplayHeight = dm.heightPixels; + //Log.v(TAG, "keyboard's display metrics:" + dm); + + mDefaultHorizontalGap = 0; + mDefaultWidth = mDisplayWidth / 10; + mDefaultVerticalGap = 0; + mDefaultHeight = mDefaultWidth; + mKeys = new ArrayList(); + mModifierKeys = new ArrayList(); + mKeyboardMode = modeId; + loadKeyboard(context, context.getResources().getXml(xmlLayoutResId)); + } + + /** + *

Creates a blank keyboard from the given resource file and populates it with the specified + * characters in left-to-right, top-to-bottom fashion, using the specified number of columns. + *

+ *

If the specified number of columns is -1, then the keyboard will fit as many keys as + * possible in each row.

+ * @param context the application or service context + * @param layoutTemplateResId the layout template file, containing no keys. + * @param characters the list of characters to display on the keyboard. One key will be created + * for each character. + * @param columns the number of columns of keys to display. If this number is greater than the + * number of keys that can fit in a row, it will be ignored. If this number is -1, the + * keyboard will fit as many keys as possible in each row. + */ + public BaseKeyboard(Context context, int layoutTemplateResId, + CharSequence characters, int columns, int horizontalPadding) { + this(context, layoutTemplateResId); + int x = 0; + int y = 0; + int column = 0; + mTotalWidth = 0; + + Row row = new Row(this); + row.defaultHeight = mDefaultHeight; + row.defaultWidth = mDefaultWidth; + row.defaultHorizontalGap = mDefaultHorizontalGap; + row.verticalGap = mDefaultVerticalGap; + row.rowEdgeFlags = EDGE_TOP | EDGE_BOTTOM; + final int maxColumns = columns == -1 ? Integer.MAX_VALUE : columns; + for (int i = 0; i < characters.length(); i++) { + char c = characters.charAt(i); + if (column >= maxColumns + || x + mDefaultWidth + horizontalPadding > mDisplayWidth) { + x = 0; + y += mDefaultVerticalGap + mDefaultHeight; + column = 0; + } + final Key key = new Key(row); + key.x = x; + key.y = y; + key.label = String.valueOf(c); + key.codes = new int[] { c }; + column++; + x += key.width + key.gap; + mKeys.add(key); + if (x > mTotalWidth) { + mTotalWidth = x; + } + } + mTotalHeight = y + mDefaultHeight; + } + + public List getKeys() { + return mKeys; + } + + public List getModifierKeys() { + return mModifierKeys; + } + + protected int getHorizontalGap() { + return mDefaultHorizontalGap; + } + + protected void setHorizontalGap(int gap) { + mDefaultHorizontalGap = gap; + } + + protected int getVerticalGap() { + return mDefaultVerticalGap; + } + + protected void setVerticalGap(int gap) { + mDefaultVerticalGap = gap; + } + + protected int getKeyHeight() { + return mDefaultHeight; + } + + protected void setKeyHeight(int height) { + mDefaultHeight = height; + } + + protected int getKeyWidth() { + return mDefaultWidth; + } + + protected void setKeyWidth(int width) { + mDefaultWidth = width; + } + + /** + * Returns the total height of the keyboard + * @return the total height of the keyboard + */ + public int getHeight() { + return mTotalHeight; + } + + public int getMinWidth() { + return mTotalWidth; + } + + public boolean setShifted(boolean shiftState) { + if (mShiftKey != null) { + mShiftKey.on = shiftState; + } + if (mShifted != shiftState) { + mShifted = shiftState; + return true; + } + return false; + } + + public boolean isShifted() { + return mShifted; + } + + public int getShiftKeyIndex() { + return mShiftKeyIndex; + } + + private void computeNearestNeighbors() { + // Round-up so we don't have any pixels outside the grid + mCellWidth = (getMinWidth() + GRID_WIDTH - 1) / GRID_WIDTH; + mCellHeight = (getHeight() + GRID_HEIGHT - 1) / GRID_HEIGHT; + mGridNeighbors = new int[GRID_SIZE][]; + int[] indices = new int[mKeys.size()]; + final int gridWidth = GRID_WIDTH * mCellWidth; + final int gridHeight = GRID_HEIGHT * mCellHeight; + for (int x = 0; x < gridWidth; x += mCellWidth) { + for (int y = 0; y < gridHeight; y += mCellHeight) { + int count = 0; + for (int i = 0; i < mKeys.size(); i++) { + final Key key = mKeys.get(i); + if (key.squaredDistanceFrom(x, y) < mProximityThreshold || + key.squaredDistanceFrom(x + mCellWidth - 1, y) < mProximityThreshold || + key.squaredDistanceFrom(x + mCellWidth - 1, y + mCellHeight - 1) + < mProximityThreshold || + key.squaredDistanceFrom(x, y + mCellHeight - 1) < mProximityThreshold) { + indices[count++] = i; + } + } + int [] cell = new int[count]; + System.arraycopy(indices, 0, cell, 0, count); + mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell; + } + } + } + + /** + * Returns the indices of the keys that are closest to the given point. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return the array of integer indices for the nearest keys to the given point. If the given + * point is out of range, then an array of size zero is returned. + */ + public int[] getNearestKeys(int x, int y) { + if (mGridNeighbors == null) computeNearestNeighbors(); + if (x >= 0 && x < getMinWidth() && y >= 0 && y < getHeight()) { + int index = (y / mCellHeight) * GRID_WIDTH + (x / mCellWidth); + if (index < GRID_SIZE) { + return mGridNeighbors[index]; + } + } + return new int[0]; + } + + protected Row createRowFromXml(Resources res, XmlResourceParser parser) { + return new Row(res, this, parser); + } + + protected Key createKeyFromXml(Resources res, Row parent, int x, int y, + XmlResourceParser parser) { + return new Key(res, parent, x, y, parser); + } + + private void loadKeyboard(Context context, XmlResourceParser parser) { + boolean inKey = false; + boolean inRow = false; + int row = 0; + int x = 0; + int y = 0; + Key key = null; + Row currentRow = null; + Resources res = context.getResources(); + boolean skipRow = false; + + try { + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + inRow = true; + x = 0; + currentRow = createRowFromXml(res, parser); + skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode; + if (skipRow) { + skipToEndOfRow(parser); + inRow = false; + } + } else if (TAG_KEY.equals(tag)) { + inKey = true; + key = createKeyFromXml(res, currentRow, x, y, parser); + mKeys.add(key); + if (key.codes[0] == KEYCODE_SHIFT) { + mShiftKey = key; + mShiftKeyIndex = mKeys.size()-1; + mModifierKeys.add(key); + } else if (key.codes[0] == KEYCODE_ALT) { + mModifierKeys.add(key); + } + } else if (TAG_KEYBOARD.equals(tag)) { + parseKeyboardAttributes(res, parser); + } + } else if (event == XmlResourceParser.END_TAG) { + if (inKey) { + inKey = false; + x += key.gap + key.width; + if (x > mTotalWidth) { + mTotalWidth = x; + } + } else if (inRow) { + inRow = false; + y += currentRow.verticalGap; + y += currentRow.defaultHeight; + row++; + } else { + // TODO: error or extend? + } + } + } + } catch (Exception e) { + Log.e(TAG, "Parse error:" + e); + e.printStackTrace(); + } + mTotalHeight = y - mDefaultVerticalGap; + } + + private void skipToEndOfRow(XmlResourceParser parser) + throws XmlPullParserException, IOException { + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.END_TAG + && parser.getName().equals(TAG_ROW)) { + break; + } + } + } + + private void parseKeyboardAttributes(Resources res, XmlResourceParser parser) { + TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + + mDefaultWidth = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyWidth, + mDisplayWidth, mDisplayWidth / 10); + mDefaultHeight = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyHeight, + mDisplayHeight, 50); + mDefaultHorizontalGap = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_horizontalGap, + mDisplayWidth, 0); + mDefaultVerticalGap = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_verticalGap, + mDisplayHeight, 0); + mProximityThreshold = (int) (mDefaultWidth * SEARCH_DISTANCE); + mProximityThreshold = mProximityThreshold * mProximityThreshold; + a.recycle(); + } + + static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { + TypedValue value = a.peekValue(index); + if (value == null) return defValue; + if (value.type == TypedValue.TYPE_DIMENSION) { + return a.getDimensionPixelOffset(index, defValue); + } else if (value.type == TypedValue.TYPE_FRACTION) { + // Round it to avoid values like 47.9999 from getting truncated + return Math.round(a.getFraction(index, base, base, defValue)); + } + return defValue; + } +} diff --git a/java/src/com/android/inputmethod/latin/KeyDetector.java b/java/src/com/android/inputmethod/latin/KeyDetector.java index 76fe1200e..3902b60a3 100644 --- a/java/src/com/android/inputmethod/latin/KeyDetector.java +++ b/java/src/com/android/inputmethod/latin/KeyDetector.java @@ -16,14 +16,13 @@ package com.android.inputmethod.latin; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; +import com.android.inputmethod.latin.BaseKeyboard.Key; import java.util.Arrays; import java.util.List; abstract class KeyDetector { - protected Keyboard mKeyboard; + protected BaseKeyboard mKeyboard; private Key[] mKeys; @@ -35,7 +34,7 @@ abstract class KeyDetector { protected int mProximityThresholdSquare; - public Key[] setKeyboard(Keyboard keyboard, float correctionX, float correctionY) { + public Key[] setKeyboard(BaseKeyboard keyboard, float correctionX, float correctionY) { if (keyboard == null) throw new NullPointerException(); mCorrectionX = (int)correctionX; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 692183dbf..b41c2aa23 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -34,7 +34,6 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.inputmethodservice.InputMethodService; -import android.inputmethodservice.Keyboard; import android.media.AudioManager; import android.os.Debug; import android.os.Handler; @@ -1170,29 +1169,29 @@ public class LatinIME extends InputMethodService public void onKey(int primaryCode, int[] keyCodes, int x, int y) { long when = SystemClock.uptimeMillis(); - if (primaryCode != Keyboard.KEYCODE_DELETE || + if (primaryCode != BaseKeyboard.KEYCODE_DELETE || when > mLastKeyTime + QUICK_PRESS) { mDeleteCount = 0; } mLastKeyTime = when; final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); switch (primaryCode) { - case Keyboard.KEYCODE_DELETE: + case BaseKeyboard.KEYCODE_DELETE: handleBackspace(); mDeleteCount++; LatinImeLogger.logOnDelete(); break; - case Keyboard.KEYCODE_SHIFT: + case BaseKeyboard.KEYCODE_SHIFT: // Shift key is handled in onPress() when device has distinct multi-touch panel. if (!distinctMultiTouch) handleShift(); break; - case Keyboard.KEYCODE_MODE_CHANGE: + case BaseKeyboard.KEYCODE_MODE_CHANGE: // Symbol key is handled in onPress() when device has distinct multi-touch panel. if (!distinctMultiTouch) changeKeyboardMode(); break; - case Keyboard.KEYCODE_CANCEL: + case BaseKeyboard.KEYCODE_CANCEL: if (!isShowingOptionDialog()) { handleClose(); } @@ -2266,10 +2265,10 @@ public class LatinIME extends InputMethodService vibrate(); playKeyClick(primaryCode); final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); - if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) { + if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { mShiftKeyState.onPress(); handleShift(); - } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) { + } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) { mSymbolKeyState.onPress(); changeKeyboardMode(); } else { @@ -2283,11 +2282,11 @@ public class LatinIME extends InputMethodService ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).keyReleased(); //vibrate(); final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); - if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) { + if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { if (mShiftKeyState.isMomentary()) resetShift(); mShiftKeyState.onRelease(); - } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) { + } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) { if (mSymbolKeyState.isMomentary()) changeKeyboardMode(); mSymbolKeyState.onRelease(); @@ -2346,7 +2345,7 @@ public class LatinIME extends InputMethodService // FIXME: These should be triggered after auto-repeat logic int sound = AudioManager.FX_KEYPRESS_STANDARD; switch (primaryCode) { - case Keyboard.KEYCODE_DELETE: + case BaseKeyboard.KEYCODE_DELETE: sound = AudioManager.FX_KEYPRESS_DELETE; break; case KEYCODE_ENTER: diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index a8ab9cc98..dd7bc8ac1 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -20,7 +20,6 @@ import com.android.inputmethod.latin.Dictionary.DataType; import android.content.Context; import android.content.SharedPreferences; -import android.inputmethodservice.Keyboard; import java.util.List; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -65,7 +64,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void onAddSuggestedWord(String word, int typeId, DataType dataType) { } - public static void onSetKeyboard(Keyboard kb) { + public static void onSetKeyboard(BaseKeyboard kb) { } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 31394d1cc..9c252e6c6 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -30,7 +30,6 @@ import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.inputmethodservice.Keyboard; import android.text.TextPaint; import android.util.Log; import android.view.ViewConfiguration; @@ -41,7 +40,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; -public class LatinKeyboard extends Keyboard { +public class LatinKeyboard extends BaseKeyboard { private static final boolean DEBUG_PREFERRED_LETTER = false; private static final String TAG = "LatinKeyboard"; @@ -744,7 +743,7 @@ public class LatinKeyboard extends Keyboard { return textSize; } - class LatinKey extends Keyboard.Key { + class LatinKey extends BaseKeyboard.Key { // functional normal state (with properties) private final int[] KEY_STATE_FUNCTIONAL_NORMAL = { @@ -759,7 +758,7 @@ public class LatinKeyboard extends Keyboard { private boolean mShiftLockEnabled; - public LatinKey(Resources res, Keyboard.Row parent, int x, int y, + public LatinKey(Resources res, BaseKeyboard.Row parent, int x, int y, XmlResourceParser parser) { super(res, parent, x, y, parser); if (popupCharacters != null && popupCharacters.length() == 0) { diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 75ef691c8..264e2f18f 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -16,6 +16,8 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.BaseKeyboard.Key; + import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; @@ -29,8 +31,6 @@ import android.graphics.Rect; import android.graphics.Region.Op; import android.graphics.Typeface; import android.graphics.drawable.Drawable; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; import android.os.Handler; import android.os.Message; import android.os.SystemClock; @@ -177,7 +177,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private int mPopupLayout; // Main keyboard - private Keyboard mKeyboard; + private BaseKeyboard mKeyboard; private Key[] mKeys; // Key preview popup @@ -566,7 +566,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * @see #getKeyboard() * @param keyboard the keyboard to display in this view */ - public void setKeyboard(Keyboard keyboard) { + public void setKeyboard(BaseKeyboard keyboard) { if (mKeyboard != null) { dismissKeyPreview(); } @@ -593,7 +593,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * @return the currently attached keyboard * @see #setKeyboard(Keyboard) */ - public Keyboard getKeyboard() { + public BaseKeyboard getKeyboard() { return mKeyboard; } @@ -713,7 +713,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * the touch distance from a key's center to avoid taking a square root. * @param keyboard */ - private void computeProximityThreshold(Keyboard keyboard) { + private void computeProximityThreshold(BaseKeyboard keyboard) { if (keyboard == null) return; final Key[] keys = mKeys; if (keys == null) return; @@ -1072,12 +1072,12 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Override default ProximityKeyDetector. miniKeyboard.mKeyDetector = new MiniKeyboardKeyDetector(mMiniKeyboardSlideAllowance); - Keyboard keyboard; + BaseKeyboard keyboard; if (popupKey.popupCharacters != null) { - keyboard = new Keyboard(getContext(), popupKeyboardId, popupKey.popupCharacters, + keyboard = new BaseKeyboard(getContext(), popupKeyboardId, popupKey.popupCharacters, -1, getPaddingLeft() + getPaddingRight()); } else { - keyboard = new Keyboard(getContext(), popupKeyboardId); + keyboard = new BaseKeyboard(getContext(), popupKeyboardId); } miniKeyboard.setKeyboard(keyboard); miniKeyboard.setPopupParent(this); @@ -1088,7 +1088,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return container; } - private static boolean isOneRowKeyboard(Keyboard keyboard) { + private static boolean isOneRowKeyboard(BaseKeyboard keyboard) { final List keys = keyboard.getKeys(); if (keys.size() == 0) return false; final int edgeFlags = keys.get(0).edgeFlags; @@ -1098,7 +1098,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // and bottom edge flags on. // When you want to use one row mini-keyboard from xml file, make sure that the row has // both top and bottom edge flags set. - return (edgeFlags & Keyboard.EDGE_TOP) != 0 && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0; + return (edgeFlags & BaseKeyboard.EDGE_TOP) != 0 + && (edgeFlags & BaseKeyboard.EDGE_BOTTOM) != 0; } /** diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 22d39f7aa..912af7e2a 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -16,11 +16,11 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.BaseKeyboard.Key; + import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; import android.os.Handler; import android.os.Message; import android.os.SystemClock; @@ -39,7 +39,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { static final int KEYCODE_NEXT_LANGUAGE = -104; static final int KEYCODE_PREV_LANGUAGE = -105; - private Keyboard mPhoneKeyboard; + private BaseKeyboard mPhoneKeyboard; /** Whether we've started dropping move events because we found a big jump */ private boolean mDroppingEvents; @@ -61,7 +61,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { super(context, attrs, defStyle); } - public void setPhoneKeyboard(Keyboard phoneKeyboard) { + public void setPhoneKeyboard(BaseKeyboard phoneKeyboard) { mPhoneKeyboard = phoneKeyboard; } @@ -76,7 +76,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { } @Override - public void setKeyboard(Keyboard k) { + public void setKeyboard(BaseKeyboard k) { super.setKeyboard(k); // One-seventh of the keyboard width seems like a reasonable threshold mJumpThresholdSquare = k.getMinWidth() / 7; @@ -108,7 +108,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { @Override protected CharSequence adjustCase(CharSequence label) { - Keyboard keyboard = getKeyboard(); + BaseKeyboard keyboard = getKeyboard(); if (keyboard.isShifted() && keyboard instanceof LatinKeyboard && ((LatinKeyboard) keyboard).isAlphaKeyboard() @@ -120,7 +120,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { } public boolean setShiftLocked(boolean shiftLocked) { - Keyboard keyboard = getKeyboard(); + BaseKeyboard keyboard = getKeyboard(); if (keyboard instanceof LatinKeyboard) { ((LatinKeyboard)keyboard).setShiftLocked(shiftLocked); invalidateAllKeys(); @@ -257,7 +257,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { private int mLastY; private Paint mPaint; - private void setKeyboardLocal(Keyboard k) { + private void setKeyboardLocal(BaseKeyboard k) { if (DEBUG_AUTO_PLAY) { findKeys(); if (mHandler2 == null) { diff --git a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java index 356e62d48..5f4c93734 100644 --- a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java +++ b/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java @@ -16,7 +16,7 @@ package com.android.inputmethod.latin; -import android.inputmethodservice.Keyboard.Key; +import com.android.inputmethod.latin.BaseKeyboard.Key; class MiniKeyboardKeyDetector extends KeyDetector { private static final int MAX_NEARBY_KEYS = 1; diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index b416a984c..cf4f7d5c2 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -16,11 +16,10 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.BaseKeyboard.Key; import com.android.inputmethod.latin.LatinKeyboardBaseView.OnKeyboardActionListener; import com.android.inputmethod.latin.LatinKeyboardBaseView.UIHandler; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; import android.util.Log; import android.view.MotionEvent; import android.view.ViewConfiguration; @@ -45,7 +44,7 @@ public class PointerTracker { // Miscellaneous constants private static final int NOT_A_KEY = LatinKeyboardBaseView.NOT_A_KEY; - private static final int[] KEY_DELETE = { Keyboard.KEYCODE_DELETE }; + private static final int[] KEY_DELETE = { BaseKeyboard.KEYCODE_DELETE }; private final UIProxy mProxy; private final UIHandler mHandler; @@ -202,8 +201,8 @@ public class PointerTracker { if (key == null) return false; int primaryCode = key.codes[0]; - return primaryCode == Keyboard.KEYCODE_SHIFT - || primaryCode == Keyboard.KEYCODE_MODE_CHANGE; + return primaryCode == BaseKeyboard.KEYCODE_SHIFT + || primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE; } public boolean isModifier() { @@ -437,7 +436,7 @@ public class PointerTracker { // Multi-tap if (mInMultiTap) { if (mTapCount != -1) { - mListener.onKey(Keyboard.KEYCODE_DELETE, KEY_DELETE, x, y); + mListener.onKey(BaseKeyboard.KEYCODE_DELETE, KEY_DELETE, x, y); } else { mTapCount = 0; } diff --git a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java index d17bedb56..a6ff8cf8c 100644 --- a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java +++ b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java @@ -16,7 +16,7 @@ package com.android.inputmethod.latin; -import android.inputmethodservice.Keyboard.Key; +import com.android.inputmethod.latin.BaseKeyboard.Key; import java.util.Arrays; diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index 9011191f1..1d7659ca3 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -16,8 +16,9 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.BaseKeyboard.Key; + import android.content.Context; -import android.inputmethodservice.Keyboard.Key; import android.text.format.DateFormat; import android.util.Log; From 6614ac9f7b506c688abd2d6f09a0f2ae8b22fa68 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Sat, 2 Oct 2010 15:50:06 +0900 Subject: [PATCH 038/287] Modify BaseKeyboard to be able to handle multiple shift keys Change-Id: Ie840ae113ee6bd5b629a90959d7f955a5ceba95a --- .../inputmethod/latin/BaseKeyboard.java | 32 +++++++------------ .../inputmethod/latin/LatinKeyboard.java | 17 +++------- 2 files changed, 17 insertions(+), 32 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index f1a08cb4a..6f32f9c1a 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -89,11 +89,8 @@ public class BaseKeyboard { /** Is the keyboard in the shifted state */ private boolean mShifted; - /** Key instance for the shift key, if present */ - private Key mShiftKey; - - /** Key index for the shift key, if present */ - private int mShiftKeyIndex = -1; + /** List of shift keys in this keyboard */ + private final List mShiftKeys = new ArrayList(); /** Total height of the keyboard, including the padding and keys */ private int mTotalHeight; @@ -105,19 +102,19 @@ public class BaseKeyboard { private int mTotalWidth; /** List of keys in this keyboard */ - private List mKeys; + private final List mKeys = new ArrayList(); /** List of modifier keys such as Shift & Alt, if any */ - private List mModifierKeys; + private final List mModifierKeys = new ArrayList(); /** Width of the screen available to fit the keyboard */ - private int mDisplayWidth; + private final int mDisplayWidth; /** Height of the screen */ - private int mDisplayHeight; + private final int mDisplayHeight; /** Keyboard mode, or zero, if none. */ - private int mKeyboardMode; + private final int mKeyboardMode; // Variables for pre-computing nearest keys. @@ -488,8 +485,6 @@ public class BaseKeyboard { mDefaultWidth = mDisplayWidth / 10; mDefaultVerticalGap = 0; mDefaultHeight = mDefaultWidth; - mKeys = new ArrayList(); - mModifierKeys = new ArrayList(); mKeyboardMode = modeId; loadKeyboard(context, context.getResources().getXml(xmlLayoutResId)); } @@ -511,8 +506,6 @@ public class BaseKeyboard { mDefaultWidth = mDisplayWidth / 10; mDefaultVerticalGap = 0; mDefaultHeight = mDefaultWidth; - mKeys = new ArrayList(); - mModifierKeys = new ArrayList(); mKeyboardMode = modeId; loadKeyboard(context, context.getResources().getXml(xmlLayoutResId)); } @@ -622,8 +615,8 @@ public class BaseKeyboard { } public boolean setShifted(boolean shiftState) { - if (mShiftKey != null) { - mShiftKey.on = shiftState; + for (final Key key : mShiftKeys) { + key.on = shiftState; } if (mShifted != shiftState) { mShifted = shiftState; @@ -636,8 +629,8 @@ public class BaseKeyboard { return mShifted; } - public int getShiftKeyIndex() { - return mShiftKeyIndex; + public List getShiftKeys() { + return mShiftKeys; } private void computeNearestNeighbors() { @@ -725,8 +718,7 @@ public class BaseKeyboard { key = createKeyFromXml(res, currentRow, x, y, parser); mKeys.add(key); if (key.codes[0] == KEYCODE_SHIFT) { - mShiftKey = key; - mShiftKeyIndex = mKeys.size()-1; + mShiftKeys.add(key); mModifierKeys.add(key); } else if (key.codes[0] == KEYCODE_ALT) { mModifierKeys.add(key); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 9c252e6c6..53ccf3629 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -35,7 +35,6 @@ import android.util.Log; import android.view.ViewConfiguration; import android.view.inputmethod.EditorInfo; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -59,7 +58,6 @@ public class LatinKeyboard extends BaseKeyboard { private Drawable m123MicPreviewIcon; private final Drawable mButtonArrowLeftIcon; private final Drawable mButtonArrowRightIcon; - private ArrayList mShiftKeys; private Key mEnterKey; private Key mF1Key; private Key mSpaceKey; @@ -161,8 +159,6 @@ public class LatinKeyboard extends BaseKeyboard { private void initializeMemberVariablesAsNeeded() { if (mNumberHintKeys == null) mNumberHintKeys = new Key[NUMBER_HINT_COUNT]; - if (mShiftKeys == null) - mShiftKeys = new ArrayList(); } @Override @@ -184,9 +180,6 @@ public class LatinKeyboard extends BaseKeyboard { case LatinIME.KEYCODE_SPACE: mSpaceKey = key; break; - case KEYCODE_SHIFT: - mShiftKeys.add(key); - break; case KEYCODE_MODE_CHANGE: m123Key = key; m123Label = key.label; @@ -267,7 +260,7 @@ public class LatinKeyboard extends BaseKeyboard { } public void enableShiftLock() { - for (final Key key : mShiftKeys) { + for (final Key key : getShiftKeys()) { if (key instanceof LatinKey) { ((LatinKey)key).enableShiftLock(); } @@ -276,7 +269,7 @@ public class LatinKeyboard extends BaseKeyboard { } public void setShiftLocked(boolean shiftLocked) { - for (final Key key : mShiftKeys) { + for (final Key key : getShiftKeys()) { key.on = shiftLocked; key.icon = mShiftLockIcon; } @@ -290,8 +283,8 @@ public class LatinKeyboard extends BaseKeyboard { @Override public boolean setShifted(boolean shiftState) { boolean shiftChanged = false; - if (mShiftKeys.size() > 0) { - for (final Key key : mShiftKeys) { + if (getShiftKeys().size() > 0) { + for (final Key key : getShiftKeys()) { if (shiftState == false) { key.on = false; key.icon = mOldShiftIcons.get(key); @@ -314,7 +307,7 @@ public class LatinKeyboard extends BaseKeyboard { @Override public boolean isShifted() { - if (mShiftKeys.size() > 0) { + if (getShiftKeys().size() > 0) { return mShiftState != SHIFT_OFF; } else { return super.isShifted(); From b1abda8d62d654e876c4f781a07d724922c736e4 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Shimoda Date: Tue, 28 Sep 2010 12:23:26 +0900 Subject: [PATCH 039/287] Add an auto complete's threshold option. Change-Id: I3a6821ced8642ab8f954e79a25e31766e4a18eb8 --- java/res/values/config.xml | 10 ++ java/res/values/strings.xml | 30 ++++- java/res/xml/prefs.xml | 12 +- .../android/inputmethod/latin/LatinIME.java | 60 +++++++++- .../inputmethod/latin/LatinIMESettings.java | 24 ++++ .../inputmethod/latin/LatinIMEUtil.java | 54 +++++++++ .../android/inputmethod/latin/Suggest.java | 15 ++- .../inputmethod/latin/EditDistanceTests.java | 107 ++++++++++++++++++ 8 files changed, 295 insertions(+), 17 deletions(-) create mode 100644 tests/src/com/android/inputmethod/latin/EditDistanceTests.java diff --git a/java/res/values/config.xml b/java/res/values/config.xml index 6e941baaf..5b5656d84 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -25,4 +25,14 @@ 90 0 100 + + + + + 0.22 + + 0 + diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index a4ebe4650..94fe76d54 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -86,11 +86,6 @@ Display suggested words while typing - - Auto-complete - - Spacebar and punctuation automatically insert highlighted word - Show settings key @@ -112,6 +107,31 @@ @string/settings_key_mode_always_hide_name
+ + + Auto-complete + + Spacebar and punctuation automatically insert highlighted word + 0 + 1 + 2 + + @string/auto_completion_threshold_mode_value_off + @string/auto_completion_threshold_mode_value_modest + @string/auto_completion_threshold_mode_value_aggeressive + + + Off + + Modest + + Aggressive + + @string/auto_completion_threshold_mode_off + @string/auto_completion_threshold_mode_modest + @string/auto_completion_threshold_mode_aggeressive + + Bigram Suggestions diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 8a971092f..e7a394529 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -97,13 +97,14 @@ android:defaultValue="true" /> - diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b41c2aa23..d0c8af5c4 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -68,6 +68,7 @@ import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -94,7 +95,7 @@ public class LatinIME extends InputMethodService private static final String PREF_AUTO_CAP = "auto_cap"; private static final String PREF_QUICK_FIXES = "quick_fixes"; private static final String PREF_SHOW_SUGGESTIONS = "show_suggestions"; - private static final String PREF_AUTO_COMPLETE = "auto_complete"; + private static final String PREF_AUTO_COMPLETION_THRESHOLD = "auto_completion_threshold"; private static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion"; private static final String PREF_VOICE_MODE = "voice_mode"; @@ -445,6 +446,7 @@ public class LatinIME extends InputMethodService int[] dictionaries = getDictionary(orig); mSuggest = new Suggest(this, dictionaries); + loadAndSetAutoCompletionThreshold(sp); updateAutoTextEnabled(saveLocale); if (mUserDictionary != null) mUserDictionary.close(); mUserDictionary = new UserDictionary(this, mInputLocale); @@ -2469,6 +2471,9 @@ public class LatinIME extends InputMethodService mLocaleSupportedForVoiceInput = voiceInputSupportedLocales.contains(mInputLocale); mShowSuggestions = sp.getBoolean(PREF_SHOW_SUGGESTIONS, true); + mAutoCorrectEnabled = mShowSuggestions && isAutoCorrectEnabled(sp); + mBigramSuggestionEnabled = mAutoCorrectEnabled && isBigramSuggestionEnabled(sp); + loadAndSetAutoCompletionThreshold(sp); if (VOICE_INSTALLED) { final String voiceMode = sp.getString(PREF_VOICE_MODE, @@ -2483,14 +2488,61 @@ public class LatinIME extends InputMethodService mEnableVoice = enableVoice; mVoiceOnPrimary = voiceOnPrimary; } - mAutoCorrectEnabled = sp.getBoolean(PREF_AUTO_COMPLETE, - mResources.getBoolean(R.bool.enable_autocorrect)) & mShowSuggestions; - mBigramSuggestionEnabled = sp.getBoolean(PREF_BIGRAM_SUGGESTIONS, true) & mShowSuggestions; updateCorrectionMode(); updateAutoTextEnabled(mResources.getConfiguration().locale); mLanguageSwitcher.loadLocales(sp); } + /** + * load Auto completion threshold from SharedPreferences, + * and modify mSuggest's threshold. + */ + private void loadAndSetAutoCompletionThreshold(SharedPreferences sp) { + // When mSuggest is not initialized, cannnot modify mSuggest's threshold. + if (mSuggest == null) return; + // When auto completion setting is turned off, the threshold is ignored. + if (!isAutoCorrectEnabled(sp)) return; + + final String currentAutoCompletionSetting = sp.getString(PREF_AUTO_COMPLETION_THRESHOLD, + mResources.getString(R.string.auto_completion_threshold_mode_value_modest)); + final String[] autoCompletionThresholdValues = mResources.getStringArray( + R.array.auto_complete_threshold_values); + // When autoCompletionThreshold is greater than 1.0, + // auto completion is virtually turned off. + double autoCompletionThreshold = Double.MAX_VALUE; + try { + final int arrayIndex = Integer.valueOf(currentAutoCompletionSetting); + if (arrayIndex >= 0 && arrayIndex < autoCompletionThresholdValues.length) { + autoCompletionThreshold = Double.parseDouble( + autoCompletionThresholdValues[arrayIndex]); + } + } catch (NumberFormatException e) { + // Whenever the threshold settings are correct, + // never come here. + autoCompletionThreshold = Double.MAX_VALUE; + Log.w(TAG, "Cannot load auto completion threshold setting." + + " currentAutoCompletionSetting: " + currentAutoCompletionSetting + + ", autoCompletionThresholdValues: " + + Arrays.toString(autoCompletionThresholdValues)); + } + // TODO: This should be refactored : + // setAutoCompleteThreshold should be called outside of this method. + mSuggest.setAutoCompleteThreshold(autoCompletionThreshold); + } + + private boolean isAutoCorrectEnabled(SharedPreferences sp) { + final String currentAutoCompletionSetting = sp.getString(PREF_AUTO_COMPLETION_THRESHOLD, + mResources.getString(R.string.auto_completion_threshold_mode_value_modest)); + final String autoCompletionOff = mResources.getString( + R.string.auto_completion_threshold_mode_value_off); + return !currentAutoCompletionSetting.equals(autoCompletionOff); + } + + private boolean isBigramSuggestionEnabled(SharedPreferences sp) { + // TODO: Define default value instead of 'true'. + return sp.getBoolean(PREF_BIGRAM_SUGGESTIONS, true); + } + private void initSuggestPuncList() { mSuggestPuncList = new ArrayList(); mSuggestPuncs = mResources.getString(R.string.suggested_punctuations); diff --git a/java/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java index ffff33da2..99d8a622e 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java +++ b/java/src/com/android/inputmethod/latin/LatinIMESettings.java @@ -43,6 +43,9 @@ public class LatinIMESettings extends PreferenceActivity private static final String QUICK_FIXES_KEY = "quick_fixes"; private static final String PREDICTION_SETTINGS_KEY = "prediction_settings"; private static final String VOICE_SETTINGS_KEY = "voice_mode"; + private static final String PREF_SHOW_SUGGESTIONS = "show_suggestions"; + private static final String PREF_AUTO_COMPLETION_THRESHOLD = "auto_completion_threshold"; + private static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion"; /* package */ static final String PREF_SETTINGS_KEY = "settings_key"; private static final String TAG = "LatinIMESettings"; @@ -53,6 +56,9 @@ public class LatinIMESettings extends PreferenceActivity private CheckBoxPreference mQuickFixes; private ListPreference mVoicePreference; private ListPreference mSettingsKeyPreference; + private CheckBoxPreference mShowSuggestions; + private ListPreference mAutoCompletionThreshold; + private CheckBoxPreference mBigramSuggestion; private boolean mVoiceOn; private VoiceInputLogger mLogger; @@ -60,6 +66,18 @@ public class LatinIMESettings extends PreferenceActivity private boolean mOkClicked = false; private String mVoiceModeOff; + private void ensureConsistencyOfAutoCompletionSettings() { + if (mShowSuggestions.isChecked()) { + mAutoCompletionThreshold.setEnabled(true); + final String autoCompletionOff = getResources().getString( + R.string.auto_completion_threshold_mode_value_off); + final String currentSetting = mAutoCompletionThreshold.getValue(); + mBigramSuggestion.setEnabled(!currentSetting.equals(autoCompletionOff)); + } else { + mAutoCompletionThreshold.setEnabled(false); + mBigramSuggestion.setEnabled(false); + } + } @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -73,6 +91,11 @@ public class LatinIMESettings extends PreferenceActivity mVoiceModeOff = getString(R.string.voice_mode_off); mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); mLogger = VoiceInputLogger.getLogger(this); + + mShowSuggestions = (CheckBoxPreference) findPreference(PREF_SHOW_SUGGESTIONS); + mAutoCompletionThreshold = (ListPreference) findPreference(PREF_AUTO_COMPLETION_THRESHOLD); + mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS); + ensureConsistencyOfAutoCompletionSettings(); } @Override @@ -108,6 +131,7 @@ public class LatinIMESettings extends PreferenceActivity showVoiceConfirmation(); } } + ensureConsistencyOfAutoCompletionSettings(); mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); updateVoiceModeSummary(); updateSettingsKeySummary(); diff --git a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java index 85ecaee50..d93639063 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java +++ b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java @@ -168,4 +168,58 @@ public class LatinIMEUtil { mLength = 0; } } + + public static int editDistance(CharSequence s, CharSequence t) { + if (s == null || t == null) { + throw new IllegalArgumentException("editDistance: Arguments should not be null."); + } + final int sl = s.length(); + final int tl = t.length(); + int[][] dp = new int [sl + 1][tl + 1]; + for (int i = 0; i <= sl; i++) { + dp[i][0] = i; + } + for (int j = 0; j <= tl; j++) { + dp[0][j] = j; + } + for (int i = 0; i < sl; ++i) { + for (int j = 0; j < tl; ++j) { + if (s.charAt(i) == t.charAt(j)) { + dp[i + 1][j + 1] = dp[i][j]; + } else { + dp[i + 1][j + 1] = 1 + Math.min(dp[i][j], + Math.min(dp[i + 1][j], dp[i][j + 1])); + } + } + } + return dp[sl][tl]; + } + + // In dictionary.cpp, getSuggestion() method, + // suggestion scores are computed using the below formula. + // original score (called 'frequency') + // := pow(mTypedLetterMultiplier (this is defined 2), + // (the number of matched characters between typed word and suggested word)) + // * (individual word's score which defined in the unigram dictionary, + // and this score is defined in range [0, 255].) + // * (when before.length() == after.length(), + // mFullWordMultiplier (this is defined 2)) + // So, maximum original score is pow(2, before.length()) * 255 * 2 + // So, we can normalize original score by dividing this value. + private static final int MAX_INITIAL_SCORE = 255; + private static final int TYPED_LETTER_MULTIPLIER = 2; + private static final int FULL_WORD_MULTIPLYER = 2; + public static double calcNormalizedScore(CharSequence before, CharSequence after, int score) { + final int beforeLength = before.length(); + final int afterLength = after.length(); + final int distance = editDistance(before, after); + final double maximumScore = MAX_INITIAL_SCORE + * Math.pow(TYPED_LETTER_MULTIPLIER, beforeLength) + * FULL_WORD_MULTIPLYER; + // add a weight based on edit distance. + // distance <= max(afterLength, beforeLength) == afterLength, + // so, 0 <= distance / afterLength <= 1 + final double weight = 1.0 - (double) distance / afterLength; + return (score / maximumScore) * weight; + } } diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 3b898941f..01782339f 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -81,6 +81,7 @@ public class Suggest implements Dictionary.WordCallback { private boolean mAutoTextEnabled; + private double mAutoCompleteThreshold; private int[] mPriorities = new int[mPrefMaxSuggestions]; private int[] mBigramPriorities = new int[PREF_MAX_BIGRAMS]; @@ -163,6 +164,10 @@ public class Suggest implements Dictionary.WordCallback { mUserBigramDictionary = userBigramDictionary; } + public void setAutoCompleteThreshold(double threshold) { + mAutoCompleteThreshold = threshold; + } + /** * Number of suggestions to generate from the input key sequence. This has * to be a number between 1 and 100 (inclusive). @@ -301,8 +306,14 @@ public class Suggest implements Dictionary.WordCallback { } mMainDict.getWords(wordComposer, this, mNextLettersFrequencies); if ((mCorrectionMode == CORRECTION_FULL || mCorrectionMode == CORRECTION_FULL_BIGRAM) - && mSuggestions.size() > 0) { - mHaveCorrection = true; + && mSuggestions.size() > 0 && mPriorities.length > 0) { + // TODO: when the normalized score of the first suggestion is nearly equals to + // the normalized score of the second suggestion, behave less aggressive. + final double normalizedScore = LatinIMEUtil.calcNormalizedScore( + mOriginalWord, mSuggestions.get(0), mPriorities[0]); + if (normalizedScore >= mAutoCompleteThreshold) { + mHaveCorrection = true; + } } } if (mOriginalWord != null) { diff --git a/tests/src/com/android/inputmethod/latin/EditDistanceTests.java b/tests/src/com/android/inputmethod/latin/EditDistanceTests.java new file mode 100644 index 000000000..a9ed89df7 --- /dev/null +++ b/tests/src/com/android/inputmethod/latin/EditDistanceTests.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.latin; + +import android.test.AndroidTestCase; + +public class EditDistanceTests extends AndroidTestCase { + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + /* + * dist(kitten, sitting) == 3 + * + * kitten- + * .|||.| + * sitting + */ + public void testExample1() { + final int dist = LatinIMEUtil.editDistance("kitten", "sitting"); + assertEquals("edit distance between 'kitten' and 'sitting' is 3", + 3, dist); + } + + /* + * dist(Sunday, Saturday) == 3 + * + * Saturday + * | |.||| + * S--unday + */ + public void testExample2() { + final int dist = LatinIMEUtil.editDistance("Saturday", "Sunday"); + assertEquals("edit distance between 'Saturday' and 'Sunday' is 3", + 3, dist); + } + + public void testBothEmpty() { + final int dist = LatinIMEUtil.editDistance("", ""); + assertEquals("when both string are empty, no edits are needed", + 0, dist); + } + + public void testFirstArgIsEmpty() { + final int dist = LatinIMEUtil.editDistance("", "aaaa"); + assertEquals("when only one string of the arguments is empty," + + " the edit distance is the length of the other.", + 4, dist); + } + + public void testSecoondArgIsEmpty() { + final int dist = LatinIMEUtil.editDistance("aaaa", ""); + assertEquals("when only one string of the arguments is empty," + + " the edit distance is the length of the other.", + 4, dist); + } + + public void testSameStrings() { + final String arg1 = "The quick brown fox jumps over the lazy dog."; + final String arg2 = "The quick brown fox jumps over the lazy dog."; + final int dist = LatinIMEUtil.editDistance(arg1, arg2); + assertEquals("when same strings are passed, distance equals 0.", + 0, dist); + } + + public void testSameReference() { + final String arg = "The quick brown fox jumps over the lazy dog."; + final int dist = LatinIMEUtil.editDistance(arg, arg); + assertEquals("when same string references are passed, the distance equals 0.", + 0, dist); + } + + public void testNullArg() { + try { + LatinIMEUtil.editDistance(null, "aaa"); + fail("IllegalArgumentException should be thrown."); + } catch (Exception e) { + assertTrue(e instanceof IllegalArgumentException); + } + try { + LatinIMEUtil.editDistance("aaa", null); + fail("IllegalArgumentException should be thrown."); + } catch (Exception e) { + assertTrue(e instanceof IllegalArgumentException); + } + } +} From 66e306d01c6820d4f4d8b2209438ec086b48ac51 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Sat, 2 Oct 2010 15:17:27 +0900 Subject: [PATCH 040/287] 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 From 47383758fc3137a8e2b88ae596adf2685bd818bc Mon Sep 17 00:00:00 2001 From: Roy West Date: Tue, 5 Oct 2010 06:39:15 -0700 Subject: [PATCH 041/287] Fix bug 3063598, change "tap" to "touch" thrice. Change-Id: Ia135eb926a5f2896a480cd478d40925d46041d42 --- java/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 17921ff33..7747c7b25 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -332,7 +332,7 @@ Slide finger on spacebar to change language - \u2190 Tap again to save + \u2190 Touch again to save Dictionary available @@ -342,9 +342,9 @@ Help improve this input method editor by automatically sending usage statistics and crash reports to Google. - Tap to re-correct words + Touch to re-correct words - You can re-correct words by tapping words you have typed + You can re-correct words by touching words you have typed Keyboard Theme From 55b10796522b871c1e04d6f2254fdff5dc7aced4 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 5 Oct 2010 22:51:59 +0900 Subject: [PATCH 042/287] Addressed bug: 3058217 "-" key not working at beginning of line Also fixed related issues below: * Punc suggestions list was sometimes not displayed after cursor move which follows re-correction * Punc suggestions list was disappearing with words which contains certain punc chars (but not word separator) such as ' and - Change-Id: I36faf679321782fa8eaf318411308a4a6b89cc25 --- .../android/inputmethod/latin/LatinIME.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index fb9c47db2..4328b823d 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -699,7 +699,9 @@ public class LatinIME extends InputMethodService mLastSelectionEnd = et.startOffset + et.selectionEnd; // Then look for possible corrections in a delayed fashion - if (!TextUtils.isEmpty(et.text)) postUpdateOldSuggestions(); + if (!TextUtils.isEmpty(et.text) && isCursorTouchingWord()) { + postUpdateOldSuggestions(); + } } } @@ -805,6 +807,10 @@ public class LatinIME extends InputMethodService postUpdateOldSuggestions(); } else { abortCorrection(false); + // Show the punctuation suggestions list if the current one is not + if (!mSuggestPuncList.equals(mCandidateView.getSuggestions())) { + setNextSuggestions(); + } } } } @@ -1315,7 +1321,7 @@ public class LatinIME extends InputMethodService } else if (deleteChar) { if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) { // Go back to the suggestion mode if the user canceled the - // "Tap again to save". + // "Touch again to save". // NOTE: In gerenal, we don't revert the word when backspacing // from a manual suggestion pick. We deliberately chose a // different behavior only in the case of picking the first @@ -1444,7 +1450,7 @@ public class LatinIME extends InputMethodService mVoiceInput.incrementTextModificationInsertPunctuationCount(1); } - // Should dismiss the "Tap again to save" message when handling separator + // Should dismiss the "Touch again to save" message when handling separator if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) { postUpdateSuggestions(); } @@ -1887,7 +1893,8 @@ public class LatinIME extends InputMethodService // So, LatinImeLogger logs "" as a user's input. LatinImeLogger.logOnManualSuggestion( "", suggestion.toString(), index, suggestions); - onKey(suggestion.charAt(0), null, LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, + final char primaryCode = suggestion.charAt(0); + onKey(primaryCode, new int[]{primaryCode}, LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE); if (ic != null) { ic.endBatchEdit(); @@ -1922,7 +1929,7 @@ public class LatinIME extends InputMethodService TextEntryState.typedCharacter((char) KEYCODE_SPACE, true); setNextSuggestions(); } else if (!showingAddToDictionaryHint) { - // If we're not showing the "Tap again to save hint", then show corrections again. + // If we're not showing the "Touch again to save hint", then show corrections again. // In case the cursor position doesn't change, make sure we show the suggestions again. clearSuggestions(); postUpdateOldSuggestions(); @@ -2094,7 +2101,7 @@ public class LatinIME extends InputMethodService ic.endBatchEdit(); } else { abortCorrection(true); - setNextSuggestions(); + setNextSuggestions(); // Show the punctuation suggestions list } } else { abortCorrection(true); @@ -2150,11 +2157,13 @@ public class LatinIME extends InputMethodService CharSequence toLeft = ic.getTextBeforeCursor(1, 0); CharSequence toRight = ic.getTextAfterCursor(1, 0); if (!TextUtils.isEmpty(toLeft) - && !isWordSeparator(toLeft.charAt(0))) { + && !isWordSeparator(toLeft.charAt(0)) + && !isSuggestedPunctuation(toLeft.charAt(0))) { return true; } if (!TextUtils.isEmpty(toRight) - && !isWordSeparator(toRight.charAt(0))) { + && !isWordSeparator(toRight.charAt(0)) + && !isSuggestedPunctuation(toRight.charAt(0))) { return true; } return false; From 3425026d51dbbcc579ceecd59f578a512d4a853e Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 6 Oct 2010 17:34:07 +0900 Subject: [PATCH 043/287] Follow-up to Ia135eb92 . Shorten overflowed string. bug: 3063598 Change-Id: I703054c930590ef62579183731935ec3362406cd --- java/res/values/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 7747c7b25..8c1c80be5 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -337,14 +337,14 @@ Dictionary available - + Enable user feedback - + Help improve this input method editor by automatically sending usage statistics and crash reports to Google. - - Touch to re-correct words - - You can re-correct words by touching words you have typed + + Touch to correct words + + You can correct words by touching words you have typed Keyboard Theme From 6495bfc7a6f6bfa6ab82e7f062ee80f4b6b33368 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 6 Oct 2010 18:39:47 +0900 Subject: [PATCH 044/287] Follow-up to I36faf679 Cancel pending messages related to suggestion updates. bug: 3058217 Change-Id: I54e29bf051b76ad27e6d653adbf14892083ad7eb --- java/src/com/android/inputmethod/latin/LatinIME.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 4328b823d..8eeae8600 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -727,6 +727,14 @@ public class LatinIME extends InputMethodService if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites(); } + @Override + public void onFinishInputView(boolean finishingInput) { + super.onFinishInputView(finishingInput); + // Remove penging messages related to update suggestions + mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); + mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); + } + @Override public void onUpdateExtractedText(int token, ExtractedText text) { super.onUpdateExtractedText(token, text); From 47a9c3f3d9f53bbafc0d23f122079ae63f1e9dfe Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Thu, 7 Oct 2010 00:57:37 +0900 Subject: [PATCH 045/287] Additional string update for LatinIME's re-correction preference item. Follow-up to I703054c9 bug: 3063598 Change-Id: Ic9d752b8588a620b3e256fe38f3a6a0c9c093053 --- java/res/values/strings.xml | 2 +- java/res/xml/prefs.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 8c1c80be5..6644d2224 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -344,7 +344,7 @@ Touch to correct words - You can correct words by touching words you have typed + Touch entered words to correct them Keyboard Theme diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 7bcf19334..9348e954a 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -40,6 +40,7 @@ From e13a301328b7104624db5b37a9b043fd7a6825b7 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Wed, 6 Oct 2010 17:15:27 -0700 Subject: [PATCH 046/287] Import revised translations. DO NOT MERGE Change-Id: Icf8fa9146cc4cbfb70d5069be5359d04c5ec2432 --- java/res/values-cs/strings.xml | 44 ++++++++++------------------ java/res/values-da/strings.xml | 44 ++++++++++------------------ java/res/values-de/strings.xml | 46 +++++++++++------------------- java/res/values-el/strings.xml | 44 ++++++++++------------------ java/res/values-es-rUS/strings.xml | 44 ++++++++++------------------ java/res/values-es/strings.xml | 44 ++++++++++------------------ java/res/values-fr/strings.xml | 44 ++++++++++------------------ java/res/values-it/strings.xml | 44 ++++++++++------------------ java/res/values-ja/strings.xml | 44 ++++++++++------------------ java/res/values-ko/strings.xml | 44 ++++++++++------------------ java/res/values-nb/strings.xml | 44 ++++++++++------------------ java/res/values-nl/strings.xml | 44 ++++++++++------------------ java/res/values-pl/strings.xml | 44 ++++++++++------------------ java/res/values-pt-rPT/strings.xml | 44 ++++++++++------------------ java/res/values-pt/strings.xml | 44 ++++++++++------------------ java/res/values-ru/strings.xml | 44 ++++++++++------------------ java/res/values-sv/strings.xml | 44 ++++++++++------------------ java/res/values-tr/strings.xml | 44 ++++++++++------------------ java/res/values-zh-rCN/strings.xml | 44 ++++++++++------------------ java/res/values-zh-rTW/strings.xml | 44 ++++++++++------------------ 20 files changed, 301 insertions(+), 581 deletions(-) diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 497e0b8c6..58ba671ae 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Klávesnice Android" "Nastavení klávesnice Android" - - + "Možnosti zadávání textu a dat" "Při stisku klávesy vibrovat" "Zvuk při stisku klávesy" - - + "Zobrazit znaky při stisku klávesy" "Opravovat překlepy" "Povolit opravu chyb vstupu" "Chyby vstupu v zobrazení na šířku" @@ -50,14 +48,10 @@ "Zobrazovat navržená slova během psaní" "Automatické dokončování" "Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo." - - - - - - - - + "Zobrazit klávesu Nastavení" + "Automaticky" + "Vždy zobrazovat" + "Vždy skrývat" @@ -131,24 +125,16 @@ ".org" ".net" ".eu" - - + "Výběr metody zadávání dat" "Vstupní jazyky" "Jazyk můžete změnit posunutím prstu po mezerníku." - "← Uložte slovo opětovným klepnutím" + "← Uložte slovo opětovným klepnutím" "K dispozici je slovník" - - - - - - - - - - - - - - + "Aktivovat zasílání statistik užívání a zpráv o selhání" + "Automatickým zasíláním statistik o užívání editoru zadávání dat a zpráv o jeho selhání do Googlu můžete přispět k vylepšení tohoto nástroje." + "Klepnutím sem aktivujete korekci" + "Klepnutím na slova, která jste napsali, zobrazíte návrhy na korekci." + "Motiv klávesnice" + "klávesnice" + "hlas" diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 191f432c2..b554e1be5 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-tastatur" "Indstillinger for Android-tastatur" - - + "Indstillinger for input" "Vibration ved tastetryk" "Lyd ved tastetryk" - - + "Popup ved tastetryk" "Ret stavefejl" "Aktiver fejlretning af input" "Inputfejl i landskab" @@ -50,14 +48,10 @@ "Vis ordforslag under indtastning" "Udfyld automatisk" "Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord" - - - - - - - - + "Vis indstillingsnøgle" + "Automatisk" + "Vis altid" + "Skjul altid" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Vælg inputmetode" "Inputsprog" "Træk fingeren på mellemrumstasten for at skifte sprog" - "← Tast igen for at gemme" + "← Tast igen for at gemme" "Ordbog er tilgængelig" - - - - - - - - - - - - - - + "Aktiver brugerfeedback" + "Vær med til at forbedre denne inputmetode ved at sende anvendelsesstatistikker og rapporter om nedbrud til Google." + "Tryk for at rette ord igen" + "Du kan rette ordene igen ved at trykke på de ord, du har indtastet" + "Tastaturtema" + "tastatur" + "stemme" diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 5b8352d26..c9dbb4aef 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-Tastatur" "Android-Tastatureinstellungen" - - + "Eingabeoptionen" "Vibrieren b. Tastendruck" "Ton bei Tastendruck" - - + "Pop-up bei Tastendruck" "Eingabefehler korrigieren" "Korrektur von Eingabefehlern aktivieren" "Eingabefehler im Querformat" @@ -50,14 +48,10 @@ "Vorgeschlagene Wörter während des Tippens anzeigen" "Autom. vervollständigen" "Leertaste und Interpunktion fügen autom. ein markiertes Wort ein" - - - - - - - - + "Einstellungsschlüssel anzeigen" + "Automatisch" + "Immer anzeigen" + "Immer ausblenden" @@ -103,7 +97,7 @@ "Audio-Problem" "Serverfehler" "Keine Sprache zu hören" - "Keine Übereinstimmungen gefunden" + "Keine Treffer gefunden" "Sprach-Suche nicht installiert" "Hinweis:"" Ziehen Sie zum Sprechen den Finger über die Tastatur." "Hinweis:"" Versuchen Sie beim nächsten Mal, Satzzeichen wie \"Punkt\", \"Komma\" oder \"Fragezeichen\" per Sprachbefehl einzugeben." @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Eingabemethode auswählen" "Eingabesprachen" "Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln" - "← Zum Speichern erneut tippen" + "← Zum Speichern erneut tippen" "Wörterbuch verfügbar" - - - - - - - - - - - - - - + "Nutzer-Feedback aktivieren" + "Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte an Google senden." + "Zur Korrektur von Wörtern darauf tippen" + "Sie können Wörter korrigieren, indem Sie auf eingegebene Wörter tippen." + "Tastaturdesign" + "Tastatur" + "Sprache" diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 7d4d7dd61..b87597aa4 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Πληκτρολόγιο Android" "Ρυθμίσεις πληκτρολογίου Android" - - + "Επιλογές εισόδου" "Δόνηση κατά το πάτημα πλήκτρων" "Ήχος κατά το πάτημα πλήκτρων" - - + "Εμφάνιση με το πάτημα πλήκτρου" "Διόρθωση σφαλμάτων πληκτρολόγησης" "Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου" "Σφάλματα οριζόντιας εισαγωγής" @@ -50,14 +48,10 @@ "Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση" "Αυτόματη συμπλήρωση" "Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη" - - - - - - - - + "Εμφάνιση πλήκτρου ρυθμίσεων" + "Αυτόματο" + "Να εμφανίζεται πάντα" + "Πάντα απόκρυψη" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Επιλογή μεθόδου εισόδου" "Γλώσσες εισόδου" "Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα" - "← Πατήστε ξανά για αποθήκευση" + "← Πατήστε ξανά για αποθήκευση" "Λεξικό διαθέσιμο" - - - - - - - - - - - - - - + "Ενεργοποίηση σχολίων χρηστών" + "Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων στην Google." + "Αγγίξτε για να διορθώσετε ξανά τις λέξεις" + "Μπορείτε να διορθώσετε ξανά τις λέξεις αγγίζοντας τις λέξεις που έχετε πληκτρολογήσει" + "Θέμα πληκτρολογίου" + "πληκτρολόγιο" + "φωνητική" diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index e5c937f1a..1737665b4 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado de Android" "Configuración de teclado de Android" - - + "Opciones de entrada" "Vibrar al pulsar teclas" "Sonar al pulsar las teclas" - - + "Aviso emergente sobre keypress" "Corregir errores de escritura" "Habilitar corrección de error de entrada" "Errores de entrada apaisada" @@ -50,14 +48,10 @@ "Mostrar palabras sugeridas mientras escribe" "Completar automát." "La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada." - - - - - - - - + "Mostrar tecla de parámetros de configuración" + "Automático" + "Mostrar siempre" + "Ocultar siempre" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Seleccionar método de entrada" "Idiomas de entrada" "Deslizarse manualmente por la barra espaciadora para cambiar el idioma" - "← Presionar nuevamente para guardar" + "← Presionar nuevamente para guardar" "Diccionario disponible" - - - - - - - - - - - - - - + "Habilitar los comentarios del usuario" + "Ayuda a mejorar este editor de método de introducción de texto al enviar las estadísticas de uso y los informes de error a Google." + "Puntea para volver a corregir las palabras" + "Puedes volver a corregir las palabras punteando las que ya has escrito" + "Tema del teclado" + "Teclado" + "Voz" diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index d5be1351b..76d0ab018 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado de Android" "Ajustes del teclado de Android" - - + "Opciones introducción texto" "Vibrar al pulsar tecla" "Sonido al pulsar tecla" - - + "Popup al pulsar" "Corregir errores de escritura" "Habilitar la introducción de corrección de errores" "Errores de introducción de datos en vista horizontal" @@ -50,14 +48,10 @@ "Muestra las palabras sugeridas mientras se escribe." "Autocompletar" "La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada." - - - - - - - - + "Mostrar tecla de ajustes" + "Automáticamente" + "Mostrar siempre" + "Ocultar siempre" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Seleccionar método de introducción de texto" "Idiomas" "Deslizar el dedo por la barra espaciadora para cambiar el idioma" - "← Volver a tocar para guardar" + "← Volver a tocar para guardar" "Hay un diccionario disponible." - - - - - - - - - - - - - - + "Habilitar comentarios de usuarios" + "Ayuda a mejorar este editor de método de introducción de texto enviando estadísticas de uso e informes de error a Google." + "Tocar para corregir palabras" + "Para corregir palabras, toca las que hayas escrito." + "Tema de teclado" + "teclado" + "voz" diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index ef5a70884..da3ebdc55 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Clavier Android" "Paramètres du clavier Android" - - + "Options de saisie" "Vibrer à chaque touche" "Son à chaque touche" - - + "Agrandir les caractères à chaque touche utilisée" "Corriger les fautes de frappe" "Activer la correction des erreurs de saisie" "Erreurs de saisie en mode paysage" @@ -50,14 +48,10 @@ "Afficher les suggestions de terme lors de la saisie" "Saisie semi-automatique" "Insérer auto. le terme surligné avec barre espace/ponctuation" - - - - - - - - + "Afficher la touche des paramètres" + "Automatique" + "Toujours afficher" + "Toujours masquer" @@ -131,24 +125,16 @@ ".org" ".gouv" ".edu" - - + "Sélectionner un mode de saisie." "Langues de saisie" "Faites glisser votre doigt sur la barre d\'espacement pour changer la langue." - "← Appuyer de nouveau pour enregistrer" + "← Appuyer de nouveau pour enregistrer" "Dictionnaire disponible" - - - - - - - - - - - - - - + "Autoriser les commentaires des utilisateurs" + "Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google." + "Appuyer pour corriger les suggestions" + "Vous pouvez corriger les suggestions en appuyant sur les mots à modifier." + "Thème du clavier" + "clavier" + "voix" diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 1f213fc05..c4a2ce3ee 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tastiera Android" "Impostazioni tastiera Android" - - + "Opzioni inserimento" "Vibrazione tasti" "Suono tasti" - - + "Popup alla pressione di un tasto" "Correggi errori di digitazione" "Attiva la correzione degli errori di inserimento" "Errori di inserimento in visualizzazione orizzontale" @@ -50,14 +48,10 @@ "Visualizza le parole suggerite durante la digitazione" "Completamento autom." "Barra spaziatrice e punteggiatura inseriscono la parola evidenziata" - - - - - - - - + "Mostra tasto impostazioni" + "Automatico" + "Mostra sempre" + "Nascondi sempre" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Seleziona metodo di inserimento" "Lingue comandi" "Scorri il dito sulla barra spaziatrice per cambiare la lingua" - "← Tocca di nuovo per salvare" + "← Tocca di nuovo per salvare" "Dizionario disponibile" - - - - - - - - - - - - - - + "Attiva commenti degli utenti" + "Aiuta a migliorare l\'editor del metodo di inserimento inviando automaticamente a Google statistiche sull\'utilizzo e segnalazioni sugli arresti anomali." + "Tocca per correggere di nuovo le parole" + "Puoi correggere di nuovo le parole toccando quelle che hai digitato" + "Tema della tastiera" + "tastiera" + "vocale" diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 5a9e053cb..e720db47d 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Androidキーボード" "Androidキーボードの設定" - - + "入力オプション" "キー操作バイブ" "キー操作音" - - + "キー押下時に文字をポップアップ表示" "入力ミス補正" "入力間違いを自動修正する" "横表示での入力修正" @@ -50,14 +48,10 @@ "入力時に入力候補を表示する" "オートコンプリート" "反転表示されている変換候補をスペースまたは句読点キーで挿入する" - - - - - - - - + "設定キーを表示" + "自動" + "常に表示" + "常に非表示" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "入力方法の選択" "入力言語" "スペースバーで指をスライドさせて言語を変更する" - "←保存するにはもう一度タップ" + "←保存するにはもう一度タップ" "辞書を利用できます" - - - - - - - - - - - - - - + "ユーザーフィードバックを有効にする" + "IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。" + "タップして語句を再修正" + "入力した語句をタップすると語句を再修正できます" + "キーボードテーマ" + "キーボード" + "音声" diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index c6b66d00a..99e46ea3f 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 키보드" "Android 키보드 설정" - - + "입력 옵션" "키를 누를 때 진동 발생" "키를 누를 때 소리 발생" - - + "키를 누를 때 팝업" "입력 오류 수정" "입력 오류 수정 사용" "가로 입력 오류" @@ -50,14 +48,10 @@ "글자를 입력하는 동안 추천 단어를 표시" "자동 완성" "스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입" - - - - - - - - + "설정 키 표시" + "자동" + "항상 표시" + "항상 숨기기" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "입력 방법 선택" "입력 언어" "손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경" - "← 저장하려면 다시 누르세요." + "← 저장하려면 다시 누르세요." "사전 사용 가능" - - - - - - - - - - - - - - + "사용자 의견 사용" + "사용 통계 및 충돌 보고서를 Google에 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다." + "눌러서 단어 다시 수정" + "입력한 단어를 누르면 다시 수정할 수 있습니다." + "키보드 테마" + "키보드" + "음성" diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 0f33dd26f..5a053dfa4 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Skjermtastatur" "Innstillinger for skjermtastatur" - - + "Inndataalternativer" "Vibrer ved tastetrykk" "Lyd ved tastetrykk" - - + "Hurtigvindu ved tastetrykk" "Rett opp skrivefeil" "Slå på retting av skrivefeil" "Rett opp skrivefeil i breddeformat" @@ -50,14 +48,10 @@ "Vis foreslåtte ord under skriving" "Autofullføring" "Mellomrom og punktum setter automatisk inn valgt ord" - - - - - - - - + "Vis innstillingsnøkkel" + "Automatisk" + "Vis alltid" + "Skjul alltid" @@ -131,24 +125,16 @@ ".net" ".org" ".info" - - + "Velg inndatametode" "Inndataspråk" "Dra fingeren på mellomromstasten for å endre språk" - "← Trykk på nytt for å lagre" + "← Trykk på nytt for å lagre" "Ordbok tilgjengelig" - - - - - - - - - - - - - - + "Aktiver brukertilbakemelding" + "Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre." + "Trykk for å endre ord" + "Du kan endre innskrevne ord ved å trykke på dem" + "Tastaturtema" + "tastatur" + "stemme" diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 59eccd88e..35cee4b79 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-toetsenbord" "Instellingen voor Android-toetsenbord" - - + "Invoeropties" "Trillen bij druk op toets" "Geluid bij druk op een toets" - - + "Pop-up bij toetsaanslag" "Typefouten corrigeren" "Foutcorrectie tijdens invoer inschakelen" "Invoerfouten in liggende weergave" @@ -50,14 +48,10 @@ "Voorgestelde woorden weergeven tijdens typen" "Auto-aanvullen" "Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie" - - - - - - - - + "Instellingscode weergeven" + "Automatisch" + "Altijd weergeven" + "Altijd verbergen" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Invoermethode selecteren" "Invoertalen" "Schuif uw vinger over de spatiebalk om de taal te wijzigen" - "← Tik nogmaals om op te slaan" + "← Tik nogmaals om op te slaan" "Woordenboek beschikbaar" - - - - - - - - - - - - - - + "Gebruikersfeedback inschakelen." + "Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden." + "Tik om woorden opnieuw te corrigeren" + "U kunt woorden opnieuw corrigeren door woorden aan te raken die u heeft getypt" + "Toetsenbordthema" + "toetsenbord" + "spraak" diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index d10b5c35e..5a406230d 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Klawiatura Android" "Ustawienia klawiatury Android" - - + "Opcje wprowadzania" "Wibracja przy naciśnięciu" "Dźwięk przy naciśnięciu" - - + "Wyświetlaj po naciśnięciu klawisza" "Popraw błędy pisowni" "Włącz poprawianie błędów wprowadzania" "Błędy wprowadzania w orientacji poziomej" @@ -50,14 +48,10 @@ "Wyświetl sugerowane słowa podczas wpisywania" "Autouzupełnianie" "Spacja i znaki przestankowe wstawiają wyróżnione słowo" - - - - - - - - + "Pokaż klawisz ustawień" + "Automatycznie" + "Zawsze pokazuj" + "Zawsze ukrywaj" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Wybierz metodę wprowadzania" "Języki wprowadzania" "Przesuń palcem po spacji, aby zmienić język" - "← Dotknij ponownie, aby zapisać" + "← Dotknij ponownie, aby zapisać" "Słownik dostępny" - - - - - - - - - - - - - - + "Włącz przesyłanie opinii użytkownika" + "Pomóż ulepszyć edytor tej metody wprowadzania, automatycznie wysyłając do Google statystyki użycia i raporty o awariach." + "Dotknij, aby ponownie poprawić słowa" + "Możesz ponownie poprawiać słowa, dotykając wprowadzonych słów" + "Motyw klawiatury" + "klawiatura" + "głosowe" diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 473e9ada3..b940a3d0f 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado do Android" "Definições de teclado do Android" - - + "Opções de introdução" "Vibrar ao primir as teclas" "Som ao premir as teclas" - - + "Mostrar popup ao premir tecla" "Corrigir erros de escrita" "Activar a correcção de erros de entrada" "Erros de entrada na horizontal" @@ -50,14 +48,10 @@ "Apresentar sugestões de palavras ao escrever" "Conclusão automática" "A barra de espaços e a pontuação inserem automaticamente uma palavra realçada" - - - - - - - - + "Mostrar tecla das definições" + "Automático" + "Mostrar sempre" + "Ocultar sempre" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Seleccionar método de entrada" "Idiomas de entrada" "Deslize o dedo pela barra de espaço para alterar o idioma" - "← Toque novamente para guardar" + "← Toque novamente para guardar" "Dicionário disponível" - - - - - - - - - - - - - - + "Activar comentários do utilizador" + "Envie automaticamente estatísticas de utilização e relatórios de falhas para a Google e ajude-nos a melhor este editor de método de introdução." + "Tocar para voltar a corrigir palavras" + "Pode voltar a corrigir palavras tocando naquelas que escreveu" + "Tema do teclado" + "teclado" + "voz" diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 4b998893c..1f49f9764 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado Android" "Configurações de teclado Android" - - + "Opções de entrada" "Vibrar ao tocar a tecla" "Som ao tocar a tecla" - - + "Exibir pop-up ao tocar a tecla" "Corrigir erros de digitação" "Ativar a correção de erro de entrada" "Erros de entrada de paisagem" @@ -50,14 +48,10 @@ "Exibir sugestões de palavras durante a digitação" "Conclusão automática" "Barra de espaço e pontuação inserem a palavra destacada" - - - - - - - - + "Mostrar tecla de configurações" + "Automático" + "Mostrar sempre" + "Sempre ocultar" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Selecionar método de entrada" "Idiomas de entrada" "Deslize o dedo na barra de espaços para alterar o idioma" - "← Toque novamente para salvar" + "← Toque novamente para salvar" "Dicionário disponível" - - - - - - - - - - - - - - + "Ativar comentário do usuário" + "Ajude a melhorar este editor de método de entrada enviando automaticamente ao Google estatísticas de uso e relatórios de falhas." + "Toque para corrigir novamente as palavras" + "Você pode fazer novamente a correção tocando nas palavras digitadas" + "Tema do teclado" + "teclado" + "voz" diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 65f9d5f32..ee97cd45a 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Клавиатура Android" "Настройки клавиатуры Android" - - + "Параметры ввода" "Виброотклик клавиш" "Звук клавиш" - - + "Показывать при нажатии" "Исправлять опечатки" "Включить исправление ошибок при вводе" "Ошибки при вводе в горизонтальной ориентации" @@ -50,14 +48,10 @@ "Предлагать варианты слов во время ввода" "Автозавершение" "При нажатии пробела вставлять предложенное слово" - - - - - - - - + "Показывать кнопку настроек" + "Автоматически" + "Всегда показывать" + "Всегда скрывать" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Выбрать способ ввода" "Языки ввода" "Для изменения языка проведите пальцем по пробелу" - "← Нажмите повторно, чтобы сохранить" + "← Нажмите повторно, чтобы сохранить" "Доступен словарь" - - - - - - - - - - - - - - + "Включить отправку сведений" + "Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях в Google." + "Исправление нажатием" + "Исправление слов нажатием на них" + "Вид клавиатуры" + "клавиатура" + "голосовой" diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 6b7ffd9e8..20845c2d6 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Androids tangentbord" "Inställningar för Androids tangentbord" - - + "Inmatningsalternativ" "Vibrera vid tangenttryck" "Knappljud" - - + "Popup vid knapptryck" "Rätta skrivfel" "Aktivera rättning av felaktiga inmatningar" "Inmatningsfel i liggande vy" @@ -50,14 +48,10 @@ "Visar ordförslag när du skriver" "Komplettera automatiskt" "Blanksteg och punkt infogar automatiskt markerat ord" - - - - - - - - + "Visa inställningsknapp" + "Automatiskt" + "Visa alltid" + "Dölj alltid" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Välj inmatningsmetod" "Inmatningsspråk" "Dra med fingret på blanksteg om du vill ändra språk" - "← Peka igen för att spara" + "← Peka igen för att spara" "En ordlista är tillgänglig" - - - - - - - - - - - - - - + "Aktivera synpunkter från användare" + "Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter till Google." + "Knacka lätt om du vill korrigera om ord" + "Du kan korrigera om ord genom att knacka lätt på ord som du har skrivit" + "Tangentbordstema" + "tangentbord" + "röst" diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index e0ec09445..c2f8dc15a 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android klavyesi" "Android klavye ayarları" - - + "Giriş seçenekleri" "Tuşa basıldığında titret" "Tuşa basıldığında ses çıkar" - - + "Tuşa basıldığında pop-up aç" "Yazım hatalarını düzelt" "Giriş hatası düzeltmeyi etkinleştir" "Yatay giriş hataları" @@ -50,14 +48,10 @@ "Yazarken önerilen kelimeleri görüntüle" "Otomatik tamamla" "Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler" - - - - - - - - + "Ayarları göster tuşu" + "Otomatik" + "Her zaman göster" + "Her zaman gizle" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "Giriş yöntemini seç" "Giriş dilleri" "Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın" - "← Kaydetmek için tekrar dokunun" + "← Kaydetmek için tekrar dokunun" "Sözlük kullanılabilir" - - - - - - - - - - - - - - + "Kullanıcı geri bildirimini etkinleştir" + "Kullanım istatistiklerini ve kilitlenme raporlarını Google\'a otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun." + "Kelimeleri düzeltmek için hafifçe vurun" + "Yazdığınız kelimelere hafifçe vurarak kelimelerde düzeltme yapabilirsiniz" + "Klavye Teması" + "klavye" + "ses" diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index b8973b220..7945a70fc 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 键盘" "Android 键盘设置" - - + "输入选项" "按键时振动" "按键时播放音效" - - + "按键时显示弹出窗口" "纠正输入错误" "启用输入错误纠正功能" "横向输入错误" @@ -50,14 +48,10 @@ "输入时启用联想提示" "自动填写" "按空格键和标点符号时自动插入突出显示的字词" - - - - - - - - + "显示设置键" + "自动" + "始终显示" + "始终隐藏" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "选择输入法" "输入语言" "在空格键上滑动手指可更改语言" - "← 再次点按即可保存" + "← 再次点按即可保存" "提供字典" - - - - - - - - - - - - - - + "启用用户反馈" + "自动向 Google 发送使用情况统计信息和崩溃报告,帮助改进该输入法编辑器。" + "点按即可更正字词" + "您可以点按已键入的字词,对其进行更正" + "键盘主题" + "键盘" + "语音" diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index d9e0dacaf..c9ed27a2b 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 鍵盤" "Android 鍵盤設定" - - + "輸入選項" "按鍵時震動" "按鍵時播放音效" - - + "按鍵時顯示彈出式視窗" "修正輸入錯誤" "啟用輸入錯誤修正功能" "橫向輸入錯誤" @@ -50,14 +48,10 @@ "打字時顯示建議字詞" "自動完成" "在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤" - - - - - - - - + "顯示設定金鑰" + "自動" + "永遠顯示" + "永遠隱藏" @@ -131,24 +125,16 @@ ".org" ".gov" ".edu" - - + "選取輸入法" "輸入語言" "以手指在空白鍵上滑動可變更語言" - "← 再次輕按可儲存" + "← 再次輕按可儲存" "可使用字典" - - - - - - - - - - - - - - + "啟用使用者意見回饋" + "自動將使用統計資料和當機報告傳送給 Google,協助改善這個輸入法編輯器。" + "輕按即可重新修正字詞" + "只要輕按您所輸入的字詞,即可重新予以修正。" + "鍵盤主題" + "鍵盤" + "語音" From d663555c9fe5b95caedbc25a74458b951128da80 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 7 Oct 2010 17:13:30 +0900 Subject: [PATCH 047/287] Keyboard XML file supports include and merge tag Keyboard XML file can include other keyboard XML file using directive . The keyboard XML file which is included must have tag as root element. Change-Id: I06c35fe7b3db5232acdb33f73a79f38d31261b32 --- java/res/values/attrs.xml | 4 + .../inputmethod/latin/BaseKeyboard.java | 235 ++++++++++++------ 2 files changed, 164 insertions(+), 75 deletions(-) diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 19002140c..318286ea8 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -129,4 +129,8 @@ requested keyboard mode, the row will be skipped. --> + + + + diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index 0bf4f4eaa..0327006c9 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -24,17 +24,17 @@ import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; import android.text.TextUtils; +import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.util.Xml; -import android.util.DisplayMetrics; +import android.view.InflateException; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; - /** * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard * consists of rows of keys. @@ -61,6 +61,8 @@ public class BaseKeyboard { private static final String TAG_KEYBOARD = "Keyboard"; private static final String TAG_ROW = "Row"; private static final String TAG_KEY = "Key"; + private static final String TAG_INCLUDE = "include"; + private static final String TAG_MERGE = "merge"; public static final int EDGE_LEFT = 0x01; public static final int EDGE_RIGHT = 0x02; @@ -104,9 +106,6 @@ public class BaseKeyboard { /** List of keys in this keyboard */ private final List mKeys = new ArrayList(); - /** List of modifier keys such as Shift & Alt, if any */ - private final List mModifierKeys = new ArrayList(); - /** Width of the screen available to fit the keyboard */ private final int mDisplayWidth; @@ -177,8 +176,7 @@ public class BaseKeyboard { a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard_Row); rowEdgeFlags = a.getInt(R.styleable.BaseKeyboard_Row_rowEdgeFlags, 0); - mode = a.getResourceId(R.styleable.BaseKeyboard_Row_keyboardMode, - 0); + mode = a.getResourceId(R.styleable.BaseKeyboard_Row_keyboardMode, 0); } } @@ -558,10 +556,6 @@ public class BaseKeyboard { return mKeys; } - public List getModifierKeys() { - return mModifierKeys; - } - protected int getHorizontalGap() { return mDefaultHorizontalGap; } @@ -682,79 +676,170 @@ public class BaseKeyboard { return new Key(res, parent, x, y, parser); } - private void loadKeyboard(Context context, XmlResourceParser parser) { - boolean inKey = false; - boolean inRow = false; - int row = 0; - int x = 0; - int y = 0; - Key key = null; - Row currentRow = null; - Resources res = context.getResources(); - boolean skipRow = false; + private static class KeyboardParseState { + private final int mKeyboardMode; + private int mCurrentX = 0; + private int mCurrentY = 0; + private int mMaxRowWidth = 0; + private int mTotalHeight = 0; + private Row mCurrentRow = null; - try { - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.START_TAG) { - String tag = parser.getName(); - 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) { - skipToEndOfRow(parser); - inRow = false; - } - } 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) { - mShiftKeys.add(key); - mModifierKeys.add(key); - } else if (key.codes[0] == KEYCODE_ALT) { - mModifierKeys.add(key); - } - } else if (TAG_KEYBOARD.equals(tag)) { - parseKeyboardAttributes(res, parser); - } - } else if (event == XmlResourceParser.END_TAG) { - if (inKey) { - inKey = false; - x += key.gap + key.width; - if (x > mTotalWidth) { - mTotalWidth = x; - } - } else if (inRow) { - inRow = false; - y += currentRow.verticalGap; - y += currentRow.defaultHeight; - row++; - } else { - // TODO: error or extend? - } - } - } - } catch (Exception e) { - Log.e(TAG, "Parse error:" + e); - e.printStackTrace(); + public KeyboardParseState(int keyboardMode) { + mKeyboardMode = keyboardMode; + } + + public int getX() { + return mCurrentX; + } + + public int getY() { + return mCurrentY; + } + + public Row getRow() { + return mCurrentRow; + } + + // return true if the row is valid for this keyboard mode + public boolean startRow(Row row) { + mCurrentX = 0; + mCurrentRow = row; + return row.mode == 0 || row.mode == mKeyboardMode; + } + + public void skipRow() { + mCurrentRow = null; + } + + public void endRow() { + if (mCurrentRow == null) + throw new InflateException("orphant end row tag"); + mCurrentY += mCurrentRow.verticalGap + mCurrentRow.defaultHeight; + mCurrentRow = null; + } + + public void endKey(Key key) { + mCurrentX += key.gap + key.width; + if (mCurrentX > mMaxRowWidth) + mMaxRowWidth = mCurrentX; + } + + public void endKeyboard(int defaultVerticalGap) { + mTotalHeight = mCurrentY - defaultVerticalGap; + } + + public int getMaxRowWidth() { + return mMaxRowWidth; + } + + public int getTotalHeight() { + return mTotalHeight; } - mTotalHeight = y - mDefaultVerticalGap; } - private void skipToEndOfRow(XmlResourceParser parser) + private void loadKeyboard(Context context, XmlResourceParser parser) { + try { + KeyboardParseState state = new KeyboardParseState(mKeyboardMode); + parseKeyboard(context.getResources(), parser, state); + // mTotalWidth is the width of this keyboard which is maximum width of row. + mTotalWidth = state.getMaxRowWidth(); + mTotalHeight = state.getTotalHeight(); + } catch (XmlPullParserException e) { + throw new IllegalArgumentException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void parseKeyboard(Resources res, XmlResourceParser parser, KeyboardParseState state) + throws XmlPullParserException, IOException { + Key key = null; + + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + // TODO createRowFromXml should not be called from BaseKeyboard constructor. + Row row = createRowFromXml(res, parser); + if (!state.startRow(row)) + skipToEndOfRow(parser, state); + } else if (TAG_KEY.equals(tag)) { + // TODO createKeyFromXml should not be called from BaseKeyboard constructor. + key = createKeyFromXml(res, state.getRow(), state.getX(), state.getY(), + parser); + mKeys.add(key); + if (key.codes[0] == KEYCODE_SHIFT) + mShiftKeys.add(key); + } else if (TAG_KEYBOARD.equals(tag)) { + parseKeyboardAttributes(res, parser); + } else if (TAG_INCLUDE.equals(tag)) { + if (parser.getDepth() == 0) + throw new InflateException(" cannot be the root element"); + parseInclude(res, parser, state); + } else if (TAG_MERGE.equals(tag)) { + throw new InflateException(" must not be appeared in keyboard XML file"); + } else { + throw new InflateException("unknown start tag: " + tag); + } + } else if (event == XmlResourceParser.END_TAG) { + String tag = parser.getName(); + if (TAG_KEY.equals(tag)) { + state.endKey(key); + } else if (TAG_ROW.equals(tag)) { + state.endRow(); + } else if (TAG_KEYBOARD.equals(tag)) { + state.endKeyboard(mDefaultVerticalGap); + } else if (TAG_INCLUDE.equals(tag)) { + ; + } else if (TAG_MERGE.equals(tag)) { + return; + } else { + throw new InflateException("unknown end tag: " + tag); + } + } + } + } + + private void parseInclude(Resources res, XmlResourceParser parent, KeyboardParseState state) + throws XmlPullParserException, IOException { + final TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parent), + R.styleable.BaseKeyboard_Include); + final int keyboardLayout = a.getResourceId( + R.styleable.BaseKeyboard_Include_keyboardLayout, 0); + a.recycle(); + if (keyboardLayout == 0) + throw new InflateException(" must have keyboardLayout attribute"); + final XmlResourceParser parser = res.getLayout(keyboardLayout); + + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + String name = parser.getName(); + if (TAG_MERGE.equals(name)) { + parseKeyboard(res, parser, state); + return; + } else { + throw new InflateException( + "include keyboard layout must have root element"); + } + } + } + } + + private void skipToEndOfRow(XmlResourceParser parser, KeyboardParseState state) throws XmlPullParserException, IOException { int event; while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.END_TAG - && parser.getName().equals(TAG_ROW)) { - break; + if (event == XmlResourceParser.END_TAG) { + String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + state.skipRow(); + return; + } } } + throw new InflateException("can not find "); } private void parseKeyboardAttributes(Resources res, XmlResourceParser parser) { From ff4d21bd29e8b43a4f5fe4b6fa9cb0c302719031 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 8 Oct 2010 01:15:00 +0900 Subject: [PATCH 048/287] Share 4th row of non-xlarge qwerty keyboard using Change-Id: Iff337e1c6ef3a17fd96a5e5f1c3c4a21190aac1c --- java/res/xml-da/kbd_qwerty.xml | 357 +---------------------- java/res/xml-da/kbd_qwerty_black.xml | 300 +------------------ java/res/xml-de/kbd_qwerty.xml | 357 +---------------------- java/res/xml-de/kbd_qwerty_black.xml | 300 +------------------ java/res/xml-fr/kbd_qwerty.xml | 357 +---------------------- java/res/xml-fr/kbd_qwerty_black.xml | 300 +------------------ java/res/xml-iw/kbd_qwerty.xml | 357 +---------------------- java/res/xml-iw/kbd_qwerty_black.xml | 300 +------------------ java/res/xml-nb/kbd_qwerty.xml | 357 +---------------------- java/res/xml-nb/kbd_qwerty_black.xml | 300 +------------------ java/res/xml-ru/kbd_qwerty.xml | 357 +---------------------- java/res/xml-ru/kbd_qwerty_black.xml | 300 +------------------ java/res/xml-sr/kbd_qwerty.xml | 357 +---------------------- java/res/xml-sr/kbd_qwerty_black.xml | 300 +------------------ java/res/xml-sv/kbd_qwerty.xml | 357 +---------------------- java/res/xml-sv/kbd_qwerty_black.xml | 300 +------------------ java/res/xml/kbd_qwerty.xml | 347 +--------------------- java/res/xml/kbd_qwerty_black.xml | 290 +------------------ java/res/xml/kbd_qwerty_black_row4.xml | 323 +++++++++++++++++++++ java/res/xml/kbd_qwerty_row4.xml | 380 +++++++++++++++++++++++++ 20 files changed, 721 insertions(+), 5875 deletions(-) create mode 100644 java/res/xml/kbd_qwerty_black_row4.xml create mode 100644 java/res/xml/kbd_qwerty_row4.xml diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index 431c5d7a6..c66290c62 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -173,360 +173,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml index 43bcdee39..7f6ffaa2e 100644 --- a/java/res/xml-da/kbd_qwerty_black.xml +++ b/java/res/xml-da/kbd_qwerty_black.xml @@ -172,303 +172,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml index cc9d32f94..5d40d39b7 100644 --- a/java/res/xml-de/kbd_qwerty.xml +++ b/java/res/xml-de/kbd_qwerty.xml @@ -152,360 +152,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml index fc0ede3c5..9842dd51d 100644 --- a/java/res/xml-de/kbd_qwerty_black.xml +++ b/java/res/xml-de/kbd_qwerty_black.xml @@ -151,303 +151,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml index c18339cb3..9b82e824d 100644 --- a/java/res/xml-fr/kbd_qwerty.xml +++ b/java/res/xml-fr/kbd_qwerty.xml @@ -153,360 +153,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml index c0f263f25..c3f122fa7 100644 --- a/java/res/xml-fr/kbd_qwerty_black.xml +++ b/java/res/xml-fr/kbd_qwerty_black.xml @@ -152,303 +152,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml index 97d9ccbf4..8ae7187a2 100644 --- a/java/res/xml-iw/kbd_qwerty.xml +++ b/java/res/xml-iw/kbd_qwerty.xml @@ -101,360 +101,5 @@ latin:keyLabel="ץ" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml index a7c5a99ea..1435e1e13 100644 --- a/java/res/xml-iw/kbd_qwerty_black.xml +++ b/java/res/xml-iw/kbd_qwerty_black.xml @@ -100,303 +100,5 @@ latin:keyLabel="ץ" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml index ea7fb3042..0efe2a177 100644 --- a/java/res/xml-nb/kbd_qwerty.xml +++ b/java/res/xml-nb/kbd_qwerty.xml @@ -173,360 +173,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml index ea1a3a093..c7bbf943e 100644 --- a/java/res/xml-nb/kbd_qwerty_black.xml +++ b/java/res/xml-nb/kbd_qwerty_black.xml @@ -172,303 +172,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml index e31f517be..e40982855 100644 --- a/java/res/xml-ru/kbd_qwerty.xml +++ b/java/res/xml-ru/kbd_qwerty.xml @@ -151,360 +151,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml index 3ddfd29d4..784f7457f 100644 --- a/java/res/xml-ru/kbd_qwerty_black.xml +++ b/java/res/xml-ru/kbd_qwerty_black.xml @@ -150,303 +150,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml index dd74fc264..703c188cc 100644 --- a/java/res/xml-sr/kbd_qwerty.xml +++ b/java/res/xml-sr/kbd_qwerty.xml @@ -144,360 +144,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml index 8c73ee3ff..fe80ef676 100644 --- a/java/res/xml-sr/kbd_qwerty_black.xml +++ b/java/res/xml-sr/kbd_qwerty_black.xml @@ -143,303 +143,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml index 6425624c2..24a2e0657 100644 --- a/java/res/xml-sv/kbd_qwerty.xml +++ b/java/res/xml-sv/kbd_qwerty.xml @@ -174,360 +174,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml index 6337b9109..ec83dec2a 100644 --- a/java/res/xml-sv/kbd_qwerty_black.xml +++ b/java/res/xml-sv/kbd_qwerty_black.xml @@ -174,303 +174,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index ed581a941..1495bae77 100644 --- a/java/res/xml/kbd_qwerty.xml +++ b/java/res/xml/kbd_qwerty.xml @@ -152,350 +152,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml index a35731815..ab3148da3 100644 --- a/java/res/xml/kbd_qwerty_black.xml +++ b/java/res/xml/kbd_qwerty_black.xml @@ -151,293 +151,5 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/java/res/xml/kbd_qwerty_black_row4.xml b/java/res/xml/kbd_qwerty_black_row4.xml new file mode 100644 index 000000000..1718603fd --- /dev/null +++ b/java/res/xml/kbd_qwerty_black_row4.xml @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml new file mode 100644 index 000000000..124008f7f --- /dev/null +++ b/java/res/xml/kbd_qwerty_row4.xml @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7af745e6f66d6efdc5b0ad22ae25c28a411fbdc8 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 8 Oct 2010 15:56:25 +0900 Subject: [PATCH 049/287] Call InputMethodSubtypePicker instead of InputMethodPicker Change-Id: I7c29285f4fd304d08bfd8f5f72df3fc421090681 --- java/src/com/android/inputmethod/latin/LatinIME.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index d0c8af5c4..bcf09c17d 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1138,9 +1138,9 @@ public class LatinIME extends InputMethodService } } - private void showInputMethodPicker() { + private void showInputMethodSubtypePicker() { ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) - .showInputMethodPicker(); + .showInputMethodSubtypePicker(); } private void onOptionKeyPressed() { @@ -1156,7 +1156,7 @@ public class LatinIME extends InputMethodService private void onOptionKeyLongPressed() { if (!isShowingOptionDialog()) { if (LatinIMEUtil.hasMultipleEnabledIMEs(this)) { - showInputMethodPicker(); + showInputMethodSubtypePicker(); } else { launchSettings(); } @@ -2575,8 +2575,7 @@ public class LatinIME extends InputMethodService launchSettings(); break; case POS_METHOD: - ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) - .showInputMethodPicker(); + showInputMethodSubtypePicker(); break; } } From 5e02930a7f40b704f357f127d3d38fbdc193ffa1 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 8 Oct 2010 12:51:15 +0900 Subject: [PATCH 050/287] Reduce delay before mini popup keyboard is shown Before this change, the delay was 500 ms that came from ViewConfiguration.getLongPressTimeout(). This change reduces the delay to 400 ms. Bug: 3074984 Change-Id: Ia5af5e877a3c4bb29211ef4040c728ac09a9fe85 --- java/res/layout/input_trans.xml | 32 ------------------- java/res/values/config.xml | 4 +++ .../latin/LatinKeyboardBaseView.java | 7 ++-- .../inputmethod/latin/PointerTracker.java | 27 +++++++++------- 4 files changed, 23 insertions(+), 47 deletions(-) delete mode 100644 java/res/layout/input_trans.xml diff --git a/java/res/layout/input_trans.xml b/java/res/layout/input_trans.xml deleted file mode 100644 index 4c0979c04..000000000 --- a/java/res/layout/input_trans.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - diff --git a/java/res/values/config.xml b/java/res/values/config.xml index 6e941baaf..b11236a23 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -25,4 +25,8 @@ 90 0 100 + 400 + 50 + 400 + 800 diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 75ef691c8..bcd1bb056 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -154,7 +154,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } // Timing constants - private static final int REPEAT_INTERVAL = PointerTracker.REPEAT_INTERVAL; + private final int mKeyRepeatInterval; // Miscellaneous constants /* package */ static final int NOT_A_KEY = -1; @@ -261,7 +261,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx case MSG_REPEAT_KEY: { final PointerTracker tracker = (PointerTracker)msg.obj; tracker.repeatKey(msg.arg1); - startKeyRepeatTimer(REPEAT_INTERVAL, msg.arg1, tracker); + startKeyRepeatTimer(mKeyRepeatInterval, msg.arg1, tracker); break; } case MSG_LONGPRESS_KEY: { @@ -542,6 +542,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mHasDistinctMultitouch = context.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT); + mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); } public void setOnKeyboardActionListener(OnKeyboardActionListener listener) { @@ -1218,7 +1219,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Create pointer trackers until we can get 'id+1'-th tracker, if needed. for (int i = pointers.size(); i <= id; i++) { final PointerTracker tracker = - new PointerTracker(i, mHandler, mKeyDetector, this, mHasDistinctMultitouch); + new PointerTracker(i, mHandler, mKeyDetector, this, getResources()); if (keys != null) tracker.setKeyboard(keys, mKeyHysteresisDistance); if (listener != null) diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index b416a984c..448e27910 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -19,11 +19,11 @@ package com.android.inputmethod.latin; import com.android.inputmethod.latin.LatinKeyboardBaseView.OnKeyboardActionListener; import com.android.inputmethod.latin.LatinKeyboardBaseView.UIHandler; +import android.content.res.Resources; import android.inputmethodservice.Keyboard; import android.inputmethodservice.Keyboard.Key; import android.util.Log; import android.view.MotionEvent; -import android.view.ViewConfiguration; public class PointerTracker { private static final String TAG = "PointerTracker"; @@ -33,15 +33,15 @@ public class PointerTracker { public interface UIProxy { public void invalidateKey(Key key); public void showPreview(int keyIndex, PointerTracker tracker); + public boolean hasDistinctMultitouch(); } public final int mPointerId; // Timing constants - private static final int REPEAT_START_DELAY = 400; - /* package */ static final int REPEAT_INTERVAL = 50; // ~20 keys per second - private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout(); - private static final int MULTITAP_INTERVAL = 800; // milliseconds + private final int mDelayBeforeKeyRepeatStart; + private final int mLongPressKeyTimeout; + private final int mMultiTapKeyTimeout; // Miscellaneous constants private static final int NOT_A_KEY = LatinKeyboardBaseView.NOT_A_KEY; @@ -164,7 +164,7 @@ public class PointerTracker { } public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy, - boolean hasDistinctMultitouch) { + Resources res) { if (proxy == null || handler == null || keyDetector == null) throw new NullPointerException(); mPointerId = id; @@ -172,7 +172,10 @@ public class PointerTracker { mHandler = handler; mKeyDetector = keyDetector; mKeyState = new KeyState(keyDetector); - mHasDistinctMultitouch = hasDistinctMultitouch; + mHasDistinctMultitouch = proxy.hasDistinctMultitouch(); + mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start); + mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout); + mMultiTapKeyTimeout = res.getInteger(R.integer.config_multi_tap_key_timeout); resetMultiTap(); } @@ -278,10 +281,10 @@ public class PointerTracker { if (isValidKeyIndex(keyIndex)) { if (mKeys[keyIndex].repeatable) { repeatKey(keyIndex); - mHandler.startKeyRepeatTimer(REPEAT_START_DELAY, keyIndex, this); + mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this); mIsRepeatableKey = true; } - mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); + mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); } showKeyPreviewAndUpdateKey(keyIndex); } @@ -296,11 +299,11 @@ public class PointerTracker { if (isValidKeyIndex(keyIndex)) { if (keyState.getKeyIndex() == NOT_A_KEY) { keyState.onMoveToNewKey(keyIndex, x, y); - mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); + mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); } else if (!isMinorMoveBounce(x, y, keyIndex)) { resetMultiTap(); keyState.onMoveToNewKey(keyIndex, x, y); - mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); + mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); } } else { if (keyState.getKeyIndex() != NOT_A_KEY) { @@ -489,7 +492,7 @@ public class PointerTracker { return; final boolean isMultiTap = - (eventTime < mLastTapTime + MULTITAP_INTERVAL && keyIndex == mLastSentIndex); + (eventTime < mLastTapTime + mMultiTapKeyTimeout && keyIndex == mLastSentIndex); if (key.codes.length > 1) { mInMultiTap = true; if (isMultiTap) { From ff49b79dfbf2a46ebc2e620d06bd6829cddf3438 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 8 Oct 2010 14:21:12 +0900 Subject: [PATCH 051/287] Make keyboard vertical correction configurable (DO NOT MERGE) Before this change, the verticalCorrection value was defined by "dpi" that is relative to device screen. This change defines the verticalCorrection by absolute unit "in". Bug: 3066107 Change-Id: I72c2448894a1084c582c2f1fb942b5fa8353f028 --- java/res/values/dimens.xml | 7 +++++++ java/res/values/styles.xml | 10 +++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index f83fc36a6..1378be72c 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -28,10 +28,17 @@ will not go into extract (fullscreen) mode. --> 2.5in 22sp + 14sp + 0dip + 80dip 91.8dip -54dip + 0.05in + + -0.06in 0.3in diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index 5e239482f..0372b07cf 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -22,12 +22,12 @@ @dimen/key_text_size #FFFFFFFF @layout/key_preview - 0dip - 80dip - 14sp + @dimen/key_preview_offset + @dimen/key_preview_height + @dimen/key_label_text_size @layout/keyboard_popup - 0.05in - -10dip + @dimen/key_hysteresis_distance + @dimen/keyboard_vertical_correction #BB000000 2.75 0.5 From 7e1f5a2d5a96c74691b3b09fa986efb7161e5a12 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 8 Oct 2010 22:17:16 +0900 Subject: [PATCH 052/287] Make sure to set symbol keyboard shifted To avoid a corner case of bug#3070963, in toggleShift() method of KeyboardSwitcher, the shifted symbol keyboard will be set if current keyboard is symbol keyboard or is not shifted symbol keyboard. This change also implements mini keyboard cache with WeakHashMap. Bug: 3070963 Change-Id: I868fc072e2f21bddded1622b800a53b9a6a43e91 --- .../inputmethod/latin/KeyboardSwitcher.java | 19 +++++++++----- .../android/inputmethod/latin/LatinIME.java | 25 +++++++++---------- .../latin/LatinKeyboardBaseView.java | 6 ++--- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index ebf2f4e60..86dbf1f60 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -23,9 +23,9 @@ import android.preference.PreferenceManager; import android.view.InflateException; import java.lang.ref.SoftReference; +import java.util.Arrays; import java.util.HashMap; import java.util.Locale; -import java.util.Map; public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -105,7 +105,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private KeyboardId mSymbolsShiftedId; private KeyboardId mCurrentId; - private final Map> mKeyboards; + private final HashMap> mKeyboards; private int mMode = MODE_NONE; /** One of the MODE_XXX values */ private int mImeOptions; @@ -194,11 +194,17 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public final boolean mEnableShiftLock; public final boolean mHasVoice; + private final int mHashCode; + public KeyboardId(int xml, int mode, boolean enableShiftLock, boolean hasVoice) { this.mXml = xml; this.mKeyboardMode = mode; this.mEnableShiftLock = enableShiftLock; this.mHasVoice = hasVoice; + + this.mHashCode = Arrays.hashCode(new Object[] { + xml, mode, enableShiftLock, hasVoice + }); } public KeyboardId(int xml, boolean hasVoice) { @@ -219,8 +225,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha @Override public int hashCode() { - return (mXml + 1) * (mKeyboardMode + 1) * (mEnableShiftLock ? 2 : 1) - * (mHasVoice ? 4 : 8); + return mHashCode; } } @@ -378,7 +383,9 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } public void toggleShift() { - if (mCurrentId.equals(mSymbolsId)) { + if (isAlphabetMode()) + return; + if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) { LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId); mCurrentId = mSymbolsShiftedId; mInputView.setKeyboard(symbolsShiftedKeyboard); @@ -390,7 +397,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha symbolsShiftedKeyboard.setShiftLocked(true); symbolsShiftedKeyboard.setImeOptions(mInputMethodService.getResources(), mMode, mImeOptions); - } else if (mCurrentId.equals(mSymbolsShiftedId)) { + } else { LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId); mCurrentId = mSymbolsId; mInputView.setKeyboard(symbolsKeyboard); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 8eeae8600..7f84ed775 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -159,7 +159,7 @@ public class LatinIME extends InputMethodService private AlertDialog mOptionsDialog; private AlertDialog mVoiceWarningDialog; - KeyboardSwitcher mKeyboardSwitcher; + /* package */ KeyboardSwitcher mKeyboardSwitcher; private UserDictionary mUserDictionary; private UserBigramDictionary mUserBigramDictionary; @@ -168,7 +168,7 @@ public class LatinIME extends InputMethodService private Hints mHints; - Resources mResources; + private Resources mResources; private String mInputLocale; private String mSystemLocale; @@ -307,7 +307,7 @@ public class LatinIME extends InputMethodService } } - Handler mHandler = new Handler() { + /* package */ Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { @@ -339,7 +339,8 @@ public class LatinIME extends InputMethodService } }; - @Override public void onCreate() { + @Override + public void onCreate() { LatinImeLogger.init(this); super.onCreate(); //setStatusIcon(R.drawable.ime_qwerty); @@ -396,7 +397,7 @@ public class LatinIME extends InputMethodService * Loads a dictionary or multiple separated dictionary * @return returns array of dictionary resource ids */ - static int[] getDictionary(Resources res) { + /* package */ static int[] getDictionary(Resources res) { String packageName = LatinIME.class.getPackage().getName(); XmlResourceParser xrp = res.getXml(R.xml.dictionary); ArrayList dictionaries = new ArrayList(); @@ -1013,9 +1014,6 @@ public class LatinIME extends InputMethodService } private void reloadKeyboards() { - if (mKeyboardSwitcher == null) { - mKeyboardSwitcher = new KeyboardSwitcher(this); - } mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher); if (mKeyboardSwitcher.getInputView() != null && mKeyboardSwitcher.getKeyboardMode() != KeyboardSwitcher.MODE_NONE) { @@ -2406,20 +2404,20 @@ public class LatinIME extends InputMethodService mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_TUTORIAL), 500); } - void tutorialDone() { + /* package */ void tutorialDone() { mTutorial = null; } - void promoteToUserDictionary(String word, int frequency) { + /* package */ void promoteToUserDictionary(String word, int frequency) { if (mUserDictionary.isValidWord(word)) return; mUserDictionary.addWord(word, frequency); } - WordComposer getCurrentWord() { + /* package */ WordComposer getCurrentWord() { return mWord; } - boolean getPopupOn() { + /* package */ boolean getPopupOn() { return mPopupOn; } @@ -2576,7 +2574,8 @@ public class LatinIME extends InputMethodService return list; } - @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { + @Override + protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { super.dump(fd, fout, args); final Printer p = new PrintWriterPrinter(fout); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index bcd1bb056..f96a3599d 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -47,10 +47,9 @@ 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.Map; +import java.util.WeakHashMap; /** * A view that renders a virtual {@link LatinKeyboard}. It handles rendering of keys and @@ -199,7 +198,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private PopupWindow mMiniKeyboardPopup; private LatinKeyboardBaseView mMiniKeyboard; private View mMiniKeyboardParent; - private Map mMiniKeyboardCache; + private final WeakHashMap mMiniKeyboardCache = new WeakHashMap(); private int mMiniKeyboardOriginX; private int mMiniKeyboardOriginY; private long mMiniKeyboardPopupTime; @@ -489,7 +488,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mPaint.setAlpha(255); mPadding = new Rect(0, 0, 0, 0); - mMiniKeyboardCache = new HashMap(); mKeyBackground.getPadding(mPadding); mSwipeThreshold = (int) (500 * res.getDisplayMetrics().density); From 4d3a4dc211cf9f7747a6f44e41965f06714b47d2 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Sat, 9 Oct 2010 01:06:26 +0900 Subject: [PATCH 053/287] Add phone keyboard layout Change-Id: I97d146ef2756ffe5adb17fcbf04f5e91a0587aa5 --- java/res/values/strings.xml | 6 + java/res/xml-xlarge/kbd_phone.xml | 149 ++++++++++++++++++++ java/res/xml-xlarge/kbd_phone_symbols.xml | 158 ++++++++++++++++++++++ java/res/xml-xlarge/kbd_qwerty.xml | 4 +- java/res/xml-xlarge/kbd_symbols.xml | 4 +- java/res/xml-xlarge/kbd_symbols_shift.xml | 4 +- 6 files changed, 319 insertions(+), 6 deletions(-) create mode 100644 java/res/xml-xlarge/kbd_phone.xml create mode 100644 java/res/xml-xlarge/kbd_phone_symbols.xml diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index f4b9b9de0..1f73b159f 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -214,6 +214,12 @@ ALT More + + Tab + + Pause + + Wait diff --git a/java/res/xml-xlarge/kbd_phone.xml b/java/res/xml-xlarge/kbd_phone.xml new file mode 100644 index 000000000..977bbf2df --- /dev/null +++ b/java/res/xml-xlarge/kbd_phone.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-xlarge/kbd_phone_symbols.xml new file mode 100644 index 000000000..6fbf3a902 --- /dev/null +++ b/java/res/xml-xlarge/kbd_phone_symbols.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml index f372eda62..984d61f10 100644 --- a/java/res/xml-xlarge/kbd_qwerty.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -25,8 +25,8 @@ latin:verticalGap="0px" latin:keyHeight="@dimen/key_height" > - + - + - + - + diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml index ee6800e26..5ca2cc1e6 100644 --- a/java/res/xml-xlarge/kbd_symbols_shift.xml +++ b/java/res/xml-xlarge/kbd_symbols_shift.xml @@ -25,8 +25,8 @@ latin:verticalGap="0px" latin:keyHeight="@dimen/key_height" > - + - + From 4ee2a56f079712819b193e13c35fa50c58c50452 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 8 Oct 2010 14:21:12 +0900 Subject: [PATCH 054/287] Make keyboard vertical correction configurable cherry-pick: I72c2448894a1084c582c2f1fb942b5fa8353f028 Before this change, the verticalCorrection value was defined by "dpi" that is relative to device screen. This change defines the verticalCorrection by absolute unit "in". Bug: 3066107 Change-Id: If71419dcfc18be3e5e87afea078fa15d3c31d908 --- java/res/values-xlarge/dimens.xml | 4 +++- java/res/values/dimens.xml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index 9e4736f78..5674ef628 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -30,5 +30,7 @@ 122.4dip -72dip - 0dip + + 0.0in diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index de2e69973..1378be72c 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -37,6 +37,8 @@ -54dip 0.05in - -10dip + + -0.06in 0.3in From 364da8c618303a7764595d2c15ee034a7671365d Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 11 Oct 2010 02:52:08 +0900 Subject: [PATCH 055/287] Fix - "Touch again to save" not working for manually picked suggestion when re-correction is enabled. bug: 3082806 Change-Id: I64e652b0ad1d496e102a7cc2cf9a5615df423192 --- java/src/com/android/inputmethod/latin/LatinIME.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 7f84ed775..4e0f7c56b 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -817,7 +817,10 @@ public class LatinIME extends InputMethodService } else { abortCorrection(false); // Show the punctuation suggestions list if the current one is not - if (!mSuggestPuncList.equals(mCandidateView.getSuggestions())) { + // and if not showing "Touch again to save". + if (mCandidateView != null + && !mSuggestPuncList.equals(mCandidateView.getSuggestions()) + && !mCandidateView.isShowingAddToDictionaryHint()) { setNextSuggestions(); } } @@ -1935,7 +1938,7 @@ public class LatinIME extends InputMethodService TextEntryState.typedCharacter((char) KEYCODE_SPACE, true); setNextSuggestions(); } else if (!showingAddToDictionaryHint) { - // If we're not showing the "Touch again to save hint", then show corrections again. + // If we're not showing the "Touch again to save", then show corrections again. // In case the cursor position doesn't change, make sure we show the suggestions again. clearSuggestions(); postUpdateOldSuggestions(); From c2d7ac79bdadb4335ed69a4e9631e0ec2e3058f6 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Sun, 10 Oct 2010 15:40:54 +0900 Subject: [PATCH 056/287] Tweak key width for 'o'-popup chars. We'll merge this to master for now, but we should have new attr (such as popupCharWidth) to handle this reasonably in the newly created BaseKeyboard class. bug: 3082178 Change-Id: I024b946aafbbeb07b865a09f489dacb56f0478d0 --- java/res/xml/kbd_popup_narrow_template.xml | 27 +++++++++++++++++++ java/res/xml/kbd_qwerty.xml | 2 +- java/res/xml/kbd_qwerty_black.xml | 2 +- .../latin/LatinKeyboardBaseView.java | 22 ++++++++++----- 4 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 java/res/xml/kbd_popup_narrow_template.xml diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml/kbd_popup_narrow_template.xml new file mode 100644 index 000000000..ed3b13003 --- /dev/null +++ b/java/res/xml/kbd_popup_narrow_template.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index 446467fa4..c6113abf7 100644 --- a/java/res/xml/kbd_qwerty.xml +++ b/java/res/xml/kbd_qwerty.xml @@ -61,7 +61,7 @@ android:popupCharacters="@string/alternates_for_i" /> keys = keyboard.getKeys(); + private static boolean isOneRowKeys(List keys) { if (keys.size() == 0) return false; final int edgeFlags = keys.get(0).edgeFlags; // HACK: The first key of mini keyboard which was inflated from xml and has multiple rows, @@ -1125,24 +1124,35 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx getLocationInWindow(mWindowOffset); } + // Get width of a key in the mini popup keyboard = "miniKeyWidth". + // On the other hand, "popupKey.width" is width of the pressed key on the main keyboard. + // We adjust the position of mini popup keyboard with the edge key in it: + // a) When we have the leftmost key in popup keyboard directly above the pressed key + // Right edges of both keys should be aligned for consistent default selection + // b) When we have the rightmost key in popup keyboard directly above the pressed key + // Left edges of both keys should be aligned for consistent default selection + final List miniKeys = mMiniKeyboard.getKeyboard().getKeys(); + final int miniKeyWidth = miniKeys.size() > 0 ? miniKeys.get(0).width : 0; + // HACK: Have the leftmost number in the popup characters right above the key boolean isNumberAtLeftmost = hasMultiplePopupChars(popupKey) && isNumberAtLeftmostPopupChar(popupKey); int popupX = popupKey.x + mWindowOffset[0]; - int popupY = popupKey.y + mWindowOffset[1]; + popupX += getPaddingLeft(); if (isNumberAtLeftmost) { + popupX += popupKey.width - miniKeyWidth; // adjustment for a) described above popupX -= container.getPaddingLeft(); } else { - popupX += popupKey.width + getPaddingLeft(); + popupX += miniKeyWidth; // adjustment for b) described above popupX -= container.getMeasuredWidth(); popupX += container.getPaddingRight(); } + int popupY = popupKey.y + mWindowOffset[1]; popupY += getPaddingTop(); popupY -= container.getMeasuredHeight(); popupY += container.getPaddingBottom(); final int x = popupX; - final int y = mShowPreview && isOneRowKeyboard(mMiniKeyboard.getKeyboard()) - ? mPopupPreviewDisplayedY : popupY; + final int y = mShowPreview && isOneRowKeys(miniKeys) ? mPopupPreviewDisplayedY : popupY; int adjustedX = x; if (x < 0) { From c4b93e8d90c566cf8604c59b0c07aa5eba544c2c Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Sun, 10 Oct 2010 17:15:21 -0700 Subject: [PATCH 057/287] Fix merge that should have been manually merged master was still using the deleted constants in different places and Java 6 didn't like the imports. Change-Id: If9472a2acb029e56790dc4d19ab62e608c970175 --- java/src/com/android/inputmethod/latin/PointerTracker.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index a1cc8090e..3b886200e 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -22,7 +22,6 @@ import com.android.inputmethod.latin.LatinKeyboardBaseView.UIHandler; import android.content.res.Resources; import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; import android.util.Log; import android.view.MotionEvent; @@ -429,7 +428,7 @@ public class PointerTracker { // long press should not be started. if (isTemporaryUpperCase() && key.temporaryShiftLabel != null) return; - mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); + mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); } private boolean isTemporaryUpperCase() { From a5a5ffc0dca3f3342a00d6b377c55e044f7c7ccf Mon Sep 17 00:00:00 2001 From: Maryam Garrett Date: Thu, 30 Sep 2010 22:37:22 -0400 Subject: [PATCH 058/287] Fix the over-calling of VoiceSearch Logging bug: 3035228 This change will reduce the number of times VoiceSearch app is called to log IME events. This is because it 1) only flushes the logs when there is relevant logging information available and 2) sets a flag in UserHappinessSignals so that other apps (eg: gmail/sms) can know if there is relevant logging information before sending the logging intent to voice search. Change-Id: I708fea5a38f854091f1101e4f6a3db46296f3e92 --- .../inputmethod/voice/VoiceInputLogger.java | 70 +++++++++++++++++-- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java index 9d3a92037..188d1376e 100644 --- a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java +++ b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java @@ -17,6 +17,7 @@ package com.android.inputmethod.voice; import com.android.common.speech.LoggingEvents; +import com.android.common.userhappiness.UserHappinessSignals; import android.content.Context; import android.content.Intent; @@ -33,13 +34,17 @@ public class VoiceInputLogger { private static final String TAG = VoiceInputLogger.class.getSimpleName(); private static VoiceInputLogger sVoiceInputLogger; - + private final Context mContext; - + // The base intent used to form all broadcast intents to the logger // in VoiceSearch. private final Intent mBaseIntent; - + + // This flag is used to indicate when there are voice events that + // need to be flushed. + private boolean mHasLoggingInfo = false; + /** * Returns the singleton of the logger. * @@ -67,79 +72,97 @@ public class VoiceInputLogger { } public void flush() { - Intent i = new Intent(mBaseIntent); - i.putExtra(LoggingEvents.EXTRA_FLUSH, true); - mContext.sendBroadcast(i); + if (hasLoggingInfo()) { + Intent i = new Intent(mBaseIntent); + i.putExtra(LoggingEvents.EXTRA_FLUSH, true); + mContext.sendBroadcast(i); + setHasLoggingInfo(false); + } } public void keyboardWarningDialogShown() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_SHOWN)); } public void keyboardWarningDialogDismissed() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_DISMISSED)); } public void keyboardWarningDialogOk() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_OK)); } public void keyboardWarningDialogCancel() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_CANCEL)); } public void settingsWarningDialogShown() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_SHOWN)); } public void settingsWarningDialogDismissed() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_DISMISSED)); } public void settingsWarningDialogOk() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_OK)); } public void settingsWarningDialogCancel() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_CANCEL)); } public void swipeHintDisplayed() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.SWIPE_HINT_DISPLAYED)); } public void cancelDuringListening() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_LISTENING)); } public void cancelDuringWorking() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_WORKING)); } public void cancelDuringError() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_ERROR)); } public void punctuationHintDisplayed() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.PUNCTUATION_HINT_DISPLAYED)); } public void error(int code) { + setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.ERROR); i.putExtra(LoggingEvents.VoiceIme.EXTRA_ERROR_CODE, code); mContext.sendBroadcast(i); } public void start(String locale, boolean swipe) { + setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.START); i.putExtra(LoggingEvents.VoiceIme.EXTRA_START_LOCALE, locale); i.putExtra(LoggingEvents.VoiceIme.EXTRA_START_SWIPE, swipe); @@ -148,12 +171,14 @@ public class VoiceInputLogger { } public void voiceInputDelivered(int length) { + setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.VOICE_INPUT_DELIVERED); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length); mContext.sendBroadcast(i); } public void textModifiedByTypingInsertion(int length) { + setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE, @@ -162,6 +187,7 @@ public class VoiceInputLogger { } public void textModifiedByTypingInsertionPunctuation(int length) { + setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE, @@ -170,6 +196,7 @@ public class VoiceInputLogger { } public void textModifiedByTypingDeletion(int length) { + setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE, @@ -179,6 +206,7 @@ public class VoiceInputLogger { } public void textModifiedByChooseSuggestion(int length) { + setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length); i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE, @@ -187,22 +215,52 @@ public class VoiceInputLogger { } public void nBestChoose(int index) { + setHasLoggingInfo(true); Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.N_BEST_CHOOSE); i.putExtra(LoggingEvents.VoiceIme.EXTRA_N_BEST_CHOOSE_INDEX, index); mContext.sendBroadcast(i); } public void inputEnded() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.INPUT_ENDED)); } public void voiceInputSettingEnabled() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.VOICE_INPUT_SETTING_ENABLED)); } public void voiceInputSettingDisabled() { + setHasLoggingInfo(true); mContext.sendBroadcast(newLoggingBroadcast( LoggingEvents.VoiceIme.VOICE_INPUT_SETTING_DISABLED)); } + + private void setHasLoggingInfo(boolean hasLoggingInfo) { + mHasLoggingInfo = hasLoggingInfo; + // If applications that call UserHappinessSignals.userAcceptedImeText + // make that call after VoiceInputLogger.flush() calls this method with false, we + // will lose those happiness signals. For example, consider the gmail sequence: + // 1. compose message + // 2. speak message into message field + // 3. type subject into subject field + // 4. press send + // We will NOT get the signal that the user accepted the voice inputted message text + // because when the user tapped on the subject field, the ime's flush will be triggered + // and the hasLoggingInfo will be then set to false. So by the time the user hits send + // we have essentially forgotten about any voice input. + // However the following (more common) use case is properly logged + // 1. compose message + // 2. type subject in subject field + // 3. speak message in message field + // 4. press send + UserHappinessSignals.setHasVoiceLoggingInfo(hasLoggingInfo); + } + + private boolean hasLoggingInfo(){ + return mHasLoggingInfo; + } + } From 50a61083d3231e2f56b640c06686381de73aedc6 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Mon, 11 Oct 2010 22:39:04 +0900 Subject: [PATCH 059/287] Add text variation keyboard layout Change-Id: I4c6df8197b734feb998da78478a4d9a41f6d92b2 --- java/res/xml-xlarge/kbd_qwerty.xml | 574 +++++++++++++++++- java/res/xml-xlarge/popup_smileys.xml | 89 +++ .../inputmethod/latin/LatinKeyboard.java | 20 +- 3 files changed, 666 insertions(+), 17 deletions(-) create mode 100644 java/res/xml-xlarge/popup_smileys.xml diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml index 984d61f10..740e7f5f2 100644 --- a/java/res/xml-xlarge/kbd_qwerty.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -97,7 +97,10 @@ latin:isRepeatable="true" latin:keyEdgeFlags="right" /> - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 3fc484d09..11e7ef936 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -164,7 +164,7 @@ public class LatinKeyboard extends BaseKeyboard { mEnterKey.popupCharacters = null; mEnterKey.popupResId = 0; mEnterKey.text = null; - switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { + switch (options & (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { case EditorInfo.IME_ACTION_GO: mEnterKey.iconPreview = null; mEnterKey.icon = null; @@ -193,19 +193,11 @@ public class LatinKeyboard extends BaseKeyboard { mEnterKey.label = res.getText(R.string.label_send_key); break; default: - if (mode == KeyboardSwitcher.MODE_IM) { - mEnterKey.icon = null; - mEnterKey.iconPreview = null; - mEnterKey.label = ":-)"; - mEnterKey.text = ":-) "; - mEnterKey.popupResId = R.xml.popup_smileys; - } else { - mEnterKey.iconPreview = res.getDrawable( - R.drawable.sym_keyboard_feedback_return); - mEnterKey.icon = res.getDrawable(mIsBlackSym ? - R.drawable.sym_bkeyboard_return : R.drawable.sym_keyboard_return); - mEnterKey.label = null; - } + mEnterKey.iconPreview = res.getDrawable( + R.drawable.sym_keyboard_feedback_return); + mEnterKey.icon = res.getDrawable(mIsBlackSym ? + R.drawable.sym_bkeyboard_return : R.drawable.sym_keyboard_return); + mEnterKey.label = null; break; } // Set the initial size of the preview icon From adf24e2eb49acd32d2655a3964f68da1e54c05ec Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 12 Oct 2010 20:24:53 +0900 Subject: [PATCH 060/287] Follow up change of If9472a2a This change is follow up of If9472a2acb029e56790dc4d19ab62e608c970175 Change-Id: I0a474a130f49e2acccbb5a164bdf2984a5bd9042 --- java/src/com/android/inputmethod/latin/PointerTracker.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index 3b886200e..d1cdbfe26 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -21,7 +21,6 @@ import com.android.inputmethod.latin.LatinKeyboardBaseView.OnKeyboardActionListe import com.android.inputmethod.latin.LatinKeyboardBaseView.UIHandler; import android.content.res.Resources; -import android.inputmethodservice.Keyboard; import android.util.Log; import android.view.MotionEvent; @@ -286,7 +285,7 @@ public class PointerTracker { mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this); mIsRepeatableKey = true; } - mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); + startLongPressTimer(keyIndex); } showKeyPreviewAndUpdateKey(keyIndex); } @@ -302,11 +301,11 @@ public class PointerTracker { if (key != null) { if (keyState.getKeyIndex() == NOT_A_KEY) { keyState.onMoveToNewKey(keyIndex, x, y); - mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); + startLongPressTimer(keyIndex); } else if (!isMinorMoveBounce(x, y, keyIndex)) { resetMultiTap(); keyState.onMoveToNewKey(keyIndex, x, y); - mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); + startLongPressTimer(keyIndex); } } else { if (keyState.getKeyIndex() != NOT_A_KEY) { From ed3443ebd7af6ecd803c53201687d8c0e5e57d29 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 12 Oct 2010 20:23:08 +0900 Subject: [PATCH 061/287] Follow up change of I4c6df819 This change is follow up of I4c6df8197b734feb998da78478a4d9a41f6d92b2 Change-Id: I3b8a82dd71305f34afb2e8b6a705efabdc2bc0cf --- .../inputmethod/latin/LatinKeyboard.java | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 11e7ef936..e10346570 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -158,46 +158,36 @@ public class LatinKeyboard extends BaseKeyboard { return key; } + private static void resetKeyAttributes(Key key, CharSequence label) { + key.popupCharacters = null; + key.popupResId = 0; + key.text = null; + key.iconPreview = null; + key.icon = null; + key.label = label; + } + public void setImeOptions(Resources res, int mode, int options) { if (mEnterKey != null) { - // Reset some of the rarely used attributes. - mEnterKey.popupCharacters = null; - mEnterKey.popupResId = 0; - mEnterKey.text = null; switch (options & (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { case EditorInfo.IME_ACTION_GO: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_go_key); + resetKeyAttributes(mEnterKey, res.getText(R.string.label_go_key)); break; case EditorInfo.IME_ACTION_NEXT: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_next_key); + resetKeyAttributes(mEnterKey, res.getText(R.string.label_next_key)); break; case EditorInfo.IME_ACTION_DONE: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_done_key); + 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); - mEnterKey.label = null; break; case EditorInfo.IME_ACTION_SEND: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_send_key); - break; - default: - mEnterKey.iconPreview = res.getDrawable( - R.drawable.sym_keyboard_feedback_return); - mEnterKey.icon = res.getDrawable(mIsBlackSym ? - R.drawable.sym_bkeyboard_return : R.drawable.sym_keyboard_return); - mEnterKey.label = null; + resetKeyAttributes(mEnterKey, res.getText(R.string.label_send_key)); break; } // Set the initial size of the preview icon From 0963c781f2278a73363f2db57b0d0ec30c37b371 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Wed, 13 Oct 2010 13:53:34 +0900 Subject: [PATCH 062/287] Make some keys in phone keyboard to darker color Bug: 3088257 Change-Id: I36b1a0f147c1087a98b91f00d60bf15922861f9c --- java/res/xml/kbd_phone.xml | 7 ++++++- java/res/xml/kbd_phone_symbols.xml | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml index 9f381b905..0a01fa00e 100644 --- a/java/res/xml/kbd_phone.xml +++ b/java/res/xml/kbd_phone.xml @@ -41,6 +41,7 @@ @@ -57,6 +58,7 @@ @@ -75,6 +77,7 @@ android:keyIcon="@drawable/sym_keyboard_delete" android:iconPreview="@drawable/sym_keyboard_feedback_delete" android:keyWidth="20%p" + android:isModifier="true" android:isRepeatable="true" android:keyEdgeFlags="right" /> @@ -84,7 +87,8 @@ + android:iconPreview="@drawable/sym_keyboard_feedback_numalt" + android:keyEdgeFlags="left" /> @@ -96,6 +100,7 @@ android:codes="@integer/key_return" android:keyIcon="@drawable/sym_keyboard_return" android:keyWidth="20%p" + android:isModifier="true" android:keyEdgeFlags="right" /> diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml index 598e211f5..2dc93c15f 100644 --- a/java/res/xml/kbd_phone_symbols.xml +++ b/java/res/xml/kbd_phone_symbols.xml @@ -38,6 +38,7 @@ @@ -54,6 +55,7 @@ @@ -73,6 +75,7 @@ android:keyIcon="@drawable/sym_keyboard_delete" android:iconPreview="@drawable/sym_keyboard_feedback_delete" android:keyWidth="20%p" + android:isModifier="true" android:isRepeatable="true" android:keyEdgeFlags="right" /> @@ -93,6 +96,7 @@ android:codes="@integer/key_return" android:keyIcon="@drawable/sym_keyboard_return" android:keyWidth="20%p" + android:isModifier="true" android:keyEdgeFlags="right" /> From 3d20d999025bbaab96b41d172225a39f7a1017b7 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 12 Oct 2010 15:02:44 +0900 Subject: [PATCH 063/287] Specify keyboard metrics with physical unit "inch" (DO NOT MERGE) This change also introduces the key background drawables which has no fixed bottom padding. Instead of relying on bottom padding in drawable, this change also specifies Keyboard.verticalGap with physical unit. Other keyboard related length, distance and size are also specified by physical unit. Bug: 3066107 Change-Id: I44f3b2eef8086d6e0b0db53d38f08487549060c6 --- .../btn_keyboard_key_dark_normal.9.png | Bin 521 -> 511 bytes .../btn_keyboard_key_dark_normal_off.9.png | Bin 783 -> 760 bytes .../btn_keyboard_key_dark_normal_on.9.png | Bin 1112 -> 1088 bytes .../btn_keyboard_key_dark_pressed.9.png | Bin 747 -> 730 bytes .../btn_keyboard_key_dark_pressed_off.9.png | Bin 962 -> 940 bytes .../btn_keyboard_key_dark_pressed_on.9.png | Bin 1282 -> 1260 bytes .../btn_keyboard_key_light_normal.9.png | Bin 481 -> 461 bytes .../btn_keyboard_key_light_pressed.9.png | Bin 1643 -> 811 bytes .../btn_keyboard_key_dark_normal.9.png | Bin 385 -> 377 bytes .../btn_keyboard_key_dark_normal_off.9.png | Bin 550 -> 545 bytes .../btn_keyboard_key_dark_normal_on.9.png | Bin 813 -> 806 bytes .../btn_keyboard_key_dark_pressed.9.png | Bin 518 -> 514 bytes .../btn_keyboard_key_dark_pressed_off.9.png | Bin 700 -> 687 bytes .../btn_keyboard_key_dark_pressed_on.9.png | Bin 950 -> 940 bytes .../btn_keyboard_key_light_normal.9.png | Bin 358 -> 355 bytes .../btn_keyboard_key_light_pressed.9.png | Bin 530 -> 526 bytes java/res/layout/input_gingerbread.xml | 1 + java/res/values-land/dimens.xml | 14 ++- java/res/values/dimens.xml | 26 +++-- java/res/xml-da/kbd_qwerty.xml | 6 +- java/res/xml-da/kbd_qwerty_black.xml | 6 +- java/res/xml-de/kbd_qwerty.xml | 6 +- java/res/xml-de/kbd_qwerty_black.xml | 6 +- java/res/xml-fr/kbd_qwerty.xml | 6 +- java/res/xml-fr/kbd_qwerty_black.xml | 6 +- java/res/xml-iw/kbd_qwerty.xml | 6 +- java/res/xml-iw/kbd_qwerty_black.xml | 6 +- java/res/xml-nb/kbd_qwerty.xml | 6 +- java/res/xml-nb/kbd_qwerty_black.xml | 6 +- java/res/xml-ru/kbd_qwerty.xml | 6 +- java/res/xml-ru/kbd_qwerty_black.xml | 6 +- java/res/xml-sr/kbd_qwerty.xml | 6 +- java/res/xml-sr/kbd_qwerty_black.xml | 6 +- java/res/xml-sv/kbd_qwerty.xml | 6 +- java/res/xml-sv/kbd_qwerty_black.xml | 6 +- java/res/xml/kbd_phone.xml | 2 +- java/res/xml/kbd_phone_black.xml | 2 +- java/res/xml/kbd_phone_symbols.xml | 2 +- java/res/xml/kbd_phone_symbols_black.xml | 2 +- java/res/xml/kbd_popup_narrow_template.xml | 2 +- java/res/xml/kbd_popup_template.xml | 2 +- java/res/xml/kbd_qwerty.xml | 6 +- java/res/xml/kbd_qwerty_black.xml | 6 +- java/res/xml/kbd_symbols.xml | 2 +- java/res/xml/kbd_symbols_black.xml | 2 +- java/res/xml/kbd_symbols_shift.xml | 2 +- java/res/xml/kbd_symbols_shift_black.xml | 2 +- java/res/xml/popup_comma.xml | 2 +- java/res/xml/popup_domains.xml | 2 +- java/res/xml/popup_mic.xml | 2 +- java/res/xml/popup_punctuation.xml | 2 +- java/res/xml/popup_smileys.xml | 2 +- .../inputmethod/latin/LatinKeyboard.java | 32 +++++-- .../latin/LatinKeyboardBaseView.java | 89 ++++++++++++------ 54 files changed, 196 insertions(+), 104 deletions(-) diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png index 0c4820b34c55f88b8030693a2431cd553f7b9061..01fc8ca780342b16e22a395f702af499a2eb21b3 100644 GIT binary patch delta 462 zcmV;<0WtoG1pfn&7YaED1^@s6boh93ks&C5p-DtRRCwC#noDkjFc5~vV6j82NO#<% zIZSh|^f1Xy*fp#W5<aoR%S&Ve9#1`xWns!xI5L<|kIjdGLTi+tczAIMb5o{hoxvNj;qVhC> z5XftQu)%#qmV#vk6;qwvvMjTMRhp(y6a|!JIaCf_f9f<4oO7j33#v==J>5@G2_c@rE+|zo2B!)g%uHl?F>&}m#)HQ=0I#>UZ?C&R+k*AuVw<%N z#3B#^ArPez2!RmDGaz9Y!u#)}?TBB-xiy%f#EihqfnH>?7tNM&CV9KorN%LINltGZn1j z$R}Q-K1_Ws`!M!NWTZ2d`T-DzTaxa7ORQa%%Tg0haF@ws*qyNFmvbd2B8nnPatI;R z267*v&A-_mVDMgVmIhE#KcAxm84kpOB;$WhBM!uYY#E+uvejzQm+Nc#e0D|=7l)RA z$Ir({`hIsuola+U9qC=qx?gW@RN9}-W|VXZV-uMQg@QVNyS-gmHfkgY0vZm7>dXlw zpU+dZTHW2WCXGU)kAUzpU zt0yN^E|*{CD!xy?j8KEYfXY%Uh*qpYaOZ{80JNd+2jK&0Vx!TBd2%85 zM<8JH@>11KFryd-dm|(xY9So|qYGa=a@BtrGeNHhC`Fg34_ z2SRa8!wiJ%YpuT@Rva5-GJ}MF(Vv4G$Wku5>X%dK)#P%{o>^z-T&9qfX=!I}eq!e% zu`0Pa`x==Jr>$V>e{=MYtx*eaBTjX->X$Rs!J_d+bn@8|G z79CVheRez-w)$g*?kb+g;*tKEc5wQpBO%awfNVxk(<>acT8$cw#@0VHGihrCqu1+E vzu#Y7Hi2Z(N5n37{JlZ-cZN;lw*UhGH1u&6D+t5n00000NkvXXu0mjfX+TN^ delta 736 zcmV<60w4YO1&;=h7YalO1^@s6!$f9nks&C5u}MThRCwC#n(a>FKoo}0Kno}!$qIg8 zpAQez>2%iTQQm`9_xs(QD*Ln9jFN6);$)^mp`gw`?(f&8wTd{7L&M=vojHNz z^LeUPtJ}NQWHM1|e0Fp9Kf`rh^~1uptwHc199$s$4i^XP(oI{NK9ts&&*#+bc4<5w z(_*op2%6F zMqps`>Pq!aa3dcEYa=BiYat!~qX^fmg$|Ca*7dcDkKx-}HqtLt zLF>_MHdV@nDo_Kd7ju~@h<;^%d41igMPUsRr`OsEL@ZM=6O!FQJaoT|l-V7Gse2tB z2>Cq?GZ2d3YyEw(;@Du59>n#3{v6yumUhMKemSMyfL$ioGaKxj+Z2lBT7fgSIEfb{ zzLea8J;bK{*;df)e{+nF$gG7Y5`r*U1ljK$E29WEMOaq#2)oSov;i?7hXEo&>j>`0 zVh5GeK0EFU$NFQ1-BsL=#V!4i?cnrXM?zrh0k&yDb&qh=YBg#!8j*iXX3|y!qu1+E zzu#Y<)`4U(MoiW+AO^&MWM?4r8bu6<0XYy5YZ>(-qG9{eUM$SM)rUvl1sDKD(R460 Scd&>60000k7RCwC#nOkoYITXkL_Dm)TQOP2j zwg{;b;-cM!2OfFZewgKR!H0n-;0-~=1E{E6OVuW6+U#^@Z0|XCCM{|bIu#S#GHzWf zGj4o-KG*R8~dCtX}!UBy3t zYin3uTJk0ea8%m*_6<*;Ji+GX=INr=zYibUw4Wr29ZMBZjKmNVgfaYU|Ij>vD2nX( z_|c;iUo%l7N+}Em13Q)l!T>CkkgiMqEXAmHa`lr|grN;`5rQDV!otGoO)HLLs|~lH zC;?)m0rJow6x5~dQo8FbydnsdY8o|vbY|?x8_Tkt8boVtdl?Y92?t z3M>pS$(l$Lh4hd+kQzl7opxBRNd;**tt>9hq!=S$GZCmo5{*kCb%le$I+D0c>m~%# zM(gq&gkgKMv214A_Gxm>AA~sAgn}A5Z!IL@p z{vt(OvnG|LPMZdvfG`Q0Ec-^SF40+hjl1_Ef~b?0+?1<}Av#MTUcY>ccNVImsw-VC2C~6Ny4Dj z%Ixkp8e*ae^1aJ#g-;*M_adLTuIPqeqZ)wlso!;O>>sX(GO|9XHkoHR%HUoVTM8fKWx0aPbT&pE7vr^ z2&sai6bSeC1*xhLp zz-@f|P$$?PMXijqqMSywCmL~r@U}Z!>+5~m@f5wCzfo`2DaT0qoS@t7VSjJeY9pg8 zZ%Y+z{4p)-CpP$~vD2rt+Xwrx%@tyl$=Q^+XQ{Sx9Ee9gl7GK2d2y&AQ{f=QIQqNY zx6z7697V0OfQS;0SDZY5vf#@mlNX$19E*GKJHUmhHZQjN~d-{ldSK?O8Ha&VDYOeI8}XSv6AV?AJ^> zNA<{0iuuS<{ot3gPm$?Dy;d;i!9PwDwN6y)=Mm&$zp<(`;+sZ(yv*u9kgIwbnC5MdZv*(QQcD)ZazHaeZo z4V4;NcUGirsX0?;ApNu99V^N3@MG;n3R<3SZNs>5i z_yt7`5Hk&shek?Jm#$0cue0!)AarJbXf!anbt7*q%XVcDV~p!{Kolk7$a%XFy1fLk`T^CjStmz7rTKwHE#6t33#6wxCgXpw^ZFT?*pJwF zXb46)&7`Lm!$XZ$vOgf}p5r0s}$yTI=j5D2_{HQe{cY_0T|Oa#gE-5#Gu6WimC+ej}WH8D+|KHB#y9 z*Dg9o4aiTb`N&!Q5SFu-$aJe-E7+UhA6JQ57pnD}2y(mMST!1d2~8tGX7%^T)x4f= zKpK#{0U}EC2*0}*TydCf}R3*+PYBeAYNCR?n8mEXxBMnFcaz{Ya`QovxK%|20 mgVtgsm$RCwC#noX{PFc8NF#IJY@7cRYm z7jfyaTzV0&;L?Rl4`5>AN0jG~_kWpJ3Z;aW4{6dAFlFY)%(O5gk^2_^c6S2em?9y} z2au~4gw&DNgEXxL9%F?180llA2dS?`x{J%@k~W(SEf$N^4$2+JPNFsl{ze?59gjzU z+HSXWI2?+tTD#qjX0sW+Ua#c*{eCAMAg&-J40;%bN#`~g4Cs2j(t5p4P0?CpI-Sz( zc1u72p~Cn80R%dOux^E2iyo&S#q@?(v5Uh@!?uhhFr<4TuXxJEaC$ME0y}2 z6^M)lbl)KI9P)8&9qcNA1abMfkZxyDde>?ih+O7>ngU|l zggdj3bU)aex*?Vh_B6D(P18HFkf+A1$^K@zj{pe_Xjrb83U;ujTTC3^L RyR-lR002ovPDHLkV1hSvL<;}_ delta 700 zcmV;t0z>`U1?vTn7YalO1^@s6!$f9nks&C5jY&j7RCwC#noEwtFbqK55`N+qELd^{ zF2a&yvE(9Lfh7x;8~_Q4kD!dJ@yL_9O;a`LheV3f7Pa=nc9Pl!aNm;O?oL3GfMUXY z0J&;W3_WQ9q-`zo7$Xp3B*aJnX|5^h;&Qo!&1M6O#UitUVy9y#Q5!{nBOOya9*?kp z-EQGGnM|E z6$p<7>b^nvImxGE>tNRbIEc&FRvkoI97|io)SbT<=g73ONN+&O05t(pS*r;UC$m=DK>D3U39i*P5I)U+wFShq z2=`_k>3^`dbwR8g>_tGnK&11qAa)@}lCEsyP1A3r!vxoA`(CTc8(Uo#$|CG}GEl&$R~*IZur5#e!qv)>6E=q0_k82U(f}R01`j~NB{{S0i=~DdlYFyC~V{! i-HZL`Wz2MZ1Q-CRep7YaED1^@s6boh93ks&C5PDw;TRCwC#n#+pnKoEvYjgA*^1Yy*r zE)*9d_yqGJvz*6r>5I5=A-EA&vv4JX3pa{*8}*#O4<$|8xoHwJo)k3EKvMOks=7MW ziJi}9@>625m{9OnPfR)QnGP@*va%q6{JMRdon_;e>$DSV2}Wo zHJ1^O$Hjmo5(!$b*Yx@Md3A}_BbiKww%e@$VF(o_2oQ$g0T9^cIJ5w<-|xlEV6+V6 zw^wxD0049!4hL~`48l3U#xn??3&JCR0DvwWp$|uk74z9JgW&wYQ4KM#lYO(<&~P}U z#bO~Mp-?DLyWOTrrE;amOs^J14kMjcybP`7a!LJupYr*@ItcLtZ4$X z;Q)2AqIf6>7dLnYNiGZW67{TFtvUjU+a;r)7y%-9<01Y9psm353(m-US24bN?mO~SbAhOn+c-vW%Rpr!xu@ges2)G!JXL=87|?t8r+O(v7;%XA>WQ2v29cuEfiRlgb5$sYj*0PcSv UyOqQ((*OVf07*qoM6N<$f?kfF1ONa4 delta 916 zcmV;F18e-O2f_!C7YalO1^@s6!$f9nks&C5WJyFpRCwC#noVo+KoG|#X{=R2g@Ua| zJt#d?@Ducl^ytU(*e~M6gW#p~l;?I9!*E;Z!42S`V2*jZT3?z<3SVXWG5Cak;NTbnz zpjN9zwOZ|91?8PUR67D*@kIbDtN&mypmw`W@9*#aK;GWoD3{C8X0s8$x7)3l3=+e( zW-FgA=}DZE zGg%FPO(qjzEy(5M6FAsa02w5Vfh>e{imW6<@RPs0yW7h=_G;{SL3qtDMmC#u z4PaIrpni4~X9eNK4VFQW%L8$V^{i5<_yVzy1!I(RygD_wJv?Hb;=uC zSQc^9=Wkg=ZnmhEKeyje3{}3auXuFRC|5JM_R3Waw~BaJgDWVq4qgzxEW$Tp|5Qsf zQGv)MAyuD1AhN=8kR2=Uhv80YBNRnC87h!#$rmvc3yG_TsKNwxEmmGunA>k0GjX^U zTY`@sAo@N#m-JB;M-5hgZc)ei<%4XAbUID9x3>rF2TzNP$77*1U>HPgO~(bo?hFug zuu!enUZ?wn110^Jmlx6BQ{5;|5Y^pKx$ks3G#m~OFEgJx84v?vK&}cT5#RlqkNgdY q0r_hnJ~nc@b1Uk#!34vP00RIEp^KZ0{@YUk0000#o6d2&^)|<;*58OYma(dWTasYw*rZ&4Y>AItU;|K2m))v z#2^v_V!VLJXGJ~2Mr%*mo>tmG`wAXeVkM*;har38h}w!I9u-v1;O>utkoe$ZT4F_l z-AZ3`?`x-j0*Xu%fBya}niqc~4B8Z*5Apc%PuRG%iHN8eNEwYN9<78-kfe-%vb<76 zS`6V`1%~o~AbN|xUcJDhEkm`6N~Mm*KX35zj~D26pW*JEC*Y>yFmlIfq?H88@<U{_)_a9V$&~C-}_w^Azt39Rm^4rY~_B22eWcE3?i)MakziE5F zURRm1#Q!_}ul3O&JSyP*JcztHYjN_Rv`T?n@xHX4;LE8I7FH`82s?aEe%pFhkeO@j zvQR`d4DR9V> zo(eorGl-pc$t)PM7U4ltB3X^hY=xv%cq(t)XyT^xgGGrfsGJu>R{UB1g3d3JwdQqa z*d*3=Dlw&pjf+8hD#sXl}D(UvK_7%rY8vAQ!TK)5#4tXti>&qq}?RM z)E-Ipemd~PJ7sQvPbVR`@+N2!YAR_ZPZB6;r0k591`(L4r6tBE4VLXUiJ3)6OFSXR z9FXjNb~aeHsJq?nM_bg3{N+Q^6SZ0m)oK;K?@#WLMx$YkW*7lUZ%r=>MC8mM^?Du6 zW;6S|!Tr8L+1%X3&dv@hmCBHe773D;8~g)O`4biX f&EmN4d=Ov&E%;F~Lv|o)00000NkvXXu0mjfn!sPo delta 1239 zcmV;|1StFL34#ic7YalO1^@s6!$f9nks&C5q)9|URCwC#noDonI1tB&l>EpBZMNuZ zi*6U#6bK3w$hAO$A}G*n_Y>rpeyjABd(R8(C0`-C+e6R>DA0O~7C{=Pc4SK;cZST^ ziY(I)S#F$&HY3}y#QAalLk>j?D8A^kqbRHat$P>Ou)qaDL+9>VwY3FnYik2DC{=!4j76e%6ykg`u)n_#+uPf)x3@PQ$j;6VEH5uZ9LMIpQp!{Y znKeY;UeS9m>>rRqf|SyH?s*=xS}oYz+#I-spLOA-r6mZ0z<@AB8YaK>^b{6Cum}2N zy$6B_X@LlYY|AQ{AOz9vcFo1f=p@j8EWBckw}wj(dz@t?!5D4?qOc9H?F%IVTZb?V zjSXXia15~V48ot~^#~a)Jz;uUNDa~#;Grc(Lc(%rv{%L0R?P7zTXqSgou;6wo>Dw&k=S zQ&(k2p%`lv-hrc|pP>^B>OP7zG>!nP86N8MBT`sSj^{$z0BZYBtWD`f4^)-9Is^4b7+IGUU!*5Yu z!JGr10%)Qp5R-Rt77V-=p-Gb?SqvT7a!D(9DzEKqV$=ElqJ$Sz)(b2v`pmtc^Ye^a zv$`{^6Kgw>Na?}EMZZ1aaLJGJ$QU=KCu#T6fJnF`rIgk}fFy^1xr+iaY7$;3kGNni zf3VMOLY%-OQzwn1faV2~^}d`C7a>OU+*gS?JmLZoX_!)47d_W zORmV$t25VXZB`}Se%8L?$fU8icE;5|-Ra=he7C;HLhVpZ+Tem1%OiXt)+fUh4Z`gv zAtv@nviH-0$KEM_a(g-nL6tT^lTZ^$D|r$_aU(^KSZNT3nOItEe9~ave&d*#hqTxe zd~|?h@3WJ^yhYvVbk1#2&-0fLNl(;jHKZ-sDM79vh%*rsyvh9o4Rs}$WcU993;-nvZ!yF0Ey(}?002ovPDHLkV1n^x BUhe<^ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png index 7dc59bf82268abee3656297857d3e43da52115e3..1ad746053df532f5b8fa9f87c5558456dc2bd725 100644 GIT binary patch delta 412 zcmV;N0b~B*1I+`F7YaED1^@s6boh93ks&C5Z%IT!RCwC#noW*_Fbsul2(V_)0pI{! zhcyRc$DI%dV8I?(BJrO#nL(-sn6iOMGqzNzLTd4smuE*{glBNh;i^Ey_0RFD`#kRf z`2GDll6wLT&?NK$xzZnZgjDAQa`gj=+Z0h5L>on@YJG}N z2!ufH1W~bSy~{}(Mf84(LS`or0wJ@1Q$r+=oLpS3Ji>MH2>yhj@=N8H6d@1-ArJ!j z%)rAwB3=bg(**N8E0L*bn(}irz_1HaRh5M3`(6Sm(YYCulMi)W?@O|Z@OshnJP5;3 z{#d0E4zWA3EQ7KvHyqkb(4CsaeVN_;t25TyIg*C}0|0FvxR`EDp!NU&002n`MNUMn GLSTY{0J&`d delta 432 zcmV;h0Z;zT1K|UZ7YalO1^@s6!$f9nks&C5gGod|RCwC#n>~($Fc5{uU_wpL0pI{! zCp8D6<4%YJP|yP<5j}eG0>nJkL`q*(}Q_j$=yGbm{hg zwW<|G5jl=SP1Ddgj%sWj!ywzXWj^=&eZjG+$nAEcs;a2(ds3y(i0diNxm@7gTdS^X z>bmaxVvI2*K!g%vVJ*wr4e!*ZR9oS0zv=*2tfYMNpD4tz9Dg%A}WJuqX??j zr}zXQ067yx#j5o#Cv6nb`z{L14iJEU!0c#<@W{@^)ygB2E*@dOVNiZiexV3J00Izz zd}grCJ|Z3kKOPSnhCzu;P1BU0tpSErkfJCgMBBC!NQutPxtx3`%W_?kS%lYvuIo|| z1oFo!jc|zFkt7M_dA{Jl1RbgtK&}F!%iOOvilF?$>;Sn4$gbCgUS2Qyuk!jEcGUGt afB^ucy}znl#Q2i{0000gISnhUs()qtQrSc%E91yMd>c%5u4X zgxPEci^aljWnZt?(C_z!!T0-JRNpWhB93EG>E3R)gTY|%va%}`>GgVWyWNEGc#Vb= zh%XopK_J*R8Vv!2wpqK@<#Kr#O~!IX_a5a9tM%=ds!9Su3{F=KKSH%YiR_u#F zP!V0+&<;D%J&;D8TuT)vK7*Z&QFBi1UJ2IYr)oZ9&YX z$U6qRsZXnQB+p7)6o}3qhZspMs#g@JJ`Hb(skZvv{r*%m8V`4<&!2;y^g|EmblZb6 zwkWn+mFmx0?+T*px7smcv)}Qph-*w%M-f$y-R7k#UiZPke>!}q{(@*y z!M7sv+3%mHU(<_B=#phioX2;6LrlAcxE3W__%%<5@v~STg;H+3%62({&_Ob0jQA*- z&R~mhA<7$4rOcHxh@9?11@O1cd|osN*}{RGwkR|L+-IqiP#|bSk|YAe`4j~UxfAzK z%v#CWBwrw0354MTtC$?rdG_n|3Wvi1&gU~6k4KSqqc%h#5Ng})HZ+@PP3Uww_KIva zo5!E``~3rir`$rNr}+m1*dj=`+lB3RtNx$r6OQ3<2$RVKTCLWT0-^R<^0Z3|olYm1 v&*!jOtzKNKGGCcSHltfMsLeOSUjhsONWch?bA^ne00000NkvXXu0mjfJXm?P literal 1643 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSs!3HD`yQJj;DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49rTIArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yc06!V;*iRM zRQ;gT;{4L0WMIUlDTAykuyQU+O)SYT3dzsUfrVl~Mt(_taYlZDf^)E`f^TASW*&$S zR`2U;<(XGpl9-pA>gi&u1T;Y}Gc(1?#n{Ev$;{Bn$=KM@(9p%r!pPCW*~rn+*wD?w z$F! zZ)O|zy)qDJQ&(hFSRt@|fy0zJZL<~f4rOWxvWl`VSjfWY8Qs3Z^DhYA~`#~-D5)dj*0WSSf{x)h?&r=Ao54-h9ZNe0!8kXoI^d|-(UR4d{zR@`r?9GS zwyd(+Z`tczH;$zgi%fia!&h!q&AKPsARBK0=i_P!9AHS@w zp71gDQ%-01k9GZ-+eNM~O5xuB?4?1S*y}|Br+ULL>S+sDc^vBzlvlkgnIoy^Qt7;E z%Faz}f|p}gFw~jNJb#)^G1_9nRk2pLhTl4+kGNTKJtnCzZ?tng==AQ$U*XMRNoFTS zIl`F|e;n{qW3Qa|w{HL8mnBWFzj8hQZ0Wr_@bzK=j;(j|#BaSd`%-0F>{_<_?(5UX zAAe*$6r8v3(&ay`j5&f!?!P}=w|{!Q|2MAV6*g@*bJ*tkJ@;jd|E*JaOSM&RI=9Yr z?;AO0^6NzJ8Lf@xRA5wrCAG;8N|SjLu2vgP-f#L>IDsLkh+|pIy44+^;@{KN&t;uc GLK6U%hk8c< diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png index 53fe9c97d4ab0b350bbefd61883ce63cc2a4e489..4e337fa0836e56404e74b1c9e250e9088dfc1794 100644 GIT binary patch delta 327 zcmV-N0l5Bw1Nj1w7YZi`1^@s6YKoe1ks&C58%ab#RCwC#n9UA@APmO~a`82s$N3b# z_4XP*gGW!^gmyr-!+>oj+SnzM^g>Aa@o)Jk0Q)rB>Ok$~Xe-AFa)SIXNZsidDca$QOB@**Xx#ZtG%TAK_9yw4Exw{6K zK}!BL2x%wC&m38NffbCq(o3I<8OS&?j!@S%8%QYb!yIXCE#+GRRB7d2K4LycRND6t ZU;xg=0|;54gFFBL002ovPDHLkV1jZTk?8;c delta 335 zcmV-V0kHo00)YdN7YZ&21^@s6O@+(3ks&C5BS}O-RCwC#n6VOrAPj~BviKU-u|9=w zZC}G@aCCALNP%mI0&Vp)X9l>-;&I{gPlAa6=PW$xK%C|1D2D_ltAG@c-Br`~J>0tv zq@-gU#}OXG@bOH=n{I6j^E`twh6JLjDrlMplv1Fz{tmJ%OE5&5t3?PA0HgzgUm$va zUBMEm@y-F`0iqX8K&;zfk@lj^`AB1o(VZc@b27DZTA z4WD}iZ7|x;@O(ZKeUpp1>|or6-C&B hh#f5h>A6n<1^|Pt_z)2Y(*FPe002ovPDHLkV1jx;lBECu diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png index 649ef9773b893b964913e1b3aae6d734bffa72df..fe18497d82a1c7d9c1138230ffdd14c24b59ecba 100644 GIT binary patch delta 496 zcmVBujy~_2?%lGKte@A;;q*zRht+{&fiSW;Z}Pi%cDOZ8-8GP;}N}H599F|-ELRqK*<0qFIod4eUt(Mz8bd|~g8`C%{T{w#ftg@`tU}Ha4x7%uuVcj2SQW2v%o0)g z!3vqk{K)hC=ge(JBwABO_(EoaFYm~3FbjLh(7A4ira96^4PhqOv|ZG_RCBYPYr;qy zb>!A+R!2xEv&slH$q_-y?1qNi2n}fx)|zUrhlcJaUt=Krd3Hj+k7R^uiDbE3QP%kn zzZ+f-?MbiNF4lnXAjI>CEg(GH^BvXM+LeE3 m@N{o3=_AW^#H;Ro2`~V<4SC2?3d=kI0000jT!HOLs z5oK9U!L8{vI08bfSP-ZJBz8SksoKPlAjjZEEX@MT8h`xrzyr|E;<^r;wjAklxUgh( zARWlVRkK(u@G+mmb2BhT~OAcw<$ zK^o^~T8ra262KKexCfG7E?_OFk)|ou>ou}0Ll}k_kH-jtK;}R}0HrTl0b$|*(^TVh zI$^urVmKUPG#W{m&1Qo*Nn~hL{wpAyF=;yM>v%*IMd3$D?SExWrkUy$I$`J~i%D<~pMAxV)CUHz9BJ+bP zBoX;>KA(Tj)GH!rbrqotNeQ~VC&EE0?1e(tzQLO2NEXGinP&3 z>Q=Kp!kILqitr{m!nicEq2YFfhAR@*Sk>GQ4S!zwYJ+wvb; r2hxGma&!&NS`g=fCxg*@zXcco-vxKlbE=MA00000NkvXXu0mjf2Y=@O diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png index 93f7d87c2b238061186cc2a4a93cda10a4ecb3a3..00aab3d5af5cb97ad0bf3989b2a6f027887a3b40 100644 GIT binary patch delta 759 zcmVfA_JbA>p^5S1 zhcPKXh>;kL#s{cx;CuLf@)iQoH2%ece6)qOz`8qgy)!KZ+l6)u8&~6`(>9rzJ7>>5 z=VoSsyJ>ve0CZP@Zi_>qAgwS!{33w(@bUFO%m`8ci)h?e&JoP^Gubt@S`9DO*P)bu zni+($K$QJ^iH2o&WBMSrx3;kHY2#)_s;jGLHk;5|X9ht^KuGs|<+}1{_?Q-iPK^8~ zRI614L4Y`puLsiYc3o%AR$43oyRjd52R&%&ckdnIh%Qq}7z%d`2n&U_XBLQy$WEloD~EXbD#X)g zp&MFS@)3p+PS2V+?W}+_|0d*gATu&TgLQWO;-ZiH%ihq!A{VSwJe13Un?oso@zYb2 zkr79;wyuB^V!QnaM~6Eol?;NA5JimrAD+0eA{y*LiJnHykjh9_$Jp6@AmWTjV{ezS zz4->MW?j;BjKhNpzVED|b#(5WUeBf>^jMsQIv+p;_a`eCo?ij9l4qwi-I>v8JHp$*JP8@R2nG=5LcLt$yp<&*o^R)ka9k;^EIbpc)B_^Yh}Ir z)ciq4it8HW3?wc7|F;2u&ua;L`?5VR!P>)8k|blt(J>&6MnjJM<=lYS%e~!W^ln|0 pcWCym!)f$!&UIw;>Wg0j3;^|4(za@KTp9oX002ovPDHLkV1g%tb3Fh6 delta 766 zcmV&^L zIcH=Cm`vk`2B1j=dMFNslC&w1;r98} zLZi_@5Cn+h_;w)ue&2QGe5J(#up9e={D3f1Q3$JDoE(3b7djSyrs|k`^jap(x!BAaG)k<-<}xQ6HmD(n5CG*9 zDzj&J{$d@=pL{%dT1RU;!Pbv&*xCJvIHK!R60U@s0>VO}?YRZwBC-?dV(kE{Z$rF% z6}q8?1s`D;;q#q|&(HgKyy#t7Smc6Q-9xn+xH*)65kEUM zIT>*@YwHR)A$GgZaCoqdO2r@u2~ot@`|XJv>!QIEDAChRGh{N7*D-eX0Ejpv(%9W$ zY_7jYr@bXNzz9ly4h(K$SK&hbgROb&08W<=P?%LpzjW<1bIj}3lq&0>G=gJ>f} zbRMDG5f}B&9Z-mM3t?pN0`3r-W4SiJfn0ImOfP*tnH- z@~QccjFi_kC>Tgq{OKjUv_MiCv9~YVixR9oEG0>jI*z7*v|24W_E!r7VlVf0kDGVv wviyfO1u_LP634Wll@yL<%i+RJ#s}mB^75%k z(-h)32Bnn#JxvqL^Q`UA0~|-2>$*?9q9`ECvTcw&&tV+LA0`3fd7g&B4f?(hNs>T7 z+qTdDDSKhlG|+V&48x!ecR*e_3W5Lxffk0Lo;N}8fqma=Pap`+5+LXi(nkneZvjG{ zKmY=g05Nk7HSMtglL!GEf8NqktMByhSlV{DMqucyo*LU5(jH;u2*KF%8IRbyY>!+W z8di>65gPN@vO{Bs~fi&SXLu)qBtIdp2cB7ZhV*dVVYnPjrgckzhBh545` zvRf)%4f5N|PwiboX3cr_LNjd_gi3$Y%(~)C6;HhlY3_pH0`ppzU#Q}-g)m`Qp`muu ztgIyZ8iHY6@pWD6P7iw;=}r$Jf*{aZsJ#hNmL)_{BoY=I1_#1aRi!t2$8TuhtnK!( jgG<34&s-eAF98Mspz#+8-DX;q00000NkvXXu0mjfEzrck delta 445 zcmV;u0Yd(Q1cn5V7YZ&21^@s6O@+(3ks&C5s7XXYRCwC#n9GfXFbswbgrOCB;Y<dXx<;c);v1DyL<%HhIA#tm|Vyu53Y zB!MW3Kq;kvkK+i_G-=!Q0LRhhy6#gi&vQuAbR8tiG8l&8he?2Vo~L2(1%2O#IF6w} zX`1K%l)bR7YiQdR`o7nOZ$Mtz3xWUyfffXTo>xKefnC>WPap`+5+LXi(nkneZw5l1 zKmY=g05Nk7HSIA2lL!GEe_qp4i{JF`SlYI`MqubH?i$-0(jH;u2*KF%5s%oqY>%8B z8di>+5gK#bvO{Bs-!yOfp%gt9ZoW!u-n| z*(?>$2Knvdr?w6uv*tW{pqaJ_LZ!cHW?gZlil^R&G&ezTfqAS;V^s0jLYOeD&``T+ zR#p;y4Z*OE_^PUOr-wa_bfG%88>-ETS9C|z+?5^vwzx4piVz+IZ9dU-kAq@rte~|HbO!xbL zold6{-EKEN28@yHPk>Y^#mQx}S;}NG)a`cZd_KRfanzeGmkaIpd%g(AfQbVH5b1Q9 za=9E83I#s*1-V|Ye1Y(HK^BVz&1N&&Y&KM>RH)r|9xWr8BA{R6>+0RuIJB3Pa% zw%u-NKA%&yTBUlu&I(VbQ|fd&tPbLT2ZA7bJX|<#imJ$JwW4ylOvPf6&ruhsk>zqp z`FviR*gp`_A*x3)NH4lgbPj3*-+RTfy+B0kzT;5ics#P2$R4$ZE-aNwuWJH9iwvS>8P!Dli}wh?P_%M??If;9 zP)wa^L3HbGYVxw^;yGS7Bmv_0BkFibsmf})H0lzCQY5LRiPSY-1si9vhVGiMm7ZwV zB&mp6e;;dKxg&KT?zhy4CBvvPezZoCF4k~eEWJHW+|iv>+IAWr#R7SYj|j>`)-P-H!J&n65DV z!cDsds)!hXI2;ZI?t?002ovPDHLkV1j+@E*<~? delta 652 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 T6{wb@00000NkvXXu0mjfZ=Kwx delta 481 zcmV<70UrL21d;@h7YZ&21^@s6O@+(3ks&C5v`IukRCwC#nC*>&FbswrNIMM!une1^ zuG1e~q$_lc{^Ogg;ey;Wp{6lcP9l;OA;Fsm$4;C8$h1CGKuHOOazwC^wu9^-i?il* zIzg6YptXL^&;GN-Qc68NcU=eP^BM9yp9i_!Zo|hoFtwn+edtk(q6m^Cfubm;ceMR~ zQQNiyH4biiDG&s}7RNCh4u^RV9K30o3BbUFf*=HH87R9sK@5PTM^FP{3=j(hr$-8g z#)i>hd4x_0_0Gq;;jbsCw(F;y9S(CR zO5e3ocv1S&7uNz|#mHL0`cA{U#7n0yUEIE!zVEc64V>~Ok0=UbmjTjK<6Gi4bDa1} z*04Pyv9I{F*z1VBTe|AYkloj(r+uZrtFj6`(@ - 47dip + + 0.250in + 0.020in + 0.270in + 0.0in 38dip 63dip 2dip - - 79.9dip - - -47dip + + 0.459in + + -0.270in diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 1378be72c..c00c56a89 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -19,7 +19,11 @@ --> - 54dip + + 0.290in + 0.035in + 0.325in + 0.06in 22dip 42dip 63dip @@ -27,18 +31,20 @@ 2.5in - 22sp - 14sp - 0dip - 80dip + 0.13in + 0.083in + 0.236in + 0.000in + + 0.464in - - 91.8dip - - -54dip + + 0.553in + + -0.325in 0.05in - -0.06in + -0.05in 0.3in diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index 084795463..6e2e69208 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -28,10 +28,12 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="9.09%p" android:horizontalGap="0px" - android:verticalGap="0px" + android:verticalGap="@dimen/key_bottom_gap" android:keyHeight="@dimen/key_height" > - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml index aca46930f..a287be1fd 100644 --- a/java/res/xml/kbd_popup_template.xml +++ b/java/res/xml/kbd_popup_template.xml @@ -22,6 +22,6 @@ android:keyWidth="10%p" android:horizontalGap="0px" android:verticalGap="0px" - android:keyHeight="@dimen/key_height" + android:keyHeight="@dimen/popup_key_height" > diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index c6113abf7..a2c9b2b8e 100644 --- a/java/res/xml/kbd_qwerty.xml +++ b/java/res/xml/kbd_qwerty.xml @@ -22,10 +22,12 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="10%p" android:horizontalGap="0px" - android:verticalGap="0px" + android:verticalGap="@dimen/key_bottom_gap" android:keyHeight="@dimen/key_height" > - + - + mTextHeightCache = new HashMap(); + // Distance from horizontal center of the key, proportional to key label text height. + private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f; + private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H"; private final UIHandler mHandler = new UIHandler(); @@ -465,7 +474,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mPreviewPopup = new PopupWindow(context); if (previewLayout != 0) { mPreviewText = (TextView) inflate.inflate(previewLayout, null); - mPreviewTextSizeLarge = (int) mPreviewText.getTextSize(); + mPreviewTextSizeLarge = (int) res.getDimension(R.dimen.key_preview_text_size_large); mPreviewPopup.setContentView(mPreviewText); mPreviewPopup.setBackgroundDrawable(null); } else { @@ -576,6 +585,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx LatinImeLogger.onSetKeyboard(keyboard); mKeys = mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), -getPaddingTop() + mVerticalCorrection); + mKeyboardVerticalGap = (int)getResources().getDimension(R.dimen.key_bottom_gap); for (PointerTracker tracker : mPointerTrackers) { tracker.setKeyboard(mKeys, mKeyHysteresisDistance); } @@ -720,7 +730,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx int dimensionSum = 0; for (int i = 0; i < length; i++) { Key key = keys[i]; - dimensionSum += Math.min(key.width, key.height) + key.gap; + dimensionSum += Math.min(key.width, key.height + mKeyboardVerticalGap) + key.gap; } if (dimensionSum < 0 || length == 0) return; mKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length)); @@ -772,13 +782,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx paint.setColor(mKeyTextColor); boolean drawSingleKey = false; if (invalidKey != null && canvas.getClipBounds(clipRegion)) { - // Is clipRegion completely contained within the invalidated key? - if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && - invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && - invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && - invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { - drawSingleKey = true; - } + // TODO we should use Rect.inset and Rect.contains here. + // Is clipRegion completely contained within the invalidated key? + if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && + invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && + invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && + invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { + drawSingleKey = true; + } } canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR); final int keyCount = keys.length; @@ -794,8 +805,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx String label = key.label == null? null : adjustCase(key.label).toString(); final Rect bounds = keyBackground.getBounds(); - if (key.width != bounds.right || - key.height != bounds.bottom) { + if (key.width != bounds.right || key.height != bounds.bottom) { keyBackground.setBounds(0, 0, key.width, key.height); } canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); @@ -804,22 +814,34 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx boolean shouldDrawIcon = true; if (label != null) { // For characters, use large font. For labels like "Done", use small font. + final int labelSize; if (label.length() > 1 && key.codes.length < 2) { - paint.setTextSize(mLabelTextSize); + labelSize = mLabelTextSize; paint.setTypeface(Typeface.DEFAULT_BOLD); } else { - paint.setTextSize(mKeyTextSize); + labelSize = mKeyTextSize; paint.setTypeface(mKeyTextStyle); } + paint.setTextSize(labelSize); + + Integer labelHeightValue = mTextHeightCache.get(labelSize); + final int labelHeight; + if (labelHeightValue != null) { + labelHeight = labelHeightValue; + } else { + Rect textBounds = new Rect(); + paint.getTextBounds(KEY_LABEL_HEIGHT_REFERENCE_CHAR, 0, 1, textBounds); + labelHeight = textBounds.height(); + mTextHeightCache.put(labelSize, labelHeight); + } + // Draw a drop shadow for the text paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); - // Draw the text - canvas.drawText(label, - (key.width - padding.left - padding.right) / 2 - + padding.left, - (key.height - padding.top - padding.bottom) / 2 - + (paint.getTextSize() - paint.descent()) / 2 + padding.top, - paint); + final int centerX = (key.width + padding.left - padding.right) / 2; + final int centerY = (key.height + padding.top - padding.bottom) / 2; + final float baseline = centerY + + labelHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR; + canvas.drawText(label, centerX, baseline, paint); // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); @@ -829,15 +851,23 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx } if (key.icon != null && shouldDrawIcon) { // Special handing for the upper-right number hint icons - final int drawableWidth = isNumberAtEdgeOfPopupChars(key) ? - key.width : key.icon.getIntrinsicWidth(); - final int drawableHeight = isNumberAtEdgeOfPopupChars(key) ? - key.height : key.icon.getIntrinsicHeight(); - - final int drawableX = (key.width - padding.left - padding.right - - drawableWidth) / 2 + padding.left; - final int drawableY = (key.height - padding.top - padding.bottom - - drawableHeight) / 2 + padding.top; + final int drawableWidth; + final int drawableHeight; + final int drawableX; + final int drawableY; + if (isNumberAtEdgeOfPopupChars(key)) { + drawableWidth = key.width; + drawableHeight = key.height; + drawableX = 0; + drawableY = NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL; + } else { + drawableWidth = key.icon.getIntrinsicWidth(); + drawableHeight = key.icon.getIntrinsicHeight(); + drawableX = (key.width - padding.left - padding.right - drawableWidth) + / 2 + padding.left; + drawableY = (key.height - padding.top - padding.bottom - drawableHeight) + / 2 + padding.top; + } canvas.translate(drawableX, drawableY); key.icon.setBounds(0, 0, drawableWidth, drawableHeight); key.icon.draw(canvas); @@ -1003,6 +1033,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx if (key == null) return; mInvalidatedKey = key; + // TODO we should clean up this and record key's region to use in onBufferDraw. mDirtyRect.union(key.x + getPaddingLeft(), key.y + getPaddingTop(), key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); onBufferDraw(); From 179fa2c03e749df736f43e0838200bec52b4808a Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 12 Oct 2010 16:16:38 +0900 Subject: [PATCH 064/287] DO NOT MERGE. Add visual indicator that long press , or mic key will bring up Settings bug:3084022 Change-Id: I8b38e2803eb32469653484701882af35108eb69a --- java/res/drawable-hdpi/hint_settings.9.png | Bin 0 -> 236 bytes java/res/drawable-mdpi/hint_settings.9.png | Bin 0 -> 222 bytes .../inputmethod/latin/LatinKeyboard.java | 34 ++++++++++++++++-- .../latin/LatinKeyboardBaseView.java | 12 +++++-- 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 java/res/drawable-hdpi/hint_settings.9.png create mode 100644 java/res/drawable-mdpi/hint_settings.9.png diff --git a/java/res/drawable-hdpi/hint_settings.9.png b/java/res/drawable-hdpi/hint_settings.9.png new file mode 100644 index 0000000000000000000000000000000000000000..85c183a61728680e7cb9f9291c791606a498d2a6 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSs!3HD`yQJj;DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MSY$wjv*Dd-rP3iI-tPA8W3D{L~e8W7Nxfl1)jQ}{weuA zoaidl6P10^$K?ytTE8XNPPWyE3P8bxJ#V~A7Vq6K{RIamIFaM=a`&G*sr&jGKtSc` zj`PJI{&C$rrL=J#8zUV2G=1_j&O}>z@&)e(Muz*TUr!fZ4QdCvjKR~@&t;ucLK6U4 C;87+3 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/hint_settings.9.png b/java/res/drawable-mdpi/hint_settings.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5077f3e6a833fa57a5eddb62a6b7a82523869b1f GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^ia@N(!3HE1)R;tolw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6Jlq6SYF$B>F!Z>BqP9Z(Qp_I)Y*`~UhIY*ixq8+T0M)TxMS zTjLh`ey{4JCv0B7WOS!rV$)Vgnw!~NGADHo15-zl0G~CG=1^z=5&sw;PCpxbd#=Fa z59S3&&HFAJUif+~C-ySu+k3)&>_V46sT2TJW!+yiS>?BqS374dw*iADmvl(Kcg9wr PTNpfD{an^LB{Ts5pQ}sY literal 0 HcmV?d00001 diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index f0d5ef60a..cf702f391 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -61,6 +61,7 @@ public class LatinKeyboard extends Keyboard { private Key mShiftKey; private Key mEnterKey; private Key mF1Key; + private Drawable mF1HintIcon; private Key mSpaceKey; private Key m123Key; private final int NUMBER_HINT_COUNT = 10; @@ -135,6 +136,7 @@ public class LatinKeyboard extends Keyboard { mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right); m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic); m123MicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_123_mic); + mF1HintIcon = res.getDrawable(R.drawable.hint_settings); setDefaultBounds(m123MicPreviewIcon); sSpacebarVerticalCorrection = res.getDimensionPixelOffset( R.dimen.spacebar_vertical_correction); @@ -368,13 +370,18 @@ public class LatinKeyboard extends Keyboard { if (mHasVoiceButton && mVoiceEnabled) { mF1Key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; mF1Key.label = null; - mF1Key.icon = mMicIcon; + // HACK: draw mMicIcon and mF1HintIcon at the same time + mF1Key.icon = new BitmapDrawable(mRes, drawSynthesizedSettingsHintImage( + mF1Key.width, mF1Key.height + mVerticalGap, mMicIcon, mF1HintIcon)); mF1Key.iconPreview = mMicPreviewIcon; mF1Key.popupResId = R.xml.popup_mic; } else { mF1Key.label = ","; mF1Key.codes = new int[] { ',' }; - mF1Key.icon = null; + // HACK: draw only mF1HintIcon on offscreen buffer to adjust position of '...' to the + // above synthesized icon + mF1Key.icon = new BitmapDrawable(mRes, drawSynthesizedSettingsHintImage( + mF1Key.width, mF1Key.height + mVerticalGap, null, mF1HintIcon)); mF1Key.iconPreview = null; mF1Key.popupResId = R.xml.popup_comma; } @@ -424,6 +431,29 @@ public class LatinKeyboard extends Keyboard { return bounds.width(); } + // Overlay two images. Note that mainIcon can be null. + private Bitmap drawSynthesizedSettingsHintImage( + int width, int height, Drawable mainIcon, Drawable hintIcon) { + if (hintIcon == null) + return null; + final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(buffer); + canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); + // draw main icon at centered position + if (mainIcon != null) { + setDefaultBounds(mainIcon); + final int drawableX = (width - mainIcon.getIntrinsicWidth()) / 2; + final int drawableY = (height - mainIcon.getIntrinsicHeight()) / 2; + canvas.translate(drawableX, drawableY); + mainIcon.draw(canvas); + canvas.translate(-drawableX, -drawableY); + } + // draw hint icon fully in the key + hintIcon.setBounds(0, 0, width, height); + hintIcon.draw(canvas); + return buffer; + } + // Layout local language name and left and right arrow on space bar. private static String layoutSpaceBar(Paint paint, Locale locale, Drawable lArrow, Drawable rArrow, int width, int height, float origTextSize, diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 9ff7b9aef..b3f1364d8 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -847,7 +847,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Usually don't draw icon if label is not null, but we draw icon for the number // hint. - shouldDrawIcon = isNumberAtEdgeOfPopupChars(key); + shouldDrawIcon = isCommaKeyLabelOrNumberAtEdgeOfPopupChars(key); } if (key.icon != null && shouldDrawIcon) { // Special handing for the upper-right number hint icons @@ -940,7 +940,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx if (key == null) return; // Should not draw number hint icons - if (key.icon != null && !isNumberAtEdgeOfPopupChars(key)) { + if (key.icon != null && !isCommaKeyLabelOrNumberAtEdgeOfPopupChars(key)) { mPreviewText.setCompoundDrawables(null, null, null, key.iconPreview != null ? key.iconPreview : key.icon); mPreviewText.setText(null); @@ -1221,6 +1221,14 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return false; } + private static boolean isCommaKeyLabelOrNumberAtEdgeOfPopupChars(Key key) { + return isNumberAtEdgeOfPopupChars(key) || isCommaKeyLabel(key); + } + + private static boolean isCommaKeyLabel(Key key) { + return ",".equals(key.label); + } + private static boolean isNumberAtEdgeOfPopupChars(Key key) { return isNumberAtLeftmostPopupChar(key) || isNumberAtRightmostPopupChar(key); } From 913730d6e7202d71f36dc1b727bb2bd3592f0dee Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Thu, 14 Oct 2010 09:46:48 -0700 Subject: [PATCH 065/287] Import revised translations Change-Id: Iaf51da312caf84a58796714424fc8dd22df1f6d3 --- java/res/values-cs/strings.xml | 6 +++--- java/res/values-da/strings.xml | 6 +++--- java/res/values-de/strings.xml | 8 ++++---- java/res/values-el/strings.xml | 6 +++--- java/res/values-es-rUS/strings.xml | 8 ++++---- java/res/values-es/strings.xml | 6 +++--- java/res/values-fr/strings.xml | 8 ++++---- java/res/values-it/strings.xml | 6 +++--- java/res/values-ja/strings.xml | 6 +++--- java/res/values-ko/strings.xml | 6 +++--- java/res/values-nb/strings.xml | 6 +++--- java/res/values-nl/strings.xml | 6 +++--- java/res/values-pl/strings.xml | 6 +++--- java/res/values-pt-rPT/strings.xml | 6 +++--- java/res/values-pt/strings.xml | 6 +++--- java/res/values-ru/strings.xml | 6 +++--- java/res/values-sv/strings.xml | 6 +++--- java/res/values-tr/strings.xml | 6 +++--- java/res/values-zh-rCN/strings.xml | 6 +++--- java/res/values-zh-rTW/strings.xml | 6 +++--- 20 files changed, 63 insertions(+), 63 deletions(-) diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 58ba671ae..7a4cf782f 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -128,12 +128,12 @@ "Výběr metody zadávání dat" "Vstupní jazyky" "Jazyk můžete změnit posunutím prstu po mezerníku." - "← Uložte slovo opětovným klepnutím" + "← Dalším dotykem slovo uložíte" "K dispozici je slovník" "Aktivovat zasílání statistik užívání a zpráv o selhání" "Automatickým zasíláním statistik o užívání editoru zadávání dat a zpráv o jeho selhání do Googlu můžete přispět k vylepšení tohoto nástroje." - "Klepnutím sem aktivujete korekci" - "Klepnutím na slova, která jste napsali, zobrazíte návrhy na korekci." + "Dotykem aktivujete opravy" + "Dotknete-li se slov, která jste napsali, můžete je opravit." "Motiv klávesnice" "klávesnice" "hlas" diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index b554e1be5..c4d67fd60 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -128,12 +128,12 @@ "Vælg inputmetode" "Inputsprog" "Træk fingeren på mellemrumstasten for at skifte sprog" - "← Tast igen for at gemme" + "← Tryk igen for at gemme" "Ordbog er tilgængelig" "Aktiver brugerfeedback" "Vær med til at forbedre denne inputmetode ved at sende anvendelsesstatistikker og rapporter om nedbrud til Google." - "Tryk for at rette ord igen" - "Du kan rette ordene igen ved at trykke på de ord, du har indtastet" + "Tryk for at rette ord igen" + "Du kan rette ordene igen ved at trykke på de ord, du har indtastet" "Tastaturtema" "tastatur" "stemme" diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index c9dbb4aef..3153d2936 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -48,7 +48,7 @@ "Vorgeschlagene Wörter während des Tippens anzeigen" "Autom. vervollständigen" "Leertaste und Interpunktion fügen autom. ein markiertes Wort ein" - "Einstellungsschlüssel anzeigen" + "Einstellungstaste anz." "Automatisch" "Immer anzeigen" "Immer ausblenden" @@ -128,12 +128,12 @@ "Eingabemethode auswählen" "Eingabesprachen" "Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln" - "← Zum Speichern erneut tippen" + "← Zum Speichern erneut berühren" "Wörterbuch verfügbar" "Nutzer-Feedback aktivieren" "Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte an Google senden." - "Zur Korrektur von Wörtern darauf tippen" - "Sie können Wörter korrigieren, indem Sie auf eingegebene Wörter tippen." + "Wortkorrektur" + "Sie können Wörter korrigieren, indem Sie die eingegebenen Wörter berühren." "Tastaturdesign" "Tastatur" "Sprache" diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index b87597aa4..f249e9a7a 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -128,12 +128,12 @@ "Επιλογή μεθόδου εισόδου" "Γλώσσες εισόδου" "Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα" - "← Πατήστε ξανά για αποθήκευση" + "← Αγγίξτε ξανά για αποθήκευση" "Λεξικό διαθέσιμο" "Ενεργοποίηση σχολίων χρηστών" "Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων στην Google." - "Αγγίξτε για να διορθώσετε ξανά τις λέξεις" - "Μπορείτε να διορθώσετε ξανά τις λέξεις αγγίζοντας τις λέξεις που έχετε πληκτρολογήσει" + "Αγγίξτε για να διορθώσετε ξανά τις λέξεις" + "Μπορείτε να διορθώσετε ξανά τις λέξεις αγγίζοντας τις λέξεις που έχετε πληκτρολογήσει" "Θέμα πληκτρολογίου" "πληκτρολόγιο" "φωνητική" diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 1737665b4..3abc8ded6 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -48,7 +48,7 @@ "Mostrar palabras sugeridas mientras escribe" "Completar automát." "La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada." - "Mostrar tecla de parámetros de configuración" + "Mostrar tecla de configuración" "Automático" "Mostrar siempre" "Ocultar siempre" @@ -128,12 +128,12 @@ "Seleccionar método de entrada" "Idiomas de entrada" "Deslizarse manualmente por la barra espaciadora para cambiar el idioma" - "← Presionar nuevamente para guardar" + "← Tocar de nuevo para guardar" "Diccionario disponible" "Habilitar los comentarios del usuario" "Ayuda a mejorar este editor de método de introducción de texto al enviar las estadísticas de uso y los informes de error a Google." - "Puntea para volver a corregir las palabras" - "Puedes volver a corregir las palabras punteando las que ya has escrito" + "Tocar para corregir palabras" + "Toca las palabras ingresadas que desees corregir" "Tema del teclado" "Teclado" "Voz" diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 76d0ab018..21bcfc761 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -128,12 +128,12 @@ "Seleccionar método de introducción de texto" "Idiomas" "Deslizar el dedo por la barra espaciadora para cambiar el idioma" - "← Volver a tocar para guardar" + "← Volver a tocar para guardar" "Hay un diccionario disponible." "Habilitar comentarios de usuarios" "Ayuda a mejorar este editor de método de introducción de texto enviando estadísticas de uso e informes de error a Google." - "Tocar para corregir palabras" - "Para corregir palabras, toca las que hayas escrito." + "Tocar para corregir palabras" + "Para corregir palabras, toca las que hayas escrito." "Tema de teclado" "teclado" "voz" diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index da3ebdc55..c5ebf86a7 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -25,7 +25,7 @@ "Options de saisie" "Vibrer à chaque touche" "Son à chaque touche" - "Agrandir les caractères à chaque touche utilisée" + "Agrandir les caractères à chaque touche" "Corriger les fautes de frappe" "Activer la correction des erreurs de saisie" "Erreurs de saisie en mode paysage" @@ -128,12 +128,12 @@ "Sélectionner un mode de saisie." "Langues de saisie" "Faites glisser votre doigt sur la barre d\'espacement pour changer la langue." - "← Appuyer de nouveau pour enregistrer" + "← Appuyer de nouveau pour enregistrer" "Dictionnaire disponible" "Autoriser les commentaires des utilisateurs" "Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google." - "Appuyer pour corriger les suggestions" - "Vous pouvez corriger les suggestions en appuyant sur les mots à modifier." + "Toucher pour corriger" + "Toucher les mots saisis pour les corriger" "Thème du clavier" "clavier" "voix" diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index c4a2ce3ee..94cdb967f 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -128,12 +128,12 @@ "Seleziona metodo di inserimento" "Lingue comandi" "Scorri il dito sulla barra spaziatrice per cambiare la lingua" - "← Tocca di nuovo per salvare" + "← Tocca di nuovo per salvare" "Dizionario disponibile" "Attiva commenti degli utenti" "Aiuta a migliorare l\'editor del metodo di inserimento inviando automaticamente a Google statistiche sull\'utilizzo e segnalazioni sugli arresti anomali." - "Tocca per correggere di nuovo le parole" - "Puoi correggere di nuovo le parole toccando quelle che hai digitato" + "Tocca per correggere di nuovo le parole" + "Puoi correggere di nuovo le parole toccando quelle che hai digitato" "Tema della tastiera" "tastiera" "vocale" diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index e720db47d..2589c89fc 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -128,12 +128,12 @@ "入力方法の選択" "入力言語" "スペースバーで指をスライドさせて言語を変更する" - "←保存するにはもう一度タップ" + "←保存するにはもう一度タップ" "辞書を利用できます" "ユーザーフィードバックを有効にする" "IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。" - "タップして語句を再修正" - "入力した語句をタップすると語句を再修正できます" + "タップして語句を再修正" + "入力した語句をタップすると語句を再修正できます" "キーボードテーマ" "キーボード" "音声" diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 99e46ea3f..ab3aa91b0 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -128,12 +128,12 @@ "입력 방법 선택" "입력 언어" "손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경" - "← 저장하려면 다시 누르세요." + "← 저장하려면 다시 터치하세요." "사전 사용 가능" "사용자 의견 사용" "사용 통계 및 충돌 보고서를 Google에 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다." - "눌러서 단어 다시 수정" - "입력한 단어를 누르면 다시 수정할 수 있습니다." + "터치하여 단어 다시 수정" + "입력한 단어를 터치하면 다시 수정할 수 있습니다." "키보드 테마" "키보드" "음성" diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 5a053dfa4..c98b8f4da 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -128,12 +128,12 @@ "Velg inndatametode" "Inndataspråk" "Dra fingeren på mellomromstasten for å endre språk" - "← Trykk på nytt for å lagre" + "Trykk på nytt for å lagre" "Ordbok tilgjengelig" "Aktiver brukertilbakemelding" "Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre." - "Trykk for å endre ord" - "Du kan endre innskrevne ord ved å trykke på dem" + "Trykk for å endre ord" + "Du kan endre innskrevne ord ved å trykke på dem" "Tastaturtema" "tastatur" "stemme" diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 35cee4b79..c907344eb 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -128,12 +128,12 @@ "Invoermethode selecteren" "Invoertalen" "Schuif uw vinger over de spatiebalk om de taal te wijzigen" - "← Tik nogmaals om op te slaan" + "← Raak nogmaals aan om op te slaan" "Woordenboek beschikbaar" "Gebruikersfeedback inschakelen." "Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden." - "Tik om woorden opnieuw te corrigeren" - "U kunt woorden opnieuw corrigeren door woorden aan te raken die u heeft getypt" + "Raak aan om woorden opnieuw te corrigeren" + "U kunt woorden opnieuw corrigeren door woorden aan te raken die u heeft getypt" "Toetsenbordthema" "toetsenbord" "spraak" diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 5a406230d..a2f429e23 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -128,12 +128,12 @@ "Wybierz metodę wprowadzania" "Języki wprowadzania" "Przesuń palcem po spacji, aby zmienić język" - "← Dotknij ponownie, aby zapisać" + "← Dotknij ponownie, aby zapisać" "Słownik dostępny" "Włącz przesyłanie opinii użytkownika" "Pomóż ulepszyć edytor tej metody wprowadzania, automatycznie wysyłając do Google statystyki użycia i raporty o awariach." - "Dotknij, aby ponownie poprawić słowa" - "Możesz ponownie poprawiać słowa, dotykając wprowadzonych słów" + "Dotknij, aby ponownie poprawić słowa" + "Możesz ponownie poprawiać wprowadzone słowa, dotykając ich" "Motyw klawiatury" "klawiatura" "głosowe" diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index b940a3d0f..01d96edc5 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -128,12 +128,12 @@ "Seleccionar método de entrada" "Idiomas de entrada" "Deslize o dedo pela barra de espaço para alterar o idioma" - "← Toque novamente para guardar" + "← Toque novamente para guardar" "Dicionário disponível" "Activar comentários do utilizador" "Envie automaticamente estatísticas de utilização e relatórios de falhas para a Google e ajude-nos a melhor este editor de método de introdução." - "Tocar para voltar a corrigir palavras" - "Pode voltar a corrigir palavras tocando naquelas que escreveu" + "Tocar para voltar a corrigir palavras" + "Pode voltar a corrigir palavras tocando naquelas que escreveu" "Tema do teclado" "teclado" "voz" diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 1f49f9764..0acaf25d6 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -128,12 +128,12 @@ "Selecionar método de entrada" "Idiomas de entrada" "Deslize o dedo na barra de espaços para alterar o idioma" - "← Toque novamente para salvar" + "← Toque novamente para salvar" "Dicionário disponível" "Ativar comentário do usuário" "Ajude a melhorar este editor de método de entrada enviando automaticamente ao Google estatísticas de uso e relatórios de falhas." - "Toque para corrigir novamente as palavras" - "Você pode fazer novamente a correção tocando nas palavras digitadas" + "Toque para corrigir novamente as palavras" + "Você pode fazer novamente a correção tocando nas palavras digitadas" "Tema do teclado" "teclado" "voz" diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index ee97cd45a..ae5e3917b 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -128,12 +128,12 @@ "Выбрать способ ввода" "Языки ввода" "Для изменения языка проведите пальцем по пробелу" - "← Нажмите повторно, чтобы сохранить" + "← Нажмите еще раз, чтобы сохранить" "Доступен словарь" "Включить отправку сведений" "Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях в Google." - "Исправление нажатием" - "Исправление слов нажатием на них" + "Исправление нажатием" + "Нажмите на слово, чтобы исправить его" "Вид клавиатуры" "клавиатура" "голосовой" diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 20845c2d6..eaa3d1961 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -128,12 +128,12 @@ "Välj inmatningsmetod" "Inmatningsspråk" "Dra med fingret på blanksteg om du vill ändra språk" - "← Peka igen för att spara" + "← Tryck igen för att spara" "En ordlista är tillgänglig" "Aktivera synpunkter från användare" "Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter till Google." - "Knacka lätt om du vill korrigera om ord" - "Du kan korrigera om ord genom att knacka lätt på ord som du har skrivit" + "Tryck om du vill korrigera om ord" + "Du kan korrigera om ord genom att trycka på ord som du har skrivit" "Tangentbordstema" "tangentbord" "röst" diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index c2f8dc15a..599ddb20a 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -128,12 +128,12 @@ "Giriş yöntemini seç" "Giriş dilleri" "Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın" - "← Kaydetmek için tekrar dokunun" + "← Kaydetmek için tekrar dokunun" "Sözlük kullanılabilir" "Kullanıcı geri bildirimini etkinleştir" "Kullanım istatistiklerini ve kilitlenme raporlarını Google\'a otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun." - "Kelimeleri düzeltmek için hafifçe vurun" - "Yazdığınız kelimelere hafifçe vurarak kelimelerde düzeltme yapabilirsiniz" + "Kelimeleri düzeltmek için dokunun" + "Yazdığınız kelimelere dokunarak kelimelerde düzeltme yapabilirsiniz" "Klavye Teması" "klavye" "ses" diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 7945a70fc..7a4bcea0f 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -128,12 +128,12 @@ "选择输入法" "输入语言" "在空格键上滑动手指可更改语言" - "← 再次点按即可保存" + "← 再次触摸即可保存" "提供字典" "启用用户反馈" "自动向 Google 发送使用情况统计信息和崩溃报告,帮助改进该输入法编辑器。" - "点按即可更正字词" - "您可以点按已键入的字词,对其进行更正" + "触摸即可更正字词" + "您可以触摸已键入的字词,对其进行更正" "键盘主题" "键盘" "语音" diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index c9ed27a2b..cbd079633 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -128,12 +128,12 @@ "選取輸入法" "輸入語言" "以手指在空白鍵上滑動可變更語言" - "← 再次輕按可儲存" + "← 再次輕觸即可儲存" "可使用字典" "啟用使用者意見回饋" "自動將使用統計資料和當機報告傳送給 Google,協助改善這個輸入法編輯器。" - "輕按即可重新修正字詞" - "只要輕按您所輸入的字詞,即可重新予以修正。" + "輕觸即可重新修正字詞" + "只要輕觸您所輸入的字詞,即可重新予以修正" "鍵盤主題" "鍵盤" "語音" From 0661496ee0988391f9214616ef091625bcc7f8cb Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 15 Oct 2010 01:23:20 +0900 Subject: [PATCH 066/287] Follow up change of I8b38e280 (DO NOT MERGE) This is follow up change of I8b38e2803eb32469653484701882af35108eb69a This change fixes the following when "Voice input on symbols keyboard" option is selected. - LatinIME.onCreateInputView fails to show "123mic" icon. - Email and URL variation keyboard fails to show "123mic" icon. Bug: 3084022 Change-Id: Ia3929bb0cc5c5c8651af816718c21d1f20e8f016 --- .../inputmethod/latin/KeyboardSwitcher.java | 3 +- .../android/inputmethod/latin/LatinIME.java | 4 +- .../inputmethod/latin/LatinKeyboard.java | 45 ++++++++++--------- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 86dbf1f60..a7b695eb3 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -260,7 +260,8 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mMode = mode; mImeOptions = imeOptions; if (enableVoice != mHasVoice) { - setVoiceMode(mHasVoice, mVoiceOnPrimary); + // TODO clean up this unnecessary recursive call. + setVoiceMode(enableVoice, mVoiceOnPrimary); } mIsSymbols = isSymbols; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 4e0f7c56b..b6fee1170 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -2329,8 +2329,8 @@ public class LatinIME extends InputMethodService private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) { return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) - && !(attribute != null && attribute.privateImeOptions != null - && attribute.privateImeOptions.equals(IME_OPTION_NO_MICROPHONE)) + && !(attribute != null + && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions)) && SpeechRecognizer.isRecognitionAvailable(this); } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index cf702f391..e33ae145b 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -336,7 +336,7 @@ public class LatinKeyboard extends Keyboard { mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); } - updateF1Key(); + updateDynamicKeys(); if (mSpaceKey != null) { updateSpaceBarForLocale(isAutoCompletion, isBlack); } @@ -350,11 +350,11 @@ public class LatinKeyboard extends Keyboard { public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) { mHasVoiceButton = hasVoiceButton; mVoiceEnabled = hasVoice; - updateF1Key(); + updateDynamicKeys(); } - private void updateF1Key() { - if (mF1Key == null) return; + private void updateDynamicKeys() { + // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode. if (m123Key != null && mIsAlphaKeyboard) { if (mVoiceEnabled && !mHasVoiceButton) { m123Key.icon = m123MicIcon; @@ -367,23 +367,26 @@ public class LatinKeyboard extends Keyboard { } } - if (mHasVoiceButton && mVoiceEnabled) { - mF1Key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; - mF1Key.label = null; - // HACK: draw mMicIcon and mF1HintIcon at the same time - mF1Key.icon = new BitmapDrawable(mRes, drawSynthesizedSettingsHintImage( - mF1Key.width, mF1Key.height + mVerticalGap, mMicIcon, mF1HintIcon)); - mF1Key.iconPreview = mMicPreviewIcon; - mF1Key.popupResId = R.xml.popup_mic; - } else { - mF1Key.label = ","; - mF1Key.codes = new int[] { ',' }; - // HACK: draw only mF1HintIcon on offscreen buffer to adjust position of '...' to the - // above synthesized icon - mF1Key.icon = new BitmapDrawable(mRes, drawSynthesizedSettingsHintImage( - mF1Key.width, mF1Key.height + mVerticalGap, null, mF1HintIcon)); - mF1Key.iconPreview = null; - mF1Key.popupResId = R.xml.popup_comma; + // Update KEYCODE_F1 key. Please note that some keyboard layout has no F1 key. + if (mF1Key != null) { + if (mHasVoiceButton && mVoiceEnabled) { + mF1Key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; + mF1Key.label = null; + // HACK: draw mMicIcon and mF1HintIcon at the same time + mF1Key.icon = new BitmapDrawable(mRes, drawSynthesizedSettingsHintImage( + mF1Key.width, mF1Key.height + mVerticalGap, mMicIcon, mF1HintIcon)); + mF1Key.iconPreview = mMicPreviewIcon; + mF1Key.popupResId = R.xml.popup_mic; + } else { + mF1Key.label = ","; + mF1Key.codes = new int[] { ',' }; + // HACK: draw only mF1HintIcon on offscreen buffer to adjust position of '...' to + // the above synthesized icon + mF1Key.icon = new BitmapDrawable(mRes, drawSynthesizedSettingsHintImage( + mF1Key.width, mF1Key.height + mVerticalGap, null, mF1HintIcon)); + mF1Key.iconPreview = null; + mF1Key.popupResId = R.xml.popup_comma; + } } } From 62e3fafac67437698ec412b3e8c97ead23f217a8 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 15 Oct 2010 10:22:43 +0900 Subject: [PATCH 067/287] Reduce popup preview fading out animation duration to 70ms Bug: 3099331 Change-Id: I32c11bb25ebdb97af0c883c475d96fc8e2749101 --- java/res/values/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/values/config.xml b/java/res/values/config.xml index b11236a23..edb6cd845 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -22,7 +22,7 @@ 0 10 0 - 90 + 70 0 100 400 From 8a26e85387d7fb964b76af502a6e89574d85d58d Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 15 Oct 2010 17:56:05 +0900 Subject: [PATCH 068/287] Fix an issue of adding extra character. LatinKeyboardBaseView should have removed "long pressed" pointer tracker from the multi-touch pointer queue. bug: 3099130 Change-Id: I3d358a373b0de07558a204e9ff5a95e9ece38bcc --- .../android/inputmethod/latin/LatinKeyboardBaseView.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index b3f1364d8..c1b1008b0 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -214,7 +214,10 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private OnKeyboardActionListener mKeyboardActionListener; private final ArrayList mPointerTrackers = new ArrayList(); + + // TODO: Let the PointerTracker class manage this pointer queue private final PointerQueue mPointerQueue = new PointerQueue(); + private final boolean mHasDistinctMultitouch; private int mOldPointerCount = 1; @@ -1053,8 +1056,10 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx boolean result = onLongPress(popupKey); if (result) { dismissKeyPreview(); - tracker.setAlreadyProcessed(); mMiniKeyboardTrackerId = tracker.mPointerId; + // Mark this tracker "already processed" and remove it from the pointer queue + tracker.setAlreadyProcessed(); + mPointerQueue.remove(tracker); } return result; } From 1cbfc6c968378f2e0a20b41677ec2a96bf69b621 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Sat, 16 Oct 2010 02:15:04 +0900 Subject: [PATCH 069/287] DO NOT MERGE. Follow up change to I8b38e280 Add visual indicator that long press / or @ on F1 key will bring up Settings bug: 3084022 Change-Id: If925b546829ca8e8806e1f8f89eaf72fc8c220da --- java/res/xml-da/kbd_qwerty.xml | 8 +- java/res/xml-da/kbd_qwerty_black.xml | 8 +- java/res/xml-de/kbd_qwerty.xml | 8 +- java/res/xml-fr/kbd_qwerty.xml | 8 +- java/res/xml-fr/kbd_qwerty_black.xml | 8 +- java/res/xml-iw/kbd_qwerty.xml | 8 +- java/res/xml-iw/kbd_qwerty_black.xml | 8 +- java/res/xml-nb/kbd_qwerty.xml | 8 +- java/res/xml-nb/kbd_qwerty_black.xml | 8 +- java/res/xml-ru/kbd_qwerty.xml | 8 +- java/res/xml-ru/kbd_qwerty_black.xml | 8 +- java/res/xml-sr/kbd_qwerty.xml | 8 +- java/res/xml-sr/kbd_qwerty_black.xml | 8 +- java/res/xml-sv/kbd_qwerty.xml | 8 +- java/res/xml-sv/kbd_qwerty_black.xml | 8 +- java/res/xml/kbd_qwerty.xml | 8 +- java/res/xml/kbd_qwerty_black.xml | 8 +- java/res/xml/popup_at.xml | 39 +++++++++ java/res/xml/popup_slash.xml | 39 +++++++++ .../inputmethod/latin/LatinKeyboard.java | 79 ++++++++++++++----- .../latin/LatinKeyboardBaseView.java | 13 +-- 21 files changed, 214 insertions(+), 92 deletions(-) create mode 100644 java/res/xml/popup_at.xml create mode 100644 java/res/xml/popup_slash.xml diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index 6e2e69208..70eab096d 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -209,7 +209,7 @@ android:isModifier="true" android:keyEdgeFlags="left" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + android:codes="@integer/key_f1" /> + + + + + + + + diff --git a/java/res/xml/popup_slash.xml b/java/res/xml/popup_slash.xml new file mode 100644 index 000000000..a38fde0e4 --- /dev/null +++ b/java/res/xml/popup_slash.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index e33ae145b..8060ac996 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -74,6 +74,7 @@ public class LatinKeyboard extends Keyboard { private LanguageSwitcher mLanguageSwitcher; private final Resources mRes; private final Context mContext; + private int mMode; // Whether this keyboard has voice icon on it private boolean mHasVoiceButton; // Whether voice icon is enabled at all @@ -122,6 +123,7 @@ public class LatinKeyboard extends Keyboard { super(context, xmlLayoutResId, mode); final Resources res = context.getResources(); mContext = context; + mMode = mode; mRes = res; mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); @@ -202,6 +204,7 @@ public class LatinKeyboard extends Keyboard { } void setImeOptions(Resources res, int mode, int options) { + mMode = mode; // TODO should clean up this method if (mEnterKey != null) { // Reset some of the rarely used attributes. @@ -354,6 +357,11 @@ public class LatinKeyboard extends Keyboard { } private void updateDynamicKeys() { + update123Key(); + updateF1Key(); + } + + private void update123Key() { // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode. if (m123Key != null && mIsAlphaKeyboard) { if (mVoiceEnabled && !mHasVoiceButton) { @@ -366,30 +374,65 @@ public class LatinKeyboard extends Keyboard { m123Key.label = m123Label; } } + } - // Update KEYCODE_F1 key. Please note that some keyboard layout has no F1 key. - if (mF1Key != null) { - if (mHasVoiceButton && mVoiceEnabled) { - mF1Key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; - mF1Key.label = null; - // HACK: draw mMicIcon and mF1HintIcon at the same time - mF1Key.icon = new BitmapDrawable(mRes, drawSynthesizedSettingsHintImage( - mF1Key.width, mF1Key.height + mVerticalGap, mMicIcon, mF1HintIcon)); - mF1Key.iconPreview = mMicPreviewIcon; - mF1Key.popupResId = R.xml.popup_mic; + private void updateF1Key() { + // Update KEYCODE_F1 key. Please note that some keyboard layouts have no F1 key. + if (mF1Key == null) + return; + + if (mIsAlphaKeyboard) { + if (mMode == KeyboardSwitcher.MODE_URL) { + setNonMicF1Key(mF1Key, "/", R.xml.popup_slash); + } else if (mMode == KeyboardSwitcher.MODE_EMAIL) { + setNonMicF1Key(mF1Key, "@", R.xml.popup_at); } else { - mF1Key.label = ","; - mF1Key.codes = new int[] { ',' }; - // HACK: draw only mF1HintIcon on offscreen buffer to adjust position of '...' to - // the above synthesized icon - mF1Key.icon = new BitmapDrawable(mRes, drawSynthesizedSettingsHintImage( - mF1Key.width, mF1Key.height + mVerticalGap, null, mF1HintIcon)); - mF1Key.iconPreview = null; - mF1Key.popupResId = R.xml.popup_comma; + if (mVoiceEnabled && mHasVoiceButton) { + setMicF1Key(mF1Key); + } else { + setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); + } + } + } else { // Symbols keyboard + if (mVoiceEnabled && mHasVoiceButton) { + setMicF1Key(mF1Key); + } else { + setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); } } } + private void setMicF1Key(Key key) { + // HACK: draw mMicIcon and mF1HintIcon at the same time + final Drawable micWithSettingsHintDrawable = new BitmapDrawable(mRes, + drawSynthesizedSettingsHintImage(key.width, key.height + mVerticalGap, + mMicIcon, mF1HintIcon)); + + key.label = null; + key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; + key.popupResId = R.xml.popup_mic; + key.icon = micWithSettingsHintDrawable; + key.iconPreview = mMicPreviewIcon; + } + + private void setNonMicF1Key(Key key, String label, int popupResId) { + // HACK: draw only mF1HintIcon on offscreen buffer to adjust position of '...' to + // the mic+hint synthesized icon + final Drawable onlySettingsHintDrawable = new BitmapDrawable(mRes, + drawSynthesizedSettingsHintImage(key.width, key.height + mVerticalGap, + null, mF1HintIcon)); + + key.label = label; + key.codes = new int[] { label.charAt(0) }; + key.popupResId = popupResId; + key.icon = onlySettingsHintDrawable; + key.iconPreview = null; + } + + public boolean isF1Key(Key key) { + return key == mF1Key; + } + /** * @return a key which should be invalidated. */ diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index c1b1008b0..832c76880 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -850,7 +850,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Usually don't draw icon if label is not null, but we draw icon for the number // hint. - shouldDrawIcon = isCommaKeyLabelOrNumberAtEdgeOfPopupChars(key); + shouldDrawIcon = isNonMicLatinF1KeyOrNumberAtEdgeOfPopupChars(key); } if (key.icon != null && shouldDrawIcon) { // Special handing for the upper-right number hint icons @@ -943,7 +943,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx if (key == null) return; // Should not draw number hint icons - if (key.icon != null && !isCommaKeyLabelOrNumberAtEdgeOfPopupChars(key)) { + if (key.icon != null && !isNonMicLatinF1KeyOrNumberAtEdgeOfPopupChars(key)) { mPreviewText.setCompoundDrawables(null, null, null, key.iconPreview != null ? key.iconPreview : key.icon); mPreviewText.setText(null); @@ -1226,12 +1226,13 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return false; } - private static boolean isCommaKeyLabelOrNumberAtEdgeOfPopupChars(Key key) { - return isNumberAtEdgeOfPopupChars(key) || isCommaKeyLabel(key); + private boolean isNonMicLatinF1KeyOrNumberAtEdgeOfPopupChars(Key key) { + return isNumberAtEdgeOfPopupChars(key) || isNonMicLatinF1Key(key); } - private static boolean isCommaKeyLabel(Key key) { - return ",".equals(key.label); + private boolean isNonMicLatinF1Key(Key key) { + return (mKeyboard instanceof LatinKeyboard) + && ((LatinKeyboard)mKeyboard).isF1Key(key) && key.label != null; } private static boolean isNumberAtEdgeOfPopupChars(Key key) { From 6e0998c94506051df3382458deb0428b2aa6f434 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Fri, 15 Oct 2010 15:26:51 -0700 Subject: [PATCH 070/287] Import revised translations DO NOT MERGE Change-Id: If56cd8acf3d73466ff904a707c4bb523dd5ab46d --- java/res/values-es/strings.xml | 4 ++-- java/res/values-fr/strings.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 21bcfc761..a95d37dcb 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -132,8 +132,8 @@ "Hay un diccionario disponible." "Habilitar comentarios de usuarios" "Ayuda a mejorar este editor de método de introducción de texto enviando estadísticas de uso e informes de error a Google." - "Tocar para corregir palabras" - "Para corregir palabras, toca las que hayas escrito." + "Tocar para corregir palabras" + "Tocar palabras introducidas para corregirlas" "Tema de teclado" "teclado" "voz" diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index c5ebf86a7..f8f4bac09 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -132,8 +132,8 @@ "Dictionnaire disponible" "Autoriser les commentaires des utilisateurs" "Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google." - "Toucher pour corriger" - "Toucher les mots saisis pour les corriger" + "Appuyer pour corriger les suggestions" + "Appuyer sur les mots saisis pour les corriger" "Thème du clavier" "clavier" "voix" From 86953d170d3a1c189628a373a5987cfc4c17c997 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Sun, 17 Oct 2010 05:33:57 +0900 Subject: [PATCH 071/287] DO NOT MERGE. Revise the setting hint visual and its handling code. This is a follow up change to I8b38e280. bug: 3084022 Change-Id: I1062763d87b4498e19598b4e7d99bb91c510c6d2 --- java/res/drawable-hdpi/hint_settings.9.png | Bin 236 -> 226 bytes java/res/drawable-mdpi/hint_settings.9.png | Bin 222 -> 202 bytes .../inputmethod/latin/LatinKeyboard.java | 42 +++++++++--------- .../latin/LatinKeyboardBaseView.java | 13 ++++-- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/java/res/drawable-hdpi/hint_settings.9.png b/java/res/drawable-hdpi/hint_settings.9.png index 85c183a61728680e7cb9f9291c791606a498d2a6..b5ec003e655b5cd6de5ca98e10bbf849aed0fe37 100644 GIT binary patch delta 157 zcmaFE_=s_WIF}^{8v_GF$&ZSniHaI-EuJopAr-gY+%)7mpuoc#5L|UcZgcq-rC2MG zm_-Wj^&g4IGX@H6y*6oP#|ze|xgKjL^Uf3%fPx8o=0uk)-n(J@#C}n`ERUC)|J+I3 z*Vh07Do?AfR~P)}wmhX~IFF5y@n>AVHoxVkvlT273^R6Ld8qka!U5pU0f9|C2 z>uUf3m8Uz-7k~K2b@PHvjp8epSr+y^bT)`D%@o^78e6FY-UpJ;3nt XimYv@cKSP@{S2P2elF{rm=c-*_mVz0 delta 192 zcmX@bc#l!BGr-TCmrII^fq{Y7)59eQNGk%dE(aTsR8V6QnW(5y-{9%u7*cWT&2&eu z0}2AnzAuG;|6hNDtx80H1Ts)&lPz5!Mxz8dEaHj3tzA0#9rondr!EJUFh;Bl>(ru ntow^5tNd2-YUixw7BgVb Date: Tue, 12 Oct 2010 15:02:44 +0900 Subject: [PATCH 072/287] 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<aoR%S&Ve9#1`xWns!xI5L<|kIjdGLTi+tczAIMb5o{hoxvNj;qVhC> z5XftQu)%#qmV#vk6;qwvvMjTMRhp(y6a|!JIaCf_f9f<4oO7j33#v==J>5@G2_c@rE+|zo2B!)g%uHl?F>&}m#)HQ=0I#>UZ?C&R+k*AuVw<%N z#3B#^ArPez2!RmDGaz9Y!u#)}?TBB-xiy%f#EihqfnH>?7tNM&CV9KorN%LINltGZn1j z$R}Q-K1_Ws`!M!NWTZ2d`T-DzTaxa7ORQa%%Tg0haF@ws*qyNFmvbd2B8nnPatI;R z267*v&A-_mVDMgVmIhE#KcAxm84kpOB;$WhBM!uYY#E+uvejzQm+Nc#e0D|=7l)RA z$Ir({`hIsuola+U9qC=qx?gW@RN9}-W|VXZV-uMQg@QVNyS-gmHfkgY0vZm7>dXlw zpU+dZTHW2WCXGU)kAUzpU zt0yN^E|*{CD!xy?j8KEYfXY%Uh*qpYaOZ{80JNd+2jK&0Vx!TBd2%85 zM<8JH@>11KFryd-dm|(xY9So|qYGa=a@BtrGeNHhC`Fg34_ z2SRa8!wiJ%YpuT@Rva5-GJ}MF(Vv4G$Wku5>X%dK)#P%{o>^z-T&9qfX=!I}eq!e% zu`0Pa`x==Jr>$V>e{=MYtx*eaBTjX->X$Rs!J_d+bn@8|G z79CVheRez-w)$g*?kb+g;*tKEc5wQpBO%awfNVxk(<>acT8$cw#@0VHGihrCqu1+E vzu#Y7Hi2Z(N5n37{JlZ-cZN;lw*UhGH1u&6D+t5n00000NkvXXu0mjfX+TN^ delta 736 zcmV<60w4YO1&;=h7YalO1^@s6!$f9nks&C5u}MThRCwC#n(a>FKoo}0Kno}!$qIg8 zpAQez>2%iTQQm`9_xs(QD*Ln9jFN6);$)^mp`gw`?(f&8wTd{7L&M=vojHNz z^LeUPtJ}NQWHM1|e0Fp9Kf`rh^~1uptwHc199$s$4i^XP(oI{NK9ts&&*#+bc4<5w z(_*op2%6F zMqps`>Pq!aa3dcEYa=BiYat!~qX^fmg$|Ca*7dcDkKx-}HqtLt zLF>_MHdV@nDo_Kd7ju~@h<;^%d41igMPUsRr`OsEL@ZM=6O!FQJaoT|l-V7Gse2tB z2>Cq?GZ2d3YyEw(;@Du59>n#3{v6yumUhMKemSMyfL$ioGaKxj+Z2lBT7fgSIEfb{ zzLea8J;bK{*;df)e{+nF$gG7Y5`r*U1ljK$E29WEMOaq#2)oSov;i?7hXEo&>j>`0 zVh5GeK0EFU$NFQ1-BsL=#V!4i?cnrXM?zrh0k&yDb&qh=YBg#!8j*iXX3|y!qu1+E zzu#Y<)`4U(MoiW+AO^&MWM?4r8bu6<0XYy5YZ>(-qG9{eUM$SM)rUvl1sDKD(R460 Scd&>60000k7RCwC#nOkoYITXkL_Dm)TQOP2j zwg{;b;-cM!2OfFZewgKR!H0n-;0-~=1E{E6OVuW6+U#^@Z0|XCCM{|bIu#S#GHzWf zGj4o-KG*R8~dCtX}!UBy3t zYin3uTJk0ea8%m*_6<*;Ji+GX=INr=zYibUw4Wr29ZMBZjKmNVgfaYU|Ij>vD2nX( z_|c;iUo%l7N+}Em13Q)l!T>CkkgiMqEXAmHa`lr|grN;`5rQDV!otGoO)HLLs|~lH zC;?)m0rJow6x5~dQo8FbydnsdY8o|vbY|?x8_Tkt8boVtdl?Y92?t z3M>pS$(l$Lh4hd+kQzl7opxBRNd;**tt>9hq!=S$GZCmo5{*kCb%le$I+D0c>m~%# zM(gq&gkgKMv214A_Gxm>AA~sAgn}A5Z!IL@p z{vt(OvnG|LPMZdvfG`Q0Ec-^SF40+hjl1_Ef~b?0+?1<}Av#MTUcY>ccNVImsw-VC2C~6Ny4Dj z%Ixkp8e*ae^1aJ#g-;*M_adLTuIPqeqZ)wlso!;O>>sX(GO|9XHkoHR%HUoVTM8fKWx0aPbT&pE7vr^ z2&sai6bSeC1*xhLp zz-@f|P$$?PMXijqqMSywCmL~r@U}Z!>+5~m@f5wCzfo`2DaT0qoS@t7VSjJeY9pg8 zZ%Y+z{4p)-CpP$~vD2rt+Xwrx%@tyl$=Q^+XQ{Sx9Ee9gl7GK2d2y&AQ{f=QIQqNY zx6z7697V0OfQS;0SDZY5vf#@mlNX$19E*GKJHUmhHZQjN~d-{ldSK?O8Ha&VDYOeI8}XSv6AV?AJ^> zNA<{0iuuS<{ot3gPm$?Dy;d;i!9PwDwN6y)=Mm&$zp<(`;+sZ(yv*u9kgIwbnC5MdZv*(QQcD)ZazHaeZo z4V4;NcUGirsX0?;ApNu99V^N3@MG;n3R<3SZNs>5i z_yt7`5Hk&shek?Jm#$0cue0!)AarJbXf!anbt7*q%XVcDV~p!{Kolk7$a%XFy1fLk`T^CjStmz7rTKwHE#6t33#6wxCgXpw^ZFT?*pJwF zXb46)&7`Lm!$XZ$vOgf}p5r0s}$yTI=j5D2_{HQe{cY_0T|Oa#gE-5#Gu6WimC+ej}WH8D+|KHB#y9 z*Dg9o4aiTb`N&!Q5SFu-$aJe-E7+UhA6JQ57pnD}2y(mMST!1d2~8tGX7%^T)x4f= zKpK#{0U}EC2*0}*TydCf}R3*+PYBeAYNCR?n8mEXxBMnFcaz{Ya`QovxK%|20 mgVtgsm$RCwC#noX{PFc8NF#IJY@7cRYm z7jfyaTzV0&;L?Rl4`5>AN0jG~_kWpJ3Z;aW4{6dAFlFY)%(O5gk^2_^c6S2em?9y} z2au~4gw&DNgEXxL9%F?180llA2dS?`x{J%@k~W(SEf$N^4$2+JPNFsl{ze?59gjzU z+HSXWI2?+tTD#qjX0sW+Ua#c*{eCAMAg&-J40;%bN#`~g4Cs2j(t5p4P0?CpI-Sz( zc1u72p~Cn80R%dOux^E2iyo&S#q@?(v5Uh@!?uhhFr<4TuXxJEaC$ME0y}2 z6^M)lbl)KI9P)8&9qcNA1abMfkZxyDde>?ih+O7>ngU|l zggdj3bU)aex*?Vh_B6D(P18HFkf+A1$^K@zj{pe_Xjrb83U;ujTTC3^L RyR-lR002ovPDHLkV1hSvL<;}_ delta 700 zcmV;t0z>`U1?vTn7YalO1^@s6!$f9nks&C5jY&j7RCwC#noEwtFbqK55`N+qELd^{ zF2a&yvE(9Lfh7x;8~_Q4kD!dJ@yL_9O;a`LheV3f7Pa=nc9Pl!aNm;O?oL3GfMUXY z0J&;W3_WQ9q-`zo7$Xp3B*aJnX|5^h;&Qo!&1M6O#UitUVy9y#Q5!{nBOOya9*?kp z-EQGGnM|E z6$p<7>b^nvImxGE>tNRbIEc&FRvkoI97|io)SbT<=g73ONN+&O05t(pS*r;UC$m=DK>D3U39i*P5I)U+wFShq z2=`_k>3^`dbwR8g>_tGnK&11qAa)@}lCEsyP1A3r!vxoA`(CTc8(Uo#$|CG}GEl&$R~*IZur5#e!qv)>6E=q0_k82U(f}R01`j~NB{{S0i=~DdlYFyC~V{! i-HZL`Wz2MZ1Q-CRep7YaED1^@s6boh93ks&C5PDw;TRCwC#n#+pnKoEvYjgA*^1Yy*r zE)*9d_yqGJvz*6r>5I5=A-EA&vv4JX3pa{*8}*#O4<$|8xoHwJo)k3EKvMOks=7MW ziJi}9@>625m{9OnPfR)QnGP@*va%q6{JMRdon_;e>$DSV2}Wo zHJ1^O$Hjmo5(!$b*Yx@Md3A}_BbiKww%e@$VF(o_2oQ$g0T9^cIJ5w<-|xlEV6+V6 zw^wxD0049!4hL~`48l3U#xn??3&JCR0DvwWp$|uk74z9JgW&wYQ4KM#lYO(<&~P}U z#bO~Mp-?DLyWOTrrE;amOs^J14kMjcybP`7a!LJupYr*@ItcLtZ4$X z;Q)2AqIf6>7dLnYNiGZW67{TFtvUjU+a;r)7y%-9<01Y9psm353(m-US24bN?mO~SbAhOn+c-vW%Rpr!xu@ges2)G!JXL=87|?t8r+O(v7;%XA>WQ2v29cuEfiRlgb5$sYj*0PcSv UyOqQ((*OVf07*qoM6N<$f?kfF1ONa4 delta 916 zcmV;F18e-O2f_!C7YalO1^@s6!$f9nks&C5WJyFpRCwC#noVo+KoG|#X{=R2g@Ua| zJt#d?@Ducl^ytU(*e~M6gW#p~l;?I9!*E;Z!42S`V2*jZT3?z<3SVXWG5Cak;NTbnz zpjN9zwOZ|91?8PUR67D*@kIbDtN&mypmw`W@9*#aK;GWoD3{C8X0s8$x7)3l3=+e( zW-FgA=}DZE zGg%FPO(qjzEy(5M6FAsa02w5Vfh>e{imW6<@RPs0yW7h=_G;{SL3qtDMmC#u z4PaIrpni4~X9eNK4VFQW%L8$V^{i5<_yVzy1!I(RygD_wJv?Hb;=uC zSQc^9=Wkg=ZnmhEKeyje3{}3auXuFRC|5JM_R3Waw~BaJgDWVq4qgzxEW$Tp|5Qsf zQGv)MAyuD1AhN=8kR2=Uhv80YBNRnC87h!#$rmvc3yG_TsKNwxEmmGunA>k0GjX^U zTY`@sAo@N#m-JB;M-5hgZc)ei<%4XAbUID9x3>rF2TzNP$77*1U>HPgO~(bo?hFug zuu!enUZ?wn110^Jmlx6BQ{5;|5Y^pKx$ks3G#m~OFEgJx84v?vK&}cT5#RlqkNgdY q0r_hnJ~nc@b1Uk#!34vP00RIEp^KZ0{@YUk0000#o6d2&^)|<;*58OYma(dWTasYw*rZ&4Y>AItU;|K2m))v z#2^v_V!VLJXGJ~2Mr%*mo>tmG`wAXeVkM*;har38h}w!I9u-v1;O>utkoe$ZT4F_l z-AZ3`?`x-j0*Xu%fBya}niqc~4B8Z*5Apc%PuRG%iHN8eNEwYN9<78-kfe-%vb<76 zS`6V`1%~o~AbN|xUcJDhEkm`6N~Mm*KX35zj~D26pW*JEC*Y>yFmlIfq?H88@<U{_)_a9V$&~C-}_w^Azt39Rm^4rY~_B22eWcE3?i)MakziE5F zURRm1#Q!_}ul3O&JSyP*JcztHYjN_Rv`T?n@xHX4;LE8I7FH`82s?aEe%pFhkeO@j zvQR`d4DR9V> zo(eorGl-pc$t)PM7U4ltB3X^hY=xv%cq(t)XyT^xgGGrfsGJu>R{UB1g3d3JwdQqa z*d*3=Dlw&pjf+8hD#sXl}D(UvK_7%rY8vAQ!TK)5#4tXti>&qq}?RM z)E-Ipemd~PJ7sQvPbVR`@+N2!YAR_ZPZB6;r0k591`(L4r6tBE4VLXUiJ3)6OFSXR z9FXjNb~aeHsJq?nM_bg3{N+Q^6SZ0m)oK;K?@#WLMx$YkW*7lUZ%r=>MC8mM^?Du6 zW;6S|!Tr8L+1%X3&dv@hmCBHe773D;8~g)O`4biX f&EmN4d=Ov&E%;F~Lv|o)00000NkvXXu0mjfn!sPo delta 1239 zcmV;|1StFL34#ic7YalO1^@s6!$f9nks&C5q)9|URCwC#noDonI1tB&l>EpBZMNuZ zi*6U#6bK3w$hAO$A}G*n_Y>rpeyjABd(R8(C0`-C+e6R>DA0O~7C{=Pc4SK;cZST^ ziY(I)S#F$&HY3}y#QAalLk>j?D8A^kqbRHat$P>Ou)qaDL+9>VwY3FnYik2DC{=!4j76e%6ykg`u)n_#+uPf)x3@PQ$j;6VEH5uZ9LMIpQp!{Y znKeY;UeS9m>>rRqf|SyH?s*=xS}oYz+#I-spLOA-r6mZ0z<@AB8YaK>^b{6Cum}2N zy$6B_X@LlYY|AQ{AOz9vcFo1f=p@j8EWBckw}wj(dz@t?!5D4?qOc9H?F%IVTZb?V zjSXXia15~V48ot~^#~a)Jz;uUNDa~#;Grc(Lc(%rv{%L0R?P7zTXqSgou;6wo>Dw&k=S zQ&(k2p%`lv-hrc|pP>^B>OP7zG>!nP86N8MBT`sSj^{$z0BZYBtWD`f4^)-9Is^4b7+IGUU!*5Yu z!JGr10%)Qp5R-Rt77V-=p-Gb?SqvT7a!D(9DzEKqV$=ElqJ$Sz)(b2v`pmtc^Ye^a zv$`{^6Kgw>Na?}EMZZ1aaLJGJ$QU=KCu#T6fJnF`rIgk}fFy^1xr+iaY7$;3kGNni zf3VMOLY%-OQzwn1faV2~^}d`C7a>OU+*gS?JmLZoX_!)47d_W zORmV$t25VXZB`}Se%8L?$fU8icE;5|-Ra=he7C;HLhVpZ+Tem1%OiXt)+fUh4Z`gv zAtv@nviH-0$KEM_a(g-nL6tT^lTZ^$D|r$_aU(^KSZNT3nOItEe9~ave&d*#hqTxe zd~|?h@3WJ^yhYvVbk1#2&-0fLNl(;jHKZ-sDM79vh%*rsyvh9o4Rs}$WcU993;-nvZ!yF0Ey(}?002ovPDHLkV1n^x BUhe<^ diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png index 7dc59bf82268abee3656297857d3e43da52115e3..1ad746053df532f5b8fa9f87c5558456dc2bd725 100644 GIT binary patch delta 412 zcmV;N0b~B*1I+`F7YaED1^@s6boh93ks&C5Z%IT!RCwC#noW*_Fbsul2(V_)0pI{! zhcyRc$DI%dV8I?(BJrO#nL(-sn6iOMGqzNzLTd4smuE*{glBNh;i^Ey_0RFD`#kRf z`2GDll6wLT&?NK$xzZnZgjDAQa`gj=+Z0h5L>on@YJG}N z2!ufH1W~bSy~{}(Mf84(LS`or0wJ@1Q$r+=oLpS3Ji>MH2>yhj@=N8H6d@1-ArJ!j z%)rAwB3=bg(**N8E0L*bn(}irz_1HaRh5M3`(6Sm(YYCulMi)W?@O|Z@OshnJP5;3 z{#d0E4zWA3EQ7KvHyqkb(4CsaeVN_;t25TyIg*C}0|0FvxR`EDp!NU&002n`MNUMn GLSTY{0J&`d delta 432 zcmV;h0Z;zT1K|UZ7YalO1^@s6!$f9nks&C5gGod|RCwC#n>~($Fc5{uU_wpL0pI{! zCp8D6<4%YJP|yP<5j}eG0>nJkL`q*(}Q_j$=yGbm{hg zwW<|G5jl=SP1Ddgj%sWj!ywzXWj^=&eZjG+$nAEcs;a2(ds3y(i0diNxm@7gTdS^X z>bmaxVvI2*K!g%vVJ*wr4e!*ZR9oS0zv=*2tfYMNpD4tz9Dg%A}WJuqX??j zr}zXQ067yx#j5o#Cv6nb`z{L14iJEU!0c#<@W{@^)ygB2E*@dOVNiZiexV3J00Izz zd}grCJ|Z3kKOPSnhCzu;P1BU0tpSErkfJCgMBBC!NQutPxtx3`%W_?kS%lYvuIo|| z1oFo!jc|zFkt7M_dA{Jl1RbgtK&}F!%iOOvilF?$>;Sn4$gbCgUS2Qyuk!jEcGUGt afB^ucy}znl#Q2i{0000gISnhUs()qtQrSc%E91yMd>c%5u4X zgxPEci^aljWnZt?(C_z!!T0-JRNpWhB93EG>E3R)gTY|%va%}`>GgVWyWNEGc#Vb= zh%XopK_J*R8Vv!2wpqK@<#Kr#O~!IX_a5a9tM%=ds!9Su3{F=KKSH%YiR_u#F zP!V0+&<;D%J&;D8TuT)vK7*Z&QFBi1UJ2IYr)oZ9&YX z$U6qRsZXnQB+p7)6o}3qhZspMs#g@JJ`Hb(skZvv{r*%m8V`4<&!2;y^g|EmblZb6 zwkWn+mFmx0?+T*px7smcv)}Qph-*w%M-f$y-R7k#UiZPke>!}q{(@*y z!M7sv+3%mHU(<_B=#phioX2;6LrlAcxE3W__%%<5@v~STg;H+3%62({&_Ob0jQA*- z&R~mhA<7$4rOcHxh@9?11@O1cd|osN*}{RGwkR|L+-IqiP#|bSk|YAe`4j~UxfAzK z%v#CWBwrw0354MTtC$?rdG_n|3Wvi1&gU~6k4KSqqc%h#5Ng})HZ+@PP3Uww_KIva zo5!E``~3rir`$rNr}+m1*dj=`+lB3RtNx$r6OQ3<2$RVKTCLWT0-^R<^0Z3|olYm1 v&*!jOtzKNKGGCcSHltfMsLeOSUjhsONWch?bA^ne00000NkvXXu0mjfJXm?P literal 1643 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSs!3HD`yQJj;DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49rTIArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yc06!V;*iRM zRQ;gT;{4L0WMIUlDTAykuyQU+O)SYT3dzsUfrVl~Mt(_taYlZDf^)E`f^TASW*&$S zR`2U;<(XGpl9-pA>gi&u1T;Y}Gc(1?#n{Ev$;{Bn$=KM@(9p%r!pPCW*~rn+*wD?w z$F! zZ)O|zy)qDJQ&(hFSRt@|fy0zJZL<~f4rOWxvWl`VSjfWY8Qs3Z^DhYA~`#~-D5)dj*0WSSf{x)h?&r=Ao54-h9ZNe0!8kXoI^d|-(UR4d{zR@`r?9GS zwyd(+Z`tczH;$zgi%fia!&h!q&AKPsARBK0=i_P!9AHS@w zp71gDQ%-01k9GZ-+eNM~O5xuB?4?1S*y}|Br+ULL>S+sDc^vBzlvlkgnIoy^Qt7;E z%Faz}f|p}gFw~jNJb#)^G1_9nRk2pLhTl4+kGNTKJtnCzZ?tng==AQ$U*XMRNoFTS zIl`F|e;n{qW3Qa|w{HL8mnBWFzj8hQZ0Wr_@bzK=j;(j|#BaSd`%-0F>{_<_?(5UX zAAe*$6r8v3(&ay`j5&f!?!P}=w|{!Q|2MAV6*g@*bJ*tkJ@;jd|E*JaOSM&RI=9Yr z?;AO0^6NzJ8Lf@xRA5wrCAG;8N|SjLu2vgP-f#L>IDsLkh+|pIy44+^;@{KN&t;uc GLK6U%hk8c< diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png index 53fe9c97d4ab0b350bbefd61883ce63cc2a4e489..4e337fa0836e56404e74b1c9e250e9088dfc1794 100644 GIT binary patch delta 327 zcmV-N0l5Bw1Nj1w7YZi`1^@s6YKoe1ks&C58%ab#RCwC#n9UA@APmO~a`82s$N3b# z_4XP*gGW!^gmyr-!+>oj+SnzM^g>Aa@o)Jk0Q)rB>Ok$~Xe-AFa)SIXNZsidDca$QOB@**Xx#ZtG%TAK_9yw4Exw{6K zK}!BL2x%wC&m38NffbCq(o3I<8OS&?j!@S%8%QYb!yIXCE#+GRRB7d2K4LycRND6t ZU;xg=0|;54gFFBL002ovPDHLkV1jZTk?8;c delta 335 zcmV-V0kHo00)YdN7YZ&21^@s6O@+(3ks&C5BS}O-RCwC#n6VOrAPj~BviKU-u|9=w zZC}G@aCCALNP%mI0&Vp)X9l>-;&I{gPlAa6=PW$xK%C|1D2D_ltAG@c-Br`~J>0tv zq@-gU#}OXG@bOH=n{I6j^E`twh6JLjDrlMplv1Fz{tmJ%OE5&5t3?PA0HgzgUm$va zUBMEm@y-F`0iqX8K&;zfk@lj^`AB1o(VZc@b27DZTA z4WD}iZ7|x;@O(ZKeUpp1>|or6-C&B hh#f5h>A6n<1^|Pt_z)2Y(*FPe002ovPDHLkV1jx;lBECu diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png index 649ef9773b893b964913e1b3aae6d734bffa72df..fe18497d82a1c7d9c1138230ffdd14c24b59ecba 100644 GIT binary patch delta 496 zcmVBujy~_2?%lGKte@A;;q*zRht+{&fiSW;Z}Pi%cDOZ8-8GP;}N}H599F|-ELRqK*<0qFIod4eUt(Mz8bd|~g8`C%{T{w#ftg@`tU}Ha4x7%uuVcj2SQW2v%o0)g z!3vqk{K)hC=ge(JBwABO_(EoaFYm~3FbjLh(7A4ira96^4PhqOv|ZG_RCBYPYr;qy zb>!A+R!2xEv&slH$q_-y?1qNi2n}fx)|zUrhlcJaUt=Krd3Hj+k7R^uiDbE3QP%kn zzZ+f-?MbiNF4lnXAjI>CEg(GH^BvXM+LeE3 m@N{o3=_AW^#H;Ro2`~V<4SC2?3d=kI0000jT!HOLs z5oK9U!L8{vI08bfSP-ZJBz8SksoKPlAjjZEEX@MT8h`xrzyr|E;<^r;wjAklxUgh( zARWlVRkK(u@G+mmb2BhT~OAcw<$ zK^o^~T8ra262KKexCfG7E?_OFk)|ou>ou}0Ll}k_kH-jtK;}R}0HrTl0b$|*(^TVh zI$^urVmKUPG#W{m&1Qo*Nn~hL{wpAyF=;yM>v%*IMd3$D?SExWrkUy$I$`J~i%D<~pMAxV)CUHz9BJ+bP zBoX;>KA(Tj)GH!rbrqotNeQ~VC&EE0?1e(tzQLO2NEXGinP&3 z>Q=Kp!kILqitr{m!nicEq2YFfhAR@*Sk>GQ4S!zwYJ+wvb; r2hxGma&!&NS`g=fCxg*@zXcco-vxKlbE=MA00000NkvXXu0mjf2Y=@O diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png index 93f7d87c2b238061186cc2a4a93cda10a4ecb3a3..00aab3d5af5cb97ad0bf3989b2a6f027887a3b40 100644 GIT binary patch delta 759 zcmVfA_JbA>p^5S1 zhcPKXh>;kL#s{cx;CuLf@)iQoH2%ece6)qOz`8qgy)!KZ+l6)u8&~6`(>9rzJ7>>5 z=VoSsyJ>ve0CZP@Zi_>qAgwS!{33w(@bUFO%m`8ci)h?e&JoP^Gubt@S`9DO*P)bu zni+($K$QJ^iH2o&WBMSrx3;kHY2#)_s;jGLHk;5|X9ht^KuGs|<+}1{_?Q-iPK^8~ zRI614L4Y`puLsiYc3o%AR$43oyRjd52R&%&ckdnIh%Qq}7z%d`2n&U_XBLQy$WEloD~EXbD#X)g zp&MFS@)3p+PS2V+?W}+_|0d*gATu&TgLQWO;-ZiH%ihq!A{VSwJe13Un?oso@zYb2 zkr79;wyuB^V!QnaM~6Eol?;NA5JimrAD+0eA{y*LiJnHykjh9_$Jp6@AmWTjV{ezS zz4->MW?j;BjKhNpzVED|b#(5WUeBf>^jMsQIv+p;_a`eCo?ij9l4qwi-I>v8JHp$*JP8@R2nG=5LcLt$yp<&*o^R)ka9k;^EIbpc)B_^Yh}Ir z)ciq4it8HW3?wc7|F;2u&ua;L`?5VR!P>)8k|blt(J>&6MnjJM<=lYS%e~!W^ln|0 pcWCym!)f$!&UIw;>Wg0j3;^|4(za@KTp9oX002ovPDHLkV1g%tb3Fh6 delta 766 zcmV&^L zIcH=Cm`vk`2B1j=dMFNslC&w1;r98} zLZi_@5Cn+h_;w)ue&2QGe5J(#up9e={D3f1Q3$JDoE(3b7djSyrs|k`^jap(x!BAaG)k<-<}xQ6HmD(n5CG*9 zDzj&J{$d@=pL{%dT1RU;!Pbv&*xCJvIHK!R60U@s0>VO}?YRZwBC-?dV(kE{Z$rF% z6}q8?1s`D;;q#q|&(HgKyy#t7Smc6Q-9xn+xH*)65kEUM zIT>*@YwHR)A$GgZaCoqdO2r@u2~ot@`|XJv>!QIEDAChRGh{N7*D-eX0Ejpv(%9W$ zY_7jYr@bXNzz9ly4h(K$SK&hbgROb&08W<=P?%LpzjW<1bIj}3lq&0>G=gJ>f} zbRMDG5f}B&9Z-mM3t?pN0`3r-W4SiJfn0ImOfP*tnH- z@~QccjFi_kC>Tgq{OKjUv_MiCv9~YVixR9oEG0>jI*z7*v|24W_E!r7VlVf0kDGVv wviyfO1u_LP634Wll@yL<%i+RJ#s}mB^75%k z(-h)32Bnn#JxvqL^Q`UA0~|-2>$*?9q9`ECvTcw&&tV+LA0`3fd7g&B4f?(hNs>T7 z+qTdDDSKhlG|+V&48x!ecR*e_3W5Lxffk0Lo;N}8fqma=Pap`+5+LXi(nkneZvjG{ zKmY=g05Nk7HSMtglL!GEf8NqktMByhSlV{DMqucyo*LU5(jH;u2*KF%8IRbyY>!+W z8di>65gPN@vO{Bs~fi&SXLu)qBtIdp2cB7ZhV*dVVYnPjrgckzhBh545` zvRf)%4f5N|PwiboX3cr_LNjd_gi3$Y%(~)C6;HhlY3_pH0`ppzU#Q}-g)m`Qp`muu ztgIyZ8iHY6@pWD6P7iw;=}r$Jf*{aZsJ#hNmL)_{BoY=I1_#1aRi!t2$8TuhtnK!( jgG<34&s-eAF98Mspz#+8-DX;q00000NkvXXu0mjfEzrck delta 445 zcmV;u0Yd(Q1cn5V7YZ&21^@s6O@+(3ks&C5s7XXYRCwC#n9GfXFbswbgrOCB;Y<dXx<;c);v1DyL<%HhIA#tm|Vyu53Y zB!MW3Kq;kvkK+i_G-=!Q0LRhhy6#gi&vQuAbR8tiG8l&8he?2Vo~L2(1%2O#IF6w} zX`1K%l)bR7YiQdR`o7nOZ$Mtz3xWUyfffXTo>xKefnC>WPap`+5+LXi(nkneZw5l1 zKmY=g05Nk7HSIA2lL!GEe_qp4i{JF`SlYI`MqubH?i$-0(jH;u2*KF%5s%oqY>%8B z8di>+5gK#bvO{Bs-!yOfp%gt9ZoW!u-n| z*(?>$2Knvdr?w6uv*tW{pqaJ_LZ!cHW?gZlil^R&G&ezTfqAS;V^s0jLYOeD&``T+ zR#p;y4Z*OE_^PUOr-wa_bfG%88>-ETS9C|z+?5^vwzx4piVz+IZ9dU-kAq@rte~|HbO!xbL zold6{-EKEN28@yHPk>Y^#mQx}S;}NG)a`cZd_KRfanzeGmkaIpd%g(AfQbVH5b1Q9 za=9E83I#s*1-V|Ye1Y(HK^BVz&1N&&Y&KM>RH)r|9xWr8BA{R6>+0RuIJB3Pa% zw%u-NKA%&yTBUlu&I(VbQ|fd&tPbLT2ZA7bJX|<#imJ$JwW4ylOvPf6&ruhsk>zqp z`FviR*gp`_A*x3)NH4lgbPj3*-+RTfy+B0kzT;5ics#P2$R4$ZE-aNwuWJH9iwvS>8P!Dli}wh?P_%M??If;9 zP)wa^L3HbGYVxw^;yGS7Bmv_0BkFibsmf})H0lzCQY5LRiPSY-1si9vhVGiMm7ZwV zB&mp6e;;dKxg&KT?zhy4CBvvPezZoCF4k~eEWJHW+|iv>+IAWr#R7SYj|j>`)-P-H!J&n65DV z!cDsds)!hXI2;ZI?t?002ovPDHLkV1j+@E*<~? delta 652 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 T6{wb@00000NkvXXu0mjfZ=Kwx delta 481 zcmV<70UrL21d;@h7YZ&21^@s6O@+(3ks&C5v`IukRCwC#nC*>&FbswrNIMM!une1^ zuG1e~q$_lc{^Ogg;ey;Wp{6lcP9l;OA;Fsm$4;C8$h1CGKuHOOazwC^wu9^-i?il* zIzg6YptXL^&;GN-Qc68NcU=eP^BM9yp9i_!Zo|hoFtwn+edtk(q6m^Cfubm;ceMR~ zQQNiyH4biiDG&s}7RNCh4u^RV9K30o3BbUFf*=HH87R9sK@5PTM^FP{3=j(hr$-8g z#)i>hd4x_0_0Gq;;jbsCw(F;y9S(CR zO5e3ocv1S&7uNz|#mHL0`cA{U#7n0yUEIE!zVEc64V>~Ok0=UbmjTjK<6Gi4bDa1} z*04Pyv9I{F*z1VBTe|AYkloj(r+uZrtFj6`(@ - 47dip + + 0.250in + 0.020in + 0.270in + 0.0in 38dip 63dip 2dip - - 79.9dip - - -47dip + + 0.459in + + -0.270in diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index 5674ef628..d2cd6c7d1 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -19,18 +19,26 @@ --> - 72dip - 46dip - 0dip - 28sp - 16sp - 40dip + + 0.450in + 0.0in + 0.450in + 0.10in + + 0.720in - - 122.4dip - - -72dip + + 0.765in + + -0.450in + + 0.175in + 0.100in + 0.245in 0.0in + + 46dip + 0dip diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 1378be72c..2fa47ae52 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -19,26 +19,35 @@ --> - 54dip - 22dip + + 0.290in + 0.035in + 0.325in + 0.06in + + 0.464in + + + 0.553in + + -0.325in + + 0.13in + 0.083in + 0.236in + 0.000in + + -0.05in + 42dip 63dip 4dip 2.5in - 22sp - 14sp - 0dip - 80dip - - - 91.8dip - - -54dip + 22dip + 0.05in - - -0.06in 0.3in diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index c66290c62..66771c287 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" > - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/java/res/xml-xlarge/popup_smileys.xml b/java/res/xml-xlarge/popup_smileys.xml index cf30a2461..2cfcf741d 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" > diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml index cbb705835..f1aa86f39 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" > diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index c14c7fa0c..21a7ccb78 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" > - + - + mTextHeightCache = new HashMap(); + // Distance from horizontal center of the key, proportional to key label text height. + private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f; + private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H"; private final UIHandler mHandler = new UIHandler(); @@ -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(); From a2de8f0f835399dfd6c6732235839481a6bfb620 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Sun, 17 Oct 2010 14:19:39 +0900 Subject: [PATCH 073/287] Save default enter key attributes and restore these if needed Bug: 3103016 Change-Id: Id8128d5b685ac040afd2c248e1ad17e9aaf1fdf0 --- .../inputmethod/latin/LatinKeyboard.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 246df5fc4..31a9acc71 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -83,6 +83,12 @@ public class LatinKeyboard extends BaseKeyboard { private int mPrefLetterY; private int mPrefDistance; + // Default Enter key attributes + private final Drawable mDefaultEnterIcon; + private final Drawable mDefaultEnterPreview; + private final CharSequence mDefaultEnterLabel; + private final CharSequence mDefaultEnterText; + // TODO: generalize for any keyboardId private boolean mIsBlackSym; @@ -139,6 +145,15 @@ public class LatinKeyboard extends BaseKeyboard { mSpaceKeyIndex = indexOf(LatinIME.KEYCODE_SPACE); // TODO remove this initialization after cleanup mVerticalGap = super.getVerticalGap(); + if (mEnterKey != null) { + mDefaultEnterIcon = mEnterKey.icon; + mDefaultEnterPreview = mEnterKey.iconPreview; + mDefaultEnterLabel = mEnterKey.label; + mDefaultEnterText = mEnterKey.text; + } else { + mDefaultEnterIcon = mDefaultEnterPreview = null; + mDefaultEnterLabel = mDefaultEnterText = null; + } } @Override @@ -195,6 +210,12 @@ public class LatinKeyboard extends BaseKeyboard { case EditorInfo.IME_ACTION_SEND: resetKeyAttributes(mEnterKey, res.getText(R.string.label_send_key)); break; + default: + resetKeyAttributes(mEnterKey, mDefaultEnterLabel); + mEnterKey.text = mDefaultEnterText; + mEnterKey.icon = mDefaultEnterIcon; + mEnterKey.iconPreview = mDefaultEnterPreview; + break; } // Set the initial size of the preview icon setDefaultBounds(mEnterKey.iconPreview); From 3740a26c21ddbcfffd2ddccee3918810e026a6d4 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Sun, 17 Oct 2010 19:10:46 +0900 Subject: [PATCH 074/287] Showing popup preview only when IME is in foreground Bug: 3100922 Change-Id: Icd59fc3978dc1fccb523a368b0a7d4549fc2db78 --- .../android/inputmethod/latin/LatinIME.java | 4 +++ .../latin/LatinKeyboardBaseView.java | 34 +++++++++++++------ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 687870622..edda9e866 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -680,6 +680,7 @@ public class LatinIME extends InputMethodService // If we just entered a text field, maybe it has some old text that requires correction checkReCorrectionOnStart(); checkTutorial(attribute.privateImeOptions); + inputView.setForeground(true); if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); } @@ -731,6 +732,9 @@ public class LatinIME extends InputMethodService @Override public void onFinishInputView(boolean finishingInput) { super.onFinishInputView(finishingInput); + LatinKeyboardBaseView inputView = mKeyboardSwitcher.getInputView(); + if (inputView != null) + inputView.setForeground(false); // Remove penging messages related to update suggestions mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 660fe0ed0..872b4d245 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -43,6 +43,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup.LayoutParams; +import android.view.WindowManager; import android.widget.PopupWindow; import android.widget.TextView; @@ -184,6 +185,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private int mKeyboardVerticalGap; // Key preview popup + private boolean mInForeground; private TextView mPreviewText; private PopupWindow mPreviewPopup; private int mPreviewTextSizeLarge; @@ -573,7 +575,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx /** * Attaches a keyboard to this view. The keyboard can be switched at any time and the * view will re-layout itself to accommodate the keyboard. - * @see Keyboard + * @see BaseKeyboard * @see #getKeyboard() * @param keyboard the keyboard to display in this view */ @@ -603,7 +605,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx /** * Returns the current keyboard being displayed by this view. * @return the currently attached keyboard - * @see #setKeyboard(Keyboard) + * @see #setKeyboard(BaseKeyboard) */ public BaseKeyboard getKeyboard() { return mKeyboard; @@ -918,6 +920,10 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mDirtyRect.setEmpty(); } + public void setForeground(boolean foreground) { + mInForeground = foreground; + } + // TODO: clean up this method. private void dismissKeyPreview() { for (PointerTracker tracker : mPointerTrackers) @@ -951,7 +957,10 @@ 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) + // If keyIndex is invalid or IME is already closed, we must not show key preview. + // Trying to show preview PopupWindow while root window is closed causes + // WindowManager.BadTokenException. + if (key == null || !mInForeground) return; // Should not draw number hint icons if (key.icon != null && key.label == null) { @@ -1012,13 +1021,18 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx popupPreviewY += popupHeight; } - if (mPreviewPopup.isShowing()) { - mPreviewPopup.update(popupPreviewX, popupPreviewY, popupWidth, popupHeight); - } else { - mPreviewPopup.setWidth(popupWidth); - mPreviewPopup.setHeight(popupHeight); - mPreviewPopup.showAtLocation(mMiniKeyboardParent, Gravity.NO_GRAVITY, - popupPreviewX, popupPreviewY); + try { + if (mPreviewPopup.isShowing()) { + mPreviewPopup.update(popupPreviewX, popupPreviewY, popupWidth, popupHeight); + } else { + mPreviewPopup.setWidth(popupWidth); + mPreviewPopup.setHeight(popupHeight); + mPreviewPopup.showAtLocation(mMiniKeyboardParent, Gravity.NO_GRAVITY, + popupPreviewX, popupPreviewY); + } + } catch (WindowManager.BadTokenException e) { + // Swallow the exception which will be happened when IME is already closed. + Log.w(TAG, "LatinIME is already closed when tried showing key preview."); } // Record popup preview position to display mini-keyboard later at the same positon mPopupPreviewDisplayedY = popupPreviewY; From 2348ca0e769b3f8027f581426d9de1b401c58145 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Sun, 17 Oct 2010 20:46:01 +0900 Subject: [PATCH 075/287] Cleanup LatinKeyboard and LatinKeyboard.LatinKey classes Change-Id: I4c5a37315dea1c7545b77a8a6c93b930927a5a82 --- .../inputmethod/latin/BaseKeyboard.java | 13 ++++--- .../inputmethod/latin/LatinKeyboard.java | 39 ++++++------------- 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index 0327006c9..bad1544e5 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -150,9 +150,9 @@ public class BaseKeyboard { /** The keyboard mode for this row */ public int mode; - private BaseKeyboard parent; + private final BaseKeyboard parent; - public Row(BaseKeyboard parent) { + private Row(BaseKeyboard parent) { this.parent = parent; } @@ -232,7 +232,7 @@ public class BaseKeyboard { /** Whether this is a modifier key, such as Shift or Alt */ public boolean modifier; /** The BaseKeyboard that this key belongs to */ - private BaseKeyboard keyboard; + protected final BaseKeyboard keyboard; /** * If this key pops up a mini keyboard, this is the resource id for the XML layout for that * keyboard. @@ -361,7 +361,7 @@ public class BaseKeyboard { } } - int[] parseCSV(String value) { + private int[] parseCSV(String value) { int count = 0; int lastIndex = 0; if (value.length() > 0) { @@ -413,8 +413,11 @@ public class BaseKeyboard { * @return the square of the distance of the point from the center of the key */ public int squaredDistanceFrom(int x, int y) { + // We should count vertical gap between rows to calculate the center of this Key. + // TODO: We should re-think how we define the center of the key. + final int verticalGap = keyboard.getVerticalGap(); int xDist = this.x + width / 2 - x; - int yDist = this.y + height / 2 - y; + int yDist = this.y + (height + verticalGap) / 2 - y; return xDist * xDist + yDist * yDist; } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 31a9acc71..3ca85c5d0 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -92,10 +92,6 @@ 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; @@ -143,8 +139,7 @@ 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(); + if (mEnterKey != null) { mDefaultEnterIcon = mEnterKey.icon; mDefaultEnterPreview = mEnterKey.iconPreview; @@ -280,7 +275,7 @@ public class LatinKeyboard extends BaseKeyboard { return mIsAlphaKeyboard && isShifted() && !isShiftLocked(); } - /* package */ boolean isAlphaKeyboard() { + public boolean isAlphaKeyboard() { return mIsAlphaKeyboard; } @@ -521,12 +516,12 @@ public class LatinKeyboard extends BaseKeyboard { return mCurrentlyInSpace; } - void setPreferredLetters(int[] frequencies) { + public void setPreferredLetters(int[] frequencies) { mPrefLetterFrequencies = frequencies; mPrefLetter = 0; } - void keyReleased() { + public void keyReleased() { mCurrentlyInSpace = false; mSpaceDragLastDiff = 0; mPrefLetter = 0; @@ -542,10 +537,9 @@ public class LatinKeyboard extends BaseKeyboard { * Does the magic of locking the touch gesture into the spacebar when * switching input languages. */ - boolean isInside(LatinKey key, int x, int y) { + public boolean isInside(LatinKey key, int x, int y) { final int code = key.codes[0]; - if (code == KEYCODE_SHIFT || - code == KEYCODE_DELETE) { + if (code == KEYCODE_SHIFT || code == KEYCODE_DELETE) { y -= key.height / 10; if (code == KEYCODE_SHIFT) x += key.width / 6; if (code == KEYCODE_DELETE) x -= key.width / 6; @@ -689,8 +683,7 @@ public class LatinKeyboard extends BaseKeyboard { return textSize; } - // TODO LatinKey could be static class - class LatinKey extends BaseKeyboard.Key { + public static class LatinKey extends BaseKeyboard.Key { // functional normal state (with properties) private final int[] KEY_STATE_FUNCTIONAL_NORMAL = { @@ -738,13 +731,12 @@ 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); + boolean result = (keyboard instanceof LatinKeyboard) + && ((LatinKeyboard)keyboard).isInside(this, x, y); return result; } - boolean isInsideSuper(int x, int y) { + private boolean isInsideSuper(int x, int y) { return super.isInside(x, y); } @@ -759,15 +751,6 @@ 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; - } } /** @@ -775,7 +758,7 @@ public class LatinKeyboard extends BaseKeyboard { * languages by swiping the spacebar. It draws the current, previous and * next languages and moves them by the delta of touch movement on the spacebar. */ - class SlidingLocaleDrawable extends Drawable { + private class SlidingLocaleDrawable extends Drawable { private final int mWidth; private final int mHeight; From b0a6f354aca8f643766719c663297e7be3fc6424 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 18 Oct 2010 19:45:01 +0900 Subject: [PATCH 076/287] DO NOT MERGE. Add '...' (hint) to period/smiley keys which triggers mini popup by long-press. bug: 3105185 Change-Id: I901e36aa12dad5968ba1a420fff6a2f2efb16da5 --- .../{hint_settings.9.png => hint_popup.9.png} | Bin .../{hint_settings.9.png => hint_popup.9.png} | Bin java/res/xml-da/kbd_qwerty.xml | 12 ++++++++ java/res/xml-da/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml-de/kbd_qwerty.xml | 12 ++++++++ java/res/xml-de/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml-fr/kbd_qwerty.xml | 12 ++++++++ java/res/xml-fr/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml-iw/kbd_qwerty.xml | 12 ++++++++ java/res/xml-iw/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml-nb/kbd_qwerty.xml | 12 ++++++++ java/res/xml-nb/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml-ru/kbd_qwerty.xml | 12 ++++++++ java/res/xml-ru/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml-sr/kbd_qwerty.xml | 12 ++++++++ java/res/xml-sr/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml-sv/kbd_qwerty.xml | 12 ++++++++ java/res/xml-sv/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml/kbd_qwerty.xml | 12 ++++++++ java/res/xml/kbd_qwerty_black.xml | 12 ++++++++ java/res/xml/kbd_symbols.xml | 2 ++ java/res/xml/kbd_symbols_black.xml | 2 ++ .../inputmethod/latin/LatinKeyboard.java | 16 ++++++---- .../latin/LatinKeyboardBaseView.java | 28 ++++++++++-------- 24 files changed, 245 insertions(+), 19 deletions(-) rename java/res/drawable-hdpi/{hint_settings.9.png => hint_popup.9.png} (100%) rename java/res/drawable-mdpi/{hint_settings.9.png => hint_popup.9.png} (100%) diff --git a/java/res/drawable-hdpi/hint_settings.9.png b/java/res/drawable-hdpi/hint_popup.9.png similarity index 100% rename from java/res/drawable-hdpi/hint_settings.9.png rename to java/res/drawable-hdpi/hint_popup.9.png diff --git a/java/res/drawable-mdpi/hint_settings.9.png b/java/res/drawable-mdpi/hint_popup.9.png similarity index 100% rename from java/res/drawable-mdpi/hint_settings.9.png rename to java/res/drawable-mdpi/hint_popup.9.png diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index 70eab096d..b7b1b1769 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -187,6 +187,7 @@ android:isModifier="true" /> @@ -296,6 +301,7 @@ android:keyWidth="20%p" /> @@ -455,6 +466,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> @@ -275,6 +280,7 @@ android:keyWidth="20%p" /> @@ -434,6 +445,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> @@ -276,6 +281,7 @@ android:keyWidth="20%p" /> @@ -435,6 +446,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> @@ -234,6 +239,7 @@ android:keyWidth="20%p" /> @@ -393,6 +404,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> @@ -296,6 +301,7 @@ android:keyWidth="20%p" /> @@ -455,6 +466,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> @@ -274,6 +279,7 @@ android:keyWidth="20%p" /> @@ -433,6 +444,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> @@ -267,6 +272,7 @@ android:keyWidth="20%p" /> @@ -426,6 +437,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> @@ -298,6 +303,7 @@ android:keyWidth="20%p" /> @@ -457,6 +468,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> @@ -270,6 +275,7 @@ android:keyWidth="20%p" /> @@ -424,6 +435,7 @@ android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> Date: Mon, 18 Oct 2010 21:10:11 +0900 Subject: [PATCH 077/287] Disable gesture detector on mini-keyboard Gesture detector, for closing keyboard by swiping down, must be disabled not only when mini-keyboard is on the screen, but also in the mini-keyboard itself. Bug: 3105595 Change-Id: I548501f7117ca2310943cabb678c1e250e5012ce --- .../android/inputmethod/latin/LatinKeyboardBaseView.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 872b4d245..b02780bf6 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -226,7 +226,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx protected KeyDetector mKeyDetector = new ProximityKeyDetector(); // Swipe gesture detector - private final GestureDetector mGestureDetector; + private GestureDetector mGestureDetector; private final SwipeTracker mSwipeTracker = new SwipeTracker(); private final int mSwipeThreshold; private final boolean mDisambiguateSwipe; @@ -1132,6 +1132,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx }); // Override default ProximityKeyDetector. miniKeyboard.mKeyDetector = new MiniKeyboardKeyDetector(mMiniKeyboardSlideAllowance); + // Remove gesture detector on mini-keyboard + miniKeyboard.mGestureDetector = null; BaseKeyboard keyboard; if (popupKey.popupCharacters != null) { @@ -1304,8 +1306,9 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Track the last few movements to look for spurious swipes. mSwipeTracker.addMovement(me); - // We must disable gesture detector while mini-keyboard is on the screen. - if (mMiniKeyboard == null && mGestureDetector.onTouchEvent(me)) { + // Gesture detector must be enabled only when mini-keyboard is not on the screen. + if (mMiniKeyboard == null + && mGestureDetector != null && mGestureDetector.onTouchEvent(me)) { dismissKeyPreview(); mHandler.cancelKeyTimers(); return true; From 58bfa350726c6a9b6b41e44e0313a2a366dab3d2 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 19 Oct 2010 17:08:54 +0900 Subject: [PATCH 078/287] Update xlarge drawable of Keyboard Bug: 3109804 Change-Id: I316f9cfcec377a7d0ea1417e1e3cea55cbdb9e2b --- .../btn_keyboard_key_dark_normal_holo.9.png | Bin 0 -> 1327 bytes ...tn_keyboard_key_dark_normal_off_holo.9.png | Bin 0 -> 1389 bytes ...btn_keyboard_key_dark_normal_on_holo.9.png | Bin 0 -> 1408 bytes .../btn_keyboard_key_dark_pressed_holo.9.png | Bin 0 -> 1321 bytes ...n_keyboard_key_dark_pressed_off_holo.9.png | Bin 0 -> 1388 bytes ...tn_keyboard_key_dark_pressed_on_holo.9.png | Bin 0 -> 1399 bytes .../btn_keyboard_key_gingerbread.xml | 43 +++++++ .../btn_keyboard_key_light_normal_holo.9.png | Bin 0 -> 1321 bytes .../btn_keyboard_key_light_pressed_holo.9.png | Bin 0 -> 1324 bytes .../res/drawable-xlarge/key_hint_0_holo.9.png | Bin 0 -> 1426 bytes .../res/drawable-xlarge/key_hint_1_holo.9.png | Bin 0 -> 1298 bytes .../res/drawable-xlarge/key_hint_2_holo.9.png | Bin 0 -> 1443 bytes .../res/drawable-xlarge/key_hint_3_holo.9.png | Bin 0 -> 1457 bytes .../res/drawable-xlarge/key_hint_4_holo.9.png | Bin 0 -> 1412 bytes .../res/drawable-xlarge/key_hint_5_holo.9.png | Bin 0 -> 1427 bytes .../res/drawable-xlarge/key_hint_6_holo.9.png | Bin 0 -> 1442 bytes .../res/drawable-xlarge/key_hint_7_holo.9.png | Bin 0 -> 1409 bytes .../res/drawable-xlarge/key_hint_8_holo.9.png | Bin 0 -> 1478 bytes .../res/drawable-xlarge/key_hint_9_holo.9.png | Bin 0 -> 1443 bytes .../drawable-xlarge/key_hint_at_holo.9.png | Bin 0 -> 1594 bytes .../drawable-xlarge/key_hint_colon_holo.9.png | Bin 0 -> 1219 bytes .../drawable-xlarge/key_hint_comma_holo.9.png | Bin 0 -> 1192 bytes .../drawable-xlarge/key_hint_dash_holo.9.png | Bin 0 -> 1191 bytes .../drawable-xlarge/key_hint_equal_holo.9.png | Bin 0 -> 1292 bytes .../key_hint_exclamation_holo.9.png | Bin 0 -> 1278 bytes .../key_hint_larger_holo.9.png | Bin 0 -> 1317 bytes .../key_hint_parenclose_holo.9.png | Bin 0 -> 1316 bytes .../key_hint_parenopen_holo.9.png | Bin 0 -> 1323 bytes .../key_hint_period_holo.9.png | Bin 0 -> 1164 bytes .../drawable-xlarge/key_hint_plus_holo.9.png | Bin 0 -> 1340 bytes .../key_hint_question_holo.9.png | Bin 0 -> 1392 bytes .../drawable-xlarge/key_hint_quote_holo.9.png | Bin 0 -> 1257 bytes .../key_hint_semicolon_holo.9.png | Bin 0 -> 1248 bytes .../key_hint_simplequote_holo.9.png | Bin 0 -> 1204 bytes .../drawable-xlarge/key_hint_slash_holo.9.png | Bin 0 -> 1317 bytes .../key_hint_smaller_holo.9.png | Bin 0 -> 1326 bytes .../drawable-xlarge/key_hint_star_holo.9.png | Bin 0 -> 1344 bytes .../key_hint_underline_holo.9.png | Bin 0 -> 1158 bytes java/res/values-xlarge/dimens.xml | 3 +- java/res/values/dimens.xml | 1 + java/res/xml-da/kbd_qwerty.xml | 2 +- java/res/xml-da/kbd_qwerty_black.xml | 2 +- java/res/xml-de/kbd_qwerty.xml | 5 +- java/res/xml-de/kbd_qwerty_black.xml | 5 +- java/res/xml-fr/kbd_qwerty.xml | 2 +- java/res/xml-fr/kbd_qwerty_black.xml | 2 +- java/res/xml-iw/kbd_qwerty.xml | 11 +- java/res/xml-iw/kbd_qwerty_black.xml | 11 +- java/res/xml-nb/kbd_qwerty.xml | 2 +- java/res/xml-nb/kbd_qwerty_black.xml | 2 +- java/res/xml-ru/kbd_qwerty.xml | 4 +- java/res/xml-ru/kbd_qwerty_black.xml | 2 +- java/res/xml-sr/kbd_qwerty.xml | 2 +- java/res/xml-sr/kbd_qwerty_black.xml | 2 +- java/res/xml-sv/kbd_qwerty.xml | 2 +- java/res/xml-sv/kbd_qwerty_black.xml | 2 +- java/res/xml-xlarge/kbd_phone.xml | 80 ++++++++----- java/res/xml-xlarge/kbd_phone_symbols.xml | 78 +++++++----- java/res/xml-xlarge/kbd_popup_template.xml | 2 +- java/res/xml-xlarge/kbd_qwerty.xml | 112 +++++++++--------- java/res/xml-xlarge/kbd_symbols.xml | 10 +- java/res/xml-xlarge/kbd_symbols_shift.xml | 10 +- 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_template.xml | 2 +- java/res/xml/kbd_qwerty.xml | 5 +- java/res/xml/kbd_qwerty_black.xml | 5 +- 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 +- .../inputmethod/latin/BaseKeyboard.java | 47 +++++--- 74 files changed, 297 insertions(+), 175 deletions(-) create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_dark_normal_holo.9.png create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_dark_normal_off_holo.9.png create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_dark_normal_on_holo.9.png create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_holo.9.png create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_off_holo.9.png create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_on_holo.9.png create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_gingerbread.xml create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_light_normal_holo.9.png create mode 100644 java/res/drawable-xlarge/btn_keyboard_key_light_pressed_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_0_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_1_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_2_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_3_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_4_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_5_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_6_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_7_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_8_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_9_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_at_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_colon_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_comma_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_dash_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_equal_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_exclamation_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_larger_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_parenclose_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_parenopen_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_period_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_plus_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_question_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_quote_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_semicolon_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_simplequote_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_slash_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_smaller_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_star_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_underline_holo.9.png diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c23ff187830976462d56a01b509514cc9ea29dab GIT binary patch literal 1327 zcmbVMZA=?w9KQ}$9AlXkoZy_f9FjPt_tI;*_CkTu>q*sP1V}_jR<75laDjXAdf0;x zPzjMZYlh=a_&#ut6Mh$WcyTzCnUOZLMN67#(Evy&p~V3j zRm4uv48%m=^An&NLGqGvYn$07Jk3g)f{Qi=w-g<+5v01-(nYBom}ney%4!f>_-qVA zw%P#!nMu(XFINp$VOpfw|r zWScpD%@$k*u`bipS%OHX(|DT3HKUWD0)c?7;qka3!ky|!z%! zsI4f*wO%ubK~GmhP;^097gkeiiGnF3EKw&YoFo**j%x*-GMm9aZfuB7wf5yE*P^mfRNXKzq90`f#y+d4LLU zi~+Ak^-s)Y1aZWoT&UH$5?@+guFZQdbKrn$^q1Q5iN$X#iyd)?^XC`0*DX1ZfX9kH z&P&(jZ#`IEh-G$sbZ6-{UC>aF_vuVY>7DyZFLh5%O}&fEPdEJ@8?T%#a7~X5UWk1d zk1W1c@l@%)u>s+`1D!*A6N*34hOUUBos@q+#1LS0=( zyn0$$u=@HY#n8mii65Yr{z?YNu4c9AFR09U$KjEqLl@oQJu{E&9X@*I;-vItXW82w zzqbAH=R)lGb1$h67e6|4V~)P&QLW9h9|*5nv@g)RYxkkEv$M0si#O+sKl%DtJ~HVz zGICAl4|XJy$$h&@O7d}Tw|h7=hfMArdH)^fcg)h*z+dsRgUbV3$op?^`YJMUs_6A} zEYE%A#OUbvzEO7A{)I&&joiulj-kH+h?&oV literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_off_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e29de9a7f48892c2b74d58920274d79c2c815fd1 GIT binary patch literal 1389 zcmeAS@N?(olHy`uVBq!ia0vp^(m*WE!3HFMiJ9mDDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl+|140 z3=Pdq49txT%q$EIEu0NaT#QZKEG$f%4a^*!U}j*`>tbwfZf0oU;$m#x@^gm2**QVo82cNPd0}ECmE)IHi?JgIrW98(0$8qE)CGZ+{c z=X$z0hE&|T6LvPM*+C$#ep15~d8east^1tsJ8F1TeVkCekfrKn@{=3x9~3;QHJ`}- z;%kk`);*Zv>9J~~vA0s1r%q?4hUAP`w!80d|CLFfcKY+2H(4^r4{n-syHeJ^;ICo}$Hf`Q?{; zpZ7#xFZGmYt2TbQE3ahtUF+k8ES{5odH*R;Ri0|#IVt?~rdxp`SFibAHZhXmaoeO5 zzjlepX?-2B?k0}1E#?erljFSDwP4rS2JwroP+Y&EKPU!h6a>7ZW%FuW7{T#E6^N&7|cYk~3jqDSqKW`dT r;vc-ft!I;MzM@ug+uc2NED{W+KVQGh`YzH3DgZrQ{an^LB{Ts5hhgy1 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_on_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d46c03aa42e1cd1b15bb27f2e4324f241396fbe8 GIT binary patch literal 1408 zcmeAS@N?(olHy`uVBq!ia0vp^(m*WE!3HFMiJ9mDDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl+|140 z3=Pdq49txT%q$EIEu0NaT#QZKEG$f%4a^*!U}j*`>tbwfVrpn<;9_j-Vrb~%<^*K8 zni`oKIJ+5}Sem=R^m^tMmn7yTr^4*b1lkMHYvG1hua$FAYGO%#QAmD%4lD%(WaO9R z7iZ)bC^!e3D)=TQXXb(Upy+}4)+Mzlvn(~mttdZN0UW+onON+11G*2{-;Qo>E*6%K zjwX&4MwYGyrb>X+ZL^6S6%?O4bCnN5*JzWC&w z^MxCDWsG$6Ol0OyPKf?c{_)hZ6AFPhS{|%OjZBT{H#plSQ18Av-z9L*k*($z!rM2P z%(j|)E^=*{^~$i-3sz+%Oj@LIGiYT=l#W=Yjof;kFIN}#&TDN;w0ZLRXV0?Cg|(AY zC0~853ZAs&@4~5q|HWmFOEwm`H##oMWV)PK^^faWVom3H-cRA?>($RRwf6pJ-ke*# z&>+q~q5jULx|#obqIIRiw@Ib%yHc}WSV_;tRa#?R*?fodiynOOOo%X^>Xlj&`@K)b z?%E_XnRuJtPpd!a)yytY;wZJTy?^ZFjNU1iUOO#(AiF4$KXF-e)%M9&rmxLk=53eG zHIaHA;o9Ezcg2FpADPa#D;xEn%SD|tezx}hSx2EshxpcTvriD%X6VmwFmh3~R@1wp zoiVCn-5cwcJ^m4qwfxz8h1nL9xLXXQ?=6e1IF=XS$ay(0&Yp>f;k?v~x0n9kb_SJ+ Mp00i_>zopr0OZd6sQ>@~ literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..45ca3a7fc4f72093e86b61a571a4d50ab9d7914b GIT binary patch literal 1321 zcmbVMZA=?w9KVhY2!f6|8B?O?H8H->-d$g~_H2c=*Bdn}G_*!$nvCP_0d8&Y>h-W! zvSH_kMR6vOkoaMISmq0|B{RW=L^LA-HCbRv;wv*ig1VrKSqvY5LWa*li~E3n@RGad z?f3irU!Qv`)O4((?9nm=K`H``ObZ+zgYS{jV))Hf+01Y_s`^{iu-u`hIRzjdL2d_V zAi;Hl7QhLaS8o6pf)sU#kyf=ec%0_tgqhPZW-XC~Yy@%DYe|le0TpcroucH%?tV6b zp`zf%UbY8`VA2P=#Ks;4gnODId{2yb3RwLMs7s@vKmw>7swLu5iq_oNwk{3l`ZkWC z+YmM8#&(=)4TeyktN_$*CQLk0N1%12nY7v{imF8|1WDk81t%>glA^5^njp~pgF$PG z&_TB_Y~B`Jxv?%)P0~1?PN&Ujt65e$ank8@>KYb{2_j6XjHGg!NlFY7~B<>Qu#!|l;Ike#7Q%OClY#G+vt?q0{(GhPjo7hNdmkD zq~vaehxO<%7RWGn|7}PILT~71MTAA+;*899CxD~|7&it_%z`M;EJd*-N!bX>Lex1( z(%~a*jMdIM95x?O=kXRa_Tn;D%3Eji_!z5|AxVby!inE*p$H#qwK*xazzs+#m6Lc- zuq#5ld9F_RcP{Ny0H?}IM3&=)4hVJ0s+{VQlc+CjM}r(MO8Qza&rY-qP{h}Oz$$VA z-Oev9?qQ#W{@ow9hh-Uu)8nyu92Tdauw!|y@PBfKLuYWkIqqwg!WQg6eY)HFaIt%N zfCO)h04ef^FKh8eXuvvTo zJX?OPDBZCCfk9&#maY2a-sZZsq_L#v)1|}J_YPHm7n_@#8%BO#46U4;s{N&;a&hAI zZx*kKv0Sd=LiNJ+Gsnh)lat=1vxeRiy}b)F(P-2Sq1Gp#%WbU6%a^~u^Ym!x{)U|A zc6P>B)#3{Oxda+gLVxaD8NH>iOb+C%V!fCdR>XU`TkoKTM5hj<40ecewoV z>1^eTFHO(ho*UbpP8AtGCx0bbZt$0X0-JECxi!QKkxqO)Tz*!sjWLd;y-Mx-hCGd58$EbV01d0 zS+&nzy4ly)=Z?qY7jxy2@rg^Z;5!S&1IPjD5!3px~);2sPG(WE|}STuOW0^{_2b zRy0}SFo7k;g^e$2;=~V-C?Rp`KoFIe#Ti`;i{nkQfs1a*GI50!p8~~wAp77YchB4J z_xry-_fB=?iOlrF=?H>k+RE7)I39uTp}nc_8_m_K;E*p{opP<%CMxB}6C#VV}&0l)gYwLV*PVmn8UQ zLG+<R1yhEHct1|62;A$9$F+$L$Ti?UH+Dq_9AQ7e zYd}D3m0YkMjYSDE%-xd>#evWpx=IpYQTP^CbhUbcPqwip44$amf}7?jiX%x%OHgV; zZy-s7h19Yd9cM6TErgyaOK9xIWi?cpURwt78kQtkt_)7BIyFUDIE~gwaS5)?7m#_M z3nc6c(C#)@^F%IfkpM4?l0y_*5*<+8EXrb_S@ffpS{-WVU4k#Zj+bXES{6vc>%h%P zq8HuFFD>k1pM(BA9yh~rtii}ITE?I@S_vJt&2|5uoZ-+JJl-6SHA`X(c3^zE)B13+ zb9sOd-WUm9jlaN81qhPVYhxKl=tjf(#zv{4FLLf&)+c|K7EMI26=x?kB&Gh*alpKu zdJ(*^e^3!L@5y+tC>@LBejZzYs7WhNQ+%By#X!-{RP@)NUhszq^*W43=%Z?#}L7>Te^LTvbEsm8)xdi%N(dL80yOsKjsGRn0tDAdiGVky%dW*`aUvn{5ki` zvBJW_5Ac&$BAo^D$mHbYe7(5u_A`c1@51WcIj1uDfvU~L*yNnw9D_?42Zu+l l&ocsZ&ZFpm|ByM7gk;}a8NI#uwI}}nvso+I{<8YF{spii_iF$E literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_on_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..315ab17c07f381787750cf106c0e287e837def40 GIT binary patch literal 1399 zcmeAS@N?(olHy`uVBq!ia0vp^(m*WE!3HFMiJ9mDDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl+|140 z3=Pdq49txT%q$EIEu0NaT#QZKEG$f%4a^*!U}j*`>tbx~WM<-I;9_j-Vrb~%<^*K8 zni`oKIJ+5}Sem=R^m^tMmn7yTr^4*b1lkMH>*$78ua$FAYGO%#QAmD%4lD%(WaO9R z7iZ)bC^!e3D)=TQXXb(Upy+}4)+Mzlvn(~mttdZN0UW+onON+11G*2{-;Qo>E*6%K zjwX&4MwYGyrb#&2sytCUhTmDVd`Wp37?FZkY7mhrlA0=4?_q^b)cz1F6h6wMY zvmaP<+&dC?^;W>`3zx2>%;gNdyj0g@rK{Bj>zS&bYiHj)dCowQ#Yd~hutYc~$-Xm( z(OqhpIn_O|nv*YXuC9E1!k}!&vdmVyI^U1`pIDqbn7UDfpzbl_cEiVw?aqIJz*BTFQ1p2e98bAKHBQJ7V`O_1Nvdo^Ge^>YB z(@(Vv zmdKI;Vst E0H^u_hX4Qo literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/btn_keyboard_key_gingerbread.xml b/java/res/drawable-xlarge/btn_keyboard_key_gingerbread.xml new file mode 100644 index 000000000..3dab8430f --- /dev/null +++ b/java/res/drawable-xlarge/btn_keyboard_key_gingerbread.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/drawable-xlarge/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_light_normal_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c80a2ed6aa3a9977b420e4d3851cd4ffa6d28e GIT binary patch literal 1321 zcmeAS@N?(olHy`uVBq!ia0vp^(m*WE!3HFMiJ9mDDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl+|140 z3=Pdq49txT%q$EIEu0NaT#QZKEG$f%4a^*!U}j*`>tbwfVrpn%;bLs;Vrb~%<^*K8 zni`oKIJ+5}Sem=R^m^tMmn7yTr^4*b1lsFj3^d%;(HXB^E9aur#FG4?ko^1{SPBTp z$S=t+&d4uNa1J(A@J&q4%meX3(F5_VOKMSOS!#+~QGTuhIDD-#vDohhbRV+69o^hq zEG!)zO&l$ZEL{yum7sc4$O$ujpkwqwi32IIz=VJ)5X6KheIN&(c~bL$Ii?7hHFV2* zFEcPOMtZt9hE&|TGwq^Ri-Sm8dP%tB6yMC7d986rt(g_8+7z1ds(SXm(cL8QsgNmO z+u51rVt}e!- zY}V@a>FXoT{yHb5&2aworai6Sgm$eKeDr?975`PM>>PgIeSLiY2G%gwz&ovp6|yXh zo|9Z=q(ojj^?8r<_0m+|%h&eS>1@=$T3Y+`_dg8*sdMhKSCWsX=Pb{Z(muWE-AxnU z#E4nTSV{x>zb42X+x;U!;Pu@-^S1DtUHiw+V^$I*v0nY*G1)igZ&<(EG3{f<-op0_ z#X3u!6FS$u4x9J3=$7<$#F zYf<%wMcfkcU56gLImS@6F}HfH2G=p;J$LQ-q*nfvdBQWj+R20OX>RzT%@Z9vh00Rn c?3s8Nw(L87Fv(We2vm4^y85}Sb4q9e0L%i?N&o-= literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_light_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..90babfc876fa206f899bb940a1c8607fbe4e50dc GIT binary patch literal 1324 zcmbVMZ)h839KM***3M3=Yu9dmxLwf=ZE|dw$xO?cd^lKg;TR0=+UD}pPm&ofUu&H z0BA5R^n(Zx#NoYXfd@g%eNwDP?+NWaY@)B;h1bCut=qJ5AHAsEr^AoUq}f%|g-)Wn%~eEe{N; zX<{D};rOx^+-3EuvW`PJxW?0sRoJG#GR2VprNota+ zONxvdj6y;g(!Ch;bTx#u8Vaou%b9YbV9M~EpyH&Jz|(0Xt`&4fkAVN&SQnj%4XXf; zfQ&MvC1E}KS}MjccXt;ufY2LewyIgiZ;bc219P8O~6iqux(!o&_N0J=h0T%&>jVAm&Wp~qj#WpBsbU{vn zimn88%eGMKF1Czc1A?w-F+~}ybU=7O(Ur`AqN4t&0}TmDNjCOIc~+z4fF|t&BCjcF zbS1xxw2nRx{kt=6mghN_n`P~+%jOOc4y7rljysyAas)fjSgy4`+^k(5 zAj2D@!K-nkWkg00Q#{DAvD}Y|((sCJ8*w{sp>Fz z?7m5Jwtd6KH(F}3eB-CLOMg?=(S2j1@ez0jeH9I@|9`fs4_-60v)~nU^b5qZM z=i67(i$A=xqq%K=ao35^=;)VME?ru9`l-Uv^YM7x3!&8Z$BVa?l*P9XezWtFnhotm zb|HV>-`LMClx{8UUcC01vggF)Wb16fyTACRN!)bCGr##2x%uTs;dtHB;WVH2j251( zt$Gcds(JSqSX>|vV6Vz;e(Tjk-NdG!reCC^(P!M-&;7htRcrqF>xMZ#AHFBQkiT&7 z277P)BTeJuU(><;v~z~#5LepQE=zV^f>=Qlnub?V|Tti+C`%*P8`+Vdvl Xi1*wv?Ar^x@&5`2y13&VdtUe#q$16` literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_0_holo.9.png b/java/res/drawable-xlarge/key_hint_0_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..33b6b40f381c4aae06bae333ccf3cddee01cf112 GIT binary patch literal 1426 zcmbVMeM}o=7(d7OC_-Qubxzdt7$z{dkA861N`cbrNeyKP%|?U;uI&{Hv{&v9TZnN3 z_aWQN9K-OLtkbA7OIWk0!>B=5bi)Y(8q_7?24S0K5r>#XVbr%kaet8g;U#zP^SAf1i3aIn$I zR&ymBYinv4=CUCu!tOAaNoA%&jg@zzYzTvToo=8FLD{)pH*2lqB-p}LJ6u|1?vp_T zcG$GYZj}i)x%FI)qo7&fN}G$!*5*2^+J@xjz}a36AaHUL3wxdQE>YvvA}hQaAcu}I z1YUtiby{TAsWMYBtmg#|R-t&N70<%qECMAIN|GcqU^!0U7%s;Mc_u+>6mkuY!)p%$ ztO+)|ri5nJY=NB?sgWeN2E#la59(2%yiko1YPCAVA(v+YM5fr}l2~u1OH2tf(41%$ z9B#?MyWkKbYvCIuEdo4U4Z-O)nbwJ2;##6W$}lhM#t0P0oX${OD`-(F;r?@DL$qja za&uS-C-RMg71YC?5>^JeyT73j5O|~6DL6n;*m|0`Haa<%WTdqSxIt|Wn}#7th9F2K zPRj8tiXbRGp`;ZmhN6^uJWH1!=GaJ=R!{^ZS5ve?K@$Yc@&c>d*jwI3{9zZI;D=1s|~mcS<|)spPXU987$Ns_cTlR z2y|dbTyK4_SsxzG1tvxSqcJm*J_bP#Trko)v-gT+DHzO+NJ*L58x z&83vDHr1om`?tlmTMta&fxY_MPgydmE=<=xbGqeLFUc1@D_;Mm9DYSyxHqmAz}~wWp`0{d9Nn&fLYhsn5!XM@L<~9Ub2%bXfKC@y3IJJ^eo4RVZn| zGdGn?lINq|NUf--$Qc6;^qBi@tzwlOE@K~QL?}Lm)`0<6Ai^mfD3q?iyTfdv{#46Di z>T~z?i1EI@zANxQ*8+#`oT^*>W$D}(r756`}3<>{{_N!1-1YH literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_1_holo.9.png b/java/res/drawable-xlarge/key_hint_1_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..df47e7b7c9643d106393b1a9dcaf2ab9c6f52b59 GIT binary patch literal 1298 zcmbVMZEO=|9KSJ{1A}aY#7-cbH;GJb@1-x-UfPki*JFjX%(iMj81;62x?Z+>+1+*R z7SbWpOvNY(I+jQXFy{w@OAG;$;bg>&SY9;2DG`={At8}PXJilv#`)aVPCiUOc*))K zf1c<6`~BbVotEgl5&`R9C@o?ap)-E_FsIX~dPZk>fRh_)|(N zK*JK>24a9ub$1ql7eOl1Vj^iIBh8GUNH*TovE?Ndq7lTqC9m>AJ222z&?d@0Z06Ky z3>8y8>}6+!h^Rr35u1865bud5gr0W6lft$%qTW0M2_#_fXkO}&btdn_=6M+?o5whY z&Z`*hK5W6MWTXWRDjGnYHo__pE&_FtHq!2(Y5IATB1i%!D4e9MB+b|aEO$&71WTQ_3hA2*iN))U<-z+*sH zvYG(vk*+U;VebChkf{j0VRmRDEDGPjDneEQvJqx|7`(Bi#1zBPG)I!OgPV+vE2;{BFt{*&GiwOZfIb@`k7 zyx;WpwapIH>7O45>i((M?hSr?XZFyxv6GwZcYhFjpPidId;F2RqsPv^T2(##E)rUO zz} AYybcN literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_2_holo.9.png b/java/res/drawable-xlarge/key_hint_2_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bea76f3f28d7a48e66f3b14b369cbde6b0e5b948 GIT binary patch literal 1443 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6H!3HD+Ytl-Alw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#2IjQPkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 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=a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0_}z9wRFR)*UGslHL)bWC?r2W2bKZ?GV)9E zi!<^I6r6)i6?_wuGxI=vQ1n22>ylcOS(cjOR+OKs01jWPOf2@h0o{k}Z$~#b7Yj>A zM-xX2BTH8UQzfY06mr5$ALtl;P~t#JEHEKp3Is9XNgv38XP(qNV2&vQW{rD~SH5Im zV7%<<;uunK>q@Ah_hAQ-ecqG11a)3qSfG?K_pN`y2mO+13LZ@{~9ZhIUn3 zPbt&n+get1`bF5TknK*htnaVZFKScq-6(4F<5$(r-S6+!e!nX_J;>6+}VWA#rbs?Yx9pZZCQnZM3pTW8@>I_b}?MJ2PBs0*ZX%yN3e%u*tFK>wK< zzhL@QI}ba?3W>s-o5L0y_iW3Z>-YSa$ywn)4=V3zPw6h&`Nv0?v+Jc<$i$ZIx8DY< z$n_uhUwm;zn#8fhjS+j=&6zopr0DMvlIRF3v literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_3_holo.9.png b/java/res/drawable-xlarge/key_hint_3_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8f89d50507bf52deaa0f79cd3bc110453f788c GIT binary patch literal 1457 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6H!3HD+Ytl-Alw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#2IjQPkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 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=a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0_}zBHNdOa%DE^tu_V7JBtJg~mI4AY@=NlI zGx7@*oP$jjd=ry1^FVx1^gw*;l3J8mmYU*Ll%J~r4qvNGEcUwr-G}UNM>jVY3rj~w z6GsapOIHI^C8*vMa>7g>=oo!a;y_9)Fd<+H1To=BAIO1cp42>Gjwu3Wjq_1UxEUB2 zA9}hthE&|T5^C#zC_v{6e0ny27J^xsQ zZ!9r%yfo2Z;*1xE7!EGX+9-d%{Nps6`64SAh2x7Va^vs6to%N&T5(EHr+|~Hr&59K zdBw**OIUd#qaFl2OuzT=hw#(?lVxO9wCMb+o=*gejH0RCt-{yh80%jC>EDBp2=70I+7fG9PnddtLG~R4H9o}Zn zW<9B>7(3$9s}H9ORv4 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=a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0_}zB1=@v2ua$FAYGO%#QAmD%4lD%(WaO9R z7iZ)bC^!e3D)=TQXXb(Upy+}4)+Mzlvn(~mttdZN0UW+onON+11G*2{-;Qo>E*6%K zjwX&4MwYGyrb^ z^XG8)Zq_w(w>5j)XTR}J{UmKxD{rv|SKmpGREk+mnrBE~IAWM+Tci{w&>{QkYIO^T z=#`DrBj-OW_Kk56IsW+L;}oMx`Chl_UySFef2?S``YNO~Zhd)})>OZ%F%oS}b*HX} zc5kb4j9VG9u1TT7cf#RQPuv8=kNmCs@5HgueD>LS9*PM&Qc}0qOx%9^t@8EK^S0+- z3$0XZ->PH2?_<{1Dp}Wy?u#$Jc-3jqw?8uPNn@<&vRMUdZ$)Hmjmq16^GlBOv(GPu_>x`OjMIcJg*fy_l7JrCBgU*In1%O;Rdgn%fTbb6PPI_UH&5 z?UMf6e{0d-wY{4srL)?s)l#d?Q!dX4ymdBT^;GQT`puTUmu`j5XX0U)>Tz1ZJ;Y@u Ps9f}P^>bP0l+XkK$zb-F literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_5_holo.9.png b/java/res/drawable-xlarge/key_hint_5_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b3635e01e5dbbc4a8ffb4e0647a794fea9c429ca GIT binary patch literal 1427 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_9_holo.9.png b/java/res/drawable-xlarge/key_hint_9_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..61d6f5518b2ffb38a84ff5ae67daa367bfb097d0 GIT binary patch literal 1443 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_colon_holo.9.png b/java/res/drawable-xlarge/key_hint_colon_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7c769bd9794e7675c214947c5da7bd692760d32a GIT binary patch literal 1219 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6H!3HD+Ytl-Alw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#2IjQPkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 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=bTKw|F*I~>a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0_}zBwZyB}%DE^tu_V7JBtJg~mI4AY@=NlI zGx7@*oP$jjd=ry1^FVx1^gw*;l3J8mmYU*Ll%J~r4qvNGEcUwr-G}UNM>jVY3rj~w z6GsapOIHI^C8*vMa>7g>=oo!a;y_9)Fd<+H1To=BAIO1cp42>Gjwu3W4YrH5;lOP5 z+0(@_q~g|^Hr6dl;wcxpL0VDPAyfN%Mv`i+}&* z_Hb$FU|~4%c#^MYf51Y`6*o-my-t6edgj0IIleXf7tXwDxKXo{F+)7&fEN?%nTJ2F z&SEW^$^OH!sx7iI{d?XEj{Mu-YzMaUf&Df{zopr0L>(zDgXcg literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_comma_holo.9.png b/java/res/drawable-xlarge/key_hint_comma_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a9689adf5f024d6691d2558d6aecdbe7b17539f7 GIT binary patch literal 1192 zcmbVMe`wTJ98c{K*R_mcv2`k@=|nnq`FXkAg`VBr+O1Dg$=eedDjbV^0MTe zmv;SQt!^j?+teX45y1`oOHdGo4!ch0CL3M%$GV{iIv5+J&ObKnMBIF7d$oU*{$U__ z-}m14^ZEYHfqd?jriSMm2!d$J>{JSPZNYEry0!TG+(@Z{myIahi+W%QRW%n72?O>4 zGGl4|pa3*u=$&hzlOXC#X0aFbW_Qavv}i5Rp?%B2XoBeM@*Pbd0Ep}Z{iYqK?p_?H zNYjW@uZvkW>!d*0+&S!mp5a_kA0E(S2GzBL?DSLpmE_$p}YtLRgZdmq?!FScc^pjt_B?EbubRl8X<8t+_@? zE-31vExe0UWrQ4=VXD(|0jsF1 zV&#+zGz8rugoCvX$d@64UKu)Msz)TVnr_;`J}A#ZvD4{kpDOn?aH>N zrmy!${*U~7_r}9xn?ATbbNt;*$JT2<+-UBRM_&}So_a8H^!KB!>x6XMtIvG@^P%zl r-j?qF#wI@%PgF16lS1ORm)0~Aea8>K09*fhEBJS0(mCZ!^6jxl0^5%- literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_dash_holo.9.png b/java/res/drawable-xlarge/key_hint_dash_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2402994f0f02426d187a5a78d42e82b5127099ee GIT binary patch literal 1191 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 PjUQL2y@P$Ht#|*w!79gF literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_parenclose_holo.9.png b/java/res/drawable-xlarge/key_hint_parenclose_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..48f9f80655ec4cbe1a18d1fdcd3eda819f09e6ca GIT binary patch literal 1316 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6H!3HD+Ytl-Alw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#2IjQPkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 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=a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0_}z9HF3kM*UGslHL)bWC?r2W2bKZ?GV)9E zi!<^I6r6)i6?_wuGxI=vQ1n22>ylcOS(cjOR+OKs01jWPOf2@h0o{k}Z$~#b7Yj>A zM-xX2BTH8UQzfY06mr5$ALtl;P~t#JEHEKp3Is9XNgv38XP(qNV2&vQW{vgdKlm^( zFot-#IEGZ*x)Qe0uhl^0t*+^lqfd8k_{M+bhd_4dy}DT7krqdjbkV8l zK_9miuF^T3K4(IZ+>2T}Q`5x{0!3u^e|ln3-EG_La%JJ%*Sm^*Kkx;_UjG?0@3UaS zhuZ&A>a&(r#>(FLyvKXaiO+vJLvHz%6$srHvk}+u2tMm}F(_(b`JCcNk)zFW`?G%^ zIFbAFwnWa8Hzu#WmT#M|av{$R)$hko`qwkBW&9N@`g}@^LH5^4n-{7VebYR^;CkT7 UE5<#y--605Pgg&ebxsLQ00N!UhX4Qo literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_parenopen_holo.9.png b/java/res/drawable-xlarge/key_hint_parenopen_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f05ae207577c582a1095bc3c5b316083feb37607 GIT binary patch literal 1323 zcmbVMTTC2P7#^Ti+JG((UTTz%L+gvMbJ@%64lH!o* z?h;dN@sd_jO(j^dqBil;#MDdFmIC&YHXCCkCiJBwY6xvH*xJ~pTH2tVfnDqa`rsrp z=RfEC-}m2VcWZM~`Pv88A_!701i3I=?}P9CrFXz@#k27gT-KR^4zo>*n`u!82piL) z02LIm6NG^n%WnS$)FDVoT#j^@9ihh=NmJ~irDM-1Nr*;}x`s?rl)8b5MnR{n`migb z$1zln`LK3ZhzKS9pi2(+>Y%N+IU@CTOWqjPP>ar6x65%FLH)$swPMW5xQHmf5oS<-$sv&8{K`{h@<{u1N z(_?Wa%<*|!aOcCiOf$*gcsiZ7ryX`p@5D*3*K2W5R1MUqF|w*DW@=QUs=&YjL(=7> zDQhZfF^W+wW%@Aa=~4(vG89@SR*ih3V9M}}n8Zmtfh&p?*P^yzhQU8>tf*~7vPpo4 zfuW^z3DzTCRRF`>{kI`Y5qiV4=rSydnBX)ir2y3wI3EUY>@hjU@HEYnB<&<81GsR!|L7R3%Wb zD?__^tOfaZEaTUKXli;y(-MUaXzkKW&FIpSsK3pHhD1qLt-V#ArD!>z%RL~*>zaZt z=9iIIu+KyPZjYPgdCucyStskEyaB?6<*~8_a_hs*^6&r^ zPK*vmV|ez@G6X5wDsXHhGj(>$_%knTvi=!r9Pn@3++mDrG)8{1U55lnqi|FUMg zim=$d(eA2UZ=9+}KU;I|yS@El1wA~Rer;zRl4j8JmS=qWDg zY1}#kWbef1*Zvart~*+p-T4P4g!|8*EOOaOD*E`3rOJ`7X6`Ac_O+Aj_DfhTJZ41kfR_l>z8<{k|U&#rF^-i_V){NVSg zA1;T7(yOb6KFH>F&v@Foi4UubABl2<;FF&}Rc^)an%8jpLiWMj^rgC7bn=$X_5R_r z$M+n}gr}}VUaU9S%k3W>+BP4Y?|bh^>FdP{gSF<>$F8@Qo&R#bUagO}tT)_cmkunH Z5=i&lx9@BgimbmMA_SVb!;RZ^{S62l)7=07 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_period_holo.9.png b/java/res/drawable-xlarge/key_hint_period_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ec330fb6e5fa750eeaa2448ef725ce7bea81d1e4 GIT binary patch literal 1164 zcmbVMTWHfz7!Fmuj49s0DGG-S5n*j^ZPUipnKjL<+Bv(bdz#CV(>83mn4H;cj-eZP zdGPikf)65yqC=VD4J-^nA4C}Fqc1)T2f}0`f{5Te+1lyD@WDWGZr}I)m-GKQ*Vfvy zs%CQyK@h9bd!#HLH{!Q$#WMU|JDBgo!zPsKKY=UTP@@z%zfe3WNf^H_rndjpq(6t14B$A;sb`lo# zJp&GGA85^~13hY7Bb#=CMo+*321E+*j9$|fyaYL?E8w}mO_5*@f_f6 zEC`!!B~dtKl&9Df6QU`@@Z*|8yC@6)xUneO&Gp-m%0k!bb5wjE`T8mu=kDKzd?5Bl zIN<2`Qj}iFQu_>OqO_DC@kvP2H9_WinPK=a&9ihg#xSuY6PCD$9E*jMbX07vYAnW; zxOlS^Nnt!EF^nWP<4G#Q@^n(>!f{@%a?_@Z6jOy&yE?X8;d1}v3P}el$Z~R))myEA zwxWeBw`kcQ*&YEIMb%Az?O)G)v=Vgm<4}_w%K&rv74${y%hFisO-`6|*s_Vj=$DKFs26m^GK562%a5s~&Pjw@S zi7S)qre;@~TfH~V$n3kBqo3M0oWAv_#t3X5n+%*Xw(Wd>LOlPY_E%SQ>~cXJom&6w z`>##v;F&d@xY>|-`5;Vg@c$3#RI7Bqxoh}0HX(y( literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_plus_holo.9.png b/java/res/drawable-xlarge/key_hint_plus_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..770bf5dbea3c7f407bab806a7e3944a3eb792308 GIT binary patch literal 1340 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6H!3HD+Ytl-Alw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#2IjQPkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 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=a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0__FrbvCgybj7RJ%DE^tu_V7JBtJg~mI4AY z@=NlIGx7@*oP$jjd=ry1^FVx1^gw*;l3J8mmYU*Ll%J~r4qvNGEcUwr-G}UNM>jVY z3rj~w6GsapOIHI^C8*vMa>7g>=oo!a;y_9)Fd<+H1To=BAIO1cp42>Gjwu3Wjc)a8 zTNxM_b39!fLn>}v2{rU-B~{;Tu&n~&zlWrX5Td5yjzAr;<=1Ovdr=9t_9}l(j5uXU48vq zU;dbU=D)f{*@JJab34wk=W>PA{4lj>ENZo4$u)d-iQ$*au@zEhvs29Ho{FEP%6P=( z7{`vuSuKeb^2ZAwR^D5><-16L#ui=X@J(VYo7S&-RbA>D_(o%a+vm*>_8#s!aPg-~ z*CO}Z+upbFWzM>1)%RJeeg38GwpY56S&wD}OnVv~d)>b+F(!Ii>E!1>H?Mo`J4xkz z?DI2RY4=t-aq9i|dF3j=!au3FAojc0t>-~&`^vADui#kA&%}6@b9(f{v4 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=bul(}F*I~>a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0_}zBb-}CG%DE^tu_V7JBtJg~mI4AY@=NlI zGx7@*oP$jjd=ry1^FVx1^gw*;l3J8mmYU*Ll%J~r4qvNGEcUwr-G}UNM>jVY3rj~w z6GsapOIHI^C8*vMa>7g>=oo!a;y_9)Fd<+H1To=BAIO1cp42>Gjwu3W4L8lcj|>cq z3p`yMLn?0V3Ek^=*g#-guQbcl38y9rhC02vl)ivJptF}fAtk+SVe}D+gA*+KFRXM9 zH7t2KDZHU~1#_}zR&n@TRpC2oTR7EY_52>4FTek{C3~&p^BCh}7Wb}eHtD4Eb|mn2 z9r3v9E9CN2Z~1LgbJZ#@>J-)3zIXA8fc}i$1g?@^vGe-Y4tXDMHEe$& z?JUn!KQVT;#y^*C#`%8BzrQW}9mY|(aLO;A%Oxfio zJO7+>&3Q+EgNsM^vdZYnv}c~K7Ih8WfBm)X`moj44S4b&MEcdduC=_b_9bt7b*q`@ zBte%6LO*tK?I=DIWVx+Fsy|DX(RkGqo^LBRsR>zo6$&5BF{@_SXMgPRN7IXeos*2B zOiCZId3dc{bt$k_?DDT=f2ZD^IW?X8Ea&v^r@YohPCqwA{?5A(^DLJ=(l3}^{Gu}V tzn}OHlSK26s~?x`Xn$Z~lYXCxhe5~t+T;WC%Jo2Hpr@;!%Q~loCIAjH?!N#4 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_quote_holo.9.png b/java/res/drawable-xlarge/key_hint_quote_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ceee67ddcbd250c1abc82552318022cb481101f2 GIT binary patch literal 1257 zcmbVMZEVzJ9IsA1+_G~(%wz`AbY|0pyFP92*1P78dAnZS0kFUb5N`fG&ldWPJueJDjbp3<)yjT^+xpnHWtFk!Ht~l>vyzUf8GVQR?Q2 z&nZ&PMyY3mDUdSbuwQK*wqWOQTSgfkP{LWNc{>?#1WceoB$JLdsM~@QrIvXGEW5`v zMJ}tLfhe`&R9C8lj2jjtgMQ#sKocOF7(c@Wc%I)zvVZ|JU}=W+F}%RB0sv&`qOdh9 zn-kKaRI-J4QK}yyQ=sWWq2MoYe#7dcnQ%DladRo9yL%gQ6|px$yQSiy$b+Jxrz+Z=Z_OZfuZ z`s=Gh1aaTyq!`OM3)i2S^zH{Wzb?yI5Xnk_s(u;Gqj(cv9ksILB_V?c^HlF`s{%db> ztMk#USb?U!r?>XBPdALNn@C;WJ9qGbZ!022HrHtnR9%;yYDK>3?cJts5J;ZciTk z`;(84dq#d+JbkVE)sy%CT>rZN-TK|$?(RHzv4 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=bul(}F*I~>a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0_}zBb-}CG%DE^tu_V7JBtJg~mI4AY@=NlI zGx7@*oP$jjd=ry1^FVx1^gw*;l3J8mmYU*Ll%J~r4qvNGEcUwr-G}UNM>jVY3rj~w z6GsapOIHI^C8*vMa>7g>=oo!a;y_9)Fd<+H1To=BAIO1cp42>Gjwu3WjRR}%>oG7e z3V6CWhE&|T61tK1u!6vojndw7O3F)4Fhw5NoZ7i1t;J;8or(@0hv`}phobvaRFAMR zPHg(}O!r9PE_*qHV+ITcJ%$HtowhmUm=m!ypBKoB5)qN=YU?6$^ z&-46$zyEt?2l}6D-tqVjf*_i6y=oq>?f8A{q3!tFdbm`&G9grAi8^Mo?(swM2>(_+f7ryo;^>I zww0!a6FRGV3MkvXQ$84+>Mxj6W2R_PJ$uORnuG})fDE$cjJttUOH*sS5|+bbh9cKg z&{&#UcdDolkP7qxnV{LI$tGDc$#=?@e<3D8xMu8`Bq8F ztJ;Pwyh~GMggl91s?{o8jnU8_WjIk3Lk^ygVvT4p=^~>Rb%TyNg9-xEw>@M-mkb$= z5m-TK3VXU9g5&A>Cb1iABnqdDsTm%_(JbRQVO(q40m_5_+}Kh(C`@{Q$%6n^d=uBB z)KLfH+&$P(sEECh_WCw1iZQN2v*G|3<0Vn$77k;-6#)D6>i!+ltu^=MV#+b;o2^Pxko(g2-gj2tJA{s$n*R2))4ls{UVrqA{M6rV?bHYJbD6hh z{`zoNQ{!Us?r)K!kw@mX5i1MtNA|bwygEHU^xEywqbIlTPMm9K=nQ6?p4Pv*^<;Lw z@8%DB+u=8c5A?j-@_YHqmEC(L=+4z+T=OMw;#&I8g`TCzcL%?2eE$2&-RZ?2UpTb9 zd}V*vk?|I1`S`g%hF_lfJahWSi4*0{pWb}pJlg^z|!;$Gz3Y_K%+#x=?YhFCBZewQJ=U{p8rS+pk|9oZd!U{N%;sOHE(w3jZUyY`=Oc Hb8zNgW7d^< literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_slash_holo.9.png b/java/res/drawable-xlarge/key_hint_slash_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..676d5669820c9532e1718f931a06ad88e8d6a0d7 GIT binary patch literal 1317 zcmbVMZA{!`94|UxTSOta7Y)X)#AQbB`f@M5tDMKtUfmIkx8oLwAIy5a2d+ZfqwR5b z%q6mHAB=G^8ek9*HQO@h1dZ7u14XxNQKu{#&$fLAsu1MPCOO(@HVRKNlBU>2OUIs3k`Rp`RsKv;lv;p^#z3>I`mn{( zaSWB?KCHnd5JHj#33+#i4(dDVqEbhTFj3$K^P~(=<<#w3DDI!tEhR z4@){Zhl}@koGjrE)Z{tV!*UKU@8$v|=WuW&$?-K%2)ZbmV0nkrOY?bbNHt7Rl|bIE z4DIHy#BH$*s{_&0^r)t_<~tyq&`ixpXi1c5-ZDD(0`vj#U>;{{G>Xzw_#jT_aNC z(!0(h{8aXRe(EL94xO4`===6`dC!&Jx$ORl<%ZG?!*tJ^2anAycqWGA zzH)u*&at`v!Sdb{zrGf^8SS3k6WU2X96V(#oVzx}Mz}pUI>Dzs$-CPs{8MK?eCxNH z<~uC|o=q37A7_`s_g)lB-6`Qx`{0q!pFcLNWUu`3w?ZG7NeKOyf4Jj=F9-HBR71l< zug`2fJkmB3Iovh9?fs)H^#(aI#Xt6A#bVjmfy)nkw|pkXC%Q{}cipvA`7z?0?s}$r S?{KH};|c}qxS^VT2mb}bK-32S literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_smaller_holo.9.png b/java/res/drawable-xlarge/key_hint_smaller_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..97cf26edc241670651a0737166d81c368fd406fc GIT binary patch literal 1326 zcmbVMZD<>19KWtx(seDiDBCiGT`yAyF1fd)mmJB`G}r60np)F<5$x#o?rCyubC=y+ zl4}@E_Ey$@m?FZ4x-G-aZK!0y*^NwZ&L0Y5xxHufQ!FPL;4Sw4XjppFsFnW^4pgL+41PvfzNgV-b zG$W)y90=0n!OuYeK^jNpMAAsco?}Hd;}$F%x0%U8G=c;|W>yf#fq{;Il&l1?Uq8Hp zp|TXjUi8L@ST+LE^1h-528;a(u{bXJB`mZT4VWw>$N)n?&CGs6E2bHB+yRMP0}8QVfLUDK@vDY;UwiE8J4D4f!VaRV}y*Vrj$3vN&ES6x;>ct!gQp^!xo52SvG{g-f4Q48e3My0gx}0bSJOtRbrk zYB35UYR(8^(9@L=GTB&cjaboF69rR-n?e>R-2|S=SaB^|>qZ>>=f=9$dSWsQ@Ho)b zoF>A0j5_OJn7c;{S%%OX_IXW)MG+=ARm^38Vnn$h22b3QEU`Sp@FdB22!m2K0IojVzP&~!aG)Iyg-wh`{UWy?iJniu_d>tEAbVE=?P}h~A z?kbjiB$kb6KrmD-p{f)04j4$QhN`F4EE*Z~qA@{~6>DvkXC+z=XmTD%yryQ*<@~bp zI{G~H@8P(^JkR<3;jky{qx?OD7hA7du-@Ge4)Bo134}?!`kB{h{EoUpkn;e%Xe_!0y(a{mg=kwp5 z3zd|BzIY>2ZRwr$JYDIFl&7~+G`(=8RGWH9Rn=>kat{tP-oHHf)S06#)9)QV*sJ|8 z9lz0i^mx1fqr%U(Uf7MIZ3|bgVt?HG?3Gy8RKBlo;n~XFot5uOTnf8zVbfPj_7kO| zX)Yy`$?Z`4ou+idxtW=n!1=_HukWYlQe5Bce9O|d*;>2i=Z|#{)pm|;-ZSL<>$eao zKlzK6R-CU7M!)z6Jw?agu714eGv_Pp$x9cp*w~cq{nt)n`uxT%ja}siqv4 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=a{@A4 zO^wVAoZXB~EY00udOh=sOA_;vQ(^XI0_}zBb;hgL%DE^tu_V7JBtJg~mI4AY@=NlI zGx7@*oP$jjd=ry1^FVx1^gw*;l3J8mmYU*Ll%J~r4qvNGEcUwr-G}UNM>jVY3rj~w z6GsapOIHI^C8*vMa>7g>=oo!a;y_9)Fd<+H1To=BAIO1cp42>Gjwu3W4f`e|69xvx z0#6smkcwMZrf&3WaS&)L4?hw4kwML_rB!Snr>uU0hHpjV>$OXq4=G1Ta9Q!Nvd*2m zQB`rLhogba8tW8~ZxgI{GW*;~xp|kT#`?@3Yj4ZvEkUO^6-AyEo3$yca+|n`<#5?N z<2ydT;-CG)1qYrA?@CX-y;getsP@+x`xB}U zFod|;f3N*-*Z262K@a!FxQEN$glyeXaJ_UrW8Ac*w@l71e{2!IE%(01hj{N}ejA<6 zAAB7uz>@8I`5lWz{@w(iW<#FC+Lul4AK4;w-%Q=puuIAO^rqu{F(OB^XD!QS{5PYh zBPujv+Sj=2U)c^+&fC9YRn^PNd%`!YBIQ_*zbOuJRc(lV__27B3V+hxi=}_VdZKIE zX>y(KbK3~}s>Mlu&v)ps u&AI)xX633KC(iy~Jjd@LPfKeJw*kWxp$&%TmznMam1&-?elF{r5}E*$eAZL| literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_underline_holo.9.png b/java/res/drawable-xlarge/key_hint_underline_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..38abfcb0152d863a8e0de3938e2e771aae992457 GIT binary patch literal 1158 zcmbVMOK8+k6b-hD77L12t1gTweo$xflKEsNc9iM7MyGY!VLD<(s!fwOZD{i`d3DlJ z1Qiq&intL)s30mTD1LC`U%@Xb(v4JbqoND33c3&!eQ9T^i{iqNEYq&uV>qH4V@7yIGWWJwh8{7&-7#j=sn%4Q zPM9{LLw?{>Kp4rXdB6b{@GQssI6(~XA^>#pVu+fp=EMw?idtk9W4bW5 zM3&9x^ZtCmZ`z$K7mY?e4xaZB3!l?xVA=H=WAni81g?%zV5 zA@N3Rwl#7nat}0>UL6@Y31bZT;#W0QlmtQII3WlG9)u$t7fEnI7zjy`NH77y@wyVn zcvu*SN?{le!9W0V9F*$Fq&~z8ARz^UQ9&wUlZJz3LqR27jp!D!MC%_|F<~Pan|9VT zdrB3M?lQ6IbeR^NXbI6NS(wNTXWgNX z>+V$Eqo;nIzUae+%V4H=e;usazwGp>x>?B+OV4DcG_Fp={x>t9wdW?>hUG_wH#7|# zFMIrA=R5TBRsX<}U(NRSvc10D+Yb(`tXi>t_R%k3!}F@^3mSe_Tmb@a)yc%NowTKGgWO(DwP$ v5BACX{K<>A3(qzV)rjSrzwPO_3l)HB``N(nebBzm`!gi#o8bAn_FcaL!9RaU literal 0 HcmV?d00001 diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index d2cd6c7d1..4614f720a 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -21,7 +21,8 @@ 0.450in - 0.0in + 0.03in + 0.03in 0.450in 0.10in diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 2fa47ae52..765262d56 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -22,6 +22,7 @@ 0.290in 0.035in + 0.000in 0.325in 0.06in diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index 66771c287..f1f9904e3 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -27,7 +27,7 @@ diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml index d89204ae6..b7ebc66de 100644 --- a/java/res/xml-da/kbd_qwerty_black.xml +++ b/java/res/xml-da/kbd_qwerty_black.xml @@ -27,7 +27,7 @@ diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml index 30d8de0cf..0832cbc92 100644 --- a/java/res/xml-de/kbd_qwerty.xml +++ b/java/res/xml-de/kbd_qwerty.xml @@ -21,7 +21,7 @@ @@ -82,11 +82,12 @@ latin:keyEdgeFlags="right" /> + @@ -82,11 +82,12 @@ latin:keyEdgeFlags="right" /> + diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml index be2befbe8..b46ce9cb9 100644 --- a/java/res/xml-fr/kbd_qwerty_black.xml +++ b/java/res/xml-fr/kbd_qwerty_black.xml @@ -21,7 +21,7 @@ diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml index 7f66eef56..fd94a1202 100644 --- a/java/res/xml-iw/kbd_qwerty.xml +++ b/java/res/xml-iw/kbd_qwerty.xml @@ -21,16 +21,17 @@ + @@ -46,13 +47,14 @@ latin:keyLabel="ם" /> + @@ -81,9 +83,10 @@ latin:keyEdgeFlags="right" /> + diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml index 80ade2020..1c1c1e37f 100644 --- a/java/res/xml-iw/kbd_qwerty_black.xml +++ b/java/res/xml-iw/kbd_qwerty_black.xml @@ -21,16 +21,17 @@ + @@ -46,12 +47,13 @@ latin:keyLabel="ם" /> + @@ -80,9 +82,10 @@ latin:keyEdgeFlags="right" /> + diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml index 96a86b013..32512daaa 100644 --- a/java/res/xml-nb/kbd_qwerty.xml +++ b/java/res/xml-nb/kbd_qwerty.xml @@ -27,7 +27,7 @@ diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml index 4adeb4801..982a3de65 100644 --- a/java/res/xml-nb/kbd_qwerty_black.xml +++ b/java/res/xml-nb/kbd_qwerty_black.xml @@ -27,7 +27,7 @@ diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml index 57114a8ea..80a9ddd4f 100644 --- a/java/res/xml-ru/kbd_qwerty.xml +++ b/java/res/xml-ru/kbd_qwerty.xml @@ -20,8 +20,8 @@ diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml index 8f2f599c3..2635541e8 100644 --- a/java/res/xml-ru/kbd_qwerty_black.xml +++ b/java/res/xml-ru/kbd_qwerty_black.xml @@ -21,7 +21,7 @@ diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml index 1a657055a..c9a4e449c 100644 --- a/java/res/xml-sr/kbd_qwerty.xml +++ b/java/res/xml-sr/kbd_qwerty.xml @@ -22,7 +22,7 @@ diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml index e4b09c717..f760c5eb1 100644 --- a/java/res/xml-sr/kbd_qwerty_black.xml +++ b/java/res/xml-sr/kbd_qwerty_black.xml @@ -22,7 +22,7 @@ diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml index 8819159e8..ae7002463 100644 --- a/java/res/xml-sv/kbd_qwerty.xml +++ b/java/res/xml-sv/kbd_qwerty.xml @@ -29,7 +29,7 @@ diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml index 2532fca8c..463b60bd9 100644 --- a/java/res/xml-sv/kbd_qwerty_black.xml +++ b/java/res/xml-sv/kbd_qwerty_black.xml @@ -29,7 +29,7 @@ diff --git a/java/res/xml-xlarge/kbd_phone.xml b/java/res/xml-xlarge/kbd_phone.xml index 977bbf2df..107731f3b 100644 --- a/java/res/xml-xlarge/kbd_phone.xml +++ b/java/res/xml-xlarge/kbd_phone.xml @@ -21,8 +21,8 @@ @@ -35,29 +35,35 @@ latin:keyEdgeFlags="left" /> + + latin:keyLabel=" - " /> + + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num2" + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num3" + latin:keyWidth="10.5%p " /> + @@ -72,29 +78,35 @@ latin:keyEdgeFlags="left" /> + + latin:keyLabel=" , " /> + + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num5" + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num6" + latin:keyWidth="10.5%p " /> + @@ -103,47 +115,57 @@ and ')'. --> + + latin:keyLabel=" ( " /> + + latin:keyWidth="10.5%p " /> - + latin:keyIcon="@drawable/sym_keyboard_num8" + latin:keyWidth="10.5%p " /> - + latin:keyIcon="@drawable/sym_keyboard_num9" + latin:keyWidth="10.5%p " /> + + + + latin:keyWidth="15.0%p" /> + + latin:keyWidth="10.5%p " /> - + latin:keyIcon="@drawable/sym_keyboard_num0" + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_numpound" + latin:keyWidth="10.5%p " /> + diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-xlarge/kbd_phone_symbols.xml index 6fbf3a902..a7dcd325a 100644 --- a/java/res/xml-xlarge/kbd_phone_symbols.xml +++ b/java/res/xml-xlarge/kbd_phone_symbols.xml @@ -21,8 +21,8 @@ @@ -33,10 +33,11 @@ latin:keyWidth="15.0%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> + + latin:keyLabel="@string/label_pause_key" /> + + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num2" + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num3" + latin:keyWidth="10.5%p " /> + @@ -73,10 +79,11 @@ latin:isModifier="true" latin:isSticky="true" latin:keyEdgeFlags="left" /> + + latin:keyLabel="@string/label_wait_key" /> + + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num5" + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num6" + latin:keyWidth="10.5%p " /> + @@ -109,50 +121,60 @@ char 'N', '(' and ')'. --> + + latin:keyLabel=" N " /> + + latin:keyWidth="10.5%p " /> - + latin:keyIcon="@drawable/sym_keyboard_num8" + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_num9" + latin:keyWidth="10.5%p " /> + + + latin:keyWidth="22.5%p" /> + + latin:keyWidth="10.5%p " /> - + latin:keyIcon="@drawable/sym_keyboard_num0" + latin:keyWidth="10.5%p " /> + latin:keyIcon="@drawable/sym_keyboard_numpound" + latin:keyWidth="10.5%p " /> + diff --git a/java/res/xml-xlarge/kbd_popup_template.xml b/java/res/xml-xlarge/kbd_popup_template.xml index 382d90afc..55ebda5e4 100644 --- a/java/res/xml-xlarge/kbd_popup_template.xml +++ b/java/res/xml-xlarge/kbd_popup_template.xml @@ -20,7 +20,7 @@ diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml index b72503414..9485ca7b3 100644 --- a/java/res/xml-xlarge/kbd_qwerty.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -21,7 +21,7 @@ @@ -30,62 +30,63 @@ + + latin:popupCharacters="<" /> + + latin:keyOutputText=".com" + latin:keyWidth="15.0%p" /> + + latin:keyOutputText=".com" + latin:keyWidth="15.0%p" /> + + latin:keyWidth="15.0%p" /> + + latin:popupCharacters="<" /> @@ -30,6 +30,7 @@ - + @@ -30,6 +30,7 @@ - + diff --git a/java/res/xml/kbd_phone_black.xml b/java/res/xml/kbd_phone_black.xml index 6ade277d9..86759d676 100644 --- a/java/res/xml/kbd_phone_black.xml +++ b/java/res/xml/kbd_phone_black.xml @@ -21,7 +21,7 @@ diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml index 5062d4707..1c691d2a5 100644 --- a/java/res/xml/kbd_phone_symbols.xml +++ b/java/res/xml/kbd_phone_symbols.xml @@ -21,7 +21,7 @@ diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml index 2a6932a9e..3e46c5307 100644 --- a/java/res/xml/kbd_phone_symbols_black.xml +++ b/java/res/xml/kbd_phone_symbols_black.xml @@ -21,7 +21,7 @@ diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml index f1aa86f39..004d490d6 100644 --- a/java/res/xml/kbd_popup_template.xml +++ b/java/res/xml/kbd_popup_template.xml @@ -20,7 +20,7 @@ diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index 21a7ccb78..517b4fe5c 100644 --- a/java/res/xml/kbd_qwerty.xml +++ b/java/res/xml/kbd_qwerty.xml @@ -21,7 +21,7 @@ @@ -82,11 +82,12 @@ latin:keyEdgeFlags="right" /> + @@ -82,11 +82,12 @@ latin:keyEdgeFlags="right" /> + diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml index dedd2da08..b6a069c25 100644 --- a/java/res/xml/kbd_symbols_black.xml +++ b/java/res/xml/kbd_symbols_black.xml @@ -21,7 +21,7 @@ diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml index 52afa38e3..d83706b5c 100644 --- a/java/res/xml/kbd_symbols_shift.xml +++ b/java/res/xml/kbd_symbols_shift.xml @@ -21,7 +21,7 @@ diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml index c1bd4e395..e5f8abf6e 100644 --- a/java/res/xml/kbd_symbols_shift_black.xml +++ b/java/res/xml/kbd_symbols_shift_black.xml @@ -21,7 +21,7 @@ diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index bad1544e5..fc35ccc5d 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -61,6 +61,7 @@ public class BaseKeyboard { private static final String TAG_KEYBOARD = "Keyboard"; private static final String TAG_ROW = "Row"; private static final String TAG_KEY = "Key"; + private static final String TAG_SPACER = "Spacer"; private static final String TAG_INCLUDE = "include"; private static final String TAG_MERGE = "merge"; @@ -273,8 +274,8 @@ public class BaseKeyboard { public Key(Row parent) { keyboard = parent.parent; height = parent.defaultHeight; - width = parent.defaultWidth; gap = parent.defaultHorizontalGap; + width = parent.defaultWidth - gap; edgeFlags = parent.rowEdgeFlags; } @@ -290,21 +291,21 @@ public class BaseKeyboard { public Key(Resources res, Row parent, int x, int y, XmlResourceParser parser) { this(parent); - this.x = x; - this.y = y; - TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard); - - width = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyWidth, - keyboard.mDisplayWidth, parent.defaultWidth); height = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyHeight, keyboard.mDisplayHeight, parent.defaultHeight); gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, keyboard.mDisplayWidth, parent.defaultHorizontalGap); + width = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyWidth, + keyboard.mDisplayWidth, parent.defaultWidth) - gap; a.recycle(); a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard_Key); - this.x += gap; + + // Horizontal gap is divided equally to both sides of the key. + this.x = x + gap / 2; + this.y = y; + TypedValue codesValue = new TypedValue(); a.getValue(R.styleable.BaseKeyboard_Key_codes, codesValue); if (codesValue.type == TypedValue.TYPE_INT_DEC @@ -731,6 +732,10 @@ public class BaseKeyboard { mTotalHeight = mCurrentY - defaultVerticalGap; } + public void setSpacer(int gap) { + mCurrentX += gap; + } + public int getMaxRowWidth() { return mMaxRowWidth; } @@ -774,6 +779,8 @@ public class BaseKeyboard { mKeys.add(key); if (key.codes[0] == KEYCODE_SHIFT) mShiftKeys.add(key); + } else if (TAG_SPACER.equals(tag)) { + parseSpacerAttribute(res, parser, state); } else if (TAG_KEYBOARD.equals(tag)) { parseKeyboardAttributes(res, parser); } else if (TAG_INCLUDE.equals(tag)) { @@ -791,6 +798,8 @@ public class BaseKeyboard { state.endKey(key); } else if (TAG_ROW.equals(tag)) { state.endRow(); + } else if (TAG_SPACER.equals(tag)) { + ; } else if (TAG_KEYBOARD.equals(tag)) { state.endKeyboard(mDefaultVerticalGap); } else if (TAG_INCLUDE.equals(tag)) { @@ -804,6 +813,15 @@ public class BaseKeyboard { } } + private void parseSpacerAttribute(Resources res, XmlResourceParser parser, + KeyboardParseState state) { + TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard); + int gap = getDimensionOrFraction(a, + R.styleable.BaseKeyboard_horizontalGap, mDisplayWidth, 0); + a.recycle(); + state.setSpacer(gap); + } + private void parseInclude(Resources res, XmlResourceParser parent, KeyboardParseState state) throws XmlPullParserException, IOException { final TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parent), @@ -848,19 +866,14 @@ public class BaseKeyboard { private void parseKeyboardAttributes(Resources res, XmlResourceParser parser) { TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard); - mDefaultWidth = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyWidth, - mDisplayWidth, mDisplayWidth / 10); + R.styleable.BaseKeyboard_keyWidth, mDisplayWidth, mDisplayWidth / 10); mDefaultHeight = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyHeight, - mDisplayHeight, 50); + R.styleable.BaseKeyboard_keyHeight, mDisplayHeight, 50); mDefaultHorizontalGap = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_horizontalGap, - mDisplayWidth, 0); + R.styleable.BaseKeyboard_horizontalGap, mDisplayWidth, 0); mDefaultVerticalGap = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_verticalGap, - mDisplayHeight, 0); + R.styleable.BaseKeyboard_verticalGap, mDisplayHeight, 0); mProximityThreshold = (int) (mDefaultWidth * SEARCH_DISTANCE); mProximityThreshold = mProximityThreshold * mProximityThreshold; a.recycle(); From e354a85ef44e13999aaefd735cef7f659090f6e8 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 20 Oct 2010 00:18:50 +0900 Subject: [PATCH 079/287] Manual merge of the following Gingerbread changes logically I8b38e280 Ia3929bb0 If925b546 I1062763d I901e36aa bug: 3100311 Change-Id: Ic7e01277ec816e77d34732599b2b9552668b81c2 --- java/res/drawable-hdpi/hint_popup.9.png | Bin 0 -> 226 bytes java/res/drawable-mdpi/hint_popup.9.png | Bin 0 -> 202 bytes java/res/xml/kbd_popup_narrow_template.xml | 10 +- java/res/xml/kbd_qwerty_black_row4.xml | 20 ++- java/res/xml/kbd_qwerty_row4.xml | 20 ++- java/res/xml/kbd_symbols.xml | 111 ++++++------ java/res/xml/kbd_symbols_black.xml | 100 +++++------ .../res/xml/kbd_symbols_black_row4_common.xml | 46 +++++ ...ls_black_row4_common_with_settings_key.xml | 50 ++++++ java/res/xml/kbd_symbols_black_row4_im.xml | 47 +++++ ...ymbols_black_row4_im_with_settings_key.xml | 51 ++++++ java/res/xml/kbd_symbols_row4_common.xml | 51 ++++++ ..._symbols_row4_common_with_settings_key.xml | 56 ++++++ java/res/xml/kbd_symbols_row4_im.xml | 52 ++++++ .../kbd_symbols_row4_im_with_settings_key.xml | 57 +++++++ java/res/xml/kbd_symbols_shift.xml | 109 ++++++------ java/res/xml/kbd_symbols_shift_black.xml | 98 ++++++----- .../kbd_symbols_shift_black_row4_common.xml | 44 +++++ ...ft_black_row4_common_with_settings_key.xml | 48 ++++++ .../xml/kbd_symbols_shift_black_row4_im.xml | 45 +++++ ..._shift_black_row4_im_with_settings_key.xml | 49 ++++++ .../res/xml/kbd_symbols_shift_row4_common.xml | 49 ++++++ ...ls_shift_row4_common_with_settings_key.xml | 54 ++++++ java/res/xml/kbd_symbols_shift_row4_im.xml | 50 ++++++ ...ymbols_shift_row4_im_with_settings_key.xml | 55 ++++++ java/res/xml/popup_at.xml | 39 +++++ java/res/xml/popup_slash.xml | 39 +++++ .../inputmethod/latin/KeyboardSwitcher.java | 161 ++++++++++-------- .../android/inputmethod/latin/LatinIME.java | 4 +- .../inputmethod/latin/LatinKeyboard.java | 71 ++++++-- .../latin/LatinKeyboardBaseView.java | 54 +++--- 31 files changed, 1301 insertions(+), 339 deletions(-) create mode 100644 java/res/drawable-hdpi/hint_popup.9.png create mode 100644 java/res/drawable-mdpi/hint_popup.9.png create mode 100644 java/res/xml/kbd_symbols_black_row4_common.xml create mode 100644 java/res/xml/kbd_symbols_black_row4_common_with_settings_key.xml create mode 100644 java/res/xml/kbd_symbols_black_row4_im.xml create mode 100644 java/res/xml/kbd_symbols_black_row4_im_with_settings_key.xml create mode 100644 java/res/xml/kbd_symbols_row4_common.xml create mode 100644 java/res/xml/kbd_symbols_row4_common_with_settings_key.xml create mode 100644 java/res/xml/kbd_symbols_row4_im.xml create mode 100644 java/res/xml/kbd_symbols_row4_im_with_settings_key.xml create mode 100644 java/res/xml/kbd_symbols_shift_black_row4_common.xml create mode 100644 java/res/xml/kbd_symbols_shift_black_row4_common_with_settings_key.xml create mode 100644 java/res/xml/kbd_symbols_shift_black_row4_im.xml create mode 100644 java/res/xml/kbd_symbols_shift_black_row4_im_with_settings_key.xml create mode 100644 java/res/xml/kbd_symbols_shift_row4_common.xml create mode 100644 java/res/xml/kbd_symbols_shift_row4_common_with_settings_key.xml create mode 100644 java/res/xml/kbd_symbols_shift_row4_im.xml create mode 100644 java/res/xml/kbd_symbols_shift_row4_im_with_settings_key.xml create mode 100644 java/res/xml/popup_at.xml create mode 100644 java/res/xml/popup_slash.xml diff --git a/java/res/drawable-hdpi/hint_popup.9.png b/java/res/drawable-hdpi/hint_popup.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ec003e655b5cd6de5ca98e10bbf849aed0fe37 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^MnG)I!3HEtepD0zDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MJ=8#jv*Dd-rO|gI-tPA8W3D{L~e8W7NuA#k(fma@AV&v z$TJ2CZM`;WX2%QGsJR|%C-cq}6@Y>Xd*(!!EZ)0e`wI?Ca3ag&<>o(k68H5rfPl)= zs_WGS|G6zssTs~=V`Tgpm#@ul`RQy0iv+`r-B%uJewT0nx`)Bj)z4*}Q$iB}N`Fe% literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/hint_popup.9.png b/java/res/drawable-mdpi/hint_popup.9.png new file mode 100644 index 0000000000000000000000000000000000000000..444cc26ee69c1e754a95d8c977e7169fab1e9321 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^NDSr z1<%~X^wgl##FWaylc_d9MLC`>jv*Dd-rR8HI-tPg61cp=<$e9skb_IN1&Ff!Vs2Xf zAwW6M)g_A8)6_RZ^Els$z8#Z185lo_-DJFYYW`YACKe6>1&0O(Mx*8}br%=qmsS*A zviZ*!^s8dl?{yrZ&R1)!l$Wpndy)T%?g56ES7dENwbS1L?Pc(E^>bP0l+XkK - diff --git a/java/res/xml/kbd_qwerty_black_row4.xml b/java/res/xml/kbd_qwerty_black_row4.xml index 1718603fd..330ddda42 100644 --- a/java/res/xml/kbd_qwerty_black_row4.xml +++ b/java/res/xml/kbd_qwerty_black_row4.xml @@ -40,6 +40,7 @@ latin:keyWidth="40%p" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_f1" /> @@ -153,6 +158,7 @@ latin:keyWidth="20%p" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_f1" /> @@ -312,6 +323,7 @@ latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - - - - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml index b6a069c25..9e401a1cd 100644 --- a/java/res/xml/kbd_symbols_black.xml +++ b/java/res/xml/kbd_symbols_black.xml @@ -142,59 +142,63 @@ latin:keyEdgeFlags="right" /> - - - - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black_row4_common.xml b/java/res/xml/kbd_symbols_black_row4_common.xml new file mode 100644 index 000000000..7433eca7f --- /dev/null +++ b/java/res/xml/kbd_symbols_black_row4_common.xml @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black_row4_common_with_settings_key.xml b/java/res/xml/kbd_symbols_black_row4_common_with_settings_key.xml new file mode 100644 index 000000000..bbb169919 --- /dev/null +++ b/java/res/xml/kbd_symbols_black_row4_common_with_settings_key.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black_row4_im.xml b/java/res/xml/kbd_symbols_black_row4_im.xml new file mode 100644 index 000000000..a1546b7b5 --- /dev/null +++ b/java/res/xml/kbd_symbols_black_row4_im.xml @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black_row4_im_with_settings_key.xml b/java/res/xml/kbd_symbols_black_row4_im_with_settings_key.xml new file mode 100644 index 000000000..4cab461e7 --- /dev/null +++ b/java/res/xml/kbd_symbols_black_row4_im_with_settings_key.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_row4_common.xml b/java/res/xml/kbd_symbols_row4_common.xml new file mode 100644 index 000000000..ef7cdcaff --- /dev/null +++ b/java/res/xml/kbd_symbols_row4_common.xml @@ -0,0 +1,51 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_row4_common_with_settings_key.xml b/java/res/xml/kbd_symbols_row4_common_with_settings_key.xml new file mode 100644 index 000000000..54b85429c --- /dev/null +++ b/java/res/xml/kbd_symbols_row4_common_with_settings_key.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_row4_im.xml b/java/res/xml/kbd_symbols_row4_im.xml new file mode 100644 index 000000000..c7d679bc4 --- /dev/null +++ b/java/res/xml/kbd_symbols_row4_im.xml @@ -0,0 +1,52 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_row4_im_with_settings_key.xml b/java/res/xml/kbd_symbols_row4_im_with_settings_key.xml new file mode 100644 index 000000000..7cc209b6b --- /dev/null +++ b/java/res/xml/kbd_symbols_row4_im_with_settings_key.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml index d83706b5c..b8f8faeb2 100644 --- a/java/res/xml/kbd_symbols_shift.xml +++ b/java/res/xml/kbd_symbols_shift.xml @@ -122,68 +122,63 @@ latin:keyEdgeFlags="right" /> - - - - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml index e5f8abf6e..34684a65b 100644 --- a/java/res/xml/kbd_symbols_shift_black.xml +++ b/java/res/xml/kbd_symbols_shift_black.xml @@ -121,57 +121,63 @@ latin:keyEdgeFlags="right" /> - - - - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black_row4_common.xml b/java/res/xml/kbd_symbols_shift_black_row4_common.xml new file mode 100644 index 000000000..beb5b3d67 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black_row4_common.xml @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black_row4_common_with_settings_key.xml b/java/res/xml/kbd_symbols_shift_black_row4_common_with_settings_key.xml new file mode 100644 index 000000000..97f882a5a --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black_row4_common_with_settings_key.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black_row4_im.xml b/java/res/xml/kbd_symbols_shift_black_row4_im.xml new file mode 100644 index 000000000..c0263c215 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black_row4_im.xml @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black_row4_im_with_settings_key.xml b/java/res/xml/kbd_symbols_shift_black_row4_im_with_settings_key.xml new file mode 100644 index 000000000..14d6a0b51 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black_row4_im_with_settings_key.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_row4_common.xml b/java/res/xml/kbd_symbols_shift_row4_common.xml new file mode 100644 index 000000000..4d5199e88 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4_common.xml @@ -0,0 +1,49 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_row4_common_with_settings_key.xml b/java/res/xml/kbd_symbols_shift_row4_common_with_settings_key.xml new file mode 100644 index 000000000..df570ea1b --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4_common_with_settings_key.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_row4_im.xml b/java/res/xml/kbd_symbols_shift_row4_im.xml new file mode 100644 index 000000000..69c609254 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4_im.xml @@ -0,0 +1,50 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_row4_im_with_settings_key.xml b/java/res/xml/kbd_symbols_shift_row4_im_with_settings_key.xml new file mode 100644 index 000000000..aad6e400b --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4_im_with_settings_key.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + diff --git a/java/res/xml/popup_at.xml b/java/res/xml/popup_at.xml new file mode 100644 index 000000000..4b19d4fd4 --- /dev/null +++ b/java/res/xml/popup_at.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/java/res/xml/popup_slash.xml b/java/res/xml/popup_slash.xml new file mode 100644 index 000000000..1ace909ef --- /dev/null +++ b/java/res/xml/popup_slash.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 86dbf1f60..ec422174d 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -29,14 +29,14 @@ import java.util.Locale; public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { - public static final int MODE_NONE = 0; - public static final int MODE_TEXT = 1; - public static final int MODE_SYMBOLS = 2; - public static final int MODE_PHONE = 3; - public static final int MODE_URL = 4; - public static final int MODE_EMAIL = 5; - public static final int MODE_IM = 6; - public static final int MODE_WEB = 7; + public static final int MODE_TEXT = 0; + public static final int MODE_URL = 1; + public static final int MODE_EMAIL = 2; + public static final int MODE_IM = 3; + public static final int MODE_WEB = 4; + public static final int MODE_PHONE = 5; + + public static final int MODE_NONE = -1; // Main keyboard layouts without the settings key public static final int KEYBOARDMODE_NORMAL = R.id.mode_normal; @@ -44,6 +44,13 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public static final int KEYBOARDMODE_EMAIL = R.id.mode_email; public static final int KEYBOARDMODE_IM = R.id.mode_im; public static final int KEYBOARDMODE_WEB = R.id.mode_webentry; + public static final int[] QWERTY_MODES = { + KEYBOARDMODE_NORMAL, + KEYBOARDMODE_URL, + KEYBOARDMODE_EMAIL, + KEYBOARDMODE_IM, + KEYBOARDMODE_WEB, + 0 /* for MODE_PHONE */ }; // Main keyboard layouts with the settings key public static final int KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY = R.id.mode_normal_with_settings_key; @@ -55,12 +62,45 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha R.id.mode_im_with_settings_key; public static final int KEYBOARDMODE_WEB_WITH_SETTINGS_KEY = R.id.mode_webentry_with_settings_key; + public static final int[] QWERTY_WITH_SETTINGS_KEY_MODES = { + KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY, + KEYBOARDMODE_URL_WITH_SETTINGS_KEY, + KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY, + KEYBOARDMODE_IM_WITH_SETTINGS_KEY, + KEYBOARDMODE_WEB_WITH_SETTINGS_KEY, + 0 /* for MODE_PHONE */ }; - // Symbols keyboard layout without the settings key - public static final int KEYBOARDMODE_SYMBOLS = R.id.mode_symbols; - // Symbols keyboard layout with the settings key - public static final int KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY = - R.id.mode_symbols_with_settings_key; + // Symbols keyboard layouts without the settings key + public static final int KEYBOARDMODE_SYMBOLS_NORMAL = R.id.mode_symbols_normal; + public static final int KEYBOARDMODE_SYMBOLS_URL = R.id.mode_symbols_url; + public static final int KEYBOARDMODE_SYMBOLS_EMAIL = R.id.mode_symbols_email; + public static final int KEYBOARDMODE_SYMBOLS_IM = R.id.mode_symbols_im; + public static final int KEYBOARDMODE_SYMBOLS_WEB = R.id.mode_symbols_webentry; + public static final int[] SYMBOLS_MODES = { + KEYBOARDMODE_SYMBOLS_NORMAL, + KEYBOARDMODE_SYMBOLS_URL, + KEYBOARDMODE_SYMBOLS_EMAIL, + KEYBOARDMODE_SYMBOLS_IM, + KEYBOARDMODE_SYMBOLS_WEB, + 0 /* for MODE_PHONE */ }; + // Symbols keyboard layouts with the settings key + public static final int KEYBOARDMODE_SYMBOLS_NORMAL_WITH_SETTINGS_KEY = + R.id.mode_symbols_normal_with_settings_key; + public static final int KEYBOARDMODE_SYMBOLS_URL_WITH_SETTINGS_KEY = + R.id.mode_symbols_url_with_settings_key; + public static final int KEYBOARDMODE_SYMBOLS_EMAIL_WITH_SETTINGS_KEY = + R.id.mode_symbols_email_with_settings_key; + public static final int KEYBOARDMODE_SYMBOLS_IM_WITH_SETTINGS_KEY = + R.id.mode_symbols_im_with_settings_key; + public static final int KEYBOARDMODE_SYMBOLS_WEB_WITH_SETTINGS_KEY = + R.id.mode_symbols_webentry_with_settings_key; + public static final int[] SYMBOLS_WITH_SETTINGS_KEY_MODES = { + KEYBOARDMODE_SYMBOLS_NORMAL_WITH_SETTINGS_KEY, + KEYBOARDMODE_SYMBOLS_URL_WITH_SETTINGS_KEY, + KEYBOARDMODE_SYMBOLS_EMAIL_WITH_SETTINGS_KEY, + KEYBOARDMODE_SYMBOLS_IM_WITH_SETTINGS_KEY, + KEYBOARDMODE_SYMBOLS_WEB_WITH_SETTINGS_KEY, + 0 /* for MODE_PHONE */ }; public static final String DEFAULT_LAYOUT_ID = "4"; public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902"; @@ -115,7 +155,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private boolean mIsAutoCompletionActive; private boolean mHasVoice; private boolean mVoiceOnPrimary; - private boolean mPreferSymbols; private int mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; // Indicates whether or not we have the settings key @@ -158,21 +197,26 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } private KeyboardId makeSymbolsId(boolean hasVoice) { + final int mode = mMode == MODE_NONE ? MODE_TEXT : mMode; return new KeyboardId(KBD_SYMBOLS[getCharColorId()], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, + SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode], false, hasVoice); } private KeyboardId makeSymbolsShiftedId(boolean hasVoice) { + final int mode = mMode == MODE_NONE ? MODE_TEXT : mMode; return new KeyboardId(KBD_SYMBOLS_SHIFT[getCharColorId()], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, + SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode], false, hasVoice); } - public void makeKeyboards(boolean forceCreate) { + private void makeSymbolsKeyboardIds() { mSymbolsId = makeSymbolsId(mHasVoice && !mVoiceOnPrimary); mSymbolsShiftedId = makeSymbolsShiftedId(mHasVoice && !mVoiceOnPrimary); + } + public void makeKeyboards(boolean forceCreate) { + makeSymbolsKeyboardIds(); if (forceCreate) mKeyboards.clear(); // Configuration change is coming after the keyboard gets recreated. So don't rely on that. // If keyboards have already been made, check if we have a screen width change and @@ -207,10 +251,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha }); } - public KeyboardId(int xml, boolean hasVoice) { - this(xml, 0, false, hasVoice); - } - @Override public boolean equals(Object other) { return other instanceof KeyboardId && equals((KeyboardId) other); @@ -244,14 +284,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public void setKeyboardMode(int mode, int imeOptions, boolean enableVoice) { mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; - mPreferSymbols = mode == MODE_SYMBOLS; - if (mode == MODE_SYMBOLS) { - mode = MODE_TEXT; - } try { - setKeyboardMode(mode, imeOptions, enableVoice, mPreferSymbols); + setKeyboardMode(mode, imeOptions, enableVoice, false); } catch (RuntimeException e) { - LatinImeLogger.logOnException(mode + "," + imeOptions + "," + mPreferSymbols, e); + LatinImeLogger.logOnException(mode + "," + imeOptions, e); } } @@ -259,8 +295,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha if (mInputView == null) return; mMode = mode; mImeOptions = imeOptions; + makeSymbolsKeyboardIds(); if (enableVoice != mHasVoice) { - setVoiceMode(mHasVoice, mVoiceOnPrimary); + // TODO clean up this unnecessary recursive call. + setVoiceMode(enableVoice, mVoiceOnPrimary); } mIsSymbols = isSymbols; @@ -277,7 +315,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mInputView.setKeyboard(keyboard); keyboard.setShifted(false); keyboard.setShiftLocked(keyboard.isShiftLocked()); - keyboard.setImeOptions(mInputMethodService.getResources(), mMode, imeOptions); + keyboard.setImeOptions(mInputMethodService.getResources(), mode, imeOptions); keyboard.setColorOfSymbolIcons(mIsAutoCompletionActive, isBlackSym()); // Update the settings key state because number of enabled IMEs could have been changed updateSettingsKeyState(PreferenceManager.getDefaultSharedPreferences(mInputMethodService)); @@ -309,48 +347,31 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) { - boolean hasVoice = hasVoiceButton(isSymbols); - int charColorId = getCharColorId(); - // TODO: generalize for any KeyboardId - int keyboardRowsResId = KBD_QWERTY[charColorId]; + final boolean hasVoice = hasVoiceButton(isSymbols); + final int charColorId = getCharColorId(); + final int keyboardRowsResId; + final boolean enableShiftLock; + final int keyboardMode; + + if (mode == MODE_NONE) { + LatinImeLogger.logOnWarning( + "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols); + mode = MODE_TEXT; + } if (isSymbols) { - if (mode == MODE_PHONE) { - return new KeyboardId(KBD_PHONE_SYMBOLS[charColorId], hasVoice); - } else { - return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - } + keyboardRowsResId = mode == MODE_PHONE + ? KBD_PHONE_SYMBOLS[charColorId] : KBD_SYMBOLS[charColorId]; + enableShiftLock = false; + keyboardMode = mHasSettingsKey + ? SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode]; + } else { // QWERTY + keyboardRowsResId = mode == MODE_PHONE + ? KBD_PHONE[charColorId] : KBD_QWERTY[charColorId]; + enableShiftLock = mode == MODE_PHONE ? false : true; + keyboardMode = mHasSettingsKey + ? QWERTY_WITH_SETTINGS_KEY_MODES[mode] : QWERTY_MODES[mode]; } - switch (mode) { - case MODE_NONE: - LatinImeLogger.logOnWarning( - "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols); - /* fall through */ - case MODE_TEXT: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY : KEYBOARDMODE_NORMAL, - true, hasVoice); - case MODE_SYMBOLS: - return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - case MODE_PHONE: - return new KeyboardId(KBD_PHONE[charColorId], hasVoice); - case MODE_URL: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_URL_WITH_SETTINGS_KEY : KEYBOARDMODE_URL, true, hasVoice); - case MODE_EMAIL: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY : KEYBOARDMODE_EMAIL, true, hasVoice); - case MODE_IM: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_IM_WITH_SETTINGS_KEY : KEYBOARDMODE_IM, true, hasVoice); - case MODE_WEB: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_WEB_WITH_SETTINGS_KEY : KEYBOARDMODE_WEB, true, hasVoice); - } - return null; + return new KeyboardId(keyboardRowsResId, keyboardMode, enableShiftLock, hasVoice); } public int getKeyboardMode() { @@ -411,7 +432,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public void toggleSymbols() { setKeyboardMode(mMode, mImeOptions, mHasVoice, !mIsSymbols); - if (mIsSymbols && !mPreferSymbols) { + if (mIsSymbols) { mSymbolsModeState = SYMBOLS_MODE_STATE_BEGIN; } else { mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index edda9e866..bb29e6367 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -2333,8 +2333,8 @@ public class LatinIME extends InputMethodService private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) { return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) - && !(attribute != null && attribute.privateImeOptions != null - && attribute.privateImeOptions.equals(IME_OPTION_NO_MICROPHONE)) + && !(attribute != null + && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions)) && SpeechRecognizer.isRecognitionAvailable(this); } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 3ca85c5d0..fcbada191 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -60,6 +60,7 @@ public class LatinKeyboard extends BaseKeyboard { private final Drawable mButtonArrowRightIcon; private Key mEnterKey; private Key mF1Key; + private final Drawable mHintIcon; private Key mSpaceKey; private Key m123Key; private int mSpaceKeyIndex = -1; @@ -69,6 +70,7 @@ public class LatinKeyboard extends BaseKeyboard { private LanguageSwitcher mLanguageSwitcher; private final Resources mRes; private final Context mContext; + private int mMode; // TODO: remove this and use the corresponding mode in the parent class // Whether this keyboard has voice icon on it private boolean mHasVoiceButton; // Whether voice icon is enabled at all @@ -119,6 +121,7 @@ public class LatinKeyboard extends BaseKeyboard { super(context, xmlLayoutResId, mode); final Resources res = context.getResources(); mContext = context; + mMode = mode; mRes = res; mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); @@ -133,6 +136,7 @@ public class LatinKeyboard extends BaseKeyboard { mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right); m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic); m123MicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_123_mic); + mHintIcon = res.getDrawable(R.drawable.hint_popup); setDefaultBounds(m123MicPreviewIcon); sSpacebarVerticalCorrection = res.getDimensionPixelOffset( R.dimen.spacebar_vertical_correction); @@ -180,10 +184,12 @@ public class LatinKeyboard extends BaseKeyboard { key.text = null; key.iconPreview = null; key.icon = null; + key.hintIcon = null; key.label = label; } public void setImeOptions(Resources res, int mode, int options) { + mMode = mode; if (mEnterKey == null) return; switch (options & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { @@ -292,7 +298,7 @@ public class LatinKeyboard extends BaseKeyboard { mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); } - updateF1Key(); + updateDynamicKeys(); if (mSpaceKey != null) { updateSpaceBarForLocale(isAutoCompletion, isBlack); } @@ -301,11 +307,16 @@ public class LatinKeyboard extends BaseKeyboard { public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) { mHasVoiceButton = hasVoiceButton; mVoiceEnabled = hasVoice; + updateDynamicKeys(); + } + + private void updateDynamicKeys() { + update123Key(); updateF1Key(); } - private void updateF1Key() { - if (mF1Key == null) return; + private void update123Key() { + // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode. if (m123Key != null && mIsAlphaKeyboard) { if (mVoiceEnabled && !mHasVoiceButton) { m123Key.icon = m123MicIcon; @@ -317,22 +328,52 @@ public class LatinKeyboard extends BaseKeyboard { m123Key.label = m123Label; } } + } - if (mHasVoiceButton && mVoiceEnabled) { - mF1Key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; - mF1Key.label = null; - mF1Key.icon = mMicIcon; - mF1Key.iconPreview = mMicPreviewIcon; - mF1Key.popupResId = R.xml.popup_mic; - } else { - mF1Key.label = ","; - mF1Key.codes = new int[] { ',' }; - mF1Key.icon = null; - mF1Key.iconPreview = null; - mF1Key.popupResId = R.xml.popup_comma; + private void updateF1Key() { + // Update KEYCODE_F1 key. Please note that some keyboard layouts have no F1 key. + if (mF1Key == null) + return; + + if (mIsAlphaKeyboard) { + if (mMode == KeyboardSwitcher.MODE_URL) { + setNonMicF1Key(mF1Key, "/", R.xml.popup_slash); + } else if (mMode == KeyboardSwitcher.MODE_EMAIL) { + setNonMicF1Key(mF1Key, "@", R.xml.popup_at); + } else { + if (mVoiceEnabled && mHasVoiceButton) { + setMicF1Key(mF1Key); + } else { + setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); + } + } + } else { // Symbols keyboard + if (mVoiceEnabled && mHasVoiceButton) { + setMicF1Key(mF1Key); + } else { + setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); + } } } + private void setMicF1Key(Key key) { + key.label = null; + key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; + key.popupResId = R.xml.popup_mic; + key.icon = mMicIcon; + key.hintIcon = mHintIcon; + key.iconPreview = mMicPreviewIcon; + } + + private void setNonMicF1Key(Key key, String label, int popupResId) { + key.label = label; + key.codes = new int[] { label.charAt(0) }; + key.popupResId = popupResId; + key.icon = null; + key.hintIcon = mHintIcon; + key.iconPreview = null; + } + /** * @return a key which should be invalidated. */ diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index b02780bf6..4e264e853 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -57,6 +57,8 @@ import java.util.WeakHashMap; * A view that renders a virtual {@link LatinKeyboard}. It handles rendering of keys and * detecting key presses and touch movements. * + * TODO: References to LatinKeyboard in this class should be replaced with ones to its base class. + * * @attr ref R.styleable#LatinKeyboardBaseView_keyBackground * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewLayout * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewOffset @@ -160,7 +162,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; + private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1; // XML attribute private int mKeyTextSize; @@ -861,32 +863,20 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); } - 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) { - // 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); - canvas.translate(-drawableX, -drawableY); + if (key.label == null && key.icon != null) { + int drawableWidth = key.icon.getIntrinsicWidth(); + int drawableHeight = key.icon.getIntrinsicHeight(); + int drawableX = (key.width + padding.left - padding.right - drawableWidth) / 2; + int drawableY = (key.height + padding.top - padding.bottom - drawableHeight) / 2; + drawIcon(canvas, key.icon, drawableX, drawableY, drawableWidth, drawableHeight); + + } + if (key.hintIcon != null && drawHintIcon) { + int drawableWidth = key.width; + int drawableHeight = key.height; + int drawableX = 0; + int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL; + drawIcon(canvas, key.hintIcon, drawableX, drawableY, drawableWidth, drawableHeight); } canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); } @@ -920,6 +910,13 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mDirtyRect.setEmpty(); } + private void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width, int height) { + canvas.translate(x, y); + icon.setBounds(0, 0, width, height); + icon.draw(canvas); + canvas.translate(-x, -y); + } + public void setForeground(boolean foreground) { mInForeground = foreground; } @@ -962,8 +959,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // WindowManager.BadTokenException. if (key == null || !mInForeground) return; - // Should not draw number hint icons - if (key.icon != null && key.label == null) { + if (key.icon != null) { mPreviewText.setCompoundDrawables(null, null, null, key.iconPreview != null ? key.iconPreview : key.icon); mPreviewText.setText(null); From c9bf5c005eef810d4eac2fd4ee3465ce58736a4c Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Wed, 20 Oct 2010 23:10:27 +0900 Subject: [PATCH 080/287] Make common qwerty keyboard layout files and include these Change-Id: I0cb8de748c4365e42d015078daf686ed76ca105b --- java/res/xml-xlarge/kbd_qwerty.xml | 744 +----------------- .../res/xml-xlarge/kbd_qwerty_row1_common.xml | 94 +++ .../res/xml-xlarge/kbd_qwerty_row2_common.xml | 77 ++ java/res/xml-xlarge/kbd_qwerty_row2_email.xml | 73 ++ .../res/xml-xlarge/kbd_qwerty_row3_common.xml | 80 ++ java/res/xml-xlarge/kbd_qwerty_row3_email.xml | 68 ++ .../res/xml-xlarge/kbd_qwerty_row4_common.xml | 56 ++ java/res/xml-xlarge/kbd_qwerty_row4_email.xml | 40 + java/res/xml-xlarge/kbd_qwerty_row4_im.xml | 50 ++ java/res/xml-xlarge/kbd_qwerty_row4_url.xml | 48 ++ 10 files changed, 602 insertions(+), 728 deletions(-) create mode 100644 java/res/xml-xlarge/kbd_qwerty_row1_common.xml create mode 100644 java/res/xml-xlarge/kbd_qwerty_row2_common.xml create mode 100644 java/res/xml-xlarge/kbd_qwerty_row2_email.xml create mode 100644 java/res/xml-xlarge/kbd_qwerty_row3_common.xml create mode 100644 java/res/xml-xlarge/kbd_qwerty_row3_email.xml create mode 100644 java/res/xml-xlarge/kbd_qwerty_row4_common.xml create mode 100644 java/res/xml-xlarge/kbd_qwerty_row4_email.xml create mode 100644 java/res/xml-xlarge/kbd_qwerty_row4_im.xml create mode 100644 java/res/xml-xlarge/kbd_qwerty_row4_url.xml diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml index 9485ca7b3..6836c2d61 100644 --- a/java/res/xml-xlarge/kbd_qwerty.xml +++ b/java/res/xml-xlarge/kbd_qwerty.xml @@ -27,795 +27,83 @@ > - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - + - - - - - + - - - - - - + diff --git a/java/res/xml-xlarge/kbd_qwerty_row1_common.xml b/java/res/xml-xlarge/kbd_qwerty_row1_common.xml new file mode 100644 index 000000000..98b857152 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row1_common.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty_row2_common.xml b/java/res/xml-xlarge/kbd_qwerty_row2_common.xml new file mode 100644 index 000000000..907de3cbb --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row2_common.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty_row2_email.xml b/java/res/xml-xlarge/kbd_qwerty_row2_email.xml new file mode 100644 index 000000000..e274537f0 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row2_email.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty_row3_common.xml b/java/res/xml-xlarge/kbd_qwerty_row3_common.xml new file mode 100644 index 000000000..b3fa466f2 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row3_common.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty_row3_email.xml b/java/res/xml-xlarge/kbd_qwerty_row3_email.xml new file mode 100644 index 000000000..d498406c7 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row3_email.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty_row4_common.xml b/java/res/xml-xlarge/kbd_qwerty_row4_common.xml new file mode 100644 index 000000000..63e5a2400 --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row4_common.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty_row4_email.xml b/java/res/xml-xlarge/kbd_qwerty_row4_email.xml new file mode 100644 index 000000000..c5a5b061b --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row4_email.xml @@ -0,0 +1,40 @@ + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty_row4_im.xml b/java/res/xml-xlarge/kbd_qwerty_row4_im.xml new file mode 100644 index 000000000..57af2331c --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row4_im.xml @@ -0,0 +1,50 @@ + + + + + + + + + + diff --git a/java/res/xml-xlarge/kbd_qwerty_row4_url.xml b/java/res/xml-xlarge/kbd_qwerty_row4_url.xml new file mode 100644 index 000000000..dd57b88ca --- /dev/null +++ b/java/res/xml-xlarge/kbd_qwerty_row4_url.xml @@ -0,0 +1,48 @@ + + + + + + + + + + From f5df46f0e0eb925851c5fe5023be5e334ddf4215 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Thu, 21 Oct 2010 01:56:18 +0900 Subject: [PATCH 081/287] Add ; to list of punctuation bug: 3034792 Change-Id: I8e5f3907840fa2ddc2b5ac99328525313465ea35 --- java/res/values/donottranslate.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml index 936609924..a7c1fcd18 100644 --- a/java/res/values/donottranslate.xml +++ b/java/res/values/donottranslate.xml @@ -23,7 +23,7 @@ .,!?) - !?,\u0022\u0027:()-/@_ + !?,\u0022\u0027:();-/@_ From bf77bb7678c1129e291fb743c96f684821f1890d Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 21 Oct 2010 17:20:51 +0900 Subject: [PATCH 082/287] Refactor BaseKeyboard parsing code Change-Id: I241125b5b15c9d6bbba456476f1f4fd3ef9db3f2 --- .../inputmethod/latin/BaseKeyboard.java | 373 ++++++++++-------- 1 file changed, 201 insertions(+), 172 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index fc35ccc5d..0f42f6234 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -57,14 +57,6 @@ public class BaseKeyboard { static final String TAG = "BaseKeyboard"; - // Keyboard XML Tags - private static final String TAG_KEYBOARD = "Keyboard"; - private static final String TAG_ROW = "Row"; - private static final String TAG_KEY = "Key"; - private static final String TAG_SPACER = "Spacer"; - private static final String TAG_INCLUDE = "include"; - private static final String TAG_MERGE = "merge"; - public static final int EDGE_LEFT = 0x01; public static final int EDGE_RIGHT = 0x02; public static final int EDGE_TOP = 0x04; @@ -161,16 +153,16 @@ public class BaseKeyboard { this.parent = parent; TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard); - defaultWidth = getDimensionOrFraction(a, + defaultWidth = BaseKeyboardParser.getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyWidth, parent.mDisplayWidth, parent.mDefaultWidth); - defaultHeight = getDimensionOrFraction(a, + defaultHeight = BaseKeyboardParser.getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyHeight, parent.mDisplayHeight, parent.mDefaultHeight); - defaultHorizontalGap = getDimensionOrFraction(a, + defaultHorizontalGap = BaseKeyboardParser.getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, parent.mDisplayWidth, parent.mDefaultHorizontalGap); - verticalGap = getDimensionOrFraction(a, + verticalGap = BaseKeyboardParser.getDimensionOrFraction(a, R.styleable.BaseKeyboard_verticalGap, parent.mDisplayHeight, parent.mDefaultVerticalGap); a.recycle(); @@ -293,11 +285,14 @@ public class BaseKeyboard { TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard); - height = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyHeight, + height = BaseKeyboardParser.getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyHeight, keyboard.mDisplayHeight, parent.defaultHeight); - gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, + gap = BaseKeyboardParser.getDimensionOrFraction(a, + R.styleable.BaseKeyboard_horizontalGap, keyboard.mDisplayWidth, parent.defaultHorizontalGap); - width = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyWidth, + width = BaseKeyboardParser.getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyWidth, keyboard.mDisplayWidth, parent.defaultWidth) - gap; a.recycle(); a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard_Key); @@ -388,9 +383,9 @@ public class BaseKeyboard { * Detects if a point falls inside this key. * @param x the x-coordinate of the point * @param y the y-coordinate of the point - * @return whether or not the point falls inside the key. If the key is attached to an edge, - * it will assume that all points between the key and the edge are considered to be inside - * the key. + * @return whether or not the point falls inside the key. If the key is attached to an + * edge, it will assume that all points between the key and the edge are considered to be + * inside the key. */ public boolean isInside(int x, int y) { boolean leftEdge = (edgeFlags & EDGE_LEFT) > 0; @@ -476,11 +471,11 @@ public class BaseKeyboard { mDisplayHeight = height; mDefaultHorizontalGap = 0; - mDefaultWidth = mDisplayWidth / 10; + setKeyWidth(mDisplayWidth / 10); mDefaultVerticalGap = 0; mDefaultHeight = mDefaultWidth; mKeyboardMode = modeId; - loadKeyboard(context, context.getResources().getXml(xmlLayoutResId)); + loadKeyboard(context, xmlLayoutResId); } /** @@ -497,11 +492,11 @@ public class BaseKeyboard { //Log.v(TAG, "keyboard's display metrics:" + dm); mDefaultHorizontalGap = 0; - mDefaultWidth = mDisplayWidth / 10; + setKeyWidth(mDisplayWidth / 10); mDefaultVerticalGap = 0; mDefaultHeight = mDefaultWidth; mKeyboardMode = modeId; - loadKeyboard(context, context.getResources().getXml(xmlLayoutResId)); + loadKeyboard(context, xmlLayoutResId); } /** @@ -590,6 +585,8 @@ public class BaseKeyboard { protected void setKeyWidth(int width) { mDefaultWidth = width; + final int threshold = (int) (width * SEARCH_DISTANCE); + mProximityThreshold = threshold * threshold; } /** @@ -604,6 +601,18 @@ public class BaseKeyboard { return mTotalWidth; } + public int getKeyboardHeight() { + return mDisplayHeight; + } + + public int getKeyboardWidth() { + return mDisplayWidth; + } + + public int getKeyboardMode() { + return mKeyboardMode; + } + public boolean setShifted(boolean shiftState) { for (final Key key : mShiftKeys) { key.on = shiftState; @@ -636,11 +645,12 @@ public class BaseKeyboard { int count = 0; for (int i = 0; i < mKeys.size(); i++) { final Key key = mKeys.get(i); - if (key.squaredDistanceFrom(x, y) < mProximityThreshold || - key.squaredDistanceFrom(x + mCellWidth - 1, y) < mProximityThreshold || + final int threshold = mProximityThreshold; + if (key.squaredDistanceFrom(x, y) < threshold || + key.squaredDistanceFrom(x + mCellWidth - 1, y) < threshold || key.squaredDistanceFrom(x + mCellWidth - 1, y + mCellHeight - 1) - < mProximityThreshold || - key.squaredDistanceFrom(x, y + mCellHeight - 1) < mProximityThreshold) { + < threshold || + key.squaredDistanceFrom(x, y + mCellHeight - 1) < threshold) { indices[count++] = i; } } @@ -670,26 +680,41 @@ public class BaseKeyboard { } // TODO should be private - protected Row createRowFromXml(Resources res, XmlResourceParser parser) { - return new Row(res, this, parser); + protected BaseKeyboard.Row createRowFromXml(Resources res, XmlResourceParser parser) { + return new BaseKeyboard.Row(res, this, parser); } // TODO should be private - protected Key createKeyFromXml(Resources res, Row parent, int x, int y, + protected BaseKeyboard.Key createKeyFromXml(Resources res, Row parent, int x, int y, XmlResourceParser parser) { - return new Key(res, parent, x, y, parser); + return new BaseKeyboard.Key(res, parent, x, y, parser); } - private static class KeyboardParseState { - private final int mKeyboardMode; + private static class BaseKeyboardParser { + // Keyboard XML Tags + private static final String TAG_KEYBOARD = "Keyboard"; + private static final String TAG_ROW = "Row"; + private static final String TAG_KEY = "Key"; + private static final String TAG_SPACER = "Spacer"; + private static final String TAG_INCLUDE = "include"; + private static final String TAG_MERGE = "merge"; + + private final BaseKeyboard mKeyboard; + private final List mKeys; + private final List mShiftKeys; + private final Resources mResources; + private int mCurrentX = 0; private int mCurrentY = 0; private int mMaxRowWidth = 0; private int mTotalHeight = 0; private Row mCurrentRow = null; - public KeyboardParseState(int keyboardMode) { - mKeyboardMode = keyboardMode; + public BaseKeyboardParser(BaseKeyboard keyboard, Resources res) { + mKeyboard = keyboard; + mKeys = keyboard.getKeys(); + mShiftKeys = keyboard.getShiftKeys(); + mResources = res; } public int getX() { @@ -708,7 +733,7 @@ public class BaseKeyboard { public boolean startRow(Row row) { mCurrentX = 0; mCurrentRow = row; - return row.mode == 0 || row.mode == mKeyboardMode; + return row.mode == 0 || row.mode == mKeyboard.getKeyboardMode(); } public void skipRow() { @@ -743,15 +768,151 @@ public class BaseKeyboard { public int getTotalHeight() { return mTotalHeight; } + + private void parseKeyboard(XmlResourceParser parser) + throws XmlPullParserException, IOException { + Key key = null; + + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + // TODO createRowFromXml should not be called from + // BaseKeyboard constructor. + Row row = mKeyboard.createRowFromXml(mResources, parser); + if (!startRow(row)) + skipToEndOfRow(parser); + } else if (TAG_KEY.equals(tag)) { + // TODO createKeyFromXml should not be called from + // BaseKeyboard constructor. + key = mKeyboard.createKeyFromXml(mResources, getRow(), getX(), getY(), + parser); + mKeys.add(key); + if (key.codes[0] == KEYCODE_SHIFT) + mShiftKeys.add(key); + } else if (TAG_SPACER.equals(tag)) { + parseSpacerAttribute(parser); + } else if (TAG_KEYBOARD.equals(tag)) { + parseKeyboardAttributes(parser); + } else if (TAG_INCLUDE.equals(tag)) { + if (parser.getDepth() == 0) + throw new InflateException(" cannot be the root element"); + parseInclude(parser); + } else if (TAG_MERGE.equals(tag)) { + throw new InflateException( + " must not be appeared in keyboard XML file"); + } else { + throw new InflateException("unknown start tag: " + tag); + } + } else if (event == XmlResourceParser.END_TAG) { + String tag = parser.getName(); + if (TAG_KEY.equals(tag)) { + endKey(key); + } else if (TAG_ROW.equals(tag)) { + endRow(); + } else if (TAG_SPACER.equals(tag)) { + ; + } else if (TAG_KEYBOARD.equals(tag)) { + endKeyboard(mKeyboard.getVerticalGap()); + } else if (TAG_INCLUDE.equals(tag)) { + ; + } else if (TAG_MERGE.equals(tag)) { + return; + } else { + throw new InflateException("unknown end tag: " + tag); + } + } + } + } + + private void parseSpacerAttribute(XmlResourceParser parser) { + TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + int gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, + mKeyboard.getKeyboardWidth(), 0); + a.recycle(); + setSpacer(gap); + } + + private void parseInclude(XmlResourceParser parent) + throws XmlPullParserException, IOException { + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parent), + R.styleable.BaseKeyboard_Include); + final int keyboardLayout = a.getResourceId( + R.styleable.BaseKeyboard_Include_keyboardLayout, 0); + a.recycle(); + if (keyboardLayout == 0) + throw new InflateException(" must have keyboardLayout attribute"); + final XmlResourceParser parser = mResources.getLayout(keyboardLayout); + + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + String name = parser.getName(); + if (TAG_MERGE.equals(name)) { + parseKeyboard(parser); + return; + } else { + throw new InflateException( + "include keyboard layout must have root element"); + } + } + } + } + + private void skipToEndOfRow(XmlResourceParser parser) + throws XmlPullParserException, IOException { + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.END_TAG) { + String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + skipRow(); + return; + } + } + } + throw new InflateException("can not find "); + } + + private void parseKeyboardAttributes(XmlResourceParser parser) { + TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + final int width = mKeyboard.getKeyboardWidth(); + final int height = mKeyboard.getKeyboardHeight(); + mKeyboard.setKeyWidth(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyWidth, width, width / 10)); + mKeyboard.setKeyHeight(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyHeight, height, 50)); + mKeyboard.setHorizontalGap(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_horizontalGap, width, 0)); + mKeyboard.setVerticalGap(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_verticalGap, height, 0)); + a.recycle(); + } + + public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { + TypedValue value = a.peekValue(index); + if (value == null) + return defValue; + if (value.type == TypedValue.TYPE_DIMENSION) { + return a.getDimensionPixelOffset(index, defValue); + } else if (value.type == TypedValue.TYPE_FRACTION) { + // Round it to avoid values like 47.9999 from getting truncated + return Math.round(a.getFraction(index, base, base, defValue)); + } + return defValue; + } } - private void loadKeyboard(Context context, XmlResourceParser parser) { + private void loadKeyboard(Context context, int xmlLayoutResId) { try { - KeyboardParseState state = new KeyboardParseState(mKeyboardMode); - parseKeyboard(context.getResources(), parser, state); + BaseKeyboardParser parser = new BaseKeyboardParser(this, context.getResources()); + parser.parseKeyboard(context.getResources().getXml(xmlLayoutResId)); // mTotalWidth is the width of this keyboard which is maximum width of row. - mTotalWidth = state.getMaxRowWidth(); - mTotalHeight = state.getTotalHeight(); + mTotalWidth = parser.getMaxRowWidth(); + mTotalHeight = parser.getTotalHeight(); } catch (XmlPullParserException e) { throw new IllegalArgumentException(e); } catch (IOException e) { @@ -759,138 +920,6 @@ public class BaseKeyboard { } } - private void parseKeyboard(Resources res, XmlResourceParser parser, KeyboardParseState state) - throws XmlPullParserException, IOException { - Key key = null; - - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.START_TAG) { - String tag = parser.getName(); - if (TAG_ROW.equals(tag)) { - // TODO createRowFromXml should not be called from BaseKeyboard constructor. - Row row = createRowFromXml(res, parser); - if (!state.startRow(row)) - skipToEndOfRow(parser, state); - } else if (TAG_KEY.equals(tag)) { - // TODO createKeyFromXml should not be called from BaseKeyboard constructor. - key = createKeyFromXml(res, state.getRow(), state.getX(), state.getY(), - parser); - mKeys.add(key); - if (key.codes[0] == KEYCODE_SHIFT) - mShiftKeys.add(key); - } else if (TAG_SPACER.equals(tag)) { - parseSpacerAttribute(res, parser, state); - } else if (TAG_KEYBOARD.equals(tag)) { - parseKeyboardAttributes(res, parser); - } else if (TAG_INCLUDE.equals(tag)) { - if (parser.getDepth() == 0) - throw new InflateException(" cannot be the root element"); - parseInclude(res, parser, state); - } else if (TAG_MERGE.equals(tag)) { - throw new InflateException(" must not be appeared in keyboard XML file"); - } else { - throw new InflateException("unknown start tag: " + tag); - } - } else if (event == XmlResourceParser.END_TAG) { - String tag = parser.getName(); - if (TAG_KEY.equals(tag)) { - state.endKey(key); - } else if (TAG_ROW.equals(tag)) { - state.endRow(); - } else if (TAG_SPACER.equals(tag)) { - ; - } else if (TAG_KEYBOARD.equals(tag)) { - state.endKeyboard(mDefaultVerticalGap); - } else if (TAG_INCLUDE.equals(tag)) { - ; - } else if (TAG_MERGE.equals(tag)) { - return; - } else { - throw new InflateException("unknown end tag: " + tag); - } - } - } - } - - private void parseSpacerAttribute(Resources res, XmlResourceParser parser, - KeyboardParseState state) { - TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard); - int gap = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_horizontalGap, mDisplayWidth, 0); - a.recycle(); - state.setSpacer(gap); - } - - private void parseInclude(Resources res, XmlResourceParser parent, KeyboardParseState state) - throws XmlPullParserException, IOException { - final TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parent), - R.styleable.BaseKeyboard_Include); - final int keyboardLayout = a.getResourceId( - R.styleable.BaseKeyboard_Include_keyboardLayout, 0); - a.recycle(); - if (keyboardLayout == 0) - throw new InflateException(" must have keyboardLayout attribute"); - final XmlResourceParser parser = res.getLayout(keyboardLayout); - - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.START_TAG) { - String name = parser.getName(); - if (TAG_MERGE.equals(name)) { - parseKeyboard(res, parser, state); - return; - } else { - throw new InflateException( - "include keyboard layout must have root element"); - } - } - } - } - - private void skipToEndOfRow(XmlResourceParser parser, KeyboardParseState state) - throws XmlPullParserException, IOException { - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.END_TAG) { - String tag = parser.getName(); - if (TAG_ROW.equals(tag)) { - state.skipRow(); - return; - } - } - } - throw new InflateException("can not find "); - } - - private void parseKeyboardAttributes(Resources res, XmlResourceParser parser) { - TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.BaseKeyboard); - mDefaultWidth = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyWidth, mDisplayWidth, mDisplayWidth / 10); - mDefaultHeight = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyHeight, mDisplayHeight, 50); - mDefaultHorizontalGap = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_horizontalGap, mDisplayWidth, 0); - mDefaultVerticalGap = getDimensionOrFraction(a, - R.styleable.BaseKeyboard_verticalGap, mDisplayHeight, 0); - mProximityThreshold = (int) (mDefaultWidth * SEARCH_DISTANCE); - mProximityThreshold = mProximityThreshold * mProximityThreshold; - a.recycle(); - } - - static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { - TypedValue value = a.peekValue(index); - if (value == null) return defValue; - if (value.type == TypedValue.TYPE_DIMENSION) { - return a.getDimensionPixelOffset(index, defValue); - } else if (value.type == TypedValue.TYPE_FRACTION) { - // Round it to avoid values like 47.9999 from getting truncated - return Math.round(a.getFraction(index, base, base, defValue)); - } - return defValue; - } - protected static void setDefaultBounds(Drawable drawable) { if (drawable != null) drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), From 41338e6c32947d0bb889e0f98c62650b7889e0dd Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 21 Oct 2010 19:05:53 +0900 Subject: [PATCH 083/287] Move BaseKeyboardParser to top-level class Bug: 3082538 Change-Id: If0ddf32bc3811e3c65a7a96503c61ed3351eeb66 --- .../inputmethod/latin/BaseKeyboard.java | 217 ---------------- .../inputmethod/latin/BaseKeyboardParser.java | 233 ++++++++++++++++++ 2 files changed, 233 insertions(+), 217 deletions(-) create mode 100644 java/src/com/android/inputmethod/latin/BaseKeyboardParser.java diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index 0f42f6234..517bfbfda 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -28,7 +28,6 @@ import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.util.Xml; -import android.view.InflateException; import java.io.IOException; import java.util.ArrayList; @@ -690,222 +689,6 @@ public class BaseKeyboard { return new BaseKeyboard.Key(res, parent, x, y, parser); } - private static class BaseKeyboardParser { - // Keyboard XML Tags - private static final String TAG_KEYBOARD = "Keyboard"; - private static final String TAG_ROW = "Row"; - private static final String TAG_KEY = "Key"; - private static final String TAG_SPACER = "Spacer"; - private static final String TAG_INCLUDE = "include"; - private static final String TAG_MERGE = "merge"; - - private final BaseKeyboard mKeyboard; - private final List mKeys; - private final List mShiftKeys; - private final Resources mResources; - - private int mCurrentX = 0; - private int mCurrentY = 0; - private int mMaxRowWidth = 0; - private int mTotalHeight = 0; - private Row mCurrentRow = null; - - public BaseKeyboardParser(BaseKeyboard keyboard, Resources res) { - mKeyboard = keyboard; - mKeys = keyboard.getKeys(); - mShiftKeys = keyboard.getShiftKeys(); - mResources = res; - } - - public int getX() { - return mCurrentX; - } - - public int getY() { - return mCurrentY; - } - - public Row getRow() { - return mCurrentRow; - } - - // return true if the row is valid for this keyboard mode - public boolean startRow(Row row) { - mCurrentX = 0; - mCurrentRow = row; - return row.mode == 0 || row.mode == mKeyboard.getKeyboardMode(); - } - - public void skipRow() { - mCurrentRow = null; - } - - public void endRow() { - if (mCurrentRow == null) - throw new InflateException("orphant end row tag"); - mCurrentY += mCurrentRow.verticalGap + mCurrentRow.defaultHeight; - mCurrentRow = null; - } - - public void endKey(Key key) { - mCurrentX += key.gap + key.width; - if (mCurrentX > mMaxRowWidth) - mMaxRowWidth = mCurrentX; - } - - public void endKeyboard(int defaultVerticalGap) { - mTotalHeight = mCurrentY - defaultVerticalGap; - } - - public void setSpacer(int gap) { - mCurrentX += gap; - } - - public int getMaxRowWidth() { - return mMaxRowWidth; - } - - public int getTotalHeight() { - return mTotalHeight; - } - - private void parseKeyboard(XmlResourceParser parser) - throws XmlPullParserException, IOException { - Key key = null; - - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.START_TAG) { - String tag = parser.getName(); - if (TAG_ROW.equals(tag)) { - // TODO createRowFromXml should not be called from - // BaseKeyboard constructor. - Row row = mKeyboard.createRowFromXml(mResources, parser); - if (!startRow(row)) - skipToEndOfRow(parser); - } else if (TAG_KEY.equals(tag)) { - // TODO createKeyFromXml should not be called from - // BaseKeyboard constructor. - key = mKeyboard.createKeyFromXml(mResources, getRow(), getX(), getY(), - parser); - mKeys.add(key); - if (key.codes[0] == KEYCODE_SHIFT) - mShiftKeys.add(key); - } else if (TAG_SPACER.equals(tag)) { - parseSpacerAttribute(parser); - } else if (TAG_KEYBOARD.equals(tag)) { - parseKeyboardAttributes(parser); - } else if (TAG_INCLUDE.equals(tag)) { - if (parser.getDepth() == 0) - throw new InflateException(" cannot be the root element"); - parseInclude(parser); - } else if (TAG_MERGE.equals(tag)) { - throw new InflateException( - " must not be appeared in keyboard XML file"); - } else { - throw new InflateException("unknown start tag: " + tag); - } - } else if (event == XmlResourceParser.END_TAG) { - String tag = parser.getName(); - if (TAG_KEY.equals(tag)) { - endKey(key); - } else if (TAG_ROW.equals(tag)) { - endRow(); - } else if (TAG_SPACER.equals(tag)) { - ; - } else if (TAG_KEYBOARD.equals(tag)) { - endKeyboard(mKeyboard.getVerticalGap()); - } else if (TAG_INCLUDE.equals(tag)) { - ; - } else if (TAG_MERGE.equals(tag)) { - return; - } else { - throw new InflateException("unknown end tag: " + tag); - } - } - } - } - - private void parseSpacerAttribute(XmlResourceParser parser) { - TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.BaseKeyboard); - int gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, - mKeyboard.getKeyboardWidth(), 0); - a.recycle(); - setSpacer(gap); - } - - private void parseInclude(XmlResourceParser parent) - throws XmlPullParserException, IOException { - final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parent), - R.styleable.BaseKeyboard_Include); - final int keyboardLayout = a.getResourceId( - R.styleable.BaseKeyboard_Include_keyboardLayout, 0); - a.recycle(); - if (keyboardLayout == 0) - throw new InflateException(" must have keyboardLayout attribute"); - final XmlResourceParser parser = mResources.getLayout(keyboardLayout); - - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.START_TAG) { - String name = parser.getName(); - if (TAG_MERGE.equals(name)) { - parseKeyboard(parser); - return; - } else { - throw new InflateException( - "include keyboard layout must have root element"); - } - } - } - } - - private void skipToEndOfRow(XmlResourceParser parser) - throws XmlPullParserException, IOException { - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.END_TAG) { - String tag = parser.getName(); - if (TAG_ROW.equals(tag)) { - skipRow(); - return; - } - } - } - throw new InflateException("can not find "); - } - - private void parseKeyboardAttributes(XmlResourceParser parser) { - TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.BaseKeyboard); - final int width = mKeyboard.getKeyboardWidth(); - final int height = mKeyboard.getKeyboardHeight(); - mKeyboard.setKeyWidth(getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyWidth, width, width / 10)); - mKeyboard.setKeyHeight(getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyHeight, height, 50)); - mKeyboard.setHorizontalGap(getDimensionOrFraction(a, - R.styleable.BaseKeyboard_horizontalGap, width, 0)); - mKeyboard.setVerticalGap(getDimensionOrFraction(a, - R.styleable.BaseKeyboard_verticalGap, height, 0)); - a.recycle(); - } - - public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { - TypedValue value = a.peekValue(index); - if (value == null) - return defValue; - if (value.type == TypedValue.TYPE_DIMENSION) { - return a.getDimensionPixelOffset(index, defValue); - } else if (value.type == TypedValue.TYPE_FRACTION) { - // Round it to avoid values like 47.9999 from getting truncated - return Math.round(a.getFraction(index, base, base, defValue)); - } - return defValue; - } - } - private void loadKeyboard(Context context, int xmlLayoutResId) { try { BaseKeyboardParser parser = new BaseKeyboardParser(this, context.getResources()); diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java b/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java new file mode 100644 index 000000000..b718c14be --- /dev/null +++ b/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import com.android.inputmethod.latin.BaseKeyboard.Key; +import com.android.inputmethod.latin.BaseKeyboard.Row; + +import org.xmlpull.v1.XmlPullParserException; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.util.TypedValue; +import android.util.Xml; +import android.view.InflateException; + +import java.io.IOException; + +public class BaseKeyboardParser { + // Keyboard XML Tags + private static final String TAG_KEYBOARD = "Keyboard"; + private static final String TAG_ROW = "Row"; + private static final String TAG_KEY = "Key"; + private static final String TAG_SPACER = "Spacer"; + private static final String TAG_INCLUDE = "include"; + private static final String TAG_MERGE = "merge"; + + private final BaseKeyboard mKeyboard; + private final Resources mResources; + + private int mCurrentX = 0; + private int mCurrentY = 0; + private int mMaxRowWidth = 0; + private int mTotalHeight = 0; + private Row mCurrentRow = null; + + public BaseKeyboardParser(BaseKeyboard keyboard, Resources res) { + mKeyboard = keyboard; + mResources = res; + } + + public int getMaxRowWidth() { + return mMaxRowWidth; + } + + public int getTotalHeight() { + return mTotalHeight; + } + + public void parseKeyboard(XmlResourceParser parser) + throws XmlPullParserException, IOException { + final BaseKeyboard keyboard = mKeyboard; + Key key = null; + + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + // TODO createRowFromXml should not be called from + // BaseKeyboard constructor. + Row row = keyboard.createRowFromXml(mResources, parser); + if (!startRow(row)) + skipToEndOfRow(parser); + } else if (TAG_KEY.equals(tag)) { + // TODO createKeyFromXml should not be called from + // BaseKeyboard constructor. + key = keyboard.createKeyFromXml(mResources, mCurrentRow, mCurrentX, mCurrentY, + parser); + keyboard.getKeys().add(key); + if (key.codes[0] == BaseKeyboard.KEYCODE_SHIFT) + keyboard.getShiftKeys().add(key); + } else if (TAG_SPACER.equals(tag)) { + parseSpacerAttribute(parser); + } else if (TAG_KEYBOARD.equals(tag)) { + parseKeyboardAttributes(parser); + } else if (TAG_INCLUDE.equals(tag)) { + if (parser.getDepth() == 0) + throw new InflateException(" cannot be the root element"); + parseInclude(parser); + } else if (TAG_MERGE.equals(tag)) { + throw new InflateException( + " must not be appeared in keyboard XML file"); + } else { + throw new InflateException("unknown start tag: " + tag); + } + } else if (event == XmlResourceParser.END_TAG) { + String tag = parser.getName(); + if (TAG_KEY.equals(tag)) { + endKey(key); + } else if (TAG_ROW.equals(tag)) { + endRow(); + } else if (TAG_SPACER.equals(tag)) { + ; + } else if (TAG_KEYBOARD.equals(tag)) { + endKeyboard(mKeyboard.getVerticalGap()); + } else if (TAG_INCLUDE.equals(tag)) { + ; + } else if (TAG_MERGE.equals(tag)) { + return; + } else { + throw new InflateException("unknown end tag: " + tag); + } + } + } + } + + // return true if the row is valid for this keyboard mode + private boolean startRow(Row row) { + mCurrentX = 0; + mCurrentRow = row; + return row.mode == 0 || row.mode == mKeyboard.getKeyboardMode(); + } + + private void skipRow() { + mCurrentRow = null; + } + + private void endRow() { + if (mCurrentRow == null) + throw new InflateException("orphant end row tag"); + mCurrentY += mCurrentRow.verticalGap + mCurrentRow.defaultHeight; + mCurrentRow = null; + } + + private void endKey(Key key) { + mCurrentX += key.gap + key.width; + if (mCurrentX > mMaxRowWidth) + mMaxRowWidth = mCurrentX; + } + + private void endKeyboard(int defaultVerticalGap) { + mTotalHeight = mCurrentY - defaultVerticalGap; + } + + private void setSpacer(int gap) { + mCurrentX += gap; + } + + private void parseSpacerAttribute(XmlResourceParser parser) { + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + int gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, + mKeyboard.getKeyboardWidth(), 0); + a.recycle(); + setSpacer(gap); + } + + private void parseInclude(XmlResourceParser parent) + throws XmlPullParserException, IOException { + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parent), + R.styleable.BaseKeyboard_Include); + final int keyboardLayout = a.getResourceId( + R.styleable.BaseKeyboard_Include_keyboardLayout, 0); + a.recycle(); + if (keyboardLayout == 0) + throw new InflateException(" must have keyboardLayout attribute"); + final XmlResourceParser parser = mResources.getLayout(keyboardLayout); + + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + String name = parser.getName(); + if (TAG_MERGE.equals(name)) { + parseKeyboard(parser); + return; + } else { + throw new InflateException( + "include keyboard layout must have root element"); + } + } + } + } + + private void skipToEndOfRow(XmlResourceParser parser) + throws XmlPullParserException, IOException { + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.END_TAG) { + String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + skipRow(); + return; + } + } + } + throw new InflateException("can not find "); + } + + private void parseKeyboardAttributes(XmlResourceParser parser) { + final BaseKeyboard keyboard = mKeyboard; + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + final int width = keyboard.getKeyboardWidth(); + final int height = keyboard.getKeyboardHeight(); + keyboard.setKeyWidth(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyWidth, width, width / 10)); + keyboard.setKeyHeight(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyHeight, height, 50)); + keyboard.setHorizontalGap(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_horizontalGap, width, 0)); + keyboard.setVerticalGap(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_verticalGap, height, 0)); + a.recycle(); + } + + public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { + final TypedValue value = a.peekValue(index); + if (value == null) + return defValue; + if (value.type == TypedValue.TYPE_DIMENSION) { + return a.getDimensionPixelOffset(index, defValue); + } else if (value.type == TypedValue.TYPE_FRACTION) { + // Round it to avoid values like 47.9999 from getting truncated + return Math.round(a.getFraction(index, base, base, defValue)); + } + return defValue; + } +} From 503797ae0e55c74068470d237fb47c4da13ec4fb Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 22 Oct 2010 14:28:12 +0900 Subject: [PATCH 084/287] Make "show settings key option" dependent to device configuration Bug: 3095814 Change-Id: I73b8a5023b398621a910c953eade252dc6412923 --- java/res/values-xlarge/bools.xml | 1 + java/res/values/bools.xml | 1 + .../inputmethod/latin/KeyboardSwitcher.java | 15 +++++++++------ .../inputmethod/latin/LatinIMESettings.java | 5 +++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/java/res/values-xlarge/bools.xml b/java/res/values-xlarge/bools.xml index fe8fc5838..66cfd9d79 100644 --- a/java/res/values-xlarge/bools.xml +++ b/java/res/values-xlarge/bools.xml @@ -20,4 +20,5 @@ false + false diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml index 5a24e4c60..64d05bd17 100644 --- a/java/res/values/bools.xml +++ b/java/res/values/bools.xml @@ -30,4 +30,5 @@ true true true + true diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index ec422174d..3a54904d3 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -160,11 +160,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha // Indicates whether or not we have the settings key private boolean mHasSettingsKey; private static final int SETTINGS_KEY_MODE_AUTO = R.string.settings_key_mode_auto; - private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW = R.string.settings_key_mode_always_show; - // NOTE: No need to have SETTINGS_KEY_MODE_ALWAYS_HIDE here because it's not being referred to - // in the source code now. - // Default is SETTINGS_KEY_MODE_AUTO. - private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO; + private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW = + R.string.settings_key_mode_always_show; + private static final int SETTINGS_KEY_MODE_ALWAYS_HIDE = + R.string.settings_key_mode_always_hide; private int mLastDisplayWidth; private LanguageSwitcher mLanguageSwitcher; @@ -543,8 +542,12 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private void updateSettingsKeyState(SharedPreferences prefs) { Resources resources = mInputMethodService.getResources(); + final boolean showSettingsKeyOption = resources.getBoolean( + R.bool.config_enable_show_settings_key_option); + final int defaultSettingsKeyMode = showSettingsKeyOption + ? SETTINGS_KEY_MODE_AUTO : SETTINGS_KEY_MODE_ALWAYS_HIDE; final String settingsKeyMode = prefs.getString(LatinIMESettings.PREF_SETTINGS_KEY, - resources.getString(DEFAULT_SETTINGS_KEY_MODE)); + resources.getString(defaultSettingsKeyMode)); // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW)) diff --git a/java/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java index 99d8a622e..4f20e9b10 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java +++ b/java/src/com/android/inputmethod/latin/LatinIMESettings.java @@ -96,6 +96,11 @@ public class LatinIMESettings extends PreferenceActivity mAutoCompletionThreshold = (ListPreference) findPreference(PREF_AUTO_COMPLETION_THRESHOLD); mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS); ensureConsistencyOfAutoCompletionSettings(); + + final boolean showSettingsKeyOption = getResources().getBoolean( + R.bool.config_enable_show_settings_key_option); + if (!showSettingsKeyOption) + getPreferenceScreen().removePreference(mSettingsKeyPreference); } @Override From 4f6060b8b77989d88f22f8020ec0d8f1db1dc2a9 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 22 Oct 2010 17:19:17 +0900 Subject: [PATCH 085/287] Table keyboard should always show return icon on enter key Bug: 3122750 Change-Id: I75d2b5adff3a349d29d8a56e7b761c26b04683c0 --- java/res/values-xlarge/bools.xml | 1 + java/res/values/bools.xml | 1 + .../inputmethod/latin/LatinKeyboard.java | 54 ++++++++++--------- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/java/res/values-xlarge/bools.xml b/java/res/values-xlarge/bools.xml index 66cfd9d79..3079133dd 100644 --- a/java/res/values-xlarge/bools.xml +++ b/java/res/values-xlarge/bools.xml @@ -21,4 +21,5 @@ false false + false diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml index 64d05bd17..5d932a693 100644 --- a/java/res/values/bools.xml +++ b/java/res/values/bools.xml @@ -31,4 +31,5 @@ true true true + true diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index fcbada191..8e16feb5e 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -192,31 +192,35 @@ public class LatinKeyboard extends BaseKeyboard { mMode = mode; 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; - default: - resetKeyAttributes(mEnterKey, mDefaultEnterLabel); - mEnterKey.text = mDefaultEnterText; - mEnterKey.icon = mDefaultEnterIcon; - mEnterKey.iconPreview = mDefaultEnterPreview; - break; + final boolean configDynamicKeyToEnterKey = res.getBoolean( + R.bool.config_dynamic_key_top_enter_key); + if (configDynamicKeyToEnterKey) { + 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; + default: + resetKeyAttributes(mEnterKey, mDefaultEnterLabel); + mEnterKey.text = mDefaultEnterText; + mEnterKey.icon = mDefaultEnterIcon; + mEnterKey.iconPreview = mDefaultEnterPreview; + break; + } } // Set the initial size of the preview icon setDefaultBounds(mEnterKey.iconPreview); From 1397cbab76aa9086702e3bb0c0be98e2a83b0dd7 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 22 Oct 2010 18:11:11 +0900 Subject: [PATCH 086/287] Make mini-keyboard narrower on tablet landscape mode This change narrows mini-keyboard key width from 7.5% to 5.0% of the screen width. Bug: 3122769 Change-Id: I4ae0e79262ec3fadab8f86aa57a8a6cec5cb4670 --- .../xml-xlarge-land/kbd_popup_template.xml | 27 ++++++ java/res/xml-xlarge-land/popup_smileys.xml | 89 +++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 java/res/xml-xlarge-land/kbd_popup_template.xml create mode 100644 java/res/xml-xlarge-land/popup_smileys.xml diff --git a/java/res/xml-xlarge-land/kbd_popup_template.xml b/java/res/xml-xlarge-land/kbd_popup_template.xml new file mode 100644 index 000000000..5fe9f67d9 --- /dev/null +++ b/java/res/xml-xlarge-land/kbd_popup_template.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/java/res/xml-xlarge-land/popup_smileys.xml b/java/res/xml-xlarge-land/popup_smileys.xml new file mode 100644 index 000000000..bdd6805da --- /dev/null +++ b/java/res/xml-xlarge-land/popup_smileys.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + From 0b1cb2d039466acaeb5f1f180cf2fc60b5482b1e Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 22 Oct 2010 01:24:23 +0900 Subject: [PATCH 087/287] Refactor BaseKeyboardParser as Recursive Descendent Parser Bug: 3082538 Change-Id: Ic0d72c6fe08cfc20db86aeffb10a27efe678095e --- .../inputmethod/latin/BaseKeyboard.java | 10 +- .../inputmethod/latin/BaseKeyboardParser.java | 409 ++++++++++++------ 2 files changed, 293 insertions(+), 126 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index 517bfbfda..cb41ad047 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -121,7 +121,7 @@ public class BaseKeyboard { /** * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate. - * Some of the key size defaults can be overridden per row from what the {@link Keyboard} + * Some of the key size defaults can be overridden per row from what the {@link BaseKeyboard} * defines. */ public static class Row { @@ -135,7 +135,7 @@ public class BaseKeyboard { public int verticalGap; /** * Edge flags for this row of keys. Possible values that can be assigned are - * {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM} + * {@link BaseKeyboard#EDGE_TOP EDGE_TOP} and {@link BaseKeyboard#EDGE_BOTTOM EDGE_BOTTOM} */ public int rowEdgeFlags; @@ -217,8 +217,8 @@ public class BaseKeyboard { /** * Flags that specify the anchoring to edges of the keyboard for detecting touch events * that are just out of the boundary of the key. This is a bit mask of - * {@link Keyboard#EDGE_LEFT}, {@link Keyboard#EDGE_RIGHT}, {@link Keyboard#EDGE_TOP} and - * {@link Keyboard#EDGE_BOTTOM}. + * {@link BaseKeyboard#EDGE_LEFT}, {@link BaseKeyboard#EDGE_RIGHT}, + * {@link BaseKeyboard#EDGE_TOP} and {@link BaseKeyboard#EDGE_BOTTOM}. */ public int edgeFlags; /** Whether this is a modifier key, such as Shift or Alt */ @@ -274,7 +274,7 @@ public class BaseKeyboard { * the XML parser. * @param res resources associated with the caller's context * @param parent the row that this key belongs to. The row must already be attached to - * a {@link Keyboard}. + * a {@link BaseKeyboard}. * @param x the x coordinate of the top-left * @param y the y coordinate of the top-left * @param parser the XML parser containing the attributes for this key diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java b/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java index b718c14be..628e764b5 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java @@ -24,13 +24,58 @@ import org.xmlpull.v1.XmlPullParserException; import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; +import android.util.Log; import android.util.TypedValue; import android.util.Xml; import android.view.InflateException; import java.io.IOException; +import java.util.List; +/** + * Parser for BaseKeyboard. + * + * This class parses Keyboard XML file and fill out keys in BaseKeyboard. + * The Keyboard XML file looks like: + *
+ *   >!-- xml/keyboard.xml --<
+ *   >Keyboard keyboard_attributes*<
+ *     >!-- Keyboard Content --<
+ *     >Row row_attributes*<
+ *       >!-- Row Content --<
+ *       >Key key_attributes* /<
+ *       >Spacer horizontalGap="0.2in" /<
+ *       >include keyboardLayout="@xml/other_keys"<
+ *       ...
+ *     >/Row<
+ *     >include keyboardLayout="@xml/other_rows"<
+ *     ...
+ *   >/Keyboard<
+ * 
+ * The xml file which is included in other file must have >merge< as root element, such as: + *
+ *   >!-- xml/other_keys.xml --<
+ *   >merge<
+ *     >Key key_attributes* /<
+ *     ...
+ *   >/merge<
+ * 
+ * and + *
+ *   >!-- xml/other_rows.xml --<
+ *   >merge<
+ *     >Row row_attributes*<
+ *       >Key key_attributes* /<
+ *     >/Row<
+ *     ...
+ *   >/merge<
+ * 
+ */ public class BaseKeyboardParser { + private static final String TAG = "BaseKeyboardParser"; + private static final boolean DEBUG_TAG = false; + private static final boolean DEBUG_PARSER = false; + // Keyboard XML Tags private static final String TAG_KEYBOARD = "Keyboard"; private static final String TAG_ROW = "Row"; @@ -63,71 +108,216 @@ public class BaseKeyboardParser { public void parseKeyboard(XmlResourceParser parser) throws XmlPullParserException, IOException { - final BaseKeyboard keyboard = mKeyboard; - Key key = null; + if (DEBUG_PARSER) debugEnterMethod("parseKeyboard", false); + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + final String tag = parser.getName(); + if (DEBUG_TAG) debugStartTag("parseKeyboard", tag, false); + if (TAG_KEYBOARD.equals(tag)) { + parseKeyboardAttributes(parser); + parseKeyboardContent(parser, mKeyboard.getKeys()); + break; + } else { + throw new IllegalStartTag(parser, TAG_KEYBOARD); + } + } + } + if (DEBUG_PARSER) debugLeaveMethod("parseKeyboard", false); + } + private void parseKeyboardAttributes(XmlResourceParser parser) { + final BaseKeyboard keyboard = mKeyboard; + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + final int width = keyboard.getKeyboardWidth(); + final int height = keyboard.getKeyboardHeight(); + keyboard.setKeyWidth(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyWidth, width, width / 10)); + keyboard.setKeyHeight(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_keyHeight, height, 50)); + keyboard.setHorizontalGap(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_horizontalGap, width, 0)); + keyboard.setVerticalGap(getDimensionOrFraction(a, + R.styleable.BaseKeyboard_verticalGap, height, 0)); + a.recycle(); + } + + private void parseKeyboardContent(XmlResourceParser parser, final List keys) + throws XmlPullParserException, IOException { + if (DEBUG_PARSER) debugEnterMethod("parseKeyboardContent", keys == null); + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + final String tag = parser.getName(); + if (DEBUG_TAG) debugStartTag("parseKeyboardContent", tag, keys == null); + if (TAG_ROW.equals(tag)) { + Row row = mKeyboard.createRowFromXml(mResources, parser); + if (keys != null && maybeStartRow(row)) { + parseRowContent(parser, row, keys); + } else { + // Skip entire + parseRowContent(parser, row, null); + } + } else if (TAG_INCLUDE.equals(tag)) { + parseIncludeKeyboardContent(parser, keys); + } else { + throw new IllegalStartTag(parser, TAG_ROW); + } + } else if (event == XmlResourceParser.END_TAG) { + final String tag = parser.getName(); + if (DEBUG_TAG) debugEndTag("parseKeyboardContent", tag, keys == null); + if (TAG_KEYBOARD.equals(tag)) { + endKeyboard(mKeyboard.getVerticalGap()); + break; + } else if (TAG_MERGE.equals(tag)) { + break; + } else { + throw new IllegalEndTag(parser, TAG_ROW); + } + } + } + if (DEBUG_PARSER) debugLeaveMethod("parseKeyboardContent", keys == null); + } + + private void parseRowContent(XmlResourceParser parser, Row row, List keys) + throws XmlPullParserException, IOException { + if (DEBUG_PARSER) debugEnterMethod("parseRowContent", keys == null); + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + final String tag = parser.getName(); + if (DEBUG_TAG) debugStartTag("parseRowContent", tag, keys == null); + if (TAG_KEY.equals(tag)) { + parseKey(parser, row, keys); + } else if (TAG_SPACER.equals(tag)) { + parseSpacer(parser, keys); + } else if (TAG_INCLUDE.equals(tag)) { + parseIncludeRowContent(parser, row, keys); + } else { + throw new IllegalStartTag(parser, TAG_KEY); + } + } else if (event == XmlResourceParser.END_TAG) { + final String tag = parser.getName(); + if (DEBUG_TAG) debugEndTag("parseRowContent", tag, keys == null); + if (TAG_ROW.equals(tag)) { + if (keys != null) + endRow(); + break; + } else if (TAG_MERGE.equals(tag)) { + break; + } else { + throw new IllegalEndTag(parser, TAG_KEY); + } + } + } + if (DEBUG_PARSER) debugLeaveMethod("parseRowContent", keys == null); + } + + private void parseKey(XmlResourceParser parser, Row row, List keys) + throws XmlPullParserException, IOException { + if (DEBUG_PARSER) debugEnterMethod("parseKey", keys == null); + if (keys == null) { + checkEndTag(TAG_KEY, parser); + } else { + Key key = mKeyboard.createKeyFromXml(mResources, row, mCurrentX, mCurrentY, parser); + checkEndTag(TAG_KEY, parser); + keys.add(key); + if (key.codes[0] == BaseKeyboard.KEYCODE_SHIFT) + mKeyboard.getShiftKeys().add(key); + endKey(key); + } + } + + private void parseSpacer(XmlResourceParser parser, List keys) + throws XmlPullParserException, IOException { + if (DEBUG_PARSER) debugEnterMethod("parseSpacer", keys == null); + if (keys == null) { + checkEndTag(TAG_SPACER, parser); + } else { + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard); + int gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, + mKeyboard.getKeyboardWidth(), 0); + a.recycle(); + checkEndTag(TAG_SPACER, parser); + setSpacer(gap); + } + } + + private void parseIncludeKeyboardContent(XmlResourceParser parser, List keys) + throws XmlPullParserException, IOException { + parseIncludeInternal(parser, null, keys); + } + + private void parseIncludeRowContent(XmlResourceParser parser, Row row, List keys) + throws XmlPullParserException, IOException { + parseIncludeInternal(parser, row, keys); + } + + private void parseIncludeInternal(XmlResourceParser parser, Row row, List keys) + throws XmlPullParserException, IOException { + if (DEBUG_PARSER) debugEnterMethod("parseInclude", keys == null); + if (keys == null) { + checkEndTag(TAG_INCLUDE, parser); + } else { + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.BaseKeyboard_Include); + final int keyboardLayout = a.getResourceId( + R.styleable.BaseKeyboard_Include_keyboardLayout, 0); + a.recycle(); + + checkEndTag(TAG_INCLUDE, parser); + if (keyboardLayout == 0) + throw new ParseException("No keyboardLayout attribute in ", parser); + parseMerge(mResources.getLayout(keyboardLayout), row, keys); + } + if (DEBUG_PARSER) debugLeaveMethod("parseInclude", keys == null); + } + + private void parseMerge(XmlResourceParser parser, Row row, List keys) + throws XmlPullParserException, IOException { + if (DEBUG_PARSER) debugEnterMethod("parseMerge", keys == null); int event; while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { if (event == XmlResourceParser.START_TAG) { String tag = parser.getName(); - if (TAG_ROW.equals(tag)) { - // TODO createRowFromXml should not be called from - // BaseKeyboard constructor. - Row row = keyboard.createRowFromXml(mResources, parser); - if (!startRow(row)) - skipToEndOfRow(parser); - } else if (TAG_KEY.equals(tag)) { - // TODO createKeyFromXml should not be called from - // BaseKeyboard constructor. - key = keyboard.createKeyFromXml(mResources, mCurrentRow, mCurrentX, mCurrentY, - parser); - keyboard.getKeys().add(key); - if (key.codes[0] == BaseKeyboard.KEYCODE_SHIFT) - keyboard.getShiftKeys().add(key); - } else if (TAG_SPACER.equals(tag)) { - parseSpacerAttribute(parser); - } else if (TAG_KEYBOARD.equals(tag)) { - parseKeyboardAttributes(parser); - } else if (TAG_INCLUDE.equals(tag)) { - if (parser.getDepth() == 0) - throw new InflateException(" cannot be the root element"); - parseInclude(parser); - } else if (TAG_MERGE.equals(tag)) { - throw new InflateException( - " must not be appeared in keyboard XML file"); + if (DEBUG_TAG) debugStartTag("parseMerge", tag, keys == null); + if (TAG_MERGE.equals(tag)) { + if (row == null) { + parseKeyboardContent(parser, keys); + } else { + parseRowContent(parser, row, keys); + } + break; } else { - throw new InflateException("unknown start tag: " + tag); - } - } else if (event == XmlResourceParser.END_TAG) { - String tag = parser.getName(); - if (TAG_KEY.equals(tag)) { - endKey(key); - } else if (TAG_ROW.equals(tag)) { - endRow(); - } else if (TAG_SPACER.equals(tag)) { - ; - } else if (TAG_KEYBOARD.equals(tag)) { - endKeyboard(mKeyboard.getVerticalGap()); - } else if (TAG_INCLUDE.equals(tag)) { - ; - } else if (TAG_MERGE.equals(tag)) { - return; - } else { - throw new InflateException("unknown end tag: " + tag); + throw new ParseException( + "Included keyboard layout must have root element", parser); } } } + if (DEBUG_PARSER) debugLeaveMethod("parseMerge", keys == null); + } + + private static void checkEndTag(String tag, XmlResourceParser parser) + throws XmlPullParserException, IOException { + if (parser.next() == XmlResourceParser.END_TAG && tag.equals(parser.getName())) + return; + throw new NonEmptyTag(tag, parser); } // return true if the row is valid for this keyboard mode - private boolean startRow(Row row) { - mCurrentX = 0; - mCurrentRow = row; - return row.mode == 0 || row.mode == mKeyboard.getKeyboardMode(); - } - - private void skipRow() { - mCurrentRow = null; + private boolean maybeStartRow(Row row) { + if (DEBUG_TAG) + Log.d(TAG, String.format("startRow: mode=0x%08x keyboardMode=0x%08x", + row.mode, mKeyboard.getKeyboardMode())); + if (row.mode == 0 || row.mode == mKeyboard.getKeyboardMode()) { + mCurrentX = 0; + mCurrentRow = row; + return true; + } else { + return false; + } } private void endRow() { @@ -151,73 +341,6 @@ public class BaseKeyboardParser { mCurrentX += gap; } - private void parseSpacerAttribute(XmlResourceParser parser) { - final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.BaseKeyboard); - int gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap, - mKeyboard.getKeyboardWidth(), 0); - a.recycle(); - setSpacer(gap); - } - - private void parseInclude(XmlResourceParser parent) - throws XmlPullParserException, IOException { - final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parent), - R.styleable.BaseKeyboard_Include); - final int keyboardLayout = a.getResourceId( - R.styleable.BaseKeyboard_Include_keyboardLayout, 0); - a.recycle(); - if (keyboardLayout == 0) - throw new InflateException(" must have keyboardLayout attribute"); - final XmlResourceParser parser = mResources.getLayout(keyboardLayout); - - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.START_TAG) { - String name = parser.getName(); - if (TAG_MERGE.equals(name)) { - parseKeyboard(parser); - return; - } else { - throw new InflateException( - "include keyboard layout must have root element"); - } - } - } - } - - private void skipToEndOfRow(XmlResourceParser parser) - throws XmlPullParserException, IOException { - int event; - while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { - if (event == XmlResourceParser.END_TAG) { - String tag = parser.getName(); - if (TAG_ROW.equals(tag)) { - skipRow(); - return; - } - } - } - throw new InflateException("can not find
"); - } - - private void parseKeyboardAttributes(XmlResourceParser parser) { - final BaseKeyboard keyboard = mKeyboard; - final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.BaseKeyboard); - final int width = keyboard.getKeyboardWidth(); - final int height = keyboard.getKeyboardHeight(); - keyboard.setKeyWidth(getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyWidth, width, width / 10)); - keyboard.setKeyHeight(getDimensionOrFraction(a, - R.styleable.BaseKeyboard_keyHeight, height, 50)); - keyboard.setHorizontalGap(getDimensionOrFraction(a, - R.styleable.BaseKeyboard_horizontalGap, width, 0)); - keyboard.setVerticalGap(getDimensionOrFraction(a, - R.styleable.BaseKeyboard_verticalGap, height, 0)); - a.recycle(); - } - public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { final TypedValue value = a.peekValue(index); if (value == null) @@ -230,4 +353,48 @@ public class BaseKeyboardParser { } return defValue; } -} + + @SuppressWarnings("serial") + private static class ParseException extends InflateException { + public ParseException(String msg, XmlResourceParser parser) { + super(msg + " at line " + parser.getLineNumber()); + } + } + + @SuppressWarnings("serial") + private static class IllegalStartTag extends ParseException { + public IllegalStartTag(XmlResourceParser parser, String parent) { + super("Illegal start tag " + parser.getName() + " in " + parent, parser); + } + } + + @SuppressWarnings("serial") + private static class IllegalEndTag extends ParseException { + public IllegalEndTag(XmlResourceParser parser, String parent) { + super("Illegal end tag " + parser.getName() + " in " + parent, parser); + } + } + + @SuppressWarnings("serial") + private static class NonEmptyTag extends ParseException { + public NonEmptyTag(String tag, XmlResourceParser parser) { + super(tag + " must be empty tag", parser); + } + } + + private static void debugEnterMethod(String title, boolean skip) { + Log.d(TAG, title + ": enter" + (skip ? " skip" : "")); + } + + private static void debugLeaveMethod(String title, boolean skip) { + Log.d(TAG, title + ": leave" + (skip ? " skip" : "")); + } + + private static void debugStartTag(String title, String tag, boolean skip) { + Log.d(TAG, title + ": <" + tag + ">" + (skip ? " skip" : "")); + } + + private static void debugEndTag(String title, String tag, boolean skip) { + Log.d(TAG, title + ": " + (skip ? " skip" : "")); + } + } From 36af0880c3bf7eaeeb4cdec0c3c519306df22c79 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 22 Oct 2010 22:18:40 +0900 Subject: [PATCH 088/287] Tablet keyboard should always show "?123" as symbol key Bug: 3118554 Change-Id: Ib609799f28dee56a4ded2e8144ac4a0c0d113ad6 --- java/res/values-xlarge/bools.xml | 1 + java/res/values/bools.xml | 1 + .../inputmethod/latin/LatinKeyboard.java | 65 ++++++++++--------- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/java/res/values-xlarge/bools.xml b/java/res/values-xlarge/bools.xml index 3079133dd..2ac5fc624 100644 --- a/java/res/values-xlarge/bools.xml +++ b/java/res/values-xlarge/bools.xml @@ -22,4 +22,5 @@ false false false + false diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml index 5d932a693..0497a6aed 100644 --- a/java/res/values/bools.xml +++ b/java/res/values/bools.xml @@ -32,4 +32,5 @@ true true true + true diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 8e16feb5e..37ce1e8e4 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -121,8 +121,8 @@ public class LatinKeyboard extends BaseKeyboard { super(context, xmlLayoutResId, mode); final Resources res = context.getResources(); mContext = context; - mMode = mode; mRes = res; + mMode = mode; mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); setDefaultBounds(mShiftLockPreviewIcon); @@ -192,9 +192,9 @@ public class LatinKeyboard extends BaseKeyboard { mMode = mode; if (mEnterKey == null) return; - final boolean configDynamicKeyToEnterKey = res.getBoolean( + final boolean configDynamicKeyTopEnterKey = res.getBoolean( R.bool.config_dynamic_key_top_enter_key); - if (configDynamicKeyToEnterKey) { + if (configDynamicKeyTopEnterKey) { 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)); @@ -291,16 +291,17 @@ public class LatinKeyboard extends BaseKeyboard { public void setColorOfSymbolIcons(boolean isAutoCompletion, boolean isBlack) { mIsBlackSym = isBlack; + final Resources res = mRes; if (isBlack) { - mShiftLockIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_shift_locked); - mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space); - mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic); - m123MicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_123_mic); + mShiftLockIcon = res.getDrawable(R.drawable.sym_bkeyboard_shift_locked); + mSpaceIcon = res.getDrawable(R.drawable.sym_bkeyboard_space); + mMicIcon = res.getDrawable(R.drawable.sym_bkeyboard_mic); + m123MicIcon = res.getDrawable(R.drawable.sym_bkeyboard_123_mic); } else { - mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked); - mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space); - mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); - m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); + mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); + mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space); + mMicIcon = res.getDrawable(R.drawable.sym_keyboard_mic); + m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic); } updateDynamicKeys(); if (mSpaceKey != null) { @@ -320,9 +321,11 @@ public class LatinKeyboard extends BaseKeyboard { } private void update123Key() { + final boolean configDynamicKeyTopSymbolKey = mRes.getBoolean( + R.bool.config_dynamic_key_top_symbol_key); // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode. if (m123Key != null && mIsAlphaKeyboard) { - if (mVoiceEnabled && !mHasVoiceButton) { + if (configDynamicKeyTopSymbolKey && mVoiceEnabled && !mHasVoiceButton) { m123Key.icon = m123MicIcon; m123Key.iconPreview = m123MicPreviewIcon; m123Key.label = null; @@ -391,18 +394,19 @@ public class LatinKeyboard extends BaseKeyboard { } private void updateSpaceBarForLocale(boolean isAutoCompletion, boolean isBlack) { + final Resources res = mRes; // If application locales are explicitly selected. if (mLocale != null) { - mSpaceKey.icon = new BitmapDrawable(mRes, + mSpaceKey.icon = new BitmapDrawable(res, drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack)); } else { // sym_keyboard_space_led can be shared with Black and White symbol themes. if (isAutoCompletion) { - mSpaceKey.icon = new BitmapDrawable(mRes, + mSpaceKey.icon = new BitmapDrawable(res, drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack)); } else { - mSpaceKey.icon = isBlack ? mRes.getDrawable(R.drawable.sym_bkeyboard_space) - : mRes.getDrawable(R.drawable.sym_keyboard_space); + mSpaceKey.icon = isBlack ? res.getDrawable(R.drawable.sym_bkeyboard_space) + : res.getDrawable(R.drawable.sym_keyboard_space); } } } @@ -462,7 +466,8 @@ public class LatinKeyboard extends BaseKeyboard { final int height = mSpaceIcon.getIntrinsicHeight(); final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(buffer); - canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); + final Resources res = mRes; + canvas.drawColor(res.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); // If application locales are explicitly selected. if (mLocale != null) { @@ -478,14 +483,14 @@ public class LatinKeyboard extends BaseKeyboard { allowVariableTextSize); // Draw language text with shadow - final int shadowColor = mRes.getColor(isBlack + final int shadowColor = res.getColor(isBlack ? R.color.latinkeyboard_bar_language_shadow_black : R.color.latinkeyboard_bar_language_shadow_white); final float baseline = height * SPACEBAR_LANGUAGE_BASELINE; final float descent = paint.descent(); paint.setColor(shadowColor); canvas.drawText(language, width / 2, baseline - descent - 1, paint); - paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_text)); + paint.setColor(res.getColor(R.color.latinkeyboard_bar_language_text)); canvas.drawText(language, width / 2, baseline - descent, paint); // Put arrows that are already layed out on either side of the text @@ -824,17 +829,19 @@ public class LatinKeyboard extends BaseKeyboard { setDefaultBounds(mBackground); mWidth = width; mHeight = height; - mTextPaint = new TextPaint(); - mTextPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18)); - mTextPaint.setColor(R.color.latinkeyboard_transparent); - mTextPaint.setTextAlign(Align.CENTER); - mTextPaint.setAlpha(OPACITY_FULLY_OPAQUE); - mTextPaint.setAntiAlias(true); + final TextPaint textPaint = new TextPaint(); + textPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18)); + textPaint.setColor(R.color.latinkeyboard_transparent); + textPaint.setTextAlign(Align.CENTER); + textPaint.setAlpha(OPACITY_FULLY_OPAQUE); + textPaint.setAntiAlias(true); + mTextPaint = textPaint; mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2; - mLeftDrawable = - mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_left); - mRightDrawable = - mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_right); + final Resources res = mRes; + mLeftDrawable = res.getDrawable( + R.drawable.sym_keyboard_feedback_language_arrows_left); + mRightDrawable = res.getDrawable( + R.drawable.sym_keyboard_feedback_language_arrows_right); mThreshold = ViewConfiguration.get(mContext).getScaledTouchSlop(); } From 1f2113b27d8a07e8722e51395462d7cb74907051 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 22 Oct 2010 15:31:52 -0700 Subject: [PATCH 089/287] Import revised translations. DO NOT MERGE Change-Id: I5227017b4859c24d1c6e873443741e881648371a --- java/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index a95d37dcb..cd6dc8ee1 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -88,7 +88,7 @@ "La introducción de voz es una función en fase experimental que utiliza la tecnología de reconocimiento de voz en red de Google." "Para desactivar la función de introducción de voz, accede a la configuración del teclado." "Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla." - "Hablar ahora" + "Habla ahora" "En curso" "Se ha producido un error. Inténtalo de nuevo." From 4189eb23082fcd4bf8cfb2085d18e226e0e7ce13 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 22 Oct 2010 19:35:23 +0900 Subject: [PATCH 090/287] Revise caps lock sequences This change also fixes that the popup preview of ALT on symbol keyboard is not showing. Bug: 3122877 Bug: 3127255 Change-Id: I978cb30a0d05298274d8ab6541b91323a0fef211 --- java/res/values/config.xml | 1 + .../android/inputmethod/latin/LatinIME.java | 153 ++++++++++-------- .../inputmethod/latin/LatinKeyboard.java | 2 + .../latin/LatinKeyboardBaseView.java | 37 ++++- .../inputmethod/latin/LatinKeyboardView.java | 13 +- .../inputmethod/latin/PointerTracker.java | 38 +++-- 6 files changed, 151 insertions(+), 93 deletions(-) diff --git a/java/res/values/config.xml b/java/res/values/config.xml index a1577e4d1..410d34b00 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -28,6 +28,7 @@ 400 50 400 + 1000 800 diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index bb29e6367..3250cdd01 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -142,9 +142,10 @@ public class LatinIME extends InputMethodService // Key events coming any faster than this are long-presses. private static final int QUICK_PRESS = 200; - static final int KEYCODE_ENTER = '\n'; - static final int KEYCODE_SPACE = ' '; - static final int KEYCODE_PERIOD = '.'; + public static final int KEYCODE_ENTER = '\n'; + public static final int KEYCODE_TAB = '\t'; + public static final int KEYCODE_SPACE = ' '; + public static final int KEYCODE_PERIOD = '.'; // Contextual menu positions private static final int POS_METHOD = 0; @@ -1190,66 +1191,68 @@ public class LatinIME extends InputMethodService public void onKey(int primaryCode, int[] keyCodes, int x, int y) { long when = SystemClock.uptimeMillis(); - if (primaryCode != BaseKeyboard.KEYCODE_DELETE || - when > mLastKeyTime + QUICK_PRESS) { + if (primaryCode != BaseKeyboard.KEYCODE_DELETE || when > mLastKeyTime + QUICK_PRESS) { mDeleteCount = 0; } mLastKeyTime = when; final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); switch (primaryCode) { - case BaseKeyboard.KEYCODE_DELETE: - handleBackspace(); - mDeleteCount++; - LatinImeLogger.logOnDelete(); - break; - case BaseKeyboard.KEYCODE_SHIFT: - // Shift key is handled in onPress() when device has distinct multi-touch panel. - if (!distinctMultiTouch) - handleShift(); - break; - case BaseKeyboard.KEYCODE_MODE_CHANGE: - // Symbol key is handled in onPress() when device has distinct multi-touch panel. - if (!distinctMultiTouch) - changeKeyboardMode(); - break; - case BaseKeyboard.KEYCODE_CANCEL: - if (!isShowingOptionDialog()) { - handleClose(); - } - break; - case LatinKeyboardView.KEYCODE_OPTIONS: - onOptionKeyPressed(); - break; - case LatinKeyboardView.KEYCODE_OPTIONS_LONGPRESS: - onOptionKeyLongPressed(); - break; - case LatinKeyboardView.KEYCODE_NEXT_LANGUAGE: - toggleLanguage(false, true); - break; - case LatinKeyboardView.KEYCODE_PREV_LANGUAGE: - toggleLanguage(false, false); - break; - case LatinKeyboardView.KEYCODE_VOICE: - if (VOICE_INSTALLED) { - startListening(false /* was a button press, was not a swipe */); - } - break; - case 9 /*Tab*/: - sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB); - break; - default: - if (primaryCode != KEYCODE_ENTER) { - mJustAddedAutoSpace = false; - } - RingCharBuffer.getInstance().push((char)primaryCode, x, y); - LatinImeLogger.logOnInputChar(); - if (isWordSeparator(primaryCode)) { - handleSeparator(primaryCode); - } else { - handleCharacter(primaryCode, keyCodes); - } - // Cancel the just reverted state - mJustRevertedSeparator = null; + case BaseKeyboard.KEYCODE_DELETE: + handleBackspace(); + mDeleteCount++; + LatinImeLogger.logOnDelete(); + break; + case BaseKeyboard.KEYCODE_SHIFT: + // Shift key is handled in onPress() when device has distinct multi-touch panel. + if (!distinctMultiTouch) + handleShift(); + break; + case BaseKeyboard.KEYCODE_MODE_CHANGE: + // Symbol key is handled in onPress() when device has distinct multi-touch panel. + if (!distinctMultiTouch) + changeKeyboardMode(); + break; + case BaseKeyboard.KEYCODE_CANCEL: + if (!isShowingOptionDialog()) { + handleClose(); + } + break; + case LatinKeyboardView.KEYCODE_OPTIONS: + onOptionKeyPressed(); + break; + case LatinKeyboardView.KEYCODE_OPTIONS_LONGPRESS: + onOptionKeyLongPressed(); + break; + case LatinKeyboardView.KEYCODE_NEXT_LANGUAGE: + toggleLanguage(false, true); + break; + case LatinKeyboardView.KEYCODE_PREV_LANGUAGE: + toggleLanguage(false, false); + break; + case LatinKeyboardView.KEYCODE_CAPSLOCK: + handleCapsLock(); + break; + case LatinKeyboardView.KEYCODE_VOICE: + if (VOICE_INSTALLED) { + startListening(false /* was a button press, was not a swipe */); + } + break; + case KEYCODE_TAB: + sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB); + break; + default: + if (primaryCode != KEYCODE_ENTER) { + mJustAddedAutoSpace = false; + } + RingCharBuffer.getInstance().push((char)primaryCode, x, y); + LatinImeLogger.logOnInputChar(); + if (isWordSeparator(primaryCode)) { + handleSeparator(primaryCode); + } else { + handleCharacter(primaryCode, keyCodes); + } + // Cancel the just reverted state + mJustRevertedSeparator = null; } if (mKeyboardSwitcher.onKey(primaryCode)) { changeKeyboardMode(); @@ -1363,24 +1366,37 @@ public class LatinIME extends InputMethodService private void handleShiftInternal(boolean forceNormal) { mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); KeyboardSwitcher switcher = mKeyboardSwitcher; - LatinKeyboardView inputView = switcher.getInputView(); if (switcher.isAlphabetMode()) { + LatinKeyboardView inputView = switcher.getInputView(); if (mCapsLock || forceNormal) { mCapsLock = false; switcher.setShifted(false); } else if (inputView != null) { - if (inputView.isShifted()) { - mCapsLock = true; - switcher.setShiftLocked(true); - } else { - switcher.setShifted(true); - } + switcher.setShifted(!inputView.isShifted()); } } else { switcher.toggleShift(); } } + private void handleCapsLock() { + mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); + KeyboardSwitcher switcher = mKeyboardSwitcher; + if (switcher.isAlphabetMode()) { + if (mCapsLock) { + mCapsLock = false; + // LatinKeyboard.setShifted(false) also disable shift locked state. + // Note: Caps lock LED is off when Key.on is false. + switcher.setShifted(false); + } else { + mCapsLock = true; + // LatinKeyboard.setShiftLocked(true) enable shift state too. + // Note: Caps lock LED is on when Key.on is true. + switcher.setShiftLocked(true); + } + } + } + private void abortCorrection(boolean force) { if (force || TextEntryState.isCorrecting()) { getCurrentInputConnection().finishComposingText(); @@ -2291,7 +2307,9 @@ public class LatinIME extends InputMethodService final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { mShiftKeyState.onPress(); - handleShift(); + // Not in caps lock mode, shift key is in effect on pressed. + if (mKeyboardSwitcher.isAlphabetMode() && !mCapsLock) + handleShift(); } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) { mSymbolKeyState.onPress(); changeKeyboardMode(); @@ -2309,6 +2327,9 @@ public class LatinIME extends InputMethodService if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { if (mShiftKeyState.isMomentary()) resetShift(); + // In caps lock mode, shift key is in effect on released. + if (mKeyboardSwitcher.isAlphabetMode() && mCapsLock) + handleShift(); mShiftKeyState.onRelease(); } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) { if (mSymbolKeyState.isMomentary()) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 37ce1e8e4..6494bdfca 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -236,6 +236,7 @@ public class LatinKeyboard extends BaseKeyboard { } public void setShiftLocked(boolean shiftLocked) { + // TODO: cleanup this method with BaseKeyboard.Key for (final Key key : getShiftKeys()) { key.on = shiftLocked; key.icon = mShiftLockIcon; @@ -249,6 +250,7 @@ public class LatinKeyboard extends BaseKeyboard { @Override public boolean setShifted(boolean shiftState) { + // TODO: cleanup this method with BaseKeyboard.Key. boolean shiftChanged = false; if (getShiftKeys().size() > 0) { for (final Key key : getShiftKeys()) { diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 4e264e853..6b46ab838 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -261,6 +261,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx private static final int MSG_DISMISS_PREVIEW = 2; private static final int MSG_REPEAT_KEY = 3; private static final int MSG_LONGPRESS_KEY = 4; + private static final int MSG_LONGPRESS_SHIFT_KEY = 5; private boolean mInKeyRepeat; @@ -284,6 +285,11 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx openPopupIfRequired(msg.arg1, tracker); break; } + case MSG_LONGPRESS_SHIFT_KEY: { + final PointerTracker tracker = (PointerTracker)msg.obj; + onLongPressShiftKey(tracker); + break; + } } } @@ -335,9 +341,20 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx removeMessages(MSG_LONGPRESS_KEY); } + public void startLongPressShiftTimer(long delay, int keyIndex, PointerTracker tracker) { + removeMessages(MSG_LONGPRESS_SHIFT_KEY); + sendMessageDelayed( + obtainMessage(MSG_LONGPRESS_SHIFT_KEY, keyIndex, 0, tracker), delay); + } + + public void cancelLongPressShiftTimer() { + removeMessages(MSG_LONGPRESS_SHIFT_KEY); + } + public void cancelKeyTimers() { cancelKeyRepeatTimer(); cancelLongPressTimer(); + cancelLongPressShiftTimer(); } public void cancelAllMessages() { @@ -869,7 +886,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx int drawableX = (key.width + padding.left - padding.right - drawableWidth) / 2; int drawableY = (key.height + padding.top - padding.bottom - drawableHeight) / 2; drawIcon(canvas, key.icon, drawableX, drawableY, drawableWidth, drawableHeight); - } if (key.hintIcon != null && drawHintIcon) { int drawableWidth = key.width; @@ -924,7 +940,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // TODO: clean up this method. private void dismissKeyPreview() { for (PointerTracker tracker : mPointerTrackers) - tracker.updateKey(NOT_A_KEY); + tracker.releaseKey(); showPreview(NOT_A_KEY, null); } @@ -959,11 +975,8 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // WindowManager.BadTokenException. if (key == null || !mInForeground) return; - if (key.icon != null) { - mPreviewText.setCompoundDrawables(null, null, null, - key.iconPreview != null ? key.iconPreview : key.icon); - mPreviewText.setText(null); - } else { + // What we show as preview should match what we show on key top in onBufferDraw(). + if (key.label != null) { // TODO Should take care of temporaryShiftLabel here. mPreviewText.setCompoundDrawables(null, null, null, null); mPreviewText.setText(adjustCase(tracker.getPreviewText(key))); @@ -974,6 +987,10 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge); mPreviewText.setTypeface(mKeyTextStyle); } + } else { + mPreviewText.setCompoundDrawables(null, null, null, + key.iconPreview != null ? key.iconPreview : key.icon); + mPreviewText.setText(null); } mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); @@ -1086,6 +1103,12 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return result; } + private void onLongPressShiftKey(PointerTracker tracker) { + tracker.setAlreadyProcessed(); + mPointerQueue.remove(tracker); + mKeyboardActionListener.onKey(LatinKeyboardView.KEYCODE_CAPSLOCK, null, 0, 0); + } + private View inflateMiniKeyboardContainer(Key popupKey) { int popupKeyboardId = popupKey.popupResId; LayoutInflater inflater = (LayoutInflater)getContext().getSystemService( diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index f3d045bec..35428997f 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -32,12 +32,13 @@ import java.util.List; public class LatinKeyboardView extends LatinKeyboardBaseView { - static final int KEYCODE_OPTIONS = -100; - static final int KEYCODE_OPTIONS_LONGPRESS = -101; - static final int KEYCODE_VOICE = -102; - static final int KEYCODE_F1 = -103; - static final int KEYCODE_NEXT_LANGUAGE = -104; - static final int KEYCODE_PREV_LANGUAGE = -105; + public static final int KEYCODE_OPTIONS = -100; + public static final int KEYCODE_OPTIONS_LONGPRESS = -101; + public static final int KEYCODE_VOICE = -102; + public static final int KEYCODE_F1 = -103; + public static final int KEYCODE_NEXT_LANGUAGE = -104; + public static final int KEYCODE_PREV_LANGUAGE = -105; + public static final int KEYCODE_CAPSLOCK = -106; private BaseKeyboard mPhoneKeyboard; diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index d1cdbfe26..8824db6e3 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -40,6 +40,7 @@ public class PointerTracker { // Timing constants private final int mDelayBeforeKeyRepeatStart; private final int mLongPressKeyTimeout; + private final int mLongPressShiftKeyTimeout; private final int mMultiTapKeyTimeout; // Miscellaneous constants @@ -175,6 +176,7 @@ public class PointerTracker { mHasDistinctMultitouch = proxy.hasDistinctMultitouch(); mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start); mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout); + mLongPressShiftKeyTimeout = res.getInteger(R.integer.config_long_press_shift_key_timeout); mMultiTapKeyTimeout = res.getInteger(R.integer.config_multi_tap_key_timeout); resetMultiTap(); } @@ -223,9 +225,11 @@ public class PointerTracker { return key != null && key.codes[0] == LatinIME.KEYCODE_SPACE; } - public void updateKey(int keyIndex) { - if (mKeyAlreadyProcessed) - return; + public void releaseKey() { + updateKeyGraphics(NOT_A_KEY); + } + + private void updateKeyGraphics(int keyIndex) { int oldKeyIndex = mPreviousKey; mPreviousKey = keyIndex; if (keyIndex != oldKeyIndex) { @@ -287,7 +291,7 @@ public class PointerTracker { } startLongPressTimer(keyIndex); } - showKeyPreviewAndUpdateKey(keyIndex); + showKeyPreviewAndUpdateKeyGraphics(keyIndex); } public void onMoveEvent(int x, int y, long eventTime) { @@ -317,12 +321,13 @@ public class PointerTracker { mHandler.cancelLongPressTimer(); } } - showKeyPreviewAndUpdateKey(mKeyState.getKeyIndex()); + showKeyPreviewAndUpdateKeyGraphics(mKeyState.getKeyIndex()); } public void onUpEvent(int x, int y, long eventTime) { if (DEBUG) debugLog("onUpEvent :", x, y); + showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY); if (mKeyAlreadyProcessed) return; mHandler.cancelKeyTimers(); @@ -334,7 +339,6 @@ public class PointerTracker { x = mKeyState.getKeyX(); y = mKeyState.getKeyY(); } - showKeyPreviewAndUpdateKey(NOT_A_KEY); if (!mIsRepeatableKey) { detectAndSendKey(keyIndex, x, y, eventTime); } @@ -348,7 +352,7 @@ public class PointerTracker { debugLog("onCancelEvt:", x, y); mHandler.cancelKeyTimers(); mHandler.cancelPopupPreview(); - showKeyPreviewAndUpdateKey(NOT_A_KEY); + showKeyPreviewAndUpdateKeyGraphics(NOT_A_KEY); int keyIndex = mKeyState.getKeyIndex(); if (isValidKeyIndex(keyIndex)) mProxy.invalidateKey(mKeys[keyIndex]); @@ -409,8 +413,8 @@ public class PointerTracker { return dx * dx + dy * dy; } - private void showKeyPreviewAndUpdateKey(int keyIndex) { - updateKey(keyIndex); + private void showKeyPreviewAndUpdateKeyGraphics(int keyIndex) { + updateKeyGraphics(keyIndex); // The modifier key, such as shift key, should not be shown as preview when multi-touch is // supported. On thge other hand, if multi-touch is not supported, the modifier key should // be shown as preview. @@ -423,11 +427,17 @@ 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(mLongPressKeyTimeout, keyIndex, this); + if (key.codes[0] == BaseKeyboard.KEYCODE_SHIFT) { + mHandler.startLongPressShiftTimer(mLongPressShiftKeyTimeout, keyIndex, this); + } else { + // If keyboard is in temporary upper case state and the key has temporary shift label, + // non-shift long press should not be started. On distinct multi touch device, when + // pressing shift key (in temporary upper case), hint icon should not be drawn on key + // top. So we should disable long press for such key. + if (isTemporaryUpperCase() && key.temporaryShiftLabel != null) + return; + mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); + } } private boolean isTemporaryUpperCase() { From e767595da55720b25d51e314e91d861e31484b0f Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 25 Oct 2010 16:58:30 +0900 Subject: [PATCH 091/287] Add an icon for US keyboard subtype - TODO: add other icons Change-Id: Ie958b9d59bb33bd6dbfc78a403bfda022bfaf790 --- java/res/drawable-hdpi/ic_subtype_keyboard.png | Bin 1068 -> 807 bytes java/res/drawable-mdpi/ic_subtype_keyboard.png | Bin 498 -> 528 bytes java/res/drawable/ic_sybtype_us_keyboard.png | Bin 0 -> 1014 bytes java/res/xml/method.xml | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 java/res/drawable/ic_sybtype_us_keyboard.png diff --git a/java/res/drawable-hdpi/ic_subtype_keyboard.png b/java/res/drawable-hdpi/ic_subtype_keyboard.png index 7015e266a297927bd2275c633fcffe724c4a8eb1..c7729566c241f096bde71b5da5f46453e9507f53 100644 GIT binary patch delta 782 zcmV+p1M&Q<2&V=iiBL{Q4GJ0x0000DNk~Le0000m0000m2nGNE09OL}hmj#Ce*(!# zL_t(|+U!|Ps}fNdp3!mq;6~s_f+6BH6)&{we_Vv3C<>xgtE5HC7H!)E?Si`sq-b%W z)rEe;UAQn&R3sIy-(DCMM@M_!xoB#7LEW6godXY^c}C~F&zW=H_cyuAf4DD!WT8+v5fw#wW3gC1@i_Z~!5|?Hhr>Gh9!^(K zo&-#dO>79b$!TqRDe-=^A7VCi4 z>-7%*pwU_j1Oi8PyFJYyKW}2c-(M|czkv^c47>;KG0I;FfI_Y-vBdkC_&)*I=|Zts z)cfIZSa7*qO!8~f=x8(&a=BbmRaF;oC!5Xwq(Z_Pzmz#w-oPck@DiV@o{}`}1@2QB zR2bvu#mq#CWK1IBqlY&M&G*8y5bt9Ba8O1G^}r*p~HuH&gGin9Gd#AG6Gv)8z5>p&)xQM=u) zZeQWQ?jd>x-kr36&-^BpEnMozyUjYfAGcdY=*yYSw}=$_Gaf1}ZO914ZLk%e8y z)9hgOAAs6L06p^|#{aSHxb*hc7BcMe3t5)u_7%=gx38OcfHv3p;xo1Z0{OMexJ!1r zTCFbGX}HtFN~NOPSHItXWV6}Q*YE?B`dhVHP21K}(JcCWzPni0l^w?YmxXY1UpsvQ ze4)X%TtRl=EfC+!WKNgMWxmrWsvNCBE`z7oCG2d)>-8S+C;&ycVJekMNr(`5I@nOG z6f)AQ5MT%}1Q-H%Zhr+B0Q=z8;$%8qCIA2c M07*qoM6N<$g1ZuQ-v9sr delta 1045 zcmV+w1nT>z2CN7niBL{Q4GJ0x0000DNk~Le0000y0000)2nGNE0NssN-jN|Ee*?}* zL_t(|+U#3PYg0iKzLRTPYc-Aaxss|2#f>PUh@uNcMU;Zz8w%ETRVadp3y~r&#ElC@ zSNa3QrTAL7QAAfFf*Y4EbfIn2RIO>6T+hL8;4n0)xtR&c%^djJB$K&!zB$i1NmLX? zK`TirXfg4GJz-DS6ZV8XVNci-fA)l3i6XQUGQfg_@+=Utgh_s~mhhAiB^X7*Bf~nAxy}^qy9$@ZI;YRFpX%s;`XN)infB)mTOE5RW z*snM)D1+86+_aJ`B zf+%mq5XQJ-I*rYpPc|7Gt0v3@UWqxp@Lr6u_O2V(+%GI?HQ~K11PCjIwe2(JUJ|5w zaW6gg92-;>;Z#hMR#jS1e>K;3F4bzdlW+tk&3=0ZzNJli8{spqcNxB}gaw?3-)849 zY1Z~V%w@OOB21dyW*GNm|2-bZq|MTDH{l&FT1g8!@F*kjC~Qa%Of)M3nhr``BJhkG zfu{|=%H(D+u7g&H`z|drw-Vt`wP?86q-G!XdD!P+pND-O_IcRne_@}8eI9OzJS@$U zO|L!Xy7IVgPF%Mk^KgI#-41H+Az#6!1&y4CS=Jf(vKFit*KL|ST#H!0PaMMRuQ&0Z z{bvyVq=i$_eG6;5OPCPPCs28n;NK6R@v3*wW*)W`v}QmsC;G}(@^G9e9YMQOWyTB8 z_?TsDEFxG<`o44xe}q$Y3`q5mFfcwVGfjHC;Wy1LO!jD{pw$v4{kDbpzTrO`2`_@= zf8F63rzke*4m8cWgXDgTXBO!!8+h@OEK#<9)uNRBy2a)iT?Q$>b|vMTpD&brkp!dXmu2VSAh5$c4LAZmnu0963>#8`?umYJu zXjf}44>Ml{jNmmneo-_Rtgq1(VQH@YqQe)eqX#p6hr{V*DHp(~}hB&W@>?c+N+*Kl2qBHrJ^9FT@ire+3u-vVxsx8(@DK P00000NkvXXu0mjf=!f93 diff --git a/java/res/drawable-mdpi/ic_subtype_keyboard.png b/java/res/drawable-mdpi/ic_subtype_keyboard.png index 0d7ebd4e579c01416b40087f968ca65aa8537804..9a5aada8bb425f4a40d6f0f540f724ac94ffa147 100644 GIT binary patch delta 500 zcmV{nfC!axvC;y#Jmyl5c!-~|M4(Dn%4z#Ftj=nYD5;7v*|U<1j6555Ev5mAUF z_yd}BX6i0UsqE9bFBw?o`zCJYV|QkVW>FM|PBUu(+wInFwOSLv_MLMlS(Z)B)9LgL zWTfc;JQSey4r&2H!1;VOq9~$Zf4|=+uaYyy2s5r^wOS=%7=BQYu^03zIf(e}y5sR! z;94ve?>G~1Ay&1ENM0qk?d#;yp34WhUE?99pqD2g;+^vaHJJ z{L5t~+m9SXP#cIM1V0^*$8U&dv)KdsTU=(c{m3ETYehh}+Z8V;OB(i4!0000aJi%wR8 z-P*1#>XWRrPLqB<|NmVSF$_bIa)=C=0W)9*Ja@p`>$-yDJB)|K*w!%G%d4vTOb`yE zhH;M>q&Khd6 zQhi-*qj(0p^?ldnVdG(A=MenuO9ox}!OnYY>>QE_ZsFnZ3}58*L0V zWh&zq!)o@T261PT{7;jdLVpvo8ckB#i1(BZ4$(<$BbrGLc|wU|65BY+eQ% z18I60=S&*q`qHnpF<}`};68%4x&^g0J|e|}*TJn4Zi*o>gRRL)vEYzRu~lS3GTy-i}O2b$M_Xs05(wrD8#Qi1poj5 M07*qoM6N<$g3M^mPyhe` diff --git a/java/res/drawable/ic_sybtype_us_keyboard.png b/java/res/drawable/ic_sybtype_us_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..c81b22bb0ca59be752d9d0bbfdcc2d2a6b3e1976 GIT binary patch literal 1014 zcmVBg2cl}Ae9wApz5lkuxOAFT~)B_0{8*#s@+toKq|X-*##RU5DMZ^@sLO( z6CjmaBU_FW8$U9hXU_~_!=iQVLCxZR_IP}+jx^`H=R1!9I5;>sI5;>sI5_?aN^^G=-pky^|9Kp zeq9+~E?pkPFffRbt{af$APy|#(eLX>CCAZj_YhV?P?R9Hx*D>xDKuLh?BAb5t=2#! zoksYpFNQzb&(6R%0xs4YO~9eA<6!r$F;rgH5tJo#ItFa!AQp>4({#@^7?kK&g_tXR za0v}ez;#~Nb(n^Qjg1y8%YshPplyhvfNHe?NfOcPGTL)6QCY*A&rj_f0_}Dej4=r0 ztQroXPp54d23;0pB}61dIJN^pU_{P_bfk#*uiuW4oy=bXGczf?c4Z?;DF0c7sw&>T zKo4?kpx)TT^mNj*$z&2RS4-%8d3NVSpxJ7BP78v7ee*d~DN&=*Fgo3y7nxix?8sK@ojly!p~zuZLe@H}qaeuVto6xP>U(E5F3XC`sy&J(Z6EiFC8@nZ|HB?s#H)5CkVc+S60 zY}~)+cEw9WIikoAQ@j4-u}VJ*@#La!5g4VOi+j?L7e9eDU_uL&RDpO>^;JUg(&|V$ z?UT$}jRr|>{U7ZjkqDB>BqUY!HwU_3Ul`hXfyNFTJB)hUghn$}(_&CaxQgIFvl%q1 zV(-?Q%{t~duwc(GSIyLKc08^wPDTEkpY1A*8rUivYj~I1!cdf_)Xq_G$ znr>-w^p`;Nr|Tn0NGA!g5_RTn37Ou9A^;I43wWy*lfj~t@P`gT^jkus)N?n917|;l zEyR$3jT#H1U^lmu8&_e(Cw%V%*XX)63<2rr@r<)@;#5MnW%rcR zu7uvRiEZDrjsZt3n1QkQb6?-cMghG)?4@pfaZA%=Z}$E-!a>QTf$?{mufE|g%p4pX k92^`R92^`U6n_ga0M7ADrx40yQUCw|07*qoM6N<$f(F&rod5s; literal 0 HcmV?d00001 diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index fab4bd72b..e63141846 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -26,7 +26,7 @@ - From 0ce98cbf98c6409ac18fa341f467703d78352a4c Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 25 Oct 2010 18:04:01 +0900 Subject: [PATCH 092/287] Get rid of references to BaseKeyboard in Latin-specific classes Change-Id: I6871a24967b1410bdb14e902bdd311ef82fd4f0b --- .../android/inputmethod/latin/LatinIME.java | 10 ++--- .../latin/LatinKeyboardBaseView.java | 4 +- .../inputmethod/latin/LatinKeyboardView.java | 42 ++++++++++--------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 3250cdd01..0a39ab8de 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1791,7 +1791,7 @@ public class LatinIME extends InputMethodService private void updateSuggestions() { LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); + inputView.getLatinKeyboard().setPreferredLetters(null); // Check if we have a suggestion engine attached. if ((mSuggest == null || !isPredictionOn()) && !mVoiceInputHighlighted) { @@ -1813,7 +1813,7 @@ public class LatinIME extends InputMethodService private void showCorrections(WordAlternatives alternatives) { List stringList = alternatives.getAlternatives(); - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters(null); + mKeyboardSwitcher.getInputView().getLatinKeyboard().setPreferredLetters(null); showSuggestions(stringList, alternatives.getOriginalWord(), false, false); } @@ -1829,7 +1829,7 @@ public class LatinIME extends InputMethodService int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies(); - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters( + mKeyboardSwitcher.getInputView().getLatinKeyboard().setPreferredLetters( nextLettersFrequencies); boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection(); @@ -2018,7 +2018,7 @@ public class LatinIME extends InputMethodService saveWordInHistory(suggestion); mPredicting = false; mCommittedLength = suggestion.length(); - ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); + inputView.getLatinKeyboard().setPreferredLetters(null); // If we just corrected a word, then don't show punctuations if (!correcting) { setNextSuggestions(); @@ -2321,7 +2321,7 @@ public class LatinIME extends InputMethodService public void onRelease(int primaryCode) { // Reset any drag flags in the keyboard - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).keyReleased(); + mKeyboardSwitcher.getInputView().getLatinKeyboard().keyReleased(); //vibrate(); final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 6b46ab838..2bf70bf82 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -598,7 +598,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * @see #getKeyboard() * @param keyboard the keyboard to display in this view */ - public void setKeyboard(BaseKeyboard keyboard) { + protected void setKeyboard(BaseKeyboard keyboard) { if (mKeyboard != null) { dismissKeyPreview(); } @@ -626,7 +626,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx * @return the currently attached keyboard * @see #setKeyboard(BaseKeyboard) */ - public BaseKeyboard getKeyboard() { + protected BaseKeyboard getKeyboard() { return mKeyboard; } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 35428997f..6672dd22d 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -40,7 +40,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { public static final int KEYCODE_PREV_LANGUAGE = -105; public static final int KEYCODE_CAPSLOCK = -106; - private BaseKeyboard mPhoneKeyboard; + private LatinKeyboard mPhoneKeyboard; /** Whether we've started dropping move events because we found a big jump */ private boolean mDroppingEvents; @@ -62,13 +62,13 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { super(context, attrs, defStyle); } - public void setPhoneKeyboard(BaseKeyboard phoneKeyboard) { + public void setPhoneKeyboard(LatinKeyboard phoneKeyboard) { mPhoneKeyboard = phoneKeyboard; } @Override public void setPreviewEnabled(boolean previewEnabled) { - if (getKeyboard() == mPhoneKeyboard) { + if (getLatinKeyboard() == mPhoneKeyboard) { // Phone keyboard never shows popup preview (except language switch). super.setPreviewEnabled(false); } else { @@ -76,8 +76,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { } } - @Override - public void setKeyboard(BaseKeyboard k) { + public void setLatinKeyboard(LatinKeyboard k) { super.setKeyboard(k); // One-seventh of the keyboard width seems like a reasonable threshold mJumpThresholdSquare = k.getMinWidth() / 7; @@ -87,12 +86,21 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { setKeyboardLocal(k); } + public LatinKeyboard getLatinKeyboard() { + BaseKeyboard keyboard = getKeyboard(); + if (keyboard instanceof LatinKeyboard) { + return (LatinKeyboard)keyboard; + } else { + return null; + } + } + @Override protected boolean onLongPress(Key key) { int primaryCode = key.codes[0]; if (primaryCode == KEYCODE_OPTIONS) { return invokeOnKey(KEYCODE_OPTIONS_LONGPRESS); - } else if (primaryCode == '0' && getKeyboard() == mPhoneKeyboard) { + } else if (primaryCode == '0' && getLatinKeyboard() == mPhoneKeyboard) { // Long pressing on 0 in phone number keypad gives you a '+'. return invokeOnKey('+'); } else { @@ -109,9 +117,8 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { @Override protected CharSequence adjustCase(CharSequence label) { - BaseKeyboard keyboard = getKeyboard(); - if (keyboard instanceof LatinKeyboard - && ((LatinKeyboard) keyboard).isAlphaKeyboard() + LatinKeyboard keyboard = getLatinKeyboard(); + if (keyboard.isAlphaKeyboard() && keyboard.isShifted() && !TextUtils.isEmpty(label) && label.length() < 3 && Character.isLowerCase(label.charAt(0))) { @@ -121,13 +128,10 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { } public boolean setShiftLocked(boolean shiftLocked) { - BaseKeyboard keyboard = getKeyboard(); - if (keyboard instanceof LatinKeyboard) { - ((LatinKeyboard)keyboard).setShiftLocked(shiftLocked); - invalidateAllKeys(); - return true; - } - return false; + LatinKeyboard keyboard = getLatinKeyboard(); + keyboard.setShiftLocked(shiftLocked); + invalidateAllKeys(); + return true; } /** @@ -209,7 +213,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { @Override public boolean onTouchEvent(MotionEvent me) { - LatinKeyboard keyboard = (LatinKeyboard) getKeyboard(); + LatinKeyboard keyboard = getLatinKeyboard(); if (DEBUG_LINE) { mLastX = (int) me.getX(); mLastY = (int) me.getY(); @@ -258,7 +262,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { private int mLastY; private Paint mPaint; - private void setKeyboardLocal(BaseKeyboard k) { + private void setKeyboardLocal(LatinKeyboard k) { if (DEBUG_AUTO_PLAY) { findKeys(); if (mHandler2 == null) { @@ -319,7 +323,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { } private void findKeys() { - List keys = getKeyboard().getKeys(); + List keys = getLatinKeyboard().getKeys(); // Get the keys on this keyboard for (int i = 0; i < keys.size(); i++) { int code = keys.get(i).codes[0]; From 29ff343f77365e8a11a9b26a0e16a9dc5b7d72d7 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 25 Oct 2010 18:34:19 +0900 Subject: [PATCH 093/287] Remove LatinKeyboardBaseView.isShifted() and setShifted() for refactoring Change-Id: I9a1106b679a9ffb3ae959d90377eef096e5af842 --- .../inputmethod/latin/KeyboardSwitcher.java | 5 ++- .../android/inputmethod/latin/LatinIME.java | 44 ++++++++++++++----- .../latin/LatinKeyboardBaseView.java | 35 +++------------ 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 3a54904d3..a5a262ec7 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -392,7 +392,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public void setShifted(boolean shifted) { if (mInputView != null) { - mInputView.setShifted(shifted); + LatinKeyboard latinKeyboard = mInputView.getLatinKeyboard(); + if (latinKeyboard != null && latinKeyboard.setShifted(shifted)) { + mInputView.invalidateAllKeys(); + } } } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 0a39ab8de..07df7eda8 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -993,7 +993,8 @@ public class LatinIME extends InputMethodService LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); // Enable shift key and DPAD to do selections if (inputView != null && inputView.isShown() - && inputView.isShifted()) { + && inputView.getLatinKeyboard() != null + && inputView.getLatinKeyboard().isShifted()) { event = new KeyEvent(event.getDownTime(), event.getEventTime(), event.getAction(), event.getKeyCode(), event.getRepeatCount(), event.getDeviceId(), event.getScanCode(), @@ -1372,7 +1373,10 @@ public class LatinIME extends InputMethodService mCapsLock = false; switcher.setShifted(false); } else if (inputView != null) { - switcher.setShifted(!inputView.isShifted()); + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard != null) { + switcher.setShifted(!latinKeyboard.isShifted()); + } } } else { switcher.toggleShift(); @@ -1425,7 +1429,8 @@ public class LatinIME extends InputMethodService mWord.reset(); } } - if (mKeyboardSwitcher.getInputView().isShifted()) { + LatinKeyboard latinKeyboard = mKeyboardSwitcher.getInputView().getLatinKeyboard(); + if (latinKeyboard != null && latinKeyboard.isShifted()) { if (keyCodes == null || keyCodes[0] < Character.MIN_CODE_POINT || keyCodes[0] > Character.MAX_CODE_POINT) { return; @@ -1444,7 +1449,7 @@ public class LatinIME extends InputMethodService } } if (mPredicting) { - if (mKeyboardSwitcher.getInputView().isShifted() + if (latinKeyboard != null && latinKeyboard.isShifted() && mKeyboardSwitcher.isAlphabetMode() && mComposing.length() == 0) { mWord.setFirstCharCapitalized(true); @@ -1739,7 +1744,8 @@ public class LatinIME extends InputMethodService final List nBest = new ArrayList(); boolean capitalizeFirstWord = preferCapitalization() || (mKeyboardSwitcher.isAlphabetMode() - && mKeyboardSwitcher.getInputView().isShifted()); + && mKeyboardSwitcher.getInputView().getLatinKeyboard() != null + && mKeyboardSwitcher.getInputView().getLatinKeyboard().isShifted()); for (String c : mVoiceResults.candidates) { if (capitalizeFirstWord) { c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length()); @@ -1791,7 +1797,10 @@ public class LatinIME extends InputMethodService private void updateSuggestions() { LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - inputView.getLatinKeyboard().setPreferredLetters(null); + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard != null) { + latinKeyboard.setPreferredLetters(null); + } // Check if we have a suggestion engine attached. if ((mSuggest == null || !isPredictionOn()) && !mVoiceInputHighlighted) { @@ -1813,7 +1822,10 @@ public class LatinIME extends InputMethodService private void showCorrections(WordAlternatives alternatives) { List stringList = alternatives.getAlternatives(); - mKeyboardSwitcher.getInputView().getLatinKeyboard().setPreferredLetters(null); + LatinKeyboard latinKeyboard = mKeyboardSwitcher.getInputView().getLatinKeyboard(); + if (latinKeyboard != null) { + latinKeyboard.setPreferredLetters(null); + } showSuggestions(stringList, alternatives.getOriginalWord(), false, false); } @@ -1829,8 +1841,10 @@ public class LatinIME extends InputMethodService int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies(); - mKeyboardSwitcher.getInputView().getLatinKeyboard().setPreferredLetters( - nextLettersFrequencies); + LatinKeyboard latinKeyboard = mKeyboardSwitcher.getInputView().getLatinKeyboard(); + if (latinKeyboard != null) { + latinKeyboard.setPreferredLetters(nextLettersFrequencies); + } boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection(); //|| mCorrectionMode == mSuggest.CORRECTION_FULL; @@ -2002,11 +2016,12 @@ public class LatinIME extends InputMethodService */ private void pickSuggestion(CharSequence suggestion, boolean correcting) { LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); if (mCapsLock) { suggestion = suggestion.toString().toUpperCase(); } else if (preferCapitalization() || (mKeyboardSwitcher.isAlphabetMode() - && inputView.isShifted())) { + && latinKeyboard != null && latinKeyboard.isShifted())) { suggestion = suggestion.toString().toUpperCase().charAt(0) + suggestion.subSequence(1, suggestion.length()).toString(); } @@ -2018,7 +2033,9 @@ public class LatinIME extends InputMethodService saveWordInHistory(suggestion); mPredicting = false; mCommittedLength = suggestion.length(); - inputView.getLatinKeyboard().setPreferredLetters(null); + if (latinKeyboard != null) { + latinKeyboard.setPreferredLetters(null); + } // If we just corrected a word, then don't show punctuations if (!correcting) { setNextSuggestions(); @@ -2321,7 +2338,10 @@ public class LatinIME extends InputMethodService public void onRelease(int primaryCode) { // Reset any drag flags in the keyboard - mKeyboardSwitcher.getInputView().getLatinKeyboard().keyReleased(); + LatinKeyboard latinKeyboard = mKeyboardSwitcher.getInputView().getLatinKeyboard(); + if (latinKeyboard != null) { + latinKeyboard.keyReleased(); + } //vibrate(); final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 2bf70bf82..b2635ad9c 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -638,34 +638,6 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx return mHasDistinctMultitouch; } - /** - * Sets the state of the shift key of the keyboard, if any. - * @param shifted whether or not to enable the state of the shift key - * @return true if the shift key state changed, false if there was no change - */ - public boolean setShifted(boolean shifted) { - if (mKeyboard != null) { - if (mKeyboard.setShifted(shifted)) { - // The whole keyboard probably needs to be redrawn - invalidateAllKeys(); - return true; - } - } - return false; - } - - /** - * Returns the state of the shift key of the keyboard, if any. - * @return true if the shift is in a pressed state, false otherwise. If there is - * no shift key on the keyboard or there is no keyboard attached, it returns false. - */ - public boolean isShifted() { - if (mKeyboard != null) { - return mKeyboard.isShifted(); - } - return false; - } - /** * Enables or disables the key feedback popup. This is a popup that shows a magnified * version of the depressed key. By default the preview is enabled. @@ -1247,7 +1219,12 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mMiniKeyboardOriginX = adjustedX + container.getPaddingLeft() - mWindowOffset[0]; mMiniKeyboardOriginY = y + container.getPaddingTop() - mWindowOffset[1]; mMiniKeyboard.setPopupOffset(adjustedX, y); - mMiniKeyboard.setShifted(isShifted()); + // TODO: change the below line to use getLatinKeyboard() instead of getKeyboard() + BaseKeyboard baseMiniKeyboard = mMiniKeyboard.getKeyboard(); + if (baseMiniKeyboard != null && baseMiniKeyboard.setShifted(mKeyboard == null + ? false : mKeyboard.isShifted())) { + mMiniKeyboard.invalidateAllKeys(); + } // Mini keyboard needs no pop-up key preview displayed. mMiniKeyboard.setPreviewEnabled(false); mMiniKeyboardPopup.setContentView(container); From eec7bb9386795a740ebbfce39792694373c1c869 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 25 Oct 2010 23:30:54 +0900 Subject: [PATCH 094/287] Get rid of mCapsLock in LatinIME.java Change-Id: I9c6387ee387d53460d23a12225829da344674579 --- .../android/inputmethod/latin/LatinIME.java | 80 +++++++++++-------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 07df7eda8..0d2e50b10 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -195,8 +195,6 @@ public class LatinIME extends InputMethodService private boolean mReCorrectionEnabled; private boolean mBigramSuggestionEnabled; private boolean mAutoCorrectOn; - // TODO move this state variable outside LatinIME - private boolean mCapsLock; private boolean mPasswordText; private boolean mVibrateOn; private boolean mSoundOn; @@ -586,7 +584,6 @@ public class LatinIME extends InputMethodService mPredictionOn = false; mCompletionOn = false; mCompletions = null; - mCapsLock = false; mEnteredText = null; switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) { @@ -991,10 +988,11 @@ public class LatinIME extends InputMethodService return true; } LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView == null) break; + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard == null) break; // Enable shift key and DPAD to do selections - if (inputView != null && inputView.isShown() - && inputView.getLatinKeyboard() != null - && inputView.getLatinKeyboard().isShifted()) { + if (inputView.isShown() && latinKeyboard.isShifted()) { event = new KeyEvent(event.getDownTime(), event.getEventTime(), event.getAction(), event.getKeyCode(), event.getRepeatCount(), event.getDeviceId(), event.getScanCode(), @@ -1054,9 +1052,13 @@ public class LatinIME extends InputMethodService public void updateShiftKeyState(EditorInfo attr) { InputConnection ic = getCurrentInputConnection(); + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView == null) return; + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard == null) return; if (ic != null && attr != null && mKeyboardSwitcher.isAlphabetMode()) { - mKeyboardSwitcher.setShifted(mShiftKeyState.isMomentary() || mCapsLock - || getCursorCapsMode(ic, attr) != 0); + mKeyboardSwitcher.setShifted(mShiftKeyState.isMomentary() + || latinKeyboard.isShiftLocked() || getCursorCapsMode(ic, attr) != 0); } } @@ -1369,14 +1371,13 @@ public class LatinIME extends InputMethodService KeyboardSwitcher switcher = mKeyboardSwitcher; if (switcher.isAlphabetMode()) { LatinKeyboardView inputView = switcher.getInputView(); - if (mCapsLock || forceNormal) { - mCapsLock = false; + if (inputView == null) return; + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard == null) return; + if (latinKeyboard.isShiftLocked() || forceNormal) { switcher.setShifted(false); - } else if (inputView != null) { - LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); - if (latinKeyboard != null) { - switcher.setShifted(!latinKeyboard.isShifted()); - } + } else { + switcher.setShifted(!latinKeyboard.isShifted()); } } else { switcher.toggleShift(); @@ -1387,13 +1388,15 @@ public class LatinIME extends InputMethodService mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); KeyboardSwitcher switcher = mKeyboardSwitcher; if (switcher.isAlphabetMode()) { - if (mCapsLock) { - mCapsLock = false; + LatinKeyboardView inputView = switcher.getInputView(); + if (inputView == null) return; + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard == null) return; + if (latinKeyboard.isShiftLocked()) { // LatinKeyboard.setShifted(false) also disable shift locked state. // Note: Caps lock LED is off when Key.on is false. switcher.setShifted(false); } else { - mCapsLock = true; // LatinKeyboard.setShiftLocked(true) enable shift state too. // Note: Caps lock LED is on when Key.on is true. switcher.setShiftLocked(true); @@ -2016,12 +2019,13 @@ public class LatinIME extends InputMethodService */ private void pickSuggestion(CharSequence suggestion, boolean correcting) { LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView == null) return; LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); - if (mCapsLock) { + if (latinKeyboard == null) return; + if (latinKeyboard.isShiftLocked()) { suggestion = suggestion.toString().toUpperCase(); } else if (preferCapitalization() - || (mKeyboardSwitcher.isAlphabetMode() - && latinKeyboard != null && latinKeyboard.isShifted())) { + || (mKeyboardSwitcher.isAlphabetMode() && latinKeyboard.isShifted())) { suggestion = suggestion.toString().toUpperCase().charAt(0) + suggestion.subSequence(1, suggestion.length()).toString(); } @@ -2322,11 +2326,16 @@ public class LatinIME extends InputMethodService vibrate(); playKeyClick(primaryCode); final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView == null) return; + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard == null) return; if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { mShiftKeyState.onPress(); // Not in caps lock mode, shift key is in effect on pressed. - if (mKeyboardSwitcher.isAlphabetMode() && !mCapsLock) + if (mKeyboardSwitcher.isAlphabetMode() && !latinKeyboard.isShiftLocked()) { handleShift(); + } } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) { mSymbolKeyState.onPress(); changeKeyboardMode(); @@ -2338,22 +2347,26 @@ public class LatinIME extends InputMethodService public void onRelease(int primaryCode) { // Reset any drag flags in the keyboard - LatinKeyboard latinKeyboard = mKeyboardSwitcher.getInputView().getLatinKeyboard(); - if (latinKeyboard != null) { - latinKeyboard.keyReleased(); - } + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView == null) return; + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard == null) return; + latinKeyboard.keyReleased(); //vibrate(); final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { - if (mShiftKeyState.isMomentary()) + if (mShiftKeyState.isMomentary()) { resetShift(); + } // In caps lock mode, shift key is in effect on released. - if (mKeyboardSwitcher.isAlphabetMode() && mCapsLock) + if (mKeyboardSwitcher.isAlphabetMode() && latinKeyboard.isShiftLocked()) { handleShift(); + } mShiftKeyState.onRelease(); } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) { - if (mSymbolKeyState.isMomentary()) + if (mSymbolKeyState.isMomentary()) { changeKeyboardMode(); + } mSymbolKeyState.onRelease(); } } @@ -2656,8 +2669,12 @@ public class LatinIME extends InputMethodService private void changeKeyboardMode() { mKeyboardSwitcher.toggleSymbols(); - if (mCapsLock && mKeyboardSwitcher.isAlphabetMode()) { - mKeyboardSwitcher.setShiftLocked(mCapsLock); + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + if (inputView == null) return; + LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); + if (latinKeyboard == null) return; + if (latinKeyboard.isShiftLocked() && mKeyboardSwitcher.isAlphabetMode()) { + mKeyboardSwitcher.setShiftLocked(true); } updateShiftKeyState(getCurrentInputEditorInfo()); @@ -2677,7 +2694,6 @@ public class LatinIME extends InputMethodService final Printer p = new PrintWriterPrinter(fout); p.println("LatinIME state :"); p.println(" Keyboard mode = " + mKeyboardSwitcher.getKeyboardMode()); - p.println(" mCapsLock=" + mCapsLock); p.println(" mComposing=" + mComposing.toString()); p.println(" mPredictionOn=" + mPredictionOn); p.println(" mCorrectionMode=" + mCorrectionMode); From 276845c7a9ea90fd34289d060873c8e3a7ed342c Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 26 Oct 2010 19:04:48 +0900 Subject: [PATCH 095/287] Follow-up change to revise Caps Lock sequence. bug: 3122877 Change-Id: I44c539d7c041443f3ad027de4b75a67adf6b2c87 --- java/res/values/config.xml | 2 +- .../inputmethod/latin/KeyboardSwitcher.java | 15 ++++++----- .../android/inputmethod/latin/LatinIME.java | 25 +++++++++++++------ .../inputmethod/latin/ModifierKeyState.java | 21 ++++++++++++++-- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/java/res/values/config.xml b/java/res/values/config.xml index 410d34b00..af145a629 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -28,7 +28,7 @@ 400 50 400 - 1000 + 1200 800 diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index a5a262ec7..dcbdba13d 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -391,18 +391,17 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } public void setShifted(boolean shifted) { - if (mInputView != null) { - LatinKeyboard latinKeyboard = mInputView.getLatinKeyboard(); - if (latinKeyboard != null && latinKeyboard.setShifted(shifted)) { - mInputView.invalidateAllKeys(); - } + if (mInputView == null) return; + LatinKeyboard latinKeyboard = mInputView.getLatinKeyboard(); + if (latinKeyboard == null) return; + if (latinKeyboard.setShifted(shifted)) { + mInputView.invalidateAllKeys(); } } public void setShiftLocked(boolean shiftLocked) { - if (mInputView != null) { - mInputView.setShiftLocked(shiftLocked); - } + if (mInputView == null) return; + mInputView.setShiftLocked(shiftLocked); } public void toggleShift() { diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 0d2e50b10..6d8803148 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -151,7 +151,6 @@ public class LatinIME extends InputMethodService private static final int POS_METHOD = 0; private static final int POS_SETTINGS = 1; - //private LatinKeyboardView mInputView; private LinearLayout mCandidateViewContainer; private CandidateView mCandidateView; private Suggest mSuggest; @@ -1056,7 +1055,8 @@ public class LatinIME extends InputMethodService if (inputView == null) return; LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); if (latinKeyboard == null) return; - if (ic != null && attr != null && mKeyboardSwitcher.isAlphabetMode()) { + if (ic != null && attr != null && mKeyboardSwitcher.isAlphabetMode() + && !mShiftKeyState.isIgnoring()) { mKeyboardSwitcher.setShifted(mShiftKeyState.isMomentary() || latinKeyboard.isShiftLocked() || getCursorCapsMode(ic, attr) != 0); } @@ -2331,9 +2331,12 @@ public class LatinIME extends InputMethodService LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); if (latinKeyboard == null) return; if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) { - mShiftKeyState.onPress(); - // Not in caps lock mode, shift key is in effect on pressed. - if (mKeyboardSwitcher.isAlphabetMode() && !latinKeyboard.isShiftLocked()) { + // In alphabet mode, we call handleShift() to go into the shifted mode in this + // method, onPress(), only when we are in the small letter mode. + if (mKeyboardSwitcher.isAlphabetMode() && latinKeyboard.isShifted()) { + mShiftKeyState.onPressOnShifted(); + } else { + mShiftKeyState.onPress(); handleShift(); } } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) { @@ -2345,6 +2348,8 @@ public class LatinIME extends InputMethodService } } + // TODO: Bug - onRelease() could be dropped if the user slides finger out of the key. It's OK + // for general keys, but we need to obtain onRelease() for the shift key even in such case. public void onRelease(int primaryCode) { // Reset any drag flags in the keyboard LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); @@ -2358,9 +2363,13 @@ public class LatinIME extends InputMethodService if (mShiftKeyState.isMomentary()) { resetShift(); } - // In caps lock mode, shift key is in effect on released. - if (mKeyboardSwitcher.isAlphabetMode() && latinKeyboard.isShiftLocked()) { - handleShift(); + if (mKeyboardSwitcher.isAlphabetMode()) { + // In alphabet mode, we call handleShift() to go into the small letter mode in this + // method, onRelease(), only when we are in the shifted modes -- temporary shifted + // mode or caps lock mode. + if (latinKeyboard.isShifted() && mShiftKeyState.isPressingOnShifted()) { + handleShift(); + } } mShiftKeyState.onRelease(); } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) { diff --git a/java/src/com/android/inputmethod/latin/ModifierKeyState.java b/java/src/com/android/inputmethod/latin/ModifierKeyState.java index 097e87abe..75820e7d3 100644 --- a/java/src/com/android/inputmethod/latin/ModifierKeyState.java +++ b/java/src/com/android/inputmethod/latin/ModifierKeyState.java @@ -19,7 +19,9 @@ package com.android.inputmethod.latin; class ModifierKeyState { private static final int RELEASING = 0; private static final int PRESSING = 1; - private static final int MOMENTARY = 2; + private static final int PRESSING_ON_SHIFTED = 2; // both temporary shifted & shift locked + private static final int MOMENTARY = 3; + private static final int IGNORING = 4; private int mState = RELEASING; @@ -27,16 +29,31 @@ class ModifierKeyState { mState = PRESSING; } + public void onPressOnShifted() { + mState = PRESSING_ON_SHIFTED; + } + public void onRelease() { mState = RELEASING; } public void onOtherKeyPressed() { - if (mState == PRESSING) + if (mState == PRESSING) { mState = MOMENTARY; + } else if (mState == PRESSING_ON_SHIFTED) { + mState = IGNORING; + } } public boolean isMomentary() { return mState == MOMENTARY; } + + public boolean isPressingOnShifted() { + return mState == PRESSING_ON_SHIFTED; + } + + public boolean isIgnoring() { + return mState == IGNORING; + } } From 373977009562ca01c655460aa82a4e098f6c0fb2 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 27 Oct 2010 11:19:45 +0900 Subject: [PATCH 096/287] Update assets for LatinIME Bug: 3109804 Change-Id: I07b5b0ff32228a6d10b92575f916b058e4ac26b7 --- .../btn_keyboard_key_dark_normal_holo.9.png | Bin 0 -> 1320 bytes ...tn_keyboard_key_dark_normal_off_holo.9.png | Bin 0 -> 1389 bytes ...btn_keyboard_key_dark_normal_on_holo.9.png | Bin 0 -> 1408 bytes .../btn_keyboard_key_dark_pressed_holo.9.png | Bin 0 -> 1321 bytes ...n_keyboard_key_dark_pressed_off_holo.9.png | Bin 0 -> 1388 bytes ...tn_keyboard_key_dark_pressed_on_holo.9.png | Bin 0 -> 1399 bytes .../btn_keyboard_key_light_normal_holo.9.png | Bin 0 -> 1321 bytes .../btn_keyboard_key_light_pressed_holo.9.png | Bin 0 -> 1324 bytes .../key_hint_0_holo.9.png | Bin 0 -> 1521 bytes .../key_hint_1_holo.9.png | Bin 0 -> 1357 bytes .../key_hint_2_holo.9.png | Bin 0 -> 1562 bytes .../key_hint_3_holo.9.png | Bin 0 -> 1565 bytes .../key_hint_4_holo.9.png | Bin 0 -> 1460 bytes .../key_hint_5_holo.9.png | Bin 0 -> 1514 bytes .../key_hint_6_holo.9.png | Bin 0 -> 1555 bytes .../key_hint_7_holo.9.png | Bin 0 -> 1474 bytes .../key_hint_8_holo.9.png | Bin 0 -> 1597 bytes .../key_hint_9_holo.9.png | Bin 0 -> 1570 bytes .../key_hint_colon_holo.9.png | Bin 0 -> 1262 bytes .../key_hint_comma_holo.9.png | Bin 0 -> 1241 bytes .../key_hint_dash_holo.9.png | Bin 0 -> 1196 bytes .../key_hint_doublecross_holo.9.png | Bin 0 -> 1621 bytes .../key_hint_equal_holo.9.png | Bin 0 -> 1295 bytes .../key_hint_exclamation_holo.9.png | Bin 0 -> 1344 bytes .../key_hint_larger_holo.9.png | Bin 0 -> 1454 bytes .../key_hint_parenclose_holo.9.png | Bin 0 -> 1435 bytes .../key_hint_parenopen_holo.9.png | Bin 0 -> 1461 bytes .../key_hint_period_holo.9.png | Bin 0 -> 1214 bytes .../key_hint_plus_holo.9.png | Bin 0 -> 1362 bytes .../key_hint_question_holo.9.png | Bin 0 -> 1508 bytes .../key_hint_quote_holo.9.png | Bin 0 -> 1315 bytes .../key_hint_semicolon_holo.9.png | Bin 0 -> 1327 bytes .../key_hint_simplequote_holo.9.png | Bin 0 -> 1242 bytes .../key_hint_slash_holo.9.png | Bin 0 -> 1429 bytes .../key_hint_smaller_holo.9.png | Bin 0 -> 1408 bytes .../key_hint_star_holo.9.png | Bin 0 -> 1480 bytes .../key_hint_underline_holo.9.png | Bin 0 -> 1163 bytes .../btn_keyboard_key_dark_normal_holo.9.png | Bin 1327 -> 1320 bytes ...tn_keyboard_key_dark_normal_off_holo.9.png | Bin 1389 -> 1389 bytes ...btn_keyboard_key_dark_normal_on_holo.9.png | Bin 1408 -> 1408 bytes .../btn_keyboard_key_dark_pressed_holo.9.png | Bin 1321 -> 1321 bytes ...n_keyboard_key_dark_pressed_off_holo.9.png | Bin 1388 -> 1388 bytes ...tn_keyboard_key_dark_pressed_on_holo.9.png | Bin 1399 -> 1399 bytes .../btn_keyboard_key_light_normal_holo.9.png | Bin 1321 -> 1321 bytes .../btn_keyboard_key_light_pressed_holo.9.png | Bin 1324 -> 1324 bytes .../res/drawable-xlarge/key_hint_0_holo.9.png | Bin 1426 -> 1426 bytes .../res/drawable-xlarge/key_hint_1_holo.9.png | Bin 1298 -> 1298 bytes .../res/drawable-xlarge/key_hint_2_holo.9.png | Bin 1443 -> 1443 bytes .../res/drawable-xlarge/key_hint_3_holo.9.png | Bin 1457 -> 1457 bytes .../res/drawable-xlarge/key_hint_4_holo.9.png | Bin 1412 -> 1412 bytes .../res/drawable-xlarge/key_hint_5_holo.9.png | Bin 1427 -> 1427 bytes .../res/drawable-xlarge/key_hint_6_holo.9.png | Bin 1442 -> 1442 bytes .../res/drawable-xlarge/key_hint_7_holo.9.png | Bin 1409 -> 1409 bytes .../res/drawable-xlarge/key_hint_8_holo.9.png | Bin 1478 -> 1478 bytes .../res/drawable-xlarge/key_hint_9_holo.9.png | Bin 1443 -> 1443 bytes .../drawable-xlarge/key_hint_at_holo.9.png | Bin 1594 -> 1594 bytes .../drawable-xlarge/key_hint_colon_holo.9.png | Bin 1219 -> 1219 bytes .../drawable-xlarge/key_hint_comma_holo.9.png | Bin 1192 -> 1195 bytes .../drawable-xlarge/key_hint_dash_holo.9.png | Bin 1191 -> 1191 bytes .../key_hint_doublecross_holo.9.png | Bin 0 -> 1449 bytes .../drawable-xlarge/key_hint_equal_holo.9.png | Bin 1292 -> 1292 bytes .../key_hint_exclamation_holo.9.png | Bin 1278 -> 1278 bytes .../key_hint_larger_holo.9.png | Bin 1317 -> 1317 bytes .../key_hint_parenclose_holo.9.png | Bin 1316 -> 1316 bytes .../key_hint_parenopen_holo.9.png | Bin 1323 -> 1323 bytes .../key_hint_period_holo.9.png | Bin 1164 -> 1164 bytes .../drawable-xlarge/key_hint_plus_holo.9.png | Bin 1340 -> 1340 bytes .../key_hint_question_holo.9.png | Bin 1392 -> 1392 bytes .../drawable-xlarge/key_hint_quote_holo.9.png | Bin 1257 -> 1257 bytes .../key_hint_semicolon_holo.9.png | Bin 1248 -> 1248 bytes .../key_hint_simplequote_holo.9.png | Bin 1204 -> 1205 bytes .../drawable-xlarge/key_hint_slash_holo.9.png | Bin 1317 -> 1317 bytes .../key_hint_smaller_holo.9.png | Bin 1326 -> 1326 bytes .../drawable-xlarge/key_hint_star_holo.9.png | Bin 1344 -> 1344 bytes .../key_hint_underline_holo.9.png | Bin 1158 -> 1158 bytes .../res/xml-xlarge/kbd_qwerty_row4_common.xml | 2 +- java/res/xml-xlarge/kbd_qwerty_row4_im.xml | 2 +- java/res/xml-xlarge/kbd_qwerty_row4_url.xml | 2 +- 78 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_holo.9.png create mode 100644 java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_off_holo.9.png create mode 100644 java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_on_holo.9.png create mode 100644 java/res/drawable-xlarge-land/btn_keyboard_key_dark_pressed_holo.9.png create mode 100644 java/res/drawable-xlarge-land/btn_keyboard_key_dark_pressed_off_holo.9.png create mode 100644 java/res/drawable-xlarge-land/btn_keyboard_key_dark_pressed_on_holo.9.png create mode 100644 java/res/drawable-xlarge-land/btn_keyboard_key_light_normal_holo.9.png create mode 100644 java/res/drawable-xlarge-land/btn_keyboard_key_light_pressed_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_0_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_1_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_2_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_3_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_4_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_5_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_6_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_7_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_8_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_9_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_colon_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_comma_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_dash_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_doublecross_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_equal_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_exclamation_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_larger_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_parenclose_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_parenopen_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_period_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_plus_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_question_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_quote_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_semicolon_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_simplequote_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_slash_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_smaller_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_star_holo.9.png create mode 100644 java/res/drawable-xlarge-land/key_hint_underline_holo.9.png create mode 100644 java/res/drawable-xlarge/key_hint_doublecross_holo.9.png diff --git a/java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f7cfdbd84e91b8998846a0b25adbfe2f6e06af0a GIT binary patch literal 1320 zcmbVMZA=?w9KV7Pvw+C3;tMg4M=}>fdoO*t-i1<1ua#yi62RD~5w3R+aDlt4*Tc5R zmJOY8%nw~+HWN%}H0~wSZCT8slSDp%*#a_5G_o0^TZS+5WfPopj18ZI7BwOJ;3ap@ z^M9WI@ArSd-OWu;lx}!v1BPLx;YPj%tq-HO^6p~vUA*6EN6UjoFlw}Fokmj7A?BB~ z7zANO=z=X!kkT)lfwdS`*eSO~jc8;mCu)jaFm>!HC63S-R_jZ}1+fPjAO^c+)r(*G z_!At+k{5s46(J+>0PL0<`*qmb-_$1d_lT^7`|3b#ibDhnGz5@RdesD%^5QGJ9NL@5 z1P)eIj2Qpq+3<8=Cfy++XMAA(HH)W?BPKIG>08LUPLDB?8+bD)}&>TsE+=C-) zy41uM+3(s4+% zz=YPPi>Mx*)p;<=-JK1YipU%8NnJ)o5qfz|>{Fm>gn2KHZtRjQaUq5YQ554O8Jcu^ zD9RI{oV>#o@_3v9((P}^bF7DT`B{IEcT&8^@1!U`$wL`R~{U@x_>PD{N(g>T~Xt5@w~6#_ntRlNBg#$f4(nG z3|W8Lvad!+-CA^=bMGD+qQ}R_NuKAYE?vBMdFPFLCQh6k@s0d3KfiJD>V?9I3!4BK zJFa|vGC4Xr`aL-r%~+RiUN2M2XM)nRca=O^oMFL2rj|j;fP~%e4cW4j!$ZIFTF}7-$%&+g4D?zJX=g zj)hFs^lKYmpPHIF^77!|*sjg*?jlcDWz#<&|MH9P7JvEbSo?d|uY5~b4&d$C4>y0b z&$94aPc}GgwOU`Aot>?}cJ48--345(l17Xwv)XPHj1zHJs`;7bOXqhSnJc=t0~4{& U=UzFq$7cS!!oeo~XhX-~-#{wU3;+NC literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_off_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fea6fc9463b40e55b9297f389f721876ef92b577 GIT binary patch literal 1389 zcmeAS@N?(olHy`uVBq!ia0vp^(m*WE!3HFMiJ9mDDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl+|140 z3=Pdq49txT%q$EIEu0NaT#QZKEG$f%4a^*!U}j*`YwBp}>g?iZ;9}uuVrb~%=ICl@ z?qXzSX>4F*Vq)nA*Xx;AT#}fVoC>oy6KF3)ucaGay;jaesfi`|MIrh5Ij|HEkda@K zU!0L&px_*As^FWLoS6sWgQ5rGTbIWWu11C~ z7A|g1E{;y-N>IHi?JgIrW98(0$8vEDY*~P%X zIM>s~F{I+wov^c6%?<)_^^+Q|$U7a4Yu)F3-%-P(>f?m!g)CJslb_sh|DfPet@%Xu z7hh{kw(h|UPmfg_jlGr9JasxVH6&-mvfX`u`>#y;w9}vGyvdR|esI&A+m*7;Wqj)< z9*$)Bx3lxjq(5`_K2*?SmStDSJCn9q?u@yBl<5KH3BOie&9Xi8XYUdI@Dwe+%P+s& z`@ARmda0*GTeb1aU3n$D?^+)(WbvHz%ll7(s`69=&q?8@H{A*pxq8j_vWbxdkJ~1l z__a$!PV4K4bvJR8Z85)?Vx-v7T=A4A?c@!S`!iR}xvL`=?;3XfAAjVuRCd+mj}?Ck z+^r*b9-BL@M}2nhRD09guPf%MFVeUqdEfW)mZIkU6MIEmGmjVgc=Kfk9PP}#?fT}o zU8CN{i5vwQahZ?r%<5@U_%YY7UF_m6SBXM~_m#oRkJT+c_x$s*0*jgkon38Cs~#Iq z;qsSaVU+AYZlagM=ouQS+Lm}>azf8nkrPe|RffKs@8_6poPYFzy!+cLZ)Be^{dv=% r693@+Z9SW8^A)v{+wShEW07Dm{rUQ3)_0LUPyy)a>gTe~DWM4fy~pw7 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-xlarge-land/btn_keyboard_key_dark_normal_on_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2ffaf9a12e6b63583e1ab05c579d21f6270de1 GIT binary patch literal 1408 zcmeAS@N?(olHy`uVBq!ia0vp^(m*WE!3HFMiJ9mDDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl+|140 z3=Pdq49txT%q$EIEu0NaT#QZKEG$f%4a^*!U}j*`YwBp}=;~r(>SEz&Vrb~%=ICl@ z?qXzSX>4F*Vq)nA*Xx;AT#}fVoC>oy6KF3~uL)kgR?bDKi6!|(A^G_^uoMuGkzbNu zoRMFk;2dnK;G3A7nFr#7q6gwzm(-%nveXo}qWoM1aQIqfVzJ-N64l?1=8nd$MusjH zE^baPj!x!EP`xSSgqc3jG5Vmyfs|NaLckOVV#1R?kOR*=sd>O0Qv}Q!vEi;y85kHh zc)B=-RNT5VZKMAo2a#jU!Cs~xaY`L^9$ka8%$>nHq3fu*y;tVvJxgO(zqG4vLs4JEYn7AJGmndc!hj|8F~k%0y3B KKbLh*2~7a;5d9he literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-xlarge-land/btn_keyboard_key_dark_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..733944c5af6e64c48d5f489da03ddd7924eade58 GIT binary patch literal 1321 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 CEd#v( literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-xlarge-land/btn_keyboard_key_light_normal_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a34fe5854cc250175e2d13d95e7d4b1926091d9f GIT binary patch literal 1321 zcmeAS@N?(olHy`uVBq!ia0vp^(m*WE!3HFMiJ9mDDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl+|140 z3=Pdq49txT%q$EIEu0NaT#QZKEG$f%4a^*!U}j*`YwBp}=;~tZ;$q=wVrb~%=ICl@ z?qXzSX>4F*Vq)nA*Xx;AT#}fVoC>oy6KF3~uQOh~R?bDKi6!|(A^G_^uoMuGkzbNu zoRMFk;2dnK;G3A7nFr#7q6gwzm(-%nveXo}qWoM1aQIqfVzJ-N64l?1=8nd$MusjH zE^baPj!x!EP`xSSgqc3jG5Vmyfs|NaLckOVV#1R?kOR*=sd>O0Qv}Q!_omEJWnf^8 z^mK6yskn7#+C{Gx2a&e)l5ociLDKzC(_3VA4yGh_vAydA#vop)Z z0Bd)iwD!BK?$Js7XL^h+{x3I9e3K({;O8mIsCr+`uP40tYNN!cUluGWLX$JC%Mc> ziM)2|^B(EzrK!G`ukEeV*{FZDwD#%me;NW(=iFtlBp*-DS)M7SeR|Won$`jAZQ(b&_K%;(tRzTcz52srvTx4cuzt5=+Q*E&h3^-Nb(T6O zbgp|HHt+e}sm8|~mS0Y`o0F%rSm$(q-(!Kp25yZ7cCQ-lectBL`!Ovr^r}tQqUsNe zxFzDd4n25tjG<~{ZuMFXu4Be~?%MN7t^6tTglBrSlLz0^-0(x2CpvZtm8HhnGx0EN X*?0P2lC7>0sPOW1^>bP0l+XkKVW-lV literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-xlarge-land/btn_keyboard_key_light_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..daa7f6c53a83118a165eff63029a4913bd951509 GIT binary patch literal 1324 zcmbVMZD<>19KV>+*3M3=Yu9dmxLwf=ZSEyWbIFl3x#SWXSi0B-TOrV0@1C}2n!DTO zx}>$!%)w9*r80tbeyE6>jxj~cbf|PN!Od;HK({p$tZXGzhmJ9%n#I-U+NLU$eei+1 z=jDFC-~aWwm!j=Y)KqV-Mi8VX+{Sglc?*0tRaL-uvEGiusZkGh>zzuUp5`@xu%gln z&~TFP2OWSHhj*U^ZUiy+NwIFdJFCX6Hmmxy^=QFn%c0!g6rXeK!*rDO zDKcs(^1aHC?!lm^%ONDyNMu!5POT&gri{q&Dna2SkxUwKEum9-2l&U0HPNZqunLF{ zkWz*;0oJ3hsZ55sySpI+2)$u;Y7#68KgcP=WktHWg@t#-RBw8{<3DV>)E zP_`>UyDMD!u3RRd0bW?Y2Ui_2b-#~Z2iY~N`Kla+bYc`uWoF(^I*etBA?G6L4KZ%-s(Bse66x}cIx?W zy?aV}@%wkSHMZ_8?l=({9sT_3rAvjUpUNFRACJd95Ng}{c=7gvGXM7eueN_wwa!;$ z3)%C5`hK=hy1lS-{`x1%t`n1!&H0>XZ}AP2xZ#X@ZsRL*~#V+%KC3DaS$XX4ZCCv&D- zza=JuhwAF;o}HPQ@%^6PhCUa({O0B_YB1B6?%3qq`Uj>?UHpla*s+B9cy5y~YeL@g WoI8qreIaE0zrw+G?zn%~3x5N}@Xv(+ literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_0_holo.9.png b/java/res/drawable-xlarge-land/key_hint_0_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..608e76f2559fd90b0ebdd76a5076bbcf5aac99c2 GIT binary patch literal 1521 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@PpnVYGRiHn7!iJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYT~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18X3A+ zxVSmFI69dtLG`AP6K48A$LNC+2U22z2?0|ehzU>nKn^_fq~-y0Oc5|^Jk2_=nSp^x z(bL5-q~g|@PNLry77NM5DJ*(l8UOu=W$Esp&l@FWEvoMCoL*e_z5HLyv&wk~B|h^UPT26z z_u-H8J*ph$(=-@={LHob$MW-2W}s^rU+^TKR|}Q8KUcPJ@%R+*WNCRBxru(7@j+O@ z;Gp3Rot2I;%%x1S{Y$KZV(l42p0r5FtiO`A^>Bqv-8swn=Cg6@%jcecs%J7Q&FcRf zug)VbTeQDc{WX#5o%g!^_uo3($tPt_Jau>_kY~(mTX0U)D?wI6towD4-vK)bo_WD5 zuavF6x~u7ZfyJElAzIZH*2Qt@#dD|SnCl3(Joo;u`I`6#hx+OPTbM}|SNU@L(?mm?w>D<{-{D1oS zL_hs9tF`D$7TQ0BJ+u02bXUur!)}6a%YHYSO+NXAZ`yLzm$w*Z^Zav4|7*3J;c?K) zD++bOoks)})`zV=F7#9D#;&{XY@a!vnXCWfjAR6(@obMpbzaLaM=tHWGt-x)ukgOJ z%i$Wk`kOCH&b?q$*p_>L>glJoC9hW8{b}m4mEl&DY|N4v&NmvrdW-)u$tzFKU=-;% zp!)A3XRy#e%d*|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@PpnVYGRg^PuwiJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYT~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18X3A+ zxVSmFI69dtLG`AP6K48A$LNC+2U22z2?0|ehzU>nKn^_fq~-y0Oc5|^q*?YcQgLffsIOm(fyg^;jf2VsT>cO4xm@4yjYIDX&z;5{Y8#R}y~|o!#SP{hXnj2` zY}IN_CvKmOr6MG5D}T~}qkl`vUIyj45B z>G!r=``zn)uX_E9Rrb=((nKTkgX>qXs_I+xA~fFUn9ZK#Z01!5_Abl3cgUc|MBn1M zoEOXLV8ipDZ!2)TYZ17g8mac{zlNbsuCUn-k4Z~j|Ngg9qpRJ-*Z#~EEA{iL%Ov|B z|A=K3$=$3J#AmUupy?_Kqc@0XrrBtheZQXkEGU{qLw% zH~CgDm2Kg?yJQCIx!A&j3D%a@nqiCc;u_9b+`7n})5NZOeUD2mtC74wOvYs6=Sn_j z1F|DzSZ=VDd#>g<6vrIZ_}_2l%7!^_51f0x)q*ebL_Y&FgVFv4Hl}rM+Moi?)78&q Iol`;+0EWiiwg3PC literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_2_holo.9.png b/java/res/drawable-xlarge-land/key_hint_2_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4375ed0aff7ef5af77be1fc36b7aba378795eb GIT binary patch literal 1562 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@Ppql=4$sf&f9iJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYT~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18X3A+ zxVSmFI69dtLG`AP6K48A$LNC+2U22z2?0|ehzU>nKn^_fq~-y0Oc5|^v}%WQgLffsA0F1qsYCPw_`22FK14biHJ?qRGV;af>K1pjgA6=B#WGP>=k8fI*Swq zZm;HJ>2!4w30l!w|G+}XX_i8H!Yq^WrlXbB)|LMEWDXzsdhN-X=Iz#-tv}zJ{l4}+ zudtIuk71$&+u@J3T+7Xk%@pq3STN(qj(m%M-cM$?yNV|81q-d|YYlnG?4Gh#x5)?{#~u?z8^G z2xb?%I{-mX1|GPmDm zKm71Rq}AMi4WG{|Z0BxCkm{~U)RTO8C2MQ^hkXpZ4`!tp{dCcr<+nV2i{FpFIU9;a zPwB3h=CxGLfiLc{#Dia48)}07ua90h>A8pd>JTkcozqnvmM_Y7|2CSK@kdXqsQ3At z1x^;*+!tSTzr8Ivp@Pfg4p5o>AGfvcdfXh{>C!?~B0OyK7d`Y_K3QL^JATWw0~!mi za)z!Fez@WH-+#LUG`=wLZjV~)v^DDQG7-t}TZdl#bGkmqMCQfUs#Xt`pwG7$_|6M; zy7+8kTram-L+Ncw)4R)Ck8sN_`!0Iuj@q_@y=+&Wxtzopr0GW_T(*OVf literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_3_holo.9.png b/java/res/drawable-xlarge-land/key_hint_3_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b263c1922de9c902ca36d4b1f57ec9ca9028a87e GIT binary patch literal 1565 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@Ppql=4$rHh55iJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYT~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18X3A+ zxVSmFI69dtLG`AP6K48A$LNC+2U22z2?0|ehzU>nKn^_fq~-y0Oc5|^OnIMO#=yYj z>*?YcQgLff=>C2oN0EColOHmPcLZe}K6>mB-%FhZ3m5KK5D<0eu6+UT-J>msBu-6^ zsh@EpAxTlOv57?}$vIJ}wZ1{ZiS?m}NT1~W==&ALlU>DZYfc_NXSDf!?eD$vrm&;2XPD{8734J+nEz zmtTIr{PN42875Vd{l~vE@+ba1SE+kWd8Uur%BP2JxrnJ}o=o|~8dJ_0w*P+qvY?ge zZgpm>idTlSI5u3~>!MWH!T#)XrTzT#^$Rvf6s1e%-@aayE9?<>jUm4sQt1sBy{skfR||^~6Z(n%b4j@`P_&ZsyDj z5J=x2wN`GS$&Ptv)8=or+#IM`bbH(P!w)}bdKA36=5jahd(*Lo2=Rt^{zLJa68*>L zH{6x}{Gh<1CUo`HOIQAJ7p>DeyjP@GaP^mMnR^$1Js@fsn{lQ!PGYs&x?7Q1b9Y@R zQtDy*Y*I8+E_Aij_AG(xD*2a=9KSPTb8hW|(DqZIoIjs4v^}eTd)!s*^>PMghUT|I UTe@7MpMnZ(Pgg&ebxsLQ06`B?7ytkO literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_4_holo.9.png b/java/res/drawable-xlarge-land/key_hint_4_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce5bb44385be65e530727461474c7797d31be05 GIT binary patch literal 1460 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_doublecross_holo.9.png b/java/res/drawable-xlarge-land/key_hint_doublecross_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..716b8f15ce9c5181e6664ec84494e3792b9f6483 GIT binary patch literal 1621 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_parenopen_holo.9.png b/java/res/drawable-xlarge-land/key_hint_parenopen_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..635a0c2dc985d88fe7cb2e8ed0d210c6eb63828e GIT binary patch literal 1461 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@P(vyp*;iHn7!iJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYT~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18X3A+ zxVSmFI69dtLG`AP6K48A$LNC+2U22z2?0|ehzU>nKn^_fq~-y0Oc5|^$lht^U|?W; z>gnPbQgLffn7#iY2a)~O>(o?~CSBo`jVvuTtYH*7{AO8v!@)p1W=`Yg?oMXT#Fy+B zSe+z%b{YLhPj+;c@W?)2eRlVgoOMg5K2q)9wtnyZ>hIO>>)1t|1iV%%v;^!pUu>`^ zXjAjS6MXFL^Y^^`vH#5DHXRewE6yELyq|I&;0bs8$ko6oapaB&gVhA}lrshv$Ez8> zUEH_*VGQH@uT^_LzbyG>I@9M)+3wuz)i-StN_RbU@xHZh%i@m}f7A}PKDOBY=_dn| zQ^N}z=01Z|z6Y!v1~Po>EuX9Jd%xdYs+avq?9KTZfe-cst-Ny3aQ=DuP{Yei#~Y1V z^hLUlau=LQ+pMmm6ft3&Xrxd4<-G0H$0W3y>rJHgKAT#3qit!>O945X^S@tw|2>~8 zBIQEYmfP`ff}%6x9we^To$kG$DPmgb8c&9!yHeQQ?VNctw?^roy8p7o?_>0|R8gMY zF5g*Ky$xGEmANl!ZCLo*nX1)oT;fYv5Bxov^pS_}_O|sVSu-48Ofn8%)>wTu?X%oA zJC6ei20N~FOV6BqW~Z8!)8y-0U+*&iurF%uJTdb@0P$6{C}7G0!&EcWkqCRxI9i_S?0MJXgTe~DWM4fJyH{r literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_period_holo.9.png b/java/res/drawable-xlarge-land/key_hint_period_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..41ac3a80dd99ce7fb9ff493e625837c09b75a735 GIT binary patch literal 1214 zcmbVMU1%Id9N!u#5{;s@c=iK_O~8J5x3hbDw|8ru9|VLGyh)dF1~qwntfw$ty~-yZ#uE{~H;nG|t_)N~Iqiiw91 z$lCfaDj?l#oLE5J4AWMzN@Y^c9gz)eNAy4^Qny`-W|;1tx~m(bh=3t9Y&j|R&ksLh zfn}!H=VCdSbJJ+VIy~;7;&^|_7#}r~Cfjoebk}7{U?ZY~x;^Ijay`Ya^U8D|9CIvK zS0SS*cEhQ1E)UY!Lm(D`VFSh?i1QIXDoT>{6c8W}IVf`F# zs@Akcr4&0th%0kktyYWFq7m#3b9^$H3^)WKOf|xO!y$S-?D(B61{L{+XSu|}4hR_a zAzURXmU_Aog6-yVo5YUaOcYHSSJz#Rk3i10gSghUeNsUGxUr?SUuw9BD4xcwQ2rB*1ur=M!mORHHF1 zkr2}`uJpDzw!+2~O%&BwLQNBr|F_6;@%L(M5JR8xf$g^HTrsiQAtmjv@wy>`y{~Na= zDbb9;s|i)>Rh3?eZDP&;lQWJw!v)RpuV!f-(GCo@o2^fU&EY`~ofwaf#@IW|c{)}% zv#L_6U;ATlp#2JbAa{K7lbi3IU1cYpymimo4=WFL{(;~vGDxm z`RVF?G;=6SduW_r}Gm`wlFfnjZZ6vtPE| z>Svc5-|fa+>KWtbw&(fIk8AiL{8eeG@zb}}m#uTZ9v%EB*kY7p+4_X1W?zcV4(MH8EY)yDnW+<)s(& z(_ehLcW`BKk3WCDIBR}zyLde`b>?_z@4(D(`|Ire^Y@0BuD6cC-;d_c1%H%mreA%( I_r;070kwsiod5s; literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_plus_holo.9.png b/java/res/drawable-xlarge-land/key_hint_plus_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..89f33671c7d2312a18d686585652e37612580f92 GIT binary patch literal 1362 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@P}sgseJg^PuwiJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daY)9=2! zp~#$RmaD_1W+uty{L`xD^VuoP43Fn9C-*%5JIndPnVW3R8+hFtrf+@uWAcgr>K0lC z1$!Qdi84NA7gN2`=C78)w#oS2>)nnII;4E1+7i^G7Ks&~%bf7uD>_8vXz*nd`O?_^ zubyXr^4{wsai!AL&b4Qsz`8vy&X1Y6Sj1d+(Z=-`o;B_0+j=+K`?F2` zHO|&mtGNE|x%_Rx+rEs+m*?N+S*ULrKIIDYxk4HFV=f+@|NKA6XUggXa!XXnajSby zvfamVSb(uw=?)r7~q+;8<+B(|RQe(xzeB z99w8u#+YnQ=N3d=MvS6UWFm+Y7!m?V7GfA|4i^V8A((yXMj*TLwJkCJu}kjW_j%vv z_j|rCWHIlEjd>vk0DxGd0k;ZkqVTSZUL|~wOvaB2%kw;8=X2OR-bZp2pmDJd3N*UO ze9B6Zu0TmIl?eb*d9=;W+fCV+lXXkTu#Uv<_6TSI$jtJ4NM{kngAOX6X4InTs~sYc zcBw^s6eif@(NP7oA;?iVL9@*nEOM$`qO5ITrXLds+!RlOes?kB#r$f~JTE5f!^e;a zoLAwC)S?Ba>?RASV>t>`NMNxOR>GhXksvZTilXVD6h>eOmO_YBjG&lIior0r_=p5+ zoGTBr;`&8ff}|D|@Vp0uAfL}C@yR4Cmk%K-l`703m5K!ou{Xf*q+iTK`{AtL?P~ zJQQT5yzBwaDbyox;}TfN-IEQ46$NjwS28p4C98f((2CjUQ^wY7=k+!+M6W<=CWl62dPV(+})6}EHdly@X6pJc*=lRn9m0zu0 ze<9Me@`4$Te%J8g^`t?#KccLsg)<^?`zlmH_8C=NM})q@XH$wJo5TjDuJ2xRfxLBH z2sd|Ck9+*1QwImRD`V~PtJi*D*%L@l*jg7Vsq7q|@@JNP)}MF8P-hUGPE-Uc zV(kMHzwT?!JsWjDaB|3hD8G6#F6MB@?~#qBLGAH_26S(?qvWN-yZcf^YpOg|T} zTWhj^nA&i+VaRs*i@J+@XX}a7UsAVD3?{y>n~SZvkuasJhyaqRXC~iE-K7ctca4M@ JKc{`;(BCivEC2ui literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_quote_holo.9.png b/java/res/drawable-xlarge-land/key_hint_quote_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..818476559b8d683edf89eacfe1752487f71961d0 GIT binary patch literal 1315 zcmbVMZA=?w9PgZi21A^YWNw6bx%q(vdT(vH_R@lFuLrHR@=`{T&2Zd3r5Ad4_3p3* zQIRmBk|A>@V=S6&hAi2KWlR#IOBm6BQ5IvyA`V4N$()N(Gox|F1$_=EYC`tGOYWZM z|2+TS@Be+ESBO>9oq=kJ@75H7QpZE?@PXd%U&ZGH=5Lhk>NF9@rh~& zKteL#2^s+}_B{Iu@K`K66H+X0#3N5Kf+}OYse@(ZG(=l0o|~uBaBm*t zD6+0%ba~MYr{a-%B%o>labko`AgTzYio{5}gQn?9gd#`+Cn%hxY$VOtDTW}B%?E|n zG%>+6vfQRED0$JOVWb%x&tx)K#*V34Cr-NEZj*zeY*53d_b3LRwJG}kJOc}KL6g#k zq$-HX$akpSh8KmNZiFDGBatm)Mc+&mOc|c#(>RF{xGbA-t!wK>BlyRSZMF4SPa5Ej zKv%mp0oEh2KM#hvySE`z5qiTsrAe?Te2P_tZW$;>i1niI1`{Qb;b@v8N!mfs6j9|O zNmqb$uy!ZsaybG-mCv8&*beLT1>J6rW?7fdL6R)z3z9TTRk`g1<#4#UEo?~94PFsI z-mV1gZej!X#4-U5@P?|zR5g|Ffcm6rsCrUOBY`F-65$0&F=ewn8_}{rlb!=2r>Qcs zo?k}V#y;o%Z`?lGXAe>&>tZ=S>+{p-CRY4EIm4kdxY->4YL@&F>_Bt7)%sA_8Xlm) ziP7L_EImTOdELQ zZDfI5lrb!R%@-cN@#3xB_Z2+-(AmlGnd*{HUkdk^C8^p|{Rc`$e;7KYzWZqTiK(jx zg(EW!E5ARu>YARCpRf72^CQCZ+3jg*ydqq5e%Gw4eEt`7WVNlYe(|@a=H}xKB{G4% zmb*SWzpwAan>YU`yLtDZ_4ZQta`pVh(mr=&A&Q@?xN}B$RCwXn@tjS>^@M)Gd-BlQZ1`MeM}eh$Zg}~0`%KRK NZH0nS_PoD+;BWnd&)Wb1 literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_semicolon_holo.9.png b/java/res/drawable-xlarge-land/key_hint_semicolon_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d8d4fe7e1bd1edacdfd117b6fe4dbd12ee2468 GIT binary patch literal 1327 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@P}sgsepfs2KsiJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYr6!i-7lq{K=fF}xKt_H^ zesM;Afr4|ese*4}a%LWg4~ia$Z(UN0GRsm^+=}vZ6~N(Zm5IfEH%nB1JDNKhyBZm~ zSh%=3xi~tRD?#<9kP~M5K*#8V5(iRZfe8UqAczT1`aljm^Q7hhb4(F1Ydp?)`;mcx zG2YX~F{I+wl`!wT76Tq%qm^Ap7PUWMc*|PV+P5Rv|AOvqONaVuvjbg|HzbL9cYQX@toQk5d2_?m;xDnHu7#^!?>hVWkKpqt zwb=*KvleMo9q^Pn?!I+fd(?#B7r+0Bs>fd6yTUa8=!{oJqCPQ?{scM32C*Wv`ww*A%pvc*Q-|DQ`ek#dXr6N`>XOT8Ow|NV!SH5U;AF(vvz5q zz=FWXk<;#SD&`$4v{|0{Yfa!|cE9f}fx4cP?mS+Sds}_dgEcdj^6(yvtbV>}2Kz0a zyPD0K&8ZFcCF?93|FN<0PI+ndJ-2(C92c8!^!p<2t@pRIWL%iBS3&B~7AxDQx)yCs doAepk7~cG!^>$+Wl;@x#%+uA+Wt~$(69C9!&g=jH literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_simplequote_holo.9.png b/java/res/drawable-xlarge-land/key_hint_simplequote_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0784b892a34c2cfb1c0d577f57dbf30a61e0e46d GIT binary patch literal 1242 zcmbVMZD`zN98Xu7U9qA#DBFR=6x87^d6L{+?y{a+?sBomdR@KV?2RItCQo~@&C8OU zmzKHNQO+0kr3j}79c;o7HtDQj*(TyCiWIGWm@Bdll~G@CG8GGDV?&>`y{b_5!9emn z|L6Jte*gEp(%tn$OY`<-48vN|9by)(t>_IjZARbMf8M%)mThh-@AjAjZb`NwCa7jV z#M8Pw2(wUDM-I-yb_{DA&~kYvxTHMQE*+0r>Ih?M3z|6v2eL1)BpWiMzrZFL3_I*P4Xu4Wpz z&nWksMK?|$Pgg_GtxRT}*l^Yog;GX&vPID(pmg1jYem~}v+y4`Hq>@_@QHO?`7UKlEAyrM~C61G5nhODr0g)(8N0W3& zWW!Q48cKqQkf?KPgbfQ)C?tk~7!^V^ElNU)=0qkEV*wKi#iVs?+HhRiP+;AzhU_9N zo#5Ei9kG1UhO%qgInx}jcR+W+bWNvVT6nT2jAvv;Gkn=E&uX+Hw6*7ajp& zys)=6BXI}v9qjQhyZZKs4cMdO*y&_>k$bu6q0}ecOHIMgmfu+DFEIJhv2$|ush7Yz zi<1wZ7%SUzcP;K|bvAW+a7*KI^0}!$+UBa^hU?`kz59!2uU(k^^H%MzkKQ`@+I;#z z<&hmfOkcau_vF^O`P+D_I=1t3a_QuIhsS5$OkZ5;OfAgx&R==^(!wv5>W{A$@7{cA z@`JN|_pqP#28;c*|ZOCL{9PF>wm!-k&G%g*^q-v8UAQ(fXz;@P8r1Nx1w!2kdN literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_slash_holo.9.png b/java/res/drawable-xlarge-land/key_hint_slash_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3df3d908736565a9c7cb45fa17dee59b34de2a9b GIT binary patch literal 1429 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@P(g^`JYi;IP$iJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daY`S~(Y`CYIzEh2-bwz*0a!Mt(_t zaYlZDf^)E`f^TASW*&$SiXMn>T~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18X3A+ zxVSmFI69dtLG`AP6K48A$LNC+2U22z2?0|ehzU>nKn^_fq~-y0Oc5|^Fh2IW$H2gN z)YHW=q~g||(7k?4jso{$zfEbAC|bDpSlg*%LXU-4w6wAGvaWYXJQ)3fL(I!*d4_YM zs_e$ctm|4N9$gf$&D*QEdBdFV=O3z7Z~vM1`L6l>Gv|U7Sr$&=a^h$$o!0zt_9R;# zw{I2}Hk-CR{y(Li*Zk%cb$upfv6Uw$&PZzEx$f}dK+AbY`v$HjhHD>NXbRo_A-u8s z`J^8S1`>CA-ITK}Wb71<1*wbZPJGhd>a>vSM~czQ!T$FTeJ(#Lv{%x=`l% z>af*c7r)_94G&?q)SrGjyy1M>X7?{OQ?IPZN))_b^tCEhU#$B&L(lQYc50XV7SD5y zI3(TcHr23fON7q7=(X3{yLCmso;-1J(i|22sb1m@{>v|myOu6dbv$)F^itmT{?9-E zNUChQ{nk!#V~F3SN$W$xwWfMAJp24Jd;Rs_Q&t6=>YXoKzH8lmhP+wNHm{00lC#+H zRA=^K%jb7CM4?SFpa^gl%r z?`iMijxRs-FUI2ax)*_ZQ$B2u(pgixh$sBrV!NwPAB6gC-r?MwbMgrvuh8*Hzh-DC jUA-JzQIn&%pNWSdX!brExn1qwK?S9!tDnm{r-UW|!d(vE literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_smaller_holo.9.png b/java/res/drawable-xlarge-land/key_hint_smaller_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2852bab226bea0875901b6aa0467915e821017 GIT binary patch literal 1408 zcmbVMeM}o=7{6^e0S9D)5J9)wK|~Gh-Sz9*8+B=W)OJ#2rSg@49PI%o?cMF}pe?ew zp+rW)$Jl~d+#;KN7<6tC$DG6&scs<)43wyw@`qytjZRIB6J;5`1&W%G{oy5d@B6&( z^ZPyDcPKya>A2X`SO|jR>^8~?))erjMQ;Y**S=5s1}qQDImL1TUnTo#k%3GezLJ6M zKDwH5GPEbScZ|t~piNb*t5_~}9YWEu|myqrV^jL0%C3HIS* z6oHpjcP-T&2JXQmrB}3|@T@ zU`_N?kxt6GY70n4q(+tn5=H%fztXQ(@?tfL8w`dphf1XY8VV`M$#g)$N$C*=ijmwR zE66O*!C^+alCP7E2=H_z1fSq=tPyk4YN9~O&;Tu?C!ZINjlP6s9A0R;W4S-- zEv9+GTZUxllK1ztP7f9gWc4WTP$}Jo=E2rL#sZR7=A7SS>pUwzm{~vZk>QW8`}aPQ zxSP$5J~@dF;lY94rc1Wwwosqfa5v+(C3}4QI~RNIQ4+U{ zIVhxIscjRbr@zEIM_>7~asLw=XC5CX>K^cX`f7+Cx#q3c&oAytGLBabU7QaVRsK|h zT(>3n{a%6T-_LqG0qwprcjCtneN+1mAFI4sx)nWjwPO@(EY3>)>eo}{XSU}Ke6a{e zx69qr!KK$tE&=b@G47ArGWo4$T+)`XKQG>WGtjtcXFrp0W&4rL8K;H&p=I=T#kLPV z8@`n|wXYeva8vC24$6Hf|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@P}rKOvNp^Js1iJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYT~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18UelH z;^ySy=wz-0)tf?2nCSx@qYp|PNQng|1WbV-COqi_Iq=Mrng`4=MZm1_>V54I1_s6- zo-U3d6}PU0I(joXip-lCcAEE6bGoDLk$JD>Id02y?iFK^wJLj=H{Di3LeS~K!pW6i zMJhfB$$k@RnIPJvJ?qJCfw`a~Z|Gd}yesz9Z(K*hgQ-qx~`oeF{ zc%d2ToSf3@d+_|Kmp_Eh|5vw2Td>K&)7Gf7TjJvd#;=FP)fZ1{)a1Iwo9yuM;|)f) zzikrAGkA?0Ig=ZHGAJjAq^yoxKi_P&@9K*gcMjF_qy$T(ZkW@`RL}@a@9RaokH(nIz8fm?)cJa; z^O1%>Y;%}C#2L-BVOE^!leWxb`Q_sZn?Dv<>?vcN-Oe~)mq|Z9=k`8{Ubl-OTBRo> zZXf(vw!4<~u6o74clRF8%=0^-dQMrX;P%z5uN(*b4_rpbm-lAQDnIo2q>@+1_1DTp(>p_oyH0p+?~L)-P%c%my(6o*`u&%p zpQm>n__RE(zjd|2ig34+F}vr?uHLt4`(^H!kHPESY>W`Q@xChY^#T{R=iGYRp8AQD i*tZ=0$f5C5Fo9w9@4FAa)?I4?m93txelF{r5}E*b_aP(z literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge-land/key_hint_underline_holo.9.png b/java/res/drawable-xlarge-land/key_hint_underline_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa93ee7f8b1ba3b6c3c89c3e0b4b1bbe9d46ed4 GIT binary patch literal 1163 zcmbVM+iTQV7*8wcTI;GHY}J=Tx*}bi$w}stnb5JOlV%-o#$h_e(Y`cI&U8YXoS2+C z)2awQDAJ{@sK~zP%Ib=2aeYycTD*dae}KAP9@+|`f_+lZ2R&(Lx(cNa26E2%PQKso zyXR;&^Xtln^$iTetW0fFa&-TRz8ij6O4n1b);^`%I?_=fow!KKnu{3Oz`Y2hEUgda zkY)_+d4O6OW=YY^7f2z!UDB}?)O?*_#d0W`VOrZNj;8k`0(w!OX(!ls<2P7f8VPo1 zBn{I}5|zwt!!GI^&gAvsem!omZCgNVMWO^2A{wYz1GXns66`FmM9=;;$AVcE(w|`G zoGPTVAc=vhUX((D1RFFNUEgz-Wx;V@W=&gd%Dz7EZ#b z++O2Y2pf^rm=NZ9B_{i;DtGXrB1GdMD1^gtbsn3tJ)+q4VHQls**)PvrvY(R@l~_bu4o7P$NAQ$!u;?cn@)^NN8@kf;~6?u<0(bXSN?n3 zCI5H_G>(|7_O1SWu5-s zGxq+Kb#KRs&zr72ziB@F`ONh3{e`xJ(LW|G+=>4C;OkQ5eZH06FLc?RJ`T9xrTF=Q(_Q*e6Tk&Pf`8OBNHBFsgTN=IJ-2H6y%Gv#1f5y6a zd*bEPqtl;u?|z+FK7mJCmTf!`5mpTxJHjksT6XGi^`q%t|M!sU$S9ZEdk%d8V0?nw literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_holo.9.png index c23ff187830976462d56a01b509514cc9ea29dab..f7cfdbd84e91b8998846a0b25adbfe2f6e06af0a 100644 GIT binary patch delta 438 zcmZ3_wSsFy6qACfqot#(i;1C&g`!l28Uf95adUEUbTXf8#$3noRQS^(1_s86$$OZ!>nG?6vnJIk%>MfP{CrCX zD~S{0%MW~*eqce|>2v4oSUvu;eX?izm^~vkA-?wax3wupyF_1lPt!@P`1{NBrdelK zm(h_UM+{tCT+Tds^ypRNPrjp@&d;}>|K-ysp!G9P`Yrl4?OL+WH*0W8pRQNn0*kD)c3(q+z-4lY%cUAiQ&{-_PBX|1WzrWt0 zr!SmMW^$FeThkVEjCXy4%(j(+`ODOnuTws{sl2A9#%aD?Et9zA6ov(s37;p(oa+$k zIdkUB>gJ}V1FafMTMbUgEU0|F;p&wKzusJ5AHU}N`}_Kg%ar05?9kXbjq&q4=j;Wp zvqeQkt8d)6;qdjQxv&v@oCG7 RZe0c-@O1TaS?83{1OW7}yr=*G delta 445 zcmZ3%wVrE36qACBvAKzW^7_zdt{X z**(~qcRmu4_$MTBCHv;ho68wq-VgX3e^}=+yWsu(_2=U^Cb|Bar0OjZx4+JJoA07U ziyj#o8b%5V3Z99HiLnJKZ4#7enQvcj_wwme)h`bZvv(c#b#Q1%yuB^=eMM#E*+j>a zO=}(i%_`__&{MiyzbOCyKEsAHj5FKkG+oqn_J5=j-7;s_#k0wW(j}KBe2Dn={eAqZ zsJ1*gVU0&Go*6$e%Bx^~yur7(!r0WZR917^-p7w03;+7^Qh3LSg)9tb8E3aYDR7&T zkdl@bCo3YtqUWNi+v50);cRsK+GT84&HwDL`pC`mFYc}w>4L3$7?^k%MA}dN Um^({yCIb+7y85}Sb4q9e0Kc`lB>(^b diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_normal_off_holo.9.png index e29de9a7f48892c2b74d58920274d79c2c815fd1..fea6fc9463b40e55b9297f389f721876ef92b577 100644 GIT binary patch delta 111 zcmaFM^_FWx6qACfqou2}i=%;yg`W^7_xL=;G$+YH03aWM*k>U}R!q>E<-Kib)2h$ONaN mZA^vy=8nd$MusjHE^baPj!x#2&6w+0V#8gZZr;Isf)N1nKpgY{ delta 111 zcmZqRZs6V!#iZb3Y;Iy|XldYLZ0ura=;G!CWVo6dnHxB}8Jk#|yG^cQl7T9+aKou+ m8&e^_o12S;rK6*XqlJ;BtAXicGv+!L-t(5zHt%3Q!3Y4~1{{L` diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_holo.9.png index 45ca3a7fc4f72093e86b61a571a4d50ab9d7914b..733944c5af6e64c48d5f489da03ddd7924eade58 100644 GIT binary patch delta 111 zcmZ3%ylf?GU6LH?_e%u1OOD19Ekt` delta 111 zcmZ3W^7_!l28X3A+xVSmFI69e6He;@1S^f3g#LYXHw=e<#PhK9s delta 111 zcmaFE^@eLh6qACBvAL6(iIa(ov9XJxp^KXnkl|`-WNzT>W^7_HrCyZTyn}fQBLGhj9s&RW diff --git a/java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-xlarge/btn_keyboard_key_dark_pressed_on_holo.9.png index 315ab17c07f381787750cf106c0e287e837def40..d0afa5b0dca8dec756efbd2a38168ce5a1ab4a1f 100644 GIT binary patch delta 111 zcmey)^_^=&6qACfqoc92p{ucrg`!l28X3A+xVSmFI69e6He;@1NxAx9!R8&z`xyaN+a8(# delta 111 zcmey)^_^=&6qACBvAL6(iIahgv9XJxp^KXnkl|`-WNzT>W^7_!l28X3A+xVSmFI69e6He;@1xi@8&>gFBHg^U0oza3lv delta 111 zcmZ3W^7_!l28X3A+xVSmFI69e6He;@1xwZVW^7_PC|Bie-oaeL2mt?T9Blvq diff --git a/java/res/drawable-xlarge/key_hint_0_holo.9.png b/java/res/drawable-xlarge/key_hint_0_holo.9.png index 33b6b40f381c4aae06bae333ccf3cddee01cf112..63f4f80ac7d43921baac2624fb7a23953ca6ec2a 100644 GIT binary patch delta 111 zcmbQlJ&Aim6qACfqob3Ni=nBDg`!l28X3A+xVSmFI69e6He;@1S=_QJbMp@7TZ{nxmK|&W delta 111 zcmbQlJ&Aim6qACBv4x?Vk)?%;v9XJxp^KXnkl|`-WNzT>W^7_5$qZA^vyZf-6XmX3}ljuu9it_G%)&6w+09-q~^uz3gbEk*za@*V2{ diff --git a/java/res/drawable-xlarge/key_hint_1_holo.9.png b/java/res/drawable-xlarge/key_hint_1_holo.9.png index df47e7b7c9643d106393b1a9dcaf2ab9c6f52b59..b06e993c356fba3e73a58045c48fbb3dfad796ae 100644 GIT binary patch delta 111 zcmbQlHHm9O6qACfqob3Ni=m~9g`!l28X3A+xVSmFI69e6He;@1*W^7_!l28X3A+xVSmFI69e6He;@1X>;%N+q{GMH6s8K0v#s+ delta 111 zcmZ3?y_kDL6qACBv4x?Vk)wf&v9XJxp^KXnkl|`-WNzT>W^7_viW^7_mD lOojYzZY~y1M=jyryo32CBLEPT9ZLWJ diff --git a/java/res/drawable-xlarge/key_hint_4_holo.9.png b/java/res/drawable-xlarge/key_hint_4_holo.9.png index feaa88ae1e2ea921ea77e1153eb5c228f243a681..baafc3ce66c0deb14f46919f3d85e7aedacfc8e5 100644 GIT binary patch delta 111 zcmZqSZsFb##iU^B=;-R^VrJrE;b>xL=;G$+YH03aWM*k>U}R!q>E<-Kib)2h$QY-h mZA^vy=8nd$MusjHE^baPj!x#2&6w+0ZuUNN+`NPN3?l#qRvpU# delta 111 zcmZqSZsFb##iZb3Y+-6_;$rGzZ0ura=;G!CWVo6dnHxB}8Jk#|yG^cQl7T5Q!Kr8) lQz5^bn~Q~|qoawVg^{JJf$3y3<~o*gIbom8JDATf0s!QK8|VN4 diff --git a/java/res/drawable-xlarge/key_hint_5_holo.9.png b/java/res/drawable-xlarge/key_hint_5_holo.9.png index b3635e01e5dbbc4a8ffb4e0647a794fea9c429ca..401278782d592a4ba587a4b6d5343fd1cfabd6b1 100644 GIT binary patch delta 111 zcmbQtJ(+t$6qACfqob>vi!l28X3A+xVSmFI69e6He;@1iCViod-D$F+l&Aa03DnF delta 111 zcmbQtJ(+t$6qACBv4yFziHoI+v9XJxp^KXnkl|`-WNzT>W^7_!l28X3A+xVSmFI69e6He;@1>AqR}V)G8>SBwA%(jFH8 delta 111 zcmZ3)y@-256qACBv4y39k&~l~v9XJxp^KXnkl|`-WNzT>W^7_7_83jwyo31_BLD{z9RdIV diff --git a/java/res/drawable-xlarge/key_hint_7_holo.9.png b/java/res/drawable-xlarge/key_hint_7_holo.9.png index 437301012837c3d722817c55090e0bb2d6df7654..9ef6a8b552ab7c17f578610ee9ea81b8ac1ce7b8 100644 GIT binary patch delta 111 zcmZqVZsgt&#iU^B=w#$-VQB7R;b>xL=;G$+3S=9ZSsEJ{nV49*IZdu&l7T5Q!>MQ+ lQz5^(qp_=zp^Jr!o0E&9llf#b<~kPRxu@1|-obp55di959XtR4 delta 111 zcmZqVZsgt&#iZb3Y+-3&Z-|g`!l28X3A+xVSmFI69e6He;@1QTfAjV)G7WJ|+Mo+8n?D delta 111 zcmX@ceT;iU6qACBv4y39k+YGDv9XJxp^KXnkl|`-WNzT>W^7_fP2OL>c?UBe696RG9Y6p8 diff --git a/java/res/drawable-xlarge/key_hint_9_holo.9.png b/java/res/drawable-xlarge/key_hint_9_holo.9.png index 61d6f5518b2ffb38a84ff5ae67daa367bfb097d0..3dfe806b0647ecb29926ea659f7f2b0c1ced9090 100644 GIT binary patch delta 111 zcmZ3?y_kDL6qACfqm!wri>aB5g`!l28X3A+xVSmFI69e6He;@1iO;nDws{BhYeoPDyd72m delta 111 zcmZ3?y_kDL6qACBv4yjVrJ=ctv9XJxp^KXnkl|`-WNzT>W^7_t lwlNj*n>!l28UdBKxH-8vI+;&4W3FR)#8WnP^A6@FCIBjn9ZmoM delta 111 zcmdnRvx{d#6qACBv8AQCp|i1zv9XJxp^KXnkl|`-WNzT>W^7_YOfa-of0&1OOXf9RdIV diff --git a/java/res/drawable-xlarge/key_hint_colon_holo.9.png b/java/res/drawable-xlarge/key_hint_colon_holo.9.png index 7c769bd9794e7675c214947c5da7bd692760d32a..54c42371031c0cc7e0201954b269a2e5eeffbe31 100644 GIT binary patch delta 111 zcmX@id6;uU6qACfqm!kRo3o3Hg`!l28X3A+xVSmFI69e6He;@1asL)MZSxLhZbkq-@f||| delta 111 zcmX@id6;uU6qACBv4xwFnUkZ7v9XJxp^KXnkl|`-WNzT>W^7_BF4l%`-oebx2mmZ29Ekt` diff --git a/java/res/drawable-xlarge/key_hint_comma_holo.9.png b/java/res/drawable-xlarge/key_hint_comma_holo.9.png index a9689adf5f024d6691d2558d6aecdbe7b17539f7..2ebf24253361f01c71b6f0d23765aebfab4a1fcf 100644 GIT binary patch delta 350 zcmZ3%xteoB6qACfqqC)(xv8;>g`!l28X3A+xVSmFI69e6He;@-7uiYQi7*Q4@^BFi+8U%IIl&>lSjJ39P(g{2;nS{VnllB< z3|OtBPCMsX?VI$ozG*WPe-z(`_+S6Ht&aKxDr<^w;f!$z%xh;6qACBv89uXsjGpDv9XJxp^KXnkl|`-WNzT>W^7_4S=S7Ir>)%5NQah@In9c)I$ztaD0e0svo|iNOE> diff --git a/java/res/drawable-xlarge/key_hint_dash_holo.9.png b/java/res/drawable-xlarge/key_hint_dash_holo.9.png index 2402994f0f02426d187a5a78d42e82b5127099ee..f44668fbab26b16bd78544e38073966f844c2a1d 100644 GIT binary patch delta 110 zcmZ3^xtw!D6qACfqqD2Ag}Jkfg`!l28X3A+xVSmFI69e6He;@1QCW2-eDV(F_W<@m9ccgn delta 110 zcmZ3^xtw!D6qACBv89`ti=(BBv9XJxp^KXnkl|`-WNzT>W^7_v4 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=b96N{ zcQG=vG&V3YF|l-m>-EelE=kNwPKDW<3A7ie*Vx&_)C8|yE9aur#FG4?ko^1{SPBTp z$S=t+&d4uNa1J(A@J&q4%meX3(F5_VOKMSOS!#+~QGTuhIDD-#vDoisiRy1hb4O!W zBSRMp7dIytM<;V7sNNKE!b~6N7=2LUKuRnyAz%swG2uxc$bn~`)I4C0DFSAV*sK$b z3=E7nJzX3_DsEi~b@V#yAab_HaHSyERaY)9+a`{6TQ0P6w65EAn)eYWi~fUq!X?+a zr{wJtS+cN1xg;`UquwsfMFC8nXMfcH)Xbc7BxKct1Fw0EXMX>`r}FdZ76GngAC0a< z1$)jOTbX`J-(=mNq~MR~w~PLGKKnmeMs|go&IS>2&RyygUpl4!VUe?rbr49LaOTMr z!=&~N-nBD6vL84u*Z(*6n@u8L^Q*OCr{8`5z5Z*}-xb$i+m>3*o$cYU?PcpGj-6=| z$5y`oJvnJ(M$tL%%P&hDvU~VuNhPeEcVN56nyt5UPn(==%Q;+Qw|{+z)^>w00smDp z1Gb4)y5!4lV86kx$+r07iiMd`a!s*wot^6%X1C5!-_de4Yb%q-#QA5_^mna$-mFm3 zy~AaK^wDLr^h@=ppH`hy(LU|;(>~ktvvZOTo1XO)D`|XZac=RdRqC5~4?o<7pyG5oA>?Zwzu9J7H62vzHU(8QSMll@-R;FLrKi1ErzpQ z7Y6Joi2c4WYVEv-hbnB|wexrEJE_L4bP0 Hl+XkK2oMvQ literal 0 HcmV?d00001 diff --git a/java/res/drawable-xlarge/key_hint_equal_holo.9.png b/java/res/drawable-xlarge/key_hint_equal_holo.9.png index 89e5084185c30fa498fa8028f545fa7e392d3fc8..dee9a03ff6a4b0a556a6a5599be7979849bcc997 100644 GIT binary patch delta 111 zcmeC->fzcD#iU^B=xplbxL=;G$+YH03aWM*k>U}R!q>E<-Kib)2h$P}ld mZA^vy=8nd$MusjHE^baPj!x#2&6w+0qC5^>+Ps4~gb@G(@f`yI delta 111 zcmeC->fzcD#iZb3Y-wq3=xpv{Z0ura=;G!CWVo6dnHxB}8Jk#|yG^cQl7T5Q!>MQ+ lQz5^bn~Q~|qoawVg^{JJf$3y3<~o*FR$r%W-oYHg2mt!t9Y+8F diff --git a/java/res/drawable-xlarge/key_hint_exclamation_holo.9.png b/java/res/drawable-xlarge/key_hint_exclamation_holo.9.png index f349538182a67daf562749767b2705a3a6538b91..2c7271b0d4cb899cb59c966b95417994d5fe4732 100644 GIT binary patch delta 111 zcmeyz`Hyo$6qACfqm!$FqpOjNg`t lwlNj*n>!l28UdBKxH-8vI+;&4W3FRazcT8`<{iv#i~wT+9tZ#c delta 111 zcmeyz`Hyo$6qACBv89ovi?N}Lv9XJxp^KXnkl|`-WNzT>W^7_mD lOojYzZY~y!l28X3A+xVSmFI69e6He;@1Y5qTR#^xQ&xr_i7_8p}F delta 111 zcmZ3=wUlc^6qACBv89=Tk(-%|v9XJxp^KXnkl|`-WNzT>W^7_Y#iK(HBg`!l28Uf95adUEUbTXf8#$3m8cz+k~<{ivAi~t0J9O(c6 delta 111 zcmZ3&wS;R!6qACBv7?crxv7DRv9XJxp^KXnkl|`-WNzT>W^7_Y#iHVDgg`!l28X3A+xVSmFI69e6He;@1NwKi<*}Q|fm=ORCGaM@b delta 111 zcmZ3@wVG=~6qACBv7?crxrwujv9XJxp^KXnkl|`-WNzT>W^7_xL=;G$+YH03aWM*k>U}R!q>E<-Kib)2h$PA~V lZA^vy=8nd$MusjHE^baPj!x#2&6w+0%H>pIChuUr0sz$a92@`u delta 110 zcmeC-?BU!H#iZb3Z0Y1;>T2R*Z0ura=;G!CWVo6dnHxB}8Jk#|yG^cQl7T5Q#;Ir< kQz5^bn~Q~|qoawVg^{JJf$3y3<~o+;iQB3t?_j!l28X3A+xVSmFI69e6He;@1DePQoxp@b33nKtA2pvWM delta 111 zcmdnPwTEj%6qACBv4xwFnUk4|v9XJxp^KXnkl|`-WNzT>W^7_!l28X3A+xVSmFI69e6He;@1`PH+XXY&r`9gF})6dm;d delta 111 zcmeys^?_?c6qACBv89=Tk*lkVv9XJxp^KXnkl|`-WNzT>W^7_FH2Xeo-od!l28X3A+xVSmFI69e6He;@1F>kxBw|NJ%AtL}%Jsm0l delta 111 zcmaFK`I2)(6qACBv89ov3lJF_yBHd}xH$nCuBJxj2F`BACYI)IldG6yV2UhoD%!?W k$nWOnVqxj%XyRyLWa(;PI@yf5j)n8@x!Id{FdH%g07h6Hng9R* diff --git a/java/res/drawable-xlarge/key_hint_semicolon_holo.9.png b/java/res/drawable-xlarge/key_hint_semicolon_holo.9.png index e8d6b022390bc4cb9b0e65e1e4eec094d72ef4ca..d4e3f69044a7ebe54603659b212c47510b348add 100644 GIT binary patch delta 111 zcmaFB`G9jn6qACfqm!kRn~R}~g`!l28Uf95adUEUbTXf8#$3lzQ)no-c?YuwBLGFR9C-i$ delta 111 zcmaFB`G9jn6qACBv4xwFnUkxFv9XJxp^KXnkl|`-WNzT>W^7_ zwlNj*n>!l28X3A+xVSmFI69e6He;@KSz za?#exIlSY_)=eDRA6{_XUC>|G$vyG1kV=Nof}l`uK8`7et>oE-1QnDR8Fp2k6tGbW z;b0VX-sPWZwJ+#rev>upsUvD^UP|xybF(s7D*PTc_UC24W&FgP%Dde9NQI~6ob#gI z^-Hg~X8)CFdw3!{V$nij-Pr4Mb-BOqd!HYjUlgRf?UwWHZR*KqrmkGDb&A88H941S z_DRRp73TeyEM8)vsVwpL=f6|TmWSl#s_P3jUyzr+e%p6qACBv89uXsf)9Vv9XJxp^KXnkl|`-WNzT>W^7_aLvuC#p7M5oD3zgMbqvmA=`0n#G;mYQ9Gw%DOJ{d2rKLsHP`8+I|85*Nh{N)$I!P zG+)dytmi#kPtPYvmoHv`u^6-YM>#sz47jc)I$ztaD;YXaWE`n~*I4 diff --git a/java/res/drawable-xlarge/key_hint_slash_holo.9.png b/java/res/drawable-xlarge/key_hint_slash_holo.9.png index 676d5669820c9532e1718f931a06ad88e8d6a0d7..f00024c850a913ea5835aebf711496d40ed8ec2a 100644 GIT binary patch delta 111 zcmZ3=wUlc^6qACfqqD2Ag}I4~g`!l28X3A+xVSmFI69e6He;@1;n+T5%jO--xr_h^=^W|+ delta 111 zcmZ3=wUlc^6qACBv89`ti=&~7v9XJxp^KXnkl|`-WNzT>W^7_mD lOojYzZY~y mwlNj*n>!l28X3A+xVSmFI69e6He;@1aXP`^y?F<786yA&B^*Nl delta 111 zcmZ3-wT^2;6qACBv89=Tk(-f=v9XJxp^KXnkl|`-WNzT>W^7_GHg`!l28X3A+xVSmFI69e6He;@1`S`0eeDeW^7_Vn~Y30?_lm=1OOtf9B%*s diff --git a/java/res/drawable-xlarge/key_hint_underline_holo.9.png b/java/res/drawable-xlarge/key_hint_underline_holo.9.png index 38abfcb0152d863a8e0de3938e2e771aae992457..680d9a6f53d088422b68ba6d58c5b66ba93bce38 100644 GIT binary patch delta 110 zcmZqUY~$Pz#iU^B=xL=;G$+YH03aWM*k>U}R!q>E<-Kib)2h$Q-Al lZA^vy=8nd$MusjHE^baPj!x#2&6w+0x~CtUH+cv1IRMt@9dG~u delta 110 zcmZqUY~$Pz#iZb3Z0Tm^;%Mq(Z0ura=;G!CWVo6dnHxB}8Jk#|yG^cQl7T5Q!Kr8) kQz5^bn~Q~|qoawVg^{JJf$3y3<~kN(eR;0QJDAS_0NJG*ga7~l diff --git a/java/res/xml-xlarge/kbd_qwerty_row4_common.xml b/java/res/xml-xlarge/kbd_qwerty_row4_common.xml index 63e5a2400..33a7472e2 100644 --- a/java/res/xml-xlarge/kbd_qwerty_row4_common.xml +++ b/java/res/xml-xlarge/kbd_qwerty_row4_common.xml @@ -50,7 +50,7 @@ diff --git a/java/res/xml-xlarge/kbd_qwerty_row4_im.xml b/java/res/xml-xlarge/kbd_qwerty_row4_im.xml index 57af2331c..0efa9e520 100644 --- a/java/res/xml-xlarge/kbd_qwerty_row4_im.xml +++ b/java/res/xml-xlarge/kbd_qwerty_row4_im.xml @@ -44,7 +44,7 @@ diff --git a/java/res/xml-xlarge/kbd_qwerty_row4_url.xml b/java/res/xml-xlarge/kbd_qwerty_row4_url.xml index dd57b88ca..48924bb4a 100644 --- a/java/res/xml-xlarge/kbd_qwerty_row4_url.xml +++ b/java/res/xml-xlarge/kbd_qwerty_row4_url.xml @@ -42,7 +42,7 @@ From 8252de1a60cffd859ac1d44cd6c061f78e59a078 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 27 Oct 2010 14:10:36 +0900 Subject: [PATCH 097/287] Remove auto capitalization by Shift+puncs bug: 3133312 Change-Id: I12a05d9028ab2fad07e1819407d63cf8ffd4d30c --- java/src/com/android/inputmethod/latin/LatinIME.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 6d8803148..a0d797c42 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -2022,13 +2022,6 @@ public class LatinIME extends InputMethodService if (inputView == null) return; LatinKeyboard latinKeyboard = inputView.getLatinKeyboard(); if (latinKeyboard == null) return; - if (latinKeyboard.isShiftLocked()) { - suggestion = suggestion.toString().toUpperCase(); - } else if (preferCapitalization() - || (mKeyboardSwitcher.isAlphabetMode() && latinKeyboard.isShifted())) { - suggestion = suggestion.toString().toUpperCase().charAt(0) - + suggestion.subSequence(1, suggestion.length()).toString(); - } InputConnection ic = getCurrentInputConnection(); if (ic != null) { rememberReplacedWord(suggestion); From fd0bd57deb53c4cce32810a61133fa44b45dbb7b Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 27 Oct 2010 18:05:27 +0900 Subject: [PATCH 098/287] Change suggestion update delay from 100ms to 180ms to avoid flashy suggestion strip with quick multi-finger typing. bug: 3122641 Change-Id: I385f9eb2e392487d7b4c252553d1f8d7c21da2e4 --- java/src/com/android/inputmethod/latin/LatinIME.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index a0d797c42..3663442d4 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -137,6 +137,9 @@ public class LatinIME extends InputMethodService private static final int MSG_VOICE_RESULTS = 3; private static final int MSG_UPDATE_OLD_SUGGESTIONS = 4; + private static final int DELAY_UPDATE_SUGGESTIONS = 180; + private static final int DELAY_UPDATE_OLD_SUGGESTIONS = 300; + // How many continuous deletes at which to start deleting at a higher speed. private static final int DELETE_ACCELERATE_AT = 20; // Key events coming any faster than this are long-presses. @@ -1581,12 +1584,14 @@ public class LatinIME extends InputMethodService private void postUpdateSuggestions() { mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), 100); + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), + DELAY_UPDATE_SUGGESTIONS); } private void postUpdateOldSuggestions() { mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), 300); + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), + DELAY_UPDATE_OLD_SUGGESTIONS); } private boolean isPredictionOn() { From 566c45eddfaff94f82008fa767d262ce57885a7d Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Wed, 27 Oct 2010 14:37:12 -0700 Subject: [PATCH 099/287] Import revised translations. Change-Id: If1dd926a84f861cdf8bbd24bad264a8a6facbde3 --- java/res/values-cs/config.xml | 28 +++++++++++++ java/res/values-cs/strings.xml | 61 ++++++++++++++--------------- java/res/values-da/config.xml | 28 +++++++++++++ java/res/values-da/strings.xml | 61 ++++++++++++++--------------- java/res/values-de/config.xml | 28 +++++++++++++ java/res/values-de/strings.xml | 63 +++++++++++++++--------------- java/res/values-el/config.xml | 28 +++++++++++++ java/res/values-el/strings.xml | 61 ++++++++++++++--------------- java/res/values-es-rUS/config.xml | 28 +++++++++++++ java/res/values-es-rUS/strings.xml | 58 +++++++++++++-------------- java/res/values-es/config.xml | 28 +++++++++++++ java/res/values-es/strings.xml | 63 +++++++++++++++--------------- java/res/values-fr/config.xml | 28 +++++++++++++ java/res/values-fr/strings.xml | 61 ++++++++++++++--------------- java/res/values-it/config.xml | 28 +++++++++++++ java/res/values-it/strings.xml | 61 ++++++++++++++--------------- java/res/values-ja/config.xml | 28 +++++++++++++ java/res/values-ja/strings.xml | 61 ++++++++++++++--------------- java/res/values-ko/config.xml | 28 +++++++++++++ java/res/values-ko/strings.xml | 61 ++++++++++++++--------------- java/res/values-nb/config.xml | 28 +++++++++++++ java/res/values-nb/strings.xml | 61 ++++++++++++++--------------- java/res/values-nl/config.xml | 28 +++++++++++++ java/res/values-nl/strings.xml | 61 ++++++++++++++--------------- java/res/values-pl/config.xml | 28 +++++++++++++ java/res/values-pl/strings.xml | 63 +++++++++++++++--------------- java/res/values-pt-rPT/config.xml | 28 +++++++++++++ java/res/values-pt-rPT/strings.xml | 61 ++++++++++++++--------------- java/res/values-pt/config.xml | 28 +++++++++++++ java/res/values-pt/strings.xml | 61 ++++++++++++++--------------- java/res/values-rm/config.xml | 25 ++++++++++++ java/res/values-rm/strings.xml | 45 ++++++++++++++------- java/res/values-ru/config.xml | 28 +++++++++++++ java/res/values-ru/strings.xml | 63 +++++++++++++++--------------- java/res/values-sv/config.xml | 28 +++++++++++++ java/res/values-sv/strings.xml | 61 ++++++++++++++--------------- java/res/values-tr/config.xml | 28 +++++++++++++ java/res/values-tr/strings.xml | 61 ++++++++++++++--------------- java/res/values-zh-rCN/config.xml | 28 +++++++++++++ java/res/values-zh-rCN/strings.xml | 61 ++++++++++++++--------------- java/res/values-zh-rTW/config.xml | 28 +++++++++++++ java/res/values-zh-rTW/strings.xml | 61 ++++++++++++++--------------- 42 files changed, 1217 insertions(+), 638 deletions(-) create mode 100644 java/res/values-cs/config.xml create mode 100644 java/res/values-da/config.xml create mode 100644 java/res/values-de/config.xml create mode 100644 java/res/values-el/config.xml create mode 100644 java/res/values-es-rUS/config.xml create mode 100644 java/res/values-es/config.xml create mode 100644 java/res/values-fr/config.xml create mode 100644 java/res/values-it/config.xml create mode 100644 java/res/values-ja/config.xml create mode 100644 java/res/values-ko/config.xml create mode 100644 java/res/values-nb/config.xml create mode 100644 java/res/values-nl/config.xml create mode 100644 java/res/values-pl/config.xml create mode 100644 java/res/values-pt-rPT/config.xml create mode 100644 java/res/values-pt/config.xml create mode 100644 java/res/values-rm/config.xml create mode 100644 java/res/values-ru/config.xml create mode 100644 java/res/values-sv/config.xml create mode 100644 java/res/values-tr/config.xml create mode 100644 java/res/values-zh-rCN/config.xml create mode 100644 java/res/values-zh-rTW/config.xml diff --git a/java/res/values-cs/config.xml b/java/res/values-cs/config.xml new file mode 100644 index 000000000..e0e3a8e41 --- /dev/null +++ b/java/res/values-cs/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0.22" + "0" + + diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 497e0b8c6..b0f6be5b4 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Klávesnice Android" "Nastavení klávesnice Android" - - + "Možnosti zadávání textu a dat" "Při stisku klávesy vibrovat" "Zvuk při stisku klávesy" - - + "Zobrazit znaky při stisku klávesy" "Opravovat překlepy" "Povolit opravu chyb vstupu" "Chyby vstupu v zobrazení na šířku" @@ -48,19 +46,21 @@ "Opravuje nejčastější chyby při psaní" "Zobrazit návrhy" "Zobrazovat navržená slova během psaní" - "Automatické dokončování" - "Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo." - - - - - - - - + "Zobrazit klávesu Nastavení" + "Automaticky" + "Vždy zobrazovat" + "Vždy skrývat" + "Automatické dokončování" + "Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo." + "Vypnuto" + "Mírné" + "Agresivní" + + + "Návrh Bigram" "Použít předchozí slovo ke zlepšení návrhu" @@ -89,6 +89,13 @@ "123" "ABC" "Alt" + "Další" + + + + + + "Hlasový vstup" "Pro váš jazyk aktuálně není hlasový vstup podporován, ale funguje v angličtině." "Hlasový vstup je experimentální funkce, která využívá síťové rozpoznávání řeči společnosti Google." @@ -131,24 +138,16 @@ ".org" ".net" ".eu" - - + "Výběr metody zadávání dat" "Vstupní jazyky" "Jazyk můžete změnit posunutím prstu po mezerníku." - "← Uložte slovo opětovným klepnutím" + "← Dalším dotykem slovo uložíte" "K dispozici je slovník" - - - - - - - - - - - - - - + "Aktivovat zasílání statistik užívání a zpráv o selhání" + "Automatickým zasíláním statistik o užívání editoru zadávání dat a zpráv o jeho selhání do Googlu můžete přispět k vylepšení tohoto nástroje." + "Dotykem aktivujete opravy" + "Dotknete-li se slov, která jste napsali, můžete je opravit." + "Motiv klávesnice" + "klávesnice" + "hlas" diff --git a/java/res/values-da/config.xml b/java/res/values-da/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-da/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 191f432c2..553a96c15 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-tastatur" "Indstillinger for Android-tastatur" - - + "Indstillinger for input" "Vibration ved tastetryk" "Lyd ved tastetryk" - - + "Popup ved tastetryk" "Ret stavefejl" "Aktiver fejlretning af input" "Inputfejl i landskab" @@ -48,19 +46,21 @@ "Retter almindelige stavefejl" "Vis forslag" "Vis ordforslag under indtastning" - "Udfyld automatisk" - "Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord" - - - - - - - - + "Vis indstillingsnøgle" + "Automatisk" + "Vis altid" + "Skjul altid" + "Udfyld automatisk" + "Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord" + "Fra" + "Beskeden" + "Aggressiv" + + + "Bigram-forslag" "Brug forrige ord for at forbedre forslag" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Mere" + + + + + + "Stemmeinput" "Stemmeinput understøttes i øjeblikket ikke for dit sprog, men fungerer på engelsk." "Stemme-input er en funktion på forsøgsbasis, som bruger Googles netværksstemmegenkendelse." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Vælg inputmetode" "Inputsprog" "Træk fingeren på mellemrumstasten for at skifte sprog" - "← Tast igen for at gemme" + "← Tryk igen for at gemme" "Ordbog er tilgængelig" - - - - - - - - - - - - - - + "Aktiver brugerfeedback" + "Vær med til at forbedre denne inputmetode ved at sende anvendelsesstatistikker og rapporter om nedbrud til Google." + "Tryk for at rette ord igen" + "Du kan rette ordene igen ved at trykke på de ord, du har indtastet" + "Tastaturtema" + "tastatur" + "stemme" diff --git a/java/res/values-de/config.xml b/java/res/values-de/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-de/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 5b8352d26..2b01745d1 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-Tastatur" "Android-Tastatureinstellungen" - - + "Eingabeoptionen" "Vibrieren b. Tastendruck" "Ton bei Tastendruck" - - + "Pop-up bei Tastendruck" "Eingabefehler korrigieren" "Korrektur von Eingabefehlern aktivieren" "Eingabefehler im Querformat" @@ -48,19 +46,21 @@ "Korrigiert gängige Tippfehler" "Vorschläge anzeigen" "Vorgeschlagene Wörter während des Tippens anzeigen" - "Autom. vervollständigen" - "Leertaste und Interpunktion fügen autom. ein markiertes Wort ein" - - - - - - - - + "Einstellungstaste anz." + "Automatisch" + "Immer anzeigen" + "Immer ausblenden" + "Autom. vervollständigen" + "Leertaste und Interpunktion fügen autom. ein markiertes Wort ein" + "Aus" + "Mäßig" + "Aggressiv" + + + "Bigramm-Vorschläge" "Zur Verbesserung des Vorschlags vorheriges Wort verwenden" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Mehr" + + + + + + "Spracheingabe" "Spracheingaben werden derzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch." "Die Spracheingabe ist eine Funktion im Versuchsstadium, die die vernetzte Spracherkennung von Google verwendet." @@ -103,7 +110,7 @@ "Audio-Problem" "Serverfehler" "Keine Sprache zu hören" - "Keine Übereinstimmungen gefunden" + "Keine Treffer gefunden" "Sprach-Suche nicht installiert" "Hinweis:"" Ziehen Sie zum Sprechen den Finger über die Tastatur." "Hinweis:"" Versuchen Sie beim nächsten Mal, Satzzeichen wie \"Punkt\", \"Komma\" oder \"Fragezeichen\" per Sprachbefehl einzugeben." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Eingabemethode auswählen" "Eingabesprachen" "Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln" - "← Zum Speichern erneut tippen" + "← Zum Speichern erneut berühren" "Wörterbuch verfügbar" - - - - - - - - - - - - - - + "Nutzer-Feedback aktivieren" + "Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte an Google senden." + "Wortkorrektur" + "Sie können Wörter korrigieren, indem Sie die eingegebenen Wörter berühren." + "Tastaturdesign" + "Tastatur" + "Sprache" diff --git a/java/res/values-el/config.xml b/java/res/values-el/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-el/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 7d4d7dd61..baf28d968 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Πληκτρολόγιο Android" "Ρυθμίσεις πληκτρολογίου Android" - - + "Επιλογές εισόδου" "Δόνηση κατά το πάτημα πλήκτρων" "Ήχος κατά το πάτημα πλήκτρων" - - + "Εμφάνιση με το πάτημα πλήκτρου" "Διόρθωση σφαλμάτων πληκτρολόγησης" "Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου" "Σφάλματα οριζόντιας εισαγωγής" @@ -48,19 +46,21 @@ "Διορθώνει συνηθισμένα λάθη πληκτρολόγησης" "Εμφάνιση υποδείξεων" "Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση" - "Αυτόματη συμπλήρωση" - "Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη" - - - - - - - - + "Εμφάνιση πλήκτρου ρυθμίσεων" + "Αυτόματο" + "Να εμφανίζεται πάντα" + "Πάντα απόκρυψη" + "Αυτόματη συμπλήρωση" + "Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη" + "Απενεργοποιημένη" + "Μέτρια" + "Υψηλή" + + + "Προτάσεις bigram" "Χρήση προηγούμενης λέξης για τη βελτίωση πρότασης" @@ -89,6 +89,13 @@ "123" "ΑΒΓ" "ALT" + "Περισσότερα" + + + + + + "Φωνητική είσοδος" "Η φωνητική είσοδος δεν υποστηρίζεται αυτή τη στιγμή για τη γλώσσα σας, ωστόσο λειτουργεί στα Αγγλικά." "Οι φωνητικές εντολές είναι μια πειραματική λειτουργία, η οποία χρησιμοποιεί τη δικτυακή αναγνώριση ομιλίας της Google." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Επιλογή μεθόδου εισόδου" "Γλώσσες εισόδου" "Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα" - "← Πατήστε ξανά για αποθήκευση" + "← Αγγίξτε ξανά για αποθήκευση" "Λεξικό διαθέσιμο" - - - - - - - - - - - - - - + "Ενεργοποίηση σχολίων χρηστών" + "Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων στην Google." + "Αγγίξτε για να διορθώσετε ξανά τις λέξεις" + "Μπορείτε να διορθώσετε ξανά τις λέξεις αγγίζοντας τις λέξεις που έχετε πληκτρολογήσει" + "Θέμα πληκτρολογίου" + "πληκτρολόγιο" + "φωνητική" diff --git a/java/res/values-es-rUS/config.xml b/java/res/values-es-rUS/config.xml new file mode 100644 index 000000000..e0e3a8e41 --- /dev/null +++ b/java/res/values-es-rUS/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0.22" + "0" + + diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index e5c937f1a..12ad63c9a 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado de Android" "Configuración de teclado de Android" - - + "Opciones de entrada" "Vibrar al pulsar teclas" "Sonar al pulsar las teclas" - - + "Aviso emergente sobre keypress" "Corregir errores de escritura" "Habilitar corrección de error de entrada" "Errores de entrada apaisada" @@ -48,19 +46,21 @@ "Corrige errores de escritura comunes" "Mostrar sugerencias" "Mostrar palabras sugeridas mientras escribe" - "Completar automát." - "La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada." - - - - - - - - + "Mostrar tecla de configuración" + "Automático" + "Mostrar siempre" + "Ocultar siempre" + "Completar automát." + "La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada." + "Apagado" + "Moderado" + "Intenso" + + + "Sugerencias de Vigoran" "Utiliza la palabra anterior para mejorar la sugerencia" @@ -89,6 +89,10 @@ "123" "ABC" "ALT" + "Más" + "Tabulación" + "Pausar" + "Espera" "Entrada por voz" "La entrada por voz no está admitida en tu idioma, pero sí funciona en inglés." "La entrada por voz es una característica experimental que utiliza la red de reconocimiento de voz de Google." @@ -131,24 +135,16 @@ ".org" ".gov" ".edu" - - + "Seleccionar método de entrada" "Idiomas de entrada" "Deslizarse manualmente por la barra espaciadora para cambiar el idioma" - "← Presionar nuevamente para guardar" + "← Tocar de nuevo para guardar" "Diccionario disponible" - - - - - - - - - - - - - - + "Habilitar los comentarios del usuario" + "Ayuda a mejorar este editor de método de introducción de texto al enviar las estadísticas de uso y los informes de error a Google." + "Tocar para corregir palabras" + "Toca las palabras ingresadas que desees corregir" + "Tema del teclado" + "Teclado" + "Voz" diff --git a/java/res/values-es/config.xml b/java/res/values-es/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-es/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index d5be1351b..327a0a259 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado de Android" "Ajustes del teclado de Android" - - + "Opciones introducción texto" "Vibrar al pulsar tecla" "Sonido al pulsar tecla" - - + "Popup al pulsar" "Corregir errores de escritura" "Habilitar la introducción de corrección de errores" "Errores de introducción de datos en vista horizontal" @@ -48,19 +46,21 @@ "Corrige los errores tipográficos que se cometen con más frecuencia." "Mostrar sugerencias" "Muestra las palabras sugeridas mientras se escribe." - "Autocompletar" - "La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada." - - - - - - - - + "Mostrar tecla de ajustes" + "Automáticamente" + "Mostrar siempre" + "Ocultar siempre" + "Autocompletar" + "La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada." + "Desactivada" + "Parcial" + "Total" + + + "Sugerencias de bigramas" "Usar palabra anterior para mejorar sugerencias" @@ -89,12 +89,19 @@ "123" "ABC" "ALT" + "Más" + + + + + + "Introducción de voz" "Actualmente la introducción de voz no está disponible en tu idioma, pero se puede utilizar en inglés." "La introducción de voz es una función en fase experimental que utiliza la tecnología de reconocimiento de voz en red de Google." "Para desactivar la función de introducción de voz, accede a la configuración del teclado." "Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla." - "Hablar ahora" + "Habla ahora" "En curso" "Se ha producido un error. Inténtalo de nuevo." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Seleccionar método de introducción de texto" "Idiomas" "Deslizar el dedo por la barra espaciadora para cambiar el idioma" - "← Volver a tocar para guardar" + "← Volver a tocar para guardar" "Hay un diccionario disponible." - - - - - - - - - - - - - - + "Habilitar comentarios de usuarios" + "Ayuda a mejorar este editor de método de introducción de texto enviando estadísticas de uso e informes de error a Google." + "Tocar para corregir palabras" + "Tocar palabras introducidas para corregirlas" + "Tema de teclado" + "teclado" + "voz" diff --git a/java/res/values-fr/config.xml b/java/res/values-fr/config.xml new file mode 100644 index 000000000..e0e3a8e41 --- /dev/null +++ b/java/res/values-fr/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0.22" + "0" + + diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index ef5a70884..0416cd89c 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Clavier Android" "Paramètres du clavier Android" - - + "Options de saisie" "Vibrer à chaque touche" "Son à chaque touche" - - + "Agrandir les caractères à chaque touche" "Corriger les fautes de frappe" "Activer la correction des erreurs de saisie" "Erreurs de saisie en mode paysage" @@ -48,19 +46,21 @@ "Corrige les fautes de frappe courantes" "Afficher les suggestions" "Afficher les suggestions de terme lors de la saisie" - "Saisie semi-automatique" - "Insérer auto. le terme surligné avec barre espace/ponctuation" - - - - - - - - + "Afficher la touche des paramètres" + "Automatique" + "Toujours afficher" + "Toujours masquer" + "Saisie semi-automatique" + "Insérer auto. le terme surligné avec barre espace/ponctuation" + "Désactivée" + "Simple" + "Proactive" + + + "Suggestions de type bigramme" "Améliorer la suggestion en fonction du mot précédent" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Plus" + + + + + + "Saisie vocale" "La saisie vocale n\'est pas encore prise en charge pour votre langue, mais elle fonctionne en anglais." "La saisie vocale est une fonctionnalité expérimentale qui fait appel à la reconnaissance vocale en réseau de Google." @@ -131,24 +138,16 @@ ".org" ".gouv" ".edu" - - + "Sélectionner un mode de saisie." "Langues de saisie" "Faites glisser votre doigt sur la barre d\'espacement pour changer la langue." - "← Appuyer de nouveau pour enregistrer" + "← Appuyer de nouveau pour enregistrer" "Dictionnaire disponible" - - - - - - - - - - - - - - + "Autoriser les commentaires des utilisateurs" + "Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google." + "Appuyer pour corriger les suggestions" + "Appuyer sur les mots saisis pour les corriger" + "Thème du clavier" + "clavier" + "voix" diff --git a/java/res/values-it/config.xml b/java/res/values-it/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-it/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 1f213fc05..167ed7d4e 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tastiera Android" "Impostazioni tastiera Android" - - + "Opzioni inserimento" "Vibrazione tasti" "Suono tasti" - - + "Popup alla pressione di un tasto" "Correggi errori di digitazione" "Attiva la correzione degli errori di inserimento" "Errori di inserimento in visualizzazione orizzontale" @@ -48,19 +46,21 @@ "Corregge gli errori di digitazione più comuni" "Mostra suggerimenti" "Visualizza le parole suggerite durante la digitazione" - "Completamento autom." - "Barra spaziatrice e punteggiatura inseriscono la parola evidenziata" - - - - - - - - + "Mostra tasto impostazioni" + "Automatico" + "Mostra sempre" + "Nascondi sempre" + "Completamento autom." + "Barra spaziatrice e punteggiatura inseriscono la parola evidenziata" + "Non attivo" + "Medio" + "Massimo" + + + "Suggerimenti sui bigrammi" "Utilizza parola precedente per migliorare il suggerimento" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Altro" + + + + + + "Comandi vocali" "I comandi vocali non sono attualmente supportati per la tua lingua ma funzionano in inglese." "I comandi vocali sono una funzione sperimentale che utilizza il riconoscimento vocale in rete di Google." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Seleziona metodo di inserimento" "Lingue comandi" "Scorri il dito sulla barra spaziatrice per cambiare la lingua" - "← Tocca di nuovo per salvare" + "← Tocca di nuovo per salvare" "Dizionario disponibile" - - - - - - - - - - - - - - + "Attiva commenti degli utenti" + "Aiuta a migliorare l\'editor del metodo di inserimento inviando automaticamente a Google statistiche sull\'utilizzo e segnalazioni sugli arresti anomali." + "Tocca per correggere di nuovo le parole" + "Puoi correggere di nuovo le parole toccando quelle che hai digitato" + "Tema della tastiera" + "tastiera" + "vocale" diff --git a/java/res/values-ja/config.xml b/java/res/values-ja/config.xml new file mode 100644 index 000000000..e0e3a8e41 --- /dev/null +++ b/java/res/values-ja/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0.22" + "0" + + diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 5a9e053cb..96286d705 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Androidキーボード" "Androidキーボードの設定" - - + "入力オプション" "キー操作バイブ" "キー操作音" - - + "キー押下時に文字をポップアップ表示" "入力ミス補正" "入力間違いを自動修正する" "横表示での入力修正" @@ -48,19 +46,21 @@ "よくある誤字・脱字を修正します" "入力候補を表示" "入力時に入力候補を表示する" - "オートコンプリート" - "反転表示されている変換候補をスペースまたは句読点キーで挿入する" - - - - - - - - + "設定キーを表示" + "自動" + "常に表示" + "常に非表示" + "オートコンプリート" + "反転表示されている変換候補をスペースまたは句読点キーで挿入する" + "OFF" + "中" + "強" + + + "バイグラム入力候補表示" "直前の単語から入力候補を予測します" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Shift" + + + + + + "音声入力" "音声入力は現在英語には対応していますが、日本語には対応していません。" "音声入力はGoogleのネットワーク音声認識技術を利用した試験段階の機能です。" @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "入力方法の選択" "入力言語" "スペースバーで指をスライドさせて言語を変更する" - "←保存するにはもう一度タップ" + "←保存するにはもう一度タップ" "辞書を利用できます" - - - - - - - - - - - - - - + "ユーザーフィードバックを有効にする" + "IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。" + "タップして語句を再修正" + "入力した語句をタップすると語句を再修正できます" + "キーボードテーマ" + "キーボード" + "音声" diff --git a/java/res/values-ko/config.xml b/java/res/values-ko/config.xml new file mode 100644 index 000000000..e0e3a8e41 --- /dev/null +++ b/java/res/values-ko/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0.22" + "0" + + diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index c6b66d00a..6f645c794 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 키보드" "Android 키보드 설정" - - + "입력 옵션" "키를 누를 때 진동 발생" "키를 누를 때 소리 발생" - - + "키를 누를 때 팝업" "입력 오류 수정" "입력 오류 수정 사용" "가로 입력 오류" @@ -48,19 +46,21 @@ "자주 발생하는 오타를 수정합니다." "추천 단어 표시" "글자를 입력하는 동안 추천 단어를 표시" - "자동 완성" - "스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입" - - - - - - - - + "설정 키 표시" + "자동" + "항상 표시" + "항상 숨기기" + "자동 완성" + "스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입" + "사용안함" + "보통" + "적극적" + + + "Bigram 추천" "이전 단어를 사용하여 추천 기능 개선" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "더보기" + + + + + + "음성 입력" "음성 입력은 현재 자국어로 지원되지 않으며 영어로 작동됩니다." "음성 입력은 Google의 네트워크화된 음성 인식을 사용하는 실험적 기능입니다." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "입력 방법 선택" "입력 언어" "손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경" - "← 저장하려면 다시 누르세요." + "← 저장하려면 다시 터치하세요." "사전 사용 가능" - - - - - - - - - - - - - - + "사용자 의견 사용" + "사용 통계 및 충돌 보고서를 Google에 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다." + "터치하여 단어 다시 수정" + "입력한 단어를 터치하면 다시 수정할 수 있습니다." + "키보드 테마" + "키보드" + "음성" diff --git a/java/res/values-nb/config.xml b/java/res/values-nb/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-nb/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 0f33dd26f..b6842b4ed 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Skjermtastatur" "Innstillinger for skjermtastatur" - - + "Inndataalternativer" "Vibrer ved tastetrykk" "Lyd ved tastetrykk" - - + "Hurtigvindu ved tastetrykk" "Rett opp skrivefeil" "Slå på retting av skrivefeil" "Rett opp skrivefeil i breddeformat" @@ -48,19 +46,21 @@ "Retter vanlige stavefeil" "Vis forslag" "Vis foreslåtte ord under skriving" - "Autofullføring" - "Mellomrom og punktum setter automatisk inn valgt ord" - - - - - - - - + "Vis innstillingsnøkkel" + "Automatisk" + "Vis alltid" + "Skjul alltid" + "Autofullføring" + "Mellomrom og punktum setter automatisk inn valgt ord" + "Av" + "Moderat" + "Omfattende" + + + "Bigram-forslag" "Bruk forrige ord til å forbedre forslaget" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Mer" + + + + + + "Stemmedata" "Stemmedata håndteres foreløpig ikke på ditt språk, men fungerer på engelsk." "Talekommandoer er en eksperimentell funksjon som bruker Googles nettverksbaserte talegjenkjenning." @@ -131,24 +138,16 @@ ".net" ".org" ".info" - - + "Velg inndatametode" "Inndataspråk" "Dra fingeren på mellomromstasten for å endre språk" - "← Trykk på nytt for å lagre" + "Trykk på nytt for å lagre" "Ordbok tilgjengelig" - - - - - - - - - - - - - - + "Aktiver brukertilbakemelding" + "Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre." + "Trykk for å endre ord" + "Du kan endre innskrevne ord ved å trykke på dem" + "Tastaturtema" + "tastatur" + "stemme" diff --git a/java/res/values-nl/config.xml b/java/res/values-nl/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-nl/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 59eccd88e..8394d8be2 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android-toetsenbord" "Instellingen voor Android-toetsenbord" - - + "Invoeropties" "Trillen bij druk op toets" "Geluid bij druk op een toets" - - + "Pop-up bij toetsaanslag" "Typefouten corrigeren" "Foutcorrectie tijdens invoer inschakelen" "Invoerfouten in liggende weergave" @@ -48,19 +46,21 @@ "Hiermee worden veelvoorkomende typefouten gecorrigeerd" "Suggesties weergeven" "Voorgestelde woorden weergeven tijdens typen" - "Auto-aanvullen" - "Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie" - - - - - - - - + "Instellingscode weergeven" + "Automatisch" + "Altijd weergeven" + "Altijd verbergen" + "Auto-aanvullen" + "Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie" + "Uit" + "Normaal" + "Agressief" + + + "Digram-suggesties" "Vorig woord gebruiken om suggestie te verbeteren" @@ -89,6 +89,13 @@ "123" "ABC" "Alt" + "Meer" + + + + + + "Spraakinvoer" "Spraakinvoer wordt momenteel niet ondersteund in uw taal, maar is wel beschikbaar in het Engels." "Spraakinvoer is een experimentele functie met de spraakherkenning van het Google-netwerk." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Invoermethode selecteren" "Invoertalen" "Schuif uw vinger over de spatiebalk om de taal te wijzigen" - "← Tik nogmaals om op te slaan" + "← Raak nogmaals aan om op te slaan" "Woordenboek beschikbaar" - - - - - - - - - - - - - - + "Gebruikersfeedback inschakelen." + "Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden." + "Raak aan om woorden opnieuw te corrigeren" + "U kunt woorden opnieuw corrigeren door woorden aan te raken die u heeft getypt" + "Toetsenbordthema" + "toetsenbord" + "spraak" diff --git a/java/res/values-pl/config.xml b/java/res/values-pl/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-pl/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 2335858fd..03fd459ee 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Klawiatura Android" "Ustawienia klawiatury Android" - - + "Opcje wprowadzania" "Wibracja przy naciśnięciu" "Dźwięk przy naciśnięciu" - - + "Wyświetlaj po naciśnięciu klawisza" "Popraw błędy pisowni" "Włącz poprawianie błędów wprowadzania" "Błędy wprowadzania w orientacji poziomej" @@ -48,19 +46,21 @@ "Poprawia częste błędy wpisywania" "Pokaż sugestie" "Wyświetl sugerowane słowa podczas wpisywania" - "Autouzupełnianie" - "Spacja i znaki przestankowe wstawiają wyróżnione słowo" - - - - - - - - + "Pokaż klawisz ustawień" + "Automatycznie" + "Zawsze pokazuj" + "Zawsze ukrywaj" + "Autouzupełnianie" + "Spacja i znaki przestankowe wstawiają wyróżnione słowo" + "Wyłączone" + "Umiarkowane" + "Agresywne" + + + "Sugestie dla bigramów" "Używaj poprzedniego wyrazu, aby polepszyć sugestię" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Więcej" + + + + + + "Wprowadzanie głosowe" "Wprowadzanie głosowe obecnie nie jest obsługiwane w Twoim języku, ale działa w języku angielskim." "Wprowadzanie głosowe to funkcja eksperymentalna wykorzystująca funkcję firmy Google umożliwiającą rozpoznawanie mowy przy użyciu sieci." @@ -103,7 +110,7 @@ "Problem z dźwiękiem" "Błąd serwera" "Nie wykryto mowy" - "Nie znaleziono żadnych wyników" + "Brak wyników" "Wyszukiwanie głosowe nie jest zainstalowane" "Wskazówka:"" przesuń palcem po klawiaturze, aby mówić." "Wskazówka:"" następnym razem spróbuj wypowiadać nazwy znaków interpunkcyjnych: „kropka”, „przecinek” lub „pytajnik”." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Wybierz metodę wprowadzania" "Języki wprowadzania" "Przesuń palcem po spacji, aby zmienić język" - "← Dotknij ponownie, aby zapisać" + "← Dotknij ponownie, aby zapisać" "Słownik dostępny" - - - - - - - - - - - - - - + "Włącz przesyłanie opinii użytkownika" + "Pomóż ulepszyć edytor tej metody wprowadzania, automatycznie wysyłając do Google statystyki użycia i raporty o awariach." + "Dotknij, aby ponownie poprawić słowa" + "Możesz ponownie poprawiać wprowadzone słowa, dotykając ich" + "Motyw klawiatury" + "klawiatura" + "głosowe" diff --git a/java/res/values-pt-rPT/config.xml b/java/res/values-pt-rPT/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-pt-rPT/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 473e9ada3..5d361ae1a 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado do Android" "Definições de teclado do Android" - - + "Opções de introdução" "Vibrar ao primir as teclas" "Som ao premir as teclas" - - + "Mostrar popup ao premir tecla" "Corrigir erros de escrita" "Activar a correcção de erros de entrada" "Erros de entrada na horizontal" @@ -48,19 +46,21 @@ "Corrige os erros de escrita comuns" "Mostrar sugestões" "Apresentar sugestões de palavras ao escrever" - "Conclusão automática" - "A barra de espaços e a pontuação inserem automaticamente uma palavra realçada" - - - - - - - - + "Mostrar tecla das definições" + "Automático" + "Mostrar sempre" + "Ocultar sempre" + "Conclusão automática" + "A barra de espaços e a pontuação inserem automaticamente uma palavra realçada" + "Desactivar" + "Moderada" + "Agressiva" + + + "Sugestões Bigram" "Utilizar a palavra anterior para melhorar a sugestão" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Mais" + + + + + + "Entrada de voz" "Actualmente, a entrada de voz não é suportada para o seu idioma, mas funciona em inglês." "A entrada de voz é uma funcionalidade experimental que utiliza o reconhecimento de voz em rede da Google." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Seleccionar método de entrada" "Idiomas de entrada" "Deslize o dedo pela barra de espaço para alterar o idioma" - "← Toque novamente para guardar" + "← Toque novamente para guardar" "Dicionário disponível" - - - - - - - - - - - - - - + "Activar comentários do utilizador" + "Envie automaticamente estatísticas de utilização e relatórios de falhas para a Google e ajude-nos a melhor este editor de método de introdução." + "Tocar para voltar a corrigir palavras" + "Pode voltar a corrigir palavras tocando naquelas que escreveu" + "Tema do teclado" + "teclado" + "voz" diff --git a/java/res/values-pt/config.xml b/java/res/values-pt/config.xml new file mode 100644 index 000000000..e0e3a8e41 --- /dev/null +++ b/java/res/values-pt/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0.22" + "0" + + diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 4b998893c..2c78c86d8 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado Android" "Configurações de teclado Android" - - + "Opções de entrada" "Vibrar ao tocar a tecla" "Som ao tocar a tecla" - - + "Exibir pop-up ao tocar a tecla" "Corrigir erros de digitação" "Ativar a correção de erro de entrada" "Erros de entrada de paisagem" @@ -48,19 +46,21 @@ "Corrige erros comuns de digitação" "Mostrar sugestões" "Exibir sugestões de palavras durante a digitação" - "Conclusão automática" - "Barra de espaço e pontuação inserem a palavra destacada" - - - - - - - - + "Mostrar tecla de configurações" + "Automático" + "Mostrar sempre" + "Sempre ocultar" + "Conclusão automática" + "Barra de espaço e pontuação inserem a palavra destacada" + "Desativado" + "Moderado" + "Agressivo" + + + "Sugestões de bigrama" "Usar palavra anterior para melhorar a sugestão" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Mais" + + + + + + "Entrada de voz" "A entrada de voz não é suportada no momento para o seu idioma, mas funciona em inglês." "A entrada de voz é um recurso experimental que usa o reconhecimento de fala de rede do Google." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Selecionar método de entrada" "Idiomas de entrada" "Deslize o dedo na barra de espaços para alterar o idioma" - "← Toque novamente para salvar" + "← Toque novamente para salvar" "Dicionário disponível" - - - - - - - - - - - - - - + "Ativar comentário do usuário" + "Ajude a melhorar este editor de método de entrada enviando automaticamente ao Google estatísticas de uso e relatórios de falhas." + "Toque para corrigir novamente as palavras" + "Você pode fazer novamente a correção tocando nas palavras digitadas" + "Tema do teclado" + "teclado" + "voz" diff --git a/java/res/values-rm/config.xml b/java/res/values-rm/config.xml new file mode 100644 index 000000000..00d5e4cd4 --- /dev/null +++ b/java/res/values-rm/config.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index da7b3a111..e667ca6f4 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -48,8 +48,6 @@ "Curregia sbagls da tippar currents" "Mussar las propostas" "Mussar pleds proponids durant l\'endataziun" - "Cumplettaziun automatica" - "Inserir auto. il pled marcà cun la tasta da vid/interpuncziun" @@ -61,6 +59,17 @@ + "Cumplettaziun automatica" + "Inserir auto. il pled marcà cun la tasta da vid/interpuncziun" + + + + + + + + + @@ -71,17 +80,17 @@ "Avanzà" "%s : Memorisà" - "Tegnair smatgà per mussar ils accents (à, é, etc.)" + "\"Tegnair smatgà per mussar ils accents (à, é, etc.)\"" "Smatgar ↶ per serrar la tastatura" "Acceder a cifras e simbols" "Smatgar ditg sin il pled dal tut a sanestra per l\'agiuntar al dicziunari" "Tutgar quest commentari per cuntinuar »" - "Tutgar qua, per serrar quest commentari e cumenzar a tippar!" + "\"Tutgar qua, per serrar quest commentari e cumenzar a tippar!\"" "La tastatura vegn adina averta sche Vus tutgais in champ da text." - "Tegnai smatgà ina tasta per mussar ils segns spezials"\n"(ø, ö, ô, ó etc.)." + "\"""Tegnai smatgà ina tasta per mussar ils segns spezials"\n"(ø, ö, ô, ó etc.).""\"" "Midai a numers e simbols cun tutgar quest buttun." "Turnai a letras cun smatgar danovamain quest buttun." - "Tegnai smatgà quest buttun per midar ils parameters da tastatura, sco p. ex. la cumplettaziun automatica." + "\"""Tegnai smatgà quest buttun per midar ils parameters da tastatura, sco p. ex. la cumplettaziun automatica.""\"" "Empruvai!" "Dai" "Vinavant" @@ -91,11 +100,19 @@ "123" "ABC" "ALT" + + + + + + + + "Cumonds vocals" - "Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais." + "\"Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais.\"" "Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google." - "Per deactivar ils cumonds vocals, avri ils parameters da tastatura." - "Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur." + "\"Per deactivar ils cumonds vocals, avri ils parameters da tastatura.\"" + "\"Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur.\"" "Ussa discurrer" "Operaziun en progress" @@ -108,7 +125,7 @@ "Betg chattà correspundenzas" "Betg installà la tschertga vocala" "Commentari:"" Stritgai cun il det sur la tastatura per discurrer." - "Commentari:"" Empruvai la proxima giada d\'agiuntar segns d\'interpuncziun sco \"punct\", \"comma\" u \"segn da dumonda\" cun cumonds vocals." + "\"""Commentari:"" Empruvai la proxima giada d\'agiuntar segns d\'interpuncziun sco \"\"punct\"\", \"\"comma\"\" u \"\"segn da dumonda\"\" cun cumonds vocals.\"" "Interrumper" "OK" "Cumonds vocals" @@ -125,7 +142,7 @@ "Trametter automaticamain suenter il cumond vocal" "Smatgai sin la tasta enter sche Vus exequis ina tschertga u siglis al proxim champ." "Avrir la tastatura"\n\n"Tutgai inqual champ da text." - "Serrar la tastatura"\n\n"Smatgai il buttun \"Enavos\"." + "\"""Serrar la tastatura"\n\n"Smatgai il buttun \"\"Enavos\"\".\"" "Tutgar e tegnair smatgà in buttun per acceder a las opziuns"\n\n"Accedi a segns d\'interpuncziun ed accents." "Parameters da tastatura"\n\n"Tutgai e tegnai smatgà il buttun ""?123""." ".com" @@ -137,15 +154,15 @@ "Linguas da cumonds vocals" "Stritgar cun il det sur la tasta da vid per midar la lingua" - "← Tippar danovamain per memorisar" + "← Tippar danovamain per memorisar" "Dicziunari disponibel" - + - + diff --git a/java/res/values-ru/config.xml b/java/res/values-ru/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-ru/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 98b36ed4d..fd8a17ed5 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Клавиатура Android" "Настройки клавиатуры Android" - - + "Параметры ввода" "Виброотклик клавиш" "Звук клавиш" - - + "Показывать при нажатии" "Исправлять опечатки" "Включить исправление ошибок при вводе" "Ошибки при вводе в горизонтальной ориентации" @@ -48,20 +46,22 @@ "Исправлять распространенные опечатки" "Предлагать варианты" "Предлагать варианты слов во время ввода" - "Автозавершение" - "При нажатии пробела вставлять предложенное слово" - - - - - - - - + "Показывать кнопку настроек" + "Автоматически" + "Всегда показывать" + "Всегда скрывать" - "Биграммные подсказки " + "Автозавершение" + "При нажатии пробела вставлять предложенное слово" + "Выключено" + "Умеренное" + "Активное" + + + + "Биграммные подсказки" "Используйте предыдущее слово, чтобы исправить подсказку" "Нет" @@ -89,6 +89,13 @@ "123" "АБВ" "ALT" + "Еще" + + + + + + "Голосовой ввод" "В настоящее время функция голосового ввода не поддерживает ваш язык, но вы можете пользоваться ей на английском." "Голосовой ввод – экспериментальная функция на основе технологии сетевого распознавания речи от Google." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Выбрать способ ввода" "Языки ввода" "Для изменения языка проведите пальцем по пробелу" - "← Нажмите повторно, чтобы сохранить" + "← Нажмите еще раз, чтобы сохранить" "Доступен словарь" - - - - - - - - - - - - - - + "Включить отправку сведений" + "Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях в Google." + "Исправление нажатием" + "Нажмите на слово, чтобы исправить его" + "Вид клавиатуры" + "клавиатура" + "голосовой" diff --git a/java/res/values-sv/config.xml b/java/res/values-sv/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-sv/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 6b7ffd9e8..b45b5da3e 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Androids tangentbord" "Inställningar för Androids tangentbord" - - + "Inmatningsalternativ" "Vibrera vid tangenttryck" "Knappljud" - - + "Popup vid knapptryck" "Rätta skrivfel" "Aktivera rättning av felaktiga inmatningar" "Inmatningsfel i liggande vy" @@ -48,19 +46,21 @@ "Åtgärdar automatiskt vanliga misstag" "Visa förslag" "Visar ordförslag när du skriver" - "Komplettera automatiskt" - "Blanksteg och punkt infogar automatiskt markerat ord" - - - - - - - - + "Visa inställningsknapp" + "Automatiskt" + "Visa alltid" + "Dölj alltid" + "Komplettera automatiskt" + "Blanksteg och punkt infogar automatiskt markerat ord" + "Av" + "Måttlig" + "Aggressiv" + + + "Bigramförslag" "Förbättra förslaget med föregående ord" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Mer" + + + + + + "Röstindata" "Röstindata stöds inte på ditt språk än, men tjänsten fungerar på engelska." "Röstinmatning är en funktion på experimentstadiet som använder Googles nätverks taligenkänning." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Välj inmatningsmetod" "Inmatningsspråk" "Dra med fingret på blanksteg om du vill ändra språk" - "← Peka igen för att spara" + "← Tryck igen för att spara" "En ordlista är tillgänglig" - - - - - - - - - - - - - - + "Aktivera synpunkter från användare" + "Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter till Google." + "Tryck om du vill korrigera om ord" + "Du kan korrigera om ord genom att trycka på ord som du har skrivit" + "Tangentbordstema" + "tangentbord" + "röst" diff --git a/java/res/values-tr/config.xml b/java/res/values-tr/config.xml new file mode 100644 index 000000000..419f19623 --- /dev/null +++ b/java/res/values-tr/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0,22" + "0" + + diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index e0ec09445..bdfb9b280 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android klavyesi" "Android klavye ayarları" - - + "Giriş seçenekleri" "Tuşa basıldığında titret" "Tuşa basıldığında ses çıkar" - - + "Tuşa basıldığında pop-up aç" "Yazım hatalarını düzelt" "Giriş hatası düzeltmeyi etkinleştir" "Yatay giriş hataları" @@ -48,19 +46,21 @@ "Yaygın olarak yapılan yazım hatalarını düzeltir" "Önerileri göster" "Yazarken önerilen kelimeleri görüntüle" - "Otomatik tamamla" - "Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler" - - - - - - - - + "Ayarları göster tuşu" + "Otomatik" + "Her zaman göster" + "Her zaman gizle" + "Otomatik tamamla" + "Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler" + "Kapalı" + "Tutarlı" + "Agresif" + + + "Bigram Önerileri" "Öneriyi geliştirmek için önceki kelimeyi kullanın" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "Diğer" + + + + + + "Ses girişi" "Ses girişi, şu anda sizin diliniz için desteklenmiyor ama İngilizce dilinde kullanılabilir." "Ses girişi, Google\'ın ağ bağlantılı ses tanıma işlevini kullanan deneysel bir özelliktir." @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "Giriş yöntemini seç" "Giriş dilleri" "Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın" - "← Kaydetmek için tekrar dokunun" + "← Kaydetmek için tekrar dokunun" "Sözlük kullanılabilir" - - - - - - - - - - - - - - + "Kullanıcı geri bildirimini etkinleştir" + "Kullanım istatistiklerini ve kilitlenme raporlarını Google\'a otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun." + "Kelimeleri düzeltmek için dokunun" + "Yazdığınız kelimelere dokunarak kelimelerde düzeltme yapabilirsiniz" + "Klavye Teması" + "klavye" + "ses" diff --git a/java/res/values-zh-rCN/config.xml b/java/res/values-zh-rCN/config.xml new file mode 100644 index 000000000..e0e3a8e41 --- /dev/null +++ b/java/res/values-zh-rCN/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0.22" + "0" + + diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index b8973b220..81593c34c 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 键盘" "Android 键盘设置" - - + "输入选项" "按键时振动" "按键时播放音效" - - + "按键时显示弹出窗口" "纠正输入错误" "启用输入错误纠正功能" "横向输入错误" @@ -48,19 +46,21 @@ "纠正常见的输入错误" "显示建议" "输入时启用联想提示" - "自动填写" - "按空格键和标点符号时自动插入突出显示的字词" - - - - - - - - + "显示设置键" + "自动" + "始终显示" + "始终隐藏" + "自动填写" + "按空格键和标点符号时自动插入突出显示的字词" + "关闭" + "部分" + "全部" + + + "双连词建议" "使用以前的字词改进建议" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "更多" + + + + + + "语音输入" "语音输入功能当前还不支持您的语言,您只能输入英语语音。" "语音输入是一项试验性的功能,它采用了 Google 的网络语音识别功能。" @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "选择输入法" "输入语言" "在空格键上滑动手指可更改语言" - "← 再次点按即可保存" + "← 再次触摸即可保存" "提供字典" - - - - - - - - - - - - - - + "启用用户反馈" + "自动向 Google 发送使用情况统计信息和崩溃报告,帮助改进该输入法编辑器。" + "触摸即可更正字词" + "您可以触摸已键入的字词,对其进行更正" + "键盘主题" + "键盘" + "语音" diff --git a/java/res/values-zh-rTW/config.xml b/java/res/values-zh-rTW/config.xml new file mode 100644 index 000000000..e0e3a8e41 --- /dev/null +++ b/java/res/values-zh-rTW/config.xml @@ -0,0 +1,28 @@ + + + + + + + "0.22" + "0" + + diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index d9e0dacaf..c3ccd17f0 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -22,12 +22,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Android 鍵盤" "Android 鍵盤設定" - - + "輸入選項" "按鍵時震動" "按鍵時播放音效" - - + "按鍵時顯示彈出式視窗" "修正輸入錯誤" "啟用輸入錯誤修正功能" "橫向輸入錯誤" @@ -48,19 +46,21 @@ "修正一般打字錯誤" "顯示建議" "打字時顯示建議字詞" - "自動完成" - "在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤" - - - - - - - - + "顯示設定金鑰" + "自動" + "永遠顯示" + "永遠隱藏" + "自動完成" + "在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤" + "關閉" + "普通模式" + "加強模式" + + + "雙連詞建議" "根據前一個字詞自動找出更適合的建議" @@ -89,6 +89,13 @@ "123" "ABC" "ALT" + "更多" + + + + + + "語音輸入" "語音輸入目前不支援您的語言,但是可以辨識英文。" "語音輸入這項實驗功能運用了 Google 的網路語音辨識系統。" @@ -131,24 +138,16 @@ ".org" ".gov" ".edu" - - + "選取輸入法" "輸入語言" "以手指在空白鍵上滑動可變更語言" - "← 再次輕按可儲存" + "← 再次輕觸即可儲存" "可使用字典" - - - - - - - - - - - - - - + "啟用使用者意見回饋" + "自動將使用統計資料和當機報告傳送給 Google,協助改善這個輸入法編輯器。" + "輕觸即可重新修正字詞" + "只要輕觸您所輸入的字詞,即可重新予以修正" + "鍵盤主題" + "鍵盤" + "語音" From 9dce586eaa8a99fac05da398694d6e26b2a6dfa8 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 29 Oct 2010 03:15:02 +0900 Subject: [PATCH 100/287] Bugfix: IME gives haptic feedback when button wasn't pressed bug: 3142416 Change-Id: If7630b89d6c2a8ec38e191c263c03f8f11d3c498 --- .../com/android/inputmethod/latin/PointerTracker.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index 448e27910..f6fd5bd7a 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -272,11 +272,12 @@ public class PointerTracker { mIsRepeatableKey = false; checkMultiTap(eventTime, keyIndex); if (mListener != null) { - int primaryCode = isValidKeyIndex(keyIndex) ? mKeys[keyIndex].codes[0] : 0; - mListener.onPress(primaryCode); - // This onPress call may have changed keyboard layout and have updated mKeyIndex. - // If that's the case, mKeyIndex has been updated in setKeyboard(). - keyIndex = mKeyState.getKeyIndex(); + if (isValidKeyIndex(keyIndex)) { + mListener.onPress(mKeys[keyIndex].codes[0]); + // This onPress call may have changed keyboard layout and have updated mKeyIndex. + // If that's the case, mKeyIndex has been updated in setKeyboard(). + keyIndex = mKeyState.getKeyIndex(); + } } if (isValidKeyIndex(keyIndex)) { if (mKeys[keyIndex].repeatable) { From 74103ee1b92349eee7b13f3958f494655300b925 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 29 Oct 2010 18:05:07 +0900 Subject: [PATCH 101/287] Increased the size of GRID in Keyboard Bug: 3122894 - Changed width 10 -> 32 - Changed height 5 -> 16 Change-Id: I07354cf5c942974cc25a5e043f41e0f13a09351b --- java/res/values/config.xml | 2 ++ .../inputmethod/latin/BaseKeyboard.java | 25 ++++++++----------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/java/res/values/config.xml b/java/res/values/config.xml index af145a629..456d9ad4d 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -27,6 +27,8 @@ 100 400 50 + 32 + 16 400 1200 800 diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index cb41ad047..266300eb3 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -109,9 +109,9 @@ public class BaseKeyboard { // Variables for pre-computing nearest keys. - private static final int GRID_WIDTH = 10; - private static final int GRID_HEIGHT = 5; - private static final int GRID_SIZE = GRID_WIDTH * GRID_HEIGHT; + private final int GRID_WIDTH; + private final int GRID_HEIGHT; + private final int GRID_SIZE; private int mCellWidth; private int mCellHeight; private int[][] mGridNeighbors; @@ -466,6 +466,11 @@ public class BaseKeyboard { * @param height sets height of keyboard */ public BaseKeyboard(Context context, int xmlLayoutResId, int modeId, int width, int height) { + Resources res = context.getResources(); + GRID_WIDTH = res.getInteger(R.integer.config_keyboard_grid_width); + GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height); + GRID_SIZE = GRID_WIDTH * GRID_HEIGHT; + mDisplayWidth = width; mDisplayHeight = height; @@ -485,17 +490,9 @@ public class BaseKeyboard { * @param modeId keyboard mode identifier */ public BaseKeyboard(Context context, int xmlLayoutResId, int modeId) { - DisplayMetrics dm = context.getResources().getDisplayMetrics(); - mDisplayWidth = dm.widthPixels; - mDisplayHeight = dm.heightPixels; - //Log.v(TAG, "keyboard's display metrics:" + dm); - - mDefaultHorizontalGap = 0; - setKeyWidth(mDisplayWidth / 10); - mDefaultVerticalGap = 0; - mDefaultHeight = mDefaultWidth; - mKeyboardMode = modeId; - loadKeyboard(context, xmlLayoutResId); + this(context, xmlLayoutResId, modeId, + context.getResources().getDisplayMetrics().widthPixels, + context.getResources().getDisplayMetrics().heightPixels); } /** From 69db35c493aa3a6a9f17094bf2180a52ffb2358e Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 29 Oct 2010 18:59:37 +0900 Subject: [PATCH 102/287] Make the buttons work for edge pixels of the keyboard Follow-up change to If7630b89 bug: 3142416 Change-Id: I2660e3d688eb0490363e460d5b4944c89b8ca35c --- java/src/com/android/inputmethod/latin/LatinKeyboard.java | 4 +++- .../com/android/inputmethod/latin/ProximityKeyDetector.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 096f3e702..45a4a9508 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -797,7 +797,9 @@ public class LatinKeyboard extends Keyboard { if (mCurrentlyInSpace) { return new int[] { mSpaceKeyIndex }; } else { - return super.getNearestKeys(x, y); + // Avoid dead pixels at edges of the keyboard + return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)), + Math.max(0, Math.min(y, getHeight() - 1))); } } diff --git a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java index d17bedb56..325ce674c 100644 --- a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java +++ b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java @@ -83,4 +83,4 @@ class ProximityKeyDetector extends KeyDetector { } return primaryIndex; } -} \ No newline at end of file +} From 9bbac774900ff1c5f09831a99774cb22709399f9 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 29 Oct 2010 15:46:29 +0900 Subject: [PATCH 103/287] DO NOT MERGE. Fix the size of preview text Bug: 3141907 Change-Id: Iabbccd15485cbd7c7188e362cc2914caec5d1f1d --- java/res/values/dimens.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index c00c56a89..0c3b6ad2e 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -33,10 +33,10 @@ 2.5in 0.13in 0.083in - 0.236in + 40sp 0.000in - - 0.464in + + 80sp 0.553in From e6d171ab0b8c6bfb00a38bfe30d25217c9fa8757 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 29 Oct 2010 20:01:26 +0900 Subject: [PATCH 104/287] Add vertical correction for Stingray bug: 3145773 Change-Id: I3ac1953b00367d3bf487a4186afe4150b039b05b --- java/res/values-xlarge/dimens.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index 4614f720a..56f5a3c3c 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -36,10 +36,6 @@ 0.175in 0.100in 0.245in - - 0.0in 46dip - 0dip From 89e841c85b4854a7d6bf5f741bd497fd9d8c304b Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 29 Oct 2010 20:14:10 +0900 Subject: [PATCH 105/287] Get rid of number hints on Stingray bug: 3145786 Change-Id: Ifc2dcdb06d7a056b38ad574c65ef7fcbddcbb6aa --- .../drawable-xlarge-land/key_hint_0_holo.9.png | Bin 1521 -> 0 bytes .../drawable-xlarge-land/key_hint_1_holo.9.png | Bin 1357 -> 0 bytes .../drawable-xlarge-land/key_hint_2_holo.9.png | Bin 1562 -> 0 bytes .../drawable-xlarge-land/key_hint_3_holo.9.png | Bin 1565 -> 0 bytes .../drawable-xlarge-land/key_hint_4_holo.9.png | Bin 1460 -> 0 bytes .../drawable-xlarge-land/key_hint_5_holo.9.png | Bin 1514 -> 0 bytes .../drawable-xlarge-land/key_hint_6_holo.9.png | Bin 1555 -> 0 bytes .../drawable-xlarge-land/key_hint_7_holo.9.png | Bin 1474 -> 0 bytes .../drawable-xlarge-land/key_hint_8_holo.9.png | Bin 1597 -> 0 bytes .../drawable-xlarge-land/key_hint_9_holo.9.png | Bin 1570 -> 0 bytes java/res/drawable-xlarge/key_hint_0_holo.9.png | Bin 1426 -> 0 bytes java/res/drawable-xlarge/key_hint_1_holo.9.png | Bin 1298 -> 0 bytes java/res/drawable-xlarge/key_hint_2_holo.9.png | Bin 1443 -> 0 bytes java/res/drawable-xlarge/key_hint_3_holo.9.png | Bin 1457 -> 0 bytes java/res/drawable-xlarge/key_hint_4_holo.9.png | Bin 1412 -> 0 bytes java/res/drawable-xlarge/key_hint_5_holo.9.png | Bin 1427 -> 0 bytes java/res/drawable-xlarge/key_hint_6_holo.9.png | Bin 1442 -> 0 bytes java/res/drawable-xlarge/key_hint_7_holo.9.png | Bin 1409 -> 0 bytes java/res/drawable-xlarge/key_hint_8_holo.9.png | Bin 1478 -> 0 bytes java/res/drawable-xlarge/key_hint_9_holo.9.png | Bin 1443 -> 0 bytes java/res/xml-xlarge/kbd_qwerty_row1_common.xml | 10 ---------- 21 files changed, 10 deletions(-) delete mode 100644 java/res/drawable-xlarge-land/key_hint_0_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_1_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_2_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_3_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_4_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_5_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_6_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_7_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_8_holo.9.png delete mode 100644 java/res/drawable-xlarge-land/key_hint_9_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_0_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_1_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_2_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_3_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_4_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_5_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_6_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_7_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_8_holo.9.png delete mode 100644 java/res/drawable-xlarge/key_hint_9_holo.9.png diff --git a/java/res/drawable-xlarge-land/key_hint_0_holo.9.png b/java/res/drawable-xlarge-land/key_hint_0_holo.9.png deleted file mode 100644 index 608e76f2559fd90b0ebdd76a5076bbcf5aac99c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1521 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 Iol`;+0EWiiwg3PC diff --git a/java/res/drawable-xlarge-land/key_hint_2_holo.9.png b/java/res/drawable-xlarge-land/key_hint_2_holo.9.png deleted file mode 100644 index bd4375ed0aff7ef5af77be1fc36b7aba378795eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1562 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@Ppql=4$sf&f9iJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYT~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18X3A+ zxVSmFI69dtLG`AP6K48A$LNC+2U22z2?0|ehzU>nKn^_fq~-y0Oc5|^v}%WQgLffsA0F1qsYCPw_`22FK14biHJ?qRGV;af>K1pjgA6=B#WGP>=k8fI*Swq zZm;HJ>2!4w30l!w|G+}XX_i8H!Yq^WrlXbB)|LMEWDXzsdhN-X=Iz#-tv}zJ{l4}+ zudtIuk71$&+u@J3T+7Xk%@pq3STN(qj(m%M-cM$?yNV|81q-d|YYlnG?4Gh#x5)?{#~u?z8^G z2xb?%I{-mX1|GPmDm zKm71Rq}AMi4WG{|Z0BxCkm{~U)RTO8C2MQ^hkXpZ4`!tp{dCcr<+nV2i{FpFIU9;a zPwB3h=CxGLfiLc{#Dia48)}07ua90h>A8pd>JTkcozqnvmM_Y7|2CSK@kdXqsQ3At z1x^;*+!tSTzr8Ivp@Pfg4p5o>AGfvcdfXh{>C!?~B0OyK7d`Y_K3QL^JATWw0~!mi za)z!Fez@WH-+#LUG`=wLZjV~)v^DDQG7-t}TZdl#bGkmqMCQfUs#Xt`pwG7$_|6M; zy7+8kTram-L+Ncw)4R)Ck8sN_`!0Iuj@q_@y=+&Wxtzopr0GW_T(*OVf diff --git a/java/res/drawable-xlarge-land/key_hint_3_holo.9.png b/java/res/drawable-xlarge-land/key_hint_3_holo.9.png deleted file mode 100644 index b263c1922de9c902ca36d4b1f57ec9ca9028a87e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1565 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6T!3HF!zYw_%q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Jax*t~ zGc+_eF)%kWFtac;v~V^waWOV^v#>C6HZXH^f|-F$uc@Ppql=4$rHh55iJ_s3o1?3t zxr>pRrLlpLiHW5fT(4(daYT~doO%TiO^it=+6z~O6^iN$_5OH_Y5nmZc18X3A+ zxVSmFI69dtLG`AP6K48A$LNC+2U22z2?0|ehzU>nKn^_fq~-y0Oc5|^OnIMO#=yYj z>*?YcQgLff=>C2oN0EColOHmPcLZe}K6>mB-%FhZ3m5KK5D<0eu6+UT-J>msBu-6^ zsh@EpAxTlOv57?}$vIJ}wZ1{ZiS?m}NT1~W==&ALlU>DZYfc_NXSDf!?eD$vrm&;2XPD{8734J+nEz zmtTIr{PN42875Vd{l~vE@+ba1SE+kWd8Uur%BP2JxrnJ}o=o|~8dJ_0w*P+qvY?ge zZgpm>idTlSI5u3~>!MWH!T#)XrTzT#^$Rvf6s1e%-@aayE9?<>jUm4sQt1sBy{skfR||^~6Z(n%b4j@`P_&ZsyDj z5J=x2wN`GS$&Ptv)8=or+#IM`bbH(P!w)}bdKA36=5jahd(*Lo2=Rt^{zLJa68*>L zH{6x}{Gh<1CUo`HOIQAJ7p>DeyjP@GaP^mMnR^$1Js@fsn{lQ!PGYs&x?7Q1b9Y@R zQtDy*Y*I8+E_Aij_AG(xD*2a=9KSPTb8hW|(DqZIoIjs4v^}eTd)!s*^>PMghUT|I UTe@7MpMnZ(Pgg&ebxsLQ06`B?7ytkO diff --git a/java/res/drawable-xlarge-land/key_hint_4_holo.9.png b/java/res/drawable-xlarge-land/key_hint_4_holo.9.png deleted file mode 100644 index 6ce5bb44385be65e530727461474c7797d31be05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 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 diff --git a/java/res/drawable-xlarge/key_hint_2_holo.9.png b/java/res/drawable-xlarge/key_hint_2_holo.9.png deleted file mode 100644 index ea3fc407b42f9cba0c30e02c546ea0fd614158d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 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 N=;`X`vd$@?2>^iw_v4 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=b96N{ zcQG=vG&V3YF|l-m>-EelE=kNwPKDW<3A7ig*Bq~2E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A@J&q4%meX3(F5_VOKMSOS!#+~QGTuhIDD-#vDoisiRy1hb4O!WBSRMp z7dIytM<;V7sNNKE!b~6N7=2LUKuRnyAz%swG2uxc$bn~`)I4C0DFSAVsI}X(85kH3 zd%8G=RNT4}de-Z(gTOscC0-L37529)J1X=aEwvTd(|KY0gnN5`F?0I8lUct_h z|K(DJ6&>RGb`A?ww_H?-O;1ts_W6~rz2igarnzs-H*db5VvHK?^26W(X5lGQ}iO`>70j>Jx!%9_O2~g2!_>yC)Yfvr1}S zXe=n$-qG=F%8@m1dgrX^P20S)w<7fK;)^df#jT&O{WMbVv)9s1$6MyT|LwnP-El_& zo1%gryp|Euwz^I}nDF6FhDl7#p9K+ImS+=V6!^O3t>>|rS?6-xLRaay-r98WWr^N}=L?+vI4uk~W^BQE z_`|}ewQ>vX9ri4?kK6G#v*-BZ>f?oZT}P7^ecWBPyY|?s&Sy7yKcxF@U|ssI?b1Te z-|k-1{g#!!2!F;|SR`H85V6u)omPo6;w?B~~w(>#yt4&$+{(U+v4 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=b96N{ zcQG=vG&V3YF|l-m>-EelE=kNwPKDW<3A7ig*9fm(E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A@J&q4%meX3(F5_VOKMSOS!#+~QGTuhIDD-#vDoisiRy1hb4O!WBSRMp z7dIytM<;V7sNNKE!b~6N7=2LUKuRnyAz%swG2uxc$bn~`)I4C0DFSAV?whqQ7#J8Y zdAc};RNT5UZNK+n2a)5&(=Ur;bxv3s^qi`Fg-%4>nfpL)!joQG#{{nPGS_u6jC z>8Gf)wE&WAP}P309Q(>6!1GICpd@%W+0RnHjniWiCO{40BVTl^EH z=DPj=r<{L&ereR6q>U8{$M-wTT<|-xljWuSbIXdC-dp#STFvF2A<}gF?KjC)$J#4D z8%=p&XukI4rv4 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=9ZF*I~>b94o= zjm#{K4U9}oEZyLGJ@bl767!N%VfJPM?S<+!!>iZIxhOTUB)=#mKR*YS0s=DfOY(~| z@(UE4gH08D6O%LZKzva2Kz!?xT9jFqn&MWJpQ`{4U#mV z&B?{l$y^DlH-(%q(+4_6ACx$d5(`WSm;ymec+v-Q;F%{i513<$fLX(M?y2<*42&B+ zT^vIyZe0o6>vz~d;G2K(@%jMf@zV*KHEHB z_d3q_7~itXFQeZI^KxfPOnRg7MI@&6vI57tM;6l(CHAd&uH0%{asJOXt_9ncE|Ro( z(fYhn++bsb&b;2jnONq55;ZUxw=SnU5`|8`#Z0JMWCl^wL##xgr(zS2rJgAj4!S)f;#9vm)E3-JX+5 z8L#?&`TbYgV3NvCch9bbQ?pEGJu(fyRx+jaq2z-MZxy{S>zw06^d?8Ji@Xn+TXe-D zCW&?8*F%w|msX_4h5eG>xOr;K?X&x*ttj)&Z$9#EJIj(^VhIeYZqheST6@}o3Pn#> KKbLh*2~7Y?&-*F> diff --git a/java/res/drawable-xlarge/key_hint_8_holo.9.png b/java/res/drawable-xlarge/key_hint_8_holo.9.png deleted file mode 100644 index 08c40e46612f5d5299956001ed5506071c7cc8e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6H!3HD+Ytl-Alw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#2IjQPkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 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=b96N{ zcQG=vG&V3YF|l-m>-EelE=kNwPKDW<3A7ie*T~hv&=Id*E9aur#FG4?ko^1{SPBTp z$S=t+&d4uNa1J(A@J&q4%meX3(F5_VOKMSOS!#+~QGTuhIDD-#vDoisiRy1hb4O!W zBSRMp7dIytM<;V7sNNKE!b~6N7=2LUKuRnyAz%swG2uxc$bn~`)I4C0DFS8S5`o(>D)G({It;M;}eS{nqZNp=)5AbnmfLrHMP9bFaK5 zc6L(0o5`Pl{t*-^x0=f};a;Fu?7{$z!{W<6hj8bb&Ca(eRGEF&?!o3&tKQe}nU-b;lK;M7AIo5njma%cFZrHB3|Gqr?R{0BZ zvV6z=Or-8!KXz7Qxz&-wGknzebIopt?Ty>t>7t~*H}1Wv1kb$XmtXR3UcMqR$>F7$ zn?n7eP1)OTr`CM`S+n}`s+1)mUl>D_o?cDR7U4>l>wmuJ_S4^e+3s3%0S+1G_|;*nWgXrWGaCk<+Bx;OZ^}cy zsjThac3QXd%}uEf@jIs9t(kt>A(+=!^x2v4 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=b96N{ zcQG=vG&V3YF|l-m>-EelE=kNwPKDW<3A7ig*A%Z_E9aur#FG4?ko^1{SPBTp$S=t+ z&d4uNa1J(A@J&q4%meX3(F5_VOKMSOS!#+~QGTuhIDD-#vDoisiRy1hb4O!WBSRMp z7dIytM<;V7sNNKE!b~6N7=2LUKuRnyAz%swG2uxc$bn~`)I4C0DFSAV_)P0>3=E8y zJzX3_DsEi~HS|B^AhK^-@T_euS9&AOA3t%B?NR1wJ1Ot*YDMSdT^qi#&yWazoEO6} zyX9!W;RB2IA3Wf)D{;wz%Juua`7S>aJb1+0Zr$~`{ojAw`@T*pxhG@RF%Ctk82#cG z7TGDR&g$ASB6ZVrkIzr}XMgfwqsh}oHA{~&q2F2)qb9zPdBo$iX1R>;jGxn1dNnLL z!}?K5NqM4s$HpLr3cUsufeTLxW}SWJyZv@*g969ARaak$?awb>~i)pV>FOD6uME8gx>=*DZfprrfW6 z`#U*bM9hzm4rDLd@xakMe-Jb)`0IS<^J3BTa|KrdZd`bAy z@>4$6`;Xd{|FN$Pdu`OEbc%atvc$2n_1AYh%=b6=-8x%CZQa!@%eXzkI}S4M`S$zo zXRoD2+7nlwWXj^GRLRs(QfBSl9X#Ru>kAQLGb5xP$tVU*^O=;~X3?sA)z7mmd6J0E xO9@Y{j7!t!ugv(h_*v#mol}!1SpF1AU`XBh=8%Q>&10Zq)6><@Wt~$(69C#;5kCL` diff --git a/java/res/xml-xlarge/kbd_qwerty_row1_common.xml b/java/res/xml-xlarge/kbd_qwerty_row1_common.xml index 98b857152..677da2527 100644 --- a/java/res/xml-xlarge/kbd_qwerty_row1_common.xml +++ b/java/res/xml-xlarge/kbd_qwerty_row1_common.xml @@ -29,52 +29,42 @@ latin:keyEdgeFlags="left" /> Date: Mon, 1 Nov 2010 20:25:07 +0900 Subject: [PATCH 106/287] Capitalization for "Quick Fixes" words doesn't work bug: 3151706 Change-Id: I7770a1d26edb1ea72ee93396181953a724dcc4bf --- .../android/inputmethod/latin/Suggest.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 01782339f..29c3eea5f 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -337,8 +337,25 @@ public class Suggest implements Dictionary.WordCallback { String suggestedWord = mSuggestions.get(i).toString().toLowerCase(); CharSequence autoText = AutoText.get(suggestedWord, 0, suggestedWord.length(), view); - // Is there an AutoText correction? + // Is there an AutoText (also known as Quick Fixes) correction? boolean canAdd = autoText != null; + // Capitalize as needed + final int autoTextLength = autoText != null ? autoText.length() : 0; + if (autoTextLength > 0 && (mIsAllUpperCase || mIsFirstCharCapitalized)) { + int poolSize = mStringPool.size(); + StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove( + poolSize - 1) : new StringBuilder(getApproxMaxWordLength()); + sb.setLength(0); + if (mIsAllUpperCase) { + sb.append(autoText.toString().toUpperCase()); + } else if (mIsFirstCharCapitalized) { + sb.append(Character.toUpperCase(autoText.charAt(0))); + if (autoTextLength > 1) { + sb.append(autoText.subSequence(1, autoTextLength)); + } + } + autoText = sb.toString(); + } // Is that correction already the current prediction (or original word)? canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i)); // Is that correction already the next predicted word? @@ -461,8 +478,7 @@ public class Suggest implements Dictionary.WordCallback { return true; } - System.arraycopy(priorities, pos, priorities, pos + 1, - prefMaxSuggestions - pos - 1); + System.arraycopy(priorities, pos, priorities, pos + 1, prefMaxSuggestions - pos - 1); priorities[pos] = freq; int poolSize = mStringPool.size(); StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) From 6936edbfcd81020f81b5140f89705e09c3209e08 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 2 Nov 2010 15:05:31 +0900 Subject: [PATCH 107/287] Adjust the gap of keys on a tablet layout Bug: 3155782 Change-Id: Icefe654874e58ee2fcbeab353690bfe15f54ab61 --- java/res/values-xlarge/dimens.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index 56f5a3c3c..a60d604cf 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -21,8 +21,8 @@ 0.450in - 0.03in - 0.03in + 0.050in + 0.050in 0.450in 0.10in From fe05848e5026049f40a600bf9da70ee60d921981 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 29 Oct 2010 19:52:42 +0900 Subject: [PATCH 108/287] Change the size of preview for priventing preview from being clipped Change-Id: I6f9fb2c8c0e98ede14729e7cb602bfb4b2672159 --- java/res/values/dimens.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 765262d56..a2ce3648d 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -25,8 +25,8 @@ 0.000in 0.325in 0.06in - - 0.464in + + 80sp 0.553in @@ -35,7 +35,7 @@ 0.13in 0.083in - 0.236in + 40sp 0.000in From 17fcd719de9a0ddcf9fd712481b28038419eec4e Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 2 Nov 2010 18:55:20 +0900 Subject: [PATCH 109/287] Make sure there are no modes with settings key on tablet. Follow-up change to I73b8a502 bug: 3095814 Change-Id: I79bb05c61dc73b036331e17d02c791f08a0168fc --- .../inputmethod/latin/KeyboardSwitcher.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index dcbdba13d..a79cc2b22 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -162,8 +162,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private static final int SETTINGS_KEY_MODE_AUTO = R.string.settings_key_mode_auto; private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW = R.string.settings_key_mode_always_show; - private static final int SETTINGS_KEY_MODE_ALWAYS_HIDE = - R.string.settings_key_mode_always_hide; + // NOTE: No need to have SETTINGS_KEY_MODE_ALWAYS_HIDE here because it's not being referred to + // in the source code now. + // Default is SETTINGS_KEY_MODE_AUTO. + private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO; private int mLastDisplayWidth; private LanguageSwitcher mLanguageSwitcher; @@ -546,18 +548,18 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha Resources resources = mInputMethodService.getResources(); final boolean showSettingsKeyOption = resources.getBoolean( R.bool.config_enable_show_settings_key_option); - final int defaultSettingsKeyMode = showSettingsKeyOption - ? SETTINGS_KEY_MODE_AUTO : SETTINGS_KEY_MODE_ALWAYS_HIDE; - final String settingsKeyMode = prefs.getString(LatinIMESettings.PREF_SETTINGS_KEY, - resources.getString(defaultSettingsKeyMode)); - // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or - // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system - if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW)) - || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO)) - && LatinIMEUtil.hasMultipleEnabledIMEs(mInputMethodService))) { - mHasSettingsKey = true; - } else { - mHasSettingsKey = false; + if (showSettingsKeyOption) { + final String settingsKeyMode = prefs.getString(LatinIMESettings.PREF_SETTINGS_KEY, + resources.getString(DEFAULT_SETTINGS_KEY_MODE)); + // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or + // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system + if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW)) + || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO)) + && LatinIMEUtil.hasMultipleEnabledIMEs(mInputMethodService))) { + mHasSettingsKey = true; + return; + } } + mHasSettingsKey = false; } } From 3b075346b14791a60eae23b5176387b734d7c08a Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 2 Nov 2010 20:35:22 +0900 Subject: [PATCH 110/287] Updated icons for the input method subtype Change-Id: Ib92666357a6921cb7e068c63353b8b3d997c80b2 --- java/res/drawable-hdpi/ic_subtype_keyboard.png | Bin 807 -> 0 bytes java/res/drawable-hdpi/ic_subtype_mic.png | Bin 681 -> 0 bytes java/res/drawable-mdpi/ic_subtype_keyboard.png | Bin 528 -> 0 bytes java/res/drawable-mdpi/ic_subtype_mic.png | Bin 483 -> 0 bytes java/res/drawable/ic_subtype_keyboard.png | Bin 0 -> 2367 bytes java/res/drawable/ic_subtype_mic.png | Bin 0 -> 2557 bytes java/res/drawable/ic_subtype_us_keyboard.png | Bin 0 -> 2390 bytes java/res/drawable/ic_sybtype_us_keyboard.png | Bin 1014 -> 0 bytes java/res/xml/method.xml | 4 ++-- 9 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 java/res/drawable-hdpi/ic_subtype_keyboard.png delete mode 100644 java/res/drawable-hdpi/ic_subtype_mic.png delete mode 100644 java/res/drawable-mdpi/ic_subtype_keyboard.png delete mode 100644 java/res/drawable-mdpi/ic_subtype_mic.png create mode 100644 java/res/drawable/ic_subtype_keyboard.png create mode 100644 java/res/drawable/ic_subtype_mic.png create mode 100644 java/res/drawable/ic_subtype_us_keyboard.png delete mode 100644 java/res/drawable/ic_sybtype_us_keyboard.png diff --git a/java/res/drawable-hdpi/ic_subtype_keyboard.png b/java/res/drawable-hdpi/ic_subtype_keyboard.png deleted file mode 100644 index c7729566c241f096bde71b5da5f46453e9507f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 807 zcmV+?1K9kDP)(RCwC#Sxu`FQ5c@las1#$;75WX z;x!d7wCjIdgrX=4qE)M;Mavd#+XU@`y9%UeaiP_Pe#2e3Fi}(_6|Uc27!^lHd)~Qd zYI;H4oWq?151x5O=e*CEbKdtkC{CwSf#+rtIB$jkL%>ZJAZ0QcAruNdMgJ9Wo0GUN zfn=djI1v>^d1J9yKJhsFgTWvn4u``!`W{YKP@V)#jZJI_xXEdBm6%K>LaWu%`);>e z5JizmexrbNI<0m(ol|tp9*-v;i^a?=^7AD`c6tV6B%$4IAEW;ScvP>~pJ|%L9KRUz zk^o7PF05AT+3eckaD2xrQ(5B|V-``(7VCi4>-7%*pwU_j1Oi8PyFJYyKW}2c-(M|c zzkv^c47>;KG0I;FfI_Y-vBdkC_&)*I=|Zts)cfIZSa7*qO!8~f=x8(&a=BbmRaF;o zC!5Xwq(Z_Pzmz#w-oPck@DiV@o{}`}1@2QBR2bvu#mq#CWyWOsCU*W&wkx0aR9iK|21XT0$9VSmkPQM?G zMt2%_tpLiq@ZQJhp3!xq(RdsRg}#x6UB}bxVD=w?+C>08^C8CnvF*6@_SP0M?D7j) zmgn{r&QG_mn|OdW*ZJZzwgCe9wad6mcDh=vF4<|g)5A)oqT5%$-+yGY+0xhW1C;t( zwOUQv)>F|e`h32-Sl5*u#{HLtaC2WfeFA);!M0pMcHk`#-^)&y%VoaPD5@N-K`w)* z*d^?2#q0GR@F)O9xM3=lN=b+icskfntQ0e1Kcz~X$mjDi@O;sxGTta*d<7Ds@i(g> lzz|>vFa#I^cy50M7y$d=)#7A2T_ykk002ovPDHLkV1nlod^`XE diff --git a/java/res/drawable-hdpi/ic_subtype_mic.png b/java/res/drawable-hdpi/ic_subtype_mic.png deleted file mode 100644 index cb86a5598a7a9213a0755ea1670f6e27d25e9528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmV;a0#^NrP)~KI=mg0I$p*yknV!!l1GYp-uF{<@4{S>xmSjmzhha!=neLJs zCkDU(7ytv zW})((?VM(f12Aq!)>`zK(H>~Y>=J)}RR3QAR_xn7K?$Jp2-$gDt2A>)E(%cE7J#t% z5HPm+vkMLb;*{Vr(cq9tdP8G;qD3nH)0*GBhq48m^e^=%O9<)#OJ4NZ!89 zXYZWE@$v})*wg}9YwAlTxhuf{uDPwUfGXp-$xM0J0_Ea6vLsEgA+$oC1I?ykR7D^t z+JwHqbW0yNBj@*M14f!q9+byBKXKIo|8N< P00000NkvXXu0mjf%Rwia diff --git a/java/res/drawable-mdpi/ic_subtype_keyboard.png b/java/res/drawable-mdpi/ic_subtype_keyboard.png deleted file mode 100644 index 9a5aada8bb425f4a40d6f0f540f724ac94ffa147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable/ic_subtype_mic.png b/java/res/drawable/ic_subtype_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..03c0b6982259a07ca11f5ba161a608a52cc6757c GIT binary patch literal 2557 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 T`U7?+00000NkvXXu0mjfKXBz3 literal 0 HcmV?d00001 diff --git a/java/res/drawable/ic_subtype_us_keyboard.png b/java/res/drawable/ic_subtype_us_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed6cc8b2bcbabeb908032066e3a1c2e7615ec2a GIT binary patch literal 2390 zcmV-c390spP)|gDqlQFX=&*QltufU#n_QJGeQF^wtx%JL6;BYNawbu7IQF-5w9aE! z#TLB%t9KFk;j{O*2AtUoRg=kpRV(J>@73o}RG5!%J~$D_kJn<+q8YeQ*9?De7~g+t z0jdt4LNRH7>a+={scD3VlW~6Gn6zZTx&P1G?ubBk?jp5pd?E73Y0l0F$73X)+`I4s!$d6{!2(95RW|i4gB@USSI$G-$y&sBR@`3+4HfZQZ$6KTod+p%xU=WFCXLS zb&GKBToXEJpuP0s8tnSxVU(2>q5MIwF1fNi2kPEhbzAT!V=;X2(J^qG5iCoK;q=8Y ztPVr_3GvYmf4KjKBFm6uK^4R}h=dvn_jN~O{8mL#+W#wo;*u5WeA51@GxeA|yBtlI z+oc@qj?X^7h8};PJ|k)mR^L`al};P#vaB$$DexSV zBB1X+Gy<&tcm0yu(JLq&iXu}@imE6jAqa6b5)G??pr7aY$fjFK+$>^kvJOPz;Q2TL z)Gm{PL^n~W+k|z?;3u#w$I$eRpr!RoboT_2Op5w-W{d~U1MiJQP95sR*|TUo`zf+C z;H-&&8)?@KsihKdA~KW#ODxVg_=rhWWom4aPC}BCaJgJ+4nO)z_cQuJ`v?M| z&v)NO059B8hv+4;hwAE)WpmQbe+@hamkypA6ao=YjjX6}1|mSe69FQjs)8yjg6eQO zRENWn+Y{*7N-h4m5d^{um!`eN{fYdOVN5>F6FZ8%lVLPlZ;=hF@4N<#e%n7y;|1O=$%m@cYqFe+fBRIdFK2 zFnQ(-g!%^HaM(za3Pe$X!)Zn+n4nh^MC~&{u{vEQd$2dkJ6#s5BucVK%jueEZE0=| za;gCiy90bQvW{BqEd*ZPm{tOpj~)fnauu*;0~WjfS$*9VJUVMC!hH#9nF)GdjEl8? zJT}{dzFvVyM-#IjFR-0BcIDdA?@gW<=n3)NoxS`MOCI);+!#%AR!bI)2BVh>*iPr2Waxb|bH#7>_Mk_#|<|# zz!sFIH3Pxk9_ljMjp-3Ar+?OP`V!GHqJXTrJ=>0}mpbvt5-(aW_+ihnz?N@GT&nYT zE?!zZ;c|noGZY+%=eRAF@`uaD4i!2__c9oC*xq3T9Q*dCl>qm~8$jDNvbk=knv5u1 z#bfo(V|LlWSxj(^PdV7Ef^3+rEKD>W3W{vH-m-JDtR@q~+3ZGRYGS3zJ;g(RXCGDr z>Gty`I%YzfveZQwYYIcI(?~n*fpSf(FHQduL zxBufy0jiMz85mU?Xexs!V+=)EF2u5;y6n4?CItLc#9dUxi>G@r*j6Q3qK+kMkLVgk zzWsHlxwP(lplFA)`NT$Xz*l0 zOH++ZnxRQd6FHHHNeWG8Z9`Le=bpq%VblYi3Rq<7zw+QM-D4il4j?4Y8VgLSQhc z5gK>o=Xtz336q^6DN!#sGc2pSQbzYisqNP@kkY$ImLqj0NF;bQ7z(I;pA+@}Cp76^D!6~zPuZRg_=1VgLFsRDe?nwJGH^Wyl0vmPPFZrU9n{O#x2`bUxw3YN)@jJ(h_6 zf{*eSZhNG>S79b^Z82My)9Z4J+2S>s%rH=qYv*FhkoNB!YL%Mqg_=Y%emvYCt{K&# z{(gkh>9iX-;{z#g!|1Z20*#Q?+cW=n&qO9Nk%>%R07*qo IM6N<$f}X34ApigX literal 0 HcmV?d00001 diff --git a/java/res/drawable/ic_sybtype_us_keyboard.png b/java/res/drawable/ic_sybtype_us_keyboard.png deleted file mode 100644 index c81b22bb0ca59be752d9d0bbfdcc2d2a6b3e1976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 zcmVBg2cl}Ae9wApz5lkuxOAFT~)B_0{8*#s@+toKq|X-*##RU5DMZ^@sLO( z6CjmaBU_FW8$U9hXU_~_!=iQVLCxZR_IP}+jx^`H=R1!9I5;>sI5;>sI5_?aN^^G=-pky^|9Kp zeq9+~E?pkPFffRbt{af$APy|#(eLX>CCAZj_YhV?P?R9Hx*D>xDKuLh?BAb5t=2#! zoksYpFNQzb&(6R%0xs4YO~9eA<6!r$F;rgH5tJo#ItFa!AQp>4({#@^7?kK&g_tXR za0v}ez;#~Nb(n^Qjg1y8%YshPplyhvfNHe?NfOcPGTL)6QCY*A&rj_f0_}Dej4=r0 ztQroXPp54d23;0pB}61dIJN^pU_{P_bfk#*uiuW4oy=bXGczf?c4Z?;DF0c7sw&>T zKo4?kpx)TT^mNj*$z&2RS4-%8d3NVSpxJ7BP78v7ee*d~DN&=*Fgo3y7nxix?8sK@ojly!p~zuZLe@H}qaeuVto6xP>U(E5F3XC`sy&J(Z6EiFC8@nZ|HB?s#H)5CkVc+S60 zY}~)+cEw9WIikoAQ@j4-u}VJ*@#La!5g4VOi+j?L7e9eDU_uL&RDpO>^;JUg(&|V$ z?UT$}jRr|>{U7ZjkqDB>BqUY!HwU_3Ul`hXfyNFTJB)hUghn$}(_&CaxQgIFvl%q1 zV(-?Q%{t~duwc(GSIyLKc08^wPDTEkpY1A*8rUivYj~I1!cdf_)Xq_G$ znr>-w^p`;Nr|Tn0NGA!g5_RTn37Ou9A^;I43wWy*lfj~t@P`gT^jkus)N?n917|;l zEyR$3jT#H1U^lmu8&_e(Cw%V%*XX)63<2rr@r<)@;#5MnW%rcR zu7uvRiEZDrjsZt3n1QkQb6?-cMghG)?4@pfaZA%=Z}$E-!a>QTf$?{mufE|g%p4pX k92^`R92^`U6n_ga0M7ADrx40yQUCw|07*qoM6N<$f(F&rod5s; diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index e63141846..ce8fc9825 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -26,7 +26,7 @@ - @@ -38,7 +38,7 @@ android:imeSubtypeLocale="de" android:imeSubtypeMode="@string/subtype_mode_keyboard" /> - From 03728d6d0f4ef4f598ad8b5beef0c31c472a45b2 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 4 Nov 2010 17:22:30 +0900 Subject: [PATCH 111/287] Add [CHAR LIMIT] to some strings for key top Bug: 3147476 Change-Id: Ic3d898761b6953560dfec34813e96eddab351675 --- java/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 1f73b159f..11f273df6 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -214,11 +214,11 @@ ALT More - + Tab - + Pause - + Wait From 47f795dc8709f95b35888fbcca80c0c18dbe63ed Mon Sep 17 00:00:00 2001 From: Leon Scroggins Date: Tue, 2 Nov 2010 14:34:45 -0400 Subject: [PATCH 112/287] Treat the new web fields like their corresponding variations. Bug:2692655 Bug:2460543 Change-Id: I86e814902447ecd5c8b00e399a0143d3dc2ad2cf --- .../android/inputmethod/latin/LatinIME.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 3663442d4..5edbc2861 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -548,6 +548,17 @@ public class LatinIME extends InputMethodService return mCandidateViewContainer; } + private static boolean isPasswordVariation(int variation) { + return variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD + || variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + || variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_PASSWORD; + } + + private static boolean isEmailVariation(int variation) { + return variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + || variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS; + } + @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); @@ -570,8 +581,7 @@ public class LatinIME extends InputMethodService // the switch statement) whether we want to enable the voice button. mPasswordText = false; int variation = attribute.inputType & EditorInfo.TYPE_MASK_VARIATION; - if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD || - variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) { + if (isPasswordVariation(variation)) { mPasswordText = true; } @@ -605,17 +615,16 @@ public class LatinIME extends InputMethodService //startPrediction(); mPredictionOn = true; // Make sure that passwords are not displayed in candidate view - if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD || - variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ) { + if (isPasswordVariation(variation)) { mPredictionOn = false; } - if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + if (isEmailVariation(variation) || variation == EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME) { mAutoSpace = false; } else { mAutoSpace = true; } - if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS) { + if (isEmailVariation(variation)) { mPredictionOn = false; mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_EMAIL, attribute.imeOptions, enableVoiceButton); From 38976d5b968e8c9fe57f95b732d1906b7a6f09fa Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 4 Nov 2010 18:22:28 +0900 Subject: [PATCH 113/287] Add labels for subtypes - Also changed mode name - Move the position of a subtype for "US Keyboard" to the top Change-Id: I4dd7f869801d5efa775fe8a89dde233215f508d9 --- java/res/values/strings.xml | 33 ++++++ java/res/xml/method.xml | 217 +++++++++++++++++++++++------------- 2 files changed, 171 insertions(+), 79 deletions(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 11f273df6..a1a811274 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -400,6 +400,39 @@ keyboard voice + Czech Keyboard + Danish Keyboard + German Keyboard + English (United States) Keyboard + English (Great Britain) Keyboard + Spanish Keyboard + Spanish (United States) Keyboard + French Keyboard + French (Canada) Keyboard + Italian Keyboard + Norwegian Keyboard + Dutch Keyboard + Russian Keyboard + Serbian Keyboard + Swedish Keyboard + + Czech Voice + German Voice + English (Australia) Voice + English (Great Britain) Voice + English (India) Voice + English (New Zealand) Voice + English (United States) Voice + Spanish Voice + French Voice + Japanese Voice + Korean Voice + Polish Voice + Portuguese Voice + Russian Voice + Turkish Voice + Chinese (China) Voice + Chinese (Taiwan) Voice Android keyboard Debug settings diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index ce8fc9825..74cb45fea 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -20,114 +20,173 @@ - + + - - - + - - - - - - - - - - - - - - + - + - - - - - + + + + + + + + + + + + + + + + + From 68864723cf8d8e48385bfcaf30237fba25a8895a Mon Sep 17 00:00:00 2001 From: Tadashi Takaoka Date: Fri, 5 Nov 2010 18:30:22 +0900 Subject: [PATCH 114/287] Rename LatinKeyboardBaseView class to KeyboardBaseView Change-Id: I496ecbfa7d398583d01f821398f49f75d17311d8 --- java/res/layout/input_stone_popup.xml | 4 +- java/res/layout/keyboard_popup.xml | 4 +- java/res/values/attrs.xml | 2 +- java/res/values/styles.xml | 2 +- ...ardBaseView.java => BaseKeyboardView.java} | 64 +++++++++---------- .../inputmethod/latin/KeyDetector.java | 2 +- .../android/inputmethod/latin/LatinIME.java | 8 +-- .../inputmethod/latin/LatinKeyboardView.java | 6 +- .../latin/MiniKeyboardKeyDetector.java | 4 +- .../inputmethod/latin/PointerTracker.java | 6 +- .../latin/ProximityKeyDetector.java | 6 +- 11 files changed, 54 insertions(+), 54 deletions(-) rename java/src/com/android/inputmethod/latin/{LatinKeyboardBaseView.java => BaseKeyboardView.java} (96%) diff --git a/java/res/layout/input_stone_popup.xml b/java/res/layout/input_stone_popup.xml index f159625f7..3a7b5b9ab 100644 --- a/java/res/layout/input_stone_popup.xml +++ b/java/res/layout/input_stone_popup.xml @@ -25,9 +25,9 @@ android:orientation="horizontal" android:background="@drawable/keyboard_popup_panel_background" > - - - + diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index 0372b07cf..d2acafdfa 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -15,7 +15,7 @@ --> -