diff --git a/java/res/drawable/icon_spellcheck.xml b/java/res/drawable/icon_spellcheck.xml new file mode 100644 index 000000000..926eb62cc --- /dev/null +++ b/java/res/drawable/icon_spellcheck.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/java/res/drawable/keyboard.xml b/java/res/drawable/keyboard.xml new file mode 100644 index 000000000..1bea34220 --- /dev/null +++ b/java/res/drawable/keyboard.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/drawable/swipe_icon.xml b/java/res/drawable/swipe_icon.xml new file mode 100644 index 000000000..6343e750f --- /dev/null +++ b/java/res/drawable/swipe_icon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/java/res/drawable/text_prediction.xml b/java/res/drawable/text_prediction.xml new file mode 100644 index 000000000..fd1523df2 --- /dev/null +++ b/java/res/drawable/text_prediction.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/res/drawable/themes.xml b/java/res/drawable/themes.xml new file mode 100644 index 000000000..c1509e132 --- /dev/null +++ b/java/res/drawable/themes.xml @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml index e7f343850..66b32eaf6 100644 --- a/java/res/xml/key_styles_common.xml +++ b/java/res/xml/key_styles_common.xml @@ -42,7 +42,7 @@ diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml index 6e998d648..71727c864 100644 --- a/java/res/xml/key_styles_enter.xml +++ b/java/res/xml/key_styles_enter.xml @@ -217,7 +217,7 @@ @@ -227,7 +227,7 @@ diff --git a/java/res/xml/rowkeys_qwerty1_left5.xml b/java/res/xml/rowkeys_qwerty1_left5.xml index 4258e6f3b..cdd9c071b 100644 --- a/java/res/xml/rowkeys_qwerty1_left5.xml +++ b/java/res/xml/rowkeys_qwerty1_left5.xml @@ -23,27 +23,17 @@ > + latin:moreKeys="!text/morekeys_q,!text/qwertysyms_q,!text/number_1,!text/actions_q" /> + latin:moreKeys="!text/morekeys_w,!text/qwertysyms_w,!text/number_2,!text/actions_w" /> + latin:moreKeys="!text/morekeys_e,!text/morekeys_misc_e,!text/qwertysyms_e,!text/number_3,!text/actions_e" /> + latin:moreKeys="!text/morekeys_r,!text/qwertysyms_r,!text/number_4,!text/actions_r" /> + latin:moreKeys="!text/morekeys_t,!text/qwertysyms_t,!text/number_5,!text/actions_t" /> diff --git a/java/res/xml/rowkeys_qwerty1_right5.xml b/java/res/xml/rowkeys_qwerty1_right5.xml index 2e4068af8..30dd5c4fa 100644 --- a/java/res/xml/rowkeys_qwerty1_right5.xml +++ b/java/res/xml/rowkeys_qwerty1_right5.xml @@ -23,26 +23,17 @@ > + latin:moreKeys="!text/morekeys_y,!text/qwertysyms_y,!text/number_6,!text/actions_y" /> + latin:moreKeys="!text/morekeys_u,!text/morekeys_misc_u,!text/qwertysyms_u,!text/number_7,!text/actions_u" /> + latin:moreKeys="!text/morekeys_i,!text/morekeys_misc_i,!text/qwertysyms_i,!text/number_8,!text/actions_i" /> + latin:moreKeys="!text/morekeys_o,!text/morekeys_misc_o,!text/qwertysyms_o,!text/number_9,!text/actions_o" /> + latin:moreKeys="!text/morekeys_p,!text/qwertysyms_p,!text/number_0,!text/actions_p" /> diff --git a/java/res/xml/rowkeys_qwerty2_left5.xml b/java/res/xml/rowkeys_qwerty2_left5.xml index df2e740a8..017ad1e61 100644 --- a/java/res/xml/rowkeys_qwerty2_left5.xml +++ b/java/res/xml/rowkeys_qwerty2_left5.xml @@ -23,26 +23,17 @@ > + latin:moreKeys="!text/morekeys_a,!text/morekeys_misc_a,!text/qwertysyms_a,!text/actions_a" /> + latin:moreKeys="!text/morekeys_s,!text/morekeys_misc_s,!text/qwertysyms_s,!text/actions_s" /> + latin:moreKeys="!text/morekeys_d,!text/qwertysyms_d,!text/actions_d" /> + latin:moreKeys="!text/morekeys_f,!text/qwertysyms_f,!text/actions_f" /> + latin:moreKeys="!text/morekeys_g,!text/qwertysyms_g,!text/actions_g" /> diff --git a/java/res/xml/rowkeys_qwerty2_right4.xml b/java/res/xml/rowkeys_qwerty2_right4.xml index 16279520d..245d84974 100644 --- a/java/res/xml/rowkeys_qwerty2_right4.xml +++ b/java/res/xml/rowkeys_qwerty2_right4.xml @@ -23,22 +23,14 @@ > + latin:moreKeys="!text/morekeys_h,!text/qwertysyms_h,!text/actions_h" /> + latin:moreKeys="!text/morekeys_j,!text/qwertysyms_j,!text/actions_j" /> + latin:moreKeys="!text/morekeys_k,!text/qwertysyms_k,!text/actions_k" /> + latin:moreKeys="!text/morekeys_l,!text/qwertysyms_l,!text/actions_l" /> diff --git a/java/res/xml/rowkeys_qwerty3_left4.xml b/java/res/xml/rowkeys_qwerty3_left4.xml index d037bd2bf..f0a29d179 100644 --- a/java/res/xml/rowkeys_qwerty3_left4.xml +++ b/java/res/xml/rowkeys_qwerty3_left4.xml @@ -23,22 +23,14 @@ > + latin:moreKeys="!text/morekeys_z,!text/qwertysyms_z,!text/actions_z" /> + latin:moreKeys="!text/morekeys_x,!text/qwertysyms_x,!text/actions_x" /> + latin:moreKeys="!text/morekeys_c,!text/morekeys_misc_c,!text/qwertysyms_c,!text/actions_c" /> + latin:moreKeys="!text/morekeys_v,!text/qwertysyms_v,!text/actions_v" /> diff --git a/java/res/xml/rowkeys_qwerty3_right3.xml b/java/res/xml/rowkeys_qwerty3_right3.xml index 6bd989467..389886b52 100644 --- a/java/res/xml/rowkeys_qwerty3_right3.xml +++ b/java/res/xml/rowkeys_qwerty3_right3.xml @@ -23,15 +23,11 @@ > + latin:moreKeys="!text/morekeys_b,!text/qwertysyms_b,!text/actions_b" /> + latin:moreKeys="!text/morekeys_n,!text/morekeys_misc_n,!text/qwertysyms_n,!text/actions_n" /> + latin:moreKeys="!text/morekeys_m,!text/qwertysyms_m,!text/actions_m" /> diff --git a/java/src/org/futo/inputmethod/keyboard/Key.java b/java/src/org/futo/inputmethod/keyboard/Key.java index bf97fceb3..70291b9b0 100644 --- a/java/src/org/futo/inputmethod/keyboard/Key.java +++ b/java/src/org/futo/inputmethod/keyboard/Key.java @@ -60,6 +60,7 @@ public class Key implements Comparable { private final String mLabel; /** Hint label to display on the key in conjunction with the label */ private final String mHintLabel; + private final String mHintIconId; /** Flags of the label */ private final int mLabelFlags; private static final int LABEL_FLAGS_ALIGN_HINT_LABEL_TO_BOTTOM = 0x02; @@ -215,6 +216,7 @@ public class Key implements Comparable { mHorizontalGap = horizontalGap; mVerticalGap = verticalGap; mHintLabel = hintLabel; + mHintIconId = ICON_UNDEFINED; mLabelFlags = labelFlags; mBackgroundType = backgroundType; // TODO: Pass keyActionFlags as an argument. @@ -287,7 +289,8 @@ public class Key implements Comparable { final boolean needsToUpcase = needsToUpcase(mLabelFlags, params.mId.mElementId); final Locale localeForUpcasing = params.mId.getLocale(); int actionFlags = style.getFlags(keyAttr, R.styleable.Keyboard_Key_keyActionFlags); - String[] moreKeys = style.getStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys); + + String[] moreKeys = style.getStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys, s -> params.mId.mLongPressKeySettings.reorderMoreKeys(s)); // Get maximum column order number and set a relevant mode value. int moreKeysColumnAndFlags = MORE_KEYS_MODE_MAX_COLUMN_WITH_AUTO_ORDER @@ -320,7 +323,7 @@ public class Key implements Comparable { additionalMoreKeys = null; } else { additionalMoreKeys = style.getStringArray(keyAttr, - R.styleable.Keyboard_Key_additionalMoreKeys); + R.styleable.Keyboard_Key_additionalMoreKeys, null); } moreKeys = MoreKeySpec.insertAdditionalMoreKeys(moreKeys, additionalMoreKeys); @@ -357,28 +360,31 @@ public class Key implements Comparable { ? StringUtils.toTitleCaseOfKeyLabel(label, localeForUpcasing) : label; } + if ((mLabelFlags & LABEL_FLAGS_DISABLE_HINT_LABEL) != 0) { mHintLabel = null; + mHintIconId = null; } else { - String hintLabel = style.getString( - keyAttr, R.styleable.Keyboard_Key_keyHintLabel); - - if(params.mId.mNumberRow && hintLabel != null && hintLabel.matches("\\d+")) { - hintLabel = ""; - } + String hintLabel = null; + String hintIcon = null; if(moreKeys != null && moreKeys.length > 0) { String hintLabelCandidate = moreKeys[0]; if(hintLabelCandidate.startsWith("\\")) hintLabelCandidate = hintLabelCandidate.substring(1); if(hintLabelCandidate.length() == 1) { - hintLabel = hintLabelCandidate; + hintLabel = needsToUpcase + ? StringUtils.toTitleCaseOfKeyLabel(hintLabelCandidate, localeForUpcasing) + : hintLabelCandidate; + } else if(hintLabelCandidate.contains("!icon/")) { + hintIcon = KeySpecParser.getIconId(hintLabelCandidate); } } - mHintLabel = needsToUpcase - ? StringUtils.toTitleCaseOfKeyLabel(hintLabel, localeForUpcasing) - : hintLabel; + + mHintLabel = hintLabel; + mHintIconId = hintIcon; } + String outputText = KeySpecParser.getOutputText(keySpec); if (needsToUpcase) { outputText = StringUtils.toTitleCaseOfKeyLabel(outputText, localeForUpcasing); @@ -412,7 +418,7 @@ public class Key implements Comparable { : code; } final int altCodeInAttr = KeySpecParser.parseCode( - style.getString(keyAttr, R.styleable.Keyboard_Key_altCode), CODE_UNSPECIFIED); + style.getString(keyAttr, R.styleable.Keyboard_Key_altCode, null), CODE_UNSPECIFIED); final int altCode = needsToUpcase ? StringUtils.toTitleCaseOfKeyCode(altCodeInAttr, localeForUpcasing) : altCodeInAttr; @@ -435,6 +441,7 @@ public class Key implements Comparable { mCode = key.mCode; mLabel = key.mLabel; mHintLabel = key.mHintLabel; + mHintIconId = key.mHintIconId; mLabelFlags = key.mLabelFlags; mIconId = key.mIconId; mWidth = key.mWidth; @@ -487,6 +494,7 @@ public class Key implements Comparable { key.mCode, key.mLabel, key.mHintLabel, + key.mHintIconId, key.mIconId, key.mBackgroundType, Arrays.hashCode(key.mMoreKeys), @@ -514,6 +522,7 @@ public class Key implements Comparable { && o.mCode == mCode && TextUtils.equals(o.mLabel, mLabel) && TextUtils.equals(o.mHintLabel, mHintLabel) + && TextUtils.equals(o.mHintIconId, mHintIconId) && o.mIconId == mIconId && o.mBackgroundType == mBackgroundType && Arrays.equals(o.mMoreKeys, mMoreKeys) @@ -588,6 +597,11 @@ public class Key implements Comparable { return mHintLabel; } + @Nullable + public String getHintIconId() { + return mHintIconId; + } + @Nullable public MoreKeySpec[] getMoreKeys() { return mMoreKeys; @@ -840,6 +854,19 @@ public class Key implements Comparable { return icon; } + @Nullable + public Drawable getHintIcon(final KeyboardIconsSet iconSet, final int alpha) { + final OptionalAttributes attrs = mOptionalAttributes; + final String iconId = getHintIconId(); + if(iconId == null) return null; + + final Drawable icon = iconSet.getIconDrawable(iconId); + if (icon != null) { + icon.setAlpha(alpha); + } + return icon; + } + @Nullable public Drawable getPreviewIcon(final KeyboardIconsSet iconSet) { return iconSet.getIconDrawable(getIconId()); diff --git a/java/src/org/futo/inputmethod/keyboard/KeyboardId.java b/java/src/org/futo/inputmethod/keyboard/KeyboardId.java index 4d0af2982..8bac39807 100644 --- a/java/src/org/futo/inputmethod/keyboard/KeyboardId.java +++ b/java/src/org/futo/inputmethod/keyboard/KeyboardId.java @@ -24,6 +24,7 @@ import android.view.inputmethod.EditorInfo; import org.futo.inputmethod.compat.EditorInfoCompatUtils; import org.futo.inputmethod.latin.RichInputMethodSubtype; +import org.futo.inputmethod.latin.settings.LongPressKeySettings; import org.futo.inputmethod.latin.utils.InputTypeUtils; import java.util.Arrays; @@ -84,6 +85,7 @@ public final class KeyboardId { public final boolean mHasShortcutKey; public final boolean mIsSplitLayout; public final boolean mNumberRow; + public final LongPressKeySettings mLongPressKeySettings; private final int mHashCode; @@ -102,6 +104,7 @@ public final class KeyboardId { mHasShortcutKey = params.mVoiceInputKeyEnabled; mIsSplitLayout = params.mIsSplitLayoutEnabled; mNumberRow = params.mNumberRow || params.mIsPasswordField; + mLongPressKeySettings = params.mLongPressKeySettings; mHashCode = computeHashCode(this); } @@ -124,7 +127,8 @@ public final class KeyboardId { id.navigatePrevious(), id.mSubtype, id.mIsSplitLayout, - id.mNumberRow + id.mNumberRow, + id.mLongPressKeySettings.hashCode() }); } @@ -147,7 +151,8 @@ public final class KeyboardId { && other.navigatePrevious() == navigatePrevious() && other.mSubtype.equals(mSubtype) && other.mIsSplitLayout == mIsSplitLayout - && other.mNumberRow == mNumberRow; + && other.mNumberRow == mNumberRow + && other.mLongPressKeySettings.equals(mLongPressKeySettings); } private static boolean isAlphabetKeyboard(final int elementId) { diff --git a/java/src/org/futo/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/org/futo/inputmethod/keyboard/KeyboardLayoutSet.java index 65667e65d..2243c5dfa 100644 --- a/java/src/org/futo/inputmethod/keyboard/KeyboardLayoutSet.java +++ b/java/src/org/futo/inputmethod/keyboard/KeyboardLayoutSet.java @@ -39,7 +39,7 @@ import org.futo.inputmethod.keyboard.internal.UniqueKeysCache; import org.futo.inputmethod.latin.InputAttributes; import org.futo.inputmethod.latin.R; import org.futo.inputmethod.latin.RichInputMethodSubtype; -import org.futo.inputmethod.latin.define.DebugFlags; +import org.futo.inputmethod.latin.settings.LongPressKeySettings; import org.futo.inputmethod.latin.utils.InputTypeUtils; import org.futo.inputmethod.latin.utils.ScriptUtils; import org.futo.inputmethod.latin.utils.SubtypeLocaleUtils; @@ -136,6 +136,8 @@ public final class KeyboardLayoutSet { new SparseArray<>(); boolean mNumberRow; + + LongPressKeySettings mLongPressKeySettings; } public static void onSystemLocaleChanged() { @@ -272,6 +274,8 @@ public final class KeyboardLayoutSet { mResources = context.getResources(); final Params params = mParams; + params.mLongPressKeySettings = new LongPressKeySettings(context); + final EditorInfo editorInfo = (ei != null) ? ei : EMPTY_EDITOR_INFO; params.mMode = getKeyboardMode(editorInfo); // TODO: Consolidate those with {@link InputAttributes}. diff --git a/java/src/org/futo/inputmethod/keyboard/KeyboardView.java b/java/src/org/futo/inputmethod/keyboard/KeyboardView.java index b246f3429..f93cade39 100644 --- a/java/src/org/futo/inputmethod/keyboard/KeyboardView.java +++ b/java/src/org/futo/inputmethod/keyboard/KeyboardView.java @@ -142,9 +142,15 @@ public class KeyboardView extends View { R.styleable.Keyboard_Key, defStyle, R.style.KeyboardView); assert(context instanceof ContextThemeWrapper); - assert(((ContextThemeWrapper) context).getBaseContext() instanceof DynamicThemeProviderOwner); - mDrawableProvider = ((DynamicThemeProviderOwner) ((ContextThemeWrapper) context).getBaseContext()).getDrawableProvider(); + if(((ContextThemeWrapper) context).getBaseContext() instanceof DynamicThemeProviderOwner) { + mDrawableProvider = ((DynamicThemeProviderOwner) ((ContextThemeWrapper) context).getBaseContext()).getDrawableProvider(); + } else if(context instanceof DynamicThemeProviderOwner) { + mDrawableProvider = ((DynamicThemeProviderOwner) context).getDrawableProvider(); + } else { + throw new IllegalStateException("Failed to obtain DynamicThemeProvider"); + } + boolean isMoreKeys = keyAttr.getBoolean(R.styleable.Keyboard_Key_isMoreKey, false); boolean isMoreKeysAction = keyAttr.getBoolean(R.styleable.Keyboard_Key_isAction, false); @@ -419,6 +425,8 @@ public class KeyboardView extends View { final Keyboard keyboard = getKeyboard(); final Drawable icon = (keyboard == null) ? null : key.getIcon(keyboard.mIconsSet, params.mAnimAlpha); + final Drawable hintIcon = (keyboard == null) ? null + : key.getHintIcon(keyboard.mIconsSet, params.mAnimAlpha); float labelX = centerX; float labelBaseline = centerY; final String label = key.getLabel(); @@ -510,6 +518,17 @@ public class KeyboardView extends View { final float adjustmentY = params.mHintLabelVerticalAdjustment * labelCharHeight; canvas.drawText( hintLabel, 0, hintLabel.length(), hintX, hintBaseline + adjustmentY, paint); + } else if(hintIcon != null) { + final float size = key.selectHintTextSize(params); + + int iconWidth = (int)size; + int iconHeight = (int)size; + + int hintX = keyWidth - iconWidth - (int)mKeyHintLetterPadding; + int hintY = (int)mKeyHintLetterPadding; + + hintIcon.setTint(key.selectHintTextColor(params)); + drawIcon(canvas, hintIcon, hintX, hintY, iconWidth, iconHeight); } // Draw key icon. diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyStyle.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyStyle.java index e0f5ea049..9496583af 100644 --- a/java/src/org/futo/inputmethod/keyboard/internal/KeyStyle.java +++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyStyle.java @@ -18,14 +18,16 @@ package org.futo.inputmethod.keyboard.internal; import android.content.res.TypedArray; +import java.util.function.Function; + import javax.annotation.Nonnull; import javax.annotation.Nullable; public abstract class KeyStyle { private final KeyboardTextsSet mTextsSet; - public abstract @Nullable String[] getStringArray(TypedArray a, int index); - public abstract @Nullable String getString(TypedArray a, int index); + public abstract @Nullable String[] getStringArray(TypedArray a, int index, Function stringMutator); + public abstract @Nullable String getString(TypedArray a, int index, Function stringMutator); public abstract int getInt(TypedArray a, int index, int defaultValue); public abstract int getFlags(TypedArray a, int index); @@ -34,17 +36,23 @@ public abstract class KeyStyle { } @Nullable - protected String parseString(final TypedArray a, final int index) { + protected String parseString(final TypedArray a, final int index, Function stringMutator) { if (a.hasValue(index)) { - return mTextsSet.resolveTextReference(a.getString(index)); + String s = a.getString(index); + if(stringMutator != null) s = stringMutator.apply(s); + + return mTextsSet.resolveTextReference(s); } return null; } @Nullable - protected String[] parseStringArray(final TypedArray a, final int index) { + protected String[] parseStringArray(final TypedArray a, final int index, Function stringMutator) { if (a.hasValue(index)) { - final String text = mTextsSet.resolveTextReference(a.getString(index)); + String s = a.getString(index); + if(stringMutator != null) s = stringMutator.apply(s); + + final String text = mTextsSet.resolveTextReference(s); return MoreKeySpec.splitKeySpecs(text); } return null; diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyStylesSet.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyStylesSet.java index 956b17b60..059cb6514 100644 --- a/java/src/org/futo/inputmethod/keyboard/internal/KeyStylesSet.java +++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyStylesSet.java @@ -28,6 +28,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.util.Arrays; import java.util.HashMap; +import java.util.function.Function; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -59,14 +60,14 @@ public final class KeyStylesSet { @Override @Nullable - public String[] getStringArray(final TypedArray a, final int index) { - return parseStringArray(a, index); + public String[] getStringArray(final TypedArray a, final int index, Function stringMutator) { + return parseStringArray(a, index, stringMutator); } @Override @Nullable - public String getString(final TypedArray a, final int index) { - return parseString(a, index); + public String getString(final TypedArray a, final int index, Function stringMutator) { + return parseString(a, index, stringMutator); } @Override @@ -95,9 +96,9 @@ public final class KeyStylesSet { @Override @Nullable - public String[] getStringArray(final TypedArray a, final int index) { + public String[] getStringArray(final TypedArray a, final int index, Function stringMutator) { if (a.hasValue(index)) { - return parseStringArray(a, index); + return parseStringArray(a, index, stringMutator); } final Object value = mStyleAttributes.get(index); if (value != null) { @@ -105,21 +106,21 @@ public final class KeyStylesSet { return Arrays.copyOf(array, array.length); } final KeyStyle parentStyle = mStyles.get(mParentStyleName); - return parentStyle.getStringArray(a, index); + return parentStyle.getStringArray(a, index, stringMutator); } @Override @Nullable - public String getString(final TypedArray a, final int index) { + public String getString(final TypedArray a, final int index, Function stringMutator) { if (a.hasValue(index)) { - return parseString(a, index); + return parseString(a, index, stringMutator); } final Object value = mStyleAttributes.get(index); if (value != null) { return (String)value; } final KeyStyle parentStyle = mStyles.get(mParentStyleName); - return parentStyle.getString(a, index); + return parentStyle.getString(a, index, stringMutator); } @Override @@ -159,7 +160,7 @@ public final class KeyStylesSet { private void readString(final TypedArray a, final int index) { if (a.hasValue(index)) { - mStyleAttributes.put(index, parseString(a, index)); + mStyleAttributes.put(index, parseString(a, index, null)); } } @@ -179,7 +180,7 @@ public final class KeyStylesSet { private void readStringArray(final TypedArray a, final int index) { if (a.hasValue(index)) { - mStyleAttributes.put(index, parseStringArray(a, index)); + mStyleAttributes.put(index, parseStringArray(a, index, null)); } } } diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardBuilder.java index f676eb17d..454ba918e 100644 --- a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -512,7 +512,7 @@ public class KeyboardBuilder { final TypedArray keyAttr = mResources.obtainAttributes( Xml.asAttributeSet(parser), R.styleable.Keyboard_Key); final KeyStyle keyStyle = mParams.mKeyStyles.getKeyStyle(keyAttr, parser); - final String keySpec = keyStyle.getString(keyAttr, R.styleable.Keyboard_Key_keySpec); + final String keySpec = keyStyle.getString(keyAttr, R.styleable.Keyboard_Key_keySpec, null); if (TextUtils.isEmpty(keySpec)) { throw new ParseException("Empty keySpec", parser); } diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardTextsTable.java index a2d8c215b..c660772e7 100644 --- a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardTextsTable.java +++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardTextsTable.java @@ -93,173 +93,267 @@ public final class KeyboardTextsTable { "morekeys_c", "morekeys_n", "double_quotes", - "morekeys_s", "single_quotes", + "morekeys_s", "keyspec_currency", "morekeys_y", "morekeys_z", "morekeys_d", - "double_angle_quotes", - "morekeys_l", - "morekeys_g", "single_angle_quotes", + "double_angle_quotes", + "morekeys_g", + "morekeys_l", "morekeys_t", "morekeys_r", "morekeys_cyrillic_ie", - "keyspec_symbols_9", - "morekeys_cyrillic_soft_sign", - "additional_morekeys_symbols_0", - "additional_morekeys_symbols_4", - "keyspec_east_slavic_row2_2", - "morekeys_nordic_row2_10", - "keyspec_symbols_8", - "keyspec_symbols_0", - "additional_morekeys_symbols_5", - "additional_morekeys_symbols_1", - "morekeys_tablet_period", "keyspec_symbols_6", - "keylabel_to_symbol", - "keyspec_symbols_3", - "keyspec_symbols_1", - "keyspec_nordic_row2_10", - "keyspec_symbols_7", - "keyspec_symbols_4", - "additional_morekeys_symbols_9", + "additional_morekeys_symbols_5", "additional_morekeys_symbols_6", - "additional_morekeys_symbols_3", - "morekeys_k", - "keyspec_east_slavic_row3_5", + "additional_morekeys_symbols_2", + "morekeys_tablet_period", + "additional_morekeys_symbols_1", + "additional_morekeys_symbols_4", + "keyspec_east_slavic_row1_9", "additional_morekeys_symbols_7", "keyspec_nordic_row1_11", - "additional_morekeys_symbols_2", - "keyspec_nordic_row2_11", "keyspec_symbols_2", + "additional_morekeys_symbols_3", "keyspec_east_slavic_row2_11", + "additional_morekeys_symbols_0", + "keylabel_to_symbol", "keyspec_symbols_5", - "keyspec_east_slavic_row1_9", + "keyspec_east_slavic_row2_2", + "keyspec_symbols_9", + "keyspec_symbols_7", + "keyspec_symbols_4", + "keyspec_east_slavic_row3_5", + "keyspec_symbols_3", + "keyspec_symbols_8", + "morekeys_k", + "additional_morekeys_symbols_9", + "keyspec_symbols_0", + "keyspec_nordic_row2_11", "additional_morekeys_symbols_8", - "morekeys_punctuation", - "morekeys_nordic_row2_11", + "morekeys_cyrillic_soft_sign", + "keyspec_nordic_row2_10", + "keyspec_symbols_1", + "morekeys_nordic_row2_10", "keyspec_tablet_comma", - "keyspec_period", "morekeys_period", "keyspec_tablet_period", - "keyspec_less_than", - "keyspec_left_square_bracket", - "keyspec_less_than_equal", - "morekeys_tablet_comma", - "keyspec_left_single_angle_quote", - "morekeys_swiss_row2_10", - "keyspec_left_parenthesis", - "keyspec_comma", - "keyspec_right_parenthesis", - "keyspec_swiss_row2_10", - "keyspec_right_single_angle_quote", - "keyspec_left_curly_bracket", - "morekeys_swiss_row1_11", + "keyspec_period", + "morekeys_punctuation", + "morekeys_nordic_row2_11", "keyspec_left_double_angle_quote", - "keyspec_greater_than_equal", - "keyspec_greater_than", - "keyhintlabel_period", - "morekeys_question", + "keyspec_left_parenthesis", + "morekeys_swiss_row2_10", "keyspec_right_double_angle_quote", + "keyspec_swiss_row2_10", + "keyspec_right_parenthesis", + "keyspec_right_single_angle_quote", "keyspec_right_curly_bracket", "keyspec_swiss_row2_11", + "keyspec_less_than", + "keyspec_greater_than", + "keyhintlabel_period", + "keyspec_right_square_bracket", + "keyspec_greater_than_equal", + "keyspec_left_single_angle_quote", + "keyspec_comma", + "morekeys_tablet_comma", "keyspec_spanish_row2_10", "keyspec_swiss_row1_11", - "keyspec_right_square_bracket", + "keyspec_left_curly_bracket", + "morekeys_question", + "keyspec_left_square_bracket", + "keyspec_less_than_equal", "morekeys_star", "morekeys_swiss_row2_11", - "label_next_key", - "morekeys_cyrillic_o", - "label_previous_key", - "label_search_key", - "label_pause_key", - "keyspec_symbols_question", - "keyhintlabel_tablet_comma", - "keyspec_south_slavic_row3_8", - "morekeys_right_parenthesis", - "morekeys_w", - "morekeys_symbols_semicolon", - "keyspec_south_slavic_row2_11", + "morekeys_swiss_row1_11", "morekeys_cyrillic_u", - "morekeys_symbols_percent", - "morekeys_left_parenthesis", - "morekeys_tablet_punctuation", - "keyhintlabel_tablet_period", - "morekeys_arabic_diacritics", - "keyspec_symbols_semicolon", - "label_send_key", - "morekeys_east_slavic_row2_2", - "label_go_key", - "keyspec_symbols_percent", - "keyspec_south_slavic_row3_1", - "morekeys_cyrillic_i", "label_wait_key", - "keyspec_south_slavic_row1_6", - "morekeys_h", - "morekeys_cyrillic_en", - "morekeys_cyrillic_ghe", "morekeys_bullet", + "keyhintlabel_tablet_comma", + "morekeys_w", + "morekeys_cyrillic_o", + "keyhintlabel_tablet_period", + "morekeys_cyrillic_ghe", + "morekeys_h", + "label_send_key", + "label_go_key", + "label_next_key", + "keyspec_south_slavic_row2_11", + "morekeys_tablet_punctuation", + "morekeys_east_slavic_row2_2", + "keyspec_symbols_semicolon", + "label_pause_key", + "keyspec_south_slavic_row3_1", + "label_search_key", + "morekeys_right_parenthesis", + "morekeys_arabic_diacritics", + "keyspec_symbols_question", + "keyspec_symbols_percent", + "morekeys_cyrillic_i", + "keyspec_south_slavic_row1_6", + "label_previous_key", + "morekeys_symbols_semicolon", + "morekeys_symbols_percent", "label_done_key", - "keyspec_x", - "keyspec_w", - "morekeys_exclamation", - "morekeys_cyrillic_a", - "morekeys_less_than", - "keyspec_y", + "keyspec_south_slavic_row3_8", + "morekeys_cyrillic_en", + "morekeys_left_parenthesis", "morekeys_v", - "morekeys_plus", - "keyspec_q", "morekeys_greater_than", - "morekeys_currency_dollar", - "morekeys_cyrillic_ka", - "morekeys_q", + "keyspec_q", + "keyspec_y", "morekeys_east_slavic_row2_11", - "morekeys_j", + "morekeys_plus", "morekeys_x", - "single_9qm_rqm", - "single_lqm_rqm", - "double_lqm_rqm", - "double_laqm_raqm", - "keylabel_to_more_symbol", - "keylabel_time_pm", - "keyspecs_left_parenthesis_more_keys", - "morekeys_symbols_4", - "double_9qm_lqm", - "keylabel_to_phone_numeric", - "single_laqm_raqm", - "morekeys_symbols_5", - "keylabel_to_phone_symbols", - "morekeys_single_quote", - "morekeys_double_quote", - "keyspec_emoji_action_key", - "keyspec_settings", - "keyspec_shortcut", - "double_9qm_rqm", - "single_rqm_9qm", - "double_raqm_laqm", - "keylabel_time_am", - "morekeys_symbols_7", - "morekeys_symbols_9", - "keyspec_action_next", - "morekeys_popular_domain", - "morekeys_symbols_3", - "morekeys_symbols_0", - "morekeys_symbols_1", - "keylabel_tablet_to_more_symbol", - "single_9qm_lqm", - "morekeys_symbols_6", - "keyspec_popular_domain", - "single_raqm_laqm", - "morekeys_symbols_2", - "keyspecs_right_parenthesis_more_keys", - "morekeys_symbols_8", - "morekeys_currency_generic", - "keyspec_action_previous", - "morekeys_tablet_double_quote", + "morekeys_currency_dollar", + "keyspec_w", + "morekeys_less_than", + "morekeys_cyrillic_ka", + "keyspec_x", + "morekeys_q", + "morekeys_exclamation", + "morekeys_j", + "morekeys_cyrillic_a", "morekeys_am_pm", - "double_rqm_9qm" + "actions_l", + "actions_h", + "actions_y", + "morekeys_symbols_4", + "keylabel_to_phone_numeric", + "qwertysyms_g", + "qwertysyms_a", + "actions_c", + "qwertysyms_f", + "actions_9", + "single_9qm_lqm", + "morekeys_m", + "morekeys_tablet_double_quote", + "double_9qm_rqm", + "number_1", + "qwertysyms_y", + "qwertysyms_7", + "qwertysyms_l", + "keyspec_emoji_action_key", + "number_8", + "keyspecs_left_parenthesis_more_keys", + "morekeys_misc_u", + "keyspec_action_next", + "keyspec_action_previous", + "morekeys_symbols_9", + "qwertysyms_6", + "qwertysyms_m", + "actions_o", + "double_9qm_lqm", + "actions_w", + "actions_g", + "actions_e", + "actions_r", + "actions_k", + "morekeys_f", + "actions_5", + "double_raqm_laqm", + "morekeys_symbols_2", + "morekeys_misc_n", + "morekeys_misc_e", + "qwertysyms_j", + "actions_m", + "number_6", + "actions_f", + "morekeys_popular_domain", + "single_lqm_rqm", + "number_0", + "morekeys_symbols_5", + "actions_7", + "qwertysyms_e", + "morekeys_single_quote", + "single_9qm_rqm", + "actions_p", + "actions_x", + "morekeys_double_quote", + "qwertysyms_0", + "single_laqm_raqm", + "keyspec_settings", + "qwertysyms_p", + "keylabel_time_am", + "qwertysyms_t", + "actions_z", + "number_5", + "qwertysyms_8", + "qwertysyms_2", + "qwertysyms_s", + "qwertysyms_n", + "qwertysyms_o", + "qwertysyms_r", + "qwertysyms_b", + "actions_6", + "keylabel_to_more_symbol", + "qwertysyms_5", + "qwertysyms_u", + "single_raqm_laqm", + "morekeys_misc_a", + "morekeys_misc_s", + "qwertysyms_c", + "double_lqm_rqm", + "qwertysyms_i", + "actions_2", + "single_rqm_9qm", + "morekeys_p", + "qwertysyms_d", + "number_7", + "number_2", + "morekeys_misc_c", + "keylabel_time_pm", + "qwertysyms_k", + "qwertysyms_q", + "actions_t", + "actions_j", + "qwertysyms_v", + "number_4", + "double_rqm_9qm", + "morekeys_b", + "morekeys_symbols_1", + "actions_0", + "morekeys_symbols_3", + "qwertysyms_9", + "qwertysyms_z", + "keyspec_shortcut", + "qwertysyms_h", + "morekeys_symbols_0", + "actions_q", + "number_3", + "qwertysyms_1", + "actions_u", + "actions_4", + "actions_s", + "number_9", + "keyspec_popular_domain", + "morekeys_misc_i", + "double_laqm_raqm", + "actions_a", + "actions_n", + "actions_b", + "morekeys_misc_o", + "morekeys_currency_generic", + "morekeys_symbols_7", + "qwertysyms_4", + "actions_d", + "keylabel_tablet_to_more_symbol", + "keyspecs_right_parenthesis_more_keys", + "morekeys_symbols_6", + "morekeys_symbols_8", + "actions_v", + "qwertysyms_x", + "actions_3", + "qwertysyms_3", + "keylabel_to_phone_symbols", + "actions_1", + "qwertysyms_w", + "actions_8", + "actions_i" }; private static final String EMPTY = ""; @@ -305,101 +399,102 @@ public final class KeyboardTextsTable { null, null, null, - "\u0669", - null, - "0,\u066b,\u066c", - "4", - null, - null, - "\u0668", - "\u0660", - "5", - "1", - "!text/morekeys_arabic_diacritics", "\u0666", - "\u0663\u0662\u0661\u061f", - "\u0663", - "\u0661", - null, - "\u0667", - "\u0664", - "9", + "5", "6", - "3", - null, + "2", + "!text/morekeys_arabic_diacritics", + "1", + "4", null, "7", null, - "2", - null, "\u0662", + "3", null, + "0,\u066b,\u066c", + "\u0663\u0662\u0661\u061f", "\u0665", null, + "\u0669", + "\u0667", + "\u0664", + null, + "\u0663", + "\u0668", + null, + "9", + "\u0660", + null, "8", null, null, - "\u060c", + "\u0661", null, + "\u060c", "!text/morekeys_arabic_diacritics", null, - "<|>", - "[|]", - "\u2264|\u2265", - "!fixedColumnOrder!4,:,!,\u061f,\u061b,-,\\\",\\'", - "\u2039|\u203a", null, - "(|)", - "\u060c", - ")|(", null, - "\u203a|\u2039", - "{|}", null, "\u00ab|\u00bb", - "\u2265|\u2264", - ">|<", - "\u0651", - "?,\u00bf", + "(|)", + null, "\u00bb|\u00ab", + null, + ")|(", + "\u203a|\u2039", "}|{", null, - null, - null, + "<|>", + ">|<", + "\u0651", "]|[", + "\u2265|\u2264", + "\u2039|\u203a", + "\u060c", + "!fixedColumnOrder!4,:,!,\u061f,\u061b,-,\\\",\\'", + null, + null, + "{|}", + "?,\u00bf", + "[|]", + "\u2264|\u2265", "\u2605,\u066d", null, null, null, null, - null, - null, - "\u061f", + "\u266a", "\u061f", null, - "!fixedColumnOrder!4,\ufd3f|\ufd3e,!text/keyspecs_right_parenthesis_more_keys", - null, - ";", - null, - null, - "\\%,\u2030", - "!fixedColumnOrder!4,\ufd3e|\ufd3f,!text/keyspecs_left_parenthesis_more_keys", null, "\u0651", - "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064d|\u064d, \u064c|\u064c, \u064b|\u064b, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064f|\u064f, \u064e|\u064e,\u0640\u0640\u0640|\u0640", + null, + null, + null, + null, + null, + null, + null, + null, "\u061b", null, null, null, + "!fixedColumnOrder!4,\ufd3f|\ufd3e,!text/keyspecs_right_parenthesis_more_keys", + "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064d|\u064d, \u064c|\u064c, \u064b|\u064b, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064f|\u064f, \u064e|\u064e,\u0640\u0640\u0640|\u0640", + "\u061f", "\u066a", null, null, null, + ";", + "\\%,\u2030", null, null, null, - null, - "\u266a" + "!fixedColumnOrder!4,\ufd3e|\ufd3f,!text/keyspecs_left_parenthesis_more_keys" }; private static final String[] TEXTS_az = { @@ -413,8 +508,8 @@ public final class KeyboardTextsTable { "\u00e7,\u0107,\u010d", "\u0148,\u00f1", null, - "\u015f,\u00df,\u015b,\u0161", null, + "\u015f,\u00df,\u015b,\u0161", null, "\u00fd", "\u017e", @@ -435,7 +530,6 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_lqm", - null, "!text/single_9qm_lqm", null, null, @@ -447,38 +541,37 @@ public final class KeyboardTextsTable { null, null, null, + null, "\u0451", null, - "\u044a", + null, + null, + null, + null, + null, + null, + "\u045e", + null, + null, + null, + null, + "\u044d", + null, null, null, "\u044b", null, null, null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, "\u0456", null, null, null, null, null, - "\u044d", null, - "\u045e" + null, + "\u044a" }; private static final String[] TEXTS_bg = { @@ -544,6 +637,8 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, "l\u00b7l,\u0142", null, null, @@ -582,6 +677,8 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, "!autoColumnOrder!9,\\,?,!,\u00b7,#,),(,/,;,',@,:,-,\\\",+,\\%,&", null, null, @@ -601,14 +698,6 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, - null, - null, - null, - null, - null, "\u00e7", null, null, @@ -629,6 +718,8 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, "!autoColumnOrder!8,\\,',\u00b7,#,),(,/,;,@,:,-,\\\",+,\\%,&" }; @@ -643,16 +734,16 @@ public final class KeyboardTextsTable { "\u010d,\u00e7,\u0107", "\u0148,\u00f1,\u0144", "!text/double_9qm_lqm", - "\u0161,\u00df,\u015b", "!text/single_9qm_lqm", + "\u0161,\u00df,\u015b", null, "\u00fd,\u00ff", "\u017e,\u017a,\u017c", "\u010f", + "!text/single_raqm_laqm", "!text/double_raqm_laqm", null, null, - "!text/single_raqm_laqm", "\u0165", "\u0159" }; @@ -668,16 +759,17 @@ public final class KeyboardTextsTable { null, "\u00f1,\u0144", "!text/double_9qm_lqm", - "\u00df,\u015b,\u0161", "!text/single_9qm_lqm", + "\u00df,\u015b,\u0161", null, "\u00fd,\u00ff", null, "\u00f0", + "!text/single_raqm_laqm", "!text/double_raqm_laqm", + null, "\u0142", null, - "!text/single_raqm_laqm", null, null, null, @@ -686,30 +778,33 @@ public final class KeyboardTextsTable { null, null, null, - "\u00e4", - null, - null, - null, - null, - null, - null, - null, - null, - null, - "\u00e6", - null, - null, - null, - null, - null, null, null, null, "\u00e5", null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, "\u00f8", null, null, + "\u00e6", + null, + "\u00e4", + null, null, null, null, @@ -728,17 +823,14 @@ public final class KeyboardTextsTable { null, "\u00f1,\u0144", "!text/double_9qm_lqm", - "\u00df,\u015b,\u0161", "!text/single_9qm_lqm", + "\u00df,\u015b,\u0161", null, null, null, null, - "!text/double_raqm_laqm", - null, - null, "!text/single_raqm_laqm", - null, + "!text/double_raqm_laqm", null, null, null, @@ -786,25 +878,28 @@ public final class KeyboardTextsTable { null, "\u00e9", null, - null, - null, "\u00f6", null, null, - "\u00e8", - null, - null, - null, - null, - null, - null, null, "\u00e4", null, + null, + null, + null, + null, + null, + null, + null, + null, "\u00fc", null, null, - "\u00e0" + null, + null, + null, + "\u00e0", + "\u00e8" }; private static final String[] TEXTS_el = { @@ -816,17 +911,7 @@ public final class KeyboardTextsTable { }; private static final String[] TEXTS_en = { - "en", - "\u00e0,\u00e1,\u00e2,\u00e4,\u00e6,\u00e3,\u00e5,\u0101", - "\u00f3,\u00f4,\u00f6,\u00f2,\u0153,\u00f8,\u014d,\u00f5", - "\u00e9,\u00e8,\u00ea,\u00eb,\u0113", - null, - "\u00fa,\u00fb,\u00fc,\u00f9,\u016b", - "\u00ed,\u00ee,\u00ef,\u012b,\u00ec", - "\u00e7", - "\u00f1", - null, - "\u00df" + "en" }; private static final String[] TEXTS_eo = { @@ -840,16 +925,16 @@ public final class KeyboardTextsTable { "\u0107,\u010d,\u00e7,\u010b", "\u00f1,\u0144,\u0146,\u0148,\u0149,\u014b", null, - "\u00df,\u0161,\u015b,\u0219,\u015f", null, + "\u00df,\u0161,\u015b,\u0219,\u015f", null, "y,\u00fd,\u0177,\u00ff,\u00fe", "\u017a,\u017c,\u017e", "\u00f0,\u010f,\u0111", null, - "\u013a,\u013c,\u013e,\u0140,\u0142", - "\u011f,\u0121,\u0123", null, + "\u011f,\u0121,\u0123", + "\u013a,\u013c,\u013e,\u0140,\u0142", "\u0165,\u021b,\u0163,\u0167", "\u0159,\u0155,\u0157", null, @@ -874,6 +959,8 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, "\u0137,\u0138", null, null, @@ -906,12 +993,6 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, - null, - null, - null, "\u0135", null, null, @@ -925,46 +1006,47 @@ public final class KeyboardTextsTable { null, null, null, - null, "w,\u0175", null, null, null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, "\u0125,\u0127", null, null, null, null, - "\u0109", - "\u011d", null, null, null, - "\u016d", + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, "w,\u0175", null, "\u015d", + "\u016d", null, null, + "x", null, - "q", + "\u011d", null, null, - "x" + "\u0109", + "q" }; private static final String[] TEXTS_es = { @@ -1023,6 +1105,10 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, + null, + null, "!autoColumnOrder!9,\\,?,!,#,),(,/,;,\u00a1,',@,:,-,\\\",+,\\%,&,\u00bf" }; @@ -1037,16 +1123,16 @@ public final class KeyboardTextsTable { "\u010d,\u00e7,\u0107", "\u0146,\u00f1,\u0144", "!text/double_9qm_lqm", - "\u0161,\u00df,\u015b,\u015f", "!text/single_9qm_lqm", + "\u0161,\u00df,\u015b,\u015f", null, "\u00fd,\u00ff", "\u017e,\u017c,\u017a", "\u010f", null, - "\u013c,\u0142,\u013a,\u013e", - "\u0123,\u011f", null, + "\u0123,\u011f", + "\u013c,\u0142,\u013a,\u013e", "\u0163,\u0165", "\u0157,\u0159,\u0155", null, @@ -1055,7 +1141,11 @@ public final class KeyboardTextsTable { null, null, null, - "\u00f5", + null, + null, + null, + null, + "\u00fc", null, null, null, @@ -1065,8 +1155,6 @@ public final class KeyboardTextsTable { null, null, null, - "\u00f6", - null, null, null, null, @@ -1074,9 +1162,12 @@ public final class KeyboardTextsTable { "\u0137", null, null, - "\u00fc", + "\u00e4", null, - "\u00e4" + null, + "\u00f6", + null, + "\u00f5" }; private static final String[] TEXTS_eu = { @@ -1115,112 +1206,112 @@ public final class KeyboardTextsTable { null, null, null, - "\u06f9", - null, - "0,\u066b,\u066c", - "4", - null, - null, - "\u06f8", - "\u06f0", - "5", - "1", - "!text/morekeys_arabic_diacritics", "\u06f6", - "\u06f3\u06f2\u06f1\u061f", - "\u06f3", - "\u06f1", - null, - "\u06f7", - "\u06f4", - "9", + "5", "6", - "3", - null, + "2", + "!text/morekeys_arabic_diacritics", + "1", + "4", null, "7", null, - "2", - null, "\u06f2", + "3", null, + "0,\u066b,\u066c", + "\u06f3\u06f2\u06f1\u061f", "\u06f5", null, + "\u06f9", + "\u06f7", + "\u06f4", + null, + "\u06f3", + "\u06f8", + null, + "9", + "\u06f0", + null, "8", null, null, - "\u060c", + "\u06f1", null, + "\u060c", "!text/morekeys_arabic_diacritics", null, - "<|>", - "[|]", - "\u2264|\u2265", - "!fixedColumnOrder!4,:,!,\u061f,\u061b,-,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote", - "\u2039|\u203a", null, - "(|)", - "\u060c", - ")|(", null, - "\u203a|\u2039", - "{|}", null, "\u00ab|\u00bb", - "\u2265|\u2264", - ">|<", - "\u064b", - "?,\u00bf", + "(|)", + null, "\u00bb|\u00ab", + null, + ")|(", + "\u203a|\u2039", "}|{", null, - null, - null, + "<|>", + ">|<", + "\u064b", "]|[", + "\u2265|\u2264", + "\u2039|\u203a", + "\u060c", + "!fixedColumnOrder!4,:,!,\u061f,\u061b,-,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote", + null, + null, + "{|}", + "?,\u00bf", + "[|]", + "\u2264|\u2265", "\u2605,\u066d", null, null, null, null, - null, - null, - "\u061f", + "\u266a", "\u061f", null, - "!fixedColumnOrder!4,\ufd3f|\ufd3e,!text/keyspecs_right_parenthesis_more_keys", - null, - ";", - null, - null, - "\\%,\u2030", - "!fixedColumnOrder!4,\ufd3e|\ufd3f,!text/keyspecs_left_parenthesis_more_keys", null, "\u064b", - "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064c|\u064c, \u064d|\u064d, \u064b|\u064b, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064f|\u064f, \u0650|\u0650, \u064e|\u064e,\u0640\u0640\u0640|\u0640", + null, + null, + null, + null, + null, + null, + null, + null, "\u061b", null, null, null, + "!fixedColumnOrder!4,\ufd3f|\ufd3e,!text/keyspecs_right_parenthesis_more_keys", + "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064c|\u064c, \u064d|\u064d, \u064b|\u064b, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064f|\u064f, \u0650|\u0650, \u064e|\u064e,\u0640\u0640\u0640|\u0640", + "\u061f", "\u066a", null, null, null, + ";", + "\\%,\u2030", null, null, null, + "!fixedColumnOrder!4,\ufd3e|\ufd3f,!text/keyspecs_left_parenthesis_more_keys", null, - "\u266a", + "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_greater_than", null, null, null, null, null, - "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_less_than", null, null, - null, - null, - "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_greater_than" + "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_less_than" }; private static final String[] TEXTS_fi = { @@ -1234,8 +1325,8 @@ public final class KeyboardTextsTable { null, null, null, - "\u0161,\u00df,\u015b", null, + "\u0161,\u00df,\u015b", null, null, "\u017e,\u017a,\u017c", @@ -1252,30 +1343,34 @@ public final class KeyboardTextsTable { null, null, null, - "\u00f8", - null, - null, - null, - null, - null, - null, - null, - null, - null, - "\u00f6", - null, - null, - null, - null, null, null, null, null, "\u00e5", null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, "\u00e4", null, null, + "\u00f6", + null, + "\u00f8", + null, null, null, null, @@ -1347,30 +1442,30 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, "\u00f6", null, - null, - null, "\u00e9", null, null, - "\u00fc", - null, - null, - null, - null, - null, - null, null, "\u00e0", null, + null, + null, + null, + null, + null, + null, + null, + null, "\u00e8", null, null, - "\u00e4" + null, + null, + null, + "\u00e4", + "\u00fc" }; private static final String[] TEXTS_gl = { @@ -1473,18 +1568,8 @@ public final class KeyboardTextsTable { null, null, null, - "Next", - null, - "Prev", - "Search", - "Pause", - null, - null, - null, - null, - null, - null, null, + "Wait", null, null, null, @@ -1493,17 +1578,24 @@ public final class KeyboardTextsTable { null, null, "Send", - null, "Go", + "Next", null, null, null, - "Wait", + null, + "Pause", + null, + "Search", null, null, null, null, null, + null, + "Prev", + null, + null, "Done" }; @@ -1531,43 +1623,41 @@ public final class KeyboardTextsTable { null, null, null, - "\u096f", - null, - "0", - "4", - null, - null, - "\u096e", - "\u0966", - "5", - "1", - "!autoColumnOrder!8,\\,.,',#,),(,/,;,@,:,-,\\\",+,\\%,&", "\u096c", - "?\u0967\u0968\u0969", - "\u0969", - "\u0967", - null, - "\u096d", - "\u096a", - "9", + "5", "6", - "3", - null, + "2", + "!autoColumnOrder!8,\\,.,',#,),(,/,;,@,:,-,\\\",+,\\%,&", + "1", + "4", null, "7", null, - "2", - null, "\u0968", + "3", null, + "0", + "?\u0967\u0968\u0969", "\u096b", null, + "\u096f", + "\u096d", + "\u096a", + null, + "\u0969", + "\u096e", + null, + "9", + "\u0966", + null, "8", null, null, + "\u0967", + null, null, - "\u0964", "!autoColumnOrder!9,\\,.,?,!,#,),(,/,;,',@,:,-,\\\",+,\\%,&", + "\u0964", "\u0964" }; @@ -1582,16 +1672,14 @@ public final class KeyboardTextsTable { "\u010d,\u0107,\u00e7", "\u00f1,\u0144", "!text/double_9qm_rqm", - "\u0161,\u015b,\u00df", "!text/single_9qm_rqm", + "\u0161,\u015b,\u00df", null, null, "\u017e,\u017a,\u017c", "\u0111", - "!text/double_raqm_laqm", - null, - null, - "!text/single_raqm_laqm" + "!text/single_raqm_laqm", + "!text/double_raqm_laqm" }; private static final String[] TEXTS_hu = { @@ -1605,16 +1693,14 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_rqm", - null, "!text/single_9qm_rqm", null, null, null, null, - "!text/double_raqm_laqm", null, - null, - "!text/single_raqm_laqm" + "!text/single_raqm_laqm", + "!text/double_raqm_laqm" }; private static final String[] TEXTS_hy = { @@ -1645,12 +1731,6 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, - null, - null, - null, "!text/morekeys_punctuation", null, null, @@ -1673,12 +1753,26 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, + null, + null, + null, + null, + "\u055d", + null, + "\u0589", + "\u0589", "!autoColumnOrder!8,\\,\u055e,\u055c,.,\u055a,\u0559,?,!,\u055d,\u055b,\u058a,\u00bb,\u00ab,\u055f,;,:", null, - "\u055d", - "\u0589", null, - "\u0589", + null, + null, + null, + null, + null, + null, + null, null, null, null, @@ -1691,11 +1785,6 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, - null, - null, "\u055e,\u00bf", null, null, @@ -1739,6 +1828,14 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, + null, + null, + null, + null, + null, + null, "\u055c,\u00a1" }; @@ -1753,9 +1850,9 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_lqm", - null, "!text/single_9qm_lqm", null, + null, "\u00fd,\u00ff", null, "\u00f0", @@ -1830,30 +1927,30 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, "\u00e9", null, - null, - null, "\u00f6", null, null, - "\u00e8", - null, - null, - null, - null, - null, - null, null, "\u00e4", null, + null, + null, + null, + null, + null, + null, + null, + null, "\u00fc", null, null, - "\u00e0" + null, + null, + null, + "\u00e0", + "\u00e8" }; private static final String[] TEXTS_iw = { @@ -1867,8 +1964,8 @@ public final class KeyboardTextsTable { null, null, "!text/double_rqm_9qm", - null, "!text/single_rqm_9qm", + null, "\u20aa", null, null, @@ -1918,35 +2015,33 @@ public final class KeyboardTextsTable { null, null, null, - "<|>", - "[|]", - "\u2264|\u2265", - null, - "\u2039|\u203a", - null, + "\u00ab|\u00bb", "(|)", null, - ")|(", - null, - "\u203a|\u2039", - "{|}", - null, - "\u00ab|\u00bb", - "\u2265|\u2264", - ">|<", - null, - null, "\u00bb|\u00ab", + null, + ")|(", + "\u203a|\u2039", "}|{", null, - null, + "<|>", + ">|<", null, "]|[", - "\u2605", + "\u2265|\u2264", + "\u2039|\u203a", null, null, null, null, + "{|}", + null, + "[|]", + "\u2264|\u2265", + "\u2605", + null, + null, + null, null, null, null, @@ -1997,7 +2092,6 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_lqm", - null, "!text/single_9qm_lqm" }; @@ -2026,36 +2120,34 @@ public final class KeyboardTextsTable { null, "\u0451", null, - "\u044a", + null, + null, + null, + null, + null, + null, + "\u0449", + null, + null, + null, + null, + "\u044d", + null, null, null, "\u044b", null, null, null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, "\u0438", null, null, null, null, null, - "\u044d", null, - "\u0449", + null, + "\u044a", null, null, null, @@ -2090,22 +2182,18 @@ public final class KeyboardTextsTable { null, null, null, - "\u04e9", - null, - null, - null, - null, - null, - null, - null, - null, - null, null, "\u04af,\u04b1", null, null, null, null, + "\u04e9", + null, + "\u0493", + null, + null, + null, null, null, null, @@ -2117,16 +2205,21 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, + null, + null, + null, + null, + null, + null, "\u04a3", - "\u0493", null, null, null, null, null, - "\u04d9", - null, - null, + "\u04bb", null, null, null, @@ -2134,7 +2227,10 @@ public final class KeyboardTextsTable { null, "\u049b", null, - "\u04bb" + null, + null, + null, + "\u04d9" }; private static final String[] TEXTS_km = { @@ -2264,9 +2360,6 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, "\u17db,\u00a2,\u00a3,\u20ac,\u00a5,\u20b1" }; @@ -2311,36 +2404,34 @@ public final class KeyboardTextsTable { null, "\u0451", null, - "\u044a", + null, + null, + null, + null, + null, + null, + "\u0449", + null, + null, + null, + null, + "\u044d", + null, null, null, "\u044b", null, null, null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, "\u0438", null, null, null, null, null, - "\u044d", null, - "\u0449", + null, + "\u044a", null, null, null, @@ -2375,6 +2466,12 @@ public final class KeyboardTextsTable { null, null, null, + null, + "\u04af", + null, + null, + null, + null, "\u04e9", null, null, @@ -2386,8 +2483,6 @@ public final class KeyboardTextsTable { null, null, null, - "\u04af", - null, null, null, null, @@ -2432,8 +2527,8 @@ public final class KeyboardTextsTable { "\u010d", null, "\u201d,\u201e,\u201c", - "\u0161", "\u2019,\u201a,\u2018", + "\u0161", null, null, "\u017e" @@ -2450,16 +2545,16 @@ public final class KeyboardTextsTable { "\u010d,\u00e7,\u0107", "\u0146,\u00f1,\u0144", "!text/double_9qm_lqm", - "\u0161,\u00df,\u015b,\u015f", "!text/single_9qm_lqm", + "\u0161,\u00df,\u015b,\u015f", null, "\u00fd,\u00ff", "\u017e,\u017c,\u017a", "\u010f", null, - "\u013c,\u0142,\u013a,\u013e", - "\u0123,\u011f", null, + "\u0123,\u011f", + "\u013c,\u0142,\u013a,\u013e", "\u0163,\u0165", "\u0157,\u0159,\u0155", null, @@ -2484,6 +2579,8 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, "\u0137" }; @@ -2498,7 +2595,6 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_lqm", - null, "!text/single_9qm_lqm", null, null, @@ -2510,6 +2606,7 @@ public final class KeyboardTextsTable { null, null, null, + null, "\u0450", null, null, @@ -2582,7 +2679,8 @@ public final class KeyboardTextsTable { null, null, null, - "\u0453", + null, + null, null, null, null, @@ -2591,17 +2689,19 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, - null, - null, - null, - null, "\u0437", - "\u045d", null, - "\u0455" + null, + null, + null, + null, + "\u045d", + "\u0455", + null, + null, + null, + null, + "\u0453" }; private static final String[] TEXTS_ml = { @@ -2660,38 +2760,37 @@ public final class KeyboardTextsTable { null, null, null, - "\u096f", - null, - "0", - "4", - null, - null, - "\u096e", - "\u0966", - "5", - "1", - null, "\u096c", - "?\u0967\u0968\u0969", - "\u0969", - "\u0967", - null, - "\u096d", - "\u096a", - "9", + "5", "6", - "3", + "2", null, + "1", + "4", null, "7", null, - "2", - null, "\u0968", + "3", null, + "0", + "?\u0967\u0968\u0969", "\u096b", null, - "8" + "\u096f", + "\u096d", + "\u096a", + null, + "\u0969", + "\u096e", + null, + "9", + "\u0966", + null, + "8", + null, + null, + "\u0967" }; private static final String[] TEXTS_my = { @@ -2750,12 +2849,25 @@ public final class KeyboardTextsTable { null, null, null, + "\u104a", + null, + "\u104b", + "\u104b", "!autoColumnOrder!9,\u104a,.,?,!,#,),(,/,;,...,',@,:,-,\\\",+,\\%,&", null, - "\u104a", - "\u104b", null, - "\u104b", + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + "\u104a", + null, null, null, null, @@ -2772,21 +2884,6 @@ public final class KeyboardTextsTable { null, null, null, - "\u104a", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, null, null, null, @@ -2811,7 +2908,6 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_rqm", - null, "!text/single_9qm_rqm", null, null, @@ -2829,20 +2925,6 @@ public final class KeyboardTextsTable { null, null, null, - "\u00f6", - null, - null, - null, - null, - null, - null, - null, - null, - null, - "\u00f8", - null, - null, - null, null, null, null, @@ -2850,9 +2932,28 @@ public final class KeyboardTextsTable { null, "\u00e5", null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, "\u00e6", null, null, + "\u00f8", + null, + "\u00f6", + null, null, null, null, @@ -2884,43 +2985,41 @@ public final class KeyboardTextsTable { null, null, null, - "\u096f", - null, - "0", - "4", - null, - null, - "\u096e", - "\u0966", - "5", - "1", - "!autoColumnOrder!8,.,\\,',#,),(,/,;,@,:,-,\\\",+,\\%,&", "\u096c", - "?\u0967\u0968\u0969", - "\u0969", - "\u0967", - null, - "\u096d", - "\u096a", - "9", + "5", "6", - "3", - null, + "2", + "!autoColumnOrder!8,.,\\,',#,),(,/,;,@,:,-,\\\",+,\\%,&", + "1", + "4", null, "7", null, - "2", - null, "\u0968", + "3", null, + "0", + "?\u0967\u0968\u0969", "\u096b", null, + "\u096f", + "\u096d", + "\u096a", + null, + "\u0969", + "\u096e", + null, + "9", + "\u0966", + null, "8", null, null, + "\u0967", + null, null, - "\u0964", "!autoColumnOrder!9,.,\\,?,!,#,),(,/,;,',@,:,-,\\\",+,\\%,&", + "\u0964", "\u0964" }; @@ -2935,9 +3034,9 @@ public final class KeyboardTextsTable { null, "\u00f1,\u0144", "!text/double_9qm_rqm", - null, "!text/single_9qm_rqm", null, + null, "\u0133" }; @@ -2952,13 +3051,15 @@ public final class KeyboardTextsTable { "\u0107,\u00e7,\u010d", "\u0144,\u00f1", "!text/double_9qm_rqm", - "\u015b,\u00df,\u0161", "!text/single_9qm_rqm", + "\u015b,\u00df,\u0161", null, null, "\u017c,\u017a,\u017e", null, null, + null, + null, "\u0142" }; @@ -3041,10 +3142,6 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, - null, "\u00e7" }; @@ -3065,8 +3162,8 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_rqm", - "\u0219,\u00df,\u015b,\u0161", "!text/single_9qm_rqm", + "\u0219,\u00df,\u015b,\u0161", null, null, null, @@ -3089,7 +3186,6 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_lqm", - null, "!text/single_9qm_lqm", null, null, @@ -3101,38 +3197,37 @@ public final class KeyboardTextsTable { null, null, null, + null, "\u0451", null, - "\u044a", + null, + null, + null, + null, + null, + null, + "\u0449", + null, + null, + null, + null, + "\u044d", + null, null, null, "\u044b", null, null, null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, "\u0438", null, null, null, null, null, - "\u044d", null, - "\u0449" + null, + "\u044a" }; private static final String[] TEXTS_si = { @@ -3162,16 +3257,16 @@ public final class KeyboardTextsTable { "\u010d,\u00e7,\u0107", "\u0148,\u0146,\u00f1,\u0144", "!text/double_9qm_lqm", - "\u0161,\u00df,\u015b,\u015f", "!text/single_9qm_lqm", + "\u0161,\u00df,\u015b,\u015f", null, "\u00fd,\u00ff", "\u017e,\u017c,\u017a", "\u010f", - "!text/double_raqm_laqm", - "\u013e,\u013a,\u013c,\u0142", - "\u0123,\u011f", "!text/single_raqm_laqm", + "!text/double_raqm_laqm", + "\u0123,\u011f", + "\u013e,\u013a,\u013c,\u0142", "\u0165,\u0163", "\u0155,\u0159,\u0157", null, @@ -3196,6 +3291,8 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, "\u0137" }; @@ -3210,16 +3307,14 @@ public final class KeyboardTextsTable { "\u010d,\u0107", null, "!text/double_9qm_lqm", - "\u0161", "!text/single_9qm_lqm", + "\u0161", null, null, "\u017e", "\u0111", - "!text/double_raqm_laqm", - null, - null, - "!text/single_raqm_laqm" + "!text/single_raqm_laqm", + "!text/double_raqm_laqm" }; private static final String[] TEXTS_sr_ZZ = { @@ -3233,8 +3328,8 @@ public final class KeyboardTextsTable { "\u010d,\u0107,%", null, null, - "\u0161,%", null, + "\u0161,%", null, null, "\u017e,%", @@ -3310,18 +3405,8 @@ public final class KeyboardTextsTable { null, null, null, - "Sled", - null, - "Preth", - "Tra\u017ei", - "Pauza", - null, - null, - null, - null, - null, - null, null, + "\u010cekaj", null, null, null, @@ -3330,17 +3415,24 @@ public final class KeyboardTextsTable { null, null, "\u0160alji", - null, "Idi", + "Sled", null, null, null, - "\u010cekaj", + null, + "Pauza", + null, + "Tra\u017ei", null, null, null, null, null, + null, + "Preth", + null, + null, "Gotov" }; @@ -3355,16 +3447,16 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_lqm", - null, "!text/single_9qm_lqm", null, null, null, null, + null, + "!text/single_raqm_laqm", "!text/double_raqm_laqm", null, null, - "!text/single_raqm_laqm", null, null, "\u0450", @@ -3439,7 +3531,8 @@ public final class KeyboardTextsTable { null, null, null, - "\u0452", + null, + null, null, null, null, @@ -3448,17 +3541,19 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, - null, - null, - null, - null, "\u0455", - "\u045d", null, - "\u0437" + null, + null, + null, + null, + "\u045d", + "\u0437", + null, + null, + null, + null, + "\u0452" }; private static final String[] TEXTS_sv = { @@ -3472,16 +3567,16 @@ public final class KeyboardTextsTable { "\u00e7,\u0107,\u010d", "\u0144,\u00f1,\u0148", null, - "\u015b,\u0161,\u015f,\u00df", null, + "\u015b,\u0161,\u015f,\u00df", null, "\u00fd,\u00ff", "\u017a,\u017e,\u017c", "\u00f0,\u010f", - "!text/double_raqm_laqm", - "\u0142", - null, "!text/single_raqm_laqm", + "!text/double_raqm_laqm", + null, + "\u0142", "\u0165,\u00fe", "\u0159", null, @@ -3490,30 +3585,34 @@ public final class KeyboardTextsTable { null, null, null, - "\u00f8,\u0153", - null, - null, - null, - null, - null, - null, - null, - null, - null, - "\u00f6", - null, - null, - null, - null, null, null, null, null, "\u00e5", null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, "\u00e4", null, null, + "\u00f6", + null, + "\u00f8,\u0153", + null, null, null, null, @@ -3532,8 +3631,8 @@ public final class KeyboardTextsTable { "\u00e7", "\u00f1", null, - "\u00df", null, + "\u00df", null, null, null, @@ -3638,8 +3737,8 @@ public final class KeyboardTextsTable { "\u00e7,\u0107,\u010d", "\u0148,\u00f1", null, - "\u015f,\u00df,\u015b,\u0161", null, + "\u015f,\u00df,\u015b,\u0161", null, "\u00fd", "\u017e", @@ -3660,8 +3759,8 @@ public final class KeyboardTextsTable { null, null, "!text/double_9qm_lqm", - null, "!text/single_9qm_lqm", + null, "\u20b4", null, null, @@ -3674,36 +3773,34 @@ public final class KeyboardTextsTable { null, null, null, - "\u044a", + null, + null, + null, + null, + null, + null, + "\u0449", + null, + null, + null, + null, + "\u0454", + null, null, null, "\u0456", null, null, null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, "\u0438", null, null, null, null, null, - "\u0454", null, - "\u0449", + null, + "\u044a", null, null, null, @@ -3746,27 +3843,14 @@ public final class KeyboardTextsTable { null, null, null, + "\u0491", null, null, null, null, null, null, - null, - null, - null, - null, - null, - "\u0457", - null, - null, - null, - null, - null, - null, - null, - null, - "\u0491" + "\u0457" }; private static final String[] TEXTS_uz = { @@ -3780,8 +3864,8 @@ public final class KeyboardTextsTable { "\u00e7,\u0107,\u010d", "\u0148,\u00f1", null, - "\u015f,\u00df,\u015b,\u0161", null, + "\u015f,\u00df,\u015b,\u0161", null, "\u00fd", "\u017e", @@ -3821,6 +3905,7 @@ public final class KeyboardTextsTable { "\u00e7", "\u00f1", null, + null, "\u00df" }; @@ -3835,16 +3920,16 @@ public final class KeyboardTextsTable { "\u00e7,\u0107,\u0109,\u010b,\u010d", "\u00f1,\u0144,\u0146,\u0148,\u0149,\u014b", null, - "\u00df,\u015b,\u015d,\u015f,\u0161,\u017f", null, + "\u00df,\u015b,\u015d,\u015f,\u0161,\u017f", null, "\u00fd,\u0177,\u00ff,\u0133", "\u017a,\u017c,\u017e", "\u010f,\u0111,\u00f0", null, - "\u013a,\u013c,\u013e,\u0140,\u0142", - "\u011d,\u011f,\u0121,\u0123", null, + "\u011d,\u011f,\u0121,\u0123", + "\u013a,\u013c,\u013e,\u0140,\u0142", "\u00fe,\u0163,\u0165,\u0167", "\u0155,\u0157,\u0159", null, @@ -3869,6 +3954,8 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, "\u0137,\u0138", null, null, @@ -3914,31 +4001,10 @@ public final class KeyboardTextsTable { null, null, null, - null, - null, - null, - null, - null, - null, - null, "\u0175", null, null, null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, "\u0125", null, null, @@ -3958,6 +4024,25 @@ public final class KeyboardTextsTable { null, null, null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, "\u0135" }; @@ -3972,41 +4057,24 @@ public final class KeyboardTextsTable { EMPTY, EMPTY, "!text/double_lqm_rqm", - EMPTY, "!text/single_lqm_rqm", + EMPTY, "$", EMPTY, EMPTY, EMPTY, + "!text/single_laqm_raqm", "!text/double_laqm_raqm", EMPTY, EMPTY, - "!text/single_laqm_raqm", EMPTY, EMPTY, EMPTY, - "9", + "6", EMPTY, EMPTY, EMPTY, - EMPTY, - EMPTY, - "8", - "0", - EMPTY, - EMPTY, "!text/morekeys_tablet_punctuation", - "6", - "?123", - "3", - "1", - EMPTY, - "7", - "4", - EMPTY, - EMPTY, - EMPTY, - EMPTY, EMPTY, EMPTY, EMPTY, @@ -4014,131 +4082,242 @@ public final class KeyboardTextsTable { EMPTY, "2", EMPTY, + EMPTY, + EMPTY, + "?123", "5", EMPTY, + "9", + "7", + "4", EMPTY, - "?,!,\u203d,\u2026,_,\\\\,|,=", + "3", + "8", + EMPTY, + EMPTY, + "0", + EMPTY, + EMPTY, + EMPTY, + EMPTY, + "1", EMPTY, ",", - ".", "!text/morekeys_punctuation", ".", - "<", - "[", - "\u2264", - EMPTY, - "\u2039", - EMPTY, - "(", - ",", - ")", - EMPTY, - "\u203a", - "{", + ".", + "/,?,!,\u203d,\u2026,_,\\\\,|,=", EMPTY, "\u00ab", - "\u2265", + "(", + EMPTY, + "\u00bb", + EMPTY, + ")", + "\u203a", + "}", + EMPTY, + "<", ">", EMPTY, - "\u00bf", - "\u00bb", - "}", + "]", + "\u2265", + "\u2039", + ",", EMPTY, "\u00f1", EMPTY, - "]", + "{", + "\u00bf", + "[", + "\u2264", "\u2020,\u2021,\u2605", EMPTY, - "!string/label_next_key", - EMPTY, - "!string/label_previous_key", - "!string/label_search_key", - "!string/label_pause_key", - "?", - EMPTY, - EMPTY, - "!fixedColumnOrder!3,!text/keyspecs_right_parenthesis_more_keys", - EMPTY, - EMPTY, - EMPTY, - EMPTY, - "\u2030", - "!fixedColumnOrder!3,!text/keyspecs_left_parenthesis_more_keys", - "?,!,\u203d,\u2026,_,\\\\,|,=", - EMPTY, - EMPTY, - ";", - "!string/label_send_key", - EMPTY, - "!string/label_go_key", - "%", EMPTY, EMPTY, "!string/label_wait_key", - EMPTY, - EMPTY, - EMPTY, - EMPTY, "\u266a,\u2665,\u2660,\u2666,\u2663", - "!string/label_done_key", - "x", - "w", - "\u00a1,\u203d", EMPTY, - "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_left_double_angle_quote", + EMPTY, + EMPTY, + EMPTY, + EMPTY, + EMPTY, + "!string/label_send_key", + "!string/label_go_key", + "!string/label_next_key", + EMPTY, + "/,?,!,\u203d,\u2026,_,\\\\,|,=", + EMPTY, + ";", + "!string/label_pause_key", + EMPTY, + "!string/label_search_key", + "!fixedColumnOrder!3,!text/keyspecs_right_parenthesis_more_keys", + EMPTY, + "?", + "%", + EMPTY, + EMPTY, + "!string/label_previous_key", + EMPTY, + "\u2030", + "!string/label_done_key", + EMPTY, + EMPTY, + "!fixedColumnOrder!3,!text/keyspecs_left_parenthesis_more_keys", + EMPTY, + "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_right_double_angle_quote", + "q", "y", EMPTY, "\u00b1", - "q", - "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_right_double_angle_quote", + EMPTY, "\u00a2,\u00a3,\u20ac,\u00a5,\u20b1", + "w", + "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_left_double_angle_quote", + EMPTY, + "x", + EMPTY, + "\u00a1,\u203d", EMPTY, EMPTY, + "!fixedColumnOrder!2,!hasLabels!,!text/keylabel_time_am,!text/keylabel_time_pm", EMPTY, EMPTY, - EMPTY, - "\u2018,\u201a,\u2019", - "\u201a,\u2018,\u2019", - "\u201e,\u201c,\u201d", - "!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote", - "= \\\\ <", - "PM", - "!text/keyspec_less_than,!text/keyspec_left_curly_bracket,!text/keyspec_left_square_bracket", + "!icon/action_redo|!code/action_redo", "\u2074", - "\u201d,\u201e,\u201c", "123", - "!text/keyspec_left_single_angle_quote,!text/keyspec_right_single_angle_quote", - "\u215d", - "\uff0a\uff03", - "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes", - "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes", - "!fixedColumnOrder!4,!needsDividers!,!icon/action_switch_language|!code/action_switch_language,!icon/action_text_edit|!code/action_text_edit,!icon/action_clipboard_history|!code/action_clipboard_history,!icon/action_emoji|!code/action_emoji,!icon/action_undo|!code/action_undo,!icon/action_redo|!code/action_redo", - "!icon/settings_key|!code/key_settings", - "!icon/shortcut_key|!code/key_shortcut", - "\u201c,\u201e,\u201d", - "\u2018,\u2019,\u201a", - "!text/keyspec_right_double_angle_quote,!text/keyspec_left_double_angle_quote", - "AM", - "\u215e", + "&,|", + "@", + "!icon/action_copy|!code/action_copy", + "\\%", EMPTY, - "!hasLabels!,!text/label_next_key|!code/key_action_next", - "!hasLabels!,.net,.org,.gov,.edu", - "\u00b3,\u00be,\u215c", - "\u207f,\u2205", - "\u00b9,\u00bd,\u2153,\u00bc,\u215b", - "~ [ <", "\u2019,\u201a,\u2018", EMPTY, - ".com", - "!text/keyspec_right_single_angle_quote,!text/keyspec_left_single_angle_quote", + "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes", + "\u201c,\u201e,\u201d", + "1", + "]", + "&", + "),],},>", + "!fixedColumnOrder!4,!needsDividers!,!icon/action_switch_language|!code/action_switch_language,!icon/action_text_edit|!code/action_text_edit,!icon/action_clipboard_history|!code/action_clipboard_history,!icon/action_emoji|!code/action_emoji,!icon/action_undo|!code/action_undo,!icon/action_redo|!code/action_redo", + "8", + "!text/keyspec_less_than,!text/keyspec_left_curly_bracket,!text/keyspec_left_square_bracket", + "\u00fa,\u00fb,\u00fc,\u00f9,\u016b", + "!hasLabels!,!text/label_next_key|!code/key_action_next", + "!hasLabels!,!text/label_previous_key|!code/key_action_previous", + EMPTY, + "^", + "?,/", + EMPTY, + "\u201d,\u201e,\u201c", + EMPTY, + EMPTY, + EMPTY, + EMPTY, + EMPTY, + EMPTY, + EMPTY, + "!text/keyspec_right_double_angle_quote,!text/keyspec_left_double_angle_quote", "\u00b2,\u2154", + "\u00f1", + "\u00e9,\u00e8,\u00ea,\u00eb,\u0113", + "+,=", + EMPTY, + "6", + EMPTY, + "!hasLabels!,.net,.org,.gov,.edu", + "\u201a,\u2018,\u2019", + "0", + "\u215d", + EMPTY, + "|", + "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes", + "\u2018,\u201a,\u2019", + EMPTY, + "!icon/action_cut|!code/action_cut", + "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes", + ")", + "!text/keyspec_left_single_angle_quote,!text/keyspec_right_single_angle_quote", + "!icon/settings_key|!code/key_settings", + "}", + "AM", + "[", + "!icon/action_undo|!code/action_undo", + "5", + "*", + "@", + "#", + "!", + "{", + "=", + ";", + EMPTY, + "= \\\\ <", + "%", + "<", + "!text/keyspec_right_single_angle_quote,!text/keyspec_left_single_angle_quote", + "\u00e0,\u00e1,\u00e2,\u00e4,\u00e6,\u00e3,\u00e5,\u0101", + "\u00df", + "'", + "\u201e,\u201c,\u201d", + ">", + EMPTY, + "\u2018,\u2019,\u201a", + EMPTY, + "$,\u20ac,\u00a3,\u00a5,\u00a2", + "7", + "2", + "\u00e7", + "PM", + "(,[,{,<", + "\\%", + EMPTY, + EMPTY, + ":", + "4", + "\u201c,\u201d,\u201e", + EMPTY, + "\u00b9,\u00bd,\u2153,\u00bc,\u215b", + EMPTY, + "\u00b3,\u00be,\u215c", + "(", + "*", + "!icon/shortcut_key|!code/key_shortcut", + "-,\u2013,\u2014,_", + "\u207f,\u2205", + EMPTY, + "3", + "!", + EMPTY, + EMPTY, + EMPTY, + "9", + ".com", + "\u00ed,\u00ee,\u00ef,\u012b,\u00ec", + "!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote", + "!icon/action_select_all|!code/action_select_all", + EMPTY, + EMPTY, + "\u00f3,\u00f4,\u00f6,\u00f2,\u0153,\u00f8,\u014d,\u00f5", + "$,\u00a2,\u20ac,\u00a3,\u00a5,\u20b1", + "\u215e", + "$", + EMPTY, + "~ [ <", "!text/keyspec_greater_than,!text/keyspec_right_curly_bracket,!text/keyspec_right_square_bracket", EMPTY, - "$,\u00a2,\u20ac,\u00a3,\u00a5,\u20b1", - "!hasLabels!,!text/label_previous_key|!code/key_action_previous", - "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes", - "!fixedColumnOrder!2,!hasLabels!,!text/keylabel_time_am,!text/keylabel_time_pm", - "\u201c,\u201d,\u201e" + EMPTY, + "!icon/action_paste|!code/action_paste", + "\"", + EMPTY, + "#", + "\uff0a\uff03", + EMPTY, + "\\\\", + EMPTY, + EMPTY }; diff --git a/java/src/org/futo/inputmethod/latin/settings/LongPressKeySettings.kt b/java/src/org/futo/inputmethod/latin/settings/LongPressKeySettings.kt new file mode 100644 index 000000000..db61f1ba2 --- /dev/null +++ b/java/src/org/futo/inputmethod/latin/settings/LongPressKeySettings.kt @@ -0,0 +1,104 @@ +package org.futo.inputmethod.latin.settings + +import android.content.Context +import androidx.datastore.preferences.core.stringPreferencesKey +import org.futo.inputmethod.keyboard.internal.MoreKeySpec +import org.futo.inputmethod.latin.uix.SettingsKey +import org.futo.inputmethod.latin.uix.getSettingBlocking + +enum class LongPressKey { + Numbers, + LanguageKeys, + Symbols, + QuickActions, + MiscLetters +} + +fun LongPressKey.name(context: Context): String { + return when(this) { + LongPressKey.Numbers -> "Numbers" + LongPressKey.LanguageKeys -> "Language keys" + LongPressKey.Symbols -> "Symbols" + LongPressKey.QuickActions -> "Quick actions" + LongPressKey.MiscLetters -> "Misc. letters from common languages" + } +} +fun LongPressKey.description(context: Context): String { + return when(this) { + LongPressKey.Numbers -> "e.g. [1] on [q]" + LongPressKey.LanguageKeys -> "e.g. [á] on [a] in Spanish" + LongPressKey.Symbols -> "e.g. [@] on [a]" + LongPressKey.QuickActions -> "e.g. [Copy] on [c]" + LongPressKey.MiscLetters -> "e.g. [ß] on [s] in all Latin script languages" + } +} + +private fun getKind(moreKey: String): LongPressKey? { + val moreKeyStripped = moreKey.replace("!text/", "") + + return if(moreKeyStripped.startsWith("morekeys_misc_")) { + LongPressKey.MiscLetters + } else if(moreKeyStripped.startsWith("actions_")) { + LongPressKey.QuickActions + } else if(moreKeyStripped.startsWith("qwertysyms_")) { + LongPressKey.Symbols + } else if(moreKeyStripped.startsWith("number_")) { + LongPressKey.Numbers + } else if(moreKeyStripped.startsWith("morekeys_")) { + LongPressKey.LanguageKeys + } else { + null + } +} + +val LongPressKeyLayoutSetting = SettingsKey( + stringPreferencesKey("longPressKeyOrdering"), + "${LongPressKey.Numbers.ordinal},${LongPressKey.LanguageKeys.ordinal},${LongPressKey.Symbols.ordinal},${LongPressKey.QuickActions.ordinal},${LongPressKey.MiscLetters.ordinal}" +) + +fun String.toLongPressKeyLayoutItems(): List { + return this.split(",").mapNotNull { + val id = it.toIntOrNull() ?: return@mapNotNull null + + LongPressKey.entries[id] + } +} + +fun List.toEncodedString(): String { + return this.joinToString(separator = ",") { + "${it.ordinal}" + } +} + +class LongPressKeySettings(val context: Context) { + private val currentSetting = context.getSettingBlocking(LongPressKeyLayoutSetting).toLongPressKeyLayoutItems() + + fun reorderMoreKeys(moreKeys: String): String { + val keys = MoreKeySpec.splitKeySpecs(moreKeys)?.toList() ?: listOf(moreKeys) + + val finalKeys = mutableListOf() + + // Add non configurable keys first + keys.forEach { key -> + if(getKind(key) == null) { + finalKeys.add(key) + } + } + + // Add the necessary configurable keys in the correct order. + // Key kinds not enabled are not added + currentSetting.forEach { kind -> + keys.forEach { key -> + if(getKind(key) == kind) { + finalKeys.add(key) + } + } + } + + return finalKeys.joinToString(separator = ",") + } + + override operator fun equals(other: Any?): Boolean { + return other is LongPressKeySettings && (other.currentSetting.joinToString(",") == currentSetting.joinToString(",")) + } +} \ No newline at end of file diff --git a/java/src/org/futo/inputmethod/latin/uix/TextEditPopupActivity.kt b/java/src/org/futo/inputmethod/latin/uix/TextEditPopupActivity.kt index b9af94da5..028131ec5 100644 --- a/java/src/org/futo/inputmethod/latin/uix/TextEditPopupActivity.kt +++ b/java/src/org/futo/inputmethod/latin/uix/TextEditPopupActivity.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.viewinterop.AndroidView import org.futo.inputmethod.latin.R @Composable -fun AndroidTextInput() { +fun AndroidTextInput(allowPredictions: Boolean = true) { val context = LocalContext.current val bgColor = MaterialTheme.colorScheme.background val fgColor = MaterialTheme.colorScheme.onBackground @@ -30,9 +30,14 @@ fun AndroidTextInput() { if(!LocalInspectionMode.current) { val editText = remember { EditText(context).apply { - inputType = EditorInfo.TYPE_CLASS_TEXT - isSingleLine = false - this. + if(allowPredictions) { + inputType = EditorInfo.TYPE_CLASS_TEXT + isSingleLine = false + } else { + inputType = EditorInfo.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE + isSingleLine = true + } + setHint(R.string.try_typing) setBackgroundColor(bgColor.toArgb()) diff --git a/java/src/org/futo/inputmethod/latin/uix/UixManager.kt b/java/src/org/futo/inputmethod/latin/uix/UixManager.kt index f3b6e2a66..8a82caeba 100644 --- a/java/src/org/futo/inputmethod/latin/uix/UixManager.kt +++ b/java/src/org/futo/inputmethod/latin/uix/UixManager.kt @@ -327,7 +327,7 @@ class UixManager(private val latinIME: LatinIME) { persistentStates[action] = action.persistentState?.let { it(keyboardManagerForAction) } } - currWindowActionWindow = action.windowImpl?.let { it(keyboardManagerForAction, persistentStates[action]) } + currWindowActionWindow = (action.windowImpl!!)(keyboardManagerForAction, persistentStates[action]) if(action.keepScreenAwake) { latinIME.window.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) diff --git a/java/src/org/futo/inputmethod/latin/uix/settings/Components.kt b/java/src/org/futo/inputmethod/latin/uix/settings/Components.kt index d4a73c1c9..c4a3c8507 100644 --- a/java/src/org/futo/inputmethod/latin/uix/settings/Components.kt +++ b/java/src/org/futo/inputmethod/latin/uix/settings/Components.kt @@ -465,11 +465,11 @@ fun SettingSliderSharedPrefsInt( } @Composable -fun ScrollableList(content: @Composable () -> Unit) { +fun ScrollableList(modifier: Modifier = Modifier, content: @Composable () -> Unit) { val scrollState = rememberScrollState() Column( - modifier = Modifier + modifier = modifier .fillMaxSize() .verticalScroll(scrollState) ) { diff --git a/java/src/org/futo/inputmethod/latin/uix/settings/SettingsActivity.kt b/java/src/org/futo/inputmethod/latin/uix/settings/SettingsActivity.kt index fdd42b469..d13d1a415 100644 --- a/java/src/org/futo/inputmethod/latin/uix/settings/SettingsActivity.kt +++ b/java/src/org/futo/inputmethod/latin/uix/settings/SettingsActivity.kt @@ -30,11 +30,15 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import org.futo.inputmethod.latin.uix.BasicThemeProvider +import org.futo.inputmethod.latin.uix.DynamicThemeProvider +import org.futo.inputmethod.latin.uix.DynamicThemeProviderOwner import org.futo.inputmethod.latin.uix.ImportResourceActivity import org.futo.inputmethod.latin.uix.THEME_KEY import org.futo.inputmethod.latin.uix.USE_SYSTEM_VOICE_INPUT import org.futo.inputmethod.latin.uix.deferGetSetting import org.futo.inputmethod.latin.uix.getSetting +import org.futo.inputmethod.latin.uix.getSettingFlow import org.futo.inputmethod.latin.uix.theme.StatusBarColorSetter import org.futo.inputmethod.latin.uix.theme.ThemeOption import org.futo.inputmethod.latin.uix.theme.ThemeOptions @@ -76,7 +80,7 @@ public const val IMPORT_GGUF_MODEL_REQUEST = 71067309 public const val EXPORT_GGUF_MODEL_REQUEST = 80595439 -class SettingsActivity : ComponentActivity() { +class SettingsActivity : ComponentActivity(), DynamicThemeProviderOwner { private val themeOption: MutableState = mutableStateOf(null) private val inputMethodEnabled = mutableStateOf(false) @@ -181,6 +185,23 @@ class SettingsActivity : ComponentActivity() { checkForUpdateAndSaveToPreferences(applicationContext) } + lifecycleScope.launch { + getSettingFlow(THEME_KEY).collect { + val themeOptionFromSettings = ThemeOptions[it] + val themeOption = when { + themeOptionFromSettings == null -> VoiceInputTheme + !themeOptionFromSettings.available(this@SettingsActivity) -> VoiceInputTheme + else -> themeOptionFromSettings + } + + this@SettingsActivity.themeOption.value = themeOption + this@SettingsActivity.themeProvider = BasicThemeProvider( + context = this@SettingsActivity, + overrideColorScheme = themeOption.obtainColors(this@SettingsActivity) + ) + } + } + deferGetSetting(THEME_KEY) { val themeOptionFromSettings = ThemeOptions[it] val themeOption = when { @@ -252,4 +273,10 @@ class SettingsActivity : ComponentActivity() { } } } + + // Provides theme for keyboard preview + private var themeProvider: BasicThemeProvider? = null + override fun getDrawableProvider(): DynamicThemeProvider { + return themeProvider!! + } } \ No newline at end of file diff --git a/java/src/org/futo/inputmethod/latin/uix/settings/SettingsNavigator.kt b/java/src/org/futo/inputmethod/latin/uix/settings/SettingsNavigator.kt index e406b7ead..32292f6ab 100644 --- a/java/src/org/futo/inputmethod/latin/uix/settings/SettingsNavigator.kt +++ b/java/src/org/futo/inputmethod/latin/uix/settings/SettingsNavigator.kt @@ -24,9 +24,9 @@ import org.futo.inputmethod.latin.uix.settings.pages.PaymentScreen import org.futo.inputmethod.latin.uix.settings.pages.PaymentThankYouScreen import org.futo.inputmethod.latin.uix.settings.pages.PredictiveTextScreen import org.futo.inputmethod.latin.uix.settings.pages.ThemeScreen -import org.futo.inputmethod.latin.uix.settings.pages.TypingScreen import org.futo.inputmethod.latin.uix.settings.pages.VoiceInputScreen import org.futo.inputmethod.latin.uix.settings.pages.addModelManagerNavigation +import org.futo.inputmethod.latin.uix.settings.pages.addTypingNavigation import org.futo.inputmethod.latin.uix.urlDecode import org.futo.inputmethod.latin.uix.urlEncode @@ -54,7 +54,7 @@ fun SettingsNavigator( composable("addLanguage") { AddLanguageScreen(navController) } composable("predictiveText") { PredictiveTextScreen(navController) } composable("advancedparams") { AdvancedParametersScreen(navController) } - composable("typing") { TypingScreen(navController) } + addTypingNavigation(navController) composable("voiceInput") { VoiceInputScreen(navController) } composable("themes") { ThemeScreen(navController) } composable("help") { HelpScreen(navController) } diff --git a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Home.kt b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Home.kt index 77fd72496..20a1b2753 100644 --- a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Home.kt +++ b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Home.kt @@ -64,32 +64,43 @@ fun HomeScreen(navController: NavHostController = rememberNavController()) { ) NavigationItem( - title = "Predictive Text", + title = "Keyboard & Typing", style = NavigationItemStyle.HomeSecondary, - navigate = { navController.navigate("predictiveText") }, - icon = painterResource(id = R.drawable.shift) + navigate = { navController.navigate("typing") }, + icon = painterResource(id = R.drawable.keyboard) ) NavigationItem( - title = "Typing Preferences", - style = NavigationItemStyle.HomeSecondary, - navigate = { navController.navigate("typing") }, - icon = painterResource(id = R.drawable.delete) + title = "Text Prediction", + style = NavigationItemStyle.HomeTertiary, + navigate = { navController.navigate("predictiveText") }, + icon = painterResource(id = R.drawable.text_prediction) ) NavigationItem( title = "Voice Input", - style = NavigationItemStyle.HomeSecondary, + style = NavigationItemStyle.HomePrimary, subtitle = if(useDataStoreValueBlocking(USE_SYSTEM_VOICE_INPUT)) { "Built-in voice input is disabled!" } else { null }, navigate = { navController.navigate("voiceInput") }, icon = painterResource(id = R.drawable.mic_fill) ) + NavigationItem( + title = stringResource(R.string.edit_personal_dictionary), + style = NavigationItemStyle.HomeSecondary, + icon = painterResource(id = R.drawable.book), + navigate = { + val intent = Intent("android.settings.USER_DICTIONARY_SETTINGS") + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(intent) + } + ) + NavigationItem( title = "Theme", style = NavigationItemStyle.HomeTertiary, navigate = { navController.navigate("themes") }, - icon = painterResource(id = R.drawable.eye) + icon = painterResource(id = R.drawable.themes) ) if(!isPaid) { @@ -103,7 +114,7 @@ fun HomeScreen(navController: NavHostController = rememberNavController()) { NavigationItem( title = "Help & Feedback", - style = NavigationItemStyle.HomePrimary, + style = NavigationItemStyle.HomeSecondary, navigate = { navController.navigate("help") }, icon = painterResource(id = R.drawable.help_circle) ) @@ -111,7 +122,7 @@ fun HomeScreen(navController: NavHostController = rememberNavController()) { if(isDeveloper || LocalInspectionMode.current) { NavigationItem( title = "Developer Settings", - style = NavigationItemStyle.HomeSecondary, + style = NavigationItemStyle.HomeTertiary, navigate = { navController.navigate("developer") }, icon = painterResource(id = R.drawable.code) ) diff --git a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt index a882a030a..32e7d2871 100644 --- a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt +++ b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt @@ -1,46 +1,436 @@ package org.futo.inputmethod.latin.uix.settings.pages +import android.content.Context import android.preference.PreferenceManager +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.gestures.detectDragGestures +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyItemScope +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.booleanResource +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex import androidx.core.content.edit import androidx.datastore.preferences.core.intPreferencesKey +import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController +import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.futo.inputmethod.latin.R +import org.futo.inputmethod.latin.settings.LongPressKey +import org.futo.inputmethod.latin.settings.LongPressKeyLayoutSetting import org.futo.inputmethod.latin.settings.Settings import org.futo.inputmethod.latin.settings.Settings.PREF_VIBRATION_DURATION_SETTINGS +import org.futo.inputmethod.latin.settings.description +import org.futo.inputmethod.latin.settings.name +import org.futo.inputmethod.latin.settings.toEncodedString +import org.futo.inputmethod.latin.settings.toLongPressKeyLayoutItems +import org.futo.inputmethod.latin.uix.AndroidTextInput +import org.futo.inputmethod.latin.uix.KeyHintsSetting +import org.futo.inputmethod.latin.uix.KeyboardBottomOffsetSetting +import org.futo.inputmethod.latin.uix.KeyboardHeightMultiplierSetting import org.futo.inputmethod.latin.uix.SHOW_EMOJI_SUGGESTIONS import org.futo.inputmethod.latin.uix.SettingsKey import org.futo.inputmethod.latin.uix.actions.AllActions +import org.futo.inputmethod.latin.uix.actions.ClipboardHistoryAction import org.futo.inputmethod.latin.uix.actions.ClipboardHistoryEnabled +import org.futo.inputmethod.latin.uix.actions.CopyAction +import org.futo.inputmethod.latin.uix.actions.CutAction +import org.futo.inputmethod.latin.uix.actions.EmojiAction +import org.futo.inputmethod.latin.uix.actions.PasteAction +import org.futo.inputmethod.latin.uix.actions.RedoAction +import org.futo.inputmethod.latin.uix.actions.SelectAllAction +import org.futo.inputmethod.latin.uix.actions.SwitchLanguageAction +import org.futo.inputmethod.latin.uix.actions.TextEditAction +import org.futo.inputmethod.latin.uix.actions.UndoAction +import org.futo.inputmethod.latin.uix.actions.VoiceInputAction +import org.futo.inputmethod.latin.uix.getSettingBlocking +import org.futo.inputmethod.latin.uix.settings.DataStoreItem import org.futo.inputmethod.latin.uix.settings.DropDownPicker +import org.futo.inputmethod.latin.uix.settings.NavigationItem +import org.futo.inputmethod.latin.uix.settings.NavigationItemStyle import org.futo.inputmethod.latin.uix.settings.ScreenTitle import org.futo.inputmethod.latin.uix.settings.ScrollableList import org.futo.inputmethod.latin.uix.settings.SettingItem +import org.futo.inputmethod.latin.uix.settings.SettingListLazy import org.futo.inputmethod.latin.uix.settings.SettingSlider import org.futo.inputmethod.latin.uix.settings.SettingSliderSharedPrefsInt import org.futo.inputmethod.latin.uix.settings.SettingToggleDataStore import org.futo.inputmethod.latin.uix.settings.SettingToggleSharedPrefs import org.futo.inputmethod.latin.uix.settings.useDataStore +import org.futo.inputmethod.latin.uix.settings.useSharedPrefsBool import org.futo.inputmethod.latin.uix.settings.useSharedPrefsInt +import kotlin.math.absoluteValue import kotlin.math.roundToInt +import kotlin.math.sign val vibrationDurationSetting = SettingsKey( intPreferencesKey("vibration_duration"), -1 ) -@Preview +fun NavGraphBuilder.addTypingNavigation( + navController: NavHostController +) { + composable("typing") { TypingScreen(navController) } + composable("resize") { ResizeScreen(navController) } + composable("longPress") { LongPressScreen(navController) } + composable("actionKey") { ActionKeyScreen(navController) } +} + +@Preview(showBackground = true) +@Composable +fun ResizeScreen(navController: NavHostController = rememberNavController()) { + val context = LocalContext.current + Box { + ScrollableList { + ScreenTitle("Resize Keyboard", showBack = true, navController) + + SettingSlider( + title = "Keyboard Height", + setting = KeyboardHeightMultiplierSetting, + range = 0.33f..1.75f, transform = { it }, + indicator = { "${(it * 100.0f).roundToInt()}%" }, + steps = 16 + ) + SettingSlider( + title = "Keyboard Offset", + setting = KeyboardBottomOffsetSetting, + range = 0.0f..50.0f, + hardRange = 0.0f..250.0f, + transform = { it }, + indicator = { "${String.format("%.1f", it)} dp" }, + steps = 9 + ) + + AndroidTextInput(allowPredictions = false) + } + + /* + AndroidView(factory = { + val ctx = ContextThemeWrapper(context, R.style.KeyboardTheme_LXX_Light) + + val inputView = LayoutInflater.from(ctx).inflate( + R.layout.input_view, null, false + ) as InputView + + val settingsValues = Settings.getInstance().current + + val builder = KeyboardLayoutSet.Builder(ctx, null) + val res: Resources = ctx.resources + + val currentSubtype = RichInputMethodSubtype(Subtypes.getActiveSubtype(ctx)) + + val keyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res) + val keyboardHeight = ResourceUtils.getKeyboardHeight(res, settingsValues) + builder.setKeyboardGeometry(keyboardWidth, keyboardHeight) + builder.setSubtype(currentSubtype) + builder.setVoiceInputKeyEnabled(settingsValues.mShowsVoiceInputKey) + builder.setBottomActionKey(settingsValues.mShowsActionKey, settingsValues.mActionKeyId) + builder.setSplitLayoutEnabledByUser( + ProductionFlags.IS_SPLIT_KEYBOARD_SUPPORTED + && settingsValues.mIsSplitKeyboardEnabled + ) + builder.setNumberRow(settingsValues.mIsNumberRowEnabled) + + + val keyboardLayoutSet = builder.build() + + val keyboardView = inputView.findViewById(R.id.keyboard_view) as MainKeyboardView + + keyboardView.setKeyboard(keyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET)) + /* + mMainKeyboardFrame = mCurrentInputView!!.findViewById(R.id.main_keyboard_frame) + mKeyboardView = + mCurrentInputView!!.findViewById(R.id.keyboard_view) as MainKeyboardView + */ + inputView + }, modifier = Modifier.align(Alignment.BottomCenter)) + */ + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +private fun LazyItemScope.DraggableSettingItem(idx: Int, item: LongPressKey, moveItem: (LongPressKey, Int) -> Unit, disable: (LongPressKey) -> Unit, dragIcon: @Composable () -> Unit) { + val context = LocalContext.current + val dragging = remember { mutableStateOf(false) } + val offset = remember { mutableFloatStateOf(0.0f) } + val height = remember { mutableIntStateOf(1) } + + SettingItem( + title = "${idx+1}. " + item.name(context), + subtitle = item.description(context), + icon = dragIcon, + modifier = Modifier + .onSizeChanged { size -> height.intValue = size.height } + .pointerInput(Unit) { + detectDragGestures( + onDragStart = { + dragging.value = true + offset.floatValue = 0.0f + }, + onDragEnd = { + dragging.value = false + offset.floatValue = 0.0f + }, + onDragCancel = { + dragging.value = false + offset.floatValue = 0.0f + }, + onDrag = { change, dragAmount -> + offset.floatValue += dragAmount.y + if (offset.floatValue.absoluteValue > height.intValue) { + val direction = offset.floatValue.sign.toInt() + moveItem( + item, + direction + ) + offset.floatValue -= height.intValue * direction + } + + } + ) + } + .let { modifier -> + if (!dragging.value) { + modifier.animateItemPlacement() + } else { + modifier + .zIndex(10.0f) + .graphicsLayer { + clip = false + translationX = 0.0f + translationY = offset.floatValue + } + } + } + ) { + IconButton(onClick = { disable(item) }) { + Icon(Icons.Default.Clear, contentDescription = "Remove") + } + } +} + +@OptIn(ExperimentalFoundationApi::class) +fun LazyListScope.longPressKeyLayoutEditor(context: Context, setting: DataStoreItem) { + item { + ScreenTitle(title = "Layout of long-press keys") + } + + item { + Button(onClick = { + setting.setValue(LongPressKeyLayoutSetting.default) + }) { + Text("Reset to default") + } + } + + + val dragIcon: @Composable () -> Unit = { + Icon(Icons.Default.Menu, contentDescription = null, tint = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.75f)) + } + + + val items = setting.value.toLongPressKeyLayoutItems() + + + val moveItem: (item: LongPressKey, direction: Int) -> Unit = { item, direction -> + val oldItems = context.getSettingBlocking(LongPressKeyLayoutSetting).toLongPressKeyLayoutItems() + val oldIdx = oldItems.indexOf(item) + + val insertIdx = (oldIdx + direction).coerceAtLeast(0).coerceAtMost(oldItems.size - 1) + + val newItems = oldItems.filter { it != item }.toMutableList().apply { + add(insertIdx, item) + }.toEncodedString() + + setting.setValue(newItems) + } + + val disable: (item : LongPressKey) -> Unit = { item -> + val oldItems = context.getSettingBlocking(LongPressKeyLayoutSetting).toLongPressKeyLayoutItems() + + val newItems = oldItems.filter { it != item }.toEncodedString() + + setting.setValue(newItems) + + } + + val enable: (item : LongPressKey) -> Unit = { item -> + val oldItems = context.getSettingBlocking(LongPressKeyLayoutSetting).toLongPressKeyLayoutItems() + + val newItems = oldItems.filter { it != item }.toMutableList().apply { + add(item) + }.toEncodedString() + + setting.setValue(newItems) + } + + item { + Text("Active", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center) + } + itemsIndexed(items, key = { i, v -> v.ordinal }) { i, v -> + DraggableSettingItem(idx = i, item = v, moveItem = moveItem, disable = disable, dragIcon = dragIcon) + } + + item { + Text("Inactive", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center) + } + items(LongPressKey.entries.filter { !items.contains(it) }, key = { it.ordinal }) { + SettingItem( + title = it.name(context), + subtitle = it.description(context), + modifier = Modifier.animateItemPlacement() + ) { + IconButton(onClick = { enable(it) }) { + Icon(Icons.Default.Add, contentDescription = "Add") + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun LongPressScreen(navController: NavHostController = rememberNavController()) { + val context = LocalContext.current + val setting = useDataStore(LongPressKeyLayoutSetting, blocking = true) + SettingListLazy { + item { + ScreenTitle("Long-Press Keys", showBack = true, navController) + } + + item { + SettingToggleDataStore( + title = "Show hints", + subtitle = "Display a small hint on each key, showing the primary long-press key", + setting = KeyHintsSetting + ) + } + + /* + SettingToggleDataStore( + title = "Spacebar language switcher", + subtitle = "Show the language switching menu when long-pressing the space", + setting = KeyHintsSetting + )*/ + + longPressKeyLayoutEditor( + context = context, + setting = setting, + ) + + item { + SettingSliderSharedPrefsInt( + title = "Long Press Duration", + subtitle = "How long a key needs to be pressed to be considered a long-press", + key = Settings.PREF_KEY_LONGPRESS_TIMEOUT, + default = 300, + range = 100.0f..700.0f, + hardRange = 25.0f..1200.0f, + transform = { it.roundToInt() }, + indicator = { "$it ms" }, + steps = 23 + ) + } + + /* + SettingRadio( + title = "Spacebar behavior", + options = listOf(0, 1, 2), + optionNames = listOf( + "Swiping moves cursor, long-pressing switches language", + "Swiping changes language, long-pressing moves cursor", + "Swiping and long-pressing only moves cursor" + ), + setting = + )*/ + } +} + +@Preview(showBackground = true) +@Composable +fun ActionKeyScreen(navController: NavHostController = rememberNavController()) { + val context = LocalContext.current + val isActionKeyActive = useSharedPrefsBool(key = Settings.PREF_SHOW_ACTION_KEY, default = true) + val emojiKey = useSharedPrefsInt(key = Settings.PREF_ACTION_KEY_ID, default = 0) + + val permittedOptions = listOf( + EmojiAction, + SwitchLanguageAction, + VoiceInputAction, + ClipboardHistoryAction, + TextEditAction, + UndoAction, + RedoAction, + CutAction, + CopyAction, + PasteAction, + SelectAllAction, + ) + + ScrollableList { + ScreenTitle("Action Key", showBack = true, navController) + + + SettingToggleSharedPrefs( + title = "Action key enabled", + subtitle = "Show the action key on the bottom row", + key = Settings.PREF_SHOW_ACTION_KEY, + default = true + ) + + if(isActionKeyActive.value) { + SettingItem(title = "Action key") { + DropDownPicker( + label = "", + options = permittedOptions, + selection = AllActions[emojiKey.value], + onSet = { + emojiKey.setValue(AllActions.indexOf(it)) + }, + getDisplayName = { + context.getString(it.name) + }, + modifier = Modifier.width(180.dp) + ) + } + } + + } +} + +@Preview(showBackground = true) @Composable fun TypingScreen(navController: NavHostController = rememberNavController()) { val context = LocalContext.current @@ -56,71 +446,103 @@ fun TypingScreen(navController: NavHostController = rememberNavController()) { } ScrollableList { - ScreenTitle("Typing Preferences", showBack = true, navController) + ScreenTitle("Keyboard", showBack = true, navController) + + + NavigationItem( + title = "Resize Keyboard", + subtitle = "Change the height and offset of the keyboard", + style = NavigationItemStyle.Misc, + navigate = { navController.navigate("resize") }, + icon = painterResource(id = R.drawable.maximize) + ) + + SettingToggleSharedPrefs( + title = "Show Number Row", + subtitle = "When active, the number row is shown on top of the keyboard at all times", + key = Settings.PREF_ENABLE_NUMBER_ROW, + default = false, + icon = { Text("123", style = TextBodyRegularMlStyle, color = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.75f)) } + ) + + NavigationItem( + title = "Long-Press Letters & Symbols", + subtitle = "Configure long-press duration and how to order letters/symbols.", + style = NavigationItemStyle.Misc, + navigate = { navController.navigate("longPress") }, + icon = painterResource(id = R.drawable.arrow_up) + ) + + NavigationItem( + title = "Action Key", + subtitle = "Change the action key into an emoji key, language switch key, or disable it altogether.", + style = NavigationItemStyle.Misc, + navigate = { navController.navigate("actionKey") }, + icon = painterResource(id = R.drawable.smile) + ) + + NavigationItem( + title = "Additional Layouts", + subtitle = "Configure additional layouts in the languages screen", + style = NavigationItemStyle.Misc, + navigate = { navController.navigate("languages") }, + icon = painterResource(id = R.drawable.keyboard) + ) + + ScreenTitle(title = "Typing preferences") + + SettingToggleSharedPrefs( + title = "Swipe Typing (alpha)", + subtitle = "Allow swiping from key to key to write words.", + key = Settings.PREF_GESTURE_INPUT, + default = true, + icon = { + Icon(painterResource(id = R.drawable.swipe_icon), contentDescription = null, + tint = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.75f)) + } + ) SettingToggleDataStore( title = "Emoji Suggestions", subtitle = "Suggest emojis while you're typing", - setting = SHOW_EMOJI_SUGGESTIONS + setting = SHOW_EMOJI_SUGGESTIONS, + icon = { + Icon(painterResource(id = R.drawable.smile), contentDescription = null, + tint = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.75f)) + } ) SettingToggleSharedPrefs( - title = "Swipe typing", - key = Settings.PREF_GESTURE_INPUT, - default = true + title = stringResource(R.string.auto_correction), + subtitle = stringResource(R.string.auto_correction_summary), + key = Settings.PREF_AUTO_CORRECTION, + default = true, + icon = { + Icon(painterResource(id = R.drawable.icon_spellcheck), contentDescription = null, + tint = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.75f)) + } ) - SettingToggleSharedPrefs( - title = "Number row", - key = Settings.PREF_ENABLE_NUMBER_ROW, - default = false - ) - - SettingToggleDataStore( - title = "Clipboard History", - setting = ClipboardHistoryEnabled - ) - - SettingToggleSharedPrefs( - title = "Action key enabled", - subtitle = "Show the action key on the bottom row", - key = Settings.PREF_SHOW_ACTION_KEY, - default = true - ) - - val emojiKey = useSharedPrefsInt(key = Settings.PREF_ACTION_KEY_ID, default = 0) - SettingItem(title = "Action key") { - DropDownPicker( - label = "", - options = AllActions, - selection = AllActions[emojiKey.value], - onSet = { - emojiKey.setValue(AllActions.indexOf(it)) - }, - getDisplayName = { - context.getString(it.name) - }, - modifier = Modifier.width(180.dp) - ) - } - SettingToggleSharedPrefs( title = stringResource(R.string.auto_cap), subtitle = stringResource(R.string.auto_cap_summary), key = Settings.PREF_AUTO_CAP, - default = true + default = true, + icon = { + Text("Aa", style = TextBodyRegularMlStyle, color = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.75f)) + } ) + SettingToggleSharedPrefs( title = stringResource(R.string.use_double_space_period), subtitle = stringResource(R.string.use_double_space_period_summary), key = Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, - default = true - ) - SettingToggleSharedPrefs( - title = stringResource(R.string.vibrate_on_keypress), - key = Settings.PREF_VIBRATE_ON, - default = booleanResource(R.bool.config_default_vibration_enabled) + default = true, + icon = { + Text(".", style = TextBodyRegularMlStyle, color = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.75f)) + } ) + SettingToggleSharedPrefs( title = stringResource(R.string.sound_on_keypress), key = Settings.PREF_SOUND_ON, @@ -132,6 +554,12 @@ fun TypingScreen(navController: NavHostController = rememberNavController()) { default = booleanResource(R.bool.config_default_key_preview_popup) ) + SettingToggleSharedPrefs( + title = stringResource(R.string.vibrate_on_keypress), + key = Settings.PREF_VIBRATE_ON, + default = booleanResource(R.bool.config_default_vibration_enabled) + ) + SettingSlider( title = "Vibration", setting = vibrationDurationSetting, @@ -147,15 +575,10 @@ fun TypingScreen(navController: NavHostController = rememberNavController()) { } ) - SettingSliderSharedPrefsInt( - title = "Long Press Duration", - key = Settings.PREF_KEY_LONGPRESS_TIMEOUT, - default = 300, - range = 100.0f .. 700.0f, - hardRange = 25.0f .. 1200.0f, - transform = { it.roundToInt() }, - indicator = { "$it ms" }, - steps = 23 + SettingToggleDataStore( + title = "Clipboard History", + setting = ClipboardHistoryEnabled ) } -} \ No newline at end of file +} + diff --git a/java/src/org/futo/inputmethod/latin/uix/theme/selector/ThemePicker.kt b/java/src/org/futo/inputmethod/latin/uix/theme/selector/ThemePicker.kt index 3bd9d452b..1634fd55d 100644 --- a/java/src/org/futo/inputmethod/latin/uix/theme/selector/ThemePicker.kt +++ b/java/src/org/futo/inputmethod/latin/uix/theme/selector/ThemePicker.kt @@ -282,39 +282,6 @@ fun ThemePicker(onSelected: (ThemeOption) -> Unit) { ) } } - item(span = { GridItemSpan(maxCurrentLineSpan) }) { - CompositionLocalProvider(LocalLayoutDirection provides originalDirection) { - SettingToggleDataStore( - title = "Show symbol hints", - setting = KeyHintsSetting - ) - } - } - - item(span = { GridItemSpan(maxCurrentLineSpan) }) { - CompositionLocalProvider(LocalLayoutDirection provides originalDirection) { - SettingSlider( - title = "Keyboard Height", - setting = KeyboardHeightMultiplierSetting, - range = 0.33f..1.75f, transform = { it }, - indicator = { "${(it * 100.0f).roundToInt()}%" }, - steps = 16 - ) - } - } - item(span = { GridItemSpan(maxCurrentLineSpan) }) { - CompositionLocalProvider(LocalLayoutDirection provides originalDirection) { - SettingSlider( - title = "Keyboard Offset", - setting = KeyboardBottomOffsetSetting, - range = 0.0f..50.0f, - hardRange = 0.0f..250.0f, - transform = { it }, - indicator = { "${String.format("%.1f", it)} dp" }, - steps = 9 - ) - } - } } } } diff --git a/java/src/org/futo/inputmethod/updates/Update.kt b/java/src/org/futo/inputmethod/updates/Update.kt index fffb2b45d..bfcedb6ae 100644 --- a/java/src/org/futo/inputmethod/updates/Update.kt +++ b/java/src/org/futo/inputmethod/updates/Update.kt @@ -136,6 +136,7 @@ val dismissedMigrateUpdateNotice = SettingsKey( @Composable @Preview fun ConditionalMigrateUpdateNotice() { + if(LocalInspectionMode.current) { return } val context = LocalContext.current val value = useDataStore(dismissedMigrateUpdateNotice, blocking = true) if(!value.value) { diff --git a/tools/make-keyboard-text-py/locales/DEFAULT.json b/tools/make-keyboard-text-py/locales/DEFAULT.json index 8b0abf7e7..c9f039049 100644 --- a/tools/make-keyboard-text-py/locales/DEFAULT.json +++ b/tools/make-keyboard-text-py/locales/DEFAULT.json @@ -1,28 +1,84 @@ { "locale": "DEFAULT", "morekeys": { - "a": [], + "q": [], + "w": [], "e": [], - "i": [], - "o": [], - "u": [], - "s": [], - "n": [], - "c": [], - "y": [], - "d": [], "r": [], "t": [], - "z": [], - "k": [], - "l": [], + "y": [], + "u": [], + "i": [], + "o": [], + "p": [], + "a": [], + "s": [], + "d": [], + "f": [], "g": [], - "v": [], "h": [], "j": [], - "w": [], - "q": [], + "k": [], + "l": [], + "z": [], "x": [], + "c": [], + "v": [], + "b": [], + "n": [], + "m": [], + + "misc_a": [ + "à", + "á", + "â", + "ä", + "æ", + "ã", + "å", + "ā" + ], + "misc_e": [ + "é", + "è", + "ê", + "ë", + "ē" + ], + "misc_i": [ + "í", + "î", + "ï", + "ī", + "ì" + ], + "misc_o": [ + "ó", + "ô", + "ö", + "ò", + "œ", + "ø", + "ō", + "õ" + ], + "misc_u": [ + "ú", + "û", + "ü", + "ù", + "ū" + ], + "misc_s": [ + "ß" + ], + "misc_n": [ + "ñ" + ], + "misc_c": [ + "ç" + ], + "nordic_row2_10": [], "nordic_row2_11": [], "east_slavic_row2_2": [], @@ -55,6 +111,7 @@ "₱" ], "punctuation": [ + "/", "?", "!", "\u203d", @@ -65,6 +122,7 @@ "=" ], "tablet_punctuation": [ + "/", "?", "!", "\u203d", @@ -314,6 +372,119 @@ "double_lqm_rqm": "„,“,”", "double_9qm_lqm": "”,„,“", "double_9qm_rqm": "“,„,”", - "double_rqm_9qm": "“,”,„" + "double_rqm_9qm": "“,”,„", + + "number_1": "1", + "number_2": "2", + "number_3": "3", + "number_4": "4", + "number_5": "5", + "number_6": "6", + "number_7": "7", + "number_8": "8", + "number_9": "9", + "number_0": "0" + }, + + "actions": { + "1": [], + "2": [], + "3": [], + "4": [], + "5": [], + "6": [], + "7": [], + "8": [], + "9": [], + "0": [], + + "q": [], + "w": [], + "e": [], + "r": [], + "t": [], + "y": [ + "!icon/action_redo|!code/action_redo" + ], + "u": [], + "i": [], + "o": [], + "p": [], + + "a": [ + "!icon/action_select_all|!code/action_select_all" + ], + "s": [], + "d": [], + "f": [], + "g": [], + "h": [], + "j": [], + "k": [], + "l": [], + + "z": [ + "!icon/action_undo|!code/action_undo" + ], + "x": [ + "!icon/action_cut|!code/action_cut" + ], + "c": [ + "!icon/action_copy|!code/action_copy" + ], + "v": [ + "!icon/action_paste|!code/action_paste" + ], + "b": [], + "n": [], + "m": [] + }, + + "qwertysyms": { + "1": "!", + "2": "@", + "3": "#", + "4": "$", + "5": "%", + "6": "^", + "7": "&", + "8": "*", + "9": "(", + "0": ")", + + "q": "\\%", + "w": "\\\\", + "e": "|", + "r": "=", + "t": "[", + "y": "]", + "u": "<", + "i": ">", + "o": "{", + "p": "}", + + "a": "@", + "s": "#", + "d": [ + "$", + "€", + "£", + "¥", + "¢" + ], + "f": "\\%", + "g": ["&", "|"], + "h": ["-", "–", "—", "_"], + "j": ["+", "="], + "k": ["(", "[", "{", "<"], + "l": [")", "]", "}", ">" ], + + "z": "*", + "x": "\"", + "c": "'", + "v": ":", + "b": ";", + "n": "!", + "m": ["?", "/"] } } \ No newline at end of file diff --git a/tools/make-keyboard-text-py/locales/en.json b/tools/make-keyboard-text-py/locales/en.json index 77e2c1ccb..941f312ac 100644 --- a/tools/make-keyboard-text-py/locales/en.json +++ b/tools/make-keyboard-text-py/locales/en.json @@ -1,57 +1,6 @@ { "locale": "en", - "morekeys": { - "a": [ - "à", - "á", - "â", - "ä", - "æ", - "ã", - "å", - "ā" - ], - "e": [ - "é", - "è", - "ê", - "ë", - "ē" - ], - "i": [ - "í", - "î", - "ï", - "ī", - "ì" - ], - "o": [ - "ó", - "ô", - "ö", - "ò", - "œ", - "ø", - "ō", - "õ" - ], - "u": [ - "ú", - "û", - "ü", - "ù", - "ū" - ], - "s": [ - "ß" - ], - "n": [ - "ñ" - ], - "c": [ - "ç" - ] - }, + "morekeys": {}, "keyspec": {}, "label": {}, "keylabel": {}, diff --git a/tools/make-keyboard-text-py/src/generate.py b/tools/make-keyboard-text-py/src/generate.py index fab01d7f4..402112f29 100644 --- a/tools/make-keyboard-text-py/src/generate.py +++ b/tools/make-keyboard-text-py/src/generate.py @@ -16,10 +16,13 @@ def transform_to_texts(locale_data): texts["locale"] = locale_data["locale"] - prefixes = ['morekeys_', 'keyspec_', 'label_', 'keylabel_', 'keyhintlabel_', 'additional_morekeys_'] + prefixes = ['morekeys_', 'keyspec_', 'label_', 'keylabel_', 'keyhintlabel_', 'additional_morekeys_', 'qwertysyms_', 'actions_'] for prefix in prefixes: - for k, v in locale_data[prefix.rstrip("_")].items(): + key = prefix.rstrip("_") + if key not in locale_data: continue + + for k, v in locale_data[key].items(): if isinstance(v, list): texts[prefix + k] = ",".join(v) else: