Add toolbar option to toggle Split Keyboard Setting - Enhancement #1218 (#1263)

---------

Co-authored-by: Josh <joshtidal24@gmail.com>
Co-authored-by: Helium314 <helium314@mailbox.org>
This commit is contained in:
PurplePickleMonster 2025-02-09 05:32:16 -05:00 committed by GitHub
parent c0b3e76741
commit 679754bb2d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 74 additions and 17 deletions

View file

@ -505,6 +505,16 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
Settings.getInstance().writeOneHandedModeGravity(mKeyboardViewWrapper.getOneHandedGravity());
}
public void toggleSplitKeyboardMode() {
final Settings settings = Settings.getInstance();
settings.writeSplitKeyboardEnabled(
!settings.getCurrent().mIsSplitKeyboardEnabled,
mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE
);
loadKeyboard(mLatinIME.getCurrentInputEditorInfo(), settings.getCurrent(),
mLatinIME.getCurrentAutoCapsState(), mLatinIME.getCurrentRecapitalizeState());
}
/**
* Displays a toast message.
*

View file

@ -152,6 +152,7 @@ class KeyboardIconsSet private constructor() {
ToolbarKey.FULL_RIGHT -> R.drawable.ic_to_end
ToolbarKey.PAGE_START -> R.drawable.ic_page_start
ToolbarKey.PAGE_END -> R.drawable.ic_page_end
ToolbarKey.SPLIT -> R.drawable.ic_ime_switcher
})
}
} }
@ -212,6 +213,7 @@ class KeyboardIconsSet private constructor() {
ToolbarKey.FULL_RIGHT -> R.drawable.ic_to_end
ToolbarKey.PAGE_START -> R.drawable.ic_page_start
ToolbarKey.PAGE_END -> R.drawable.ic_page_end
ToolbarKey.SPLIT -> R.drawable.ic_ime_switcher
})
}
} }
@ -272,6 +274,7 @@ class KeyboardIconsSet private constructor() {
ToolbarKey.FULL_RIGHT -> R.drawable.ic_to_end_rounded
ToolbarKey.PAGE_START -> R.drawable.ic_page_start_rounded
ToolbarKey.PAGE_END -> R.drawable.ic_page_end_rounded
ToolbarKey.SPLIT -> R.drawable.ic_ime_switcher
})
}
} }

View file

@ -179,7 +179,7 @@ object KeyCode {
FN, CLIPBOARD_CLEAR_HISTORY, NUMPAD,
// heliboard only
SYMBOL_ALPHA, TOGGLE_ONE_HANDED_MODE, SWITCH_ONE_HANDED_MODE, SHIFT_ENTER,
SYMBOL_ALPHA, TOGGLE_ONE_HANDED_MODE, SWITCH_ONE_HANDED_MODE, SPLIT_LAYOUT, SHIFT_ENTER,
ACTION_NEXT, ACTION_PREVIOUS, NOT_SPECIFIED, CLIPBOARD_COPY_ALL, WORD_LEFT, WORD_RIGHT, PAGE_UP,
PAGE_DOWN, META, TAB, ESCAPE, INSERT, SLEEP, MEDIA_PLAY, MEDIA_PAUSE, MEDIA_PLAY_PAUSE, MEDIA_NEXT,
MEDIA_PREVIOUS, VOL_UP, VOL_DOWN, MUTE, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BACK

View file

@ -226,6 +226,7 @@ public final class Constants {
case CODE_SPACE: return "space";
case KeyCode.TOGGLE_ONE_HANDED_MODE: return "toggleOneHandedMode";
case KeyCode.SWITCH_ONE_HANDED_MODE: return "switchOneHandedMode";
case KeyCode.SPLIT_LAYOUT: return "splitLayout";
case KeyCode.NUMPAD: return "numpad";
default:
if (code < CODE_SPACE) return String.format("\\u%02X", code);

View file

@ -773,6 +773,9 @@ public final class InputLogic {
case KeyCode.REDO:
sendDownUpKeyEventWithMetaState(KeyEvent.KEYCODE_Z, KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON);
break;
case KeyCode.SPLIT_LAYOUT:
KeyboardSwitcher.getInstance().toggleSplitKeyboardMode();
break;
case KeyCode.VOICE_INPUT:
// switching to shortcut IME, shift state, keyboard,... is handled by LatinIME,
// {@link KeyboardSwitcher#onEvent(Event)}, or {@link #onPressKey(int,int,boolean)} and {@link #onReleaseKey(int,boolean)}.

View file

@ -62,8 +62,10 @@ class AppearanceSettingsFragment : SubScreenFragment() {
private val dayNightPref: TwoStatePreference? by lazy { preferenceScreen.findPreference(Settings.PREF_THEME_DAY_NIGHT) }
private val userColorsPref: Preference by lazy { preferenceScreen.findPreference("theme_select_colors")!! }
private val userColorsPrefNight: Preference? by lazy { preferenceScreen.findPreference("theme_select_colors_night") }
private val splitPref: TwoStatePreference? by lazy { preferenceScreen.findPreference(Settings.PREF_ENABLE_SPLIT_KEYBOARD) }
private val splitLandscapePref: TwoStatePreference? by lazy { preferenceScreen.findPreference(Settings.PREF_ENABLE_SPLIT_KEYBOARD_LANDSCAPE) }
private val splitPortraitPref: TwoStatePreference? by lazy { preferenceScreen.findPreference(Settings.PREF_ENABLE_SPLIT_KEYBOARD) }
private val splitScalePref: Preference? by lazy { preferenceScreen.findPreference(Settings.PREF_SPLIT_SPACER_SCALE) }
private val splitScaleLandscapePref: Preference? by lazy { preferenceScreen.findPreference(Settings.PREF_SPLIT_SPACER_SCALE_LANDSCAPE) }
private val dayImageFilePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode != Activity.RESULT_OK) return@registerForActivityResult
@ -112,12 +114,20 @@ class AppearanceSettingsFragment : SubScreenFragment() {
setupScalePrefs(Settings.PREF_SIDE_PADDING_SCALE_LANDSCAPE, 0f)
if (splitScalePref != null) {
setupScalePrefs(Settings.PREF_SPLIT_SPACER_SCALE, SettingsValues.DEFAULT_SIZE_SCALE)
splitScalePref?.isVisible = splitPref?.isChecked == true
splitPref?.setOnPreferenceChangeListener { _, value ->
splitScalePref?.isVisible = splitPortraitPref?.isChecked == true
splitPortraitPref?.setOnPreferenceChangeListener { _, value ->
splitScalePref?.isVisible = value as Boolean
true
}
}
if (splitScaleLandscapePref != null) {
setupScalePrefs(Settings.PREF_SPLIT_SPACER_SCALE_LANDSCAPE, SettingsValues.DEFAULT_SIZE_SCALE)
splitScaleLandscapePref?.isVisible = splitLandscapePref?.isChecked == true
splitLandscapePref?.setOnPreferenceChangeListener { _, value ->
splitScaleLandscapePref?.isVisible = value as Boolean
true
}
}
findPreference<Preference>("custom_background_image")?.setOnPreferenceClickListener { onClickLoadImage(false) }
findPreference<Preference>("custom_background_image_landscape")?.setOnPreferenceClickListener { onClickLoadImage(true) }
findPreference<Preference>("custom_font")?.setOnPreferenceClickListener { onClickCustomFont() }
@ -155,13 +165,6 @@ class AppearanceSettingsFragment : SubScreenFragment() {
removePreference("theme_select_colors_night")
}
}
val metrics = requireContext().resources.displayMetrics
val widthDp = TypedValueCompat.pxToDp(metrics.widthPixels.toFloat(), metrics)
val heightDp = TypedValueCompat.pxToDp(metrics.heightPixels.toFloat(), metrics)
if ((min(widthDp, heightDp) < 600 && max(widthDp, heightDp) < 720)) {
removePreference(Settings.PREF_ENABLE_SPLIT_KEYBOARD)
removePreference(Settings.PREF_SPLIT_SPACER_SCALE)
}
}
private fun setColorPrefs(style: String) {

View file

@ -109,7 +109,9 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
public static final String PREF_VARIABLE_TOOLBAR_DIRECTION = "var_toolbar_direction";
public static final String PREF_ADDITIONAL_SUBTYPES = "additional_subtypes";
public static final String PREF_ENABLE_SPLIT_KEYBOARD = "split_keyboard";
public static final String PREF_ENABLE_SPLIT_KEYBOARD_LANDSCAPE = "split_keyboard_landscape";
public static final String PREF_SPLIT_SPACER_SCALE = "split_spacer_scale";
public static final String PREF_SPLIT_SPACER_SCALE_LANDSCAPE = "split_spacer_scale_landscape";
public static final String PREF_KEYBOARD_HEIGHT_SCALE = "keyboard_height_scale";
public static final String PREF_BOTTOM_PADDING_SCALE = "bottom_padding_scale";
public static final String PREF_BOTTOM_PADDING_SCALE_LANDSCAPE = "bottom_padding_scale_landscape";
@ -518,6 +520,21 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
(getCurrent().mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT), gravity).apply();
}
public void writeSplitKeyboardEnabled(final boolean enabled, final boolean isLandscape) {
final String pref = isLandscape ? PREF_ENABLE_SPLIT_KEYBOARD_LANDSCAPE : PREF_ENABLE_SPLIT_KEYBOARD;
mPrefs.edit().putBoolean(pref, enabled).apply();
}
public static boolean readSplitKeyboardEnabled(final SharedPreferences prefs, final boolean isLandscape) {
final String pref = isLandscape ? PREF_ENABLE_SPLIT_KEYBOARD_LANDSCAPE : PREF_ENABLE_SPLIT_KEYBOARD;
return prefs.getBoolean(pref, false);
}
public static float readSplitSpacerScale(final SharedPreferences prefs, final boolean isLandscape) {
final String pref = isLandscape ? PREF_SPLIT_SPACER_SCALE_LANDSCAPE : PREF_SPLIT_SPACER_SCALE;
return prefs.getFloat(pref, SettingsValues.DEFAULT_SIZE_SCALE);
}
public static float readBottomPaddingScale(final SharedPreferences prefs, final boolean landscape) {
if (landscape)
return prefs.getFloat(PREF_BOTTOM_PADDING_SCALE_LANDSCAPE, 0f);

View file

@ -157,6 +157,7 @@ public class SettingsValues {
public SettingsValues(final Context context, final SharedPreferences prefs, final Resources res,
@NonNull final InputAttributes inputAttributes) {
mLocale = ConfigurationCompatKt.locale(res.getConfiguration());
mDisplayOrientation = res.getConfiguration().orientation;
// Store the input attributes
mInputAttributes = inputAttributes;
@ -202,11 +203,12 @@ public class SettingsValues {
mSuggestClipboardContent = readSuggestClipboardContent(prefs, res);
mDoubleSpacePeriodTimeout = res.getInteger(R.integer.config_double_space_period_timeout);
mHasHardwareKeyboard = Settings.readHasHardwareKeyboard(res.getConfiguration());
final boolean isLandscape = mDisplayOrientation == Configuration.ORIENTATION_LANDSCAPE;
final float displayWidthDp = TypedValueCompat.pxToDp(res.getDisplayMetrics().widthPixels, res.getDisplayMetrics());
mIsSplitKeyboardEnabled = prefs.getBoolean(Settings.PREF_ENABLE_SPLIT_KEYBOARD, false) && displayWidthDp > 600; // require display width of 600 dp for split
mIsSplitKeyboardEnabled = Settings.readSplitKeyboardEnabled(prefs, isLandscape);
// determine spacerWidth from display width and scale setting
mSplitKeyboardSpacerRelativeWidth = mIsSplitKeyboardEnabled
? Math.min(Math.max((displayWidthDp - 600) / 600f + 0.15f, 0.15f), 0.35f) * prefs.getFloat(Settings.PREF_SPLIT_SPACER_SCALE, DEFAULT_SIZE_SCALE)
? Math.min(Math.max((displayWidthDp - 600) / 600f + 0.15f, 0.15f), 0.35f) * Settings.readSplitSpacerScale(prefs, isLandscape)
: 0f;
mQuickPinToolbarKeys = prefs.getBoolean(Settings.PREF_QUICK_PIN_TOOLBAR_KEYS, false);
mScreenMetrics = Settings.readScreenMetrics(res);
@ -230,7 +232,6 @@ public class SettingsValues {
mIncognitoModeEnabled = Settings.readAlwaysIncognitoMode(prefs) || mInputAttributes.mNoLearning
|| mInputAttributes.mIsPasswordField;
mKeyboardHeightScale = prefs.getFloat(Settings.PREF_KEYBOARD_HEIGHT_SCALE, DEFAULT_SIZE_SCALE);
mDisplayOrientation = res.getConfiguration().orientation;
mSpaceSwipeHorizontal = Settings.readHorizontalSpaceSwipe(prefs);
mSpaceSwipeVertical = Settings.readVerticalSpaceSwipe(prefs);
mLanguageSwipeDistance = Settings.readLanguageSwipeDistance(prefs, res);

View file

@ -64,6 +64,7 @@ private fun setToolbarButtonActivatedState(button: ImageButton) {
button.isActivated = when (button.tag) {
INCOGNITO -> Settings.readAlwaysIncognitoMode(DeviceProtectedUtils.getSharedPreferences(button.context))
ONE_HANDED -> Settings.getInstance().current.mOneHandedModeEnabled
SPLIT -> Settings.getInstance().current.mIsSplitKeyboardEnabled
AUTOCORRECT -> Settings.getInstance().current.mAutoCorrectionEnabledPerUserSettings
else -> true
}
@ -99,6 +100,7 @@ fun getCodeForToolbarKey(key: ToolbarKey) = Settings.getInstance().getCustomTool
FULL_RIGHT -> KeyCode.MOVE_END_OF_LINE
PAGE_START -> KeyCode.MOVE_START_OF_PAGE
PAGE_END -> KeyCode.MOVE_END_OF_PAGE
SPLIT -> KeyCode.SPLIT_LAYOUT
}
fun getCodeForToolbarKeyLongClick(key: ToolbarKey) = Settings.getInstance().getCustomToolbarLongpressCode(key) ?: when (key) {
@ -122,7 +124,7 @@ fun getCodeForToolbarKeyLongClick(key: ToolbarKey) = Settings.getInstance().getC
// names need to be aligned with resources strings (using lowercase of key.name)
enum class ToolbarKey {
VOICE, CLIPBOARD, NUMPAD, UNDO, REDO, SETTINGS, SELECT_ALL, SELECT_WORD, COPY, CUT, PASTE, ONE_HANDED,
VOICE, CLIPBOARD, NUMPAD, UNDO, REDO, SETTINGS, SELECT_ALL, SELECT_WORD, COPY, CUT, PASTE, ONE_HANDED, SPLIT,
INCOGNITO, AUTOCORRECT, CLEAR_CLIPBOARD, CLOSE_HISTORY, EMOJI, LEFT, RIGHT, UP, DOWN, WORD_LEFT, WORD_RIGHT,
PAGE_UP, PAGE_DOWN, FULL_LEFT, FULL_RIGHT, PAGE_START, PAGE_END
}

View file

@ -48,10 +48,14 @@
<string name="settings_category_experimental">Experimental</string>
<!-- Settings category title for Appearance & Layout/Misc [CHAR LIMIT=33] -->
<string name="settings_category_miscellaneous">Miscellaneous</string>
<!-- Option for enabling or disabling the split keyboard layout. [CHAR LIMIT=65]-->
<!-- Option for enabling or disabling the split keyboard layout in portrait mode. [CHAR LIMIT=65]-->
<string name="enable_split_keyboard">Enable split keyboard</string>
<!-- Option for setting distance for split keyboard -->
<!-- Option for enabling or disabling the split keyboard layout in landscape mode. [CHAR LIMIT=65]-->
<string name="enable_split_keyboard_landscape">Enable split keyboard (landscape)</string>
<!-- Option for setting distance for split keyboard in portrait mode -->
<string name="split_spacer_scale">Split distance</string>
<!-- Option for setting distance for split keyboard in landscape mode -->
<string name="split_spacer_scale_landscape">Split distance (landscape)</string>
<!-- Option name for including other IMEs in the language key switch list [CHAR LIMIT=30] -->
<string name="language_switch_key_switch_input_method">Switch to other input methods</string>
<!-- Option name for switching language / subtype only [CHAR LIMIT=30] -->
@ -269,6 +273,7 @@
<string name="select_all" tools:keep="@string/select_all" translatable="false">@android:string/selectAll</string>
<string name="select_word" tools:keep="@string/select_word">Select word</string>
<string name="one_handed" tools:keep="@string/one_handed">One-handed mode</string>
<string name="split" tools:keep="@string/split">Split keyboard</string>
<string name="full_left" tools:keep="@string/full_left">Full left</string>
<string name="full_right" tools:keep="@string/full_right">Full right</string>
<string name="page_start" tools:keep="@string/page_start">Page start</string>

View file

@ -93,6 +93,18 @@
latin:minValue="50"
latin:maxValue="200" /> <!-- percentage -->
<SwitchPreference
android:key="split_keyboard_landscape"
android:title="@string/enable_split_keyboard_landscape"
android:persistent="true"
android:defaultValue="false" />
<helium314.keyboard.latin.settings.SeekBarDialogPreference
android:key="split_spacer_scale_landscape"
android:title="@string/split_spacer_scale_landscape"
latin:minValue="50"
latin:maxValue="200" /> <!-- percentage -->
<SwitchPreference
android:key="narrow_key_gaps"
android:title="@string/prefs_narrow_key_gaps"