Add dynamic colors (#277)

Add "dynamic colors" using Android 12+ system colors
Change colors into an interface
* allow the desired more exact copy of colors from Gboard
* avoid needlessly exposing Colors stuffs

---------

Co-authored-by: Helium314 <helium314@mailbox.org>
This commit is contained in:
BlackyHawky 2023-12-19 07:48:10 +01:00 committed by GitHub
parent 62bff1e68a
commit 0edbf9c08a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 593 additions and 200 deletions

View file

@ -102,7 +102,8 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
final boolean nightModeChanged = (mCurrentUiMode & Configuration.UI_MODE_NIGHT_MASK) final boolean nightModeChanged = (mCurrentUiMode & Configuration.UI_MODE_NIGHT_MASK)
!= (context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK); != (context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK);
if (mThemeContext == null || !keyboardTheme.equals(mKeyboardTheme) || nightModeChanged if (mThemeContext == null || !keyboardTheme.equals(mKeyboardTheme) || nightModeChanged
|| !mThemeContext.getResources().equals(context.getResources())) { || !mThemeContext.getResources().equals(context.getResources())
|| Settings.getInstance().getCurrent().mColors.haveColorsChanged(context)) {
mKeyboardTheme = keyboardTheme; mKeyboardTheme = keyboardTheme;
mThemeContext = new ContextThemeWrapper(context, keyboardTheme.mStyleId); mThemeContext = new ContextThemeWrapper(context, keyboardTheme.mStyleId);
mCurrentUiMode = context.getResources().getConfiguration().uiMode; mCurrentUiMode = context.getResources().getConfiguration().uiMode;

View file

@ -9,12 +9,15 @@ package org.dslul.openboard.inputmethod.keyboard;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.Color; import android.graphics.Color;
import android.os.Build;
import android.os.Build.VERSION_CODES; import android.os.Build.VERSION_CODES;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.DynamicColors;
import org.dslul.openboard.inputmethod.latin.common.DefaultColors;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils; import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
@ -33,10 +36,15 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
public static final String THEME_DARK = "dark"; public static final String THEME_DARK = "dark";
public static final String THEME_DARKER = "darker"; public static final String THEME_DARKER = "darker";
public static final String THEME_BLACK = "black"; public static final String THEME_BLACK = "black";
public static final String THEME_DYNAMIC = "dynamic";
public static final String THEME_USER = "user"; public static final String THEME_USER = "user";
public static final String THEME_USER_NIGHT = "user_night"; public static final String THEME_USER_NIGHT = "user_night";
public static final String[] COLORS = new String[] { THEME_LIGHT, THEME_HOLO_WHITE, THEME_DARK, THEME_DARKER, THEME_BLACK, THEME_USER }; public static final String[] COLORS = Build.VERSION.SDK_INT < Build.VERSION_CODES.S
public static final String[] COLORS_DARK = new String[] { THEME_HOLO_WHITE, THEME_DARK, THEME_DARKER, THEME_BLACK, THEME_USER_NIGHT }; ? new String[] { THEME_LIGHT, THEME_HOLO_WHITE, THEME_DARK, THEME_DARKER, THEME_BLACK, THEME_USER }
: new String[] { THEME_LIGHT, THEME_HOLO_WHITE, THEME_DARK, THEME_DARKER, THEME_BLACK, THEME_DYNAMIC, THEME_USER } ;
public static final String[] COLORS_DARK = Build.VERSION.SDK_INT < Build.VERSION_CODES.S
? new String[] { THEME_HOLO_WHITE, THEME_DARK, THEME_DARKER, THEME_BLACK, THEME_USER_NIGHT }
: new String[] { THEME_HOLO_WHITE, THEME_DARK, THEME_DARKER, THEME_BLACK, THEME_DYNAMIC, THEME_USER_NIGHT } ;
public static final String[] STYLES = { STYLE_MATERIAL, STYLE_HOLO, STYLE_ROUNDED }; public static final String[] STYLES = { STYLE_MATERIAL, STYLE_HOLO, STYLE_ROUNDED };
@ -146,7 +154,7 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
final boolean hasBorders = prefs.getBoolean(Settings.PREF_THEME_KEY_BORDERS, false); final boolean hasBorders = prefs.getBoolean(Settings.PREF_THEME_KEY_BORDERS, false);
switch (themeColors) { switch (themeColors) {
case THEME_USER: case THEME_USER:
return new Colors( return new DefaultColors(
themeStyle, themeStyle,
hasBorders, hasBorders,
Settings.readUserColor(prefs, context, Settings.PREF_COLOR_ACCENT_SUFFIX, false), Settings.readUserColor(prefs, context, Settings.PREF_COLOR_ACCENT_SUFFIX, false),
@ -160,7 +168,7 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
Settings.readUserColor(prefs, context, Settings.PREF_COLOR_SPACEBAR_TEXT_SUFFIX, false) Settings.readUserColor(prefs, context, Settings.PREF_COLOR_SPACEBAR_TEXT_SUFFIX, false)
); );
case THEME_USER_NIGHT: case THEME_USER_NIGHT:
return new Colors( return new DefaultColors(
themeStyle, themeStyle,
hasBorders, hasBorders,
Settings.readUserColor(prefs, context, Settings.PREF_COLOR_ACCENT_SUFFIX, true), Settings.readUserColor(prefs, context, Settings.PREF_COLOR_ACCENT_SUFFIX, true),
@ -174,7 +182,7 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
Settings.readUserColor(prefs, context, Settings.PREF_COLOR_SPACEBAR_TEXT_SUFFIX, true) Settings.readUserColor(prefs, context, Settings.PREF_COLOR_SPACEBAR_TEXT_SUFFIX, true)
); );
case THEME_DARK: case THEME_DARK:
return new Colors( return new DefaultColors(
themeStyle, themeStyle,
hasBorders, hasBorders,
ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark),
@ -189,7 +197,7 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
ContextCompat.getColor(context, R.color.spacebar_letter_color_lxx_dark) ContextCompat.getColor(context, R.color.spacebar_letter_color_lxx_dark)
); );
case THEME_HOLO_WHITE: case THEME_HOLO_WHITE:
return new Colors( return new DefaultColors(
themeStyle, themeStyle,
hasBorders, hasBorders,
Color.parseColor("#FFFFFF"), Color.parseColor("#FFFFFF"),
@ -204,7 +212,7 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
Color.parseColor("#80FFFFFF") Color.parseColor("#80FFFFFF")
); );
case THEME_DARKER: case THEME_DARKER:
return new Colors( return new DefaultColors(
themeStyle, themeStyle,
hasBorders, hasBorders,
ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark),
@ -218,7 +226,7 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
ContextCompat.getColor(context, R.color.spacebar_letter_color_lxx_dark) ContextCompat.getColor(context, R.color.spacebar_letter_color_lxx_dark)
); );
case THEME_BLACK: case THEME_BLACK:
return new Colors( return new DefaultColors(
themeStyle, themeStyle,
hasBorders, hasBorders,
ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark),
@ -231,9 +239,13 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
ContextCompat.getColor(context, R.color.key_hint_letter_color_lxx_dark), ContextCompat.getColor(context, R.color.key_hint_letter_color_lxx_dark),
ContextCompat.getColor(context, R.color.spacebar_letter_color_lxx_dark) ContextCompat.getColor(context, R.color.spacebar_letter_color_lxx_dark)
); );
case THEME_DYNAMIC:
if (Build.VERSION.SDK_INT >= VERSION_CODES.S) {
return new DynamicColors(context, themeStyle, hasBorders);
}
case THEME_LIGHT: case THEME_LIGHT:
default: default:
return new Colors( return new DefaultColors(
themeStyle, themeStyle,
hasBorders, hasBorders,
ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_light), ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_light),

View file

@ -31,12 +31,13 @@ import org.dslul.openboard.inputmethod.keyboard.emoji.EmojiPageKeyboardView;
import org.dslul.openboard.inputmethod.keyboard.internal.KeyDrawParams; import org.dslul.openboard.inputmethod.keyboard.internal.KeyDrawParams;
import org.dslul.openboard.inputmethod.keyboard.internal.KeyVisualAttributes; import org.dslul.openboard.inputmethod.keyboard.internal.KeyVisualAttributes;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.BackgroundType; import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.common.StringUtils; import org.dslul.openboard.inputmethod.latin.common.StringUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues; import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.suggestions.MoreSuggestions;
import org.dslul.openboard.inputmethod.latin.suggestions.MoreSuggestionsView; import org.dslul.openboard.inputmethod.latin.suggestions.MoreSuggestionsView;
import org.dslul.openboard.inputmethod.latin.utils.TypefaceUtils; import org.dslul.openboard.inputmethod.latin.utils.TypefaceUtils;
@ -139,18 +140,18 @@ public class KeyboardView extends View {
final TypedArray keyboardViewAttr = context.obtainStyledAttributes(attrs, final TypedArray keyboardViewAttr = context.obtainStyledAttributes(attrs,
R.styleable.KeyboardView, defStyle, R.style.KeyboardView); R.styleable.KeyboardView, defStyle, R.style.KeyboardView);
if (this instanceof EmojiPageKeyboardView || this instanceof MoreSuggestionsView) if (this instanceof EmojiPageKeyboardView || this instanceof MoreSuggestionsView)
mKeyBackground = mColors.getDrawable(BackgroundType.BACKGROUND, keyboardViewAttr); mKeyBackground = mColors.selectAndColorDrawable(keyboardViewAttr, ColorType.BACKGROUND);
else if (this instanceof MoreKeysKeyboardView) else if (this instanceof MoreKeysKeyboardView)
mKeyBackground = mColors.getDrawable(BackgroundType.ADJUSTED_BACKGROUND, keyboardViewAttr); mKeyBackground = mColors.selectAndColorDrawable(keyboardViewAttr, ColorType.MORE_KEYS_BACKGROUND);
else else
mKeyBackground = mColors.getDrawable(BackgroundType.KEY, keyboardViewAttr); mKeyBackground = mColors.selectAndColorDrawable(keyboardViewAttr, ColorType.KEY_BACKGROUND);
mKeyBackground.getPadding(mKeyBackgroundPadding); mKeyBackground.getPadding(mKeyBackgroundPadding);
mFunctionalKeyBackground = mColors.getDrawable(BackgroundType.FUNCTIONAL, keyboardViewAttr); mFunctionalKeyBackground = mColors.selectAndColorDrawable(keyboardViewAttr, ColorType.FUNCTIONAL_KEY_BACKGROUND);
mSpacebarBackground = mColors.getDrawable(BackgroundType.SPACE, keyboardViewAttr); mSpacebarBackground = mColors.selectAndColorDrawable(keyboardViewAttr, ColorType.SPACE_BAR_BACKGROUND);
if (this instanceof MoreKeysKeyboardView) if (this instanceof MoreKeysKeyboardView)
mActionKeyBackground = mColors.getDrawable(BackgroundType.ACTION_MORE_KEYS, keyboardViewAttr); mActionKeyBackground = mColors.selectAndColorDrawable(keyboardViewAttr, ColorType.ACTION_KEY_MORE_KEYS_BACKGROUND);
else else
mActionKeyBackground = mColors.getDrawable(BackgroundType.ACTION, keyboardViewAttr); mActionKeyBackground = mColors.selectAndColorDrawable(keyboardViewAttr, ColorType.ACTION_KEY_BACKGROUND);
mSpacebarIconWidthRatio = keyboardViewAttr.getFloat( mSpacebarIconWidthRatio = keyboardViewAttr.getFloat(
R.styleable.KeyboardView_spacebarIconWidthRatio, 1.0f); R.styleable.KeyboardView_spacebarIconWidthRatio, 1.0f);
@ -176,7 +177,6 @@ public class KeyboardView extends View {
keyAttr.recycle(); keyAttr.recycle();
mPaint.setAntiAlias(true); mPaint.setAntiAlias(true);
mColors.setKeyboardBackground(this);
} }
@Nullable @Nullable
@ -204,6 +204,14 @@ public class KeyboardView extends View {
* @param keyboard the keyboard to display in this view * @param keyboard the keyboard to display in this view
*/ */
public void setKeyboard(@NonNull final Keyboard keyboard) { public void setKeyboard(@NonNull final Keyboard keyboard) {
if (keyboard instanceof MoreSuggestions) {
mColors.setBackground(this, ColorType.MORE_SUGGESTIONS_BACKGROUND);
} else if (keyboard instanceof MoreKeysKeyboard) {
mColors.setBackground(this, ColorType.MORE_KEYS_BACKGROUND);
} else {
mColors.setBackground(this, ColorType.KEYBOARD_BACKGROUND);
}
mKeyboard = keyboard; mKeyboard = keyboard;
final SettingsValues sv = Settings.getInstance().getCurrent(); final SettingsValues sv = Settings.getInstance().getCurrent();
// scale should not depend on mOneHandedModeScale for emoji and clipboard, because those views are not affected by one-handed mode (yet) // scale should not depend on mOneHandedModeScale for emoji and clipboard, because those views are not affected by one-handed mode (yet)
@ -625,24 +633,24 @@ public class KeyboardView extends View {
private void setKeyIconColor(Key key, Drawable icon, Keyboard keyboard) { private void setKeyIconColor(Key key, Drawable icon, Keyboard keyboard) {
if (key.isAccentColored()) { if (key.isAccentColored()) {
icon.setColorFilter(mColors.getActionKeyIconColorFilter()); mColors.setColor(icon, ColorType.ACTION_KEY_ICON);
} else if (key.isShift() && keyboard != null) { } else if (key.isShift() && keyboard != null) {
if (keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED if (keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED
|| keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED || keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED
|| keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED || keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED
|| keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED || keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED
) )
icon.setColorFilter(mColors.getAccentColorFilter()); mColors.setColor(icon, ColorType.SHIFT_KEY_ICON);
else else
icon.setColorFilter(mColors.getKeyTextFilter()); // key text if not shifted mColors.setColor(icon, ColorType.KEY_ICON); // normal key if not shifted
} else if (key.getBackgroundType() != Key.BACKGROUND_TYPE_NORMAL) { } else if (key.getBackgroundType() != Key.BACKGROUND_TYPE_NORMAL) {
icon.setColorFilter(mColors.getKeyTextFilter()); mColors.setColor(icon, ColorType.KEY_ICON);
} else if (this instanceof MoreKeysKeyboardView) { } else if (this instanceof MoreKeysKeyboardView) {
// set color filter for long press comma key, should not trigger anywhere else // set color filter for long press comma key, should not trigger anywhere else
icon.setColorFilter(mColors.getKeyTextFilter()); mColors.setColor(icon, ColorType.KEY_ICON);
} else if (key.getCode() == Constants.CODE_SPACE || key.getCode() == 0x200C) { } else if (key.getCode() == Constants.CODE_SPACE || key.getCode() == 0x200C) {
// set color of default number pad space bar icon for Holo style, or for zero-width non-joiner (zwnj) on some layouts like nepal // set color of default number pad space bar icon for Holo style, or for zero-width non-joiner (zwnj) on some layouts like nepal
icon.setColorFilter(mColors.getKeyTextFilter()); mColors.setColor(icon, ColorType.KEY_ICON);
} }
} }

View file

@ -46,6 +46,7 @@ import org.dslul.openboard.inputmethod.keyboard.internal.TimerHandler;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype; import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype;
import org.dslul.openboard.inputmethod.latin.SuggestedWords; import org.dslul.openboard.inputmethod.latin.SuggestedWords;
import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils; import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
@ -202,7 +203,7 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy
mLanguageOnSpacebarTextRatio = mainKeyboardViewAttr.getFraction( mLanguageOnSpacebarTextRatio = mainKeyboardViewAttr.getFraction(
R.styleable.MainKeyboardView_languageOnSpacebarTextRatio, 1, 1, 1.0f); R.styleable.MainKeyboardView_languageOnSpacebarTextRatio, 1, 1, 1.0f);
final Colors colors = Settings.getInstance().getCurrent().mColors; final Colors colors = Settings.getInstance().getCurrent().mColors;
mLanguageOnSpacebarTextColor = colors.getSpaceBarText(); mLanguageOnSpacebarTextColor = colors.get(ColorType.SPACE_BAR_TEXT);
mLanguageOnSpacebarTextShadowRadius = mainKeyboardViewAttr.getFloat( mLanguageOnSpacebarTextShadowRadius = mainKeyboardViewAttr.getFloat(
R.styleable.MainKeyboardView_languageOnSpacebarTextShadowRadius, R.styleable.MainKeyboardView_languageOnSpacebarTextShadowRadius,
LANGUAGE_ON_SPACEBAR_TEXT_SHADOW_RADIUS_DISABLED); LANGUAGE_ON_SPACEBAR_TEXT_SHADOW_RADIUS_DISABLED);

View file

@ -14,7 +14,7 @@ import androidx.recyclerview.widget.RecyclerView
import org.dslul.openboard.inputmethod.latin.ClipboardHistoryEntry import org.dslul.openboard.inputmethod.latin.ClipboardHistoryEntry
import org.dslul.openboard.inputmethod.latin.ClipboardHistoryManager import org.dslul.openboard.inputmethod.latin.ClipboardHistoryManager
import org.dslul.openboard.inputmethod.latin.R import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.common.BackgroundType import org.dslul.openboard.inputmethod.latin.common.ColorType
import org.dslul.openboard.inputmethod.latin.settings.Settings import org.dslul.openboard.inputmethod.latin.settings.Settings
class ClipboardAdapter( class ClipboardAdapter(
@ -57,8 +57,8 @@ class ClipboardAdapter(
setOnTouchListener(this@ViewHolder) setOnTouchListener(this@ViewHolder)
setOnLongClickListener(this@ViewHolder) setOnLongClickListener(this@ViewHolder)
setBackgroundResource(itemBackgroundId) setBackgroundResource(itemBackgroundId)
Settings.getInstance().current.mColors.setBackgroundColor(background, BackgroundType.KEY)
} }
Settings.getInstance().current.mColors.setBackground(view, ColorType.KEY_BACKGROUND)
pinnedIconView = view.findViewById<ImageView>(R.id.clipboard_entry_pinned_icon).apply { pinnedIconView = view.findViewById<ImageView>(R.id.clipboard_entry_pinned_icon).apply {
visibility = View.GONE visibility = View.GONE
setImageResource(pinnedIconResId) setImageResource(pinnedIconResId)
@ -70,7 +70,7 @@ class ClipboardAdapter(
} }
clipboardLayoutParams.setItemProperties(view) clipboardLayoutParams.setItemProperties(view)
val colors = Settings.getInstance().current.mColors val colors = Settings.getInstance().current.mColors
pinnedIconView.colorFilter = colors.accentColorFilter colors.setColor(pinnedIconView, ColorType.CLIPBOARD_PIN)
} }
fun setContent(historyEntry: ClipboardHistoryEntry?) { fun setContent(historyEntry: ClipboardHistoryEntry?) {

View file

@ -18,7 +18,7 @@ import org.dslul.openboard.inputmethod.keyboard.internal.KeyVisualAttributes
import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardIconsSet import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardIconsSet
import org.dslul.openboard.inputmethod.latin.ClipboardHistoryManager import org.dslul.openboard.inputmethod.latin.ClipboardHistoryManager
import org.dslul.openboard.inputmethod.latin.R import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.common.BackgroundType import org.dslul.openboard.inputmethod.latin.common.ColorType
import org.dslul.openboard.inputmethod.latin.common.Constants import org.dslul.openboard.inputmethod.latin.common.Constants
import org.dslul.openboard.inputmethod.latin.settings.Settings import org.dslul.openboard.inputmethod.latin.settings.Settings
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils
@ -95,16 +95,16 @@ class ClipboardHistoryView @JvmOverloads constructor(
clearKey = findViewById<ImageButton>(R.id.clipboard_clear).apply { clearKey = findViewById<ImageButton>(R.id.clipboard_clear).apply {
setOnTouchListener(this@ClipboardHistoryView) setOnTouchListener(this@ClipboardHistoryView)
setOnClickListener(this@ClipboardHistoryView) setOnClickListener(this@ClipboardHistoryView)
colorFilter = colors.keyTextFilter
colors.setBackgroundColor(background, BackgroundType.SUGGESTION)
} }
colors.setColor(clearKey, ColorType.CLEAR_CLIPBOARD_HISTORY_KEY)
colors.setBackground(clearKey, ColorType.CLEAR_CLIPBOARD_HISTORY_KEY)
} }
private fun setupAlphabetKey(key: TextView?, label: String, params: KeyDrawParams) { private fun setupAlphabetKey(key: TextView?, label: String, params: KeyDrawParams) {
key?.apply { key?.apply {
text = label text = label
typeface = params.mTypeface typeface = params.mTypeface
Settings.getInstance().current.mColors.setBackgroundColor(this.background, BackgroundType.FUNCTIONAL) Settings.getInstance().current.mColors.setBackground(this, ColorType.FUNCTIONAL_KEY_BACKGROUND)
setTextColor(params.mFunctionalTextColor) setTextColor(params.mFunctionalTextColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mLabelSize.toFloat()) setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mLabelSize.toFloat())
} }
@ -155,7 +155,7 @@ class ClipboardHistoryView @JvmOverloads constructor(
clipboardRecyclerView.apply { clipboardRecyclerView.apply {
adapter = clipboardAdapter adapter = clipboardAdapter
} }
Settings.getInstance().current.mColors.setKeyboardBackground(this) Settings.getInstance().current.mColors.setBackground(this, ColorType.CLIPBOARD_BACKGROUND)
} }
fun stopClipboardHistory() { fun stopClipboardHistory() {

View file

@ -37,7 +37,7 @@ import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardIconsSet;
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager; import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype; import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype;
import org.dslul.openboard.inputmethod.latin.common.BackgroundType; import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
@ -68,7 +68,7 @@ public final class EmojiPalettesView extends LinearLayout
private final int mCategoryIndicatorDrawableResId; private final int mCategoryIndicatorDrawableResId;
private final int mCategoryIndicatorBackgroundResId; private final int mCategoryIndicatorBackgroundResId;
private final int mCategoryPageIndicatorColor; private final int mCategoryPageIndicatorColor;
private final int mCategoryPageIndicatorBackground; private final Colors mColors;
private EmojiPalettesAdapter mEmojiPalettesAdapter; private EmojiPalettesAdapter mEmojiPalettesAdapter;
private final EmojiLayoutParams mEmojiLayoutParams; private final EmojiLayoutParams mEmojiLayoutParams;
private final DeleteKeyOnTouchListener mDeleteKeyOnTouchListener; private final DeleteKeyOnTouchListener mDeleteKeyOnTouchListener;
@ -101,7 +101,8 @@ public final class EmojiPalettesView extends LinearLayout
R.styleable.KeyboardView_keyBackground, 0); R.styleable.KeyboardView_keyBackground, 0);
mFunctionalKeyBackgroundId = keyboardViewAttr.getResourceId( mFunctionalKeyBackgroundId = keyboardViewAttr.getResourceId(
R.styleable.KeyboardView_functionalKeyBackground, keyBackgroundId); R.styleable.KeyboardView_functionalKeyBackground, keyBackgroundId);
mSpacebarBackground = Settings.getInstance().getCurrent().mColors.getDrawable(BackgroundType.SPACE, keyboardViewAttr); mColors = Settings.getInstance().getCurrent().mColors;
mSpacebarBackground = mColors.selectAndColorDrawable(keyboardViewAttr, ColorType.SPACE_BAR_BACKGROUND);
keyboardViewAttr.recycle(); keyboardViewAttr.recycle();
final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(context, null); final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(context, null);
final Resources res = context.getResources(); final Resources res = context.getResources();
@ -122,7 +123,6 @@ public final class EmojiPalettesView extends LinearLayout
R.styleable.EmojiPalettesView_categoryIndicatorBackground, 0); R.styleable.EmojiPalettesView_categoryIndicatorBackground, 0);
mCategoryPageIndicatorColor = emojiPalettesViewAttr.getColor( mCategoryPageIndicatorColor = emojiPalettesViewAttr.getColor(
R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0); R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0);
mCategoryPageIndicatorBackground = Settings.getInstance().getCurrent().mColors.getAdjustedBackground(); //emojiPalettesViewAttr.getColor(R.styleable.EmojiPalettesView_categoryPageIndicatorBackground, 0);
emojiPalettesViewAttr.recycle(); emojiPalettesViewAttr.recycle();
mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(); mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener();
mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
@ -147,10 +147,8 @@ public final class EmojiPalettesView extends LinearLayout
tspec.setContent(R.id.emoji_keyboard_dummy); tspec.setContent(R.id.emoji_keyboard_dummy);
final ImageView iconView = (ImageView) LayoutInflater.from(getContext()).inflate( final ImageView iconView = (ImageView) LayoutInflater.from(getContext()).inflate(
R.layout.emoji_keyboard_tab_icon, null); R.layout.emoji_keyboard_tab_icon, null);
// TODO: Replace background color with its own setting rather than using the mColors.setBackground(iconView, ColorType.EMOJI_CATEGORY_BACKGROUND);
// category page indicator background as a workaround. mColors.setColor(iconView, ColorType.EMOJI_CATEGORY);
iconView.setBackgroundColor(mCategoryPageIndicatorBackground);
iconView.setColorFilter(Settings.getInstance().getCurrent().mColors.getKeyTextFilter());
iconView.setImageResource(mEmojiCategory.getCategoryTabIcon(categoryId)); iconView.setImageResource(mEmojiCategory.getCategoryTabIcon(categoryId));
iconView.setContentDescription(mEmojiCategory.getAccessibilityDescription(categoryId)); iconView.setContentDescription(mEmojiCategory.getAccessibilityDescription(categoryId));
tspec.setIndicator(iconView); tspec.setIndicator(iconView);
@ -160,7 +158,6 @@ public final class EmojiPalettesView extends LinearLayout
@Override @Override
protected void onFinishInflate() { protected void onFinishInflate() {
super.onFinishInflate(); super.onFinishInflate();
final Colors colors = Settings.getInstance().getCurrent().mColors;
mTabHost = findViewById(R.id.emoji_category_tabhost); mTabHost = findViewById(R.id.emoji_category_tabhost);
mTabHost.setup(); mTabHost.setup();
@ -177,7 +174,7 @@ public final class EmojiPalettesView extends LinearLayout
tabWidget.setBackgroundResource(mCategoryIndicatorDrawableResId); tabWidget.setBackgroundResource(mCategoryIndicatorDrawableResId);
tabWidget.setLeftStripDrawable(mCategoryIndicatorBackgroundResId); tabWidget.setLeftStripDrawable(mCategoryIndicatorBackgroundResId);
tabWidget.setRightStripDrawable(mCategoryIndicatorBackgroundResId); tabWidget.setRightStripDrawable(mCategoryIndicatorBackgroundResId);
tabWidget.setBackgroundColor(colors.getAccent()); tabWidget.setBackgroundColor(mColors.get(ColorType.EMOJI_CATEGORY_SELECTED));
} }
mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this); mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this);
@ -221,7 +218,7 @@ public final class EmojiPalettesView extends LinearLayout
mEmojiCategoryPageIndicatorView = mEmojiCategoryPageIndicatorView =
findViewById(R.id.emoji_category_page_id_view); findViewById(R.id.emoji_category_page_id_view);
mEmojiCategoryPageIndicatorView.setColors( mEmojiCategoryPageIndicatorView.setColors(
mCategoryPageIndicatorColor, mCategoryPageIndicatorBackground); mCategoryPageIndicatorColor, mColors.get(ColorType.EMOJI_CATEGORY_BACKGROUND));
mEmojiLayoutParams.setCategoryPageIdViewProperties(mEmojiCategoryPageIndicatorView); mEmojiLayoutParams.setCategoryPageIdViewProperties(mEmojiCategoryPageIndicatorView);
setCurrentCategoryAndPageId(mEmojiCategory.getCurrentCategoryId(), mEmojiCategory.getCurrentCategoryPageId(), setCurrentCategoryAndPageId(mEmojiCategory.getCurrentCategoryId(), mEmojiCategory.getCurrentCategoryPageId(),
@ -235,7 +232,7 @@ public final class EmojiPalettesView extends LinearLayout
// deleteKey depends only on OnTouchListener. // deleteKey depends only on OnTouchListener.
mDeleteKey = findViewById(R.id.emoji_keyboard_delete); mDeleteKey = findViewById(R.id.emoji_keyboard_delete);
mDeleteKey.setBackgroundResource(mFunctionalKeyBackgroundId); mDeleteKey.setBackgroundResource(mFunctionalKeyBackgroundId);
mDeleteKey.setColorFilter(colors.getKeyTextFilter()); mColors.setColor(mDeleteKey, ColorType.KEY_ICON);
mDeleteKey.setTag(Constants.CODE_DELETE); mDeleteKey.setTag(Constants.CODE_DELETE);
mDeleteKey.setOnTouchListener(mDeleteKeyOnTouchListener); mDeleteKey.setOnTouchListener(mDeleteKeyOnTouchListener);
@ -260,10 +257,10 @@ public final class EmojiPalettesView extends LinearLayout
mEmojiLayoutParams.setKeyProperties(mSpacebar); mEmojiLayoutParams.setKeyProperties(mSpacebar);
mSpacebarIcon = findViewById(R.id.emoji_keyboard_space_icon); mSpacebarIcon = findViewById(R.id.emoji_keyboard_space_icon);
colors.setBackgroundColor(mAlphabetKeyLeft.getBackground(), BackgroundType.FUNCTIONAL); mColors.setBackground(mAlphabetKeyLeft, ColorType.FUNCTIONAL_KEY_BACKGROUND);
colors.setBackgroundColor(mDeleteKey.getBackground(), BackgroundType.FUNCTIONAL); mColors.setBackground(mDeleteKey, ColorType.FUNCTIONAL_KEY_BACKGROUND);
colors.setBackgroundColor(mSpacebar.getBackground(), BackgroundType.SPACE); mColors.setBackground(mSpacebar, ColorType.SPACE_BAR_BACKGROUND);
mEmojiCategoryPageIndicatorView.setColors(colors.getAccent(), colors.getAdjustedBackground()); mEmojiCategoryPageIndicatorView.setColors(mColors.get(ColorType.EMOJI_CATEGORY_SELECTED), mColors.get(ColorType.EMOJI_CATEGORY_BACKGROUND));
} }
@Override @Override
@ -283,11 +280,10 @@ public final class EmojiPalettesView extends LinearLayout
setCurrentCategoryAndPageId(categoryId, 0, false /* force */); setCurrentCategoryAndPageId(categoryId, 0, false /* force */);
updateEmojiCategoryPageIdView(); updateEmojiCategoryPageIdView();
} }
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (mCurrentTab != null) if (mCurrentTab != null)
mCurrentTab.setColorFilter(colors.getKeyTextFilter()); mColors.setColor(mCurrentTab, ColorType.EMOJI_CATEGORY);
mCurrentTab = (ImageView) mTabHost.getCurrentTabView(); mCurrentTab = (ImageView) mTabHost.getCurrentTabView();
mCurrentTab.setColorFilter(colors.getAccentColorFilter()); mColors.setColor(mCurrentTab, ColorType.EMOJI_CATEGORY_SELECTED);
} }
/** /**
@ -387,10 +383,9 @@ public final class EmojiPalettesView extends LinearLayout
setupAlphabetKey(mAlphabetKeyLeft, switchToAlphaLabel, params); setupAlphabetKey(mAlphabetKeyLeft, switchToAlphaLabel, params);
if (mEmojiRecyclerView.getAdapter() == null) { if (mEmojiRecyclerView.getAdapter() == null) {
mEmojiRecyclerView.setAdapter(mEmojiPalettesAdapter); mEmojiRecyclerView.setAdapter(mEmojiPalettesAdapter);
setCurrentCategoryAndPageId(mEmojiCategory.getCurrentCategoryId(), mEmojiCategory.getCurrentCategoryPageId(), setCurrentCategoryAndPageId(mEmojiCategory.getCurrentCategoryId(), mEmojiCategory.getCurrentCategoryPageId(), true);
true /* force */);
} }
Settings.getInstance().getCurrent().mColors.setKeyboardBackground(this); mColors.setBackground(this, ColorType.EMOJI_BACKGROUND);
} }
public void stopEmojiPalettes() { public void stopEmojiPalettes() {

View file

@ -19,6 +19,7 @@ import androidx.annotation.NonNull;
import org.dslul.openboard.inputmethod.keyboard.PointerTracker; import org.dslul.openboard.inputmethod.keyboard.PointerTracker;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.SuggestedWords; import org.dslul.openboard.inputmethod.latin.SuggestedWords;
import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils; import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
@ -55,10 +56,10 @@ public class GestureFloatingTextDrawingPreview extends AbstractDrawingPreview {
final Colors colors = Settings.getInstance().getCurrent().mColors; final Colors colors = Settings.getInstance().getCurrent().mColors;
mGesturePreviewTextSize = mainKeyboardViewAttr.getDimensionPixelSize( mGesturePreviewTextSize = mainKeyboardViewAttr.getDimensionPixelSize(
R.styleable.MainKeyboardView_gestureFloatingPreviewTextSize, 0); R.styleable.MainKeyboardView_gestureFloatingPreviewTextSize, 0);
mGesturePreviewTextColor = colors.getKeyText(); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureFloatingPreviewTextColor, 0); mGesturePreviewTextColor = colors.get(ColorType.KEY_TEXT); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureFloatingPreviewTextColor, 0);
mGesturePreviewTextOffset = mainKeyboardViewAttr.getDimensionPixelOffset( mGesturePreviewTextOffset = mainKeyboardViewAttr.getDimensionPixelOffset(
R.styleable.MainKeyboardView_gestureFloatingPreviewTextOffset, 0); R.styleable.MainKeyboardView_gestureFloatingPreviewTextOffset, 0);
mGesturePreviewColor = colors.getAdjustedBackground(); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureFloatingPreviewColor, 0); mGesturePreviewColor = colors.get(ColorType.GESTURE_PREVIEW); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureFloatingPreviewColor, 0);
mGesturePreviewHorizontalPadding = mainKeyboardViewAttr.getDimension( mGesturePreviewHorizontalPadding = mainKeyboardViewAttr.getDimension(
R.styleable.MainKeyboardView_gestureFloatingPreviewHorizontalPadding, 0.0f); R.styleable.MainKeyboardView_gestureFloatingPreviewHorizontalPadding, 0.0f);
mGesturePreviewVerticalPadding = mainKeyboardViewAttr.getDimension( mGesturePreviewVerticalPadding = mainKeyboardViewAttr.getDimension(

View file

@ -9,6 +9,7 @@ package org.dslul.openboard.inputmethod.keyboard.internal;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
/** /**
@ -41,7 +42,7 @@ final class GestureTrailDrawingParams {
public final int mTrailLingerDuration; public final int mTrailLingerDuration;
public GestureTrailDrawingParams(final TypedArray mainKeyboardViewAttr) { public GestureTrailDrawingParams(final TypedArray mainKeyboardViewAttr) {
mTrailColor = Settings.getInstance().getCurrent().mColors.getGesture(); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureTrailColor, 0); mTrailColor = Settings.getInstance().getCurrent().mColors.get(ColorType.GESTURE_TRAIL); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureTrailColor, 0);
mTrailStartWidth = mainKeyboardViewAttr.getDimension( mTrailStartWidth = mainKeyboardViewAttr.getDimension(
R.styleable.MainKeyboardView_gestureTrailStartWidth, 0.0f); R.styleable.MainKeyboardView_gestureTrailStartWidth, 0.0f);
mTrailEndWidth = mainKeyboardViewAttr.getDimension( mTrailEndWidth = mainKeyboardViewAttr.getDimension(

View file

@ -11,6 +11,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.dslul.openboard.inputmethod.keyboard.Key; import org.dslul.openboard.inputmethod.keyboard.Key;
import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils; import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
@ -108,7 +109,8 @@ public final class KeyPreviewChoreographer {
final boolean hasMoreKeys = (key.getMoreKeys() != null); final boolean hasMoreKeys = (key.getMoreKeys() != null);
keyPreviewView.setPreviewBackground(hasMoreKeys, keyPreviewPosition); keyPreviewView.setPreviewBackground(hasMoreKeys, keyPreviewPosition);
final Colors colors = Settings.getInstance().getCurrent().mColors; final Colors colors = Settings.getInstance().getCurrent().mColors;
keyPreviewView.getBackground().setColorFilter(colors.getAdjustedBackgroundFilter()); colors.setBackground(keyPreviewView, ColorType.KEY_PREVIEW);
// The key preview is placed vertically above the top edge of the parent key with an // The key preview is placed vertically above the top edge of the parent key with an
// arbitrary offset. // arbitrary offset.
final int previewY = key.getY() - previewHeight + key.getHeight() - mParams.mPreviewOffset final int previewY = key.getY() - previewHeight + key.getHeight() - mParams.mPreviewOffset

View file

@ -14,6 +14,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils; import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
@ -118,19 +119,19 @@ public final class KeyVisualAttributes {
R.styleable.Keyboard_Key_keyPreviewTextRatio); R.styleable.Keyboard_Key_keyPreviewTextRatio);
final Colors colors = Settings.getInstance().getCurrent().mColors; final Colors colors = Settings.getInstance().getCurrent().mColors;
mTextColor = colors.getKeyText(); //keyAttr.getColor(R.styleable.Keyboard_Key_keyTextColor, 0); mTextColor = colors.get(ColorType.KEY_TEXT); //keyAttr.getColor(R.styleable.Keyboard_Key_keyTextColor, 0);
mTextInactivatedColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyTextInactivatedColor, 0); mTextInactivatedColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyTextInactivatedColor, 0);
mTextShadowColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyTextShadowColor, 0); mTextShadowColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyTextShadowColor, 0);
// todo: maybe a separate color? // todo: maybe a separate color?
mFunctionalTextColor = colors.getKeyText(); //keyAttr.getColor(R.styleable.Keyboard_Key_functionalTextColor, 0); mFunctionalTextColor = colors.get(ColorType.KEY_TEXT); //keyAttr.getColor(R.styleable.Keyboard_Key_functionalTextColor, 0);
mHintLetterColor = colors.getKeyHintText(); //keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLetterColor, 0); mHintLetterColor = colors.get(ColorType.KEY_HINT_TEXT); //keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLetterColor, 0);
mHintLabelColor = colors.getKeyText(); //keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLabelColor, 0); mHintLabelColor = colors.get(ColorType.KEY_TEXT); //keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLabelColor, 0);
mShiftedLetterHintInactivatedColor = keyAttr.getColor( mShiftedLetterHintInactivatedColor = keyAttr.getColor(
R.styleable.Keyboard_Key_keyShiftedLetterHintInactivatedColor, 0); R.styleable.Keyboard_Key_keyShiftedLetterHintInactivatedColor, 0);
mShiftedLetterHintActivatedColor = keyAttr.getColor( mShiftedLetterHintActivatedColor = keyAttr.getColor(
R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor, 0); R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor, 0);
// todo: maybe a separate color? // todo: maybe a separate color?
mPreviewTextColor = colors.getKeyText(); //keyAttr.getColor(R.styleable.Keyboard_Key_keyPreviewTextColor, 0); mPreviewTextColor = colors.get(ColorType.KEY_TEXT); //keyAttr.getColor(R.styleable.Keyboard_Key_keyPreviewTextColor, 0);
mHintLabelVerticalAdjustment = ResourceUtils.getFraction(keyAttr, mHintLabelVerticalAdjustment = ResourceUtils.getFraction(keyAttr,
R.styleable.Keyboard_Key_keyHintLabelVerticalAdjustment, 0.0f); R.styleable.Keyboard_Key_keyHintLabelVerticalAdjustment, 0.0f);

View file

@ -15,6 +15,7 @@ import androidx.annotation.NonNull;
import org.dslul.openboard.inputmethod.keyboard.PointerTracker; import org.dslul.openboard.inputmethod.keyboard.PointerTracker;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils; import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
@ -38,7 +39,7 @@ public final class SlidingKeyInputDrawingPreview extends AbstractDrawingPreview
private final Paint mPaint = new Paint(); private final Paint mPaint = new Paint();
public SlidingKeyInputDrawingPreview(final TypedArray mainKeyboardViewAttr) { public SlidingKeyInputDrawingPreview(final TypedArray mainKeyboardViewAttr) {
final int previewColor = Settings.getInstance().getCurrent().mColors.getGesture(); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_slidingKeyInputPreviewColor, 0); final int previewColor = Settings.getInstance().getCurrent().mColors.get(ColorType.GESTURE_TRAIL); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_slidingKeyInputPreviewColor, 0);
final float previewRadius = mainKeyboardViewAttr.getDimension( final float previewRadius = mainKeyboardViewAttr.getDimension(
R.styleable.MainKeyboardView_slidingKeyInputPreviewWidth, 0) / 2.0f; R.styleable.MainKeyboardView_slidingKeyInputPreviewWidth, 0) / 2.0f;
final int PERCENTAGE_INT = 100; final int PERCENTAGE_INT = 100;

View file

@ -13,7 +13,7 @@ import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageButton import android.widget.ImageButton
import org.dslul.openboard.inputmethod.keyboard.KeyboardActionListener import org.dslul.openboard.inputmethod.keyboard.KeyboardActionListener
import org.dslul.openboard.inputmethod.latin.common.BackgroundType import org.dslul.openboard.inputmethod.latin.common.ColorType
import org.dslul.openboard.inputmethod.latin.common.Constants import org.dslul.openboard.inputmethod.latin.common.Constants
import org.dslul.openboard.inputmethod.latin.settings.Settings import org.dslul.openboard.inputmethod.latin.settings.Settings
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils
@ -95,12 +95,12 @@ class KeyboardWrapperView @JvmOverloads constructor(
} }
val colors = Settings.getInstance().current.mColors val colors = Settings.getInstance().current.mColors
stopOneHandedModeBtn.colorFilter = colors.keyTextFilter colors.setColor(stopOneHandedModeBtn, ColorType.ONE_HANDED_MODE_BUTTON)
switchOneHandedModeBtn.colorFilter = colors.keyTextFilter colors.setColor(switchOneHandedModeBtn, ColorType.ONE_HANDED_MODE_BUTTON)
colors.setBackgroundColor(stopOneHandedModeBtn.background, BackgroundType.BACKGROUND) colors.setBackground(stopOneHandedModeBtn, ColorType.BACKGROUND)
colors.setBackgroundColor(switchOneHandedModeBtn.background, BackgroundType.BACKGROUND) colors.setBackground(switchOneHandedModeBtn, ColorType.BACKGROUND)
setBackgroundColor(Color.WHITE) // otherwise background might be null setBackgroundColor(Color.WHITE) // otherwise background might be null
colors.setKeyboardBackground(this) colors.setBackground(this, ColorType.KEYBOARD_WRAPPER_BACKGROUND)
} }
@SuppressLint("RtlHardcoded") @SuppressLint("RtlHardcoded")

View file

@ -55,6 +55,7 @@ import org.dslul.openboard.inputmethod.keyboard.KeyboardSwitcher;
import org.dslul.openboard.inputmethod.keyboard.MainKeyboardView; import org.dslul.openboard.inputmethod.keyboard.MainKeyboardView;
import org.dslul.openboard.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback; import org.dslul.openboard.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils; import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
import org.dslul.openboard.inputmethod.latin.common.InputPointers; import org.dslul.openboard.inputmethod.latin.common.InputPointers;
@ -2040,7 +2041,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
final SettingsValues settingsValues = mSettings.getCurrent(); final SettingsValues settingsValues = mSettings.getCurrent();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || !settingsValues.mCustomNavBarColor) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || !settingsValues.mCustomNavBarColor)
return; return;
final int color = settingsValues.mColors.getNavBar(); final int color = settingsValues.mColors.get(ColorType.NAVIGATION_BAR);
final Window window = getWindow().getWindow(); final Window window = getWindow().getWindow();
if (window == null) if (window == null)
return; return;

View file

@ -2,61 +2,120 @@
package org.dslul.openboard.inputmethod.latin.common package org.dslul.openboard.inputmethod.latin.common
import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.content.res.Configuration
import android.content.res.TypedArray import android.content.res.TypedArray
import android.graphics.Color import android.graphics.Color
import android.graphics.ColorFilter import android.graphics.ColorFilter
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.view.View import android.view.View
import android.widget.ImageView
import androidx.annotation.ColorInt
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat import androidx.core.graphics.BlendModeCompat
import androidx.core.graphics.ColorUtils
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme.STYLE_HOLO import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme.STYLE_HOLO
import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme.STYLE_MATERIAL import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme.STYLE_MATERIAL
import org.dslul.openboard.inputmethod.keyboard.MainKeyboardView import org.dslul.openboard.inputmethod.latin.common.ColorType.*
import org.dslul.openboard.inputmethod.keyboard.MoreKeysKeyboardView
import org.dslul.openboard.inputmethod.keyboard.clipboard.ClipboardHistoryView
import org.dslul.openboard.inputmethod.keyboard.emoji.EmojiPageKeyboardView
import org.dslul.openboard.inputmethod.keyboard.emoji.EmojiPalettesView
import org.dslul.openboard.inputmethod.latin.KeyboardWrapperView
import org.dslul.openboard.inputmethod.latin.R import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.suggestions.MoreSuggestionsView import org.dslul.openboard.inputmethod.latin.utils.adjustLuminosityAndKeepAlpha
import org.dslul.openboard.inputmethod.latin.suggestions.SuggestionStripView import org.dslul.openboard.inputmethod.latin.utils.brighten
import org.dslul.openboard.inputmethod.latin.utils.* import org.dslul.openboard.inputmethod.latin.utils.brightenOrDarken
import org.dslul.openboard.inputmethod.latin.utils.darken
import org.dslul.openboard.inputmethod.latin.utils.isBrightColor
import org.dslul.openboard.inputmethod.latin.utils.isDarkColor
class Colors ( interface Colors {
val themeStyle: String, // these theme parameters should no be in here, but are still used
val hasKeyBorders: Boolean, /** used in KeyboardView for label placement */
val accent: Int, val themeStyle: String
val gesture: Int, /** used in parser to decide background of ZWNJ key */
val background: Int, val hasKeyBorders: Boolean
val keyBackground: Int,
val functionalKey: Int, /** use to check whether colors have changed, for colors (in)directly derived from context,
val spaceBar: Int, * e.g. night mode or potentially changing system colors */
val keyText: Int, fun haveColorsChanged(context: Context): Boolean
val keyHintText: Int,
val spaceBarText: Int /** get the colorInt */
) { @ColorInt fun get(color: ColorType): Int
val navBar: Int
/** apply a color to the [drawable], may be through color filter or tint (with or without state list) */
fun setColor(drawable: Drawable, color: ColorType)
/** set a foreground color to the [view] */
fun setColor(view: ImageView, color: ColorType)
/** set a background to the [view], may replace or adjust existing background */
fun setBackground(view: View, color: ColorType)
/** returns a colored drawable selected from [attr], which must contain using R.styleable.KeyboardView_* */
fun selectAndColorDrawable(attr: TypedArray, color: ColorType): Drawable
}
@RequiresApi(Build.VERSION_CODES.S)
class DynamicColors(context: Context, override val themeStyle: String, override val hasKeyBorders: Boolean) : Colors {
private val isNight = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
private val accent = getAccent(context)
private val gesture = getGesture(context)
private val background = getBackground(context)
private val keyBackground = getKeyBackground(context)
private val functionalKey = getFunctionalKey(context)
private val spaceBar = getKeyBackground(context)
private val keyText = getKeyText(context)
private val keyHintText = getKeyHintText(context)
private val spaceBarText = getSpaceBarText(context)
private fun getAccent(context: Context) = if (isNight) ContextCompat.getColor(context, android.R.color.system_accent1_100)
else ContextCompat.getColor(context, android.R.color.system_accent1_200)
private fun getGesture(context: Context) = if (isNight) accent
else ContextCompat.getColor(context, android.R.color.system_accent1_600)
private fun getBackground(context: Context) = if (isNight) ContextCompat.getColor(context, android.R.color.system_neutral1_900)
else ContextCompat.getColor(context, android.R.color.system_neutral1_50)
private fun getKeyBackground(context: Context) = if (isNight) ContextCompat.getColor(context, android.R.color.system_neutral1_800)
else ContextCompat.getColor(context, android.R.color.system_neutral1_0)
private fun getFunctionalKey(context: Context) = if (isNight) ContextCompat.getColor(context, android.R.color.system_accent2_300)
else ContextCompat.getColor(context, android.R.color.system_accent2_100)
private fun getKeyText(context: Context) = if (isNight) ContextCompat.getColor(context, android.R.color.system_neutral1_50)
else ContextCompat.getColor(context, android.R.color.system_accent3_900)
private fun getKeyHintText(context: Context) = if (isNight) keyText
else ContextCompat.getColor(context, android.R.color.system_accent3_700)
private fun getSpaceBarText(context: Context) = if (isNight) ColorUtils.setAlphaComponent(ContextCompat.getColor(context, android.R.color.system_neutral1_50), 127)
else ColorUtils.setAlphaComponent(ContextCompat.getColor(context, android.R.color.system_accent3_700), 127)
override fun haveColorsChanged(context: Context) =
accent != getAccent(context)
|| gesture != getGesture(context)
|| background != getBackground(context)
|| keyBackground != getKeyBackground(context)
|| functionalKey != getFunctionalKey(context)
|| keyText != getKeyText(context)
|| keyHintText != getKeyHintText(context)
|| spaceBarText != getSpaceBarText(context)
private val navBar: Int
/** brightened or darkened variant of [background], to be used if exact background color would be /** brightened or darkened variant of [background], to be used if exact background color would be
* bad contrast, e.g. more keys popup or no border space bar */ * bad contrast, e.g. more keys popup or no border space bar */
val adjustedBackground: Int private val adjustedBackground: Int
/** further brightened or darkened variant of [adjustedBackground] */ /** further brightened or darkened variant of [adjustedBackground] */
val doubleAdjustedBackground: Int private val doubleAdjustedBackground: Int
/** brightened or darkened variant of [keyText] */ /** brightened or darkened variant of [keyText] */
val adjustedKeyText: Int private val adjustedKeyText: Int
val backgroundFilter: ColorFilter private val backgroundFilter: ColorFilter
val adjustedBackgroundFilter: ColorFilter private val adjustedBackgroundFilter: ColorFilter
// val keyBackgroundFilter: ColorFilter private val keyTextFilter: ColorFilter
// val functionalKeyBackgroundFilter: ColorFilter private val accentColorFilter: ColorFilter
// val spaceBarFilter: ColorFilter
val keyTextFilter: ColorFilter
val accentColorFilter: ColorFilter
/** color filter for the white action key icons in material theme, switches to gray if necessary for contrast */ /** color filter for the white action key icons in material theme, switches to gray if necessary for contrast */
val actionKeyIconColorFilter: ColorFilter? private val actionKeyIconColorFilter: ColorFilter?
private val backgroundStateList: ColorStateList private val backgroundStateList: ColorStateList
private val keyStateList: ColorStateList private val keyStateList: ColorStateList
@ -69,8 +128,24 @@ class Colors (
/** custom drawable used for keyboard background */ /** custom drawable used for keyboard background */
private val keyboardBackground: Drawable? private val keyboardBackground: Drawable?
/** darkened variant of [accent] because the accent color is always light for dynamic colors */
private val adjustedAccent: Int = darken(accent)
/** further darkened variant of [adjustedAccent] */
private val doubleAdjustedAccent: Int = darken(adjustedAccent)
/** darkened variant of [functionalKey] used in day mode */
private val adjustedFunctionalKey: Int = darken(functionalKey)
/** further darkened variant of [adjustedFunctionalKey] */
private val doubleAdjustedFunctionalKey: Int = darken(adjustedFunctionalKey)
/** brightened variant of [keyBackground] used in night mode */
private val adjustedKeyBackground: Int = brighten(keyBackground)
/** further brightened variant of [adjustedKeyBackground] */
private val doubleAdjustedKeyBackground: Int = brighten(adjustedKeyBackground)
init { init {
accentColorFilter = colorFilter(accent) accentColorFilter = colorFilter(doubleAdjustedAccent)
if (themeStyle == STYLE_HOLO) { if (themeStyle == STYLE_HOLO) {
val darkerBackground = adjustLuminosityAndKeepAlpha(background, -0.2f) val darkerBackground = adjustLuminosityAndKeepAlpha(background, -0.2f)
navBar = darkerBackground navBar = darkerBackground
@ -80,15 +155,247 @@ class Colors (
keyboardBackground = null keyboardBackground = null
} }
// create color filters
val states = arrayOf(intArrayOf(android.R.attr.state_pressed), intArrayOf(-android.R.attr.state_pressed))
fun stateList(pressed: Int, normal: Int) = ColorStateList(states, intArrayOf(pressed, normal))
// todo (idea): make better use of the states? // todo (idea): make better use of the states?
// could also use / create StateListDrawables in colors (though that's a style than a color...) // could also use / create StateListDrawables in colors (though that's a style than a color...)
// this would better allow choosing e.g. cornered/rounded drawables for moreKeys or moreSuggestions // this would better allow choosing e.g. cornered/rounded drawables for moreKeys or moreSuggestions
backgroundFilter = colorFilter(background) backgroundFilter = colorFilter(background)
adjustedKeyText = brightenOrDarken(keyText, true) adjustedKeyText = brightenOrDarken(keyText, true)
if (isDarkColor(background)) {
adjustedBackground = brighten(background)
doubleAdjustedBackground = brighten(adjustedBackground)
} else {
adjustedBackground = darken(background)
doubleAdjustedBackground = darken(adjustedBackground)
}
adjustedBackgroundStateList =
if (themeStyle == STYLE_HOLO) {
stateList(accent, adjustedBackground)
} else if (isNight) {
if (hasKeyBorders) stateList(doubleAdjustedAccent, keyBackground)
else stateList(adjustedAccent, adjustedKeyBackground)
} else {
stateList(accent, Color.WHITE)
}
suggestionBackgroundList = if (!hasKeyBorders && themeStyle == STYLE_MATERIAL)
stateList(doubleAdjustedBackground, Color.TRANSPARENT)
else
stateList(adjustedBackground, Color.TRANSPARENT)
adjustedBackgroundFilter =
if (themeStyle == STYLE_HOLO) colorFilter(adjustedBackground)
else colorFilter(keyBackground)
if (hasKeyBorders) {
backgroundStateList =
if (!isNight) stateList(adjustedFunctionalKey, background)
else stateList(adjustedKeyBackground, background)
keyStateList =
if (!isNight) stateList(adjustedBackground, keyBackground)
else stateList(adjustedKeyBackground, keyBackground)
functionalKeyStateList =
if (!isNight) stateList(doubleAdjustedFunctionalKey, functionalKey)
else stateList(functionalKey, doubleAdjustedKeyBackground)
actionKeyStateList =
if (!isNight) stateList(gesture, accent)
else stateList(doubleAdjustedAccent, accent)
spaceBarStateList =
if (themeStyle == STYLE_HOLO) stateList(spaceBar, spaceBar)
else keyStateList
} else {
// need to set color to background if key borders are disabled, or there will be ugly keys
backgroundStateList =
if (!isNight) stateList(adjustedFunctionalKey, background)
else stateList(adjustedKeyBackground, background)
keyStateList =
if (!isNight) stateList(adjustedFunctionalKey, Color.TRANSPARENT)
else stateList(functionalKey, Color.TRANSPARENT)
functionalKeyStateList =
if (themeStyle == STYLE_HOLO) stateList(functionalKey, Color.TRANSPARENT)
else keyStateList
actionKeyStateList =
if (themeStyle == STYLE_HOLO) stateList(accent, Color.TRANSPARENT)
else if (!isNight) stateList(gesture, accent)
else stateList(doubleAdjustedAccent, accent)
spaceBarStateList =
if (!isNight) stateList(gesture, adjustedFunctionalKey)
else stateList(adjustedKeyBackground, spaceBar)
}
keyTextFilter = colorFilter(keyText)
actionKeyIconColorFilter = when {
themeStyle == STYLE_HOLO -> keyTextFilter
// the white icon may not have enough contrast, and can't be adjusted by the user
isBrightColor(accent) -> colorFilter(Color.DKGRAY)
else -> null
}
}
override fun get(color: ColorType): Int = when (color) {
TOOL_BAR_KEY_ENABLED_BACKGROUND, EMOJI_CATEGORY_SELECTED, ACTION_KEY_BACKGROUND,
CLIPBOARD_PIN, SHIFT_KEY_ICON -> accent
EMOJI_CATEGORY_BACKGROUND, GESTURE_PREVIEW, MORE_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW -> adjustedBackground
TOOL_BAR_EXPAND_KEY_BACKGROUND -> if (!isNight) accent else doubleAdjustedBackground
GESTURE_TRAIL -> gesture
KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, CLEAR_CLIPBOARD_HISTORY_KEY,
KEY_ICON, ONE_HANDED_MODE_BUTTON, EMOJI_CATEGORY, TOOL_BAR_KEY -> keyText
KEY_HINT_TEXT -> keyHintText
SPACE_BAR_TEXT -> spaceBarText
FUNCTIONAL_KEY_BACKGROUND -> functionalKey
SPACE_BAR_BACKGROUND -> spaceBar
BACKGROUND, KEYBOARD_WRAPPER_BACKGROUND, CLIPBOARD_BACKGROUND, EMOJI_BACKGROUND, KEYBOARD_BACKGROUND -> background
KEY_BACKGROUND -> keyBackground
ACTION_KEY_MORE_KEYS_BACKGROUND -> if (themeStyle == STYLE_HOLO) adjustedBackground else accent
SUGGESTION_BACKGROUND -> if (!hasKeyBorders && themeStyle == STYLE_MATERIAL) adjustedBackground else background
NAVIGATION_BAR -> navBar
MORE_SUGGESTIONS_HINT, SUGGESTED_WORD, SUGGESTION_TYPED_WORD, SUGGESTION_VALID_WORD -> adjustedKeyText
ACTION_KEY_ICON, TOOL_BAR_EXPAND_KEY -> Color.WHITE
}
override fun setColor(drawable: Drawable, color: ColorType) {
val colorStateList = when (color) {
BACKGROUND -> backgroundStateList
KEY_BACKGROUND -> keyStateList
FUNCTIONAL_KEY_BACKGROUND -> functionalKeyStateList
ACTION_KEY_BACKGROUND -> actionKeyStateList
SPACE_BAR_BACKGROUND -> spaceBarStateList
MORE_KEYS_BACKGROUND -> adjustedBackgroundStateList
SUGGESTION_BACKGROUND -> if (!hasKeyBorders && themeStyle == STYLE_MATERIAL) adjustedBackgroundStateList
else backgroundStateList
ACTION_KEY_MORE_KEYS_BACKGROUND -> if (themeStyle == STYLE_HOLO) adjustedBackgroundStateList
else actionKeyStateList
else -> null // use color filter
}
if (colorStateList == null) {
drawable.colorFilter = getColorFilter(color)
return
}
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.MULTIPLY)
DrawableCompat.setTintList(drawable, colorStateList)
}
override fun setColor(view: ImageView, color: ColorType) {
view.colorFilter = getColorFilter(color)
}
private fun getColorFilter(color: ColorType): ColorFilter? = when (color) {
EMOJI_CATEGORY_SELECTED, CLIPBOARD_PIN, SHIFT_KEY_ICON -> accentColorFilter
REMOVE_SUGGESTION_ICON, CLEAR_CLIPBOARD_HISTORY_KEY, EMOJI_CATEGORY, KEY_TEXT,
KEY_ICON, ONE_HANDED_MODE_BUTTON, TOOL_BAR_KEY, TOOL_BAR_EXPAND_KEY -> keyTextFilter
KEY_PREVIEW -> adjustedBackgroundFilter
ACTION_KEY_ICON -> actionKeyIconColorFilter
else -> colorFilter(get(color))
}
override fun selectAndColorDrawable(attr: TypedArray, color: ColorType): Drawable {
val drawable = when (color) {
KEY_BACKGROUND, BACKGROUND, SUGGESTION_BACKGROUND, ACTION_KEY_MORE_KEYS_BACKGROUND, MORE_KEYS_BACKGROUND ->
attr.getDrawable(R.styleable.KeyboardView_keyBackground)
FUNCTIONAL_KEY_BACKGROUND -> attr.getDrawable(R.styleable.KeyboardView_functionalKeyBackground)
SPACE_BAR_BACKGROUND -> {
if (hasKeyBorders) attr.getDrawable(R.styleable.KeyboardView_spacebarBackground)
else attr.getDrawable(R.styleable.KeyboardView_spacebarNoBorderBackground)
}
ACTION_KEY_BACKGROUND -> {
if (themeStyle == STYLE_HOLO && hasKeyBorders) // no borders has a very small pressed drawable otherwise
attr.getDrawable(R.styleable.KeyboardView_functionalKeyBackground)
else
attr.getDrawable(R.styleable.KeyboardView_keyBackground)
}
else -> null // keyBackground
}?.mutate() ?: attr.getDrawable(R.styleable.KeyboardView_keyBackground)?.mutate()!! // keyBackground always exists
setColor(drawable, color)
return drawable
}
override fun setBackground(view: View, color: ColorType) {
when (color) {
CLEAR_CLIPBOARD_HISTORY_KEY -> setColor(view.background, SUGGESTION_BACKGROUND)
EMOJI_CATEGORY_BACKGROUND -> view.setBackgroundColor(get(color))
KEY_PREVIEW -> view.background.colorFilter = adjustedBackgroundFilter
FUNCTIONAL_KEY_BACKGROUND, KEY_BACKGROUND, BACKGROUND, SPACE_BAR_BACKGROUND, SUGGESTION_BACKGROUND -> setColor(view.background, color)
MORE_SUGGESTIONS_BACKGROUND -> view.background.colorFilter = backgroundFilter
MORE_KEYS_BACKGROUND ->
if (themeStyle != STYLE_HOLO)
setColor(view.background, MORE_KEYS_BACKGROUND)
else view.background.colorFilter = adjustedBackgroundFilter
KEYBOARD_BACKGROUND -> view.setBackgroundColor(Color.TRANSPARENT)
EMOJI_BACKGROUND, CLIPBOARD_BACKGROUND, KEYBOARD_WRAPPER_BACKGROUND -> {
if (keyboardBackground != null) view.background = keyboardBackground
else view.background.colorFilter = backgroundFilter
}
else -> view.background.colorFilter = backgroundFilter
}
}
}
class DefaultColors (
override val themeStyle: String,
override val hasKeyBorders: Boolean,
private val accent: Int,
private val gesture: Int,
private val background: Int,
private val keyBackground: Int,
private val functionalKey: Int,
private val spaceBar: Int,
private val keyText: Int,
private val keyHintText: Int,
private val spaceBarText: Int
) : Colors {
private val navBar: Int
/** brightened or darkened variant of [background], to be used if exact background color would be
* bad contrast, e.g. more keys popup or no border space bar */
private val adjustedBackground: Int
/** further brightened or darkened variant of [adjustedBackground] */
private val doubleAdjustedBackground: Int
/** brightened or darkened variant of [keyText] */
private val adjustedKeyText: Int
private val backgroundFilter: ColorFilter
private val adjustedBackgroundFilter: ColorFilter
private val keyTextFilter: ColorFilter
private val accentColorFilter: ColorFilter = colorFilter(accent)
/** color filter for the white action key icons in material theme, switches to gray if necessary for contrast */
private val actionKeyIconColorFilter: ColorFilter?
private val backgroundStateList: ColorStateList
private val keyStateList: ColorStateList
private val functionalKeyStateList: ColorStateList
private val actionKeyStateList: ColorStateList
private val spaceBarStateList: ColorStateList
private val adjustedBackgroundStateList: ColorStateList
private val suggestionBackgroundList: ColorStateList
/** custom drawable used for keyboard background */
private val keyboardBackground: Drawable?
override fun haveColorsChanged(context: Context) = false
init {
if (themeStyle == STYLE_HOLO) {
val darkerBackground = adjustLuminosityAndKeepAlpha(background, -0.2f)
navBar = darkerBackground
keyboardBackground = GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf(background, darkerBackground))
} else {
navBar = background
keyboardBackground = null
}
backgroundFilter = colorFilter(background)
adjustedKeyText = brightenOrDarken(keyText, true)
if (isDarkColor(background)) { if (isDarkColor(background)) {
adjustedBackground = brighten(background) adjustedBackground = brighten(background)
doubleAdjustedBackground = brighten(adjustedBackground) doubleAdjustedBackground = brighten(adjustedBackground)
@ -104,9 +411,6 @@ class Colors (
adjustedBackgroundFilter = colorFilter(adjustedBackground) adjustedBackgroundFilter = colorFilter(adjustedBackground)
if (hasKeyBorders) { if (hasKeyBorders) {
// keyBackgroundFilter = colorFilter(keyBackground)
// functionalKeyBackgroundFilter = colorFilter(functionalKey)
// spaceBarFilter = colorFilter(spaceBar)
backgroundStateList = stateList(brightenOrDarken(background, true), background) backgroundStateList = stateList(brightenOrDarken(background, true), background)
keyStateList = if (themeStyle == STYLE_HOLO) stateList(keyBackground, keyBackground) keyStateList = if (themeStyle == STYLE_HOLO) stateList(keyBackground, keyBackground)
else stateList(brightenOrDarken(keyBackground, true), keyBackground) else stateList(brightenOrDarken(keyBackground, true), keyBackground)
@ -117,9 +421,6 @@ class Colors (
else stateList(brightenOrDarken(spaceBar, true), spaceBar) else stateList(brightenOrDarken(spaceBar, true), spaceBar)
} else { } else {
// need to set color to background if key borders are disabled, or there will be ugly keys // need to set color to background if key borders are disabled, or there will be ugly keys
// keyBackgroundFilter = backgroundFilter
// functionalKeyBackgroundFilter = keyBackgroundFilter
// spaceBarFilter = colorFilter(spaceBar)
backgroundStateList = stateList(brightenOrDarken(background, true), background) backgroundStateList = stateList(brightenOrDarken(background, true), background)
keyStateList = stateList(brightenOrDarken(background, true), Color.TRANSPARENT) keyStateList = stateList(brightenOrDarken(background, true), Color.TRANSPARENT)
functionalKeyStateList = keyStateList functionalKeyStateList = keyStateList
@ -136,60 +437,62 @@ class Colors (
} }
} }
/** set background colors including state list to the drawable */ override fun get(color: ColorType): Int = when (color) {
fun setBackgroundColor(background: Drawable, type: BackgroundType) { TOOL_BAR_KEY_ENABLED_BACKGROUND, EMOJI_CATEGORY_SELECTED, ACTION_KEY_BACKGROUND,
val colorStateList = when (type) { CLIPBOARD_PIN, SHIFT_KEY_ICON -> accent
BackgroundType.BACKGROUND -> backgroundStateList EMOJI_CATEGORY_BACKGROUND, GESTURE_PREVIEW, MORE_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW -> adjustedBackground
BackgroundType.KEY -> keyStateList TOOL_BAR_EXPAND_KEY_BACKGROUND -> doubleAdjustedBackground
BackgroundType.FUNCTIONAL -> functionalKeyStateList GESTURE_TRAIL -> gesture
BackgroundType.ACTION -> actionKeyStateList KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, CLEAR_CLIPBOARD_HISTORY_KEY,
BackgroundType.SPACE -> spaceBarStateList KEY_ICON, ONE_HANDED_MODE_BUTTON, EMOJI_CATEGORY, TOOL_BAR_KEY, TOOL_BAR_EXPAND_KEY -> keyText
BackgroundType.ADJUSTED_BACKGROUND -> adjustedBackgroundStateList KEY_HINT_TEXT -> keyHintText
BackgroundType.SUGGESTION -> if (!hasKeyBorders && themeStyle == STYLE_MATERIAL) SPACE_BAR_TEXT -> spaceBarText
adjustedBackgroundStateList FUNCTIONAL_KEY_BACKGROUND -> functionalKey
SPACE_BAR_BACKGROUND -> spaceBar
BACKGROUND, KEYBOARD_WRAPPER_BACKGROUND, CLIPBOARD_BACKGROUND, EMOJI_BACKGROUND, KEYBOARD_BACKGROUND -> background
KEY_BACKGROUND -> keyBackground
ACTION_KEY_MORE_KEYS_BACKGROUND -> if (themeStyle == STYLE_HOLO) adjustedBackground else accent
SUGGESTION_BACKGROUND -> if (!hasKeyBorders && themeStyle == STYLE_MATERIAL) adjustedBackground else background
NAVIGATION_BAR -> navBar
MORE_SUGGESTIONS_HINT, SUGGESTED_WORD, SUGGESTION_TYPED_WORD, SUGGESTION_VALID_WORD -> adjustedKeyText
ACTION_KEY_ICON -> Color.WHITE
}
override fun setColor(drawable: Drawable, color: ColorType) {
val colorStateList = when (color) {
BACKGROUND -> backgroundStateList
KEY_BACKGROUND -> keyStateList
FUNCTIONAL_KEY_BACKGROUND -> functionalKeyStateList
ACTION_KEY_BACKGROUND -> actionKeyStateList
SPACE_BAR_BACKGROUND -> spaceBarStateList
MORE_KEYS_BACKGROUND -> adjustedBackgroundStateList
SUGGESTION_BACKGROUND -> if (!hasKeyBorders && themeStyle == STYLE_MATERIAL) adjustedBackgroundStateList
else backgroundStateList else backgroundStateList
BackgroundType.ACTION_MORE_KEYS -> if (themeStyle == STYLE_HOLO) ACTION_KEY_MORE_KEYS_BACKGROUND -> if (themeStyle == STYLE_HOLO) adjustedBackgroundStateList
adjustedBackgroundStateList
else actionKeyStateList else actionKeyStateList
else -> null // use color filter
} }
DrawableCompat.setTintMode(background, PorterDuff.Mode.MULTIPLY) if (colorStateList == null) {
DrawableCompat.setTintList(background, colorStateList) drawable.colorFilter = getColorFilter(color)
return
}
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.MULTIPLY)
DrawableCompat.setTintList(drawable, colorStateList)
} }
// using !! for the color filter because null is only returned for unsupported blend modes, which are not used override fun setColor(view: ImageView, color: ColorType) {
private fun colorFilter(color: Int, mode: BlendModeCompat = BlendModeCompat.MODULATE): ColorFilter = view.colorFilter = getColorFilter(color)
BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, mode)!!
fun getDrawable(type: BackgroundType, attr: TypedArray): Drawable {
val drawable = when (type) {
BackgroundType.KEY, BackgroundType.ADJUSTED_BACKGROUND, BackgroundType.BACKGROUND,
BackgroundType.SUGGESTION, BackgroundType.ACTION_MORE_KEYS ->
attr.getDrawable(R.styleable.KeyboardView_keyBackground)
BackgroundType.FUNCTIONAL -> attr.getDrawable(R.styleable.KeyboardView_functionalKeyBackground)
BackgroundType.SPACE -> {
if (hasKeyBorders) attr.getDrawable(R.styleable.KeyboardView_spacebarBackground)
else attr.getDrawable(R.styleable.KeyboardView_spacebarNoBorderBackground)
}
BackgroundType.ACTION -> {
if (themeStyle == STYLE_HOLO && hasKeyBorders) // no borders has a very small pressed drawable otherwise
attr.getDrawable(R.styleable.KeyboardView_functionalKeyBackground)
else
attr.getDrawable(R.styleable.KeyboardView_keyBackground)
}
}?.mutate() ?: attr.getDrawable(R.styleable.KeyboardView_keyBackground)?.mutate()!! // keyBackground always exists
setBackgroundColor(drawable, type)
return drawable
} }
fun setKeyboardBackground(view: View) { override fun setBackground(view: View, color: ColorType) {
when (view) { when (color) {
is MoreSuggestionsView -> view.background.colorFilter = backgroundFilter CLEAR_CLIPBOARD_HISTORY_KEY -> setColor(view.background, SUGGESTION_BACKGROUND)
is MoreKeysKeyboardView -> view.background.colorFilter = adjustedBackgroundFilter EMOJI_CATEGORY_BACKGROUND -> view.setBackgroundColor(get(color))
is SuggestionStripView -> setBackgroundColor(view.background, BackgroundType.SUGGESTION) KEY_PREVIEW, MORE_KEYS_BACKGROUND -> view.background.colorFilter = adjustedBackgroundFilter
is EmojiPageKeyboardView, // to make EmojiPalettesView background visible, which does not scroll FUNCTIONAL_KEY_BACKGROUND, KEY_BACKGROUND, BACKGROUND, SPACE_BAR_BACKGROUND, SUGGESTION_BACKGROUND -> setColor(view.background, color)
is MainKeyboardView -> view.setBackgroundColor(Color.TRANSPARENT) // otherwise causes issues with wrapper view when using one-handed mode KEYBOARD_BACKGROUND -> view.setBackgroundColor(Color.TRANSPARENT)
is KeyboardWrapperView, is EmojiPalettesView, is ClipboardHistoryView -> { MORE_SUGGESTIONS_BACKGROUND -> view.background.colorFilter = backgroundFilter
EMOJI_BACKGROUND, CLIPBOARD_BACKGROUND, KEYBOARD_WRAPPER_BACKGROUND -> {
if (keyboardBackground != null) view.background = keyboardBackground if (keyboardBackground != null) view.background = keyboardBackground
else view.background.colorFilter = backgroundFilter else view.background.colorFilter = backgroundFilter
} }
@ -197,23 +500,86 @@ class Colors (
} }
} }
private fun getColorFilter(color: ColorType): ColorFilter? = when (color) {
EMOJI_CATEGORY_SELECTED, CLIPBOARD_PIN, SHIFT_KEY_ICON -> accentColorFilter
REMOVE_SUGGESTION_ICON, CLEAR_CLIPBOARD_HISTORY_KEY, EMOJI_CATEGORY, KEY_TEXT, KEY_ICON,
ONE_HANDED_MODE_BUTTON, TOOL_BAR_KEY, TOOL_BAR_EXPAND_KEY -> keyTextFilter
KEY_PREVIEW -> adjustedBackgroundFilter
ACTION_KEY_ICON -> actionKeyIconColorFilter
else -> colorFilter(get(color)) // create color filter (not great for performance, so the frequently used filters should be stored)
}
override fun selectAndColorDrawable(attr: TypedArray, color: ColorType): Drawable {
val drawable = when (color) {
KEY_BACKGROUND, BACKGROUND, SUGGESTION_BACKGROUND, ACTION_KEY_MORE_KEYS_BACKGROUND, MORE_KEYS_BACKGROUND ->
attr.getDrawable(R.styleable.KeyboardView_keyBackground)
FUNCTIONAL_KEY_BACKGROUND -> attr.getDrawable(R.styleable.KeyboardView_functionalKeyBackground)
SPACE_BAR_BACKGROUND -> {
if (hasKeyBorders) attr.getDrawable(R.styleable.KeyboardView_spacebarBackground)
else attr.getDrawable(R.styleable.KeyboardView_spacebarNoBorderBackground)
}
ACTION_KEY_BACKGROUND -> {
if (themeStyle == STYLE_HOLO && hasKeyBorders) // no borders has a very small pressed drawable otherwise
attr.getDrawable(R.styleable.KeyboardView_functionalKeyBackground)
else
attr.getDrawable(R.styleable.KeyboardView_keyBackground)
}
else -> null // keyBackground
}?.mutate() ?: attr.getDrawable(R.styleable.KeyboardView_keyBackground)?.mutate()!! // keyBackground always exists
setColor(drawable, color)
return drawable
}
} }
enum class BackgroundType { private fun colorFilter(color: Int, mode: BlendModeCompat = BlendModeCompat.MODULATE): ColorFilter {
/** generic background */ // using !! for the color filter because null is only returned for unsupported blend modes, which are not used
BACKGROUND, return BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, mode)!!
/** key background */ }
KEY,
/** functional key background */ private fun stateList(pressed: Int, normal: Int): ColorStateList {
FUNCTIONAL, val states = arrayOf(intArrayOf(android.R.attr.state_pressed), intArrayOf(-android.R.attr.state_pressed))
/** action key background */ return ColorStateList(states, intArrayOf(pressed, normal))
ACTION, }
/** action key more keys background */
ACTION_MORE_KEYS, enum class ColorType {
/** space bar background */ ACTION_KEY_ICON,
SPACE, ACTION_KEY_BACKGROUND,
/** background with some contrast to [BACKGROUND], based on adjustedBackground color */ ACTION_KEY_MORE_KEYS_BACKGROUND,
ADJUSTED_BACKGROUND, BACKGROUND,
/** background for suggestions and similar, transparent when not pressed */ CLEAR_CLIPBOARD_HISTORY_KEY,
SUGGESTION CLIPBOARD_PIN,
CLIPBOARD_BACKGROUND,
EMOJI_BACKGROUND,
EMOJI_CATEGORY,
EMOJI_CATEGORY_BACKGROUND,
EMOJI_CATEGORY_SELECTED,
FUNCTIONAL_KEY_BACKGROUND,
GESTURE_TRAIL,
GESTURE_PREVIEW,
KEY_BACKGROUND,
KEY_ICON,
KEY_TEXT,
KEY_HINT_TEXT,
KEY_PREVIEW,
KEYBOARD_BACKGROUND,
KEYBOARD_WRAPPER_BACKGROUND,
MORE_SUGGESTIONS_HINT,
MORE_SUGGESTIONS_BACKGROUND,
MORE_KEYS_BACKGROUND,
NAVIGATION_BAR,
SHIFT_KEY_ICON,
SPACE_BAR_BACKGROUND,
SPACE_BAR_TEXT,
ONE_HANDED_MODE_BUTTON,
REMOVE_SUGGESTION_ICON,
SUGGESTED_WORD,
SUGGESTION_AUTO_CORRECT,
SUGGESTION_BACKGROUND,
SUGGESTION_TYPED_WORD,
SUGGESTION_VALID_WORD,
TOOL_BAR_EXPAND_KEY,
TOOL_BAR_EXPAND_KEY_BACKGROUND,
TOOL_BAR_KEY,
TOOL_BAR_KEY_ENABLED_BACKGROUND,
} }

View file

@ -42,6 +42,7 @@ import org.dslul.openboard.inputmethod.latin.PunctuationSuggestions;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.SuggestedWords; import org.dslul.openboard.inputmethod.latin.SuggestedWords;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues; import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
@ -121,10 +122,11 @@ final class SuggestionStripLayoutHelper {
R.styleable.SuggestionStripView_alphaObsoleted, 1.0f); R.styleable.SuggestionStripView_alphaObsoleted, 1.0f);
final Colors colors = Settings.getInstance().getCurrent().mColors; final Colors colors = Settings.getInstance().getCurrent().mColors;
mColorValidTypedWord = colors.getAdjustedKeyText(); //a.getColor(R.styleable.SuggestionStripView_colorValidTypedWord, 0); mColorValidTypedWord = colors.get(ColorType.SUGGESTION_VALID_WORD); //a.getColor(R.styleable.SuggestionStripView_colorValidTypedWord, 0);
mColorTypedWord = colors.getAdjustedKeyText(); //a.getColor(R.styleable.SuggestionStripView_colorTypedWord, 0); mColorTypedWord = colors.get(ColorType.SUGGESTION_TYPED_WORD); //a.getColor(R.styleable.SuggestionStripView_colorTypedWord, 0);
mColorAutoCorrect = colors.getKeyText(); //a.getColor(R.styleable.SuggestionStripView_colorAutoCorrect, 0); mColorAutoCorrect = colors.get(ColorType.SUGGESTION_AUTO_CORRECT); //a.getColor(R.styleable.SuggestionStripView_colorAutoCorrect, 0);
mColorSuggested = colors.getAdjustedKeyText(); //a.getColor(R.styleable.SuggestionStripView_colorSuggested, 0); mColorSuggested = colors.get(ColorType.SUGGESTED_WORD); //a.getColor(R.styleable.SuggestionStripView_colorSuggested, 0);
final int colorMoreSuggestionsHint = colors.get(ColorType.MORE_SUGGESTIONS_HINT);
mSuggestionsCountInStrip = a.getInt( mSuggestionsCountInStrip = a.getInt(
R.styleable.SuggestionStripView_suggestionsCountInStrip, R.styleable.SuggestionStripView_suggestionsCountInStrip,
@ -141,7 +143,7 @@ final class SuggestionStripLayoutHelper {
mMoreSuggestionsHint = getMoreSuggestionsHint(res, mMoreSuggestionsHint = getMoreSuggestionsHint(res,
res.getDimension(R.dimen.config_more_suggestions_hint_text_size), res.getDimension(R.dimen.config_more_suggestions_hint_text_size),
mColorAutoCorrect); colorMoreSuggestionsHint);
mCenterPositionInStrip = mSuggestionsCountInStrip / 2; mCenterPositionInStrip = mSuggestionsCountInStrip / 2;
// Assuming there are at least three suggestions. Also, note that the suggestions are // Assuming there are at least three suggestions. Also, note that the suggestions are
// laid out according to script direction, so this is left of the center for LTR scripts // laid out according to script direction, so this is left of the center for LTR scripts

View file

@ -45,7 +45,7 @@ import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.SuggestedWords; import org.dslul.openboard.inputmethod.latin.SuggestedWords;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.BackgroundType; import org.dslul.openboard.inputmethod.latin.common.ColorType;
import org.dslul.openboard.inputmethod.latin.common.Colors; import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags; import org.dslul.openboard.inputmethod.latin.define.DebugFlags;
@ -176,12 +176,12 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
word.setContentDescription(getResources().getString(R.string.spoken_empty_suggestion)); word.setContentDescription(getResources().getString(R.string.spoken_empty_suggestion));
word.setOnClickListener(this); word.setOnClickListener(this);
word.setOnLongClickListener(this); word.setOnLongClickListener(this);
colors.setBackgroundColor(word.getBackground(), BackgroundType.SUGGESTION); colors.setBackground(word, ColorType.SUGGESTION_BACKGROUND);
mWordViews.add(word); mWordViews.add(word);
final View divider = inflater.inflate(R.layout.suggestion_divider, null); final View divider = inflater.inflate(R.layout.suggestion_divider, null);
mDividerViews.add(divider); mDividerViews.add(divider);
final TextView info = new TextView(context, null, R.attr.suggestionWordStyle); final TextView info = new TextView(context, null, R.attr.suggestionWordStyle);
info.setTextColor(colors.getKeyText()); info.setTextColor(colors.get(ColorType.KEY_TEXT));
info.setTextSize(TypedValue.COMPLEX_UNIT_DIP, DEBUG_INFO_TEXT_SIZE_IN_DIP); info.setTextSize(TypedValue.COMPLEX_UNIT_DIP, DEBUG_INFO_TEXT_SIZE_IN_DIP);
mDebugInfoViews.add(info); mDebugInfoViews.add(info);
} }
@ -216,17 +216,17 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
final int toolbarHeight = Math.min(mToolbarKey.getLayoutParams().height, (int) getResources().getDimension(R.dimen.config_suggestions_strip_height)); final int toolbarHeight = Math.min(mToolbarKey.getLayoutParams().height, (int) getResources().getDimension(R.dimen.config_suggestions_strip_height));
mToolbarKey.getLayoutParams().height = toolbarHeight; mToolbarKey.getLayoutParams().height = toolbarHeight;
mToolbarKey.getLayoutParams().width = toolbarHeight; // we want it square mToolbarKey.getLayoutParams().width = toolbarHeight; // we want it square
colors.setBackground(mToolbarKey, ColorType.SUGGESTION_BACKGROUND);
mDefaultBackground = mToolbarKey.getBackground(); mDefaultBackground = mToolbarKey.getBackground();
colors.setBackgroundColor(mDefaultBackground, BackgroundType.SUGGESTION); mEnabledToolKeyBackground.setColors(new int[] {colors.get(ColorType.TOOL_BAR_KEY_ENABLED_BACKGROUND) | 0xFF000000, Color.TRANSPARENT}); // ignore alpha on accent color
mEnabledToolKeyBackground.setColors(new int[] {colors.getAccent() | 0xFF000000, Color.TRANSPARENT}); // ignore alpha on accent color
mEnabledToolKeyBackground.setGradientType(GradientDrawable.RADIAL_GRADIENT); mEnabledToolKeyBackground.setGradientType(GradientDrawable.RADIAL_GRADIENT);
mEnabledToolKeyBackground.setGradientRadius(mToolbarKey.getLayoutParams().height / 2f); // nothing else has a usable height at this state mEnabledToolKeyBackground.setGradientRadius(mToolbarKey.getLayoutParams().height / 2f); // nothing else has a usable height at this state
mToolbarKey.setOnClickListener(this); mToolbarKey.setOnClickListener(this);
mToolbarKey.setImageDrawable(Settings.getInstance().getCurrent().mIncognitoModeEnabled ? mIncognitoIcon : mToolbarArrowIcon); mToolbarKey.setImageDrawable(Settings.getInstance().getCurrent().mIncognitoModeEnabled ? mIncognitoIcon : mToolbarArrowIcon);
mToolbarKey.setColorFilter(colors.getKeyTextFilter()); // maybe different color? colors.setColor(mToolbarKey, ColorType.TOOL_BAR_EXPAND_KEY);
mToolbarKey.setBackground(new ShapeDrawable(new OvalShape())); // ShapeDrawable color is black, need src_atop filter mToolbarKey.setBackground(new ShapeDrawable(new OvalShape())); // ShapeDrawable color is black, need src_atop filter
mToolbarKey.getBackground().setColorFilter(colors.getDoubleAdjustedBackground(), PorterDuff.Mode.SRC_ATOP); mToolbarKey.getBackground().setColorFilter(colors.get(ColorType.TOOL_BAR_EXPAND_KEY_BACKGROUND), PorterDuff.Mode.SRC_ATOP);
mToolbarKey.getLayoutParams().height *= 0.82; // shrink the whole key a little (drawable not affected) mToolbarKey.getLayoutParams().height *= 0.82; // shrink the whole key a little (drawable not affected)
mToolbarKey.getLayoutParams().width *= 0.82; mToolbarKey.getLayoutParams().width *= 0.82;
@ -238,7 +238,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
addKeyToPinnedKeys(pinnedKey, inflater); addKeyToPinnedKeys(pinnedKey, inflater);
} }
colors.setKeyboardBackground(this); colors.setBackground(this, ColorType.SUGGESTION_BACKGROUND);
} }
/** /**
@ -394,7 +394,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
@SuppressLint("ClickableViewAccessibility") // no need for View#performClick, we return false mostly anyway @SuppressLint("ClickableViewAccessibility") // no need for View#performClick, we return false mostly anyway
private boolean onLongClickSuggestion(final TextView wordView) { private boolean onLongClickSuggestion(final TextView wordView) {
final Drawable icon = mBinIcon; final Drawable icon = mBinIcon;
icon.setColorFilter(Settings.getInstance().getCurrent().mColors.getKeyTextFilter()); Settings.getInstance().getCurrent().mColors.setColor(icon, ColorType.REMOVE_SUGGESTION_ICON);
int w = icon.getIntrinsicWidth(); int w = icon.getIntrinsicWidth();
int h = icon.getIntrinsicWidth(); int h = icon.getIntrinsicWidth();
wordView.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); wordView.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
@ -719,8 +719,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
private void setupKey(final ImageButton view, final Colors colors) { private void setupKey(final ImageButton view, final Colors colors) {
view.setOnClickListener(this); view.setOnClickListener(this);
view.setOnLongClickListener(this); view.setOnLongClickListener(this);
view.setColorFilter(colors.getKeyTextFilter()); colors.setColor(view, ColorType.TOOL_BAR_KEY);
colors.setBackgroundColor(view.getBackground(), BackgroundType.SUGGESTION); colors.setBackground(view, ColorType.SUGGESTION_BACKGROUND);
} }
private static int getKeyLayoutIdForTag(final String tag) { private static int getKeyLayoutIdForTag(final String tag) {

View file

@ -5,8 +5,6 @@ package org.dslul.openboard.inputmethod.latin.utils
import android.graphics.Color import android.graphics.Color
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import kotlin.math.max
import kotlin.math.min
fun isBrightColor(@ColorInt color: Int) = fun isBrightColor(@ColorInt color: Int) =
if (android.R.color.transparent == color) true if (android.R.color.transparent == color) true

View file

@ -222,6 +222,7 @@ Nouveau dictionnaire:
<string name="theme_name_dark">Sombre</string> <string name="theme_name_dark">Sombre</string>
<string name="theme_name_darker">Noir</string> <string name="theme_name_darker">Noir</string>
<string name="theme_name_black">Amoled</string> <string name="theme_name_black">Amoled</string>
<string name="theme_name_dynamic">Couleurs dynamiques</string>
<string name="theme_name_user">Personnalisé</string> <string name="theme_name_user">Personnalisé</string>
<string name="theme_name_user_night">Personnalisé (mode nuit)</string> <string name="theme_name_user_night">Personnalisé (mode nuit)</string>
<string name="select_user_colors">Personnaliser le thème</string> <string name="select_user_colors">Personnaliser le thème</string>

View file

@ -620,6 +620,8 @@ New dictionary:
<string name="theme_name_darker" tools:keep="@string/theme_name_darker">Darker</string> <string name="theme_name_darker" tools:keep="@string/theme_name_darker">Darker</string>
<!-- Theme name for black theme (based on old amoled black) --> <!-- Theme name for black theme (based on old amoled black) -->
<string name="theme_name_black" tools:keep="@string/theme_name_black">Black</string> <string name="theme_name_black" tools:keep="@string/theme_name_black">Black</string>
<!-- Theme name for dynamic colors light theme -->
<string name="theme_name_dynamic" tools:keep="@string/theme_name_dynamic">Dynamic colors</string>
<!-- Theme name for user-defined theme --> <!-- Theme name for user-defined theme -->
<string name="theme_name_user" tools:keep="@string/theme_name_user">User-Defined</string> <string name="theme_name_user" tools:keep="@string/theme_name_user">User-Defined</string>
<!-- Theme name for user-defined theme night mode theme --> <!-- Theme name for user-defined theme night mode theme -->