From 9d8571db0f932a5f31544b8311893d30b94c02f4 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 30 Jul 2023 08:34:29 +0200 Subject: [PATCH] update themes to work with the new base theme slight adjustments to base theme to work around some strange issues start replacing old themes with color variants of the base theme --- .../openboard/inputmethod/keyboard/Key.java | 4 - .../inputmethod/keyboard/KeyboardTheme.java | 66 +++++++++++ .../inputmethod/keyboard/KeyboardView.java | 42 +++---- .../keyboard/clipboard/ClipboardAdapter.kt | 13 ++- .../clipboard/ClipboardHistoryView.kt | 23 ++-- .../keyboard/emoji/EmojiPalettesView.java | 40 ++----- .../inputmethod/latin/common/Colors.java | 107 +++++++++++------- .../settings/AppearanceSettingsFragment.kt | 49 +++++++- .../inputmethod/latin/settings/Settings.java | 18 ++- .../latin/settings/SettingsValues.java | 2 +- .../suggestions/SuggestionStripView.java | 2 +- ...keyboard_key_popup_selected_lxx_base.9.png | Bin 1662 -> 0 bytes ...tn_keyboard_spacebar_normal_lxx_base.9.png | Bin 1719 -> 0 bytes ...n_keyboard_spacebar_pressed_lxx_base.9.png | Bin 1737 -> 0 bytes ...keyboard_key_popup_selected_lxx_base.9.png | Bin 1636 -> 0 bytes ...tn_keyboard_spacebar_normal_lxx_base.9.png | Bin 1677 -> 0 bytes ...n_keyboard_spacebar_pressed_lxx_base.9.png | Bin 1682 -> 0 bytes ...keyboard_key_popup_selected_lxx_base.9.png | Bin 1679 -> 0 bytes ...tn_keyboard_spacebar_normal_lxx_base.9.png | Bin 1769 -> 0 bytes ...n_keyboard_spacebar_pressed_lxx_base.9.png | Bin 1793 -> 0 bytes ...keyboard_key_popup_selected_lxx_base.9.png | Bin 1719 -> 0 bytes ...tn_keyboard_spacebar_normal_lxx_base.9.png | Bin 1930 -> 0 bytes ...n_keyboard_spacebar_pressed_lxx_base.9.png | Bin 1966 -> 0 bytes ...keyboard_key_popup_selected_lxx_base.9.png | Bin 1983 -> 0 bytes ...tn_keyboard_spacebar_normal_lxx_base.9.png | Bin 2270 -> 0 bytes ...n_keyboard_spacebar_pressed_lxx_base.9.png | Bin 2300 -> 0 bytes .../drawable/btn_keyboard_key_lxx_base.xml | 16 +-- .../btn_keyboard_key_popup_lxx_base.xml | 9 +- .../btn_keyboard_spacebar_lxx_base.xml | 39 ++++--- app/src/main/res/values/colors.xml | 4 +- app/src/main/res/values/strings.xml | 10 ++ .../res/values/themes-lxx-base-border.xml | 2 +- app/src/main/res/values/themes-lxx-base.xml | 2 +- .../main/res/xml/prefs_screen_appearance.xml | 4 + 34 files changed, 285 insertions(+), 167 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-mdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xhdpi/btn_keyboard_key_popup_selected_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xhdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/btn_keyboard_key_popup_selected_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/Key.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/Key.java index 719c0a687..e1f8af089 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/Key.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/Key.java @@ -1137,10 +1137,6 @@ public class Key implements Comparable { } } - public boolean isPressed() { - return mPressed; - } - public boolean isFunctional() { return mBackgroundType == BACKGROUND_TYPE_FUNCTIONAL || mBackgroundType == BACKGROUND_TYPE_STICKY_OFF diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardTheme.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardTheme.java index 32cde0d2c..2edf8eab8 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardTheme.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardTheme.java @@ -18,11 +18,16 @@ package org.dslul.openboard.inputmethod.keyboard; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.Color; import android.os.Build; import android.os.Build.VERSION_CODES; import android.util.Log; +import androidx.core.content.ContextCompat; + import org.dslul.openboard.inputmethod.latin.R; +import org.dslul.openboard.inputmethod.latin.common.Colors; +import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils; import java.util.Arrays; @@ -48,6 +53,8 @@ public final class KeyboardTheme implements Comparable { new String[] {THEME_VARIANT_LIGHT, THEME_VARIANT_DARK, THEME_VARIANT_CUSTOM}); THEME_VARIANTS.put(THEME_FAMILY_HOLO, new String[] {THEME_VARIANT_WHITE, THEME_VARIANT_BLUE, THEME_VARIANT_HOLO_USER}); + THEME_VARIANTS.put(THEME_FAMILY_HOLO, + new String[] {THEME_VARIANT_WHITE, THEME_VARIANT_BLUE, THEME_VARIANT_HOLO_USER}); } private static final String TAG = KeyboardTheme.class.getSimpleName(); @@ -347,4 +354,63 @@ public final class KeyboardTheme implements Comparable { if (keyBorders) return THEME_ID_LXX_LIGHT_BORDER; return THEME_ID_LXX_LIGHT; } + + public static final String THEME_LIGHT = "light"; + public static final String THEME_DARK = "dark"; + public static final String THEME_DARKER = "darker"; + public static final String THEME_BLACK = "black"; + public static final String THEME_USER = "user"; + + public static Colors getCustomTheme(String theme, Context context, SharedPreferences prefs) { + switch (theme) { + case THEME_USER: + final int accent = prefs.getInt(Settings.PREF_THEME_USER_COLOR_ACCENT, Color.BLUE); + final int keyBgColor = prefs.getInt(Settings.PREF_THEME_USER_COLOR_KEYS, Color.LTGRAY); + final int keyTextColor = prefs.getInt(Settings.PREF_THEME_USER_COLOR_TEXT, Color.WHITE); + final int hintTextColor = prefs.getInt(Settings.PREF_THEME_USER_COLOR_HINT_TEXT, Color.WHITE); + final int background = prefs.getInt(Settings.PREF_THEME_USER_COLOR_BACKGROUND, Color.DKGRAY); + return new Colors(accent, background, keyBgColor, Colors.darken(keyBgColor), keyBgColor, keyTextColor, hintTextColor); + case THEME_DARK: + return new Colors( + ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), + Color.parseColor("#263238"), + Color.parseColor("#364248"), + Color.parseColor("#2d393f"), + Color.parseColor("#364248"), + ContextCompat.getColor(context, R.color.key_text_color_lxx_dark), + ContextCompat.getColor(context, R.color.key_hint_letter_color_lxx_dark) + ); + case THEME_DARKER: + return new Colors( + ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), + ContextCompat.getColor(context, R.color.keyboard_background_lxx_dark_border), + ContextCompat.getColor(context, R.color.key_background_normal_lxx_dark_border), + ContextCompat.getColor(context, R.color.key_background_functional_lxx_dark_border), + ContextCompat.getColor(context, R.color.key_background_normal_lxx_dark_border), + ContextCompat.getColor(context, R.color.key_text_color_lxx_dark), + ContextCompat.getColor(context, R.color.key_hint_letter_color_lxx_dark) + ); + case THEME_BLACK: + return new Colors( + ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), + ContextCompat.getColor(context, R.color.background_amoled_black), + ContextCompat.getColor(context, R.color.background_amoled_dark), + ContextCompat.getColor(context, R.color.background_amoled_dark), + ContextCompat.getColor(context, R.color.background_amoled_dark), + ContextCompat.getColor(context, R.color.key_text_color_lxx_dark), + ContextCompat.getColor(context, R.color.key_hint_letter_color_lxx_dark) + ); + case THEME_LIGHT: + default: + return new Colors( + ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_light), + ContextCompat.getColor(context, R.color.keyboard_background_lxx_light_border), + ContextCompat.getColor(context, R.color.key_background_normal_lxx_light_border), + ContextCompat.getColor(context, R.color.key_background_functional_lxx_light_border), + ContextCompat.getColor(context, R.color.key_background_normal_lxx_light_border), + ContextCompat.getColor(context, R.color.key_text_color_lxx_light), + ContextCompat.getColor(context, R.color.key_hint_letter_color_lxx_light) + ); + } + } } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardView.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardView.java index 990b21660..7183359f7 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardView.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardView.java @@ -31,6 +31,7 @@ import android.graphics.drawable.NinePatchDrawable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; +import androidx.core.graphics.drawable.DrawableCompat; import org.dslul.openboard.inputmethod.keyboard.internal.KeyDrawParams; import org.dslul.openboard.inputmethod.keyboard.internal.KeyVisualAttributes; @@ -171,8 +172,12 @@ public class KeyboardView extends View { mPaint.setAntiAlias(true); mColors = Settings.getInstance().getCurrent().mColors; - if (mColors.isCustom) + if (mColors.isCustom) { + DrawableCompat.setTintMode(mKeyBackground, PorterDuff.Mode.MULTIPLY); + DrawableCompat.setTintMode(mSpacebarBackground, PorterDuff.Mode.MULTIPLY); + DrawableCompat.setTintMode(mFunctionalKeyBackground, PorterDuff.Mode.MULTIPLY); getBackground().setColorFilter(mColors.backgroundFilter); + } } @Nullable @@ -625,38 +630,21 @@ public class KeyboardView extends View { } private void setCustomKeyBackgroundColor(Key key, Keyboard keyboard, Drawable background) { - // color filter is applied to background, which is re-used - // action key and normal key share the same background drawable, so we need to select the correct color filter + // colors are applied to background, which is re-used + // action key and normal key share the same background drawable, so we need to select the correct colors + if (isAccentColoredKey(key)) { // action key and its popup keys - if (key.isPressed()) - background.setColorFilter(mColors.accentPressedColorFilter); - else - background.setColorFilter(mColors.accentColorFilter); + DrawableCompat.setTintList(background, mColors.actionKeyStateList); } else if (key.getBackgroundType() == Key.BACKGROUND_TYPE_SPACEBAR) { // space - if (key.isPressed()) - background.setColorFilter(mColors.spaceBarPressedFilter); - else - background.setColorFilter(mColors.spaceBarFilter); + DrawableCompat.setTintList(background, mColors.spaceBarStateList); } else if (key.isFunctional()) { // shift, 123, delete,... - if (key.isPressed()) - background.setColorFilter(mColors.functionalKeyPressedBackgroundFilter); - else - background.setColorFilter(mColors.functionalKeyBackgroundFilter); + DrawableCompat.setTintList(background, mColors.functionalKeyStateList); } else if (this.getClass() == MoreKeysKeyboardView.class) { // more keys popup (except on action key, which is handled above) - if (key.isPressed()) - background.setColorFilter(mColors.backgroundPressedFilter); - else - background.setColorFilter(mColors.backgroundFilter); + DrawableCompat.setTintList(background, mColors.backgroundStateList); } else if (key.getBackgroundType() == Key.BACKGROUND_TYPE_NORMAL) { // normal keys - if (key.isPressed()) - background.setColorFilter(mColors.keyPressedBackgroundFilter); - else - background.setColorFilter(mColors.keyBackgroundFilter); + DrawableCompat.setTintList(background, mColors.keyStateList); } else if (keyboard.mId.mElementId >= 10 && keyboard.mId.mElementId <= 26) { // emoji keyboard keys - if (key.isPressed()) - background.setColorFilter(mColors.backgroundPressedFilter); - else - background.setColorFilter(mColors.backgroundFilter); + DrawableCompat.setTintList(background, mColors.backgroundStateList); } } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardAdapter.kt b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardAdapter.kt index a322cc2b9..385e6e476 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardAdapter.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardAdapter.kt @@ -1,6 +1,6 @@ package org.dslul.openboard.inputmethod.keyboard.clipboard -import android.graphics.ColorFilter +import android.graphics.PorterDuff import android.graphics.Typeface import android.util.TypedValue import android.view.LayoutInflater @@ -9,6 +9,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.core.graphics.drawable.DrawableCompat import androidx.recyclerview.widget.RecyclerView import org.dslul.openboard.inputmethod.latin.ClipboardHistoryEntry import org.dslul.openboard.inputmethod.latin.ClipboardHistoryManager @@ -24,7 +25,6 @@ class ClipboardAdapter( var pinnedIconResId = 0 var itemBackgroundId = 0 - var itemBackgroundColorFilter: ColorFilter? = null var itemTypeFace: Typeface? = null var itemTextColor = 0 var itemTextSize = 0f @@ -56,7 +56,11 @@ class ClipboardAdapter( setOnTouchListener(this@ViewHolder) setOnLongClickListener(this@ViewHolder) setBackgroundResource(itemBackgroundId) - background.colorFilter = itemBackgroundColorFilter + val colors = Settings.getInstance().current.mColors + if (colors.isCustom) { + DrawableCompat.setTintList(background, colors.keyStateList) + DrawableCompat.setTintMode(background, PorterDuff.Mode.MULTIPLY) + } } pinnedIconView = view.findViewById(R.id.clipboard_entry_pinned_icon).apply { visibility = View.GONE @@ -78,11 +82,8 @@ class ClipboardAdapter( override fun onTouch(view: View, event: MotionEvent): Boolean { if (event.actionMasked != MotionEvent.ACTION_DOWN) { - if (event.actionMasked == MotionEvent.ACTION_UP) - view.background.colorFilter = Settings.getInstance().current.mColors.keyBackgroundFilter return false } - view.background.colorFilter = Settings.getInstance().current.mColors.keyPressedBackgroundFilter keyEventListener.onKeyDown(view.tag as Long) return false } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardHistoryView.kt b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardHistoryView.kt index 1b9228b21..e5c0ff7a2 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardHistoryView.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardHistoryView.kt @@ -9,6 +9,7 @@ import android.widget.FrameLayout import android.widget.ImageButton import android.widget.LinearLayout import android.widget.TextView +import androidx.core.graphics.drawable.DrawableCompat import androidx.recyclerview.widget.StaggeredGridLayoutManager import org.dslul.openboard.inputmethod.keyboard.KeyboardActionListener import org.dslul.openboard.inputmethod.keyboard.internal.KeyDrawParams @@ -114,9 +115,10 @@ class ClipboardHistoryView @JvmOverloads constructor( text = label typeface = params.mTypeface val colors = Settings.getInstance().current.mColors - if (colors.isCustom) + if (colors.isCustom) { setTextColor(colors.keyText) - else + DrawableCompat.setTintList(this.background, colors.functionalKeyStateList) + } else setTextColor(params.mFunctionalTextColor) setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mLabelSize.toFloat()) } @@ -127,11 +129,10 @@ class ClipboardHistoryView @JvmOverloads constructor( itemBackgroundId = keyBackgroundId itemTypeFace = params.mTypeface val colors = Settings.getInstance().current.mColors - if (colors.isCustom) { - itemTextColor = colors.keyText - itemBackgroundColorFilter = colors.keyBackgroundFilter - } else - itemTextColor = params.mTextColor + itemTextColor = if (colors.isCustom) + colors.keyText + else + params.mTextColor itemTextSize = params.mLabelSize.toFloat() } } @@ -183,18 +184,12 @@ class ClipboardHistoryView @JvmOverloads constructor( override fun onTouch(view: View, event: MotionEvent): Boolean { if (event.actionMasked != MotionEvent.ACTION_DOWN) { - if (view == alphabetKey && event.actionMasked != MotionEvent.ACTION_UP) - alphabetKey.background.colorFilter = Settings.getInstance().current.mColors.functionalKeyBackgroundFilter - return false } when (view) { - alphabetKey -> { - alphabetKey.background.colorFilter = Settings.getInstance().current.mColors.functionalKeyPressedBackgroundFilter - keyboardActionListener?.onPressKey( + alphabetKey -> keyboardActionListener?.onPressKey( Constants.CODE_ALPHA_FROM_CLIPBOARD, 0 /* repeatCount */, true /* isSinglePointer */) - } clearKey -> keyboardActionListener?.onPressKey( Constants.CODE_UNSPECIFIED, 0 /* repeatCount */, true /* isSinglePointer */) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPalettesView.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPalettesView.java index 36947252b..38f147662 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPalettesView.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPalettesView.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; +import android.graphics.PorterDuff; import android.util.AttributeSet; import android.util.TypedValue; import android.view.LayoutInflater; @@ -34,6 +35,7 @@ import android.widget.TabWidget; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.dslul.openboard.inputmethod.compat.TabHostCompat; @@ -55,9 +57,6 @@ import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils; import org.jetbrains.annotations.NotNull; -import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_ALPHA_FROM_EMOJI; -import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_DELETE; -import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_SPACE; import static org.dslul.openboard.inputmethod.latin.common.Constants.NOT_A_COORDINATE; /** @@ -274,12 +273,15 @@ public final class EmojiPalettesView extends LinearLayout mSpacebar.setOnClickListener(this); final Colors colors = Settings.getInstance().getCurrent().mColors; if (colors.isCustom) { - mAlphabetKeyLeft.getBackground().setColorFilter(colors.functionalKeyBackgroundFilter); - mSpacebar.getBackground().setColorFilter(colors.spaceBarFilter); - mDeleteKey.getBackground().setColorFilter(colors.functionalKeyBackgroundFilter); + DrawableCompat.setTintList(mAlphabetKeyLeft.getBackground(), colors.functionalKeyStateList); + DrawableCompat.setTintList(mSpacebar.getBackground(), colors.spaceBarStateList); + DrawableCompat.setTintList(mDeleteKey.getBackground(), colors.functionalKeyStateList); + DrawableCompat.setTintMode(mAlphabetKeyLeft.getBackground(), PorterDuff.Mode.MULTIPLY); + DrawableCompat.setTintMode(mSpacebar.getBackground(), PorterDuff.Mode.MULTIPLY); + DrawableCompat.setTintMode(mDeleteKey.getBackground(), PorterDuff.Mode.MULTIPLY); getBackground().setColorFilter(colors.backgroundFilter); mEmojiCategoryPageIndicatorView.setColors(colors.accent, colors.background); - findViewById(R.id.emoji_tab_strip).getBackground().setColorFilter(colors.backgroundFilter); + findViewById(R.id.emoji_tab_strip).getBackground().setColorFilter(colors.adjustedBackgroundFilter); } mEmojiLayoutParams.setKeyProperties(mSpacebar); mSpacebarIcon = findViewById(R.id.emoji_keyboard_space_icon); @@ -307,7 +309,8 @@ public final class EmojiPalettesView extends LinearLayout if (mCurrentTab != null) mCurrentTab.setColorFilter(colors.keyTextFilter); mCurrentTab = (ImageView) mTabHost.getCurrentTabView(); - mCurrentTab.setColorFilter(colors.accentColorFilter); +// mCurrentTab.setColorFilter(colors.accentColorFilter); // todo (later): doesn't work properly, because enabled drawable is blue -> adjust + mCurrentTab.setColorFilter(colors.accent); } } @@ -320,20 +323,7 @@ public final class EmojiPalettesView extends LinearLayout */ @Override public boolean onTouch(final View v, final MotionEvent event) { - final int eventCode = event.getActionMasked(); - if (eventCode != MotionEvent.ACTION_DOWN) { - if (eventCode == MotionEvent.ACTION_UP) { - final Object tag = v.getTag(); - if (!(tag instanceof Integer)) - return false; - final int code = (Integer) tag; - if (code == CODE_SPACE) - v.getBackground().setColorFilter(Settings.getInstance().getCurrent().mColors.spaceBarFilter); - else if (code == CODE_DELETE) - v.getBackground().setColorFilter(Settings.getInstance().getCurrent().mColors.functionalKeyBackgroundFilter); - else if (code == CODE_ALPHA_FROM_EMOJI) - v.getBackground().setColorFilter(Settings.getInstance().getCurrent().mColors.functionalKeyBackgroundFilter); - } + if (event.getActionMasked() != MotionEvent.ACTION_DOWN) { return false; } final Object tag = v.getTag(); @@ -341,12 +331,6 @@ public final class EmojiPalettesView extends LinearLayout return false; } final int code = (Integer) tag; - if (code == CODE_SPACE) - v.getBackground().setColorFilter(Settings.getInstance().getCurrent().mColors.spaceBarPressedFilter); - else if (code == CODE_DELETE) - v.getBackground().setColorFilter(Settings.getInstance().getCurrent().mColors.functionalKeyPressedBackgroundFilter); - else if (code == CODE_ALPHA_FROM_EMOJI) - v.getBackground().setColorFilter(Settings.getInstance().getCurrent().mColors.functionalKeyPressedBackgroundFilter); mKeyboardActionListener.onPressKey( code, 0 /* repeatCount */, true /* isSinglePointer */); // It's important to return false here. Otherwise, {@link #onClick} and touch-down visual diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Colors.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Colors.java index 3a387a60b..e8d4c44da 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Colors.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Colors.java @@ -1,5 +1,6 @@ package org.dslul.openboard.inputmethod.latin.common; +import android.content.res.ColorStateList; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.ColorFilter; @@ -12,7 +13,7 @@ import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme; public class Colors { - public final boolean isCustom; // todo: could be removed? + public final boolean isCustom; public final int navBar; public final int accent; public final int background; @@ -21,32 +22,37 @@ public class Colors { public final int spaceBar; public final int keyText; public final int keyHintText; + // todo: evaluate which colors, colorFilters and colorStateLists area actually necessary public ColorFilter backgroundFilter; - public ColorFilter backgroundPressedFilter; + public ColorFilter adjustedBackgroundFilter; public ColorFilter keyBackgroundFilter; - public ColorFilter keyPressedBackgroundFilter; public ColorFilter functionalKeyBackgroundFilter; - public ColorFilter functionalKeyPressedBackgroundFilter; public ColorFilter spaceBarFilter; - public ColorFilter spaceBarPressedFilter; - public ColorFilter keyTextFilter; // todo: really necessary? - public ColorFilter keyHintTextFilter; // todo: really? color alone should be sufficient i think... test! - public ColorFilter accentColorFilter; // todo: really necessary? - public ColorFilter accentPressedColorFilter; + public ColorFilter keyTextFilter; + public ColorFilter accentColorFilter; public ColorFilter actionKeyIconColorFilter; - public Colors(int acc, int bg, int k, int fun, int space, int kt, int kht) { + public ColorStateList backgroundStateList; + public ColorStateList keyStateList; + public ColorStateList functionalKeyStateList; + public ColorStateList actionKeyStateList; + public ColorStateList spaceBarStateList; + public ColorStateList adjustedBackgroundStateList; // todo (later): use in MoreKeys popup, without breaking when the selection has a radius set + + + public Colors(int _accent, int _background, int _keyBackground, int _functionalKey, int _spaceBar, int _keyText, int _keyHintText) { isCustom = true; - accent = acc; - background = bg; - keyBackground = k; - functionalKey = fun; - spaceBar = space; - keyText = kt; - keyHintText = kht; + accent = _accent; + background = _background; + keyBackground = _keyBackground; + functionalKey = _functionalKey; + spaceBar = _spaceBar; + keyText = _keyText; + keyHintText = _keyHintText; navBar = background; } + // todo (later): remove this and isCustom, once the old themes can be completely replaced public Colors(int themeId, int nightModeFlags) { isCustom = false; if (KeyboardTheme.getIsDayNight(themeId)) { @@ -74,42 +80,45 @@ public class Colors { } public void createColorFilters(final boolean hasKeyBorders) { + final int[][] states = new int[][] { +// new int[] { android.R.attr.state_checked}, // checked -> todo: when is this happening? there are more states, but when are they used? + new int[] { android.R.attr.state_pressed}, // pressed + new int[] { -android.R.attr.state_pressed}, // not pressed + }; + backgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(background, BlendModeCompat.MODULATE); - backgroundPressedFilter = isDarkColor(background) - // todo: below is not working, but why? -// ? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(ColorUtils.blendARGB(background, Color.WHITE, 0.1f), BlendModeCompat.MODULATE) - ? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(background, BlendModeCompat.SCREEN) - : backgroundFilter; + + // todo: use adjusted? or is this just for space bar in no border theme? + // maybe for morekeys popup, but then need to set background color there too + final int adjustedBackground = brightenOrDarken(background, true); + adjustedBackgroundStateList = new ColorStateList(states, new int[] { brightenOrDarken(adjustedBackground, true), adjustedBackground }); + adjustedBackgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(adjustedBackground, BlendModeCompat.MODULATE); + + // todo (later): for bright colors there often is no need for 2 states, could just have one (because keys will darken anyway) -> test! if (hasKeyBorders) { keyBackgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyBackground, BlendModeCompat.MODULATE); functionalKeyBackgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(functionalKey, BlendModeCompat.MODULATE); spaceBarFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(spaceBar, BlendModeCompat.MODULATE); - keyPressedBackgroundFilter = isDarkColor(keyBackground) - ? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(ColorUtils.blendARGB(keyBackground, Color.WHITE, 0.1f), BlendModeCompat.MODULATE) - : keyBackgroundFilter; - functionalKeyPressedBackgroundFilter = isDarkColor(functionalKey) - ? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(ColorUtils.blendARGB(functionalKey, Color.WHITE, 0.1f), BlendModeCompat.MODULATE) - : functionalKeyBackgroundFilter; - spaceBarPressedFilter = isDarkColor(spaceBar) - ? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(ColorUtils.blendARGB(spaceBar, Color.WHITE, 0.1f), BlendModeCompat.MODULATE) - : spaceBarFilter; + + backgroundStateList = new ColorStateList(states, new int[] { brightenOrDarken(background, true), background }); + keyStateList = new ColorStateList(states, new int[] { brightenOrDarken(keyBackground, true), keyBackground }); + functionalKeyStateList = new ColorStateList(states, new int[] { brightenOrDarken(functionalKey, true), functionalKey }); + actionKeyStateList = new ColorStateList(states, new int[] { brightenOrDarken(accent, true), accent }); + spaceBarStateList = new ColorStateList(states, new int[] { brightenOrDarken(spaceBar, true), spaceBar }); } else { // need to set color to background if key borders are disabled, or there will be ugly keys keyBackgroundFilter = backgroundFilter; functionalKeyBackgroundFilter = keyBackgroundFilter; spaceBarFilter = keyBackgroundFilter; - keyPressedBackgroundFilter = backgroundPressedFilter; - functionalKeyPressedBackgroundFilter = keyBackgroundFilter; - spaceBarPressedFilter = keyBackgroundFilter; + + backgroundStateList = new ColorStateList(states, new int[] { brightenOrDarken(background, true), background }); + keyStateList = backgroundStateList; + functionalKeyStateList = backgroundStateList; + actionKeyStateList = new ColorStateList(states, new int[] { brightenOrDarken(accent, true), accent }); + spaceBarStateList = adjustedBackgroundStateList; } - // todo: some of these should be modulate (once the base theme is done) - // especially the accent pressed filter should use modulate/screen keyTextFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyText, BlendModeCompat.SRC_ATOP); - keyHintTextFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyHintText, BlendModeCompat.SRC_ATOP); - accentColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(accent, BlendModeCompat.SRC_ATOP); - accentPressedColorFilter = isDarkColor(accent) - ? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(ColorUtils.blendARGB(accent, Color.WHITE, 0.1f), BlendModeCompat.SRC_ATOP) - : BlendModeColorFilterCompat.createBlendModeColorFilterCompat(ColorUtils.blendARGB(accent, Color.BLACK, 0.1f), BlendModeCompat.SRC_ATOP); + accentColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(accent, BlendModeCompat.MODULATE); actionKeyIconColorFilter = isBrightColor(accent) // the white icon may not have enough contrast, and can't be adjusted by the user ? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.DKGRAY, BlendModeCompat.SRC_ATOP) : null; @@ -126,6 +135,7 @@ public class Colors { return brightnessSquared >= 210*210; } + // todo (later): what needs to be public? public static boolean isDarkColor(int color) { if (android.R.color.transparent == color) { return true; @@ -136,4 +146,19 @@ public class Colors { int brightnessSquared = (int) (rgb[0] * rgb[0] * .241 + rgb[1] * rgb[1] * .691 + rgb[2] * rgb[2] * .068); return brightnessSquared < 50*50; } + + public static int brightenOrDarken(final int color, final boolean preferDarken) { + if (preferDarken) { + if (isDarkColor(color)) return brighten(color); + else return darken(color); + } else if (isBrightColor(color)) return darken(color); + else return brighten(color); + } + public static int brighten(final int color) { + return ColorUtils.blendARGB(color, Color.WHITE, 0.2f); // brighten is stronger, because often the drawables get darker when pressed + } + + public static int darken(final int color) { + return ColorUtils.blendARGB(color, Color.BLACK, 0.1f); + } } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/AppearanceSettingsFragment.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/AppearanceSettingsFragment.kt index 45a84c93d..31902e5cf 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/AppearanceSettingsFragment.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/AppearanceSettingsFragment.kt @@ -22,6 +22,7 @@ import android.os.Bundle import android.preference.ListPreference import android.preference.Preference import android.preference.TwoStatePreference +import androidx.core.content.edit import org.dslul.openboard.inputmethod.keyboard.KeyboardSwitcher import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme import org.dslul.openboard.inputmethod.latin.R @@ -32,6 +33,7 @@ import java.util.* /** * "Appearance" settings sub screen. */ +@Suppress("Deprecation") // yes everything here is deprecated, but only work on this if really necessary class AppearanceSettingsFragment : SubScreenFragment(), Preference.OnPreferenceChangeListener { private var selectedThemeId = 0 @@ -39,6 +41,7 @@ class AppearanceSettingsFragment : SubScreenFragment(), Preference.OnPreferenceC private lateinit var themeFamilyPref: ListPreference private lateinit var themeVariantPref: ListPreference + private lateinit var customThemeVariantPref: ListPreference private lateinit var keyBordersPref: TwoStatePreference private lateinit var amoledModePref: TwoStatePreference private var dayNightPref: TwoStatePreference? = null @@ -55,6 +58,7 @@ class AppearanceSettingsFragment : SubScreenFragment(), Preference.OnPreferenceC removePreference(Settings.PREF_THEME_DAY_NIGHT) } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + // todo: consider removing the preference, and always set the navbar color removePreference(Settings.PREF_NAVBAR_COLOR) } setupTheme() @@ -120,6 +124,25 @@ class AppearanceSettingsFragment : SubScreenFragment(), Preference.OnPreferenceC isEnabled = isLegacyFamily || !KeyboardTheme.getIsDayNight(selectedThemeId) } } + customThemeVariantPref.apply { + val variant = sharedPreferences.getString(Settings.PREF_CUSTOM_THEME_VARIANT, KeyboardTheme.THEME_LIGHT) + // todo: some way of following system, with setting a dark and a light theme + // check whether night mode is active using context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK + // this is needed so the auto-theme can be replaced + // idea: add a "dark theme variant" preference when auto-switch is on + // todo (later): material you, system accent, ... + // todo (idea): re-work setting to actually see preview of theme colors... but that's a lot of work + val variants = arrayOf(KeyboardTheme.THEME_LIGHT, KeyboardTheme.THEME_DARK, KeyboardTheme.THEME_DARKER, KeyboardTheme.THEME_BLACK, KeyboardTheme.THEME_USER) + entries = variants.map { + val resId = resources.getIdentifier("theme_name_$it", "string", activity.packageName) + if (resId == 0) it else getString(resId) + }.toTypedArray() + entryValues = variants + value = variant + val resId = resources.getIdentifier("theme_name_$variant", "string", activity.packageName) + summary = if (resId == 0) variant else getString(resId) + isEnabled = true + } keyBordersPref.apply { isEnabled = !isLegacyFamily && !KeyboardTheme.getIsAmoledMode(selectedThemeId) isChecked = isLegacyFamily || KeyboardTheme.getHasKeyBorders(selectedThemeId) @@ -135,7 +158,7 @@ class AppearanceSettingsFragment : SubScreenFragment(), Preference.OnPreferenceC isChecked = !isLegacyFamily && !KeyboardTheme.getIsCustom(selectedThemeId) && KeyboardTheme.getIsDayNight(selectedThemeId) } userColorsPref.apply { - isEnabled = KeyboardTheme.getIsCustom(selectedThemeId) + isEnabled = KeyboardTheme.getIsCustom(selectedThemeId) && sharedPreferences.getString(Settings.PREF_CUSTOM_THEME_VARIANT, KeyboardTheme.THEME_LIGHT) == KeyboardTheme.THEME_USER } } @@ -153,6 +176,7 @@ class AppearanceSettingsFragment : SubScreenFragment(), Preference.OnPreferenceC } themeVariantPref = preferenceScreen.findPreference(Settings.PREF_THEME_VARIANT) as ListPreference themeVariantPref.apply { + title = "$title old (to be removed)" // todo: remove, this is just a workaround while there are still 2 ways of selecting variant onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, value -> summary = entries[entryValues.indexOfFirst { it == value }] saveSelectedThemeId(variant = value as String) @@ -178,6 +202,29 @@ class AppearanceSettingsFragment : SubScreenFragment(), Preference.OnPreferenceC updateThemePreferencesState(skipThemeFamily = true) true } + customThemeVariantPref = preferenceScreen.findPreference(Settings.PREF_CUSTOM_THEME_VARIANT) as ListPreference + customThemeVariantPref.apply { + title = "$title new" // todo: remove, this is just a workaround while there are still 2 ways of selecting variant + onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, value -> + // not so nice workaround, could be removed in the necessary re-work: new value seems + // to be stored only after this method call, but we update the summary and user-defined color enablement in here -> store it now + if (value == sharedPreferences.getString(Settings.PREF_CUSTOM_THEME_VARIANT, KeyboardTheme.THEME_LIGHT)) + return@OnPreferenceChangeListener true // avoid infinite loop + sharedPreferences.edit { putString(Settings.PREF_CUSTOM_THEME_VARIANT, value as String) } + + summary = entries[entryValues.indexOfFirst { it == value }] + needsReload = true + + // always switch to user-defined theme variant + val themeFamily = KeyboardTheme.getThemeFamily(selectedThemeId) + val variants = KeyboardTheme.THEME_VARIANTS[themeFamily]!! + val userVariant = variants.first { it.contains("user", true) } + saveSelectedThemeId(variant = userVariant as String) + updateThemePreferencesState(skipThemeFamily = true) + + true + } + } userColorsPref = preferenceScreen.findPreference(Settings.PREF_THEME_USER) userColorsPref.onPreferenceClickListener = Preference.OnPreferenceClickListener { _ -> val items = listOf(R.string.select_color_background, R.string.select_color_key, R.string.select_color_key_hint, R.string.select_color_accent, R.string.select_color_key_background) 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 1f07ff3b1..e973adee0 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 @@ -27,6 +27,9 @@ import android.os.Build; import android.util.Log; import android.view.Gravity; + +import androidx.core.content.ContextCompat; + import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme; import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager; import org.dslul.openboard.inputmethod.latin.InputAttributes; @@ -48,7 +51,6 @@ import java.util.Set; import java.util.concurrent.locks.ReentrantLock; import javax.annotation.Nonnull; -import javax.annotation.Nullable; public final class Settings implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = Settings.class.getSimpleName(); @@ -63,6 +65,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_POPUP_ON = "popup_on"; public static final String PREF_THEME_FAMILY = "theme_family"; public static final String PREF_THEME_VARIANT = "theme_variant"; + public static final String PREF_CUSTOM_THEME_VARIANT = "custom_theme_variant"; public static final String PREF_THEME_KEY_BORDERS = "theme_key_borders"; public static final String PREF_THEME_DAY_NIGHT = "theme_auto_day_night"; public static final String PREF_THEME_AMOLED_MODE = "theme_amoled_mode"; @@ -544,7 +547,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang return null; } - public static Colors getColors(final Configuration configuration, final SharedPreferences prefs) { + public static Colors getColors(final Context context, final SharedPreferences prefs) { final int keyboardThemeId = KeyboardTheme.getThemeForParameters( prefs.getString(Settings.PREF_THEME_FAMILY, ""), prefs.getString(Settings.PREF_THEME_VARIANT, ""), @@ -553,16 +556,9 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang prefs.getBoolean(Settings.PREF_THEME_AMOLED_MODE, false) ); if (!KeyboardTheme.getIsCustom(keyboardThemeId)) - return new Colors(keyboardThemeId, configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK); + return new Colors(keyboardThemeId, context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK); - // we have a custom theme, which is user only (at the moment) - final int accent = prefs.getInt(Settings.PREF_THEME_USER_COLOR_ACCENT, Color.BLUE); - final int keyBgColor = prefs.getInt(Settings.PREF_THEME_USER_COLOR_KEYS, Color.LTGRAY); - final int keyTextColor = prefs.getInt(Settings.PREF_THEME_USER_COLOR_TEXT, Color.WHITE); - final int hintTextColor = prefs.getInt(Settings.PREF_THEME_USER_COLOR_HINT_TEXT, Color.WHITE); - final int background = prefs.getInt(Settings.PREF_THEME_USER_COLOR_BACKGROUND, Color.DKGRAY); - - return new Colors(accent, background, keyBgColor, keyBgColor, keyBgColor, keyTextColor, hintTextColor); + return KeyboardTheme.getCustomTheme(prefs.getString(Settings.PREF_CUSTOM_THEME_VARIANT, KeyboardTheme.THEME_LIGHT), context, prefs); } } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsValues.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsValues.java index dcd797e65..be2b8170b 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsValues.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsValues.java @@ -256,7 +256,7 @@ public class SettingsValues { mOneHandedModeGravity = Settings.readOneHandedModeGravity(prefs); mSecondaryLocale = Settings.getSecondaryLocale(prefs, RichInputMethodManager.getInstance().getCurrentSubtypeLocale().toString()); - mColors = Settings.getColors(context.getResources().getConfiguration(), prefs); + mColors = Settings.getColors(context, prefs); mColors.createColorFilters(prefs.getBoolean(Settings.PREF_THEME_KEY_BORDERS, false)); mAddToPersonalDictionary = prefs.getBoolean(Settings.PREF_ADD_TO_PERSONAL_DICTIONARY, false); 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 a5bc64bd7..2b4b8538e 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 @@ -184,7 +184,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick final Colors colors = Settings.getInstance().getCurrent().mColors; if (colors.isCustom) { - mStripVisibilityGroup.mSuggestionStripView.getBackground().setColorFilter(colors.backgroundFilter); + mStripVisibilityGroup.mSuggestionStripView.getBackground().setColorFilter(colors.adjustedBackgroundFilter); mClipboardKey.setColorFilter(colors.keyText); } else mClipboardKey.clearColorFilter(); } diff --git a/app/src/main/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_base.9.png b/app/src/main/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_base.9.png deleted file mode 100644 index 913a222001d2ae7654cbde87e1e5b96f23479d11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1662 zcmbVNON`q@7&fX}wMCU!Bo6HXT(?LxF!uP7hlje=vRRr)c!_o+brBpG&x{kZvB%in zO|mD15Tt?&7mi%H6eM~@h(+bliYwg9<4%Qygt(NMJj}M;K13wPWBZ%$`~HW2U+Jt} zI&u8eaYa#1v|G(}abA+g(Ievj<@nM+;&d!+y^$-*lUL;NME&NEUnx@32Y zxKz7%K|Mc0f*@uER!8w5$l)B9EDHz($j3>6MXfhy%V|c$%;}iy=-++9aRnNo33z;nXm7 zC}WxeDJgO3b~c!bQ(~|Ii&;|S0&AAow9gBk_xS^;%g1*Kh}`;qsd1o}I4&jfVs%G^ zF;B>W=)5~lnX%4tzMT=ax+83!kc#BS_r}!)aNt`$M-`8LZa`2ik_jkz>fq|f1k@2Mzq2QJQKpgojrBo`>37d1x^TSH$6?ntVa<=PL%}~wQXRzwh3(FFc4ta z0IXiCV-`4W6|%+tCMVmnvU2~d%PA*<<3H7!gX;w18nCMk2e_eNbAy@%s)0=jrPRf= zWP3e}#EXUp`&p$cDj2Iagl@(;&(lKsIO#DlISow)W5^LRD~fS%y{6ChjiUuz%s9C$ zr>nRq=QB$Lbta~-^YjHSCik1|=5n{OL>k%OXAeDl`?+JkZCu||oXInj=il2rJo$OD zSLyt9^~Q&jLtj@uJ+cQ|-!`tDuADuk441B*e&_dJzwh0+^9wtA{kHu<<=khL@kc+s jb@h|aKfbduIjNldq4Ve7Q@6g5Ux@bVTJx({-hTgIqf!t3 diff --git a/app/src/main/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_base.9.png b/app/src/main/res/drawable-hdpi/btn_keyboard_spacebar_normal_lxx_base.9.png deleted file mode 100644 index 8481d61ec4fa167795e981fee614104ff41d4b45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1719 zcmbVNPl()99F9n(-L?yRP()Ee3aw(3yd-au$#chb-B~*$W?gm%cNRhS<>h52?j$cJ z*`3+#MOv0pq4W{J6uqcxh7* zc3li=^{nnZjR*@B>@k-roiOHTK^ULt#F#A8Omt}@h)U8Q=RcRkz$-}$1qV3s6m15T z^@Pr^&(z5JGO;~r;xTc&gE&D*Gc0z(R+OSnN$T<_;O*@}lLnAI+7Y?2GZclGMzy7^!Nz z-B#L$!jgun*|x0$UDb7&Bjj`~%5X=H(gWKJWtx&Ch_ir2V$O(Nwvv@3ZnYOf7!PQp zw4W!QF|~tZRZ~D7Qy1uw0WMxiT3vCEsI)~x8f7WRY6EQCWEo4F>;}|>*VhT~+&a!c zW2l!f97v?u^ePXdpOB&Gw6+#gb&jTNB_VWrmD@a!M-!u|gyM`PHO5-om73kQEb6)f z#fKJx$YbsF;T;=j8E3R4@v0dzuw=bh(@dlT1dK<3jsWOE9p(l8+EA#53~(Kk_l$=# zd`qxLkk673^MHd8H>es%4M`lN5lyicOSmw1XLMaS4ys0Jh9g3&<&wl>R)WAo5EI)r zh$Z{bGvxw=y6hUhEyIFt`ewlfnr&|HFEg@|S2o|@>vE3~&T&l@TNZ>+(`5~sK-M9& zWLzXb)-=9whm9~y4$WX)Z9oKc5*!7JJ}-(8?GEOMTr4^7#EhFjDj zacvFf-P~;uR0&dEy0!lIF;8FWuUdiF?FocQ-s>far%w3vJ#_xeYkYE_u9hcj^$Wj$`{?M)VBhf{ z6;b(W?A_6yuUc0Yk2S|y0)ar|)@oW9j3K&8M_4!G(Rs zwbO5-2ahg%@%&F8{jkyc{+;h$ecycL>jw_I)%#zZ+dQ-M=V#UYucbOYQ~vOYrDOjB D8D}S2 diff --git a/app/src/main/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png b/app/src/main/res/drawable-hdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png deleted file mode 100644 index e5af5fe5b40f5335b8c1c3517f5bff501c1e7a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmbVNTZr6L7*4^J-L6}TNTF3RWJE1%CMTK9Bsq4v?Cy-+fzCQ^2Rf}Tcye+w6Lyjl zlg!S{)?%^Lx}uML@eAI#uiu#}@b4j=D_JRXRPLl6@ z-}hhg&uV4WWz8dph$`$GK3g*y$E$gFH8*?3M9mV<3|ql_?Quyv=!wAX0;!K>nF5c zILH&rnAAbOB&R_fQx9n21n0McW>4J05@`~bcu~l(a)R|6G@@aHUWYn)eT4waZMmFi zZ0W^y6NxY?F0(KO3E2`IR=Ylt7Dz~20Vc&|W-}E>g#q*TZYEatT1SkMMU z1zBAabz29bkx^yQL>drH4QL7hgb+R1U!b@ZS2o_??{bS`#&KDdWK~thz!Y;<28*hq z+9I-SBpNosStDzjMot^Lc`R_)hlZM)Sz}igW7HK*Gm#>TKv#h%=Tznosj7&GjV&!} zBTdc5-P~&sIOl|{blt)Cafm!UST!BK*Ao!oxYzRnj*CnzVer`5A|JP;JlNlE5Jq}~ z;`h}00YoHRJ!WK1d60Ag@l?NN!*^G;q$#i8m$$TarqYl{g-FxEf&untPQ7TMVYhV2O!y`LR@H>l- zA9bF*ZStGvzefMw4dma7=dJ4f-~QG8GPQPQHJmxG|M}CAcMd%J!t(rg`uYhVD z#L<cid7>=>WgxVW)?>YiQOD#zs0V>=H9 zwV4;e=cB2YE}!1tbH^WxWB=TFdSmg`=CQwnA5X5`_jdEHUs9FU>!Y8XTs#*{esF2z V-q$XcevkibO2zrYdoxcx_aC&}Fg^eP diff --git a/app/src/main/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_base.9.png b/app/src/main/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_base.9.png deleted file mode 100644 index 2b48028b1f8a84150d43ed9ec20a60e841088232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1636 zcmbVNJB-{!7&bvX5;zH@2%$7g9Eu>A_4v8A6%#GD2e(puIbBxdB2h3qGv2js?Qv}H z?cSBC?hp+H9TH7C1X5@zK%zR))2D$l5mh7_e(!qC1#KQ;CEH{BoA3MnhyOj^-uh(i z+=X+BqOA2cyE|}wy*gff8P1QU`@7|Cc+F=r zX;Cf*qBTo0Kr70XtFw%VH z)vF((D>EMm5>Zk#OU7y8&jNMM>%+Qwtf^=YDfa@kQwgHoa2u`5Tp*`KFeAi4ZLh`Y zfU?2h17r|G*NCO*7AC|uJ>RlW{Zm0M=aIkD{kRr`yFeY4W#((zbUJNK&6doEn(ld? zMhwj`Fd%Sokd}0Y)8f*Sp(_fO$5|Q66jh9LASY#@g4IO~N!HM&MV%+em^P!Crng8H z(;UcIgUcrQcrMPFCdMKWX;}bPZ?M@&ma-VhCr~%99}|GwhGC0t@bavoJ$5A|Elt~*>)V0U~>@ZSl2BbyROb~WLt(oZRT0VA}8SH zdLF}vM#raFD_0yC33oi*jUsG&o`bmwuBfmDW`^bH)D|{v>s2?;8^qs?3n<+|{e9dJ zx9in7M)RKVDXV%tP+3)E!PWY4ydodZrCjfyjs%cCrT7c=LPq73=Atu%+�ov?rM_ z=>F5KKVK;qo>p2v-HiXodYu+FqUlh;DnB1LSx6{A;6?5}P@4oof!*{;8cWe^HK6~b#@y2)ee?eY{uRS{d zt9@|~-F^GZliweH`^SaRgI9jM^Yz`MzptN(6orl7{42eG^iB0Y(A(JR{_xS~cm4rt C&Hu3g diff --git a/app/src/main/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_base.9.png b/app/src/main/res/drawable-mdpi/btn_keyboard_spacebar_normal_lxx_base.9.png deleted file mode 100644 index a253ea98a38b025c8c507d3bd1fd6e90f6698919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1677 zcmbVN%a7Yc9Ci;a?9!??4&~yyLIT0WV`maS*tDeamPCq|)o!E>H^wvL#3c3@+q=o` z1zOQcD}lrTao_+F;((Cgz=5~Kfdg6rQhVW0RF!`KRY+7waABN>*`o9zA~_!0-+bTq zd-&)5^|j|tET3AIB1>GeDRDgZ@G zs9fSnPt`2TQlYNuIuHnu?nW6NgD5>SXK+|bk|53k9?3Z)_V{*IQ-sxN3}IZ*M(He1 zB4g?p$EsF>c}x=^B?T_tPKFb4N>nyvA&at9V6_4p_j$(CKEDff@%Rn_kz3a-G!}XZ z!$Km>R(C`gvxF=}r=8uHsT(Zi+X-Q-JHqCfJet^UBn)Rf>2N-rS89E3S=RLulAqWL zBFabUlZQ4i2WPCNh^mzVG=Oe)w5qLF>NbQ^sLN^K?=FN2v~>qm^bExrzAu;( z+viD$MZiIbdrXa^o+1}%v>SZL6Co_zl_xG-*KS2=h9kmSPE8Rpmx6%WmTy!o(}Tb; zsR5{kC@={|09y!YmgYlPG3WaoPPX&P=KH5zPB{@A|Eg-N>d}g60OnUb04t~rOao~E z`@T_TsERC%=WNd>fq2pI@GxuciV8+rK?Hea9Y9=Vz-Pz+riU;v{3=5hK|VH&yqhNt zVmE_Slx}zSer&RrXRBc#PkO?}B=7Z_Lh>Rrs?2T&3-a+m%Cr5WJ`<$(DE?GE<$gB8 z39I)+?(W-M>fOwzc<0{MAFPy9PYbOdZpQy(eU=u|$5D@o$*C%NFls(xrbSWzTd&Ep zL*r-;7c(wj7SmN+6!V!yf;th?_nBXAUJ;Y~rIu6gG{67t=lb%i@VImBi_SL}yH5Mo zE8m$%FaP@KJ4a4mK6&G{&)d#l?_Rs|)$#J+jeh;1kJQc1)z^=mbo+lxE{}O570##=DM5+w>t;@_KB4^L^j% z;h!%pFP)k`Jabr*r0G_(u_Deh;yC)uQ{vx$;mdV#IutkGOC@RYQhq#Ez47yRk~DE6 zXs>3g-aCl!P{ow{OdW=?Kugl`6T=vjb(YCK>jqIx`Rm$sMGk09Ics~+i|ecxG`ACW zW_zhkw%3VEl@o8t$A?G|ge=4IFziPu8rGB%FB0qgwx-A@HeZG;^6k&B7Ll~E|QCj3l zWK0|4SkqOQ$20;`QsUx`q(2g;L}PsxvM5UhRxhz}k7qpX@%vDhkM9r=x%IqK<3KNA zSW2YX!lnqLNXUWcw7nHGZH1+LBOz>IQ`nr#qlr;HVL0PSoAdr&rIz< zi1I=D`o0aUfiqT9MAb|HtH5yDdIcFavf&%hKoE|h9;ZQP>t3jX%nE|`9Z=CT6leIM zU`kMjCm|LA2O;hY>M(Mmb?bg%Whn(_ZwFVaGKIO;MnIW;8@M$1RcxG37) z^%_0fH;(q;V#ejma=MC(az3+2P$y#grZ1(RiOJ1djrn$Snykss{qxP|uU@|W;|G5} zJ9lJK+MPXe>+#(uKKgC;;wK-jK1nN=7cQLaFHTI}+@1KzpgU8++M%hVFQ22Q>N~eT z1<6;h%wFmJ`t|9ZMKE)v_wBjH)xR%B_OU;HpUQ%XUw(N1X?F8@Q<6?bJ)po0w=ilaP_>5TzrU?s|Ri^^6tU*Vs;G zk`*eOb^}|)FJJ)(1UnW80TLCe)Ga$!-6FcG*p$!naMLPjtB&OHwSDe6=X?0`&5iXB zPS)x*j^j>t*E*YUeyu!Sn1}!0evICO(~Ifa)tuvAx>+8_tXqG6!*M5Wg}tp}%e&-Y z7E6dQpGu=R1vJMkEss)!w`sxqv>zs}@Xt>_3w%gi;Y!0(ytGXR;o5#iFYmAS@cuTo ziLm@Wzcg}yAf^T4M{$(o&d3$Uybi3(+p@rqA;q>Uv`RsK%iG}FETg&vQb z+p?m`nkE85%=eN4jl?8BH)H6~9A{x#ge>7pM&z@d!WF>kB!)PxXp?-JC&-vQLaD4u zN*U7_NN|Nqcd}?KPOwZP8q=i60jpNnbifLh57-gZ)#FD5Ah(`ZX&mY$jw^}0SlNXz zrU^L|o%i-qDsR%9?PQp)?1Ig6Wi+YN&L}Ea)?+N1Rcd2qnb$PQ;Ll$P6T*i1+Xpt# z4l1ZCK-F|nu|&=6shXqcj%vTFz(ScoJx0P{?+B>TcmxVPLr{U93MSYISQaA)IE+!B z%4yOU_$rM~n?)=GVQ{C9U3i|;P4WUIn07m^05MBpNF0h)+eD@%+J@c~4a=aS?>DJv z=o)U)0Moz-X8St~@067-_fNW+Twh#u=jQIDtNh*Le#n1x%x}E% zeXS?|@$xG9v~~O*S-A08D@flwbHO{&MqBm2uD$wB{p;(|clE}9bSjo|mi+qL~Kd)|ZalhfSQ^R-`>q`5cBPeylTz4PtGYuEn=Hoyz- diff --git a/app/src/main/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png b/app/src/main/res/drawable-xhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png deleted file mode 100644 index 9889f4d9464009575b4491e37cc28d1292d32578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1769 zcmbVNTZkJ~7@pW|>F&C+ULK02bavVYi%#a6Oy;n&HBHuTz-*UopeYsElXFgzVKZ~a znb}RUsHlig5LvL|ODPtu`p^}NR}iTvEfl4Q_xfNh=!;^Dq9TgoncUn;)-48R=FH4@ zzVG`l^XKr)^xl!7TZcG~8_7*&XW3O{hqieWJAaA}-NG(|-qgW>7 z$tU}lrVD6k9+_C!J;9GR03&cn2>FIna|6(@gcdJg>*%p0@GVFh*fOuEnWekrdN3C0UhJRb&V;Xu2V6h;Fc>%aA1j@@+4)smn)xeVRRDG7abIu9+75AKo@*OCKs8_9Z@tM$oK??)Gtt4>sD%}YnfNo zxX#~pz;-dM2fJ2nAXyj^OJG&gMA;D4R6$7s)c{)Zc3B0o+=k{Uw#&`F&=gShtDvlB zFbv_kV2nVS`VM3P+YYP{$#W|L-%BIN&>HobFmtE1T;%g0=LR8k5y@pOfyErRZ48J} zE~_YEiV0OS#6(Iji_pYGG*Jp61Q8;7I|{ZxOVL79*=T>e%P~ca;~!N`LuHMiq$sD1 zgqTotU4(jB7a5JBq*NJeGVHq9=iBT2{bE`qXlpV0rH9OzOesW)DRkQh4PXLIbUbh4k6`5e6^Vsf}k84rx?5|e| zBmIx!x77n$4(re-=?cr;y3Hl6Wj=t5>sY_0Qno$ywZ6I;|Bv-fT2K|b6~ZQ`Bt*eT z(THgmMf!KWTJKhkqb{7yxMf8t(Ulv{|8e@##WS&|k{_P1cb@lN`Q`YJM?Si;-Fo5vZ~lCH>qD_OV;dXX z$QOSd{j9R4VZHh@c=XMN7duQng}B1rZTj3$1u&Z>DY178hpb z%*=Pb@B1(F@815tEo&N^8Y7X&n%`}{{dXAy%Rilsox z?W8%YXVRmClYMDCIf`|{x3zLDCCCU0G(cRbkhgtUGWaqtWb5#;$a7^#FlzAap&&P$ z>gPHgk8)ZR2p9m3i|bK>OoUBy6DI>%5`ij8ssI2~bf~Ia^~W2POwPxv_S2^XIQC@b#qSO_&H|@>iX-e z1XylUsk+9ZUJ8Y}gdcQ`voNX&SrqN3CtNBHP~REzFzp&=HrI#IxUkcsC~&;AaSVmWI3vG4-Q#2af<#!3pUUs3aG)eswo193vwbYX;6+sMcW8u2tWmza)_0gxE`8- zN(?ICDk$q2f&z3?Fu^e6cm>1)whAaqMc2;qTs@7j)5$v?6K3v|vWrv-_S$}cY)pHT z2G3%SS{8wrXgZatED%}I1Sz5FLc&x`0q8{1u%xP*WY+d49Xu9RHr!w7a^hgd@t>-q zC#VS!7W5cV1e8!^LC3MU0F*dD8AZannW?dD^(^+Gq5MMD&=p~fajdeOYN~)^nj&CX zRfPo5RY8+9Y9@4?!Ldx(&E*DxJ(kZ(H&OjQ2I*7PRo>#tJpmC8d)?r1SY%50>SJq> zeB6?9b$>BO8R-p*Us3m+Oi)A~ZO^jY-L$#HrOf+i{KnRAt&|l{*IU1)8UK&20)E=9@XAi9Sm`(1}y~*}; z?(}cp9d6vSdG)7%tbKHD=!XNlhtC~ce)8foyE@L#f3wWnF#F-*3wO5u)TY07|B(&N zm;V`gduJ=T@@hz|2Up{l+$(BFYCZB%itCbyi`=!qwd+E8krjEBtXS+Km_e`bVYkm_Qn`u4;9(eMY zsc()nEW2Zg6WKa7ePwET-z(GW4o=S=deN9ab>eyCU;6RayMOr^&P4x)GoSCg?daUs d+xOkGe~0nKwhQ)|BjKM^Z&zRPP{$Ly{{;mFOi%y- diff --git a/app/src/main/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_base.9.png b/app/src/main/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_base.9.png deleted file mode 100644 index 295ca47d1b1c9067133befbdea36f499c9a6de67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1719 zcmbVNOKjXk7~ZrEZBiAL0}`*p$mszJe#YyUx^2R4+N^}rC|#7miSf+ru9daN*v`JF zMBo;VPzfsakP9j~w5Sqr0f7VvwN&B&M=qcuE)>xNmvR7p@2e?F+KQEIkL_>1@B1JA zcVltk)S<~ICUd#mq4Iob39cwR4m_j`lWR<1JV>Lf42!DL~g@Alo5SH_<;zmVQ_vgDYJJVgL zknSq6sc_;rI@Wf8AYds*?Vu4RPP-uVcpX@0k7WV%An9sBn9T&yio1x4JZ8v{6p<*3 zflOPX*u%v0oS-D|vfOI5q}H^= zhlm~jM(FAX+Z$1{TPC1L>nf9JVD0f zHjZRfQnHwOKuSiqXf1B^#3_+kg9R*16Tqq?Y*gndPwIRZ>e1`F1R%GrJJQ(EOAw4C zl60;KVGI(oBRZ*cA|@}fgs;Vf%{9U1R2EI-6k~={9#=ST3@f!bw2U-O($Uk)en@#M zd1l)NR>CPO2vD_YQ87i$sHmEw=#FYVtH46(LtRe&YG)UyZrlZho}oC!_XShpRCyd= z2-pvBjmc416VND)PLVfw48q`Uy63`mopP9@I3%oGDhLp>Ma|NyqGe+uS_;*% zVd$9Z{hWZC)3Fa98g6W7&0JAnBxasyra?qC4`kTTb8y)M6TCcGk_k265*7 z1WMN#d>?1ntAka;N4=hKFv)toAdsxcj0%It{to$gAmzdSR-FOqJ&NB~Pk1$L;h4?V zAb0m|E_pZe32xro`h%6S?`aq7cbf74SRbT?)Nxp2Fgax*3r5aHOus1df9utIw{08^ z;V|Q}oB>`l}odgm9Kt(SABRL9p1OKdGVvoJ%9hRKRElS zH1W+3o8z^~L;!w0Ql(jhT~s4?cAOHHCBMJD*&h{OQZ}tt4`f z)ZTk%rgQtppO+`x@td2`QM|SOGJchy!kJ`!zsi7 diff --git a/app/src/main/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png b/app/src/main/res/drawable-xxhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png deleted file mode 100644 index b02e4c57a461f50a2cc2db22f1689e6d88813083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1930 zcmbVNeQeZZ7{3`A`w+|&nKO!|i#h_m_IlUdwQ{hJn{LQ$mu<31l-=9*y}PozzNPK$ zZsVVY%$bQ`P;@G0%xrO}Xq4z8K?4b>86%MBA4dF$iy;I8+x~%sh~nG(ax>#2UedR3 z`~2SD^Lsw}+(4l5=_N%E71?aIB@OkyW_;g(uZ;!ycs)6=GKz17TK#i|%~m{MU3u<_ z$&YQeMH5PEyV>sFC`c$~2Qm_&JsHz5+Gbn3KB)nz6Pknw!;0!9XO0{t2}SmjZJeL+ zYqc<<)c5GHrKhn~>gkktnOwh)Seq0uK@6IJNXDY7Atb$IidVpU>orXhDTvwWC95rm zM7uvg)FK@cm3D@b7^aeN^L81CKoZ3@1k11vnsLz%7sW7wlNVerBJ(4$J6#S5&Az8H z&hV3$jF_e-&~ze^uqT{$q=#t-&+|0H(kx411Z8xqCP-4MQJ!V+K||6N%~X&|Sd2hK zannm;sp%MET8>sVGI_!oqmw|R9d^cwDFu|J98Qbt(UfypqG1%qplTWz>&RiX2r`io zK{uh!nddpcx%K;VJ{Hsxi{)GxW?dH!Ba@H?(MD^x2I*#KptvroVt!198VUCpop!=#~p zBrBorg`iGGaLk9|o{@nGZVQ$rA%yf8zyT{U5Qem-hDjoqMxho(k&Yc>bg#km=Y@&Fg4JZ@2@+??#Hba1>VNu1TqsRj}16$6*9JM(?Cz-^gbR3TD5Appth zbuTGdMTRn&d95svk2~_5IiH9?OnQsrr@b2}WF~+PtHU^Vw{0%^X5tOdb!+K&R?4)d zg{04G#{VNdlNKog)G)-8lP0ZTXlulzi$edmUMbt0ag>GQ8E0*C(-lAD<}*|=wT`Fn zvR4;9YP02q8+_HR$+MS#dEuG9st5bQ8i17`70K0DjlnD+xCYFs+6n8iUa3|r=_y-;xp@(pF$PG zcTI~&zIgxVet$3?;AY2hRnAw z57t~OIdgq_G_XS^_XcVTAHz%8dwut9sIZoMGCMYHz}AwqA!SW3<=JC}%?0Oz(o}F{ zEmJM}{zE5g` GJN^MvCW}P? diff --git a/app/src/main/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png b/app/src/main/res/drawable-xxhdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png deleted file mode 100644 index ea159d6f0f0e8a958074cadd574af6ccc2834447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1966 zcmbVN4Q$j@9PdUTY>1elQB<Y(M=FT zkExNU9SzTtpq_96MVFB)oiH$(ASRWk4FH!So0L(5ss*S&KKYCyRV6?z^n}^45kxVy zs>ww2nr25}(^4oZRQY6bQd+_U31kB@orr6elnziCUJ0+AZH6K<5PNBWs&EXF(QpkJ z)J;TsT`Ub*)=TcS3%Svuh5(F}LQP`ZR)JwIYX*px~DL}<+ z+mIM0l}fo%ZkKL0Fq|lg49hb-Ph$jaHEK3U)0$N_$PhvnG*!b^b&YfwfvhL(0EMMy zeMlI2TFuJE2}g`c1B2mQtm9J#sK7kVNSg7CaRo9cjuJ?-EsW*zSR}xsE7E8nrWRRx(uAmTIhI-GcwswsNP8h^t96aqF1P&jLDn)T7VKf-w>UX+^&Wwx{fe)i_5slkWX>%DQ65w?$5io$2I4oeI;s@R==LJy zV?7-0M+nkT5dbYiH=w;<*{=vJgg%egspd?9NL8wZQ`eaLKIWlixm8>xGc_Rr=+t_E zf=-f=LglvAJH+FGEa%RrVhEGoBl%hDmR@hCfQc#^aP00|T+H3XTVVOUr9W6Ivzl&~ zeoHa_AL+TUz!=aP5bm4|)^#Si)Zj5JJb;_kch z!dr(4qF_UHs3MX+d-=x`GkT^x(ehK(nJv-9<6n=C8s`dCPUv3$?A2963jSJh!T0xw z&C=-S4|i<#{plKUs^_HQSv9xo{I^Zry`>iiHq8C!%BLNB`l7w<>zd~Gmw#A0r*FxQ zj^>ZLTPhBfwvSC}{`tfFlh-&;8aIn$meF z^}g6ezSF&D$V)B#U%k3-%b9ij?#1UcPxF;n>Hdem+j{uqwbTEe+LpW&U(w#t+)MNw zuwR~9+V|R-M-x8>dkaf0f4%<2!jkhVCr65^uGL&^BYr6ww`+A_F&?PgTv+_jtvhdI z5gAx^xV|%`r0wG$-c9e@)VaTPAv&~TM|xoUuh&|?9~kqZ>Aj_+ETDY7#KCA>%F!fV)U0Y qw{Gj&`T51?#zdvMI(6pJ$4d9E-dPe&&f=UuYIWu8&<9iN*8T?%t)ILA diff --git a/app/src/main/res/drawable-xxxhdpi/btn_keyboard_key_popup_selected_lxx_base.9.png b/app/src/main/res/drawable-xxxhdpi/btn_keyboard_key_popup_selected_lxx_base.9.png deleted file mode 100644 index 21aa60570f7d0055333109f509f55e72fe8ce341..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1983 zcmcgtZD<@t7~TpdrWz|0Y^ezACSpvxx3eF&cf0i3-dDcxVn~lR8U$x&=I)l+y{|+Ywf*D4-t5ji z@AJOz^S(3l%*6O`@8%twIgaZc9m!3yaWHyr>tg>OpZ|244L#n-BLTW{8G%DW$k&~!8<_Q!(BL)Mdo(Qxd;=2Bq=a`k!9`T6`;rx&?H$C0Wej=)HJ^J6PP<6m(0oBP|F$nN(q%P z^h`;r)oQVt8l!$$k`2RmyZ~sMQ6j5z(Q^2 z;CO{Xhu95TN-@o(I`kwt1|-Lc5^JD?aFVQru^~Dr&U-|fBmtfE5n=GYHRJpo^W4he z28{D_#0@*xXFzf=Bq@P4 zu_}UusOUvmHseWCPV5AV2|yECpx7?WUk{BCW?cIVlx-mlL-?OyjLZ`C9mtx=c3_!E zo?909HRZCjN`2;-MW;sFpjovX@$ET+hkWYrjXpN*4OCMgfN}yO5y){QYRLo?t%Q{n zHK1X|kQEt}kkGPc6}$QROPzp5?0~60-`eT>$)VO;)n@!`tC$c)yEY{Rki{K2jV3n= z8tDk@Kre}ks>!0RYeY=ymMU79lz^&faYJLJZrax>gi)@q+TTjigaxz|)}T+)W!B)= zcZH(FG=AWq?P6LBSXVTSPzAbW!j4f%h|-LXo10JO#`^YuPezKeX%4V`0m(#mKqU7R}q^VjJ+SNOZ0hL@ImmJ8c< zjjbN;{-!=SwzL1F{nQty=$FG+S9e@H;HWQO`JuGu%`=zm$LKFle0%uvebZN$rpA_j zys)%z?Co;x#2b^>HobLm{+*xF+rHWy{6H$+PDU-ShhIpOL#WrLN@Jt*;$DHvDXK#g693b7wM-Klvwilz>kF diff --git a/app/src/main/res/drawable-xxxhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png b/app/src/main/res/drawable-xxxhdpi/btn_keyboard_spacebar_normal_lxx_base.9.png deleted file mode 100644 index fd2d4c7515b48f534084fee9f0ed7209a1f905a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2270 zcmcgudu$X%9KP}>r3juvw4oNZTT~3)+h@0Xn;x{>9k$|?Qc79`QfGIk?b5s5b9dXj zR%(D^iBS=W0i^Phm^Om`15uI^h(N4b)DTfjN%7GDv4Dj{D+DCY-d(R49>PCfayPRx zzwi6KzL~w(%1WP|m_9Y#;c!eWDfX44Q9@rOEfxK?+&DWK4dcVbOH7Aj0-8^loZ{H} zUWUVwx?8QNvZ?~li?SYa0Y#UfD;f$TYlov?PBaYUdT3!1tW`A+KG<~_$5h3GSLOw% zK-dfG)Z%6XE^02Vkelmew}Q`^jTJ;iL=b`&z@nj`W{Ob{9^)0!++HSeEM{WWd+;LL zAyySA!@RlyG2TTHGDY!NzT2e$3CNO^i!l^KlN3kN96?bc>lQfntlQl4K+jaYa~{Zq$;r+wCSPhGZB5SrBHEW`QW7nK{D@K4{8@8n#qj!)!(% z=?#_#N1?`Z2!#WIB(Y{DDurrBMnRaQT@)D#*@?xhO{*M^gmFh}v!W>s$#Q7w4TcPn zdCmyf--tXXa<~t$zY%Iy5{_zrZ}6}mMNZm<8;oGAOo~jxAPgZs6XirF6AIVqmTuPR zccD&h#|mLPK-Cf#7%EZ?2>Nun!KN(nd2qDjQdC7`DaOxm>|DRVFuXw1Xejdfg(5$d z$GRzs8|Jtb8yAtH%Lt$JC~|QWe7S%gc zO%_-Q3XmuA^Aw5T7}iY)3dkcEj$&n==JOQ^;0ZkH*n{_HeO>F<6lSbiIHPEm$XiuAuiwFK z;evssgZ(Sn>Xy;{7v|3?d$_OgOy$t`ErIIOk&D;=KA&|ocPrJ-93Qyk^j{r4&by;8 z`}p21W9jTqe%rHhp!$^;KBRg&u+oh$x2{}zy?#OWlw+>FO{rJU^irpnILEGiOP;dG znb~tf>N$CCnhzGgzPNAA%!66PO@8sR*3OBwR|aUGwr^ALyUpFs4|dJi^G0^=e06gN z>yxoBS4e4@2i9gD%s5hCf8^AU8Al2qO&ztiaFsL7IVxo?R+u&>ZM7rYiH%7t-o7$o zmU1uPw$_63Mr;4q;)<-H{p+W8@AznU@9I?-IxXM1^h2FpCmwlsQ-{^FQGTcLG8fFs z-F|4t@866c?CAgLueLv~41pi=v)i8hDs`|m^8nQ!O#k)dq|dvZjaT+|U~NwyW&S*K zwlm|~rb)*xZ(G>Z-hAy+=hQ=!x4)Xv+t!l0q1!P)b+zyFc#oZWXhXq`C(74NPhTpW x-}NbYs$t8*+2_5}yvtS`C|~wC{#@nIxK_Vhzw_+$_w9cmCH_+1$8%p?^AC```mz83 diff --git a/app/src/main/res/drawable-xxxhdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png b/app/src/main/res/drawable-xxxhdpi/btn_keyboard_spacebar_pressed_lxx_base.9.png deleted file mode 100644 index 24fae31a443425d58246080f21e1a758d401cd65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2300 zcmcgue{2&~9Pb#yHiFK8%5RP%h7q~m&$f3bWk1?NE0m3GxG5OD-o38J+FrT4vTpoT zNnino=um!4Vi@6P7|2wD!a$HAk`ToJ;&d2rLC^_{h!Dj2`eWS`MEJ)h?R)p$=ll8o z`n-3oE|@y0f5wmugTc_><+K;V(F4CyS|9j3|Bto-a7Yh1pVJJ6esJDzK#E~)-5`UZ zPrY1Rs+YQ_@S+kh3X_|uu%Ylw~K$#r0qE|jXfFiPFMN3R>!X2^! zpX{tsK~dGzVzH`RO@ z3lN*40>o@2Fp(h4h=nssf=3WNo^c38P$W(;ILTlH!P6YiFi7HqLU*d<wQI$iwtOSuLqu^1( zx)p_?#&ZaS-0mcCP)k$_)(npbA)GW4cpwl>EQZ$fLeL$?UC~-`WeDJfKvTl12q1iP zx3Oam^qk1yK8zi6Ku}Mb!`k25xXX_uCUK##>W`I45^>-M0m!GpoXBKCA)lfvnos!` z>g0B;5K#xPT714LL)8d=yCR08lrFm!g*!$`mUx<=927(6IarD^vm^xqk#RwQjiX3JUOpL^MJ%q{YjoI@y6$rYb7AuOsOSlDHbwO-4 zB+D&`axhw_u{{icUC@CQg(9Xg!h%t3F=^&$lBdY02#P0&IMl63vbXY1D9h6{Pf>q^ z!XqRJy6~T1N#wnX8W5nEDR%_o;mQ^nUC zKe*`&&wMpfGk1N;i5B*&&090;pI3aA?fE6m+|pI;zV`yN!s#2xjYnpk$X$NC?bM>j z%j?3wJ!&s!mz`OkS3BbLZtJyGW9@;gv)hW&S_)g+FQt7s*!kf{0}rLnZ0@^n;GxO; zm*Wo=rKKJll$O~mB@f9->z($pVN@p4yVv5JMVX1kMR%-p!+PJ#@aN$_tZaOzKJZI@ ztC0Wuw2LcWtd*|j^*k4&%Za8cpaOQQczT#l*shP; - - - - + + + + - - + + + + + + diff --git a/app/src/main/res/drawable/btn_keyboard_spacebar_lxx_base.xml b/app/src/main/res/drawable/btn_keyboard_spacebar_lxx_base.xml index 20b159e1b..f0950d226 100644 --- a/app/src/main/res/drawable/btn_keyboard_spacebar_lxx_base.xml +++ b/app/src/main/res/drawable/btn_keyboard_spacebar_lxx_base.xml @@ -1,21 +1,24 @@ - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d364f1005..ccbd2c185 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -116,7 +116,7 @@ @android:color/white #F4F4F5 #F4F4F5 - @android:color/white + #F4F4F5 @@ -125,7 +125,7 @@ #F4F4F5 @android:color/white #A9ABAD - @android:color/white + #F4F4F5 #FFEBEBEB diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e024bda1c..259fbfc2c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -646,6 +646,16 @@ disposition rather than other common dispositions for Latin languages. [CHAR LIM Can reduce power usage depending on the device’s screen technology Color navigation bar + + Light + + Dark + + Darker + + Black + + User-Defined Adjust theme colors diff --git a/app/src/main/res/values/themes-lxx-base-border.xml b/app/src/main/res/values/themes-lxx-base-border.xml index cd3106042..53587fa11 100644 --- a/app/src/main/res/values/themes-lxx-base-border.xml +++ b/app/src/main/res/values/themes-lxx-base-border.xml @@ -3,7 +3,7 @@