diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java index 2b679dd26..76a6d56df 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java @@ -20,6 +20,7 @@ import android.view.View; import android.view.animation.AnimationUtils; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodSubtype; +import android.widget.FrameLayout; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.TextView; @@ -49,8 +50,8 @@ import helium314.keyboard.latin.utils.Log; import helium314.keyboard.latin.utils.RecapitalizeStatus; import helium314.keyboard.latin.utils.ResourceUtils; import helium314.keyboard.latin.utils.ScriptUtils; -import helium314.keyboard.latin.utils.SubtypeLocaleUtils; import helium314.keyboard.latin.utils.SubtypeUtilsAdditional; +import helium314.keyboard.latin.utils.ToolbarMode; public final class KeyboardSwitcher implements KeyboardState.SwitchActions { private static final String TAG = KeyboardSwitcher.class.getSimpleName(); @@ -64,6 +65,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { private LinearLayout mClipboardStripView; private HorizontalScrollView mClipboardStripScrollView; private SuggestionStripView mSuggestionStripView; + private FrameLayout mStripContainer; private ClipboardHistoryView mClipboardHistoryView; private TextView mFakeToastView; private LatinIME mLatinIME; @@ -307,6 +309,8 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { @NonNull final SettingsValues settingsValues, @NonNull final KeyboardSwitchState toggleState) { final int visibility = isImeSuppressedByHardwareKeyboard(settingsValues, toggleState) ? View.GONE : View.VISIBLE; + final int stripVisibility = settingsValues.mToolbarMode == ToolbarMode.HIDDEN ? View.GONE : View.VISIBLE; + mStripContainer.setVisibility(stripVisibility); PointerTracker.switchTo(mKeyboardView); mKeyboardView.setVisibility(visibility); // The visibility of {@link #mKeyboardView} must be aligned with {@link #MainKeyboardFrame}. @@ -317,7 +321,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { mEmojiPalettesView.stopEmojiPalettes(); mEmojiTabStripView.setVisibility(View.GONE); mClipboardStripScrollView.setVisibility(View.GONE); - mSuggestionStripView.setVisibility(View.VISIBLE); + mSuggestionStripView.setVisibility(stripVisibility); mClipboardHistoryView.setVisibility(View.GONE); mClipboardHistoryView.stopClipboardHistory(); } @@ -334,6 +338,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { // @see LatinIME#onComputeInset(android.inputmethodservice.InputMethodService.Insets) mKeyboardView.setVisibility(View.GONE); mSuggestionStripView.setVisibility(View.GONE); + mStripContainer.setVisibility(getSecondaryStripVisibility()); mClipboardStripScrollView.setVisibility(View.GONE); mEmojiTabStripView.setVisibility(View.VISIBLE); mClipboardHistoryView.setVisibility(View.GONE); @@ -355,6 +360,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { mKeyboardView.setVisibility(View.GONE); mEmojiTabStripView.setVisibility(View.GONE); mSuggestionStripView.setVisibility(View.GONE); + mStripContainer.setVisibility(getSecondaryStripVisibility()); mClipboardStripScrollView.post(() -> mClipboardStripScrollView.fullScroll(HorizontalScrollView.FOCUS_RIGHT)); mClipboardStripScrollView.setVisibility(View.VISIBLE); mEmojiPalettesView.setVisibility(View.GONE); @@ -539,6 +545,10 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { } } + private static int getSecondaryStripVisibility() { + return Settings.getValues().mSecondaryStripVisible? View.VISIBLE : View.GONE; + } + // Displays a toast-like message with the provided text for a specified duration. private void showFakeToast(final String text, final int timeMillis) { if (mFakeToastView.getVisibility() == View.VISIBLE) return; @@ -606,6 +616,10 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { return mKeyboardView.isShowingPopupKeysPanel(); } + public boolean isShowingStripContainer() { + return mStripContainer.isShown(); + } + public View getVisibleKeyboardView() { if (isShowingEmojiPalettes()) { return mEmojiPalettesView; @@ -631,6 +645,8 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { return mKeyboardView; } + public FrameLayout getStripContainer() { return mStripContainer; } + public void deallocateMemory() { if (mKeyboardView != null) { mKeyboardView.cancelAllOngoingEvents(); @@ -684,6 +700,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { mClipboardStripView = mCurrentInputView.findViewById(R.id.clipboard_strip); mClipboardStripScrollView = mCurrentInputView.findViewById(R.id.clipboard_strip_scroll_view); mSuggestionStripView = mCurrentInputView.findViewById(R.id.suggestion_strip_view); + mStripContainer = mCurrentInputView.findViewById(R.id.strip_container); prefs.registerOnSharedPreferenceChangeListener(mSuggestionStripView); prefs.registerOnSharedPreferenceChangeListener(mClipboardHistoryView); diff --git a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt index 0f0cb756f..931146cb1 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt @@ -30,6 +30,7 @@ import helium314.keyboard.latin.common.Constants import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.ResourceUtils import helium314.keyboard.latin.utils.ToolbarKey +import helium314.keyboard.latin.utils.ToolbarMode import helium314.keyboard.latin.utils.createToolbarKey import helium314.keyboard.latin.utils.getCodeForToolbarKey import helium314.keyboard.latin.utils.getCodeForToolbarKeyLongClick @@ -68,8 +69,10 @@ class ClipboardHistoryView @JvmOverloads constructor( keyBackgroundId = keyboardViewAttr.getResourceId(R.styleable.KeyboardView_keyBackground, 0) keyboardViewAttr.recycle() val keyboardAttr = context.obtainStyledAttributes(attrs, R.styleable.Keyboard, defStyle, R.style.SuggestionStripView) - getEnabledClipboardToolbarKeys(context.prefs()) - .forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) } + if (Settings.getValues().mSecondaryStripVisible) { + getEnabledClipboardToolbarKeys(context.prefs()) + .forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) } + } keyboardAttr.recycle() fitsSystemWindows = true } @@ -79,7 +82,7 @@ class ClipboardHistoryView @JvmOverloads constructor( val res = context.resources // The main keyboard expands to the entire this {@link KeyboardView}. val width = ResourceUtils.getKeyboardWidth(context, Settings.getValues()) + paddingLeft + paddingRight - val height = ResourceUtils.getKeyboardHeight(res, Settings.getValues()) + paddingTop + paddingBottom + val height = ResourceUtils.getSecondaryKeyboardHeight(res, Settings.getValues()) + paddingTop + paddingBottom setMeasuredDimension(width, height) } diff --git a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt index c5edd6ab5..a07b30712 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt @@ -3,7 +3,6 @@ package helium314.keyboard.keyboard.clipboard import android.content.Context -import android.content.res.Resources import android.view.View import android.widget.FrameLayout import androidx.recyclerview.widget.RecyclerView @@ -22,7 +21,7 @@ class ClipboardLayoutParams(ctx: Context) { init { val res = ctx.resources val sv = Settings.getValues() - val defaultKeyboardHeight = ResourceUtils.getKeyboardHeight(res, sv) + val defaultKeyboardHeight = ResourceUtils.getSecondaryKeyboardHeight(res, sv) val defaultKeyboardWidth = ResourceUtils.getKeyboardWidth(ctx, sv) if (sv.mNarrowKeyGaps) { diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiLayoutParams.kt b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiLayoutParams.kt index b423ca44c..220997b8c 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiLayoutParams.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiLayoutParams.kt @@ -22,7 +22,7 @@ internal class EmojiLayoutParams(res: Resources) { init { val sv = Settings.getValues() - val defaultKeyboardHeight = ResourceUtils.getKeyboardHeight(res, sv) + val defaultKeyboardHeight = ResourceUtils.getSecondaryKeyboardHeight(res, sv) val keyVerticalGap = if (sv.mNarrowKeyGaps) { res.getFraction(R.fraction.config_key_vertical_gap_holo_narrow, diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java index 1999ef8f8..4023be50f 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java @@ -219,7 +219,7 @@ public final class EmojiPalettesView extends LinearLayout // The main keyboard expands to the entire this {@link KeyboardView}. final int width = ResourceUtils.getKeyboardWidth(getContext(), Settings.getValues()) + getPaddingLeft() + getPaddingRight(); - final int height = ResourceUtils.getKeyboardHeight(res, Settings.getValues()) + final int height = ResourceUtils.getSecondaryKeyboardHeight(res, Settings.getValues()) + getPaddingTop() + getPaddingBottom(); mEmojiCategoryPageIndicatorView.mWidth = width; setMeasuredDimension(width, height); @@ -243,8 +243,10 @@ public final class EmojiPalettesView extends LinearLayout if (initialized) return; mEmojiCategory.initialize(); mTabStrip = (LinearLayout) KeyboardSwitcher.getInstance().getEmojiTabStrip(); - for (final EmojiCategory.CategoryProperties properties : mEmojiCategory.getShownCategories()) { - addTab(mTabStrip, properties.mCategoryId); + if (Settings.getValues().mSecondaryStripVisible) { + for (final EmojiCategory.CategoryProperties properties : mEmojiCategory.getShownCategories()) { + addTab(mTabStrip, properties.mCategoryId); + } } mPager = findViewById(R.id.emoji_pager); @@ -404,13 +406,15 @@ public final class EmojiPalettesView extends LinearLayout mEmojiCategory.getCurrentCategoryId()), ! initial); } - final View old = mTabStrip.findViewWithTag((long) oldCategoryId); - final View current = mTabStrip.findViewWithTag((long) categoryId); + if (Settings.getValues().mSecondaryStripVisible) { + final View old = mTabStrip.findViewWithTag((long) oldCategoryId); + final View current = mTabStrip.findViewWithTag((long) categoryId); - if (old instanceof ImageView) - Settings.getValues().mColors.setColor((ImageView) old, ColorType.EMOJI_CATEGORY); - if (current instanceof ImageView) - Settings.getValues().mColors.setColor((ImageView) current, ColorType.EMOJI_CATEGORY_SELECTED); + if (old instanceof ImageView) + Settings.getValues().mColors.setColor((ImageView) old, ColorType.EMOJI_CATEGORY); + if (current instanceof ImageView) + Settings.getValues().mColors.setColor((ImageView) current, ColorType.EMOJI_CATEGORY_SELECTED); + } } } diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt index 35ab32dfe..f58a0b522 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt @@ -72,7 +72,7 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte var keyWidth = defaultKeyWidth * sqrt(Settings.getValues().mKeyboardHeightScale) val defaultKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(context.resources, false) val defaultBottomPadding = context.resources.getFraction(R.fraction.config_keyboard_bottom_padding_holo, defaultKeyboardHeight, defaultKeyboardHeight) - val emojiKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(context.resources, false) * 0.75f + params.mVerticalGap - defaultBottomPadding - context.resources.getDimensionPixelSize(R.dimen.config_emoji_category_page_id_height) + val emojiKeyboardHeight = defaultKeyboardHeight * 0.75f + params.mVerticalGap - defaultBottomPadding - context.resources.getDimensionPixelSize(R.dimen.config_emoji_category_page_id_height) var keyHeight = emojiKeyboardHeight * params.mDefaultRowHeight * Settings.getValues().mKeyboardHeightScale // still apply height scale to key if (Settings.getValues().mEmojiKeyFit) { diff --git a/app/src/main/java/helium314/keyboard/latin/LatinIME.java b/app/src/main/java/helium314/keyboard/latin/LatinIME.java index 3a65b8f93..36107954f 100644 --- a/app/src/main/java/helium314/keyboard/latin/LatinIME.java +++ b/app/src/main/java/helium314/keyboard/latin/LatinIME.java @@ -87,6 +87,7 @@ import helium314.keyboard.latin.utils.StatsUtils; import helium314.keyboard.latin.utils.StatsUtilsManager; import helium314.keyboard.latin.utils.SubtypeLocaleUtils; import helium314.keyboard.latin.utils.SubtypeSettings; +import helium314.keyboard.latin.utils.ToolbarMode; import helium314.keyboard.latin.utils.ViewLayoutUtils; import helium314.keyboard.settings.SettingsActivity; import kotlin.collections.CollectionsKt; @@ -879,7 +880,8 @@ public class LatinIME extends InputMethodService implements mInputView = view; mInsetsUpdater = ViewOutlineProviderUtilsKt.setInsetsOutlineProvider(view); updateSoftInputWindowLayoutParameters(); - mSuggestionStripView = view.findViewById(R.id.suggestion_strip_view); + mSuggestionStripView = mSettings.getCurrent().mToolbarMode == ToolbarMode.HIDDEN? + null : view.findViewById(R.id.suggestion_strip_view); if (hasSuggestionStripView()) { mSuggestionStripView.setListener(this, view); } @@ -931,8 +933,9 @@ public class LatinIME extends InputMethodService implements mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype), mSettings.getCurrent()); loadKeyboard(); - if (mSuggestionStripView != null) + if (hasSuggestionStripView()) { mSuggestionStripView.setRtl(mRichImm.getCurrentSubtype().isRtlSubtype()); + } } /** alias to onCurrentInputMethodSubtypeChanged with a better name, as it's also used for internal switching */ @@ -1215,7 +1218,7 @@ public class LatinIME extends InputMethodService implements @Override public void hideWindow() { - if (mSuggestionStripView != null) + if (hasSuggestionStripView() && mSettings.getCurrent().mToolbarMode == ToolbarMode.EXPANDABLE) mSuggestionStripView.setToolbarVisibility(false); mKeyboardSwitcher.onHideWindow(); @@ -1271,7 +1274,7 @@ public class LatinIME extends InputMethodService implements return; } final View visibleKeyboardView = mKeyboardSwitcher.getWrapperView(); - if (visibleKeyboardView == null || !hasSuggestionStripView()) { + if (visibleKeyboardView == null) { return; } final int inputHeight = mInputView.getHeight(); @@ -1283,8 +1286,13 @@ public class LatinIME extends InputMethodService implements mInsetsUpdater.setInsets(outInsets); return; } - final int visibleTopY = inputHeight - visibleKeyboardView.getHeight() - mSuggestionStripView.getHeight(); - mSuggestionStripView.setMoreSuggestionsHeight(visibleTopY); + final int stripHeight = mKeyboardSwitcher.isShowingStripContainer() ? mKeyboardSwitcher.getStripContainer().getHeight() : 0; + final int visibleTopY = inputHeight - visibleKeyboardView.getHeight() - stripHeight; + + if (hasSuggestionStripView()) { + mSuggestionStripView.setMoreSuggestionsHeight(visibleTopY); + } + // Need to set expanded touchable region only if a keyboard view is being shown. if (visibleKeyboardView.isShown()) { final int touchLeft = 0; @@ -1368,6 +1376,10 @@ public class LatinIME extends InputMethodService implements @RequiresApi(api = Build.VERSION_CODES.R) public InlineSuggestionsRequest onCreateInlineSuggestionsRequest(@NonNull Bundle uiExtras) { Log.d(TAG,"onCreateInlineSuggestionsRequest called"); + if (Settings.getValues().mSuggestionStripHiddenPerUserSettings) { + return null; + } + return InlineAutofillUtils.createInlineSuggestionRequest(mDisplayContext); } @@ -1629,7 +1641,7 @@ public class LatinIME extends InputMethodService implements dismissGestureFloatingPreviewText /* dismissDelayed */); } - public boolean hasSuggestionStripView() { + private boolean hasSuggestionStripView() { return null != mSuggestionStripView; } diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 0dff54197..f8a91e0ea 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -145,6 +145,8 @@ object Defaults { const val PREF_SELECTED_SUBTYPE = "" const val PREF_URL_DETECTION = false const val PREF_DONT_SHOW_MISSING_DICTIONARY_DIALOG = false + const val PREF_TOOLBAR_MODE = "EXPANDABLE" + const val PREF_TOOLBAR_HIDING_GLOBAL = true const val PREF_QUICK_PIN_TOOLBAR_KEYS = false val PREF_PINNED_TOOLBAR_KEYS = defaultPinnedToolbarPref val PREF_TOOLBAR_KEYS = defaultToolbarPref 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 6b6c5ddf4..87449c563 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -37,6 +37,7 @@ import helium314.keyboard.latin.utils.StatsUtils; import helium314.keyboard.latin.utils.SubtypeSettings; import helium314.keyboard.latin.utils.ToolbarKey; import helium314.keyboard.latin.utils.ToolbarUtilsKt; +import helium314.keyboard.latin.utils.ToolbarMode; import java.io.File; import java.util.Arrays; @@ -168,6 +169,8 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_REMOVE_REDUNDANT_POPUPS = "remove_redundant_popups"; public static final String PREF_SPACE_BAR_TEXT = "space_bar_text"; public static final String PREF_TIMESTAMP_FORMAT = "timestamp_format"; + public static final String PREF_TOOLBAR_MODE = "toolbar_mode"; + public static final String PREF_TOOLBAR_HIDING_GLOBAL = "toolbar_hiding_global"; // Emoji public static final String PREF_EMOJI_MAX_SDK = "emoji_max_sdk"; @@ -324,6 +327,10 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang mPrefs.edit().putBoolean(Settings.PREF_ALWAYS_INCOGNITO_MODE, !oldValue).apply(); } + public static ToolbarMode readToolbarMode(final SharedPreferences prefs) { + return ToolbarMode.valueOf(prefs.getString(PREF_TOOLBAR_MODE, Defaults.PREF_TOOLBAR_MODE)); + } + public static int readHorizontalSpaceSwipe(final SharedPreferences prefs) { return switch (prefs.getString(PREF_SPACE_HORIZONTAL_SWIPE, Defaults.PREF_SPACE_HORIZONTAL_SWIPE)) { case "move_cursor" -> KeyboardActionListener.SWIPE_MOVE_CURSOR; 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 9c0b66f23..26ae4658c 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -31,6 +31,7 @@ import helium314.keyboard.latin.utils.JniUtils; import helium314.keyboard.latin.utils.ScriptUtils; import helium314.keyboard.latin.utils.SubtypeSettings; import helium314.keyboard.latin.utils.SubtypeUtilsKt; +import helium314.keyboard.latin.utils.ToolbarMode; import java.util.List; import java.util.Locale; @@ -114,6 +115,8 @@ public class SettingsValues { public final boolean mUrlDetectionEnabled; public final float mBottomPaddingScale; public final float mSidePaddingScale; + public final ToolbarMode mToolbarMode; + public final boolean mToolbarHidingGlobal; public final boolean mAutoShowToolbar; public final boolean mAutoHideToolbar; public final boolean mAlphaAfterEmojiInEmojiView; @@ -131,6 +134,8 @@ public class SettingsValues { public final InputAttributes mInputAttributes; // Deduced settings + public final boolean mSuggestionStripHiddenPerUserSettings; + public final boolean mSecondaryStripVisible; public final int mKeypressVibrationDuration; public final float mKeypressSoundVolume; public final boolean mAutoCorrectionEnabledPerUserSettings; @@ -160,6 +165,8 @@ public class SettingsValues { mInputAttributes = inputAttributes; // Get the settings preferences + mToolbarMode = Settings.readToolbarMode(prefs); + mToolbarHidingGlobal = prefs.getBoolean(Settings.PREF_TOOLBAR_HIDING_GLOBAL, Defaults.PREF_TOOLBAR_HIDING_GLOBAL); mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, Defaults.PREF_AUTO_CAP) && ScriptUtils.scriptSupportsUppercase(mLocale); mVibrateOn = Settings.readVibrationEnabled(prefs); mVibrateInDndMode = prefs.getBoolean(Settings.PREF_VIBRATE_IN_DND_MODE, Defaults.PREF_VIBRATE_IN_DND_MODE); @@ -180,7 +187,7 @@ public class SettingsValues { mShowTldPopupKeys = prefs.getBoolean(Settings.PREF_SHOW_TLD_POPUP_KEYS, Defaults.PREF_SHOW_TLD_POPUP_KEYS); mSpaceForLangChange = prefs.getBoolean(Settings.PREF_SPACE_TO_CHANGE_LANG, Defaults.PREF_SPACE_TO_CHANGE_LANG); mShowsEmojiKey = prefs.getBoolean(Settings.PREF_SHOW_EMOJI_KEY, Defaults.PREF_SHOW_EMOJI_KEY); - mVarToolbarDirection = prefs.getBoolean(Settings.PREF_VARIABLE_TOOLBAR_DIRECTION, Defaults.PREF_VARIABLE_TOOLBAR_DIRECTION); + mVarToolbarDirection = mToolbarMode != ToolbarMode.HIDDEN && prefs.getBoolean(Settings.PREF_VARIABLE_TOOLBAR_DIRECTION, Defaults.PREF_VARIABLE_TOOLBAR_DIRECTION); mUsePersonalizedDicts = prefs.getBoolean(Settings.PREF_KEY_USE_PERSONALIZED_DICTS, Defaults.PREF_KEY_USE_PERSONALIZED_DICTS); mUseDoubleSpacePeriod = prefs.getBoolean(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, Defaults.PREF_KEY_USE_DOUBLE_SPACE_PERIOD) && inputAttributes.mIsGeneralTextInput; @@ -209,7 +216,7 @@ public class SettingsValues { mSplitKeyboardSpacerRelativeWidth = mIsSplitKeyboardEnabled ? 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, Defaults.PREF_QUICK_PIN_TOOLBAR_KEYS); + mQuickPinToolbarKeys = mToolbarMode == ToolbarMode.EXPANDABLE && prefs.getBoolean(Settings.PREF_QUICK_PIN_TOOLBAR_KEYS, Defaults.PREF_QUICK_PIN_TOOLBAR_KEYS); mScreenMetrics = Settings.readScreenMetrics(res); // Compute other readable settings @@ -224,13 +231,15 @@ public class SettingsValues { mGestureFloatingPreviewDynamicEnabled = Settings.readGestureDynamicPreviewEnabled(prefs); mGestureFastTypingCooldown = prefs.getInt(Settings.PREF_GESTURE_FAST_TYPING_COOLDOWN, Defaults.PREF_GESTURE_FAST_TYPING_COOLDOWN); mGestureTrailFadeoutDuration = prefs.getInt(Settings.PREF_GESTURE_TRAIL_FADEOUT_DURATION, Defaults.PREF_GESTURE_TRAIL_FADEOUT_DURATION); + mSuggestionStripHiddenPerUserSettings = mToolbarMode == ToolbarMode.HIDDEN || mToolbarMode == ToolbarMode.TOOLBAR_KEYS; mOverrideShowingSuggestions = mInputAttributes.mMayOverrideShowingSuggestions && prefs.getBoolean(Settings.PREF_ALWAYS_SHOW_SUGGESTIONS, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS) && ((inputAttributes.mInputType & InputType.TYPE_MASK_VARIATION) != InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT || !prefs.getBoolean(Settings.PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT)); final boolean suggestionsEnabled = prefs.getBoolean(Settings.PREF_SHOW_SUGGESTIONS, Defaults.PREF_SHOW_SUGGESTIONS); - mSuggestionsEnabledPerUserSettings = (mInputAttributes.mShouldShowSuggestions && suggestionsEnabled) - || mOverrideShowingSuggestions; + mSuggestionsEnabledPerUserSettings = ((mInputAttributes.mShouldShowSuggestions && suggestionsEnabled) + || mOverrideShowingSuggestions) && !mSuggestionStripHiddenPerUserSettings; + mSecondaryStripVisible = mToolbarMode != ToolbarMode.HIDDEN || ! mToolbarHidingGlobal; mIncognitoModeEnabled = prefs.getBoolean(Settings.PREF_ALWAYS_INCOGNITO_MODE, Defaults.PREF_ALWAYS_INCOGNITO_MODE) || mInputAttributes.mNoLearning || mInputAttributes.mIsPasswordField; mKeyboardHeightScale = prefs.getFloat(Settings.PREF_KEYBOARD_HEIGHT_SCALE, Defaults.PREF_KEYBOARD_HEIGHT_SCALE); @@ -275,8 +284,8 @@ public class SettingsValues { mBottomPaddingScale = Settings.readBottomPaddingScale(prefs, isLandscape); mSidePaddingScale = Settings.readSidePaddingScale(prefs, isLandscape); mLongPressSymbolsForNumpad = prefs.getBoolean(Settings.PREFS_LONG_PRESS_SYMBOLS_FOR_NUMPAD, Defaults.PREFS_LONG_PRESS_SYMBOLS_FOR_NUMPAD); - mAutoShowToolbar = prefs.getBoolean(Settings.PREF_AUTO_SHOW_TOOLBAR, Defaults.PREF_AUTO_SHOW_TOOLBAR); - mAutoHideToolbar = suggestionsEnabled && prefs.getBoolean(Settings.PREF_AUTO_HIDE_TOOLBAR, Defaults.PREF_AUTO_HIDE_TOOLBAR); + mAutoShowToolbar = mToolbarMode == ToolbarMode.EXPANDABLE && prefs.getBoolean(Settings.PREF_AUTO_SHOW_TOOLBAR, Defaults.PREF_AUTO_SHOW_TOOLBAR); + mAutoHideToolbar = mSuggestionsEnabledPerUserSettings && prefs.getBoolean(Settings.PREF_AUTO_HIDE_TOOLBAR, Defaults.PREF_AUTO_HIDE_TOOLBAR); mAlphaAfterEmojiInEmojiView = prefs.getBoolean(Settings.PREF_ABC_AFTER_EMOJI, Defaults.PREF_ABC_AFTER_EMOJI); mAlphaAfterClipHistoryEntry = prefs.getBoolean(Settings.PREF_ABC_AFTER_CLIP, Defaults.PREF_ABC_AFTER_CLIP); mAlphaAfterSymbolAndSpace = prefs.getBoolean(Settings.PREF_ABC_AFTER_SYMBOL_SPACE, Defaults.PREF_ABC_AFTER_SYMBOL_SPACE); diff --git a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java index 9a8e49f36..bab6e4157 100644 --- a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java +++ b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java @@ -59,6 +59,7 @@ import helium314.keyboard.latin.suggestions.PopupSuggestionsView.MoreSuggestions import helium314.keyboard.latin.utils.KtxKt; import helium314.keyboard.latin.utils.Log; import helium314.keyboard.latin.utils.ToolbarKey; +import helium314.keyboard.latin.utils.ToolbarMode; import helium314.keyboard.latin.utils.ToolbarUtilsKt; import java.util.ArrayList; @@ -107,6 +108,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick private final SuggestionStripLayoutHelper mLayoutHelper; private final StripVisibilityGroup mStripVisibilityGroup; private boolean isExternalSuggestionVisible = false; // Required to disable the more suggestions if other suggestions are visible + private final ToolbarMode mToolbarMode; private static class StripVisibilityGroup { private final View mSuggestionStripView; @@ -153,6 +155,11 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick mPinnedKeys = findViewById(R.id.pinned_keys); mToolbar = findViewById(R.id.toolbar); mToolbarContainer = findViewById(R.id.toolbar_container); + mToolbarMode = Settings.getValues().mToolbarMode; + + if (mToolbarMode == ToolbarMode.TOOLBAR_KEYS) { + setToolbarVisibility(true); + } final Typeface customTypeface = Settings.getInstance().getCustomTypeface(); for (int pos = 0; pos < SuggestedWords.MAX_SUGGESTIONS; pos++) { @@ -192,11 +199,13 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick getResources().getDimensionPixelSize(R.dimen.config_suggestions_strip_edge_key_width), LinearLayout.LayoutParams.MATCH_PARENT ); - for (final ToolbarKey key : ToolbarUtilsKt.getEnabledToolbarKeys(prefs)) { - final ImageButton button = createToolbarKey(context, iconsSet, key); - button.setLayoutParams(toolbarKeyLayoutParams); - setupKey(button, colors); - mToolbar.addView(button); + if (mToolbarMode == ToolbarMode.TOOLBAR_KEYS || mToolbarMode == ToolbarMode.EXPANDABLE) { + for (final ToolbarKey key : ToolbarUtilsKt.getEnabledToolbarKeys(prefs)) { + final ImageButton button = createToolbarKey(context, iconsSet, key); + button.setLayoutParams(toolbarKeyLayoutParams); + setupKey(button, colors); + mToolbar.addView(button); + } } final int toolbarHeight = Math.min(mToolbarExpandKey.getLayoutParams().height, (int) getResources().getDimension(R.dimen.config_suggestions_strip_height)); @@ -208,22 +217,23 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick mEnabledToolKeyBackground.setGradientType(GradientDrawable.RADIAL_GRADIENT); mEnabledToolKeyBackground.setGradientRadius(mToolbarExpandKey.getLayoutParams().height / 2f); // nothing else has a usable height at this state - mToolbarExpandKey.setOnClickListener(this); - mToolbarExpandKey.setImageDrawable(Settings.getValues().mIncognitoModeEnabled ? mIncognitoIcon : mToolbarArrowIcon); colors.setColor(mToolbarExpandKey, ColorType.TOOL_BAR_EXPAND_KEY); colors.setColor(mToolbarExpandKey.getBackground(), ColorType.TOOL_BAR_EXPAND_KEY_BACKGROUND); - for (final ToolbarKey pinnedKey : ToolbarUtilsKt.getPinnedToolbarKeys(prefs)) { - final ImageButton button = createToolbarKey(context, iconsSet, pinnedKey); - button.setLayoutParams(toolbarKeyLayoutParams); - setupKey(button, colors); - mPinnedKeys.addView(button); - final View pinnedKeyInToolbar = mToolbar.findViewWithTag(pinnedKey); - if (pinnedKeyInToolbar != null && Settings.getValues().mQuickPinToolbarKeys) - pinnedKeyInToolbar.setBackground(mEnabledToolKeyBackground); + if (!Settings.getValues().mSuggestionStripHiddenPerUserSettings) { + for (final ToolbarKey pinnedKey : ToolbarUtilsKt.getPinnedToolbarKeys(prefs)) { + final ImageButton button = createToolbarKey(context, iconsSet, pinnedKey); + button.setLayoutParams(toolbarKeyLayoutParams); + setupKey(button, colors); + mPinnedKeys.addView(button); + final View pinnedKeyInToolbar = mToolbar.findViewWithTag(pinnedKey); + if (pinnedKeyInToolbar != null && Settings.getValues().mQuickPinToolbarKeys) + pinnedKeyInToolbar.setBackground(mEnabledToolKeyBackground); + } } colors.setBackground(this, ColorType.STRIP_BACKGROUND); + updateKeys(); } @Override @@ -248,7 +258,14 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick final View pinnedVoiceKey = mPinnedKeys.findViewWithTag(ToolbarKey.VOICE); if (pinnedVoiceKey != null) pinnedVoiceKey.setVisibility(currentSettingsValues.mShowsVoiceInputKey ? VISIBLE : GONE); - mToolbarExpandKey.setImageDrawable(currentSettingsValues.mIncognitoModeEnabled ? mIncognitoIcon : mToolbarArrowIcon); + final boolean toolbarIsExpandable = mToolbarMode == ToolbarMode.EXPANDABLE; + if (currentSettingsValues.mIncognitoModeEnabled) { + mToolbarExpandKey.setImageDrawable(mIncognitoIcon); + mToolbarExpandKey.setVisibility(VISIBLE); + } else { + mToolbarExpandKey.setImageDrawable(mToolbarArrowIcon); + mToolbarExpandKey.setVisibility(toolbarIsExpandable ? VISIBLE : GONE); + } mToolbarExpandKey.setScaleX((mToolbarContainer.getVisibility() != VISIBLE ? 1f : -1f) * mRtl); // hide pinned keys if device is locked, and avoid expanding toolbar @@ -256,7 +273,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick final boolean hideToolbarKeys = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 ? km.isDeviceLocked() : km.isKeyguardLocked(); - mToolbarExpandKey.setOnClickListener(hideToolbarKeys ? null : this); + mToolbarExpandKey.setOnClickListener(hideToolbarKeys || !toolbarIsExpandable ? null : this); mPinnedKeys.setVisibility(hideToolbarKeys ? GONE : mSuggestionsStrip.getVisibility()); isExternalSuggestionVisible = false; } @@ -275,7 +292,6 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick public void setSuggestions(final SuggestedWords suggestedWords, final boolean isRtlLanguage) { clear(); setRtl(isRtlLanguage); - updateKeys(); mSuggestedWords = suggestedWords; mStartIndexOfMoreSuggestions = mLayoutHelper.layoutAndReturnStartIndexOfMoreSuggestions( getContext(), mSuggestedWords, mSuggestionsStrip, this); diff --git a/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java index 3ff53dadd..be44521d3 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java +++ b/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java @@ -55,6 +55,15 @@ public final class ResourceUtils { return windowBounds.width() - insets.left - insets.right; } + public static int getSecondaryKeyboardHeight(final Resources res, final SettingsValues settingsValues) { + final int keyboardHeight = getKeyboardHeight(res, settingsValues); + if (settingsValues.mToolbarMode == ToolbarMode.HIDDEN && ! settingsValues.mToolbarHidingGlobal) { + // Small adjustment to match the height of the main keyboard which has a hidden strip container. + return keyboardHeight - (int) res.getDimension(R.dimen.config_suggestions_strip_height); + } + return keyboardHeight; + } + public static int getKeyboardHeight(final Resources res, final SettingsValues settingsValues) { final int defaultKeyboardHeight = getDefaultKeyboardHeight(res, settingsValues.mShowsNumberRow); // mKeyboardHeightScale Ranges from [.5,1.5], from xml/prefs_screen_appearance.xml 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 1293d33a4..d2b2a742e 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/ToolbarUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/ToolbarUtils.kt @@ -115,6 +115,10 @@ enum class ToolbarKey { PAGE_UP, PAGE_DOWN, FULL_LEFT, FULL_RIGHT, PAGE_START, PAGE_END } +enum class ToolbarMode { + EXPANDABLE, TOOLBAR_KEYS, SUGGESTION_STRIP, HIDDEN, +} + val toolbarKeyStrings = entries.associateWithTo(EnumMap(ToolbarKey::class.java)) { it.toString().lowercase(Locale.US) } val defaultToolbarPref by lazy { diff --git a/app/src/main/java/helium314/keyboard/settings/screens/ToolbarScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/ToolbarScreen.kt index 192d6e661..191bf87a3 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/ToolbarScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/ToolbarScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.material3.Surface import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable @@ -28,29 +29,47 @@ import helium314.keyboard.keyboard.internal.KeyboardIconsSet import helium314.keyboard.latin.R import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings -import helium314.keyboard.settings.Setting -import helium314.keyboard.settings.preferences.Preference -import helium314.keyboard.settings.preferences.ReorderSwitchPreference +import helium314.keyboard.latin.utils.Log +import helium314.keyboard.latin.utils.ToolbarMode +import helium314.keyboard.latin.utils.getActivity +import helium314.keyboard.latin.utils.getStringResourceOrName +import helium314.keyboard.latin.utils.prefs import helium314.keyboard.settings.SearchSettingsScreen -import helium314.keyboard.settings.preferences.SwitchPreference +import helium314.keyboard.settings.Setting +import helium314.keyboard.settings.SettingsActivity import helium314.keyboard.settings.Theme import helium314.keyboard.settings.dialogs.ToolbarKeysCustomizer import helium314.keyboard.settings.initPreview +import helium314.keyboard.settings.preferences.ListPreference +import helium314.keyboard.settings.preferences.Preference +import helium314.keyboard.settings.preferences.ReorderSwitchPreference +import helium314.keyboard.settings.preferences.SwitchPreference import helium314.keyboard.settings.previewDark @Composable fun ToolbarScreen( onClickBack: () -> Unit, ) { + val prefs = LocalContext.current.prefs() + val b = (LocalContext.current.getActivity() as? SettingsActivity)?.prefChanged?.collectAsState() + if ((b?.value ?: 0) < 0) + Log.v("irrelevant", "stupid way to trigger recomposition on preference change") + val toolbarMode = Settings.readToolbarMode(prefs) val items = listOf( - Settings.PREF_TOOLBAR_KEYS, - Settings.PREF_PINNED_TOOLBAR_KEYS, - Settings.PREF_CLIPBOARD_TOOLBAR_KEYS, - Settings.PREF_TOOLBAR_CUSTOM_KEY_CODES, - Settings.PREF_QUICK_PIN_TOOLBAR_KEYS, - Settings.PREF_AUTO_SHOW_TOOLBAR, - Settings.PREF_AUTO_HIDE_TOOLBAR, - Settings.PREF_VARIABLE_TOOLBAR_DIRECTION + Settings.PREF_TOOLBAR_MODE, + if (toolbarMode == ToolbarMode.HIDDEN) Settings.PREF_TOOLBAR_HIDING_GLOBAL else null, + if (toolbarMode in listOf(ToolbarMode.EXPANDABLE, ToolbarMode.TOOLBAR_KEYS)) + Settings.PREF_TOOLBAR_KEYS else null, + if (toolbarMode in listOf(ToolbarMode.EXPANDABLE, ToolbarMode.SUGGESTION_STRIP)) + Settings.PREF_PINNED_TOOLBAR_KEYS else null, + if (toolbarMode in listOf(ToolbarMode.EXPANDABLE, ToolbarMode.TOOLBAR_KEYS)) + Settings.PREF_CLIPBOARD_TOOLBAR_KEYS else null, + if (toolbarMode in listOf(ToolbarMode.EXPANDABLE, ToolbarMode.TOOLBAR_KEYS)) + Settings.PREF_TOOLBAR_CUSTOM_KEY_CODES else null, + if (toolbarMode == ToolbarMode.EXPANDABLE) Settings.PREF_QUICK_PIN_TOOLBAR_KEYS else null, + if (toolbarMode == ToolbarMode.EXPANDABLE) Settings.PREF_AUTO_SHOW_TOOLBAR else null, + if (toolbarMode == ToolbarMode.EXPANDABLE) Settings.PREF_AUTO_HIDE_TOOLBAR else null, + if (toolbarMode != ToolbarMode.HIDDEN) Settings.PREF_VARIABLE_TOOLBAR_DIRECTION else null, ) SearchSettingsScreen( onClickBack = onClickBack, @@ -60,6 +79,23 @@ fun ToolbarScreen( } fun createToolbarSettings(context: Context) = listOf( + Setting(context, Settings.PREF_TOOLBAR_MODE, R.string.toolbar_mode) { setting -> + val ctx = LocalContext.current + val items = + ToolbarMode.entries.map { it.name.lowercase().getStringResourceOrName("toolbar_mode_", ctx) to it.name } + ListPreference( + setting, + items, + Defaults.PREF_TOOLBAR_MODE + ) { + KeyboardSwitcher.getInstance().setThemeNeedsReload() + } + }, + Setting(context, Settings.PREF_TOOLBAR_HIDING_GLOBAL, R.string.toolbar_hiding_global) { + SwitchPreference(it, Defaults.PREF_TOOLBAR_HIDING_GLOBAL) { + KeyboardSwitcher.getInstance().setThemeNeedsReload() + } + }, Setting(context, Settings.PREF_TOOLBAR_KEYS, R.string.toolbar_keys) { ReorderSwitchPreference(it, Defaults.PREF_TOOLBAR_KEYS) }, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6561c5ca4..76f2f3b0e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -284,6 +284,18 @@ Language (priority) Layout Symbols + + Toolbar mode + + Toolbar keys and suggestions + + Toolbar keys only + + Suggestions only + + Hidden + + Hide clipboard and emoji toolbars too Select toolbar keys