Skip to content

Commit

Permalink
identify keyboard icons by name only
Browse files Browse the repository at this point in the history
re-work KeyboardIconsSet
also fixes a recent regression where some icons are not displayed
  • Loading branch information
Helium314 committed May 12, 2024
1 parent 789b76b commit 3862d1e
Show file tree
Hide file tree
Showing 12 changed files with 158 additions and 265 deletions.
76 changes: 37 additions & 39 deletions app/src/main/java/helium314/keyboard/keyboard/Key.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@
import java.util.Arrays;
import java.util.Locale;

import static helium314.keyboard.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

Expand Down Expand Up @@ -80,7 +78,7 @@ public class Key implements Comparable<Key> {
public static final int LABEL_FLAGS_DISABLE_ADDITIONAL_POPUP_KEYS = 0x80000000;

/** Icon to display instead of a label. Icon takes precedence over a label */
private final int mIconId;
@NonNull private final String mIconName;

/** Width of the key, excluding the gap */
private final int mWidth;
Expand Down Expand Up @@ -156,29 +154,29 @@ private static final class OptionalAttributes {
public final String mOutputText;
public final int mAltCode;
/** Icon for disabled state */
public final int mDisabledIconId;
public final String mDisabledIconName;
/** The visual insets */
public final int mVisualInsetsLeft;
public final int mVisualInsetsRight;

private OptionalAttributes(final String outputText, final int altCode,
final int disabledIconId, final int visualInsetsLeft, final int visualInsetsRight) {
final String disabledIconName, final int visualInsetsLeft, final int visualInsetsRight) {
mOutputText = outputText;
mAltCode = altCode;
mDisabledIconId = disabledIconId;
mDisabledIconName = disabledIconName;
mVisualInsetsLeft = visualInsetsLeft;
mVisualInsetsRight = visualInsetsRight;
}

@Nullable
public static OptionalAttributes newInstance(final String outputText, final int altCode,
final int disabledIconId, final int visualInsetsLeft, final int visualInsetsRight) {
final String disabledIconName, final int visualInsetsLeft, final int visualInsetsRight) {
if (outputText == null && altCode == KeyCode.NOT_SPECIFIED
&& disabledIconId == ICON_UNDEFINED && visualInsetsLeft == 0
&& disabledIconName.equals(KeyboardIconsSet.NAME_UNDEFINED) && visualInsetsLeft == 0
&& visualInsetsRight == 0) {
return null;
}
return new OptionalAttributes(outputText, altCode, disabledIconId, visualInsetsLeft,
return new OptionalAttributes(outputText, altCode, disabledIconName, visualInsetsLeft,
visualInsetsRight);
}
}
Expand All @@ -193,7 +191,7 @@ public static OptionalAttributes newInstance(final String outputText, final int
/**
* Constructor for a key on <code>PopupKeyKeyboard</code> and on <code>MoreSuggestions</code>.
*/
public Key(@Nullable final String label, final int iconId, final int code,
public Key(@Nullable final String label, final String iconName, final int code,
@Nullable final String outputText, @Nullable final String hintLabel,
final int labelFlags, final int backgroundType, final int x, final int y,
final int width, final int height, final int horizontalGap, final int verticalGap) {
Expand All @@ -210,10 +208,10 @@ public Key(@Nullable final String label, final int iconId, final int code,
mPopupKeysColumnAndFlags = 0;
mLabel = label;
mOptionalAttributes = OptionalAttributes.newInstance(outputText, KeyCode.NOT_SPECIFIED,
ICON_UNDEFINED, 0 /* visualInsetsLeft */, 0 /* visualInsetsRight */);
KeyboardIconsSet.NAME_UNDEFINED, 0, 0);
mCode = code;
mEnabled = (code != KeyCode.NOT_SPECIFIED);
mIconId = iconId;
mIconName = iconName;
// Horizontal gap is divided equally to both sides of the key.
mX = x + mHorizontalGap / 2;
mY = y;
Expand All @@ -238,7 +236,7 @@ protected Key(@NonNull final Key key, @Nullable final PopupKeySpec[] popupKeys,
mLabel = key.mLabel;
mHintLabel = labelHint;
mLabelFlags = key.mLabelFlags;
mIconId = key.mIconId;
mIconName = key.mIconName;
mWidth = key.mWidth;
mHeight = key.mHeight;
mHorizontalGap = key.mHorizontalGap;
Expand Down Expand Up @@ -266,7 +264,7 @@ public Key(@NonNull final Key key, @Nullable final PopupKeySpec[] popupKeys,
mLabel = outputText == null ? StringUtils.newSingleCodePointString(code) : outputText;
mHintLabel = labelHint;
mLabelFlags = key.mLabelFlags;
mIconId = key.mIconId;
mIconName = key.mIconName;
mWidth = key.mWidth;
mHeight = key.mHeight;
mHorizontalGap = key.mHorizontalGap;
Expand All @@ -279,7 +277,8 @@ public Key(@NonNull final Key key, @Nullable final PopupKeySpec[] popupKeys,
mBackgroundType = backgroundType;
mActionFlags = key.mActionFlags;
mKeyVisualAttributes = key.mKeyVisualAttributes;
mOptionalAttributes = outputText == null ? null : Key.OptionalAttributes.newInstance(outputText, KeyCode.NOT_SPECIFIED, ICON_UNDEFINED, 0, 0);
mOptionalAttributes = outputText == null ? null
: Key.OptionalAttributes.newInstance(outputText, KeyCode.NOT_SPECIFIED, KeyboardIconsSet.NAME_UNDEFINED, 0, 0);
mHashCode = key.mHashCode;
// Key state.
mPressed = key.mPressed;
Expand All @@ -293,7 +292,7 @@ private Key(KeyParams keyParams) {
mLabel = keyParams.mLabel;
mHintLabel = keyParams.mHintLabel;
mLabelFlags = keyParams.mLabelFlags;
mIconId = keyParams.mIconId;
mIconName = keyParams.mIconName;
mPopupKeys = keyParams.mPopupKeys;
mPopupKeysColumnAndFlags = keyParams.mPopupKeysColumnAndFlags;
mBackgroundType = keyParams.mBackgroundType;
Expand Down Expand Up @@ -328,7 +327,7 @@ private Key(@NonNull final Key key, @Nullable final PopupKeySpec[] popupKeys) {
mLabel = key.mLabel;
mHintLabel = key.mHintLabel;
mLabelFlags = key.mLabelFlags;
mIconId = key.mIconId;
mIconName = key.mIconName;
mWidth = key.mWidth;
mHeight = key.mHeight;
mHorizontalGap = key.mHorizontalGap;
Expand Down Expand Up @@ -378,7 +377,7 @@ private static int computeHashCode(final Key key) {
key.mCode,
key.mLabel,
key.mHintLabel,
key.mIconId,
key.mIconName,
key.mBackgroundType,
Arrays.hashCode(key.mPopupKeys),
key.getOutputText(),
Expand All @@ -405,7 +404,7 @@ private boolean equalsInternal(final Key o) {
&& o.mCode == mCode
&& TextUtils.equals(o.mLabel, mLabel)
&& TextUtils.equals(o.mHintLabel, mHintLabel)
&& o.mIconId == mIconId
&& o.mIconName == mIconName
&& o.mBackgroundType == mBackgroundType
&& Arrays.equals(o.mPopupKeys, mPopupKeys)
&& TextUtils.equals(o.getOutputText(), getOutputText())
Expand Down Expand Up @@ -444,9 +443,9 @@ public String toShortString() {
}

public String toLongString() {
final int iconId = getIconId();
final String topVisual = (iconId == KeyboardIconsSet.ICON_UNDEFINED)
? KeyboardIconsSet.PREFIX_ICON + KeyboardIconsSet.getIconName(iconId) : getLabel();
final String iconName = getIconName();
final String topVisual = (iconName.equals(KeyboardIconsSet.NAME_UNDEFINED))
? KeyboardIconsSet.PREFIX_ICON + iconName : getLabel();
final String hintLabel = getHintLabel();
final String visual = (hintLabel == null) ? topVisual : topVisual + "^" + hintLabel;
return toString() + " " + visual + "/" + backgroundName(mBackgroundType);
Expand Down Expand Up @@ -702,16 +701,15 @@ public final int getAltCode() {
return (attrs != null) ? attrs.mAltCode : KeyCode.NOT_SPECIFIED;
}

public int getIconId() {
return mIconId;
public String getIconName() {
return mIconName;
}

@Nullable
public Drawable getIcon(final KeyboardIconsSet iconSet, final int alpha) {
final OptionalAttributes attrs = mOptionalAttributes;
final int disabledIconId = (attrs != null) ? attrs.mDisabledIconId : ICON_UNDEFINED;
final int iconId = mEnabled ? getIconId() : disabledIconId;
final Drawable icon = iconSet.getIconDrawable(iconId);
final String iconName = mEnabled ? getIconName() : ((attrs != null) ? attrs.mDisabledIconName : KeyboardIconsSet.NAME_UNDEFINED);
final Drawable icon = iconSet.getIconDrawable(iconName);
if (icon != null) {
icon.setAlpha(alpha);
}
Expand All @@ -720,7 +718,7 @@ public Drawable getIcon(final KeyboardIconsSet iconSet, final int alpha) {

@Nullable
public Drawable getPreviewIcon(final KeyboardIconsSet iconSet) {
return iconSet.getIconDrawable(getIconId());
return iconSet.getIconDrawable(getIconName());
}

/**
Expand Down Expand Up @@ -902,7 +900,7 @@ public int[] getState(final boolean pressed) {
public final Drawable selectBackgroundDrawable(@NonNull final Drawable keyBackground,
@NonNull final Drawable functionalKeyBackground,
@NonNull final Drawable spacebarBackground,
@NonNull final Drawable actionKeyBackground) {
@NonNull final Drawable actionKeyBackground) {
final Drawable background;
if (isAccentColored()) {
background = actionKeyBackground;
Expand All @@ -920,7 +918,7 @@ public final Drawable selectBackgroundDrawable(@NonNull final Drawable keyBackgr

public final boolean isAccentColored() {
if (hasActionKeyBackground()) return true;
final String iconName = KeyboardIconsSet.getIconName(getIconId());
final String iconName = getIconName();
return iconName.equals(KeyboardIconsSet.NAME_NEXT_KEY)
|| iconName.equals(KeyboardIconsSet.NAME_PREVIOUS_KEY)
|| iconName.equals(KeyboardIconsSet.NAME_CLIPBOARD_ACTION_KEY)
Expand All @@ -943,8 +941,8 @@ private Spacer(KeyParams keyParams) {
*/
protected Spacer(final KeyboardParams params, final int x, final int y, final int width,
final int height) {
super(null /* label */, ICON_UNDEFINED, KeyCode.NOT_SPECIFIED, null /* outputText */,
null /* hintLabel */, 0 /* labelFlags */, BACKGROUND_TYPE_EMPTY, x, y, width,
super(null, KeyboardIconsSet.NAME_UNDEFINED, KeyCode.NOT_SPECIFIED, null,
null, 0, BACKGROUND_TYPE_EMPTY, x, y, width,
height, params.mHorizontalGap, params.mVerticalGap);
}
}
Expand All @@ -968,7 +966,7 @@ public static class KeyParams {
@Nullable public String mLabel;
@Nullable public final String mHintLabel;
public final int mLabelFlags;
public final int mIconId;
@NonNull public final String mIconName;
@Nullable public PopupKeySpec[] mPopupKeys;
public final int mPopupKeysColumnAndFlags;
public int mBackgroundType;
Expand Down Expand Up @@ -1062,7 +1060,7 @@ public KeyParams(
mLabelFlags = labelFlags;
mWidth = width;
mHeight = params.mDefaultRowHeight;
mIconId = KeySpecParser.getIconId(keySpec);
mIconName = KeySpecParser.getIconName(keySpec);

final boolean needsToUpcase = needsToUpcase(mLabelFlags, params.mId.mElementId);
final Locale localeForUpcasing = params.mId.getLocale();
Expand Down Expand Up @@ -1167,7 +1165,7 @@ public KeyParams(
: altCodeInAttr;
mOptionalAttributes = OptionalAttributes.newInstance(outputText, altCode,
// disabled icon only ever for old version of shortcut key, visual insets can be replaced with spacer
KeyboardIconsSet.ICON_UNDEFINED, 0, 0);
KeyboardIconsSet.NAME_UNDEFINED, 0, 0);
// KeyVisualAttributes for a key essentially are what the theme has, but on a per-key base
// could be used e.g. for having a color gradient on key color
mKeyVisualAttributes = null;
Expand Down Expand Up @@ -1207,11 +1205,11 @@ public KeyParams(@Nullable final String label, final int code, @Nullable final S

mLabel = label;
mOptionalAttributes = code == KeyCode.MULTIPLE_CODE_POINTS
? OptionalAttributes.newInstance(label, KeyCode.NOT_SPECIFIED, ICON_UNDEFINED, 0, 0)
? OptionalAttributes.newInstance(label, KeyCode.NOT_SPECIFIED, KeyboardIconsSet.NAME_UNDEFINED, 0, 0)
: null;
mCode = code;
mEnabled = (code != KeyCode.NOT_SPECIFIED);
mIconId = KeyboardIconsSet.ICON_UNDEFINED;
mIconName = KeyboardIconsSet.NAME_UNDEFINED;
mKeyVisualAttributes = null;
}

Expand All @@ -1225,7 +1223,7 @@ private KeyParams(final KeyboardParams params) {
mHintLabel = null;
mKeyVisualAttributes = null;
mOptionalAttributes = null;
mIconId = KeyboardIconsSet.ICON_UNDEFINED;
mIconName = KeyboardIconsSet.NAME_UNDEFINED;
mBackgroundType = BACKGROUND_TYPE_NORMAL;
mActionFlags = ACTION_FLAGS_NO_KEY_PREVIEW;
mPopupKeys = null;
Expand All @@ -1247,7 +1245,7 @@ public KeyParams(final KeyParams keyParams) {
mLabel = keyParams.mLabel;
mHintLabel = keyParams.mHintLabel;
mLabelFlags = keyParams.mLabelFlags;
mIconId = keyParams.mIconId;
mIconName = keyParams.mIconName;
mAbsoluteWidth = keyParams.mAbsoluteWidth;
mAbsoluteHeight = keyParams.mAbsoluteHeight;
mPopupKeys = keyParams.mPopupKeys;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import helium314.keyboard.latin.settings.Settings;
import helium314.keyboard.latin.suggestions.MoreSuggestions;
import helium314.keyboard.latin.suggestions.PopupSuggestionsView;
import helium314.keyboard.latin.utils.Log;
import helium314.keyboard.latin.utils.TypefaceUtils;

import java.util.HashSet;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,9 @@ class ClipboardHistoryView @JvmOverloads constructor(
}
}

private fun setupDeleteKey(key: ImageButton, iconId: Int) {
private fun setupDeleteKey(key: ImageButton, icon: Drawable?) {
key.apply {
setImageResource(iconId)
setImageDrawable(icon)
Settings.getInstance().current.mColors.setBackground(this, ColorType.FUNCTIONAL_KEY_BACKGROUND)
Settings.getInstance().current.mColors.setColor(this, ColorType.KEY_ICON)
}
Expand Down Expand Up @@ -189,7 +189,7 @@ class ClipboardHistoryView @JvmOverloads constructor(
val params = KeyDrawParams()
params.updateParams(clipboardLayoutParams.actionBarContentHeight, keyVisualAttr)
setupAlphabetKey(alphabetKey, switchToAlphaLabel, params)
setupDeleteKey(deleteKey, iconSet.getIconResourceId(KeyboardIconsSet.NAME_DELETE_KEY))
setupDeleteKey(deleteKey, iconSet.getIconDrawable(KeyboardIconsSet.NAME_DELETE_KEY))
setupClipKey(params)

placeholderView.apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -360,10 +360,7 @@ public void startEmojiPalettes(final String switchToAlphaLabel,
final KeyVisualAttributes keyVisualAttr,
final KeyboardIconsSet iconSet) {
initialize();
final int deleteIconResId = iconSet.getIconResourceId(KeyboardIconsSet.NAME_DELETE_KEY);
if (deleteIconResId != 0) {
mDeleteKey.setImageResource(deleteIconResId);
}
mDeleteKey.setImageDrawable(iconSet.getIconDrawable(KeyboardIconsSet.NAME_DELETE_KEY));
mEmojiLayoutParams.setActionBarProperties(findViewById(R.id.action_bar));
final KeyDrawParams params = new KeyDrawParams();
params.updateParams(mEmojiLayoutParams.getActionBarHeight(), keyVisualAttr);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,9 @@ public KeyPreviewView(final Context context, final AttributeSet attrs, final int
setGravity(Gravity.CENTER);
}

public void setPreviewVisual(final Key key, final KeyboardIconsSet iconsSet,
final KeyDrawParams drawParams) {
public void setPreviewVisual(final Key key, final KeyboardIconsSet iconsSet, final KeyDrawParams drawParams) {
// What we show as preview should match what we show on a key top in onDraw().
final int iconId = key.getIconId();
if (iconId != KeyboardIconsSet.ICON_UNDEFINED) {
if (!key.getIconName().equals(KeyboardIconsSet.NAME_UNDEFINED)) {
setCompoundDrawables(null, null, null, key.getPreviewIcon(iconsSet));
setText(null);
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,18 +221,17 @@ public static int parseCode(@Nullable final String text, final int defaultCode)
return defaultCode;
}

public static int getIconId(@Nullable final String keySpec) {
@NonNull
public static String getIconName(@Nullable final String keySpec) {
if (keySpec == null) {
// TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory.
return KeyboardIconsSet.ICON_UNDEFINED;
return KeyboardIconsSet.NAME_UNDEFINED;
}
if (!hasIcon(keySpec)) {
return KeyboardIconsSet.ICON_UNDEFINED;
return KeyboardIconsSet.NAME_UNDEFINED;
}
final int labelEnd = indexOfLabelEnd(keySpec);
final String iconName = getBeforeLabelEnd(keySpec, labelEnd)
.substring(KeyboardIconsSet.PREFIX_ICON.length());
return KeyboardIconsSet.getIconId(iconName);
return getBeforeLabelEnd(keySpec, labelEnd).substring(KeyboardIconsSet.PREFIX_ICON.length()).intern();
}

public static final class KeySpecParserError extends RuntimeException {
Expand Down
Loading

0 comments on commit 3862d1e

Please sign in to comment.