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.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);

View file

@ -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)
}

View file

@ -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) {

View file

@ -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,

View file

@ -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);
}
}
}

View file

@ -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) {

View file

@ -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;
}

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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

View file

@ -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 {

View file

@ -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)
},

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_layout" tools:keep="@string/popup_keys_layout">Layout</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 -->
<string name="toolbar_keys">Select toolbar keys</string>
<!-- Names of the toolbar keys-->