diff --git a/java/res/values/strings-uix.xml b/java/res/values/strings-uix.xml index aa146b7b89..4f42809c8d 100644 --- a/java/res/values/strings-uix.xml +++ b/java/res/values/strings-uix.xml @@ -440,6 +440,11 @@ Hold Move cursor Switch language + Language swipe distance + Shorter distance makes the language swipe more sensitive + + + %sdp Numbers diff --git a/java/src/org/futo/inputmethod/keyboard/PointerTracker.java b/java/src/org/futo/inputmethod/keyboard/PointerTracker.java index 3f4cb6e3ec..6947256841 100644 --- a/java/src/org/futo/inputmethod/keyboard/PointerTracker.java +++ b/java/src/org/futo/inputmethod/keyboard/PointerTracker.java @@ -19,6 +19,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.os.SystemClock; +import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; @@ -97,10 +98,6 @@ public static void setStateHint(StateHint stateHint) { private static PointerTrackerParams sParams; private static final int sPointerStep = (int)(16.0 * Resources.getSystem().getDisplayMetrics().density); private static final int sPointerBigStep = (int)(32.0 * Resources.getSystem().getDisplayMetrics().density); - private static final int sPointerHugeStep = Integer.min( - (int)(128.0 * Resources.getSystem().getDisplayMetrics().density), - Resources.getSystem().getDisplayMetrics().widthPixels * 3 / 2 - ); private static GestureStrokeRecognitionParams sGestureStrokeRecognitionParams; private static GestureStrokeDrawingParams sGestureStrokeDrawingParams; @@ -157,6 +154,9 @@ public static void setStateHint(StateHint stateHint) { private boolean mStartedOnFastLongPress; private boolean mCursorMoved = false; private boolean mSpacebarLongPressed = false; + // A spacebar language swipe may only switch the language once per gesture, regardless of how + // far the finger travels. Changing two languages requires lifting and swiping again. + private boolean mLanguageSwiped = false; // true if keyboard layout has been changed. private boolean mKeyboardLayoutHasBeenChanged; @@ -760,6 +760,7 @@ private void onDownEventInternal(final int x, final int y, final long eventTime) mStartTime = System.currentTimeMillis(); mStartedOnFastLongPress = key.isFastLongPress(); mSpacebarLongPressed = false; + mLanguageSwiped = false; mIsSlidingCursor = key.getCode() == Constants.CODE_DELETE || key.getCode() == Constants.CODE_SPACE; mIsFlickingKey = !mIsSlidingCursor && key.getHasFlick(); @@ -976,7 +977,14 @@ private void onMoveEventInternal(final int x, final int y, final long eventTime) if(allowedBySettings) { int pointerStep = sPointerStep; if (settingsValues.mSpacebarSwipeMode == Settings.SPACEBAR_MODE_LANGUAGE && !mSpacebarLongPressed) { - pointerStep = sPointerHugeStep; + // The language-switch step distance is user-configurable in dp. The + // widthPixels*3/2 clamp is a safety bound for narrow screens. + final DisplayMetrics displayMetrics = + Resources.getSystem().getDisplayMetrics(); + pointerStep = Integer.min( + (int)(settingsValues.mSpacebarLanguageSwipeStepDp * displayMetrics.density), + displayMetrics.widthPixels * 3 / 2 + ); } int steps = (x - mStartX) / pointerStep; @@ -986,7 +994,12 @@ private void onMoveEventInternal(final int x, final int y, final long eventTime) mStartX += steps * pointerStep; if (settingsValues.mSpacebarSwipeMode == Settings.SPACEBAR_MODE_LANGUAGE && !mSpacebarLongPressed) { - sListener.onSwipeLanguage(steps); + // Cap the switch at one language per gesture, in the swipe's direction, + // independent of swipe distance/sensitivity. + if (!mLanguageSwiped) { + mLanguageSwiped = true; + sListener.onSwipeLanguage(Integer.signum(steps)); + } } else { sListener.onMovePointer(steps); } diff --git a/java/src/org/futo/inputmethod/latin/settings/Settings.java b/java/src/org/futo/inputmethod/latin/settings/Settings.java index 055c166a6c..fa7620793c 100644 --- a/java/src/org/futo/inputmethod/latin/settings/Settings.java +++ b/java/src/org/futo/inputmethod/latin/settings/Settings.java @@ -137,6 +137,12 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final int SPACEBAR_MODE_CURSOR = 1; public static final int SPACEBAR_MODE_LANGUAGE = 2; + // Per-step horizontal swipe distance (in dp) required to advance one language when the + // spacebar swipe mode is LANGUAGE. Default keeps the original hardcoded 128dp behaviour. + public static final String PREF_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY = + "pref_spacebar_language_swipe_sensitivity"; + public static final int DEFAULT_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY = 128; + public static final String PREF_BACKSPACE_MODE_HOLD = "pref_backspace_mode_hold"; public static final String PREF_BACKSPACE_MODE = "pref_backspace_mode"; public static final int BACKSPACE_MODE_CHARACTERS = 0; // Long-press backspace and swipe backspace removes just characters diff --git a/java/src/org/futo/inputmethod/latin/settings/SettingsValues.java b/java/src/org/futo/inputmethod/latin/settings/SettingsValues.java index 30803dc90a..0c26bf2fb6 100644 --- a/java/src/org/futo/inputmethod/latin/settings/SettingsValues.java +++ b/java/src/org/futo/inputmethod/latin/settings/SettingsValues.java @@ -108,6 +108,7 @@ public class SettingsValues { public final boolean mBackspaceUndoesAutocorrect; public final int mSpacebarSwipeMode; public final int mSpacebarHoldMode; + public final int mSpacebarLanguageSwipeStepDp; public final int mBackspaceMode; public final int mBackspaceModeHold; public final int mNumberRowMode; @@ -209,6 +210,8 @@ public SettingsValues(final Context context, final SharedPreferences prefs, fina legacySpacebarMode == Settings.SPACEBAR_MODE_SWIPE_LANGUAGE_LEGACY ? Settings.SPACEBAR_MODE_LANGUAGE : Settings.SPACEBAR_MODE_CURSOR); mSpacebarHoldMode = prefs.getInt(Settings.PREF_SPACEBAR_HOLD_MODE, legacySpacebarMode == Settings.SPACEBAR_MODE_SWIPE_CURSOR_LEGACY ? Settings.SPACEBAR_MODE_LANGUAGE : Settings.SPACEBAR_MODE_CURSOR); + mSpacebarLanguageSwipeStepDp = prefs.getInt(Settings.PREF_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY, + Settings.DEFAULT_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY); mBackspaceMode = prefs.getInt(Settings.PREF_BACKSPACE_MODE, Settings.BACKSPACE_MODE_CHARACTERS); mBackspaceModeHold = prefs.getInt(Settings.PREF_BACKSPACE_MODE_HOLD, mBackspaceMode); @@ -580,6 +583,8 @@ public String dump() { sb.append("" + mBackspaceUndoesAutocorrect); sb.append("\n mBackspaceMode = "); sb.append("" + mBackspaceMode); + sb.append("\n mSpacebarLanguageSwipeStepDp = "); + sb.append("" + mSpacebarLanguageSwipeStepDp); sb.append("\n mNumberRowMode = "); sb.append("" + mNumberRowMode); sb.append("\n mAltSpacesMode = "); diff --git a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt index 0218653c24..518e59be4a 100644 --- a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt +++ b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt @@ -636,6 +636,24 @@ val LongPressMenu = UserSettingsMenu( ) }, + UserSetting( + name = R.string.morekey_settings_spacebar_language_swipe_distance, + subtitle = R.string.morekey_settings_spacebar_language_swipe_distance_subtitle, + ) { + val resources = LocalResources.current + SettingSliderSharedPrefsInt( + title = stringResource(R.string.morekey_settings_spacebar_language_swipe_distance), + subtitle = stringResource(R.string.morekey_settings_spacebar_language_swipe_distance_subtitle), + key = Settings.PREF_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY, + default = Settings.DEFAULT_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY, + range = 24.0f..160.0f, + hardRange = 24.0f..160.0f, + transform = { it.roundToInt() }, + indicator = { resources.getString(R.string.abbreviation_unit_dp, "$it") }, + steps = 16 + ) + }, + // TODO: Might not work well for showing up in search UserSetting(name = R.string.morekey_settings_layout) { val context = LocalContext.current