diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardView.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardView.java index 2f45c1991..a122ae6c7 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardView.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/KeyboardView.java @@ -44,6 +44,7 @@ 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; @@ -548,9 +549,22 @@ public class KeyboardView extends View { iconY = (keyHeight - iconHeight) / 2; // Align vertically center. } final int iconX = (keyWidth - iconWidth) / 2; // Align horizontally center. - if (mCustomTheme && key.getBackgroundType() != Key.BACKGROUND_TYPE_NORMAL && !key.isActionKey() && !key.isShift()) - // no color for shift (because of state indicator) and accent color keys (action and popup) - icon.setColorFilter(keyTextColorFilter); + if (mCustomTheme) { + 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(); + } else if (key.isShift()) { + if (keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED || keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED) + icon.setColorFilter(accentColorFilter); + else + icon.setColorFilter(keyTextColorFilter); + } else if (key.getBackgroundType() != Key.BACKGROUND_TYPE_NORMAL) { + icon.setColorFilter(keyTextColorFilter); + } + } drawIcon(canvas, icon, iconX, iconY, iconWidth, iconHeight); } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java index 38f320c37..3098fe5a9 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java @@ -25,7 +25,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.content.res.Resources; -import android.graphics.Color; import android.inputmethodservice.InputMethodService; import android.media.AudioManager; import android.os.Build; @@ -102,6 +101,7 @@ 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. @@ -2056,17 +2056,4 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen view.setSystemUiVisibility(mOriginalNavBarFlags); } - private 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; - } } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ColorUtils.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ColorUtils.java new file mode 100644 index 000000000..3d8ac1200 --- /dev/null +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ColorUtils.java @@ -0,0 +1,20 @@ +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; + } + +}