move color filters for custom colors into "Colors" class

This commit is contained in:
Helium314 2023-07-26 11:01:58 +02:00
parent db3c39bfc5
commit 3c060ddfa5
17 changed files with 235 additions and 215 deletions

View file

@ -1136,4 +1136,8 @@ public class Key implements Comparable<Key> {
height, params.mHorizontalGap, params.mVerticalGap);
}
}
public boolean isPressed() {
return mPressed;
}
}

View file

@ -37,6 +37,7 @@ import org.dslul.openboard.inputmethod.latin.LatinIME;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.RichInputMethodManager;
import org.dslul.openboard.inputmethod.latin.WordComposer;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.define.ProductionFlags;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
@ -555,9 +556,9 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
mClipboardHistoryView.setKeyboardActionListener(mLatinIME);
// set background color here, otherwise there is a narrow white line between keyboard and suggestion strip
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
if (settingsValues.mCustomTheme)
mKeyboardViewWrapper.getBackground().setColorFilter(settingsValues.mCustomBackgroundColorFilter);
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (colors.isCustom)
mKeyboardViewWrapper.getBackground().setColorFilter(colors.backgroundFilter);
return mCurrentInputView;
}

View file

@ -21,7 +21,6 @@ import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.PorterDuff;
@ -33,18 +32,14 @@ import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import org.dslul.openboard.inputmethod.keyboard.internal.KeyDrawParams;
import org.dslul.openboard.inputmethod.keyboard.internal.KeyVisualAttributes;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.common.StringUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.suggestions.MoreSuggestionsView;
import org.dslul.openboard.inputmethod.latin.utils.ColorUtils;
import org.dslul.openboard.inputmethod.latin.utils.TypefaceUtils;
import java.util.HashSet;
@ -104,11 +99,7 @@ public class KeyboardView extends View {
private final float mSpacebarIconWidthRatio;
private final Rect mKeyBackgroundPadding = new Rect();
private static final float KET_TEXT_SHADOW_RADIUS_DISABLED = -1.0f;
private final ColorFilter keyHintTextColorFilter;
private final ColorFilter keyTextColorFilter;
private final ColorFilter keyBgFilter;
private final ColorFilter accentColorFilter;
private final boolean mCustomTheme;
private final Colors mColors;
// The maximum key label width in the proportion to the key width.
private static final float MAX_LABEL_RATIO = 0.90f;
@ -180,22 +171,11 @@ public class KeyboardView extends View {
mPaint.setAntiAlias(true);
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
mCustomTheme = settingsValues.mCustomTheme;
if (mCustomTheme) {
getBackground().setColorFilter(settingsValues.mCustomBackgroundColorFilter);
keyBgFilter = settingsValues.mCustomKeyBackgroundColorFilter;
keyHintTextColorFilter = settingsValues.mCustomHintTextColorFilter;
keyTextColorFilter = settingsValues.mCustomKeyTextColorFilter;
accentColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(settingsValues.mCustomThemeColorAccent, BlendModeCompat.SRC_ATOP);
mSpacebarBackground.setColorFilter(settingsValues.mCustomSpaceBarBackgroundColorFilter);
mFunctionalKeyBackground.setColorFilter(settingsValues.mCustomFunctionalKeyBackgroundColorFilter);
} else {
keyHintTextColorFilter = null;
keyTextColorFilter = null;
keyBgFilter = null;
accentColorFilter = null;
mColors = Settings.getInstance().getCurrent().mColors;
if (mColors.isCustom) {
getBackground().setColorFilter(mColors.backgroundFilter);
mSpacebarBackground.setColorFilter(mColors.spaceBarFilter); // todo: consider pressed state
mFunctionalKeyBackground.setColorFilter(mColors.functionalKeyBackgroundFilter); // todo: consider pressed state
}
}
@ -401,13 +381,13 @@ public class KeyboardView extends View {
bgX = -padding.left;
bgY = -padding.top;
}
if (mCustomTheme) {
if (mColors.isCustom) {
// color filter is applied to background, which is re-used
// action key and normal key share the same background drawable, so we need to select the correct color filter
if (key.isActionKey())
background.setColorFilter(accentColorFilter);
background.setColorFilter(mColors.accentColorFilter);
else if (key.getBackgroundType() == Key.BACKGROUND_TYPE_NORMAL)
background.setColorFilter(keyBgFilter);
background.setColorFilter(mColors.keyBackgroundFilter);
}
background.setBounds(0, 0, bgWidth, bgHeight);
canvas.translate(bgX, bgY);
@ -461,14 +441,14 @@ public class KeyboardView extends View {
if (key.isEnabled()) {
paint.setColor(key.selectTextColor(params));
if (mCustomTheme) {
if (mColors.isCustom) {
// set key color only if not in emoji keyboard range
if (keyboard != null
&& (this.getClass() == MoreSuggestionsView.class ?
!StringUtils.probablyContainsEmoji(key.getLabel()) : // doesn't contain emoji (all can happen in MoreSuggestionsView)
(keyboard.mId.mElementId < 10 || keyboard.mId.mElementId > 26) // not showing emoji keyboard (no emojis visible on main keyboard otherwise)
&& (this.getClass() == MoreSuggestionsView.class
? !StringUtils.probablyContainsEmoji(key.getLabel()) // doesn't contain emoji (MoreSuggestionsView can have letters and emojis)
: (keyboard.mId.mElementId < 10 || keyboard.mId.mElementId > 26) // not showing emoji keyboard (no emojis visible on main keyboard otherwise)
))
paint.setColorFilter(keyTextColorFilter);
paint.setColorFilter(mColors.keyTextFilter);
else
paint.setColorFilter(null);
}
@ -495,8 +475,8 @@ public class KeyboardView extends View {
if (hintLabel != null && mShowsHints) {
paint.setTextSize(key.selectHintTextSize(params));
paint.setColor(key.selectHintTextColor(params));
if (mCustomTheme)
paint.setColorFilter(keyHintTextColorFilter);
if (mColors.isCustom)
paint.setColorFilter(mColors.keyHintTextFilter);
// TODO: Should add a way to specify type face for hint letters
paint.setTypeface(Typeface.DEFAULT_BOLD);
blendAlpha(paint, params.mAnimAlpha);
@ -549,24 +529,21 @@ public class KeyboardView extends View {
iconY = (keyHeight - iconHeight) / 2; // Align vertically center.
}
final int iconX = (keyWidth - iconWidth) / 2; // Align horizontally center.
if (mCustomTheme) {
if (mColors.isCustom) {
if (key.isActionKey()) {
// the white icon may not have enough contrast, and can't be adjusted by the user
if (ColorUtils.isBrightColor(Settings.getInstance().getCurrent().mCustomThemeColorAccent))
icon.setColorFilter(Color.DKGRAY, PorterDuff.Mode.SRC_ATOP);
else
icon.clearColorFilter();
icon.setColorFilter(mColors.actionKeyIconColorFilter);
} else if (key.isShift()) {
if (keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED
|| keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED
|| keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED
|| keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED
)
icon.setColorFilter(accentColorFilter);
icon.setColorFilter(mColors.accentColorFilter);
else
icon.setColorFilter(keyTextColorFilter);
icon.setColorFilter(mColors.keyTextFilter);
} else if (key.getBackgroundType() != Key.BACKGROUND_TYPE_NORMAL) {
icon.setColorFilter(keyTextColorFilter);
icon.setColorFilter(mColors.keyTextFilter);
}
}
drawIcon(canvas, icon, iconX, iconY, iconWidth, iconHeight);

View file

@ -63,9 +63,9 @@ class ClipboardHistoryRecyclerView @JvmOverloads constructor(
init {
paint.color = dividerColor
paint.strokeWidth = dividerHeight.toFloat()
val settingsValues = Settings.getInstance().current
if (settingsValues.mCustomTheme)
paint.colorFilter = settingsValues.mCustomBackgroundColorFilter
val colors = Settings.getInstance().current.mColors
if (colors.isCustom)
paint.colorFilter = colors.backgroundFilter
}
override fun onDrawOver(canvas: Canvas, parent: RecyclerView, state: State) {

View file

@ -90,7 +90,6 @@ class ClipboardHistoryView @JvmOverloads constructor(
findViewById<FrameLayout>(R.id.clipboard_action_bar)?.apply {
clipboardLayoutParams.setActionBarProperties(this)
}
val settingsValues = Settings.getInstance().current
alphabetKey = findViewById<TextView>(R.id.clipboard_keyboard_alphabet).apply {
tag = Constants.CODE_ALPHA_FROM_CLIPBOARD
setBackgroundResource(functionalKeyBackgroundId)
@ -101,11 +100,12 @@ class ClipboardHistoryView @JvmOverloads constructor(
setOnTouchListener(this@ClipboardHistoryView)
setOnClickListener(this@ClipboardHistoryView)
}
if (settingsValues.mCustomTheme) {
alphabetKey.background.colorFilter = settingsValues.mCustomFunctionalKeyBackgroundColorFilter
alphabetKey.setTextColor(settingsValues.mCustomKeyTextColor)
clearKey.colorFilter = settingsValues.mCustomKeyTextColorFilter
background.colorFilter = settingsValues.mCustomBackgroundColorFilter
val colors = Settings.getInstance().current.mColors
if (colors.isCustom) {
alphabetKey.background.colorFilter = colors.functionalKeyBackgroundFilter
alphabetKey.setTextColor(colors.keyText)
clearKey.colorFilter = colors.keyTextFilter
background.colorFilter = colors.backgroundFilter
}
}
@ -113,9 +113,9 @@ class ClipboardHistoryView @JvmOverloads constructor(
key?.apply {
text = label
typeface = params.mTypeface
val settingsValues = Settings.getInstance().current
if (settingsValues.mCustomTheme)
setTextColor(settingsValues.mCustomKeyTextColor)
val colors = Settings.getInstance().current.mColors
if (colors.isCustom)
setTextColor(colors.keyText)
else
setTextColor(params.mFunctionalTextColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mLabelSize.toFloat())
@ -126,10 +126,10 @@ class ClipboardHistoryView @JvmOverloads constructor(
clipboardAdapter.apply {
itemBackgroundId = keyBackgroundId
itemTypeFace = params.mTypeface
val settingsValues = Settings.getInstance().current
if (settingsValues.mCustomTheme) {
itemTextColor = settingsValues.mCustomKeyTextColor
itemBackgroundColorFilter = settingsValues.mCustomKeyBackgroundColorFilter
val colors = Settings.getInstance().current.mColors
if (colors.isCustom) {
itemTextColor = colors.keyText
itemBackgroundColorFilter = colors.keyBackgroundFilter
} else
itemTextColor = params.mTextColor
itemTextSize = params.mLabelSize.toFloat()

View file

@ -47,9 +47,9 @@ import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardIconsSet;
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
@ -163,10 +163,10 @@ public final class EmojiPalettesView extends LinearLayout
// TODO: Replace background color with its own setting rather than using the
// category page indicator background as a workaround.
iconView.setBackgroundColor(mCategoryPageIndicatorBackground);
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
if (settingsValues.mCustomTheme) {
iconView.getBackground().setColorFilter(settingsValues.mCustomBackgroundColorFilter);
iconView.setColorFilter(settingsValues.mCustomKeyTextColorFilter);
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (colors.isCustom) {
iconView.getBackground().setColorFilter(colors.backgroundFilter);
iconView.setColorFilter(colors.keyTextFilter);
}
iconView.setImageResource(mEmojiCategory.getCategoryTabIcon(categoryId));
iconView.setContentDescription(mEmojiCategory.getAccessibilityDescription(categoryId));
@ -269,14 +269,14 @@ public final class EmojiPalettesView extends LinearLayout
mSpacebar.setTag(Constants.CODE_SPACE);
mSpacebar.setOnTouchListener(this);
mSpacebar.setOnClickListener(this);
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
if (settingsValues.mCustomTheme) {
mAlphabetKeyLeft.getBackground().setColorFilter(settingsValues.mCustomFunctionalKeyBackgroundColorFilter);
mSpacebar.getBackground().setColorFilter(settingsValues.mCustomSpaceBarBackgroundColorFilter);
mDeleteKey.getBackground().setColorFilter(settingsValues.mCustomFunctionalKeyBackgroundColorFilter);
getBackground().setColorFilter(settingsValues.mCustomBackgroundColorFilter);
mEmojiCategoryPageIndicatorView.setColors(settingsValues.mCustomThemeColorAccent, settingsValues.mCustomBackgroundColor);
findViewById(R.id.emoji_tab_strip).getBackground().setColorFilter(settingsValues.mCustomBackgroundColorFilter);
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (colors.isCustom) {
mAlphabetKeyLeft.getBackground().setColorFilter(colors.functionalKeyBackgroundFilter);
mSpacebar.getBackground().setColorFilter(colors.spaceBarFilter);
mDeleteKey.getBackground().setColorFilter(colors.functionalKeyBackgroundFilter);
getBackground().setColorFilter(colors.backgroundFilter);
mEmojiCategoryPageIndicatorView.setColors(colors.accent, colors.background);
findViewById(R.id.emoji_tab_strip).getBackground().setColorFilter(colors.backgroundFilter);
}
mEmojiLayoutParams.setKeyProperties(mSpacebar);
mSpacebarIcon = findViewById(R.id.emoji_keyboard_space_icon);
@ -299,12 +299,12 @@ public final class EmojiPalettesView extends LinearLayout
setCurrentCategoryAndPageId(categoryId, 0, false /* force */);
updateEmojiCategoryPageIdView();
}
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
if (settingsValues.mCustomTheme) {
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (colors.isCustom) {
if (mCurrentTab != null)
mCurrentTab.setColorFilter(settingsValues.mCustomKeyTextColorFilter);
mCurrentTab.setColorFilter(colors.keyTextFilter);
mCurrentTab = (ImageView) mTabHost.getCurrentTabView();
mCurrentTab.setColorFilter(settingsValues.mCustomThemeColorAccent);
mCurrentTab.setColorFilter(colors.accentColorFilter);
}
}
@ -389,9 +389,9 @@ public final class EmojiPalettesView extends LinearLayout
private static void setupAlphabetKey(final TextView alphabetKey, final String label,
final KeyDrawParams params) {
alphabetKey.setText(label);
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
if (settingsValues.mCustomTheme)
alphabetKey.setTextColor(settingsValues.mCustomKeyTextColor);
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (colors.isCustom)
alphabetKey.setTextColor(colors.keyText);
else
alphabetKey.setTextColor(params.mFunctionalTextColor);
alphabetKey.setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mLabelSize);

View file

@ -27,9 +27,9 @@ import android.text.TextUtils;
import org.dslul.openboard.inputmethod.keyboard.PointerTracker;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.SuggestedWords;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import javax.annotation.Nonnull;
@ -62,15 +62,17 @@ public class GestureFloatingTextDrawingPreview extends AbstractDrawingPreview {
private static final char[] TEXT_HEIGHT_REFERENCE_CHAR = { 'M' };
public GesturePreviewTextParams(final TypedArray mainKeyboardViewAttr) {
final SettingsValues sv = Settings.getInstance().getCurrent();
final Colors colors = Settings.getInstance().getCurrent().mColors;
mGesturePreviewTextSize = mainKeyboardViewAttr.getDimensionPixelSize(
R.styleable.MainKeyboardView_gestureFloatingPreviewTextSize, 0);
mGesturePreviewTextColor = sv.mCustomTheme ? sv.mCustomKeyTextColor : mainKeyboardViewAttr.getColor(
R.styleable.MainKeyboardView_gestureFloatingPreviewTextColor, 0);
mGesturePreviewTextColor = colors.isCustom
? colors.keyText
: mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureFloatingPreviewTextColor, 0);
mGesturePreviewTextOffset = mainKeyboardViewAttr.getDimensionPixelOffset(
R.styleable.MainKeyboardView_gestureFloatingPreviewTextOffset, 0);
mGesturePreviewColor = sv.mCustomTheme ? sv.mCustomBackgroundColor : mainKeyboardViewAttr.getColor(
R.styleable.MainKeyboardView_gestureFloatingPreviewColor, 0);
mGesturePreviewColor = colors.isCustom
? colors.background
: mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_gestureFloatingPreviewColor, 0);
mGesturePreviewHorizontalPadding = mainKeyboardViewAttr.getDimension(
R.styleable.MainKeyboardView_gestureFloatingPreviewHorizontalPadding, 0.0f);
mGesturePreviewVerticalPadding = mainKeyboardViewAttr.getDimension(

View file

@ -19,8 +19,8 @@ package org.dslul.openboard.inputmethod.keyboard.internal;
import android.content.res.TypedArray;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
/**
* This class holds parameters to control how a gesture trail is drawn and animated on the screen.
@ -52,8 +52,8 @@ final class GestureTrailDrawingParams {
public final int mTrailLingerDuration;
public GestureTrailDrawingParams(final TypedArray mainKeyboardViewAttr) {
final SettingsValues sv = Settings.getInstance().getCurrent();
mTrailColor = sv.mCustomTheme ? sv.mCustomThemeColorAccent : mainKeyboardViewAttr.getColor(
final Colors colors = Settings.getInstance().getCurrent().mColors;
mTrailColor = colors.isCustom ? colors.accent : mainKeyboardViewAttr.getColor(
R.styleable.MainKeyboardView_gestureTrailColor, 0);
mTrailStartWidth = mainKeyboardViewAttr.getDimension(
R.styleable.MainKeyboardView_gestureTrailStartWidth, 0.0f);

View file

@ -21,9 +21,9 @@ import android.view.View;
import android.view.ViewGroup;
import org.dslul.openboard.inputmethod.keyboard.Key;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.utils.ViewLayoutUtils;
import java.util.ArrayDeque;
@ -119,10 +119,10 @@ public final class KeyPreviewChoreographer {
}
final boolean hasMoreKeys = (key.getMoreKeys() != null);
keyPreviewView.setPreviewBackground(hasMoreKeys, keyPreviewPosition);
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
if (settingsValues.mCustomTheme) {
keyPreviewView.getBackground().setColorFilter(settingsValues.mCustomBackgroundColorFilter);
keyPreviewView.setTextColor(settingsValues.mCustomKeyTextColor);
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (colors.isCustom) {
keyPreviewView.getBackground().setColorFilter(colors.backgroundFilter);
keyPreviewView.setTextColor(colors.keyText);
}
// The key preview is placed vertically above the top edge of the parent key with an
// arbitrary offset.

View file

@ -23,7 +23,9 @@ import android.graphics.Path;
import org.dslul.openboard.inputmethod.keyboard.PointerTracker;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
/**
* Draw rubber band preview graphics during sliding key input.
@ -45,8 +47,10 @@ public final class SlidingKeyInputDrawingPreview extends AbstractDrawingPreview
private final Paint mPaint = new Paint();
public SlidingKeyInputDrawingPreview(final TypedArray mainKeyboardViewAttr) {
final int previewColor = mainKeyboardViewAttr.getColor(
R.styleable.MainKeyboardView_slidingKeyInputPreviewColor, 0);
final Colors colors = Settings.getInstance().getCurrent().mColors;
final int previewColor = colors.isCustom
? colors.accent
: mainKeyboardViewAttr.getColor(R.styleable.MainKeyboardView_slidingKeyInputPreviewColor, 0);
final float previewRadius = mainKeyboardViewAttr.getDimension(
R.styleable.MainKeyboardView_slidingKeyInputPreviewWidth, 0) / 2.0f;
final int PERCENTAGE_INT = 100;

View file

@ -64,6 +64,7 @@ import org.dslul.openboard.inputmethod.keyboard.KeyboardSwitcher;
import org.dslul.openboard.inputmethod.keyboard.MainKeyboardView;
import org.dslul.openboard.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils;
import org.dslul.openboard.inputmethod.latin.common.InputPointers;
@ -101,7 +102,6 @@ import javax.annotation.Nonnull;
import static org.dslul.openboard.inputmethod.latin.common.Constants.ImeOption.FORCE_ASCII;
import static org.dslul.openboard.inputmethod.latin.common.Constants.ImeOption.NO_MICROPHONE;
import static org.dslul.openboard.inputmethod.latin.common.Constants.ImeOption.NO_MICROPHONE_COMPAT;
import static org.dslul.openboard.inputmethod.latin.utils.ColorUtils.isBrightColor;
/**
* Input method implementation for Qwerty'ish keyboard.
@ -2022,7 +2022,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
final SettingsValues settingsValues = mSettings.getCurrent();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || !settingsValues.mCustomNavBarColor)
return;
final int color = settingsValues.mNavBarColor;
final int color = settingsValues.mColors.navBar;
final Window window = getWindow().getWindow();
if (window == null)
return;
@ -2033,7 +2033,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
return;
final View view = window.getDecorView();
mOriginalNavBarFlags = view.getSystemUiVisibility();
if (isBrightColor(color)) {
if (Colors.isBrightColor(color)) {
view.setSystemUiVisibility(mOriginalNavBarFlags | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
} else {
view.setSystemUiVisibility(mOriginalNavBarFlags & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);

View file

@ -0,0 +1,129 @@
package org.dslul.openboard.inputmethod.latin.common;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.ColorFilter;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
public class Colors {
public final boolean isCustom; // todo: could be removed?
public final 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 ColorFilter backgroundFilter;
public ColorFilter keyBackgroundFilter;
public ColorFilter keyPressedBackgroundFilter;
public ColorFilter functionalKeyBackgroundFilter;
public ColorFilter functionalKeyPressedBackgroundFilter;
public ColorFilter spaceBarFilter;
public ColorFilter spaceBarPressedFilter;
public ColorFilter keyTextFilter; // todo: really necessary?
public ColorFilter keyHintTextFilter; // todo: really? color alone should be sufficient i think... test!
public ColorFilter accentColorFilter; // todo: really necessary?
public ColorFilter actionKeyIconColorFilter;
public Colors(int acc, int bg, int k, int fun, int space, int kt, int kht) {
isCustom = true;
accent = acc;
background = bg;
keyBackground = k;
functionalKey = fun;
spaceBar = space;
keyText = kt;
keyHintText = kht;
navBar = background;
}
public Colors(int themeId, int nightModeFlags) {
isCustom = false;
if (KeyboardTheme.getIsDayNight(themeId)) {
if (nightModeFlags == Configuration.UI_MODE_NIGHT_NO)
navBar = Color.rgb(236, 239, 241);
else if (themeId == KeyboardTheme.THEME_ID_LXX_DARK)
navBar = Color.rgb(38, 50, 56);
else
navBar = Color.BLACK;
} else if (KeyboardTheme.THEME_VARIANT_LIGHT.equals(KeyboardTheme.getThemeVariant(themeId))) {
navBar = Color.rgb(236, 239, 241);
} else if (themeId == KeyboardTheme.THEME_ID_LXX_DARK) {
navBar = Color.rgb(38, 50, 56);
} else {
// dark border is 13/13/13, but that's ok
navBar = Color.BLACK;
}
accent = 0;
background = 0;
keyBackground = 0;
functionalKey = 0;
spaceBar = 0;
keyText = 0;
keyHintText = 0;
}
public void createColorFilters(final boolean hasKeyBorders) {
backgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(background, BlendModeCompat.MODULATE);
if (hasKeyBorders) {
keyBackgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyBackground, BlendModeCompat.MODULATE);
functionalKeyBackgroundFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(functionalKey, BlendModeCompat.MODULATE);
spaceBarFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(spaceBar, BlendModeCompat.MODULATE);
keyPressedBackgroundFilter = isDarkColor(keyBackground)
? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyBackground, BlendModeCompat.SCREEN)
: keyBackgroundFilter;
functionalKeyPressedBackgroundFilter = isDarkColor(functionalKey)
? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(functionalKey, BlendModeCompat.SCREEN)
: functionalKeyBackgroundFilter;
spaceBarPressedFilter = isDarkColor(spaceBar)
? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(spaceBar, BlendModeCompat.SCREEN)
: spaceBarFilter;
} else {
// need to set color to background if key borders are disabled, or there will be ugly keys
keyBackgroundFilter = backgroundFilter;
functionalKeyBackgroundFilter = backgroundFilter;
spaceBarFilter = backgroundFilter;
keyPressedBackgroundFilter = isDarkColor(background)
? BlendModeColorFilterCompat.createBlendModeColorFilterCompat(background, BlendModeCompat.SCREEN)
: keyBackgroundFilter;
functionalKeyPressedBackgroundFilter = keyBackgroundFilter;
spaceBarPressedFilter = keyBackgroundFilter;
}
keyTextFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyText, BlendModeCompat.SRC_ATOP);
keyHintTextFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(keyHintText, BlendModeCompat.SRC_ATOP);
accentColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(accent, BlendModeCompat.SRC_ATOP);
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;
}
public static boolean isBrightColor(int color) {
if (android.R.color.transparent == color) {
return true;
}
// See http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
int[] rgb = {Color.red(color), Color.green(color), Color.blue(color)};
// we are only interested whether brightness is greater, so no need for sqrt
int brightnessSquared = (int) (rgb[0] * rgb[0] * .241 + rgb[1] * rgb[1] * .691 + rgb[2] * rgb[2] * .068);
return brightnessSquared >= 210*210;
}
public static boolean isDarkColor(int color) {
if (android.R.color.transparent == color) {
return true;
}
// See http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
int[] rgb = {Color.red(color), Color.green(color), Color.blue(color)};
// we are only interested whether brightness is greater, so no need for sqrt
int brightnessSquared = (int) (rgb[0] * rgb[0] * .241 + rgb[1] * rgb[1] * .691 + rgb[2] * rgb[2] * .068);
return brightnessSquared < 50*50;
}
}

View file

@ -31,6 +31,7 @@ import org.dslul.openboard.inputmethod.keyboard.KeyboardTheme;
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.InputAttributes;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.LocaleUtils;
import org.dslul.openboard.inputmethod.latin.common.StringUtils;
import org.dslul.openboard.inputmethod.latin.utils.AdditionalSubtypeUtils;
@ -47,6 +48,7 @@ import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public final class Settings implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = Settings.class.getSimpleName();
@ -564,58 +566,3 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
}
}
// class for forwarding custom colors to SettingsValues
// (kotlin data class could be 3 lines...)
// actually this could contain the color filters too, which would allow more flexibility (only do if needed)
class Colors {
boolean isCustom;
int navBar;
int accent;
int background;
int keyBackground;
int functionalKey; // this color will appear darker than set, as it is applied using a color filter in modulate mode
int spaceBar;
int keyText;
int keyHintText;
public Colors(int acc, int bg, int k, int fun, int space, int kt, int kht) {
isCustom = true;
accent = acc;
background = bg;
keyBackground = k;
functionalKey = fun;
spaceBar = space;
keyText = kt;
keyHintText = kht;
// slightly adjust color so it matches keyboard background (actually it's a little off)
// todo: remove this weird not-really-white? i.e. set actually white background
// then the default themes could simply be replaced by a set of colors...
// but: this needs to work for the auto-theme too!
navBar = Color.rgb((int) (Color.red(background) * 0.925), (int) (Color.green(background) * 0.9379), (int) (Color.blue(background) * 0.945));
}
public Colors(int themeId, int nightModeFlags) {
isCustom = false;
if (KeyboardTheme.getIsDayNight(themeId)) {
if (nightModeFlags == Configuration.UI_MODE_NIGHT_NO)
navBar = Color.rgb(236, 239, 241);
else if (themeId == KeyboardTheme.THEME_ID_LXX_DARK)
navBar = Color.rgb(38, 50, 56);
else
navBar = Color.BLACK;
} else if (KeyboardTheme.THEME_VARIANT_LIGHT.equals(KeyboardTheme.getThemeVariant(themeId))) {
navBar = Color.rgb(236, 239, 241);
} else if (themeId == KeyboardTheme.THEME_ID_LXX_DARK) {
navBar = Color.rgb(38, 50, 56);
} else {
// dark border is 13/13/13, but that's ok
navBar = Color.BLACK;
}
accent = 0;
background = 0;
keyBackground = 0;
functionalKey = 0;
spaceBar = 0;
keyText = 0;
keyHintText = 0;
}
}

View file

@ -32,6 +32,7 @@ import org.dslul.openboard.inputmethod.compat.AppWorkaroundsUtils;
import org.dslul.openboard.inputmethod.latin.InputAttributes;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.RichInputMethodManager;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.spellcheck.AndroidSpellCheckerService;
import org.dslul.openboard.inputmethod.latin.utils.AsyncResultHolder;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
@ -127,17 +128,7 @@ public class SettingsValues {
private final AsyncResultHolder<AppWorkaroundsUtils> mAppWorkarounds;
// User-defined colors
public final boolean mCustomTheme;
public final ColorFilter mCustomKeyBackgroundColorFilter;
public final ColorFilter mCustomFunctionalKeyBackgroundColorFilter;
public final ColorFilter mCustomSpaceBarBackgroundColorFilter;
public final int mCustomBackgroundColor;
public final ColorFilter mCustomBackgroundColorFilter;
public final ColorFilter mCustomKeyTextColorFilter;
public final ColorFilter mCustomHintTextColorFilter;
public final int mCustomThemeColorAccent;
public final int mCustomKeyTextColor;
public final int mNavBarColor;
public final Colors mColors;
// Debug settings
public final boolean mIsInternal;
@ -265,25 +256,8 @@ public class SettingsValues {
mOneHandedModeGravity = Settings.readOneHandedModeGravity(prefs);
mSecondaryLocale = Settings.getSecondaryLocale(prefs, RichInputMethodManager.getInstance().getCurrentSubtypeLocale().toString());
final Colors colors = Settings.getColors(context.getResources().getConfiguration(), prefs);
mNavBarColor = colors.navBar;
mCustomTheme = colors.isCustom;
mCustomThemeColorAccent = colors.accent;
mCustomKeyTextColor = colors.keyText;
mCustomBackgroundColor = colors.background;
mCustomBackgroundColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(mCustomBackgroundColor, BlendModeCompat.MODULATE);
if (prefs.getBoolean(Settings.PREF_THEME_KEY_BORDERS, false)) {
mCustomKeyBackgroundColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(colors.keyBackground, BlendModeCompat.MODULATE);
mCustomFunctionalKeyBackgroundColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(colors.functionalKey, BlendModeCompat.MODULATE);
mCustomSpaceBarBackgroundColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(colors.spaceBar, BlendModeCompat.MODULATE);
} else {
// need to set color to background if key borders are disabled, or there will be ugly keys
mCustomKeyBackgroundColorFilter = mCustomBackgroundColorFilter;
mCustomFunctionalKeyBackgroundColorFilter = mCustomBackgroundColorFilter;
mCustomSpaceBarBackgroundColorFilter = mCustomBackgroundColorFilter;
}
mCustomHintTextColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(colors.keyHintText, BlendModeCompat.SRC_ATOP);
mCustomKeyTextColorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(mCustomKeyTextColor, BlendModeCompat.SRC_ATOP);
mColors = Settings.getColors(context.getResources().getConfiguration(), prefs);
mColors.createColorFilters(prefs.getBoolean(Settings.PREF_THEME_KEY_BORDERS, false));
mAddToPersonalDictionary = prefs.getBoolean(Settings.PREF_ADD_TO_PERSONAL_DICTIONARY, false);
mUseContactsDictionary = prefs.getBoolean(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY, false);

View file

@ -49,6 +49,7 @@ import org.dslul.openboard.inputmethod.latin.PunctuationSuggestions;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.SuggestedWords;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
@ -508,9 +509,9 @@ final class SuggestionStripLayoutHelper {
// {@link SuggestionStripView#onClick(View)}.
wordView.setTag(indexInSuggestedWords);
wordView.setText(getStyledSuggestedWord(suggestedWords, indexInSuggestedWords));
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
if (settingsValues.mCustomTheme)
wordView.setTextColor(settingsValues.mCustomKeyTextColor);
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (colors.isCustom)
wordView.setTextColor(colors.keyText);
else
wordView.setTextColor(getSuggestionTextColor(suggestedWords, indexInSuggestedWords));
if (SuggestionStripView.DBG) {

View file

@ -48,6 +48,7 @@ import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.SuggestedWords;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.Colors;
import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
@ -181,10 +182,10 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
mOtherKey.setImageDrawable(iconIncognito);
final SettingsValues settingsValues = Settings.getInstance().getCurrent();
if (settingsValues.mCustomTheme) {
mStripVisibilityGroup.mSuggestionStripView.getBackground().setColorFilter(settingsValues.mCustomBackgroundColorFilter);
mClipboardKey.setColorFilter(settingsValues.mCustomKeyTextColor);
final Colors colors = Settings.getInstance().getCurrent().mColors;
if (colors.isCustom) {
mStripVisibilityGroup.mSuggestionStripView.getBackground().setColorFilter(colors.backgroundFilter);
mClipboardKey.setColorFilter(colors.keyText);
}
}

View file

@ -1,20 +0,0 @@
package org.dslul.openboard.inputmethod.latin.utils;
import android.graphics.Color;
public class ColorUtils {
public static boolean isBrightColor(int color) {
if (android.R.color.transparent == color) {
return true;
}
// See http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
boolean bright = false;
int[] rgb = {Color.red(color), Color.green(color), Color.blue(color)};
int brightness = (int) Math.sqrt(rgb[0] * rgb[0] * .241 + rgb[1] * rgb[1] * .691 + rgb[2] * rgb[2] * .068);
if (brightness >= 210) {
bright = true;
}
return bright;
}
}