Add toolbar modes (#1606)

This commit is contained in:
Eran Leshem 2025-06-01 10:50:55 +03:00 committed by GitHub
parent 38bbcd9a83
commit ec2bbb461d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 191 additions and 61 deletions

View file

@ -20,6 +20,7 @@ import android.view.View;
import android.view.animation.AnimationUtils; import android.view.animation.AnimationUtils;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView; import android.widget.HorizontalScrollView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; 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.RecapitalizeStatus;
import helium314.keyboard.latin.utils.ResourceUtils; import helium314.keyboard.latin.utils.ResourceUtils;
import helium314.keyboard.latin.utils.ScriptUtils; import helium314.keyboard.latin.utils.ScriptUtils;
import helium314.keyboard.latin.utils.SubtypeLocaleUtils;
import helium314.keyboard.latin.utils.SubtypeUtilsAdditional; import helium314.keyboard.latin.utils.SubtypeUtilsAdditional;
import helium314.keyboard.latin.utils.ToolbarMode;
public final class KeyboardSwitcher implements KeyboardState.SwitchActions { public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
private static final String TAG = KeyboardSwitcher.class.getSimpleName(); private static final String TAG = KeyboardSwitcher.class.getSimpleName();
@ -64,6 +65,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
private LinearLayout mClipboardStripView; private LinearLayout mClipboardStripView;
private HorizontalScrollView mClipboardStripScrollView; private HorizontalScrollView mClipboardStripScrollView;
private SuggestionStripView mSuggestionStripView; private SuggestionStripView mSuggestionStripView;
private FrameLayout mStripContainer;
private ClipboardHistoryView mClipboardHistoryView; private ClipboardHistoryView mClipboardHistoryView;
private TextView mFakeToastView; private TextView mFakeToastView;
private LatinIME mLatinIME; private LatinIME mLatinIME;
@ -307,6 +309,8 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
@NonNull final SettingsValues settingsValues, @NonNull final SettingsValues settingsValues,
@NonNull final KeyboardSwitchState toggleState) { @NonNull final KeyboardSwitchState toggleState) {
final int visibility = isImeSuppressedByHardwareKeyboard(settingsValues, toggleState) ? View.GONE : View.VISIBLE; 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); PointerTracker.switchTo(mKeyboardView);
mKeyboardView.setVisibility(visibility); mKeyboardView.setVisibility(visibility);
// The visibility of {@link #mKeyboardView} must be aligned with {@link #MainKeyboardFrame}. // The visibility of {@link #mKeyboardView} must be aligned with {@link #MainKeyboardFrame}.
@ -317,7 +321,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
mEmojiPalettesView.stopEmojiPalettes(); mEmojiPalettesView.stopEmojiPalettes();
mEmojiTabStripView.setVisibility(View.GONE); mEmojiTabStripView.setVisibility(View.GONE);
mClipboardStripScrollView.setVisibility(View.GONE); mClipboardStripScrollView.setVisibility(View.GONE);
mSuggestionStripView.setVisibility(View.VISIBLE); mSuggestionStripView.setVisibility(stripVisibility);
mClipboardHistoryView.setVisibility(View.GONE); mClipboardHistoryView.setVisibility(View.GONE);
mClipboardHistoryView.stopClipboardHistory(); mClipboardHistoryView.stopClipboardHistory();
} }
@ -334,6 +338,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
// @see LatinIME#onComputeInset(android.inputmethodservice.InputMethodService.Insets) // @see LatinIME#onComputeInset(android.inputmethodservice.InputMethodService.Insets)
mKeyboardView.setVisibility(View.GONE); mKeyboardView.setVisibility(View.GONE);
mSuggestionStripView.setVisibility(View.GONE); mSuggestionStripView.setVisibility(View.GONE);
mStripContainer.setVisibility(getSecondaryStripVisibility());
mClipboardStripScrollView.setVisibility(View.GONE); mClipboardStripScrollView.setVisibility(View.GONE);
mEmojiTabStripView.setVisibility(View.VISIBLE); mEmojiTabStripView.setVisibility(View.VISIBLE);
mClipboardHistoryView.setVisibility(View.GONE); mClipboardHistoryView.setVisibility(View.GONE);
@ -355,6 +360,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
mKeyboardView.setVisibility(View.GONE); mKeyboardView.setVisibility(View.GONE);
mEmojiTabStripView.setVisibility(View.GONE); mEmojiTabStripView.setVisibility(View.GONE);
mSuggestionStripView.setVisibility(View.GONE); mSuggestionStripView.setVisibility(View.GONE);
mStripContainer.setVisibility(getSecondaryStripVisibility());
mClipboardStripScrollView.post(() -> mClipboardStripScrollView.fullScroll(HorizontalScrollView.FOCUS_RIGHT)); mClipboardStripScrollView.post(() -> mClipboardStripScrollView.fullScroll(HorizontalScrollView.FOCUS_RIGHT));
mClipboardStripScrollView.setVisibility(View.VISIBLE); mClipboardStripScrollView.setVisibility(View.VISIBLE);
mEmojiPalettesView.setVisibility(View.GONE); 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. // Displays a toast-like message with the provided text for a specified duration.
private void showFakeToast(final String text, final int timeMillis) { private void showFakeToast(final String text, final int timeMillis) {
if (mFakeToastView.getVisibility() == View.VISIBLE) return; if (mFakeToastView.getVisibility() == View.VISIBLE) return;
@ -606,6 +616,10 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
return mKeyboardView.isShowingPopupKeysPanel(); return mKeyboardView.isShowingPopupKeysPanel();
} }
public boolean isShowingStripContainer() {
return mStripContainer.isShown();
}
public View getVisibleKeyboardView() { public View getVisibleKeyboardView() {
if (isShowingEmojiPalettes()) { if (isShowingEmojiPalettes()) {
return mEmojiPalettesView; return mEmojiPalettesView;
@ -631,6 +645,8 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
return mKeyboardView; return mKeyboardView;
} }
public FrameLayout getStripContainer() { return mStripContainer; }
public void deallocateMemory() { public void deallocateMemory() {
if (mKeyboardView != null) { if (mKeyboardView != null) {
mKeyboardView.cancelAllOngoingEvents(); mKeyboardView.cancelAllOngoingEvents();
@ -684,6 +700,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
mClipboardStripView = mCurrentInputView.findViewById(R.id.clipboard_strip); mClipboardStripView = mCurrentInputView.findViewById(R.id.clipboard_strip);
mClipboardStripScrollView = mCurrentInputView.findViewById(R.id.clipboard_strip_scroll_view); mClipboardStripScrollView = mCurrentInputView.findViewById(R.id.clipboard_strip_scroll_view);
mSuggestionStripView = mCurrentInputView.findViewById(R.id.suggestion_strip_view); mSuggestionStripView = mCurrentInputView.findViewById(R.id.suggestion_strip_view);
mStripContainer = mCurrentInputView.findViewById(R.id.strip_container);
prefs.registerOnSharedPreferenceChangeListener(mSuggestionStripView); prefs.registerOnSharedPreferenceChangeListener(mSuggestionStripView);
prefs.registerOnSharedPreferenceChangeListener(mClipboardHistoryView); prefs.registerOnSharedPreferenceChangeListener(mClipboardHistoryView);

View file

@ -30,6 +30,7 @@ import helium314.keyboard.latin.common.Constants
import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.settings.Settings
import helium314.keyboard.latin.utils.ResourceUtils import helium314.keyboard.latin.utils.ResourceUtils
import helium314.keyboard.latin.utils.ToolbarKey import helium314.keyboard.latin.utils.ToolbarKey
import helium314.keyboard.latin.utils.ToolbarMode
import helium314.keyboard.latin.utils.createToolbarKey import helium314.keyboard.latin.utils.createToolbarKey
import helium314.keyboard.latin.utils.getCodeForToolbarKey import helium314.keyboard.latin.utils.getCodeForToolbarKey
import helium314.keyboard.latin.utils.getCodeForToolbarKeyLongClick import helium314.keyboard.latin.utils.getCodeForToolbarKeyLongClick
@ -68,8 +69,10 @@ class ClipboardHistoryView @JvmOverloads constructor(
keyBackgroundId = keyboardViewAttr.getResourceId(R.styleable.KeyboardView_keyBackground, 0) keyBackgroundId = keyboardViewAttr.getResourceId(R.styleable.KeyboardView_keyBackground, 0)
keyboardViewAttr.recycle() keyboardViewAttr.recycle()
val keyboardAttr = context.obtainStyledAttributes(attrs, R.styleable.Keyboard, defStyle, R.style.SuggestionStripView) val keyboardAttr = context.obtainStyledAttributes(attrs, R.styleable.Keyboard, defStyle, R.style.SuggestionStripView)
getEnabledClipboardToolbarKeys(context.prefs()) if (Settings.getValues().mSecondaryStripVisible) {
.forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) } getEnabledClipboardToolbarKeys(context.prefs())
.forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) }
}
keyboardAttr.recycle() keyboardAttr.recycle()
fitsSystemWindows = true fitsSystemWindows = true
} }
@ -79,7 +82,7 @@ class ClipboardHistoryView @JvmOverloads constructor(
val res = context.resources val res = context.resources
// The main keyboard expands to the entire this {@link KeyboardView}. // The main keyboard expands to the entire this {@link KeyboardView}.
val width = ResourceUtils.getKeyboardWidth(context, Settings.getValues()) + paddingLeft + paddingRight 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) setMeasuredDimension(width, height)
} }

View file

@ -3,7 +3,6 @@
package helium314.keyboard.keyboard.clipboard package helium314.keyboard.keyboard.clipboard
import android.content.Context import android.content.Context
import android.content.res.Resources
import android.view.View import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -22,7 +21,7 @@ class ClipboardLayoutParams(ctx: Context) {
init { init {
val res = ctx.resources val res = ctx.resources
val sv = Settings.getValues() val sv = Settings.getValues()
val defaultKeyboardHeight = ResourceUtils.getKeyboardHeight(res, sv) val defaultKeyboardHeight = ResourceUtils.getSecondaryKeyboardHeight(res, sv)
val defaultKeyboardWidth = ResourceUtils.getKeyboardWidth(ctx, sv) val defaultKeyboardWidth = ResourceUtils.getKeyboardWidth(ctx, sv)
if (sv.mNarrowKeyGaps) { if (sv.mNarrowKeyGaps) {

View file

@ -22,7 +22,7 @@ internal class EmojiLayoutParams(res: Resources) {
init { init {
val sv = Settings.getValues() val sv = Settings.getValues()
val defaultKeyboardHeight = ResourceUtils.getKeyboardHeight(res, sv) val defaultKeyboardHeight = ResourceUtils.getSecondaryKeyboardHeight(res, sv)
val keyVerticalGap = if (sv.mNarrowKeyGaps) { val keyVerticalGap = if (sv.mNarrowKeyGaps) {
res.getFraction(R.fraction.config_key_vertical_gap_holo_narrow, res.getFraction(R.fraction.config_key_vertical_gap_holo_narrow,

View file

@ -219,7 +219,7 @@ public final class EmojiPalettesView extends LinearLayout
// The main keyboard expands to the entire this {@link KeyboardView}. // The main keyboard expands to the entire this {@link KeyboardView}.
final int width = ResourceUtils.getKeyboardWidth(getContext(), Settings.getValues()) final int width = ResourceUtils.getKeyboardWidth(getContext(), Settings.getValues())
+ getPaddingLeft() + getPaddingRight(); + getPaddingLeft() + getPaddingRight();
final int height = ResourceUtils.getKeyboardHeight(res, Settings.getValues()) final int height = ResourceUtils.getSecondaryKeyboardHeight(res, Settings.getValues())
+ getPaddingTop() + getPaddingBottom(); + getPaddingTop() + getPaddingBottom();
mEmojiCategoryPageIndicatorView.mWidth = width; mEmojiCategoryPageIndicatorView.mWidth = width;
setMeasuredDimension(width, height); setMeasuredDimension(width, height);
@ -243,8 +243,10 @@ public final class EmojiPalettesView extends LinearLayout
if (initialized) return; if (initialized) return;
mEmojiCategory.initialize(); mEmojiCategory.initialize();
mTabStrip = (LinearLayout) KeyboardSwitcher.getInstance().getEmojiTabStrip(); mTabStrip = (LinearLayout) KeyboardSwitcher.getInstance().getEmojiTabStrip();
for (final EmojiCategory.CategoryProperties properties : mEmojiCategory.getShownCategories()) { if (Settings.getValues().mSecondaryStripVisible) {
addTab(mTabStrip, properties.mCategoryId); for (final EmojiCategory.CategoryProperties properties : mEmojiCategory.getShownCategories()) {
addTab(mTabStrip, properties.mCategoryId);
}
} }
mPager = findViewById(R.id.emoji_pager); mPager = findViewById(R.id.emoji_pager);
@ -404,13 +406,15 @@ public final class EmojiPalettesView extends LinearLayout
mEmojiCategory.getCurrentCategoryId()), ! initial); mEmojiCategory.getCurrentCategoryId()), ! initial);
} }
final View old = mTabStrip.findViewWithTag((long) oldCategoryId); if (Settings.getValues().mSecondaryStripVisible) {
final View current = mTabStrip.findViewWithTag((long) categoryId); final View old = mTabStrip.findViewWithTag((long) oldCategoryId);
final View current = mTabStrip.findViewWithTag((long) categoryId);
if (old instanceof ImageView) if (old instanceof ImageView)
Settings.getValues().mColors.setColor((ImageView) old, ColorType.EMOJI_CATEGORY); Settings.getValues().mColors.setColor((ImageView) old, ColorType.EMOJI_CATEGORY);
if (current instanceof ImageView) if (current instanceof ImageView)
Settings.getValues().mColors.setColor((ImageView) current, ColorType.EMOJI_CATEGORY_SELECTED); Settings.getValues().mColors.setColor((ImageView) current, ColorType.EMOJI_CATEGORY_SELECTED);
}
} }
} }

View file

@ -72,7 +72,7 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte
var keyWidth = defaultKeyWidth * sqrt(Settings.getValues().mKeyboardHeightScale) var keyWidth = defaultKeyWidth * sqrt(Settings.getValues().mKeyboardHeightScale)
val defaultKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(context.resources, false) val defaultKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(context.resources, false)
val defaultBottomPadding = context.resources.getFraction(R.fraction.config_keyboard_bottom_padding_holo, defaultKeyboardHeight, defaultKeyboardHeight) 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 var keyHeight = emojiKeyboardHeight * params.mDefaultRowHeight * Settings.getValues().mKeyboardHeightScale // still apply height scale to key
if (Settings.getValues().mEmojiKeyFit) { if (Settings.getValues().mEmojiKeyFit) {

View file

@ -87,6 +87,7 @@ import helium314.keyboard.latin.utils.StatsUtils;
import helium314.keyboard.latin.utils.StatsUtilsManager; import helium314.keyboard.latin.utils.StatsUtilsManager;
import helium314.keyboard.latin.utils.SubtypeLocaleUtils; import helium314.keyboard.latin.utils.SubtypeLocaleUtils;
import helium314.keyboard.latin.utils.SubtypeSettings; import helium314.keyboard.latin.utils.SubtypeSettings;
import helium314.keyboard.latin.utils.ToolbarMode;
import helium314.keyboard.latin.utils.ViewLayoutUtils; import helium314.keyboard.latin.utils.ViewLayoutUtils;
import helium314.keyboard.settings.SettingsActivity; import helium314.keyboard.settings.SettingsActivity;
import kotlin.collections.CollectionsKt; import kotlin.collections.CollectionsKt;
@ -879,7 +880,8 @@ public class LatinIME extends InputMethodService implements
mInputView = view; mInputView = view;
mInsetsUpdater = ViewOutlineProviderUtilsKt.setInsetsOutlineProvider(view); mInsetsUpdater = ViewOutlineProviderUtilsKt.setInsetsOutlineProvider(view);
updateSoftInputWindowLayoutParameters(); 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()) { if (hasSuggestionStripView()) {
mSuggestionStripView.setListener(this, view); mSuggestionStripView.setListener(this, view);
} }
@ -931,8 +933,9 @@ public class LatinIME extends InputMethodService implements
mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype), mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype),
mSettings.getCurrent()); mSettings.getCurrent());
loadKeyboard(); loadKeyboard();
if (mSuggestionStripView != null) if (hasSuggestionStripView()) {
mSuggestionStripView.setRtl(mRichImm.getCurrentSubtype().isRtlSubtype()); mSuggestionStripView.setRtl(mRichImm.getCurrentSubtype().isRtlSubtype());
}
} }
/** alias to onCurrentInputMethodSubtypeChanged with a better name, as it's also used for internal switching */ /** 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 @Override
public void hideWindow() { public void hideWindow() {
if (mSuggestionStripView != null) if (hasSuggestionStripView() && mSettings.getCurrent().mToolbarMode == ToolbarMode.EXPANDABLE)
mSuggestionStripView.setToolbarVisibility(false); mSuggestionStripView.setToolbarVisibility(false);
mKeyboardSwitcher.onHideWindow(); mKeyboardSwitcher.onHideWindow();
@ -1271,7 +1274,7 @@ public class LatinIME extends InputMethodService implements
return; return;
} }
final View visibleKeyboardView = mKeyboardSwitcher.getWrapperView(); final View visibleKeyboardView = mKeyboardSwitcher.getWrapperView();
if (visibleKeyboardView == null || !hasSuggestionStripView()) { if (visibleKeyboardView == null) {
return; return;
} }
final int inputHeight = mInputView.getHeight(); final int inputHeight = mInputView.getHeight();
@ -1283,8 +1286,13 @@ public class LatinIME extends InputMethodService implements
mInsetsUpdater.setInsets(outInsets); mInsetsUpdater.setInsets(outInsets);
return; return;
} }
final int visibleTopY = inputHeight - visibleKeyboardView.getHeight() - mSuggestionStripView.getHeight(); final int stripHeight = mKeyboardSwitcher.isShowingStripContainer() ? mKeyboardSwitcher.getStripContainer().getHeight() : 0;
mSuggestionStripView.setMoreSuggestionsHeight(visibleTopY); 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. // Need to set expanded touchable region only if a keyboard view is being shown.
if (visibleKeyboardView.isShown()) { if (visibleKeyboardView.isShown()) {
final int touchLeft = 0; final int touchLeft = 0;
@ -1368,6 +1376,10 @@ public class LatinIME extends InputMethodService implements
@RequiresApi(api = Build.VERSION_CODES.R) @RequiresApi(api = Build.VERSION_CODES.R)
public InlineSuggestionsRequest onCreateInlineSuggestionsRequest(@NonNull Bundle uiExtras) { public InlineSuggestionsRequest onCreateInlineSuggestionsRequest(@NonNull Bundle uiExtras) {
Log.d(TAG,"onCreateInlineSuggestionsRequest called"); Log.d(TAG,"onCreateInlineSuggestionsRequest called");
if (Settings.getValues().mSuggestionStripHiddenPerUserSettings) {
return null;
}
return InlineAutofillUtils.createInlineSuggestionRequest(mDisplayContext); return InlineAutofillUtils.createInlineSuggestionRequest(mDisplayContext);
} }
@ -1629,7 +1641,7 @@ public class LatinIME extends InputMethodService implements
dismissGestureFloatingPreviewText /* dismissDelayed */); dismissGestureFloatingPreviewText /* dismissDelayed */);
} }
public boolean hasSuggestionStripView() { private boolean hasSuggestionStripView() {
return null != mSuggestionStripView; return null != mSuggestionStripView;
} }

View file

@ -145,6 +145,8 @@ object Defaults {
const val PREF_SELECTED_SUBTYPE = "" const val PREF_SELECTED_SUBTYPE = ""
const val PREF_URL_DETECTION = false const val PREF_URL_DETECTION = false
const val PREF_DONT_SHOW_MISSING_DICTIONARY_DIALOG = 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 const val PREF_QUICK_PIN_TOOLBAR_KEYS = false
val PREF_PINNED_TOOLBAR_KEYS = defaultPinnedToolbarPref val PREF_PINNED_TOOLBAR_KEYS = defaultPinnedToolbarPref
val PREF_TOOLBAR_KEYS = defaultToolbarPref val PREF_TOOLBAR_KEYS = defaultToolbarPref

View file

@ -37,6 +37,7 @@ import helium314.keyboard.latin.utils.StatsUtils;
import helium314.keyboard.latin.utils.SubtypeSettings; import helium314.keyboard.latin.utils.SubtypeSettings;
import helium314.keyboard.latin.utils.ToolbarKey; import helium314.keyboard.latin.utils.ToolbarKey;
import helium314.keyboard.latin.utils.ToolbarUtilsKt; import helium314.keyboard.latin.utils.ToolbarUtilsKt;
import helium314.keyboard.latin.utils.ToolbarMode;
import java.io.File; import java.io.File;
import java.util.Arrays; 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_REMOVE_REDUNDANT_POPUPS = "remove_redundant_popups";
public static final String PREF_SPACE_BAR_TEXT = "space_bar_text"; 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_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 // Emoji
public static final String PREF_EMOJI_MAX_SDK = "emoji_max_sdk"; 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(); 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) { public static int readHorizontalSpaceSwipe(final SharedPreferences prefs) {
return switch (prefs.getString(PREF_SPACE_HORIZONTAL_SWIPE, Defaults.PREF_SPACE_HORIZONTAL_SWIPE)) { return switch (prefs.getString(PREF_SPACE_HORIZONTAL_SWIPE, Defaults.PREF_SPACE_HORIZONTAL_SWIPE)) {
case "move_cursor" -> KeyboardActionListener.SWIPE_MOVE_CURSOR; case "move_cursor" -> KeyboardActionListener.SWIPE_MOVE_CURSOR;

View file

@ -31,6 +31,7 @@ import helium314.keyboard.latin.utils.JniUtils;
import helium314.keyboard.latin.utils.ScriptUtils; import helium314.keyboard.latin.utils.ScriptUtils;
import helium314.keyboard.latin.utils.SubtypeSettings; import helium314.keyboard.latin.utils.SubtypeSettings;
import helium314.keyboard.latin.utils.SubtypeUtilsKt; import helium314.keyboard.latin.utils.SubtypeUtilsKt;
import helium314.keyboard.latin.utils.ToolbarMode;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -114,6 +115,8 @@ public class SettingsValues {
public final boolean mUrlDetectionEnabled; public final boolean mUrlDetectionEnabled;
public final float mBottomPaddingScale; public final float mBottomPaddingScale;
public final float mSidePaddingScale; public final float mSidePaddingScale;
public final ToolbarMode mToolbarMode;
public final boolean mToolbarHidingGlobal;
public final boolean mAutoShowToolbar; public final boolean mAutoShowToolbar;
public final boolean mAutoHideToolbar; public final boolean mAutoHideToolbar;
public final boolean mAlphaAfterEmojiInEmojiView; public final boolean mAlphaAfterEmojiInEmojiView;
@ -131,6 +134,8 @@ public class SettingsValues {
public final InputAttributes mInputAttributes; public final InputAttributes mInputAttributes;
// Deduced settings // Deduced settings
public final boolean mSuggestionStripHiddenPerUserSettings;
public final boolean mSecondaryStripVisible;
public final int mKeypressVibrationDuration; public final int mKeypressVibrationDuration;
public final float mKeypressSoundVolume; public final float mKeypressSoundVolume;
public final boolean mAutoCorrectionEnabledPerUserSettings; public final boolean mAutoCorrectionEnabledPerUserSettings;
@ -160,6 +165,8 @@ public class SettingsValues {
mInputAttributes = inputAttributes; mInputAttributes = inputAttributes;
// Get the settings preferences // 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); mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, Defaults.PREF_AUTO_CAP) && ScriptUtils.scriptSupportsUppercase(mLocale);
mVibrateOn = Settings.readVibrationEnabled(prefs); mVibrateOn = Settings.readVibrationEnabled(prefs);
mVibrateInDndMode = prefs.getBoolean(Settings.PREF_VIBRATE_IN_DND_MODE, Defaults.PREF_VIBRATE_IN_DND_MODE); 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); 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); 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); 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); 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) mUseDoubleSpacePeriod = prefs.getBoolean(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, Defaults.PREF_KEY_USE_DOUBLE_SPACE_PERIOD)
&& inputAttributes.mIsGeneralTextInput; && inputAttributes.mIsGeneralTextInput;
@ -209,7 +216,7 @@ public class SettingsValues {
mSplitKeyboardSpacerRelativeWidth = mIsSplitKeyboardEnabled mSplitKeyboardSpacerRelativeWidth = mIsSplitKeyboardEnabled
? Math.min(Math.max((displayWidthDp - 600) / 600f + 0.15f, 0.15f), 0.35f) * Settings.readSplitSpacerScale(prefs, isLandscape) ? Math.min(Math.max((displayWidthDp - 600) / 600f + 0.15f, 0.15f), 0.35f) * Settings.readSplitSpacerScale(prefs, isLandscape)
: 0f; : 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); mScreenMetrics = Settings.readScreenMetrics(res);
// Compute other readable settings // Compute other readable settings
@ -224,13 +231,15 @@ public class SettingsValues {
mGestureFloatingPreviewDynamicEnabled = Settings.readGestureDynamicPreviewEnabled(prefs); mGestureFloatingPreviewDynamicEnabled = Settings.readGestureDynamicPreviewEnabled(prefs);
mGestureFastTypingCooldown = prefs.getInt(Settings.PREF_GESTURE_FAST_TYPING_COOLDOWN, Defaults.PREF_GESTURE_FAST_TYPING_COOLDOWN); 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); 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 mOverrideShowingSuggestions = mInputAttributes.mMayOverrideShowingSuggestions
&& prefs.getBoolean(Settings.PREF_ALWAYS_SHOW_SUGGESTIONS, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS) && 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 && ((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)); || !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); final boolean suggestionsEnabled = prefs.getBoolean(Settings.PREF_SHOW_SUGGESTIONS, Defaults.PREF_SHOW_SUGGESTIONS);
mSuggestionsEnabledPerUserSettings = (mInputAttributes.mShouldShowSuggestions && suggestionsEnabled) mSuggestionsEnabledPerUserSettings = ((mInputAttributes.mShouldShowSuggestions && suggestionsEnabled)
|| mOverrideShowingSuggestions; || mOverrideShowingSuggestions) && !mSuggestionStripHiddenPerUserSettings;
mSecondaryStripVisible = mToolbarMode != ToolbarMode.HIDDEN || ! mToolbarHidingGlobal;
mIncognitoModeEnabled = prefs.getBoolean(Settings.PREF_ALWAYS_INCOGNITO_MODE, Defaults.PREF_ALWAYS_INCOGNITO_MODE) || mInputAttributes.mNoLearning mIncognitoModeEnabled = prefs.getBoolean(Settings.PREF_ALWAYS_INCOGNITO_MODE, Defaults.PREF_ALWAYS_INCOGNITO_MODE) || mInputAttributes.mNoLearning
|| mInputAttributes.mIsPasswordField; || mInputAttributes.mIsPasswordField;
mKeyboardHeightScale = prefs.getFloat(Settings.PREF_KEYBOARD_HEIGHT_SCALE, Defaults.PREF_KEYBOARD_HEIGHT_SCALE); 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); mBottomPaddingScale = Settings.readBottomPaddingScale(prefs, isLandscape);
mSidePaddingScale = Settings.readSidePaddingScale(prefs, isLandscape); mSidePaddingScale = Settings.readSidePaddingScale(prefs, isLandscape);
mLongPressSymbolsForNumpad = prefs.getBoolean(Settings.PREFS_LONG_PRESS_SYMBOLS_FOR_NUMPAD, Defaults.PREFS_LONG_PRESS_SYMBOLS_FOR_NUMPAD); 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); mAutoShowToolbar = mToolbarMode == ToolbarMode.EXPANDABLE && 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); 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); 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); 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); mAlphaAfterSymbolAndSpace = prefs.getBoolean(Settings.PREF_ABC_AFTER_SYMBOL_SPACE, Defaults.PREF_ABC_AFTER_SYMBOL_SPACE);

View file

@ -59,6 +59,7 @@ import helium314.keyboard.latin.suggestions.PopupSuggestionsView.MoreSuggestions
import helium314.keyboard.latin.utils.KtxKt; import helium314.keyboard.latin.utils.KtxKt;
import helium314.keyboard.latin.utils.Log; import helium314.keyboard.latin.utils.Log;
import helium314.keyboard.latin.utils.ToolbarKey; import helium314.keyboard.latin.utils.ToolbarKey;
import helium314.keyboard.latin.utils.ToolbarMode;
import helium314.keyboard.latin.utils.ToolbarUtilsKt; import helium314.keyboard.latin.utils.ToolbarUtilsKt;
import java.util.ArrayList; import java.util.ArrayList;
@ -107,6 +108,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
private final SuggestionStripLayoutHelper mLayoutHelper; private final SuggestionStripLayoutHelper mLayoutHelper;
private final StripVisibilityGroup mStripVisibilityGroup; private final StripVisibilityGroup mStripVisibilityGroup;
private boolean isExternalSuggestionVisible = false; // Required to disable the more suggestions if other suggestions are visible private boolean isExternalSuggestionVisible = false; // Required to disable the more suggestions if other suggestions are visible
private final ToolbarMode mToolbarMode;
private static class StripVisibilityGroup { private static class StripVisibilityGroup {
private final View mSuggestionStripView; private final View mSuggestionStripView;
@ -153,6 +155,11 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
mPinnedKeys = findViewById(R.id.pinned_keys); mPinnedKeys = findViewById(R.id.pinned_keys);
mToolbar = findViewById(R.id.toolbar); mToolbar = findViewById(R.id.toolbar);
mToolbarContainer = findViewById(R.id.toolbar_container); mToolbarContainer = findViewById(R.id.toolbar_container);
mToolbarMode = Settings.getValues().mToolbarMode;
if (mToolbarMode == ToolbarMode.TOOLBAR_KEYS) {
setToolbarVisibility(true);
}
final Typeface customTypeface = Settings.getInstance().getCustomTypeface(); final Typeface customTypeface = Settings.getInstance().getCustomTypeface();
for (int pos = 0; pos < SuggestedWords.MAX_SUGGESTIONS; pos++) { 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), getResources().getDimensionPixelSize(R.dimen.config_suggestions_strip_edge_key_width),
LinearLayout.LayoutParams.MATCH_PARENT LinearLayout.LayoutParams.MATCH_PARENT
); );
for (final ToolbarKey key : ToolbarUtilsKt.getEnabledToolbarKeys(prefs)) { if (mToolbarMode == ToolbarMode.TOOLBAR_KEYS || mToolbarMode == ToolbarMode.EXPANDABLE) {
final ImageButton button = createToolbarKey(context, iconsSet, key); for (final ToolbarKey key : ToolbarUtilsKt.getEnabledToolbarKeys(prefs)) {
button.setLayoutParams(toolbarKeyLayoutParams); final ImageButton button = createToolbarKey(context, iconsSet, key);
setupKey(button, colors); button.setLayoutParams(toolbarKeyLayoutParams);
mToolbar.addView(button); setupKey(button, colors);
mToolbar.addView(button);
}
} }
final int toolbarHeight = Math.min(mToolbarExpandKey.getLayoutParams().height, (int) getResources().getDimension(R.dimen.config_suggestions_strip_height)); 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.setGradientType(GradientDrawable.RADIAL_GRADIENT);
mEnabledToolKeyBackground.setGradientRadius(mToolbarExpandKey.getLayoutParams().height / 2f); // nothing else has a usable height at this state 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, ColorType.TOOL_BAR_EXPAND_KEY);
colors.setColor(mToolbarExpandKey.getBackground(), ColorType.TOOL_BAR_EXPAND_KEY_BACKGROUND); colors.setColor(mToolbarExpandKey.getBackground(), ColorType.TOOL_BAR_EXPAND_KEY_BACKGROUND);
for (final ToolbarKey pinnedKey : ToolbarUtilsKt.getPinnedToolbarKeys(prefs)) { if (!Settings.getValues().mSuggestionStripHiddenPerUserSettings) {
final ImageButton button = createToolbarKey(context, iconsSet, pinnedKey); for (final ToolbarKey pinnedKey : ToolbarUtilsKt.getPinnedToolbarKeys(prefs)) {
button.setLayoutParams(toolbarKeyLayoutParams); final ImageButton button = createToolbarKey(context, iconsSet, pinnedKey);
setupKey(button, colors); button.setLayoutParams(toolbarKeyLayoutParams);
mPinnedKeys.addView(button); setupKey(button, colors);
final View pinnedKeyInToolbar = mToolbar.findViewWithTag(pinnedKey); mPinnedKeys.addView(button);
if (pinnedKeyInToolbar != null && Settings.getValues().mQuickPinToolbarKeys) final View pinnedKeyInToolbar = mToolbar.findViewWithTag(pinnedKey);
pinnedKeyInToolbar.setBackground(mEnabledToolKeyBackground); if (pinnedKeyInToolbar != null && Settings.getValues().mQuickPinToolbarKeys)
pinnedKeyInToolbar.setBackground(mEnabledToolKeyBackground);
}
} }
colors.setBackground(this, ColorType.STRIP_BACKGROUND); colors.setBackground(this, ColorType.STRIP_BACKGROUND);
updateKeys();
} }
@Override @Override
@ -248,7 +258,14 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
final View pinnedVoiceKey = mPinnedKeys.findViewWithTag(ToolbarKey.VOICE); final View pinnedVoiceKey = mPinnedKeys.findViewWithTag(ToolbarKey.VOICE);
if (pinnedVoiceKey != null) if (pinnedVoiceKey != null)
pinnedVoiceKey.setVisibility(currentSettingsValues.mShowsVoiceInputKey ? VISIBLE : GONE); 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); mToolbarExpandKey.setScaleX((mToolbarContainer.getVisibility() != VISIBLE ? 1f : -1f) * mRtl);
// hide pinned keys if device is locked, and avoid expanding toolbar // 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 final boolean hideToolbarKeys = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1
? km.isDeviceLocked() ? km.isDeviceLocked()
: km.isKeyguardLocked(); : km.isKeyguardLocked();
mToolbarExpandKey.setOnClickListener(hideToolbarKeys ? null : this); mToolbarExpandKey.setOnClickListener(hideToolbarKeys || !toolbarIsExpandable ? null : this);
mPinnedKeys.setVisibility(hideToolbarKeys ? GONE : mSuggestionsStrip.getVisibility()); mPinnedKeys.setVisibility(hideToolbarKeys ? GONE : mSuggestionsStrip.getVisibility());
isExternalSuggestionVisible = false; isExternalSuggestionVisible = false;
} }
@ -275,7 +292,6 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
public void setSuggestions(final SuggestedWords suggestedWords, final boolean isRtlLanguage) { public void setSuggestions(final SuggestedWords suggestedWords, final boolean isRtlLanguage) {
clear(); clear();
setRtl(isRtlLanguage); setRtl(isRtlLanguage);
updateKeys();
mSuggestedWords = suggestedWords; mSuggestedWords = suggestedWords;
mStartIndexOfMoreSuggestions = mLayoutHelper.layoutAndReturnStartIndexOfMoreSuggestions( mStartIndexOfMoreSuggestions = mLayoutHelper.layoutAndReturnStartIndexOfMoreSuggestions(
getContext(), mSuggestedWords, mSuggestionsStrip, this); getContext(), mSuggestedWords, mSuggestionsStrip, this);

View file

@ -55,6 +55,15 @@ public final class ResourceUtils {
return windowBounds.width() - insets.left - insets.right; 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) { public static int getKeyboardHeight(final Resources res, final SettingsValues settingsValues) {
final int defaultKeyboardHeight = getDefaultKeyboardHeight(res, settingsValues.mShowsNumberRow); final int defaultKeyboardHeight = getDefaultKeyboardHeight(res, settingsValues.mShowsNumberRow);
// mKeyboardHeightScale Ranges from [.5,1.5], from xml/prefs_screen_appearance.xml // mKeyboardHeightScale Ranges from [.5,1.5], from xml/prefs_screen_appearance.xml

View file

@ -115,6 +115,10 @@ enum class ToolbarKey {
PAGE_UP, PAGE_DOWN, FULL_LEFT, FULL_RIGHT, PAGE_START, PAGE_END 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 toolbarKeyStrings = entries.associateWithTo(EnumMap(ToolbarKey::class.java)) { it.toString().lowercase(Locale.US) }
val defaultToolbarPref by lazy { val defaultToolbarPref by lazy {

View file

@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable 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.R
import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Defaults
import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.settings.Settings
import helium314.keyboard.settings.Setting import helium314.keyboard.latin.utils.Log
import helium314.keyboard.settings.preferences.Preference import helium314.keyboard.latin.utils.ToolbarMode
import helium314.keyboard.settings.preferences.ReorderSwitchPreference 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.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.Theme
import helium314.keyboard.settings.dialogs.ToolbarKeysCustomizer import helium314.keyboard.settings.dialogs.ToolbarKeysCustomizer
import helium314.keyboard.settings.initPreview 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 import helium314.keyboard.settings.previewDark
@Composable @Composable
fun ToolbarScreen( fun ToolbarScreen(
onClickBack: () -> Unit, 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( val items = listOf(
Settings.PREF_TOOLBAR_KEYS, Settings.PREF_TOOLBAR_MODE,
Settings.PREF_PINNED_TOOLBAR_KEYS, if (toolbarMode == ToolbarMode.HIDDEN) Settings.PREF_TOOLBAR_HIDING_GLOBAL else null,
Settings.PREF_CLIPBOARD_TOOLBAR_KEYS, if (toolbarMode in listOf(ToolbarMode.EXPANDABLE, ToolbarMode.TOOLBAR_KEYS))
Settings.PREF_TOOLBAR_CUSTOM_KEY_CODES, Settings.PREF_TOOLBAR_KEYS else null,
Settings.PREF_QUICK_PIN_TOOLBAR_KEYS, if (toolbarMode in listOf(ToolbarMode.EXPANDABLE, ToolbarMode.SUGGESTION_STRIP))
Settings.PREF_AUTO_SHOW_TOOLBAR, Settings.PREF_PINNED_TOOLBAR_KEYS else null,
Settings.PREF_AUTO_HIDE_TOOLBAR, if (toolbarMode in listOf(ToolbarMode.EXPANDABLE, ToolbarMode.TOOLBAR_KEYS))
Settings.PREF_VARIABLE_TOOLBAR_DIRECTION 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( SearchSettingsScreen(
onClickBack = onClickBack, onClickBack = onClickBack,
@ -60,6 +79,23 @@ fun ToolbarScreen(
} }
fun createToolbarSettings(context: Context) = listOf( 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) { Setting(context, Settings.PREF_TOOLBAR_KEYS, R.string.toolbar_keys) {
ReorderSwitchPreference(it, Defaults.PREF_TOOLBAR_KEYS) ReorderSwitchPreference(it, Defaults.PREF_TOOLBAR_KEYS)
}, },

View file

@ -284,6 +284,18 @@
<string name="popup_keys_language_priority" tools:keep="@string/popup_keys_language_priority">Language (priority)</string> <string name="popup_keys_language_priority" tools:keep="@string/popup_keys_language_priority">Language (priority)</string>
<string name="popup_keys_layout" tools:keep="@string/popup_keys_layout">Layout</string> <string name="popup_keys_layout" tools:keep="@string/popup_keys_layout">Layout</string>
<string name="popup_keys_symbols" tools:keep="@string/popup_keys_symbols">Symbols</string> <string name="popup_keys_symbols" tools:keep="@string/popup_keys_symbols">Symbols</string>
<!-- Title of the setting to set the toolbar mode -->
<string name="toolbar_mode">Toolbar mode</string>
<!-- Option to set the toolbar mode to show an expandable toolbar -->
<string name="toolbar_mode_expandable">Toolbar keys and suggestions</string>
<!-- Option to set the toolbar mode to show the toolbar keys only -->
<string name="toolbar_mode_toolbar_keys">Toolbar keys only</string>
<!-- Option to set the toolbar mode to show the suggestions strip only -->
<string name="toolbar_mode_suggestion_strip">Suggestions only</string>
<!-- Option to set the toolbar mode to hidden -->
<string name="toolbar_mode_hidden">Hidden</string>
<!-- Option to hide clipboard and emoji toolbars when main toolbar is hidden -->
<string name="toolbar_hiding_global">Hide clipboard and emoji toolbars too</string>
<!-- Title of the setting to set toolbar keys --> <!-- Title of the setting to set toolbar keys -->
<string name="toolbar_keys">Select toolbar keys</string> <string name="toolbar_keys">Select toolbar keys</string>
<!-- Names of the toolbar keys--> <!-- Names of the toolbar keys-->