diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java index 0ea114754..a07c27f0f 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java @@ -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. * diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardIconsSet.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardIconsSet.kt index 553edad1e..6b82ae9fd 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardIconsSet.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardIconsSet.kt @@ -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 }) } } } diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt index 55250513e..bf5c65f04 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt @@ -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 diff --git a/app/src/main/java/helium314/keyboard/latin/common/Constants.java b/app/src/main/java/helium314/keyboard/latin/common/Constants.java index ff8ef330e..64e129bda 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/Constants.java +++ b/app/src/main/java/helium314/keyboard/latin/common/Constants.java @@ -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); diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index c4ad7c0e5..83d008642 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -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)}. diff --git a/app/src/main/java/helium314/keyboard/latin/settings/AppearanceSettingsFragment.kt b/app/src/main/java/helium314/keyboard/latin/settings/AppearanceSettingsFragment.kt index 0a72a4fcc..5cc61aca0 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/AppearanceSettingsFragment.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/AppearanceSettingsFragment.kt @@ -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("custom_background_image")?.setOnPreferenceClickListener { onClickLoadImage(false) } findPreference("custom_background_image_landscape")?.setOnPreferenceClickListener { onClickLoadImage(true) } findPreference("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) { 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 32507b8dd..9089d62da 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -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); 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 c42825e22..52b81d269 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -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); diff --git a/app/src/main/java/helium314/keyboard/latin/utils/ToolbarUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/ToolbarUtils.kt index a14a5ff65..cb088f254 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/ToolbarUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/ToolbarUtils.kt @@ -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 } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d98108329..e1e2abc52 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -48,10 +48,14 @@ Experimental Miscellaneous - + Enable split keyboard - + + Enable split keyboard (landscape) + Split distance + + Split distance (landscape) Switch to other input methods @@ -269,6 +273,7 @@ @android:string/selectAll Select word One-handed mode + Split keyboard Full left Full right Page start diff --git a/app/src/main/res/xml/prefs_screen_appearance.xml b/app/src/main/res/xml/prefs_screen_appearance.xml index 46b653adb..715d3cf67 100644 --- a/app/src/main/res/xml/prefs_screen_appearance.xml +++ b/app/src/main/res/xml/prefs_screen_appearance.xml @@ -93,6 +93,18 @@ latin:minValue="50" latin:maxValue="200" /> + + + +