From 71005bb163f0de35574f05158c4cedbb90f88869 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Fri, 7 Mar 2014 13:42:13 +0000 Subject: [PATCH] added Devanagari keyboard for Android --- src/ui/android/res/xml/devanagari_page1.xml | 67 ++++++++++ src/ui/android/res/xml/devanagari_page2.xml | 67 ++++++++++ .../xml/{symbols.xml => symbols_page1.xml} | 0 .../{symbols_shift.xml => symbols_page2.xml} | 0 .../ui/android/Language.java | 23 +++- .../ui/android/Translator.java | 2 +- .../android/TranslatorInputMethodService.java | 124 +++++++++++------- .../ui/android/TranslatorKeyboard.java | 1 + 8 files changed, 230 insertions(+), 54 deletions(-) create mode 100644 src/ui/android/res/xml/devanagari_page1.xml create mode 100644 src/ui/android/res/xml/devanagari_page2.xml rename src/ui/android/res/xml/{symbols.xml => symbols_page1.xml} (100%) rename src/ui/android/res/xml/{symbols_shift.xml => symbols_page2.xml} (100%) diff --git a/src/ui/android/res/xml/devanagari_page1.xml b/src/ui/android/res/xml/devanagari_page1.xml new file mode 100644 index 000000000..14e87a4f3 --- /dev/null +++ b/src/ui/android/res/xml/devanagari_page1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ui/android/res/xml/devanagari_page2.xml b/src/ui/android/res/xml/devanagari_page2.xml new file mode 100644 index 000000000..982adb277 --- /dev/null +++ b/src/ui/android/res/xml/devanagari_page2.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + "आ" + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ui/android/res/xml/symbols.xml b/src/ui/android/res/xml/symbols_page1.xml similarity index 100% rename from src/ui/android/res/xml/symbols.xml rename to src/ui/android/res/xml/symbols_page1.xml diff --git a/src/ui/android/res/xml/symbols_shift.xml b/src/ui/android/res/xml/symbols_page2.xml similarity index 100% rename from src/ui/android/res/xml/symbols_shift.xml rename to src/ui/android/res/xml/symbols_page2.xml diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/Language.java b/src/ui/android/src/org/grammaticalframework/ui/android/Language.java index 51f4c39fa..000206045 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/Language.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/Language.java @@ -8,14 +8,25 @@ public class Language implements Serializable { private final String mLangCode; private final String mLangName; private final String mConcrete; - private final int mKeyboardResource; + private final int mKeyboardPage1Resource; + private final int mKeyboardPage2Resource; public Language(String langCode, String langName, String concrete, int keyboardResource) { mLangCode = langCode; mLangName = langName; mConcrete = concrete; - mKeyboardResource = keyboardResource; + mKeyboardPage1Resource = keyboardResource; + mKeyboardPage2Resource = keyboardResource; + } + + public Language(String langCode, String langName, String concrete, + int keyboardPage1Resource, int keyboardPage2Resource) { + mLangCode = langCode; + mLangName = langName; + mConcrete = concrete; + mKeyboardPage1Resource = keyboardPage1Resource; + mKeyboardPage2Resource = keyboardPage2Resource; } public String getLangCode() { @@ -26,8 +37,12 @@ public class Language implements Serializable { return mLangName; } - public int getKeyboardResource() { - return mKeyboardResource; + public int getKeyboardPage1Resource() { + return mKeyboardPage1Resource; + } + + public int getKeyboardPage2Resource() { + return mKeyboardPage2Resource; } String getConcrete() { diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java b/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java index d84aa4e55..ad12983ff 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java @@ -35,7 +35,7 @@ public class Translator { new Language("cmn-Hans-CN", "Chinese", "ParseChi", R.xml.qwerty), new Language("fr-FR", "French", "ParseFre", R.xml.qwerty), new Language("de-DE", "German", "ParseGer", R.xml.qwerty), - new Language("hi-IN", "Hindi", "ParseHin", R.xml.qwerty), /// + new Language("hi-IN", "Hindi", "ParseHin", R.xml.devanagari_page1, R.xml.devanagari_page2), new Language("sv-SE", "Swedish", "ParseSwe", R.xml.qwerty), new Language("fi-FI", "Finnish", "ParseFin", R.xml.qwerty), }; diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorInputMethodService.java b/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorInputMethodService.java index 62dddd519..098f205b3 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorInputMethodService.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorInputMethodService.java @@ -29,9 +29,10 @@ public class TranslatorInputMethodService extends InputMethodService private long mLastShiftTime; private long mMetaState; - private TranslatorKeyboard mSymbolsKeyboard; - private TranslatorKeyboard mSymbolsShiftedKeyboard; - private TranslatorKeyboard mLanguageKeyboard; + private TranslatorKeyboard mSymbolsPage1Keyboard; + private TranslatorKeyboard mSymbolsPage2Keyboard; + private TranslatorKeyboard mLanguagePage1Keyboard; + private TranslatorKeyboard mLanguagePage2Keyboard; private TranslatorKeyboard mCurKeyboard; @@ -45,9 +46,10 @@ public class TranslatorInputMethodService extends InputMethodService mTranslator = ((GFTranslator) getApplicationContext()).getTranslator(); - mSymbolsKeyboard = null; - mSymbolsShiftedKeyboard = null; - mLanguageKeyboard = null; + mSymbolsPage1Keyboard = null; + mSymbolsPage2Keyboard = null; + mLanguagePage1Keyboard = null; + mLanguagePage2Keyboard = null; } @Override @@ -92,17 +94,20 @@ public class TranslatorInputMethodService extends InputMethodService mCompletionOn = false; mCompletions = null; - int res = - mTranslator.getSourceLanguage().getKeyboardResource(); + int res1 = + mTranslator.getSourceLanguage().getKeyboardPage1Resource(); + int res2 = + mTranslator.getSourceLanguage().getKeyboardPage2Resource(); mModeId = R.string.normalKeyboardMode; if (attribute.extras != null && !attribute.extras.getBoolean("show_language_toggle", true)) { mModeId = R.string.internalKeyboardMode; } mAttribute = attribute; - mLanguageKeyboard = new TranslatorKeyboard(this, res, mModeId); - mSymbolsKeyboard = new TranslatorKeyboard(this, R.xml.symbols, mModeId); - mSymbolsShiftedKeyboard = new TranslatorKeyboard(this, R.xml.symbols_shift, mModeId); + mLanguagePage1Keyboard = new TranslatorKeyboard(this, res1, mModeId); + mLanguagePage2Keyboard = new TranslatorKeyboard(this, res2, mModeId); + mSymbolsPage1Keyboard = new TranslatorKeyboard(this, R.xml.symbols_page1, mModeId); + mSymbolsPage2Keyboard = new TranslatorKeyboard(this, R.xml.symbols_page2, mModeId); // We are now going to initialize our state based on the type of // text being edited. @@ -111,13 +116,13 @@ public class TranslatorInputMethodService extends InputMethodService case InputType.TYPE_CLASS_DATETIME: // Numbers and dates default to the symbols keyboard, with // no extra features. - mCurKeyboard = mSymbolsKeyboard; + mCurKeyboard = mSymbolsPage1Keyboard; break; case InputType.TYPE_CLASS_PHONE: // Phones will also default to the symbols keyboard, though // often you will want to have a dedicated phone keyboard. - mCurKeyboard = mSymbolsKeyboard; + mCurKeyboard = mSymbolsPage1Keyboard; break; case InputType.TYPE_CLASS_TEXT: @@ -125,7 +130,7 @@ public class TranslatorInputMethodService extends InputMethodService // normal alphabetic keyboard, and assume that we should // be doing predictive text (showing candidates as the // user types). - mCurKeyboard = mLanguageKeyboard; + mCurKeyboard = mLanguagePage1Keyboard; mPredictionOn = true; // We now look for a few special variations of text that will @@ -165,12 +170,13 @@ public class TranslatorInputMethodService extends InputMethodService default: // For all unknown input types, default to the alphabetic // keyboard with no special features. - mCurKeyboard = mLanguageKeyboard; + mCurKeyboard = mLanguagePage1Keyboard; updateShiftKeyState(attribute); } mActionId = attribute.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION); - mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions); + mLanguagePage1Keyboard.setImeOptions(getResources(), attribute.imeOptions); + mLanguagePage2Keyboard.setImeOptions(getResources(), attribute.imeOptions); mInstance = this; } @@ -189,7 +195,7 @@ public class TranslatorInputMethodService extends InputMethodService // its window. setCandidatesViewShown(false); - mCurKeyboard = mLanguageKeyboard; + mCurKeyboard = mLanguagePage1Keyboard; if (mInputView != null) { mInputView.closing(); } @@ -332,8 +338,9 @@ public class TranslatorInputMethodService extends InputMethodService * editor state. */ private void updateShiftKeyState(EditorInfo attr) { - if (attr != null - && mInputView != null && mLanguageKeyboard == mInputView.getKeyboard()) { + if (attr != null && mInputView != null && + (mLanguagePage1Keyboard == mInputView.getKeyboard() || + mLanguagePage2Keyboard == mInputView.getKeyboard())) { int caps = 0; EditorInfo ei = getCurrentInputEditorInfo(); if (ei != null && ei.inputType != InputType.TYPE_NULL) { @@ -379,19 +386,28 @@ public class TranslatorInputMethodService extends InputMethodService mTranslator.getAvailableLanguages().get(TranslatorKeyboard.KEYCODE_TARGET_LANGUAGE-primaryCode-1); mTranslator.setTargetLanguage(newTarget); handleChangeTargetLanguage(newTarget); - } else if (primaryCode == TranslatorKeyboard.KEYCODE_MODE_CHANGE - && mInputView != null) { + } else if (primaryCode == TranslatorKeyboard.KEYCODE_MODE_CHANGE && + mInputView != null) { TranslatorKeyboard current = (TranslatorKeyboard) mInputView.getKeyboard(); - if (current == mSymbolsKeyboard || current == mSymbolsShiftedKeyboard) { - current = mLanguageKeyboard; + if (current == mSymbolsPage1Keyboard || current == mSymbolsPage2Keyboard) { + current = mLanguagePage1Keyboard; } else { - current = mSymbolsKeyboard; + current = mSymbolsPage1Keyboard; } mInputView.setKeyboard(current); - if (current == mSymbolsKeyboard) { + if (current == mSymbolsPage1Keyboard) { current.setShifted(false); } - } else if (primaryCode == 10) { + } else if (primaryCode == TranslatorKeyboard.KEYCODE_PAGE_CHANGE && + mInputView != null) { + TranslatorKeyboard current = (TranslatorKeyboard) mInputView.getKeyboard(); + if (current == mLanguagePage1Keyboard) { + current = mLanguagePage2Keyboard; + } else { + current = mLanguagePage1Keyboard; + } + mInputView.setKeyboard(current); + } else if (primaryCode == 10) { if ((mActionId & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0) getCurrentInputConnection().performEditorAction(mActionId & EditorInfo.IME_MASK_ACTION); else @@ -469,18 +485,19 @@ public class TranslatorInputMethodService extends InputMethodService } TranslatorKeyboard currentKeyboard = (TranslatorKeyboard) mInputView.getKeyboard(); - if (mLanguageKeyboard == currentKeyboard) { + if (mLanguagePage1Keyboard == currentKeyboard || + mLanguagePage2Keyboard == currentKeyboard) { // Alphabet keyboard checkToggleCapsLock(); mInputView.setShifted(mCapsLock || !mInputView.isShifted()); - } else if (currentKeyboard == mSymbolsKeyboard) { - mSymbolsKeyboard.setShifted(true); - mInputView.setKeyboard(mSymbolsShiftedKeyboard); - mSymbolsShiftedKeyboard.setShifted(true); - } else if (currentKeyboard == mSymbolsShiftedKeyboard) { - mSymbolsShiftedKeyboard.setShifted(false); - mInputView.setKeyboard(mSymbolsKeyboard); - mSymbolsKeyboard.setShifted(false); + } else if (currentKeyboard == mSymbolsPage1Keyboard) { + mSymbolsPage1Keyboard.setShifted(true); + mInputView.setKeyboard(mSymbolsPage2Keyboard); + mSymbolsPage2Keyboard.setShifted(true); + } else if (currentKeyboard == mSymbolsPage2Keyboard) { + mSymbolsPage2Keyboard.setShifted(false); + mInputView.setKeyboard(mSymbolsPage1Keyboard); + mSymbolsPage1Keyboard.setShifted(false); } } @@ -491,7 +508,9 @@ public class TranslatorInputMethodService extends InputMethodService } } - mComposing.append((char) primaryCode); + for (int i = 0; i < keyCodes.length && keyCodes[i] > 0; i++) + mComposing.append((char) keyCodes[i]); + if (primaryCode == 10) commitTyped(getCurrentInputConnection()); else @@ -511,17 +530,18 @@ public class TranslatorInputMethodService extends InputMethodService void handleChangeSourceLanguage(Language newSource) { updateLanguageKeyboard(newSource); - mSymbolsKeyboard.updateLanguageKeyLabels(); - mSymbolsShiftedKeyboard.updateLanguageKeyLabels(); + mSymbolsPage1Keyboard.updateLanguageKeyLabels(); + mSymbolsPage2Keyboard.updateLanguageKeyLabels(); if (mInputView != null) { mInputView.setKeyboard(mCurKeyboard); } } void handleChangeTargetLanguage(Language newTarget) { - mLanguageKeyboard.updateLanguageKeyLabels(); - mSymbolsKeyboard.updateLanguageKeyLabels(); - mSymbolsShiftedKeyboard.updateLanguageKeyLabels(); + mLanguagePage1Keyboard.updateLanguageKeyLabels(); + mLanguagePage2Keyboard.updateLanguageKeyLabels(); + mSymbolsPage1Keyboard.updateLanguageKeyLabels(); + mSymbolsPage2Keyboard.updateLanguageKeyLabels(); if (mInputView != null) { mInputView.invalidateAllKeys(); } @@ -530,20 +550,26 @@ public class TranslatorInputMethodService extends InputMethodService void handleSwitchLanguages() { Language newSource = mTranslator.getSourceLanguage(); updateLanguageKeyboard(newSource); - mSymbolsKeyboard.updateLanguageKeyLabels(); - mSymbolsShiftedKeyboard.updateLanguageKeyLabels(); + mSymbolsPage1Keyboard.updateLanguageKeyLabels(); + mSymbolsPage2Keyboard.updateLanguageKeyLabels(); if (mInputView != null) mInputView.setKeyboard(mCurKeyboard); } private void updateLanguageKeyboard(Language language) { - TranslatorKeyboard keyboard = - new TranslatorKeyboard(this, language.getKeyboardResource(), mModeId); - keyboard.setImeOptions(getResources(), mAttribute.imeOptions); - if (mCurKeyboard == mLanguageKeyboard) { - mCurKeyboard = keyboard; + TranslatorKeyboard keyboard1 = + new TranslatorKeyboard(this, language.getKeyboardPage1Resource(), mModeId); + TranslatorKeyboard keyboard2 = + new TranslatorKeyboard(this, language.getKeyboardPage2Resource(), mModeId); + keyboard1.setImeOptions(getResources(), mAttribute.imeOptions); + keyboard2.setImeOptions(getResources(), mAttribute.imeOptions); + if (mCurKeyboard == mLanguagePage1Keyboard) { + mCurKeyboard = keyboard1; + } else if (mCurKeyboard == mLanguagePage2Keyboard) { + mCurKeyboard = keyboard2; } - mLanguageKeyboard = keyboard; + mLanguagePage1Keyboard = keyboard1; + mLanguagePage2Keyboard = keyboard2; } private void checkToggleCapsLock() { diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboard.java b/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboard.java index 0f2b25738..876f660da 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboard.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboard.java @@ -14,6 +14,7 @@ public class TranslatorKeyboard extends Keyboard { private Key mSourceLanguageKey; private Key mTargetLanguageKey; + static final int KEYCODE_PAGE_CHANGE = -10; static final int KEYCODE_SOURCE_LANGUAGE = -100; static final int KEYCODE_TARGET_LANGUAGE = -200; static final int MAX_LANGUAGE_KEYCODES = 99;