diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/PreferencesSettingsFragment.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/PreferencesSettingsFragment.java index bd01a6b47..348c63753 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/PreferencesSettingsFragment.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/PreferencesSettingsFragment.java @@ -25,6 +25,7 @@ import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager; import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.RichInputMethodManager; import org.dslul.openboard.inputmethod.latin.utils.MoreKeysUtilsKt; +import org.dslul.openboard.inputmethod.latin.utils.ToolbarUtilsKt; import kotlin.collections.ArraysKt; @@ -77,6 +78,10 @@ public final class PreferencesSettingsFragment extends SubScreenFragment { MoreKeysUtilsKt.reorderMoreKeysDialog(requireContext(), Settings.PREF_MORE_KEYS_LABELS_ORDER, MoreKeysUtilsKt.MORE_KEYS_LABEL_DEFAULT, R.string.hint_source); return true; }); + findPreference(Settings.PREF_TOOLBAR_KEYS).setOnPreferenceClickListener((pref) -> { + MoreKeysUtilsKt.reorderMoreKeysDialog(requireContext(), Settings.PREF_TOOLBAR_KEYS, ToolbarUtilsKt.getDefaultToolbarPref(), R.string.toolbar_keys); + return true; + }); } @Override @@ -89,7 +94,7 @@ public final class PreferencesSettingsFragment extends SubScreenFragment { refreshEnablingsOfKeypressSoundAndVibrationAndHistRetentionSettings(); if (key == null) return; switch (key) { - case Settings.PREF_MORE_KEYS_ORDER, Settings.PREF_SHOW_POPUP_HINTS, Settings.PREF_SHOW_NUMBER_ROW, Settings.PREF_MORE_KEYS_LABELS_ORDER + case Settings.PREF_MORE_KEYS_ORDER, Settings.PREF_SHOW_POPUP_HINTS, Settings.PREF_SHOW_NUMBER_ROW, Settings.PREF_MORE_KEYS_LABELS_ORDER, "toolbar" -> mReloadKeyboard = true; case Settings.PREF_LOCALIZED_NUMBER_ROW -> KeyboardLayoutSet.onSystemLocaleChanged(); case Settings.PREF_SHOW_HINTS diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/Settings.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/Settings.java index a9267f8aa..5eced5665 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/Settings.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/Settings.java @@ -134,6 +134,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_DONT_SHOW_MISSING_DICTIONARY_DIALOG = "pref_dont_show_missing_dict_dialog"; public static final String PREF_PINNED_KEYS = "pref_pinned_keys"; + public static final String PREF_TOOLBAR_KEYS = "pref_toolbar_keys"; // Emoji public static final String PREF_EMOJI_RECENT_KEYS = "emoji_recent_keys"; @@ -184,6 +185,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang mRes = context.getResources(); mPrefs = DeviceProtectedUtils.getSharedPreferences(context); mPrefs.registerOnSharedPreferenceChangeListener(this); + ToolbarUtilsKt.upgradeToolbarPref(mPrefs); } public void onDestroy() { diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/suggestions/SuggestionStripView.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/suggestions/SuggestionStripView.java index 5e36d2c26..f29045527 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/suggestions/SuggestionStripView.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/suggestions/SuggestionStripView.java @@ -59,6 +59,7 @@ import org.dslul.openboard.inputmethod.latin.suggestions.MoreSuggestionsView.Mor import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils; import org.dslul.openboard.inputmethod.latin.utils.DialogUtils; import org.dslul.openboard.inputmethod.latin.utils.ToolbarKey; +import org.dslul.openboard.inputmethod.latin.utils.ToolbarUtilsKt; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicBoolean; @@ -78,10 +79,6 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick public static boolean DEBUG_SUGGESTIONS; private static final float DEBUG_INFO_TEXT_SIZE_IN_DIP = 6.5f; - // tags of keys to be added to toolbar, in order (all tags must be considered in getStyleableIconId) - private static final ToolbarKey[] toolbarKeys = new ToolbarKey[] {ToolbarKey.VOICE, ToolbarKey.CLIPBOARD, - ToolbarKey.SELECT_ALL, ToolbarKey.COPY, ToolbarKey.UNDO, ToolbarKey.REDO, ToolbarKey.ONE_HANDED, - ToolbarKey.SETTINGS, ToolbarKey.LEFT, ToolbarKey.RIGHT, ToolbarKey.UP, ToolbarKey.DOWN}; private final ViewGroup mSuggestionsStrip; private final ImageButton mToolbarExpandKey; @@ -191,7 +188,7 @@ 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 : toolbarKeys) { + for (final ToolbarKey key : ToolbarUtilsKt.getEnabledToolbarKeys(DeviceProtectedUtils.getSharedPreferences(context))) { final ImageButton button = createToolbarKey(context, keyboardAttr, key); button.setLayoutParams(toolbarKeyLayoutParams); setupKey(button, colors); @@ -217,7 +214,9 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick mToolbarExpandKey.getLayoutParams().width *= 0.82; for (final ToolbarKey pinnedKey : Settings.getInstance().getCurrent().mPinnedKeys) { - mToolbar.findViewWithTag(pinnedKey).setBackground(mEnabledToolKeyBackground); + final View pinnedKeyInToolbar = mToolbar.findViewWithTag(pinnedKey); + if (pinnedKeyInToolbar == null) continue; + pinnedKeyInToolbar.setBackground(mEnabledToolKeyBackground); addKeyToPinnedKeys(pinnedKey); } @@ -236,7 +235,9 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick final int visibility = shouldBeVisible ? VISIBLE : (isFullscreenMode ? GONE : INVISIBLE); setVisibility(visibility); final SettingsValues currentSettingsValues = Settings.getInstance().getCurrent(); - mToolbar.findViewWithTag(ToolbarKey.VOICE).setVisibility(currentSettingsValues.mShowsVoiceInputKey ? VISIBLE : GONE); + final View toolbarVoiceKey = mToolbar.findViewWithTag(ToolbarKey.VOICE); + if (toolbarVoiceKey != null) + toolbarVoiceKey.setVisibility(currentSettingsValues.mShowsVoiceInputKey ? VISIBLE : GONE); final View pinnedVoiceKey = mPinnedKeys.findViewWithTag(ToolbarKey.VOICE); if (pinnedVoiceKey != null) pinnedVoiceKey.setVisibility(currentSettingsValues.mShowsVoiceInputKey ? VISIBLE : GONE); @@ -662,7 +663,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick copy.setScaleType(original.getScaleType()); copy.setScaleX(original.getScaleX()); copy.setScaleY(original.getScaleY()); - copy.setContentDescription(original.getContentDescription()); // todo (later): add some content description + copy.setContentDescription(original.getContentDescription()); copy.setImageDrawable(original.getDrawable()); copy.setLayoutParams(original.getLayoutParams()); setupKey(copy, Settings.getInstance().getCurrent().mColors); diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/MoreKeysUtils.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/MoreKeysUtils.kt index 2245bba31..3efc669b9 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/MoreKeysUtils.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/MoreKeysUtils.kt @@ -117,7 +117,7 @@ fun reorderMoreKeysDialog(context: Context, key: String, defaultSetting: String, } override fun onBindViewHolder(p0: RecyclerView.ViewHolder, p1: Int) { val (text, wasChecked) = orderedItems[p1] - val displayTextId = context.resources.getIdentifier(text, "string", context.packageName) + val displayTextId = context.resources.getIdentifier(text.lowercase(), "string", context.packageName) val displayText = if (displayTextId == 0) text else context.getString(displayTextId) p0.itemView.findViewById(R.id.morekeys_type)?.text = displayText val switch = p0.itemView.findViewById(R.id.morekeys_switch) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ToolbarUtils.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ToolbarUtils.kt index 3f139130e..4e1a57f93 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ToolbarUtils.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ToolbarUtils.kt @@ -1,9 +1,12 @@ +// SPDX-License-Identifier: GPL-3.0-only package org.dslul.openboard.inputmethod.latin.utils import android.content.Context +import android.content.SharedPreferences import android.content.res.TypedArray import android.widget.ImageButton import android.widget.ImageView +import androidx.core.content.edit import org.dslul.openboard.inputmethod.latin.R import org.dslul.openboard.inputmethod.latin.common.Constants.* import org.dslul.openboard.inputmethod.latin.settings.Settings @@ -14,6 +17,9 @@ fun createToolbarKey(context: Context, keyboardAttr: TypedArray, key: ToolbarKey val button = ImageButton(context, null, R.attr.suggestionWordStyle) button.scaleType = ImageView.ScaleType.CENTER button.tag = key + val contentDescriptionId = context.resources.getIdentifier(key.name.lowercase(), "string", context.packageName) + if (contentDescriptionId != 0) + button.contentDescription = context.getString(contentDescriptionId) val icon = keyboardAttr.getDrawable(getStyleableIconId(key)) if (key == LEFT || key == RIGHT || key == UP || key == DOWN) { // arrows look a little awkward when not scaled @@ -56,8 +62,45 @@ private fun getStyleableIconId(key: ToolbarKey) = when (key) { CLEAR_CLIPBOARD -> R.styleable.Keyboard_iconClearClipboardKey } +// names need to be aligned with resources strings (using lowercase of key.name) enum class ToolbarKey { VOICE, CLIPBOARD, CLEAR_CLIPBOARD, SETTINGS, SELECT_ALL, COPY, ONE_HANDED, LEFT, RIGHT, UP, DOWN, UNDO, REDO } fun toToolbarKeyString(keys: Collection) = keys.joinToString(";") { it.name } + +val defaultToolbarPref = entries.joinToString(";") { if (it != CLEAR_CLIPBOARD) "${it.name},true" else "${it.name},false" } + +/** add missing keys, typically because a new key has been added */ +fun upgradeToolbarPref(prefs: SharedPreferences) { + val list = prefs.getString(Settings.PREF_TOOLBAR_KEYS, defaultToolbarPref)!!.split(";").toMutableList() + if (list.size == ToolbarKey.entries.size) return + ToolbarKey.entries.forEach { key -> + if (list.none { it.startsWith("${key.name},") }) + list.add("${key.name},true") + } + // likely not needed, but better prepare for possibility of key removal + list.removeAll { + try { + ToolbarKey.valueOf(it.substringBefore(",")) + false + } catch (_: IllegalArgumentException) { + true + } + } + prefs.edit { putString(Settings.PREF_TOOLBAR_KEYS, list.joinToString(";")) } +} + +fun getEnabledToolbarKeys(prefs: SharedPreferences): List { + val string = prefs.getString("toolbar", defaultToolbarPref)!! + return string.split(";").mapNotNull { + val split = it.split(",") + if (split.last() == "true") { + try { + ToolbarKey.valueOf(split.first()) + } catch (_: IllegalArgumentException) { + null + } + } else null + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1dd221e9..84b188b9a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -238,11 +238,28 @@ Select hint source Select popup key order - Number row - Language - Language (priority) - Layout - Symbols + + Number row + Language + Language (priority) + Layout + Symbols + + Select toolbar keys + + Copy + Clipboard + Clear clipboard + Voice input + Settings + Select all + One-handed mode + Left + Right + Up + Down + Undo + Redo Show functional hints diff --git a/app/src/main/res/xml/prefs_screen_preferences.xml b/app/src/main/res/xml/prefs_screen_preferences.xml index 7c47dee30..a25492f1b 100644 --- a/app/src/main/res/xml/prefs_screen_preferences.xml +++ b/app/src/main/res/xml/prefs_screen_preferences.xml @@ -94,6 +94,10 @@ android:defaultValue="false" android:persistent="true" /> + +