From 63651969a5202048510ecead5f630962479d5f1b Mon Sep 17 00:00:00 2001 From: "Md. Rifat Hasan Jihan" <31377578+RHJihan@users.noreply.github.com> Date: Thu, 23 Jan 2025 18:57:54 +0600 Subject: [PATCH] Improve behavior for language swipe cycling Implement logic to stop cycling through Switch languages swipe when all subtypes are cycled. --- .../keyboard/KeyboardActionListener.java | 3 ++ .../keyboard/KeyboardActionListenerImpl.kt | 10 +++++-- .../keyboard/keyboard/PointerTracker.java | 1 + .../settings/AdvancedSettingsFragment.kt | 30 +++++++++++++++++++ .../keyboard/latin/settings/Settings.java | 13 ++++++++ .../latin/settings/SettingsValues.java | 2 ++ app/src/main/res/values-bn/strings.xml | 1 + app/src/main/res/values/config-common.xml | 5 ++++ app/src/main/res/values/strings.xml | 2 ++ .../main/res/xml/prefs_screen_advanced.xml | 7 +++++ 10 files changed, 72 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListener.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListener.java index 224337f34..d5b1267bf 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListener.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListener.java @@ -97,6 +97,7 @@ public interface KeyboardActionListener { */ boolean onHorizontalSpaceSwipe(int steps); boolean onVerticalSpaceSwipe(int steps); + void resetSubtypeSwitchCount(); boolean toggleNumpad(boolean withSliding, boolean forceReturnToAlpha); void onMoveDeletePointer(int steps); @@ -148,6 +149,8 @@ public interface KeyboardActionListener { return false; } @Override + public void resetSubtypeSwitchCount() {} + @Override public void onMoveDeletePointer(int steps) {} @Override public void onUpWithDeletePointerActive() {} diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt index faf9b963b..3b111e322 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt @@ -17,6 +17,7 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp private val keyboardSwitcher = KeyboardSwitcher.getInstance() private val settings = Settings.getInstance() + private var mSubtypeSwitchCount = 0 // for use with onLanguageSlide() private var metaState = 0 // is this enough, or are there threading issues with the different PointerTrackers? // todo: maybe keep meta state presses to KeyboardActionListenerImpl, and avoid calls to press/release key @@ -84,6 +85,10 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp else -> false } + override fun resetSubtypeSwitchCount(){ + mSubtypeSwitchCount = 0 + } + override fun toggleNumpad(withSliding: Boolean, forceReturnToAlpha: Boolean): Boolean { KeyboardSwitcher.getInstance().toggleNumpad(withSliding, latinIME.currentAutoCapsState, latinIME.currentRecapitalizeState, forceReturnToAlpha) return true @@ -124,9 +129,9 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp } private fun onLanguageSlide(steps: Int): Boolean { - if (abs(steps) < 4) return false + if (abs(steps) < settings.current.mLanguageSwipeDistance) return false val subtypes = RichInputMethodManager.getInstance().getMyEnabledInputMethodSubtypeList(false) - if (subtypes.size <= 1) { // only allow if we have more than one subtype + if (subtypes.size - 1 <= abs(mSubtypeSwitchCount)) { // only allow if we are yet to cycle through all subtypes return false } // decide next or previous dependent on up or down @@ -136,6 +141,7 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp if (wantedIndex < 0) wantedIndex += subtypes.size KeyboardSwitcher.getInstance().switchToSubtype(subtypes[wantedIndex]) + if (steps > 0) mSubtypeSwitchCount++ else mSubtypeSwitchCount-- return true } diff --git a/app/src/main/java/helium314/keyboard/keyboard/PointerTracker.java b/app/src/main/java/helium314/keyboard/keyboard/PointerTracker.java index f47dc3ea6..588bc641c 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/PointerTracker.java +++ b/app/src/main/java/helium314/keyboard/keyboard/PointerTracker.java @@ -1076,6 +1076,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element, if (mInHorizontalSwipe || mInVerticalSwipe) { mInHorizontalSwipe = false; mInVerticalSwipe = false; + sListener.resetSubtypeSwitchCount(); return; } } diff --git a/app/src/main/java/helium314/keyboard/latin/settings/AdvancedSettingsFragment.kt b/app/src/main/java/helium314/keyboard/latin/settings/AdvancedSettingsFragment.kt index 946bf1aa2..c2dc11101 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/AdvancedSettingsFragment.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/AdvancedSettingsFragment.kt @@ -25,6 +25,7 @@ import androidx.preference.PreferenceManager import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import helium314.keyboard.dictionarypack.DictionaryPackConstants +import helium314.keyboard.keyboard.KeyboardActionListener import helium314.keyboard.latin.utils.ChecksumCalculator import helium314.keyboard.keyboard.KeyboardLayoutSet import helium314.keyboard.keyboard.KeyboardSwitcher @@ -125,6 +126,8 @@ class AdvancedSettingsFragment : SubScreenFragment() { } setupKeyLongpressTimeoutSettings() setupEmojiSdkSetting() + setupLanguageSwipeDistanceSettings() + updateLangSwipeDistanceVisibility(sharedPreferences) findPreference("load_gesture_library")?.setOnPreferenceClickListener { onClickLoadLibrary() } findPreference("backup_restore")?.setOnPreferenceClickListener { showBackupRestoreDialog() } @@ -560,10 +563,37 @@ class AdvancedSettingsFragment : SubScreenFragment() { }) } + private fun setupLanguageSwipeDistanceSettings() { + val prefs = sharedPreferences + findPreference(Settings.PREF_LANGUAGE_SWIPE_DISTANCE)?.setInterface(object : ValueProxy { + override fun writeValue(value: Int, key: String) = prefs.edit().putInt(key, value).apply() + + override fun writeDefaultValue(key: String) = prefs.edit().remove(key).apply() + + override fun readValue(key: String) = Settings.readLanguageSwipeDistance(prefs, resources) + + override fun readDefaultValue(key: String) = Settings.readDefaultLanguageSwipeDistance(resources) + + override fun getValueText(value: Int) = value.toString() + + override fun feedbackValue(value: Int) {} + }) + } + + private fun updateLangSwipeDistanceVisibility(prefs: SharedPreferences) { + val horizontalSpaceSwipe = Settings.readHorizontalSpaceSwipe(prefs) + val verticalSpaceSwipe = Settings.readVerticalSpaceSwipe(prefs) + val visibility = horizontalSpaceSwipe == KeyboardActionListener.SWIPE_SWITCH_LANGUAGE + || verticalSpaceSwipe == KeyboardActionListener.SWIPE_SWITCH_LANGUAGE + setPreferenceVisible(Settings.PREF_LANGUAGE_SWIPE_DISTANCE, visibility) + } + override fun onSharedPreferenceChanged(prefs: SharedPreferences, key: String?) { when (key) { Settings.PREF_SHOW_SETUP_WIZARD_ICON -> SystemBroadcastReceiver.toggleAppIcon(requireContext()) Settings.PREF_MORE_POPUP_KEYS -> KeyboardLayoutSet.onSystemLocaleChanged() + Settings.PREF_SPACE_HORIZONTAL_SWIPE -> updateLangSwipeDistanceVisibility(prefs) + Settings.PREF_SPACE_VERTICAL_SWIPE -> updateLangSwipeDistanceVisibility(prefs) Settings.PREF_EMOJI_MAX_SDK -> KeyboardSwitcher.getInstance().forceUpdateKeyboardTheme(requireContext()) } } diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 446a3f0ca..e8800d013 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -151,6 +151,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_MORE_POPUP_KEYS = "more_popup_keys"; public static final String PREF_SPACE_TO_CHANGE_LANG = "prefs_long_press_keyboard_to_change_lang"; + public static final String PREF_LANGUAGE_SWIPE_DISTANCE = "language_swipe_distance"; public static final String PREF_ENABLE_CLIPBOARD_HISTORY = "enable_clipboard_history"; public static final String PREF_CLIPBOARD_HISTORY_RETENTION_TIME = "clipboard_history_retention_time"; @@ -447,6 +448,18 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang }; } + public static int readLanguageSwipeDistance(final SharedPreferences prefs, + final Resources res) { + final int sensitivity = prefs.getInt( + PREF_LANGUAGE_SWIPE_DISTANCE, UNDEFINED_PREFERENCE_VALUE_INT); + return (sensitivity != UNDEFINED_PREFERENCE_VALUE_INT) ? sensitivity + : readDefaultLanguageSwipeDistance(res); + } + + public static int readDefaultLanguageSwipeDistance(final Resources res) { + return res.getInteger(R.integer.config_default_language_swipe_distance); + } + public static boolean readDeleteSwipeEnabled(final SharedPreferences prefs) { return prefs.getBoolean(PREF_DELETE_SWIPE, true); } diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index eae7b375f..cf2f5baec 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -80,6 +80,7 @@ public class SettingsValues { public final boolean mBlockPotentiallyOffensive; public final int mSpaceSwipeHorizontal; public final int mSpaceSwipeVertical; + public final int mLanguageSwipeDistance; public final boolean mDeleteSwipeEnabled; public final boolean mAutospaceAfterPunctuationEnabled; public final boolean mClipboardHistoryEnabled; @@ -227,6 +228,7 @@ public class SettingsValues { mDisplayOrientation = res.getConfiguration().orientation; mSpaceSwipeHorizontal = Settings.readHorizontalSpaceSwipe(prefs); mSpaceSwipeVertical = Settings.readVerticalSpaceSwipe(prefs); + mLanguageSwipeDistance = Settings.readLanguageSwipeDistance(prefs, res); mDeleteSwipeEnabled = Settings.readDeleteSwipeEnabled(prefs); mAutospaceAfterPunctuationEnabled = Settings.readAutospaceAfterPunctuationEnabled(prefs); mClipboardHistoryEnabled = Settings.readClipboardHistoryEnabled(prefs); diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index e435e95b6..bdee0e28d 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -377,6 +377,7 @@ নম্বর প্যাডের জন্য প্রতীক বোতামে দীর্ঘ চাপ টুলবারের পরিবর্তনশীল দিক ডান থেকে বাম কিবোর্ড নির্বাচন করলে দিক বিপরীত হবে + ভাষা পরিবর্তন অভিস্পর্শের দূরত্ব %s (শিক্ষার্থী) ভাষা পরিবর্তন বোতামের আচরণ পিন করে রাখা টুলবার বোতাম নির্বাচন diff --git a/app/src/main/res/values/config-common.xml b/app/src/main/res/values/config-common.xml index aea0abfd9..ce77fed55 100644 --- a/app/src/main/res/values/config-common.xml +++ b/app/src/main/res/values/config-common.xml @@ -30,6 +30,11 @@ false 100 + 10 + 2 + 18 + 1 + 300 700 100 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 322cadd77..766f6a744 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -946,6 +946,8 @@ New dictionary: Variable toolbar direction Reverse direction when a right-to-left keyboard subtype is selected + + Switch language swipe distance Customize toolbar key codes diff --git a/app/src/main/res/xml/prefs_screen_advanced.xml b/app/src/main/res/xml/prefs_screen_advanced.xml index 2ecddb6c9..dc359d4d4 100644 --- a/app/src/main/res/xml/prefs_screen_advanced.xml +++ b/app/src/main/res/xml/prefs_screen_advanced.xml @@ -43,6 +43,13 @@ android:title="@string/show_vertical_space_swipe" latin:singleLineTitle="false" /> + +