convert Colors to kotlin, move some theme-dependent logic inside colors

This commit is contained in:
Helium314 2023-09-06 12:15:22 +02:00
parent a0d37dc3ab
commit efffc02fed
21 changed files with 254 additions and 312 deletions

View file

@ -567,9 +567,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
isHardwareAcceleratedDrawingEnabled); isHardwareAcceleratedDrawingEnabled);
mClipboardHistoryView.setKeyboardActionListener(mLatinIME); mClipboardHistoryView.setKeyboardActionListener(mLatinIME);
// set background color here, otherwise there is a narrow white line between keyboard and suggestion strip
mKeyboardViewWrapper.getBackground().setColorFilter(Settings.getInstance().getCurrent().mColors.backgroundFilter);
return mCurrentInputView; return mCurrentInputView;
} }

View file

@ -214,6 +214,7 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
// todo (later): material you, system accent, ... // todo (later): material you, system accent, ...
public static Colors getThemeColors(final String themeColors, final String themeStyle, final Context context, final SharedPreferences prefs) { public static Colors getThemeColors(final String themeColors, final String themeStyle, final Context context, final SharedPreferences prefs) {
final boolean hasBorders = prefs.getBoolean(Settings.PREF_THEME_KEY_BORDERS, false);
switch (themeColors) { switch (themeColors) {
case THEME_USER: case THEME_USER:
final int accent = prefs.getInt(Settings.PREF_THEME_USER_COLOR_ACCENT, Color.BLUE); final int accent = prefs.getInt(Settings.PREF_THEME_USER_COLOR_ACCENT, Color.BLUE);
@ -221,17 +222,18 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
final int keyTextColor = prefs.getInt(Settings.PREF_THEME_USER_COLOR_TEXT, Color.WHITE); 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 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); final int background = prefs.getInt(Settings.PREF_THEME_USER_COLOR_BACKGROUND, Color.DKGRAY);
return Colors.newColors(themeStyle, accent, background, keyBgColor, ColorUtilKt.brightenOrDarken(keyBgColor, true), keyBgColor, keyTextColor, hintTextColor); return new Colors(themeStyle, hasBorders, accent, background, keyBgColor, ColorUtilKt.brightenOrDarken(keyBgColor, true), keyBgColor, keyTextColor, hintTextColor);
case THEME_USER_DARK: case THEME_USER_DARK:
final int accent2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_ACCENT, Color.BLUE); final int accent2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_ACCENT, Color.BLUE);
final int keyBgColor2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_KEYS, Color.LTGRAY); final int keyBgColor2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_KEYS, Color.LTGRAY);
final int keyTextColor2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_TEXT, Color.WHITE); final int keyTextColor2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_TEXT, Color.WHITE);
final int hintTextColor2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_HINT_TEXT, Color.WHITE); final int hintTextColor2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_HINT_TEXT, Color.WHITE);
final int background2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_BACKGROUND, Color.DKGRAY); final int background2 = prefs.getInt(Settings.PREF_THEME_USER_DARK_COLOR_BACKGROUND, Color.DKGRAY);
return Colors.newColors(themeStyle, accent2, background2, keyBgColor2, ColorUtilKt.brightenOrDarken(keyBgColor2, true), keyBgColor2, keyTextColor2, hintTextColor2); return new Colors(themeStyle, hasBorders, accent2, background2, keyBgColor2, ColorUtilKt.brightenOrDarken(keyBgColor2, true), keyBgColor2, keyTextColor2, hintTextColor2);
case THEME_DARK: case THEME_DARK:
return Colors.newColors( return new Colors(
themeStyle, themeStyle,
hasBorders,
ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark),
// colors taken from the drawable // colors taken from the drawable
Color.parseColor("#263238"), Color.parseColor("#263238"),
@ -242,8 +244,9 @@ 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)
); );
case THEME_HOLO_WHITE: case THEME_HOLO_WHITE:
return Colors.newColors( return new Colors(
themeStyle, themeStyle,
hasBorders,
Color.parseColor("#FFFFFF"), Color.parseColor("#FFFFFF"),
// colors taken from the drawable // colors taken from the drawable
Color.parseColor("#282828"), Color.parseColor("#282828"),
@ -254,8 +257,9 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
Color.parseColor("#282828") Color.parseColor("#282828")
); );
case THEME_DARKER: case THEME_DARKER:
return Colors.newColors( return new Colors(
themeStyle, themeStyle,
hasBorders,
ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), 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.keyboard_background_lxx_dark_border),
ContextCompat.getColor(context, R.color.key_background_normal_lxx_dark_border), ContextCompat.getColor(context, R.color.key_background_normal_lxx_dark_border),
@ -265,8 +269,9 @@ 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)
); );
case THEME_BLACK: case THEME_BLACK:
return Colors.newColors( return new Colors(
themeStyle, themeStyle,
hasBorders,
ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_dark), 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_black),
ContextCompat.getColor(context, R.color.background_amoled_dark), ContextCompat.getColor(context, R.color.background_amoled_dark),
@ -277,8 +282,9 @@ public final class KeyboardTheme implements Comparable<KeyboardTheme> {
); );
case THEME_LIGHT: case THEME_LIGHT:
default: default:
return Colors.newColors( return new Colors(
themeStyle, themeStyle,
hasBorders,
ContextCompat.getColor(context, R.color.gesture_trail_color_lxx_light), 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.keyboard_background_lxx_light_border),
ContextCompat.getColor(context, R.color.key_background_normal_lxx_light_border), ContextCompat.getColor(context, R.color.key_background_normal_lxx_light_border),

View file

@ -39,9 +39,9 @@ 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.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.HoloColors;
import org.dslul.openboard.inputmethod.latin.settings.Settings; import org.dslul.openboard.inputmethod.latin.settings.Settings;
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;
@ -141,20 +141,19 @@ 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);
mKeyBackground = keyboardViewAttr.getDrawable(R.styleable.KeyboardView_keyBackground).mutate(); if (this instanceof EmojiPageKeyboardView || this instanceof MoreSuggestionsView)
mKeyBackground.getPadding(mKeyBackgroundPadding); mKeyBackground = mColors.getDrawable(BackgroundType.BACKGROUND, keyboardViewAttr);
final Drawable functionalKeyBackground = keyboardViewAttr.getDrawable( else if (this instanceof MoreKeysKeyboardView)
R.styleable.KeyboardView_functionalKeyBackground); mKeyBackground = mColors.getDrawable(BackgroundType.ADJUSTED_BACKGROUND, keyboardViewAttr);
mFunctionalKeyBackground = (functionalKeyBackground != null) ? functionalKeyBackground.mutate()
: keyboardViewAttr.getDrawable(R.styleable.KeyboardView_keyBackground).mutate();
final Drawable spacebarBackground = keyboardViewAttr.getDrawable(
R.styleable.KeyboardView_spacebarBackground);
mSpacebarBackground = (spacebarBackground != null) ? spacebarBackground.mutate()
: keyboardViewAttr.getDrawable(R.styleable.KeyboardView_keyBackground).mutate();
if (mColors instanceof HoloColors) // todo: this logic should be in Colors, not here
mActionKeyBackground = mFunctionalKeyBackground;
else else
mActionKeyBackground = keyboardViewAttr.getDrawable(R.styleable.KeyboardView_keyBackground).mutate(); mKeyBackground = mColors.getDrawable(BackgroundType.KEY, keyboardViewAttr);
mKeyBackground.getPadding(mKeyBackgroundPadding);
mFunctionalKeyBackground = mColors.getDrawable(BackgroundType.FUNCTIONAL, keyboardViewAttr);
mSpacebarBackground = mColors.getDrawable(BackgroundType.SPACE, keyboardViewAttr);
if (this instanceof MoreKeysKeyboardView && mColors.getThemeStyle().equals(KeyboardTheme.THEME_STYLE_HOLO)) // todo: this logic should be in Colors
mActionKeyBackground = mColors.getDrawable(BackgroundType.ADJUSTED_BACKGROUND, keyboardViewAttr);
else
mActionKeyBackground = mColors.getDrawable(BackgroundType.ACTION, keyboardViewAttr);
mSpacebarIconWidthRatio = keyboardViewAttr.getFloat( mSpacebarIconWidthRatio = keyboardViewAttr.getFloat(
R.styleable.KeyboardView_spacebarIconWidthRatio, 1.0f); R.styleable.KeyboardView_spacebarIconWidthRatio, 1.0f);
@ -179,31 +178,7 @@ public class KeyboardView extends View {
keyAttr.recycle(); keyAttr.recycle();
mPaint.setAntiAlias(true); mPaint.setAntiAlias(true);
mColors.setKeyboardBackground(this);
if (this instanceof EmojiPageKeyboardView || this instanceof MoreSuggestionsView) {
mColors.setBackgroundColor(mKeyBackground, Colors.TYPE_BACKGROUND);
} else if (this instanceof MoreKeysKeyboardView) {
mColors.setBackgroundColor(mKeyBackground, Colors.TYPE_ADJUSTED_BACKGROUND);
} else {
mColors.setBackgroundColor(mKeyBackground, Colors.TYPE_KEY);
}
mColors.setBackgroundColor(mActionKeyBackground, Colors.TYPE_ACTION);
mColors.setBackgroundColor(mSpacebarBackground, Colors.TYPE_SPACE);
if (this instanceof MoreKeysKeyboardView)
mColors.setBackgroundColor(mFunctionalKeyBackground, Colors.TYPE_ADJUSTED_BACKGROUND);
else
mColors.setBackgroundColor(mFunctionalKeyBackground, Colors.TYPE_FUNCTIONAL);
if (this.getClass() == MoreKeysKeyboardView.class)
getBackground().setColorFilter(mColors.adjustedBackgroundFilter);
else {
// todo: this should only be applied to specific keyboards, check original version for which one
// and actually this again is something that maybe should be done in Colors
final Drawable keyboardBackground = mColors.getKeyboardBackground();
if (!(this instanceof MoreSuggestionsView) && keyboardBackground != null)
setBackground(keyboardBackground);
else
getBackground().setColorFilter(mColors.backgroundFilter);
}
} }
@Nullable @Nullable
@ -623,8 +598,8 @@ 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() && !(mColors instanceof HoloColors)) { // todo: this logic should not be here if (key.isAccentColored() && !(mColors.getThemeStyle().equals(KeyboardTheme.THEME_STYLE_HOLO))) { // todo: this logic should not be here
icon.setColorFilter(mColors.actionKeyIconColorFilter); icon.setColorFilter(mColors.getActionKeyIconColorFilter());
} else if (key.isShift() && keyboard != null) { } else if (key.isShift() && keyboard != null) {
// todo (idea): replace shift icon with white one and use the normal multiply filters // todo (idea): replace shift icon with white one and use the normal multiply filters
// this could allow different shift icon with nicer coloring // this could allow different shift icon with nicer coloring
@ -633,14 +608,14 @@ public class KeyboardView extends View {
|| 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.accent, PorterDuff.Mode.SRC_ATOP); // accent if shifted, needs SRC_ATOP because of underlying drawable icon.setColorFilter(mColors.getAccent(), PorterDuff.Mode.SRC_ATOP); // accent if shifted, needs SRC_ATOP because of underlying drawable
else else
icon.setColorFilter(mColors.keyTextFilter); // key text if not shifted icon.setColorFilter(mColors.getKeyTextFilter()); // key text if not shifted
} else if (key.getBackgroundType() != Key.BACKGROUND_TYPE_NORMAL) { } else if (key.getBackgroundType() != Key.BACKGROUND_TYPE_NORMAL) {
icon.setColorFilter(mColors.keyTextFilter); icon.setColorFilter(mColors.getKeyTextFilter());
} 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.keyTextFilter); icon.setColorFilter(mColors.getKeyTextFilter());
} }
} }

View file

@ -58,7 +58,6 @@ import org.dslul.openboard.inputmethod.latin.SuggestedWords;
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;
import org.dslul.openboard.inputmethod.latin.common.HoloColors;
import org.dslul.openboard.inputmethod.latin.settings.DebugSettings; import org.dslul.openboard.inputmethod.latin.settings.DebugSettings;
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;
@ -219,10 +218,10 @@ 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;
if (colors instanceof HoloColors) // todo: this logic should be in Colors if (colors.getThemeStyle().equals(KeyboardTheme.THEME_STYLE_HOLO)) // todo: this logic should be in Colors
mLanguageOnSpacebarTextColor = colors.keyText; mLanguageOnSpacebarTextColor = colors.getKeyText();
else else
mLanguageOnSpacebarTextColor = colors.keyHintText; //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_languageOnSpacebarTextColor, 0); mLanguageOnSpacebarTextColor = colors.getKeyHintText(); //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_languageOnSpacebarTextColor, 0);
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

@ -9,11 +9,11 @@ import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme
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.Colors import org.dslul.openboard.inputmethod.latin.common.BackgroundType
import org.dslul.openboard.inputmethod.latin.common.HoloColors
import org.dslul.openboard.inputmethod.latin.settings.Settings import org.dslul.openboard.inputmethod.latin.settings.Settings
class ClipboardAdapter( class ClipboardAdapter(
@ -56,7 +56,7 @@ class ClipboardAdapter(
setOnTouchListener(this@ViewHolder) setOnTouchListener(this@ViewHolder)
setOnLongClickListener(this@ViewHolder) setOnLongClickListener(this@ViewHolder)
setBackgroundResource(itemBackgroundId) setBackgroundResource(itemBackgroundId)
Settings.getInstance().current.mColors.setBackgroundColor(background, Colors.TYPE_KEY) Settings.getInstance().current.mColors.setBackgroundColor(background, BackgroundType.KEY)
} }
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
@ -69,7 +69,7 @@ class ClipboardAdapter(
} }
clipboardLayoutParams.setItemProperties(view) clipboardLayoutParams.setItemProperties(view)
val colors = Settings.getInstance().current.mColors val colors = Settings.getInstance().current.mColors
if (colors is HoloColors) // todo: this logic should be in Colors, not here if (colors.themeStyle == KeyboardTheme.THEME_STYLE_HOLO) // todo: this logic should be in Colors, not here
pinnedIconView.colorFilter = colors.accentColorFilter pinnedIconView.colorFilter = colors.accentColorFilter
} }

View file

@ -63,7 +63,7 @@ class ClipboardHistoryRecyclerView @JvmOverloads constructor(
init { init {
paint.color = dividerColor paint.color = dividerColor
paint.strokeWidth = dividerHeight.toFloat() paint.strokeWidth = dividerHeight.toFloat()
paint.colorFilter = Settings.getInstance().current.mColors.backgroundFilter paint.colorFilter = Settings.getInstance().current.mColors.getThatBackgroundFilter()
} }
override fun onDrawOver(canvas: Canvas, parent: RecyclerView, state: State) { override fun onDrawOver(canvas: Canvas, parent: RecyclerView, state: State) {

View file

@ -1,6 +1,7 @@
package org.dslul.openboard.inputmethod.keyboard.clipboard package org.dslul.openboard.inputmethod.keyboard.clipboard
import android.content.Context import android.content.Context
import android.graphics.Color
import android.util.AttributeSet import android.util.AttributeSet
import android.util.TypedValue import android.util.TypedValue
import android.view.MotionEvent import android.view.MotionEvent
@ -16,7 +17,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.Colors import org.dslul.openboard.inputmethod.latin.common.BackgroundType
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
@ -48,8 +49,8 @@ class ClipboardHistoryView @JvmOverloads constructor(
R.styleable.ClipboardHistoryView, defStyle, R.style.ClipboardHistoryView) R.styleable.ClipboardHistoryView, defStyle, R.style.ClipboardHistoryView)
pinIconId = clipboardViewAttr.getResourceId( pinIconId = clipboardViewAttr.getResourceId(
R.styleable.ClipboardHistoryView_iconPinnedClip, 0) R.styleable.ClipboardHistoryView_iconPinnedClip, 0)
dividerColor = clipboardViewAttr.getColor( // todo: remove the divider completely?
R.styleable.ClipboardHistoryView_dividerBackground, 0) dividerColor = Color.TRANSPARENT //clipboardViewAttr.getColor(R.styleable.ClipboardHistoryView_dividerBackground, 0)
clipboardViewAttr.recycle() clipboardViewAttr.recycle()
val keyboardViewAttr = context.obtainStyledAttributes(attrs, val keyboardViewAttr = context.obtainStyledAttributes(attrs,
R.styleable.KeyboardView, defStyle, R.style.KeyboardView) R.styleable.KeyboardView, defStyle, R.style.KeyboardView)
@ -74,6 +75,8 @@ class ClipboardHistoryView @JvmOverloads constructor(
override fun onFinishInflate() { override fun onFinishInflate() {
super.onFinishInflate() super.onFinishInflate()
val colors = Settings.getInstance().current.mColors
colors.setKeyboardBackground(this)
clipboardAdapter = ClipboardAdapter(clipboardLayoutParams, this).apply { clipboardAdapter = ClipboardAdapter(clipboardLayoutParams, this).apply {
itemBackgroundId = keyBackgroundId itemBackgroundId = keyBackgroundId
pinnedIconResId = pinIconId pinnedIconResId = pinIconId
@ -100,21 +103,15 @@ 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
} }
val colors = Settings.getInstance().current.mColors
clearKey.colorFilter = colors.keyTextFilter
val colorBackground = colors.keyboardBackground
if (colorBackground != null)
background = colorBackground
else
background.colorFilter = colors.backgroundFilter
} }
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, Colors.TYPE_FUNCTIONAL) Settings.getInstance().current.mColors.setBackgroundColor(this.background, BackgroundType.FUNCTIONAL)
setTextColor(params.mFunctionalTextColor) setTextColor(params.mFunctionalTextColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mLabelSize.toFloat()) setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mLabelSize.toFloat())
} }

View file

@ -19,7 +19,6 @@ package org.dslul.openboard.inputmethod.keyboard.emoji;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -47,6 +46,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.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;
@ -133,7 +133,7 @@ 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.adjustedBackground; //emojiPalettesViewAttr.getColor(R.styleable.EmojiPalettesView_categoryPageIndicatorBackground, 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);
@ -161,9 +161,7 @@ public final class EmojiPalettesView extends LinearLayout
// TODO: Replace background color with its own setting rather than using the // TODO: Replace background color with its own setting rather than using the
// category page indicator background as a workaround. // category page indicator background as a workaround.
iconView.setBackgroundColor(mCategoryPageIndicatorBackground); iconView.setBackgroundColor(mCategoryPageIndicatorBackground);
// todo: this doesn't get applied for holo, what could cause this? iconView.setColorFilter(Settings.getInstance().getCurrent().mColors.getKeyTextFilter());
// very interesting: in onTabChanged it's applied
iconView.setColorFilter(Settings.getInstance().getCurrent().mColors.keyTextFilter);
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);
@ -190,7 +188,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.accent); tabWidget.setBackgroundColor(colors.getAccent());
} }
mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this); mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this);
@ -272,15 +270,11 @@ 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(), Colors.TYPE_FUNCTIONAL); colors.setBackgroundColor(mAlphabetKeyLeft.getBackground(), BackgroundType.FUNCTIONAL);
colors.setBackgroundColor(mDeleteKey.getBackground(), Colors.TYPE_FUNCTIONAL); colors.setBackgroundColor(mDeleteKey.getBackground(), BackgroundType.FUNCTIONAL);
colors.setBackgroundColor(mSpacebar.getBackground(), Colors.TYPE_SPACE); colors.setBackgroundColor(mSpacebar.getBackground(), BackgroundType.SPACE);
final Drawable background = colors.getKeyboardBackground(); colors.setBackgroundColor(getBackground(), BackgroundType.BACKGROUND); // only set color, not drawable (issues in keyboardWrapper otherwise)
if (background != null) mEmojiCategoryPageIndicatorView.setColors(colors.getAccent(), colors.getAdjustedBackground());
setBackground(background);
else
getBackground().setColorFilter(colors.backgroundFilter);
mEmojiCategoryPageIndicatorView.setColors(colors.accent, colors.adjustedBackground);
} }
@Override @Override
@ -302,10 +296,10 @@ public final class EmojiPalettesView extends LinearLayout
} }
final Colors colors = Settings.getInstance().getCurrent().mColors; final Colors colors = Settings.getInstance().getCurrent().mColors;
if (mCurrentTab != null) if (mCurrentTab != null)
mCurrentTab.setColorFilter(colors.keyTextFilter); mCurrentTab.setColorFilter(colors.getKeyTextFilter());
mCurrentTab = (ImageView) mTabHost.getCurrentTabView(); mCurrentTab = (ImageView) mTabHost.getCurrentTabView();
// mCurrentTab.setColorFilter(colors.accentColorFilter); // todo (later): doesn't work properly, because enabled drawable is blue -> adjust // mCurrentTab.setColorFilter(colors.accentColorFilter); // todo (later): doesn't work properly, because enabled drawable is blue -> adjust
mCurrentTab.setColorFilter(colors.accent); mCurrentTab.setColorFilter(colors.getAccent());
} }
/** /**

View file

@ -65,10 +65,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.keyText; //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureFloatingPreviewTextColor, 0); mGesturePreviewTextColor = colors.getKeyText(); //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.adjustedBackground; //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureFloatingPreviewColor, 0); mGesturePreviewColor = colors.getAdjustedBackground(); //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

@ -52,7 +52,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.accent; //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureTrailColor, 0); mTrailColor = Settings.getInstance().getCurrent().mColors.getAccent(); //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

@ -118,7 +118,7 @@ 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.adjustedBackgroundFilter); keyPreviewView.getBackground().setColorFilter(colors.getAdjustedBackgroundFilter());
// 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

@ -128,19 +128,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.keyText; //keyAttr.getColor(R.styleable.Keyboard_Key_keyTextColor, 0); mTextColor = colors.getKeyText(); //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.keyText; //keyAttr.getColor(R.styleable.Keyboard_Key_functionalTextColor, 0); mFunctionalTextColor = colors.getKeyText(); //keyAttr.getColor(R.styleable.Keyboard_Key_functionalTextColor, 0);
mHintLetterColor = colors.keyHintText; //keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLetterColor, 0); mHintLetterColor = colors.getKeyHintText(); //keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLetterColor, 0);
mHintLabelColor = colors.keyText; //keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLabelColor, 0); mHintLabelColor = colors.getKeyText(); //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.keyText; //keyAttr.getColor(R.styleable.Keyboard_Key_keyPreviewTextColor, 0); mPreviewTextColor = colors.getKeyText(); //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

@ -46,7 +46,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.accent; //mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_slidingKeyInputPreviewColor, 0); final int previewColor = Settings.getInstance().getCurrent().mColors.getAccent(); //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

@ -2,13 +2,14 @@ package org.dslul.openboard.inputmethod.latin
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.Color
import android.util.AttributeSet import android.util.AttributeSet
import android.view.Gravity import android.view.Gravity
import android.view.View 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.Colors import org.dslul.openboard.inputmethod.latin.common.BackgroundType
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
@ -57,8 +58,8 @@ class KeyboardWrapperView @JvmOverloads constructor(
val colors = Settings.getInstance().current.mColors val colors = Settings.getInstance().current.mColors
stopOneHandedModeBtn.colorFilter = colors.keyTextFilter stopOneHandedModeBtn.colorFilter = colors.keyTextFilter
switchOneHandedModeBtn.colorFilter = colors.keyTextFilter switchOneHandedModeBtn.colorFilter = colors.keyTextFilter
colors.setBackgroundColor(stopOneHandedModeBtn.background, Colors.TYPE_BACKGROUND) colors.setBackgroundColor(stopOneHandedModeBtn.background, BackgroundType.BACKGROUND)
colors.setBackgroundColor(switchOneHandedModeBtn.background, Colors.TYPE_BACKGROUND) colors.setBackgroundColor(switchOneHandedModeBtn.background, BackgroundType.BACKGROUND)
} }
@SuppressLint("RtlHardcoded") @SuppressLint("RtlHardcoded")
@ -92,6 +93,7 @@ class KeyboardWrapperView @JvmOverloads constructor(
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
if (!oneHandedModeEnabled) { if (!oneHandedModeEnabled) {
super.onLayout(changed, left, top, right, bottom) super.onLayout(changed, left, top, right, bottom)
Settings.getInstance().current.mColors.setKeyboardBackground(keyboardView) // otherwise issue in clipboard view after switching oneHandedMode
return return
} }
@ -120,7 +122,7 @@ class KeyboardWrapperView @JvmOverloads constructor(
buttonsLeft + (spareWidth + switchOneHandedModeBtn.measuredWidth) / 2, buttonsLeft + (spareWidth + switchOneHandedModeBtn.measuredWidth) / 2,
2 * stopOneHandedModeBtn.measuredHeight + switchOneHandedModeBtn.measuredHeight 2 * stopOneHandedModeBtn.measuredHeight + switchOneHandedModeBtn.measuredHeight
) )
Settings.getInstance().current.mColors.keyboardBackground?.let { background = it } Settings.getInstance().current.mColors.setKeyboardBackground(this)
} }
init { init {
@ -130,12 +132,7 @@ class KeyboardWrapperView @JvmOverloads constructor(
iconSwitchOneHandedModeId = keyboardAttr.getResourceId(R.styleable.Keyboard_iconSwitchOneHandedMode, 0) iconSwitchOneHandedModeId = keyboardAttr.getResourceId(R.styleable.Keyboard_iconSwitchOneHandedMode, 0)
keyboardAttr.recycle() keyboardAttr.recycle()
val themeAttr = context.obtainStyledAttributes(attrs, setBackgroundColor(Color.WHITE)
R.styleable.KeyboardTheme, defStyle, 0) Settings.getInstance().current.mColors.setKeyboardBackground(this)
val keyboardViewStyleId = themeAttr.getResourceId(R.styleable.KeyboardTheme_mainKeyboardViewStyle, 0)
themeAttr.recycle()
val styleAttr = context.obtainStyledAttributes(keyboardViewStyleId, intArrayOf(android.R.attr.background))
setBackgroundResource(styleAttr.getResourceId(0, 0))
styleAttr.recycle()
} }
} }

View file

@ -2020,7 +2020,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.navBar; final int color = settingsValues.mColors.getNavBar();
final Window window = getWindow().getWindow(); final Window window = getWindow().getWindow();
if (window == null) if (window == null)
return; return;

View file

@ -1,161 +0,0 @@
package org.dslul.openboard.inputmethod.latin.common;
import static org.dslul.openboard.inputmethod.latin.utils.ColorUtilKt.*;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import androidx.annotation.Nullable;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme;
// todo: maybe kotlin? would make it much shorter and more readable
public class Colors {
public int navBar;
public final int accent;
public final int background;
public final int keyBackground;
public final int functionalKey;
public final int spaceBar;
public final int keyText;
public final int keyHintText;
public int adjustedBackground;
public int adjustedKeyText;
// todo (later): evaluate which colors, colorFilters and colorStateLists area actually necessary
public ColorFilter backgroundFilter;
public ColorFilter adjustedBackgroundFilter;
public ColorFilter keyBackgroundFilter;
public ColorFilter functionalKeyBackgroundFilter;
public ColorFilter spaceBarFilter;
public ColorFilter keyTextFilter;
public ColorFilter accentColorFilter;
public ColorFilter actionKeyIconColorFilter;
private ColorStateList backgroundStateList;
private ColorStateList keyStateList;
private ColorStateList functionalKeyStateList;
private ColorStateList actionKeyStateList;
private ColorStateList spaceBarStateList;
private ColorStateList adjustedBackgroundStateList;
public static Colors newColors(String themeStyle, int accent, int background, int keyBackground, int functionalKey, int spaceBar, int keyText, int keyHintText) {
if (themeStyle.equals(KeyboardTheme.THEME_STYLE_HOLO))
return new HoloColors(accent, background, keyBackground, functionalKey, spaceBar, keyText, keyHintText);
return new Colors(accent, background, keyBackground, functionalKey, spaceBar, keyText, keyHintText);
}
protected Colors(int _accent, int _background, int _keyBackground, int _functionalKey, int _spaceBar, int _keyText, int _keyHintText) {
accent = _accent;
background = _background;
keyBackground = _keyBackground;
functionalKey = _functionalKey;
spaceBar = _spaceBar;
keyText = _keyText;
keyHintText = _keyHintText;
navBar = background;
}
/** set background colors including state list to the drawable */
// todo: this can be used for setting more complicated filters
// may be necessary for reproducing holo theme (extend Colors and override this in sth like HoloColors?)
public void setBackgroundColor(final Drawable background, final int type) {
final ColorStateList list;
switch (type) {
case TYPE_KEY:
list = keyStateList;
break;
case TYPE_SPACE:
list = spaceBarStateList;
break;
case TYPE_ADJUSTED_BACKGROUND:
list = adjustedBackgroundStateList;
break;
case TYPE_ACTION:
list = actionKeyStateList;
break;
case TYPE_FUNCTIONAL:
list = functionalKeyStateList;
break;
case TYPE_BACKGROUND:
default:
list = backgroundStateList;
}
DrawableCompat.setTintMode(background, PorterDuff.Mode.MULTIPLY);
DrawableCompat.setTintList(background, list);
}
@Nullable
public Drawable getKeyboardBackground() {
return null;
}
public static final int TYPE_BACKGROUND = 0;
public static final int TYPE_KEY = 1;
public static final int TYPE_FUNCTIONAL = 2;
public static final int TYPE_ACTION = 3;
public static final int TYPE_SPACE = 4;
public static final int TYPE_ADJUSTED_BACKGROUND = 5;
public void createColorFilters(final boolean hasKeyBorders) {
final int[][] states = new int[][] {
// are other states used?
// looks like only microphone ("shortcut") key can ever be disabled, but then it's not shown anyway...
// checkable/checked is only used for sticky shift key in old holo theme, but drawables not used in new version
// active is used for action key
// empty is used for emoji and spacers
new int[] { android.R.attr.state_pressed}, // pressed
new int[] { -android.R.attr.state_pressed}, // not pressed
};
// todo (idea): make better use of the states?
// 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
backgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(background, BlendModeCompat.MODULATE);
adjustedKeyText = brightenOrDarken(keyText, true);
// color to be used if exact background color would be bad contrast, e.g. more keys popup or no border space bar
if (isDarkColor(background)) {
adjustedBackground = brighten(background);
adjustedBackgroundStateList = new ColorStateList(states, new int[] { brighten(adjustedBackground), adjustedBackground });
} else {
adjustedBackground = darken(background);
adjustedBackgroundStateList = new ColorStateList(states, new int[] { darken(adjustedBackground), adjustedBackground });
}
adjustedBackgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(adjustedBackground, BlendModeCompat.MODULATE);
if (hasKeyBorders) {
keyBackgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyBackground, BlendModeCompat.MODULATE);
functionalKeyBackgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(functionalKey, BlendModeCompat.MODULATE);
spaceBarFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(spaceBar, BlendModeCompat.MODULATE);
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;
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;
}
keyTextFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyText, 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;
}
}

View file

@ -0,0 +1,164 @@
package org.dslul.openboard.inputmethod.latin.common
import android.content.res.ColorStateList
import android.content.res.TypedArray
import android.graphics.Color
import android.graphics.ColorFilter
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.view.View
import androidx.core.graphics.BlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat
import androidx.core.graphics.drawable.DrawableCompat
import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme
import org.dslul.openboard.inputmethod.keyboard.MoreKeysKeyboardView
import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.suggestions.MoreSuggestionsView
import org.dslul.openboard.inputmethod.latin.utils.*
class Colors (
val themeStyle: String,
val hasKeyBorders: Boolean,
val accent: Int,
val background: Int,
val keyBackground: Int,
val functionalKey: Int,
val spaceBar: Int,
val keyText: Int,
val keyHintText: Int
) {
val navBar: Int
val adjustedBackground: Int
val adjustedKeyText: Int
// todo (later): evaluate which colors, colorFilters and colorStateLists are actually necessary
// also, ideally the color filters would be private and chosen internally depending on type
val backgroundFilter: ColorFilter
// workaround for error in ClipboardHistoryRecyclerView
// java.lang.IllegalAccessError: Field 'org.dslul.openboard.inputmethod.latin.common.Colors.backgroundFilter' is inaccessible to class 'org.dslul.openboard.inputmethod.keyboard.clipboard.ClipboardHistoryRecyclerView$BottomDividerItemDecoration'
// this should not happen, maybe it's a bug in kotlin? because it also doesn't recognize if the filter is accessed there, and wants to set it private
fun getThatBackgroundFilter() = backgroundFilter
val adjustedBackgroundFilter: ColorFilter
val keyBackgroundFilter: ColorFilter
val functionalKeyBackgroundFilter: ColorFilter
val spaceBarFilter: ColorFilter
val keyTextFilter: ColorFilter
val accentColorFilter: ColorFilter
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
val keyboardBackground: Drawable?
init {
if (themeStyle == KeyboardTheme.THEME_STYLE_HOLO) {
val darkerBackground = adjustLuminosityAndKeepAlpha(background, -0.2f)
navBar = darkerBackground
keyboardBackground = GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf(background, darkerBackground))
} else {
navBar = background
keyboardBackground = null
}
// create color filters, todo: maybe better / simplify
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?
// 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
backgroundFilter = colorFilter(background)
adjustedKeyText = brightenOrDarken(keyText, true)
// color to be used if exact background color would be bad contrast, e.g. more keys popup or no border space bar
if (isDarkColor(background)) {
adjustedBackground = brighten(background)
adjustedBackgroundStateList = stateList(brighten(adjustedBackground), adjustedBackground)
} else {
adjustedBackground = darken(background)
adjustedBackgroundStateList = stateList(darken(adjustedBackground), adjustedBackground)
}
adjustedBackgroundFilter = colorFilter(adjustedBackground)
if (hasKeyBorders) {
keyBackgroundFilter = colorFilter(keyBackground)
functionalKeyBackgroundFilter = colorFilter(functionalKey)
spaceBarFilter = colorFilter(spaceBar)
backgroundStateList = stateList(brightenOrDarken(background, true), background)
keyStateList = stateList(brightenOrDarken(keyBackground, true), keyBackground)
functionalKeyStateList = stateList(brightenOrDarken(functionalKey, true), functionalKey)
actionKeyStateList = if (themeStyle == KeyboardTheme.THEME_STYLE_HOLO) functionalKeyStateList
else stateList(brightenOrDarken(accent, true), accent)
spaceBarStateList = stateList(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
backgroundStateList = stateList(brightenOrDarken(background, true), background)
keyStateList = backgroundStateList
functionalKeyStateList = backgroundStateList
actionKeyStateList = if (themeStyle == KeyboardTheme.THEME_STYLE_HOLO) functionalKeyStateList
else stateList(brightenOrDarken(accent, true), accent)
spaceBarStateList = adjustedBackgroundStateList
}
keyTextFilter = colorFilter(keyText, BlendModeCompat.SRC_ATOP)
accentColorFilter = colorFilter(accent)
actionKeyIconColorFilter =
if (isBrightColor(accent)) // the white icon may not have enough contrast, and can't be adjusted by the user
colorFilter(Color.DKGRAY, BlendModeCompat.SRC_ATOP)
else null
}
/** set background colors including state list to the drawable */
fun setBackgroundColor(background: Drawable, type: BackgroundType) {
val colorStateList = when (type) {
BackgroundType.BACKGROUND -> backgroundStateList
BackgroundType.KEY -> keyStateList
BackgroundType.FUNCTIONAL -> functionalKeyStateList
BackgroundType.ACTION -> actionKeyStateList
BackgroundType.SPACE -> spaceBarStateList
BackgroundType.ADJUSTED_BACKGROUND -> adjustedBackgroundStateList
}
DrawableCompat.setTintMode(background, PorterDuff.Mode.MULTIPLY)
DrawableCompat.setTintList(background, colorStateList)
}
// using !! for the color filter because null is only returned for unsupported modes, which are not used
private fun colorFilter(color: Int, mode: BlendModeCompat = BlendModeCompat.MODULATE): ColorFilter =
BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, mode)!!
fun getDrawable(type: BackgroundType, attr: TypedArray): Drawable {
val drawable = when (type) {
BackgroundType.KEY, BackgroundType.ADJUSTED_BACKGROUND, BackgroundType.BACKGROUND ->
attr.getDrawable(R.styleable.KeyboardView_keyBackground)?.mutate()
BackgroundType.FUNCTIONAL -> attr.getDrawable(R.styleable.KeyboardView_functionalKeyBackground)?.mutate()
BackgroundType.SPACE -> attr.getDrawable(R.styleable.KeyboardView_spacebarBackground)?.mutate()
BackgroundType.ACTION -> if (themeStyle == KeyboardTheme.THEME_STYLE_HOLO)
attr.getDrawable(R.styleable.KeyboardView_functionalKeyBackground)?.mutate()
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) {
when (view) {
is MoreSuggestionsView -> view.background.colorFilter = backgroundFilter
is MoreKeysKeyboardView -> view.background.colorFilter = adjustedBackgroundFilter
else -> if (keyboardBackground != null) view.background = keyboardBackground
else view.background.colorFilter = backgroundFilter
}
}
}
enum class BackgroundType {
BACKGROUND, KEY, FUNCTIONAL, ACTION, SPACE, ADJUSTED_BACKGROUND
}

View file

@ -1,26 +0,0 @@
package org.dslul.openboard.inputmethod.latin.common;
import static org.dslul.openboard.inputmethod.latin.utils.ColorUtilKt.adjustLuminosityAndKeepAlpha;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
public class HoloColors extends Colors {
private final Drawable keyboardBackground = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[] { background, adjustLuminosityAndKeepAlpha(background, -0.2f) }
);
protected HoloColors(int _accent, int _background, int _keyBackground, int _functionalKey, int _spaceBar, int _keyText, int _keyHintText) {
super(_accent, _background, _keyBackground, _functionalKey, _spaceBar, _keyText, _keyHintText);
navBar = adjustLuminosityAndKeepAlpha(background, -0.2f);
}
@Override
public Drawable getKeyboardBackground() {
// thanks a lot google for omitting something extremely exotic like a "subtract" color
// filter that could be simply applied on top of a brighter version of keyboard_background_holo
return keyboardBackground;
}
}

View file

@ -255,7 +255,6 @@ public class SettingsValues {
mSecondaryLocales = Settings.getSecondaryLocales(prefs, SubtypeSettingsKt.getSelectedSubtype(prefs).getLocale()); mSecondaryLocales = Settings.getSecondaryLocales(prefs, SubtypeSettingsKt.getSelectedSubtype(prefs).getLocale());
mColors = Settings.getColorsForCurrentTheme(context, prefs); mColors = Settings.getColorsForCurrentTheme(context, prefs);
mColors.createColorFilters(prefs.getBoolean(Settings.PREF_THEME_KEY_BORDERS, false));
mAddToPersonalDictionary = prefs.getBoolean(Settings.PREF_ADD_TO_PERSONAL_DICTIONARY, false); mAddToPersonalDictionary = prefs.getBoolean(Settings.PREF_ADD_TO_PERSONAL_DICTIONARY, false);
mUseContactsDictionary = prefs.getBoolean(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY, false); mUseContactsDictionary = prefs.getBoolean(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY, false);

View file

@ -131,10 +131,10 @@ 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.adjustedKeyText; //a.getColor(R.styleable.SuggestionStripView_colorValidTypedWord, 0); mColorValidTypedWord = colors.getAdjustedKeyText(); //a.getColor(R.styleable.SuggestionStripView_colorValidTypedWord, 0);
mColorTypedWord = colors.adjustedKeyText; //a.getColor(R.styleable.SuggestionStripView_colorTypedWord, 0); mColorTypedWord = colors.getAdjustedKeyText(); //a.getColor(R.styleable.SuggestionStripView_colorTypedWord, 0);
mColorAutoCorrect = colors.keyText; //a.getColor(R.styleable.SuggestionStripView_colorAutoCorrect, 0); mColorAutoCorrect = colors.getKeyText(); //a.getColor(R.styleable.SuggestionStripView_colorAutoCorrect, 0);
mColorSuggested = colors.adjustedKeyText; //a.getColor(R.styleable.SuggestionStripView_colorSuggested, 0); mColorSuggested = colors.getAdjustedKeyText(); //a.getColor(R.styleable.SuggestionStripView_colorSuggested, 0);
mSuggestionsCountInStrip = a.getInt( mSuggestionsCountInStrip = a.getInt(
R.styleable.SuggestionStripView_suggestionsCountInStrip, R.styleable.SuggestionStripView_suggestionsCountInStrip,

View file

@ -48,6 +48,7 @@ import org.dslul.openboard.inputmethod.latin.BuildConfig;
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.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;
@ -147,7 +148,7 @@ 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(), Colors.TYPE_BACKGROUND); colors.setBackgroundColor(word.getBackground(), BackgroundType.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);
@ -185,10 +186,10 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
mOtherKey.setImageDrawable(iconIncognito); mOtherKey.setImageDrawable(iconIncognito);
colors.setBackgroundColor(getBackground(), Colors.TYPE_BACKGROUND); colors.setBackgroundColor(getBackground(), BackgroundType.BACKGROUND);
mClipboardKey.setColorFilter(colors.keyText); mClipboardKey.setColorFilter(colors.getKeyText());
mVoiceKey.setColorFilter(colors.keyText); mVoiceKey.setColorFilter(colors.getKeyText());
mOtherKey.setColorFilter(colors.keyText); mOtherKey.setColorFilter(colors.getKeyText());
} }
/** /**