diff options
| author | Menny Even Danan <menny@evendanan.net> | 2016-02-14 02:34:31 +0000 |
|---|---|---|
| committer | Menny Even Danan <menny@evendanan.net> | 2016-02-14 02:34:31 +0000 |
| commit | f3184eac09caf3bb6e76e679633d8e46a217e171 (patch) | |
| tree | b71f1da3ac011221aa93137967401cf7d758c8e4 | |
| parent | bf778db8b3f5f320032c4affad7bd32f0d2f85f4 (diff) | |
| download | AnySoftKeyboard-f3184eac09caf3bb6e76e679633d8e46a217e171.tar.gz AnySoftKeyboard-f3184eac09caf3bb6e76e679633d8e46a217e171.tar.bz2 | |
Automatically switch to app's layout. #465
8 files changed, 100 insertions, 56 deletions
diff --git a/src/main/java/com/anysoftkeyboard/AskPrefs.java b/src/main/java/com/anysoftkeyboard/AskPrefs.java index 7589e4b73..a790af366 100644 --- a/src/main/java/com/anysoftkeyboard/AskPrefs.java +++ b/src/main/java/com/anysoftkeyboard/AskPrefs.java @@ -123,4 +123,6 @@ public interface AskPrefs { long getFirstTimeAppInstalled(); long getTimeCurrentVersionInstalled(); + + boolean getPersistLayoutForPackageId(); } diff --git a/src/main/java/com/anysoftkeyboard/AskPrefsImpl.java b/src/main/java/com/anysoftkeyboard/AskPrefsImpl.java index 729d62693..f0d3aea85 100644 --- a/src/main/java/com/anysoftkeyboard/AskPrefsImpl.java +++ b/src/main/java/com/anysoftkeyboard/AskPrefsImpl.java @@ -101,6 +101,7 @@ public class AskPrefsImpl implements AskPrefs, OnSharedPreferenceChangeListener private int mFirstAppVersionInstalled; private final LinkedList<OnSharedPreferenceChangeListener> mPreferencesChangedListeners = new LinkedList<>(); + private boolean mAutomaticallySwitchToAppLayout = true; public AskPrefsImpl(Context context) { mContext = context; @@ -530,6 +531,10 @@ public class AskPrefsImpl implements AskPrefs, OnSharedPreferenceChangeListener mContext.getResources().getBoolean(R.bool.settings_default_always_use_fallback_user_dictionary)); Log.d(TAG, "** mAlwaysUseFallBackUserDictionary: " + mAlwaysUseFallBackUserDictionary); + mAutomaticallySwitchToAppLayout = sp.getBoolean(mContext.getString(R.string.settings_key_persistent_layout_per_package_id), + mContext.getResources().getBoolean(R.bool.settings_default_persistent_layout_per_package_id)); + Log.d(TAG, "** mAutomaticallySwitchToAppLayout: " + mAutomaticallySwitchToAppLayout); + //Some preferences cause rebuild of the keyboard, hence changing the listeners list final LinkedList<OnSharedPreferenceChangeListener> disconnectedList = new LinkedList<>(mPreferencesChangedListeners); for (OnSharedPreferenceChangeListener listener : disconnectedList) { @@ -819,4 +824,9 @@ public class AskPrefsImpl implements AskPrefs, OnSharedPreferenceChangeListener public boolean alwaysUseFallBackUserDictionary() { return mAlwaysUseFallBackUserDictionary; } + + @Override + public boolean getPersistLayoutForPackageId() { + return mAutomaticallySwitchToAppLayout; + } }
\ No newline at end of file diff --git a/src/main/java/com/anysoftkeyboard/keyboards/KeyboardSwitcher.java b/src/main/java/com/anysoftkeyboard/keyboards/KeyboardSwitcher.java index 9c8ecfc36..a8fc9d543 100644 --- a/src/main/java/com/anysoftkeyboard/keyboards/KeyboardSwitcher.java +++ b/src/main/java/com/anysoftkeyboard/keyboards/KeyboardSwitcher.java @@ -20,6 +20,8 @@ import android.content.Context; import android.content.res.Resources; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.util.ArrayMap; +import android.text.TextUtils; import android.view.inputmethod.EditorInfo; import com.anysoftkeyboard.AnySoftKeyboard; import com.anysoftkeyboard.addons.AddOn; @@ -86,10 +88,12 @@ public class KeyboardSwitcher { private boolean mKeyboardLocked = false; private int mLastSelectedKeyboard = 0; + //this will hold the last used + private final ArrayMap<String, Integer> mAlphabetKeyboardIndexByPackageId = new ArrayMap<>(); // private int mImeOptions; private boolean mAlphabetMode = true; - private int mLastKeyboardMode; + private EditorInfo mLastEditorInfo; private int mLatinKeyboardIndex; private final KeyboardDimens mKeyboardDimens; @@ -209,6 +213,8 @@ public class KeyboardSwitcher { public void flushKeyboardsCache() { mAlphabetKeyboards = EMPTY_AnyKeyboards; mSymbolsKeyboardsArray = EMPTY_AnyKeyboards; + mAlphabetKeyboardIndexByPackageId.clear(); + mLastSelectedKeyboard = 0; } private synchronized void ensureKeyboardsAreBuilt() { @@ -218,8 +224,8 @@ public class KeyboardSwitcher { mAlphabetKeyboardsCreators = enabledKeyboardBuilders.toArray(new KeyboardAddOnAndBuilder[enabledKeyboardBuilders.size()]); mLatinKeyboardIndex = findLatinKeyboardIndex(); mAlphabetKeyboards = new AnyKeyboard[mAlphabetKeyboardsCreators.length]; - if (mLastSelectedKeyboard >= mAlphabetKeyboards.length) - mLastSelectedKeyboard = 0; + mLastSelectedKeyboard = 0; + mAlphabetKeyboardIndexByPackageId.clear(); } if (mSymbolsKeyboardsArray.length == 0) { mSymbolsKeyboardsArray = new AnyKeyboard[SYMBOLS_KEYBOARDS_COUNT]; @@ -274,24 +280,29 @@ public class KeyboardSwitcher { mKeyboardLocked = true; keyboard = getSymbolsKeyboard(SYMBOLS_KEYBOARD_PHONE_INDEX, getKeyboardMode(attr)); break; - case MODE_URL: - case MODE_EMAIL: - // starting with English, but only in non-restarting mode - // this is a fix for issue #62 - if (!restarting && mLatinKeyboardIndex >= 0) { - mLastSelectedKeyboard = mLatinKeyboardIndex; - } - // note: letting it fall-through to the default branch default: mKeyboardLocked = false; + if ((!restarting && mLatinKeyboardIndex >= 0) && (mode == MODE_URL || mode == MODE_EMAIL)) { + // starting with English, but only in non-restarting mode + // this is a fix for issue #62 + mLastSelectedKeyboard = mLatinKeyboardIndex; + } else { + //trying to re-use last keyboard the user used in this input field. + if (AnyApplication.getConfig().getPersistLayoutForPackageId() && (!TextUtils.isEmpty(attr.packageName)) && mAlphabetKeyboardIndexByPackageId.containsKey(attr.packageName)) { + int reusedKeyboardIndex = mAlphabetKeyboardIndexByPackageId.get(attr.packageName); + if (reusedKeyboardIndex < mAlphabetKeyboards.length && reusedKeyboardIndex >= 0) { + Log.d(TAG, "Reusing keyboard at index %d for app %s", reusedKeyboardIndex, attr.packageName); + mLastSelectedKeyboard = reusedKeyboardIndex; + } + } + } // I'll start with a new alphabet keyboard if // 1) this is a non-restarting session, which means it is a brand // new input field. - // 2) this is a restarting, but the mode what change (probably to - // Normal). + // 2) this is a restarting, but the mode what change (probably to Normal). if (!restarting || mMode != previousMode) { mAlphabetMode = true; - keyboard = getAlphabetKeyboard(mLastSelectedKeyboard, getKeyboardMode(attr)); + keyboard = getAlphabetKeyboard(mLastSelectedKeyboard, attr); } else { // just keep doing what you did before. keyboard = getCurrentKeyboard(); @@ -311,23 +322,23 @@ public class KeyboardSwitcher { } private int getKeyboardMode(EditorInfo attr) { - if (attr == null) - return mLastKeyboardMode = KEYBOARD_MODE_NORMAL; + mLastEditorInfo = attr; + if (attr == null) return KEYBOARD_MODE_NORMAL; int variation = attr.inputType & EditorInfo.TYPE_MASK_VARIATION; switch (variation) { case EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS: case EditorInfo.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS: - return mLastKeyboardMode = KEYBOARD_MODE_EMAIL; + return KEYBOARD_MODE_EMAIL; case EditorInfo.TYPE_TEXT_VARIATION_URI: - return mLastKeyboardMode = KEYBOARD_MODE_URL; + return KEYBOARD_MODE_URL; case EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE: case EditorInfo.TYPE_TEXT_VARIATION_EMAIL_SUBJECT: case EditorInfo.TYPE_TEXT_VARIATION_LONG_MESSAGE: - return mLastKeyboardMode = KEYBOARD_MODE_IM; + return KEYBOARD_MODE_IM; default: - return mLastKeyboardMode = KEYBOARD_MODE_NORMAL; + return KEYBOARD_MODE_NORMAL; } } @@ -342,7 +353,7 @@ public class KeyboardSwitcher { final int keyboardsCount = getAlphabetKeyboards().length; for (int keyboardIndex = 0; keyboardIndex < keyboardsCount; keyboardIndex++) { - current = getAlphabetKeyboard(keyboardIndex, getKeyboardMode(currentEditorInfo)); + current = getAlphabetKeyboard(keyboardIndex, currentEditorInfo); if (current.getKeyboardPrefId().equals(keyboardId)) { mAlphabetMode = true; mLastSelectedKeyboard = keyboardIndex; @@ -434,7 +445,7 @@ public class KeyboardSwitcher { if (mLastSelectedKeyboard >= keyboardsCount) mLastSelectedKeyboard = 0; - current = getAlphabetKeyboard(mLastSelectedKeyboard, getKeyboardMode(currentEditorInfo)); + current = getAlphabetKeyboard(mLastSelectedKeyboard, currentEditorInfo); // returning to the regular symbols keyboard, no matter what mLastSelectedSymbolsKeyboard = 0; @@ -445,7 +456,7 @@ public class KeyboardSwitcher { mLastSelectedKeyboard++; if (mLastSelectedKeyboard >= keyboardsCount) mLastSelectedKeyboard = 0; - current = getAlphabetKeyboard(mLastSelectedKeyboard, getKeyboardMode(currentEditorInfo)); + current = getAlphabetKeyboard(mLastSelectedKeyboard, currentEditorInfo); testsLeft--; } // if we scanned all keyboards... we screwed... @@ -504,27 +515,29 @@ public class KeyboardSwitcher { } public AnyKeyboard getCurrentKeyboard() { - if (isAlphabetMode()) - return getAlphabetKeyboard(mLastSelectedKeyboard, mLastKeyboardMode); - else - return getSymbolsKeyboard(mLastSelectedSymbolsKeyboard, mLastKeyboardMode); + if (isAlphabetMode()) { + return getAlphabetKeyboard(mLastSelectedKeyboard, mLastEditorInfo); + } else { + return getSymbolsKeyboard(mLastSelectedSymbolsKeyboard, getKeyboardMode(mLastEditorInfo)); + } } @NonNull - private synchronized AnyKeyboard getAlphabetKeyboard(int index, int mode) { + private synchronized AnyKeyboard getAlphabetKeyboard(int index, EditorInfo editorInfo) { AnyKeyboard[] keyboards = getAlphabetKeyboards(); if (index >= keyboards.length) index = 0; AnyKeyboard keyboard = keyboards[index]; + final int mode = getKeyboardMode(editorInfo); if (keyboard == null || keyboard.getKeyboardMode() != mode) { KeyboardAddOnAndBuilder creator = mAlphabetKeyboardsCreators[index]; if ((keyboard = keyboards[index] = createKeyboardFromCreator(mode, creator)) == null) { //this is bad... Maybe the keyboard plugin was uninstalled and we did not detect. flushKeyboardsCache(); index = 0;//we always have the built-in English keyboard - return getAlphabetKeyboard(index, mode); + return getAlphabetKeyboard(index, editorInfo); } else { if (mInputView != null) { keyboard.loadKeyboard(mInputView.getThemedKeyboardDimens()); @@ -535,6 +548,9 @@ public class KeyboardSwitcher { } } } + if (editorInfo != null && !TextUtils.isEmpty(editorInfo.packageName)) { + mAlphabetKeyboardIndexByPackageId.put(editorInfo.packageName, index); + } return keyboard; } diff --git a/src/main/res/values/settings_defaults_dont_translate.xml b/src/main/res/values/settings_defaults_dont_translate.xml index 1bc12513d..c9d912376 100644 --- a/src/main/res/values/settings_defaults_dont_translate.xml +++ b/src/main/res/values/settings_defaults_dont_translate.xml @@ -63,6 +63,8 @@ <bool name="settings_default_allow_suggestions_restart">true</bool> <bool name="settings_default_switch_to_alphabet_on_space">true</bool> + <bool name="settings_default_persistent_layout_per_package_id">true</bool> + <string name="swipe_action_value_shift">shift</string> <string name="swipe_action_value_none">none</string> <string name="swipe_action_value_next_alphabet">next_alphabet</string> diff --git a/src/main/res/values/settings_keys_dont_translate.xml b/src/main/res/values/settings_keys_dont_translate.xml index 7227662c4..36428f642 100644 --- a/src/main/res/values/settings_keys_dont_translate.xml +++ b/src/main/res/values/settings_keys_dont_translate.xml @@ -246,7 +246,7 @@ <string name="settings_key_allow_suggestions_restart">settings_key_allow_suggestions_restart</string> <string name="settings_key_switch_keyboard_on_space">settings_key_switch_keyboard_on_space</string> - + <string name="settings_key_persistent_layout_per_package_id">settings_key_persistent_layout_per_package_id</string> <string name="settings_key_first_app_version_installed">settings_key_first_app_version_installed</string> <string name="settings_key_first_time_app_installed">settings_key_first_time_app_installed</string> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index d2c2ef810..ea3a38af4 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -102,11 +102,13 @@ <string name="custom_sound_volume">Custom key-press volume</string> <string name="switch_keyboard_on_space">Space switches keyboards</string> - <string name="switch_keyboard_on_space_on_summary">Switch from symbols/numbers to alphabet when pressing space - </string> - <string name="switch_keyboard_on_space_off_summary">Do not switch from symbols/numbers to alphabet when pressing - space - </string> + <string name="switch_keyboard_on_space_on_summary">Switch from symbols/numbers to alphabet when pressing space</string> + <string name="switch_keyboard_on_space_off_summary">Do not switch from symbols/numbers to alphabet when pressing space</string> + + <string name="persistent_layout_per_package_id_title">Remember alphabet layout per App</string> + <string name="persistent_layout_per_package_id_off_summary">Use the same layout for all Apps.</string> + <string name="persistent_layout_per_package_id_on_summary">Automatically switch to the previous layout used in the App.</string> + <string name="one_shot_quick_text_popup">Auto close after key</string> <string name="one_shot_quick_text_popup_on_summary">Close Quick-Text popup after pressing a key</string> <string name="one_shot_quick_text_popup_off_summary">Keep Quick-Text popup open until Close key is pressed</string> diff --git a/src/main/res/xml/prefs_addtional_language_prefs.xml b/src/main/res/xml/prefs_addtional_language_prefs.xml index c4a03b4cb..37a6217d6 100644 --- a/src/main/res/xml/prefs_addtional_language_prefs.xml +++ b/src/main/res/xml/prefs_addtional_language_prefs.xml @@ -43,24 +43,33 @@ android:summaryOff="" android:summaryOn="@string/allow_suggestions_restart_summary" android:title="@string/allow_suggestions_restart"/> - </PreferenceCategory> - <CheckBoxPreference - android:defaultValue="@bool/settings_default_switch_to_alphabet_on_space" - android:key="@string/settings_key_switch_keyboard_on_space" - android:persistent="true" - android:summaryOff="@string/switch_keyboard_on_space_off_summary" - android:summaryOn="@string/switch_keyboard_on_space_on_summary" - android:title="@string/switch_keyboard_on_space"/> - - <CheckBoxPreference - android:defaultValue="true" - android:key="double_space_to_period" - android:persistent="true" - android:summaryOff="" - android:summaryOn="@string/double_space_to_period_summary" - android:title="@string/double_space_to_period"/> + <CheckBoxPreference + android:defaultValue="@bool/settings_default_switch_to_alphabet_on_space" + android:key="@string/settings_key_switch_keyboard_on_space" + android:persistent="true" + android:summaryOff="@string/switch_keyboard_on_space_off_summary" + android:summaryOn="@string/switch_keyboard_on_space_on_summary" + android:title="@string/switch_keyboard_on_space"/> + + <CheckBoxPreference + android:defaultValue="true" + android:key="double_space_to_period" + android:persistent="true" + android:summaryOff="" + android:summaryOn="@string/double_space_to_period_summary" + android:title="@string/double_space_to_period"/> + + <CheckBoxPreference + android:defaultValue="@bool/settings_default_persistent_layout_per_package_id" + android:key="@string/settings_key_persistent_layout_per_package_id" + android:persistent="true" + android:summaryOff="@string/persistent_layout_per_package_id_off_summary" + android:summaryOn="@string/persistent_layout_per_package_id_on_summary" + android:title="@string/persistent_layout_per_package_id_title"/> + + </PreferenceCategory> <PreferenceCategory android:key="hardware_keys_group" diff --git a/src/test/java/com/anysoftkeyboard/AnySoftKeyboardKeyboardPersistentLayoutTest.java b/src/test/java/com/anysoftkeyboard/AnySoftKeyboardKeyboardPersistentLayoutTest.java index 525d2a4af..49b08a9df 100644 --- a/src/test/java/com/anysoftkeyboard/AnySoftKeyboardKeyboardPersistentLayoutTest.java +++ b/src/test/java/com/anysoftkeyboard/AnySoftKeyboardKeyboardPersistentLayoutTest.java @@ -1,6 +1,7 @@ package com.anysoftkeyboard; import android.content.SharedPreferences; +import android.content.res.Configuration; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.view.inputmethod.EditorInfo; @@ -8,6 +9,7 @@ import android.view.inputmethod.EditorInfo; import com.anysoftkeyboard.api.KeyCodes; import com.anysoftkeyboard.keyboards.KeyboardFactory; import com.menny.android.anysoftkeyboard.AskGradleTestRunner; +import com.menny.android.anysoftkeyboard.R; import org.junit.After; import org.junit.Assert; @@ -20,19 +22,21 @@ import org.robolectric.util.ServiceController; @RunWith(AskGradleTestRunner.class) public class AnySoftKeyboardKeyboardPersistentLayoutTest { - private ServiceController<TestableAnySoftKeyboard> mAnySoftKeyboardController; private TestableAnySoftKeyboard mAnySoftKeyboardUnderTest; @Before public void setUp() throws Exception { + RuntimeEnvironment.application.getResources().getConfiguration().keyboard = Configuration.KEYBOARD_NOKEYS; //enabling the second english keyboard Assert.assertEquals(1, KeyboardFactory.getEnabledKeyboards(RuntimeEnvironment.application).size()); final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(RuntimeEnvironment.application); sharedPreferences.edit().putBoolean("keyboard_12335055-4aa6-49dc-8456-c7d38a1a5123", true).commit(); Assert.assertEquals(2, KeyboardFactory.getEnabledKeyboards(RuntimeEnvironment.application).size()); //starting service - mAnySoftKeyboardController = Robolectric.buildService(TestableAnySoftKeyboard.class); - mAnySoftKeyboardUnderTest = mAnySoftKeyboardController.attach().create().get(); + ServiceController<TestableAnySoftKeyboard> anySoftKeyboardController = Robolectric.buildService(TestableAnySoftKeyboard.class); + mAnySoftKeyboardUnderTest = anySoftKeyboardController.attach().create().get(); + + mAnySoftKeyboardUnderTest.onCreateInputView(); } @After @@ -44,7 +48,6 @@ public class AnySoftKeyboardKeyboardPersistentLayoutTest { editorInfo.packageName = packageId; editorInfo.fieldId = packageId == null ? 0 : packageId.hashCode(); - mAnySoftKeyboardUnderTest.onCreateInputView(); mAnySoftKeyboardUnderTest.onStartInput(editorInfo, false); if (mAnySoftKeyboardUnderTest.onShowInputRequested(0, false)) { mAnySoftKeyboardUnderTest.onStartInputView(editorInfo, false); @@ -140,7 +143,7 @@ public class AnySoftKeyboardKeyboardPersistentLayoutTest { @Test public void testLayoutNotPersistentWithPackageIdIfPrefIsDisabled() { final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(RuntimeEnvironment.application); - sharedPreferences.edit().putBoolean("sskdlfjsldkfsd"/*TODO use actual pref-key here*/, false).commit(); + sharedPreferences.edit().putBoolean(RuntimeEnvironment.application.getString(R.string.settings_key_persistent_layout_per_package_id), false).commit(); AskPrefs askPrefs = new AskPrefsImpl(RuntimeEnvironment.application); Assert.assertFalse(askPrefs.getPersistLayoutForPackageId()); |
