diff --git a/java/res/drawable/delete.xml b/java/res/drawable/delete.xml
new file mode 100644
index 000000000..e58b167c6
--- /dev/null
+++ b/java/res/drawable/delete.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/java/res/drawable/globe.xml b/java/res/drawable/globe.xml
new file mode 100644
index 000000000..308109759
--- /dev/null
+++ b/java/res/drawable/globe.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/java/res/drawable/shift.xml b/java/res/drawable/shift.xml
new file mode 100644
index 000000000..1a630eb5a
--- /dev/null
+++ b/java/res/drawable/shift.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/java/res/drawable/shiftshifted.xml b/java/res/drawable/shiftshifted.xml
new file mode 100644
index 000000000..e4ce8af2e
--- /dev/null
+++ b/java/res/drawable/shiftshifted.xml
@@ -0,0 +1,18 @@
+
+
+
+
diff --git a/java/src/org/futo/inputmethod/keyboard/Key.java b/java/src/org/futo/inputmethod/keyboard/Key.java
index 1406c8904..683e60245 100644
--- a/java/src/org/futo/inputmethod/keyboard/Key.java
+++ b/java/src/org/futo/inputmethod/keyboard/Key.java
@@ -402,7 +402,7 @@ public class Key implements Comparable {
: altCodeInAttr;
mOptionalAttributes = OptionalAttributes.newInstance(outputText, altCode,
disabledIconId, visualInsetsLeft, visualInsetsRight);
- mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr);
+ mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr, null);
mHashCode = computeHashCode(this);
}
diff --git a/java/src/org/futo/inputmethod/keyboard/KeyboardView.java b/java/src/org/futo/inputmethod/keyboard/KeyboardView.java
index d9c0e2cac..2cc9f9619 100644
--- a/java/src/org/futo/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/org/futo/inputmethod/keyboard/KeyboardView.java
@@ -175,7 +175,7 @@ public class KeyboardView extends View {
final TypedArray keyAttr = context.obtainStyledAttributes(attrs,
R.styleable.Keyboard_Key, defStyle, R.style.KeyboardView);
mDefaultKeyLabelFlags = keyAttr.getInt(R.styleable.Keyboard_Key_keyLabelFlags, 0);
- mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr);
+ mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr, mDrawableProvider);
keyAttr.recycle();
mPaint.setAntiAlias(true);
diff --git a/java/src/org/futo/inputmethod/keyboard/MainKeyboardView.java b/java/src/org/futo/inputmethod/keyboard/MainKeyboardView.java
index 3b6d8dd62..a8cf07672 100644
--- a/java/src/org/futo/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/org/futo/inputmethod/keyboard/MainKeyboardView.java
@@ -51,6 +51,7 @@ import org.futo.inputmethod.keyboard.internal.MoreKeySpec;
import org.futo.inputmethod.keyboard.internal.NonDistinctMultitouchHelper;
import org.futo.inputmethod.keyboard.internal.SlidingKeyInputDrawingPreview;
import org.futo.inputmethod.keyboard.internal.TimerHandler;
+import org.futo.inputmethod.latin.KeyboardDrawableProvider;
import org.futo.inputmethod.latin.R;
import org.futo.inputmethod.latin.RichInputMethodSubtype;
import org.futo.inputmethod.latin.SuggestedWords;
@@ -214,8 +215,10 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy
mBackgroundDimAlphaPaint.setAlpha(backgroundDimAlpha);
mLanguageOnSpacebarTextRatio = mainKeyboardViewAttr.getFraction(
R.styleable.MainKeyboardView_languageOnSpacebarTextRatio, 1, 1, 1.0f);
- mLanguageOnSpacebarTextColor = mainKeyboardViewAttr.getColor(
- R.styleable.MainKeyboardView_languageOnSpacebarTextColor, 0);
+ mLanguageOnSpacebarTextColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.MainKeyboardView_languageOnSpacebarTextColor, 0,
+ mainKeyboardViewAttr, mDrawableProvider
+ );
mLanguageOnSpacebarTextShadowRadius = mainKeyboardViewAttr.getFloat(
R.styleable.MainKeyboardView_languageOnSpacebarTextShadowRadius,
LANGUAGE_ON_SPACEBAR_TEXT_SHADOW_RADIUS_DISABLED);
diff --git a/java/src/org/futo/inputmethod/keyboard/emoji/EmojiPalettesView.java b/java/src/org/futo/inputmethod/keyboard/emoji/EmojiPalettesView.java
index 24b57d498..c9368fe7d 100644
--- a/java/src/org/futo/inputmethod/keyboard/emoji/EmojiPalettesView.java
+++ b/java/src/org/futo/inputmethod/keyboard/emoji/EmojiPalettesView.java
@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
+import android.graphics.drawable.Drawable;
import android.preference.PreferenceManager;
import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet;
@@ -374,14 +375,13 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange
public void startEmojiPalettes(final String switchToAlphaLabel,
final KeyVisualAttributes keyVisualAttr,
final KeyboardIconsSet iconSet) {
- final int deleteIconResId = iconSet.getIconResourceId(KeyboardIconsSet.NAME_DELETE_KEY);
- if (deleteIconResId != 0) {
- mDeleteKey.setImageResource(deleteIconResId);
+ final Drawable deleteDrawable = iconSet.getIconDrawable(KeyboardIconsSet.getIconId(KeyboardIconsSet.NAME_DELETE_KEY));
+ if (deleteDrawable != null) {
+ mDeleteKey.setBackground(deleteDrawable); //?
}
- final int spacebarResId = iconSet.getIconResourceId(KeyboardIconsSet.NAME_SPACE_KEY);
- if (spacebarResId != 0) {
- // TODO: Remove this workaround to place the spacebar icon.
- mSpacebarIcon.setBackgroundResource(spacebarResId);
+ final Drawable spacebarDrawable = iconSet.getIconDrawable(KeyboardIconsSet.getIconId(KeyboardIconsSet.NAME_SPACE_KEY));
+ if (spacebarDrawable != null) {
+ mSpacebarIcon.setBackground(spacebarDrawable);
}
final KeyDrawParams params = new KeyDrawParams();
params.updateParams(mEmojiLayoutParams.getActionBarHeight(), keyVisualAttr);
diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyVisualAttributes.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyVisualAttributes.java
index 021b38981..10e13e2c8 100644
--- a/java/src/org/futo/inputmethod/keyboard/internal/KeyVisualAttributes.java
+++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyVisualAttributes.java
@@ -20,6 +20,7 @@ import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.SparseIntArray;
+import org.futo.inputmethod.latin.KeyboardDrawableProvider;
import org.futo.inputmethod.latin.R;
import org.futo.inputmethod.latin.utils.ResourceUtils;
@@ -86,19 +87,19 @@ public final class KeyVisualAttributes {
}
@Nullable
- public static KeyVisualAttributes newInstance(@Nonnull final TypedArray keyAttr) {
+ public static KeyVisualAttributes newInstance(@Nonnull final TypedArray keyAttr, @Nullable final KeyboardDrawableProvider provider) {
final int indexCount = keyAttr.getIndexCount();
for (int i = 0; i < indexCount; i++) {
final int attrId = keyAttr.getIndex(i);
if (sVisualAttributeIds.get(attrId, ATTR_NOT_FOUND) == ATTR_NOT_FOUND) {
continue;
}
- return new KeyVisualAttributes(keyAttr);
+ return new KeyVisualAttributes(keyAttr, provider);
}
return null;
}
- private KeyVisualAttributes(@Nonnull final TypedArray keyAttr) {
+ private KeyVisualAttributes(@Nonnull final TypedArray keyAttr, @Nullable final KeyboardDrawableProvider provider) {
if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyTypeface)) {
mTypeface = Typeface.defaultFromStyle(
keyAttr.getInt(R.styleable.Keyboard_Key_keyTypeface, Typeface.NORMAL));
@@ -125,18 +126,24 @@ public final class KeyVisualAttributes {
mPreviewTextRatio = ResourceUtils.getFraction(keyAttr,
R.styleable.Keyboard_Key_keyPreviewTextRatio);
- mTextColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyTextColor, 0);
- mTextInactivatedColor = keyAttr.getColor(
- R.styleable.Keyboard_Key_keyTextInactivatedColor, 0);
- mTextShadowColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyTextShadowColor, 0);
- mFunctionalTextColor = keyAttr.getColor(R.styleable.Keyboard_Key_functionalTextColor, 0);
- mHintLetterColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLetterColor, 0);
- mHintLabelColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLabelColor, 0);
- mShiftedLetterHintInactivatedColor = keyAttr.getColor(
- R.styleable.Keyboard_Key_keyShiftedLetterHintInactivatedColor, 0);
- mShiftedLetterHintActivatedColor = keyAttr.getColor(
- R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor, 0);
- mPreviewTextColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyPreviewTextColor, 0);
+ mTextColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_keyTextColor, 0, keyAttr, provider);
+ mTextInactivatedColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_keyTextInactivatedColor, 0, keyAttr, provider);
+ mTextShadowColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_keyTextShadowColor, 0, keyAttr, provider);
+ mFunctionalTextColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_functionalTextColor, 0, keyAttr, provider);
+ mHintLetterColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_keyHintLetterColor, 0, keyAttr, provider);
+ mHintLabelColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_keyHintLabelColor, 0, keyAttr, provider);
+ mShiftedLetterHintInactivatedColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_keyShiftedLetterHintInactivatedColor, 0, keyAttr, provider);
+ mShiftedLetterHintActivatedColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor, 0, keyAttr, provider);
+ mPreviewTextColor = KeyboardDrawableProvider.Companion.getColorOrDefault(
+ R.styleable.Keyboard_Key_keyPreviewTextColor, 0, keyAttr, provider);
mHintLabelVerticalAdjustment = ResourceUtils.getFraction(keyAttr,
R.styleable.Keyboard_Key_keyHintLabelVerticalAdjustment, 0.0f);
diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardBuilder.java
index 7aa1e9ae4..1c01309d6 100644
--- a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -26,12 +26,15 @@ import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.util.Xml;
+import android.view.ContextThemeWrapper;
import org.futo.inputmethod.annotations.UsedForTesting;
import org.futo.inputmethod.keyboard.Key;
import org.futo.inputmethod.keyboard.Keyboard;
import org.futo.inputmethod.keyboard.KeyboardId;
import org.futo.inputmethod.keyboard.KeyboardTheme;
+import org.futo.inputmethod.latin.KeyboardDrawableProvider;
+import org.futo.inputmethod.latin.KeyboardDrawableProviderOwner;
import org.futo.inputmethod.latin.R;
import org.futo.inputmethod.latin.common.Constants;
import org.futo.inputmethod.latin.common.StringUtils;
@@ -150,8 +153,19 @@ public class KeyboardBuilder {
private boolean mTopEdge;
private Key mRightEdgeKey = null;
+ private KeyboardDrawableProvider mProvider = null;
+
public KeyboardBuilder(final Context context, @Nonnull final KP params) {
mContext = context;
+ if(mContext instanceof KeyboardDrawableProviderOwner) {
+ mProvider = ((KeyboardDrawableProviderOwner) mContext).getDrawableProvider();
+ }else if(mContext instanceof ContextThemeWrapper) {
+ Context baseContext = ((ContextThemeWrapper) mContext).getBaseContext();
+ if(baseContext instanceof KeyboardDrawableProviderOwner) {
+ mProvider = ((KeyboardDrawableProviderOwner) baseContext).getDrawableProvider();
+ }
+ }
+
final Resources res = context.getResources();
mResources = res;
@@ -272,7 +286,7 @@ public class KeyboardBuilder {
params.mDefaultRowHeight = (int)ResourceUtils.getDimensionOrFraction(keyboardAttr,
R.styleable.Keyboard_rowHeight, baseHeight, baseHeight / DEFAULT_KEYBOARD_ROWS);
- params.mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr);
+ params.mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr, mProvider);
params.mMoreKeysTemplate = keyboardAttr.getResourceId(
R.styleable.Keyboard_moreKeysTemplate, 0);
@@ -280,7 +294,7 @@ public class KeyboardBuilder {
R.styleable.Keyboard_Key_maxMoreKeysColumn, 5);
params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0);
- params.mIconsSet.loadIcons(keyboardAttr);
+ params.mIconsSet.loadIcons(keyboardAttr, mProvider);
params.mTextsSet.setLocale(params.mId.getLocale(), mContext);
final int resourceId = keyboardAttr.getResourceId(
diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardIconsSet.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardIconsSet.java
index f41b9e810..92443a579 100644
--- a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardIconsSet.java
+++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardIconsSet.java
@@ -22,6 +22,7 @@ import android.graphics.drawable.Drawable;
import android.util.Log;
import android.util.SparseIntArray;
+import org.futo.inputmethod.latin.KeyboardDrawableProvider;
import org.futo.inputmethod.latin.R;
import java.util.HashMap;
@@ -92,7 +93,6 @@ public final class KeyboardIconsSet {
private static int NUM_ICONS = NAMES_AND_ATTR_IDS.length / 2;
private static final String[] ICON_NAMES = new String[NUM_ICONS];
private final Drawable[] mIcons = new Drawable[NUM_ICONS];
- private final int[] mIconResourceIds = new int[NUM_ICONS];
static {
int iconId = ICON_UNDEFINED;
@@ -108,16 +108,15 @@ public final class KeyboardIconsSet {
}
}
- public void loadIcons(final TypedArray keyboardAttrs) {
+ public void loadIcons(final TypedArray keyboardAttrs, @Nullable KeyboardDrawableProvider provider) {
final int size = ATTR_ID_TO_ICON_ID.size();
for (int index = 0; index < size; index++) {
final int attrId = ATTR_ID_TO_ICON_ID.keyAt(index);
try {
- final Drawable icon = keyboardAttrs.getDrawable(attrId);
+ final Drawable icon = KeyboardDrawableProvider.Companion.getDrawableOrDefault(attrId, keyboardAttrs, provider);
setDefaultBounds(icon);
final Integer iconId = ATTR_ID_TO_ICON_ID.get(attrId);
mIcons[iconId] = icon;
- mIconResourceIds[iconId] = keyboardAttrs.getResourceId(attrId, 0);
} catch (Resources.NotFoundException e) {
Log.w(TAG, "Drawable resource for icon #"
+ keyboardAttrs.getResources().getResourceEntryName(attrId)
@@ -143,14 +142,6 @@ public final class KeyboardIconsSet {
throw new RuntimeException("unknown icon name: " + name);
}
- public int getIconResourceId(final String name) {
- final int iconId = getIconId(name);
- if (isValidIconId(iconId)) {
- return mIconResourceIds[iconId];
- }
- throw new RuntimeException("unknown icon name: " + name);
- }
-
@Nullable
public Drawable getIconDrawable(final int iconId) {
if (isValidIconId(iconId)) {
diff --git a/java/src/org/futo/inputmethod/latin/LatinIME.kt b/java/src/org/futo/inputmethod/latin/LatinIME.kt
index 5c729fa12..68c1fc9e1 100644
--- a/java/src/org/futo/inputmethod/latin/LatinIME.kt
+++ b/java/src/org/futo/inputmethod/latin/LatinIME.kt
@@ -2,6 +2,7 @@ package org.futo.inputmethod.latin
import android.content.Context
import android.content.res.Configuration
+import android.content.res.TypedArray
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
@@ -9,10 +10,9 @@ import android.graphics.drawable.InsetDrawable
import android.graphics.drawable.LayerDrawable
import android.graphics.drawable.ShapeDrawable
import android.graphics.drawable.StateListDrawable
-import android.graphics.drawable.shapes.OvalShape
import android.graphics.drawable.shapes.RoundRectShape
-import android.graphics.drawable.shapes.Shape
import android.inputmethodservice.InputMethodService
+import android.util.AttributeSet
import android.util.TypedValue
import android.view.KeyEvent
import android.view.View
@@ -21,13 +21,13 @@ import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.view.inputmethod.InputMethodSubtype
import androidx.annotation.ColorInt
+import androidx.appcompat.content.res.AppCompatResources
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.key
import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.ComposeView
@@ -65,6 +65,22 @@ interface KeyboardDrawableProvider {
val moreKeysKeyboardBackground: Drawable
val popupKey: Drawable
+
+ @ColorInt
+ fun getColor(i: Int): Int?
+
+ fun getDrawable(i: Int): Drawable?
+
+ companion object {
+ @ColorInt
+ fun getColorOrDefault(i: Int, @ColorInt default: Int, keyAttr: TypedArray, provider: KeyboardDrawableProvider?): Int {
+ return (provider?.getColor(i)) ?: keyAttr.getColor(i, default)
+ }
+
+ fun getDrawableOrDefault(i: Int, keyAttr: TypedArray, provider: KeyboardDrawableProvider?): Drawable? {
+ return (provider?.getDrawable(i)) ?: keyAttr.getDrawable(i)
+ }
+ }
}
// TODO: Expand the number of drawables this provides so it covers the full theme, and
@@ -81,6 +97,17 @@ class BasicThemeProvider(val context: Context) : KeyboardDrawableProvider {
override val moreKeysKeyboardBackground: Drawable
override val popupKey: Drawable
+ private val colors: HashMap = HashMap()
+ override fun getColor(i: Int): Int? {
+ return colors[i]
+ }
+
+
+ private val drawables: HashMap = HashMap()
+ override fun getDrawable(i: Int): Drawable? {
+ return drawables[i]
+ }
+
private fun dp(dp: Dp): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
@@ -130,6 +157,23 @@ class BasicThemeProvider(val context: Context) : KeyboardDrawableProvider {
val transparent = Color.TRANSPARENT
+ colors[R.styleable.Keyboard_Key_keyTextColor] = DarkColorScheme.onBackground.toArgb()
+ colors[R.styleable.Keyboard_Key_keyTextInactivatedColor] = DarkColorScheme.onBackground.copy(alpha = 0.5f).toArgb()
+ colors[R.styleable.Keyboard_Key_keyTextShadowColor] = 0
+ colors[R.styleable.Keyboard_Key_functionalTextColor] = DarkColorScheme.onBackground.toArgb()
+ colors[R.styleable.Keyboard_Key_keyHintLetterColor] = DarkColorScheme.onBackground.copy(alpha = 0.5f).toArgb()
+ colors[R.styleable.Keyboard_Key_keyHintLabelColor] = DarkColorScheme.onBackground.copy(alpha = 0.5f).toArgb()
+ colors[R.styleable.Keyboard_Key_keyShiftedLetterHintInactivatedColor] = DarkColorScheme.onBackground.copy(alpha = 0.5f).toArgb()
+ colors[R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor] = DarkColorScheme.onBackground.copy(alpha = 0.5f).toArgb()
+ colors[R.styleable.Keyboard_Key_keyPreviewTextColor] = DarkColorScheme.onBackground.toArgb()
+ colors[R.styleable.MainKeyboardView_languageOnSpacebarTextColor] = DarkColorScheme.onBackground.copy(alpha = 0.5f).toArgb()
+
+ drawables[R.styleable.Keyboard_iconDeleteKey] = AppCompatResources.getDrawable(context, R.drawable.delete)!!
+ drawables[R.styleable.Keyboard_iconLanguageSwitchKey] = AppCompatResources.getDrawable(context, R.drawable.globe)!!
+
+ drawables[R.styleable.Keyboard_iconShiftKey] = AppCompatResources.getDrawable(context, R.drawable.shift)!!
+ drawables[R.styleable.Keyboard_iconShiftKeyShifted] = AppCompatResources.getDrawable(context, R.drawable.shiftshifted)!!
+
primaryKeyboardColor = background
keyboardBackground = LayerDrawable(arrayOf(