diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/PreferencesActivity.java b/app/src/main/java/io/github/sspanak/tt9/preferences/PreferencesActivity.java index 3effb81a..6245cbd5 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/PreferencesActivity.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/PreferencesActivity.java @@ -24,6 +24,7 @@ import io.github.sspanak.tt9.preferences.screens.UsageStatsScreen; import io.github.sspanak.tt9.preferences.screens.appearance.AppearanceScreen; import io.github.sspanak.tt9.preferences.screens.debug.DebugScreen; import io.github.sspanak.tt9.preferences.screens.deleteWords.DeleteWordsScreen; +import io.github.sspanak.tt9.preferences.screens.fnKeyOrder.FnKeyOrderScreen; import io.github.sspanak.tt9.preferences.screens.hotkeys.HotkeysScreen; import io.github.sspanak.tt9.preferences.screens.keypad.KeyPadScreen; import io.github.sspanak.tt9.preferences.screens.languageSelection.LanguageSelectionScreen; @@ -159,6 +160,7 @@ public class PreferencesActivity extends ActivityWithNavigation implements Prefe case AppearanceScreen.NAME -> new AppearanceScreen(this); case DebugScreen.NAME -> new DebugScreen(this); case DeleteWordsScreen.NAME -> new DeleteWordsScreen(this); + case FnKeyOrderScreen.NAME -> new FnKeyOrderScreen(this); case HotkeysScreen.NAME -> new HotkeysScreen(this); case KeyPadScreen.NAME -> new KeyPadScreen(this); case LanguagesScreen.NAME -> new LanguagesScreen(this); diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/custom/PreferencePlainText.java b/app/src/main/java/io/github/sspanak/tt9/preferences/custom/PreferencePlainText.java index 650e8190..8ec0e2db 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/custom/PreferencePlainText.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/custom/PreferencePlainText.java @@ -8,7 +8,7 @@ import androidx.annotation.Nullable; import io.github.sspanak.tt9.R; -final public class PreferencePlainText extends ScreenPreference { +public class PreferencePlainText extends ScreenPreference { public PreferencePlainText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public PreferencePlainText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public PreferencePlainText(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemSearch.java b/app/src/main/java/io/github/sspanak/tt9/preferences/items/SearchPreference.java similarity index 77% rename from app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemSearch.java rename to app/src/main/java/io/github/sspanak/tt9/preferences/items/SearchPreference.java index 5f625dad..866e6b04 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemSearch.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/items/SearchPreference.java @@ -14,17 +14,17 @@ import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.languages.LanguageKind; import io.github.sspanak.tt9.util.sys.DeviceInfo; -abstract public class ItemSearch extends ItemTextInput { - public ItemSearch(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { +abstract public class SearchPreference extends TextInputPreference { + public SearchPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } - public ItemSearch(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + public SearchPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } - public ItemSearch(@NonNull Context context, @Nullable AttributeSet attrs) { + public SearchPreference(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } - public ItemSearch(@NonNull Context context) { + public SearchPreference(@NonNull Context context) { super(context); } diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemTextInput.java b/app/src/main/java/io/github/sspanak/tt9/preferences/items/TextInputPreference.java similarity index 86% rename from app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemTextInput.java rename to app/src/main/java/io/github/sspanak/tt9/preferences/items/TextInputPreference.java index 067ca9fa..f45fd31d 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/items/ItemTextInput.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/items/TextInputPreference.java @@ -18,22 +18,22 @@ import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.util.colors.AccentSystemColor; import io.github.sspanak.tt9.util.colors.ErrorSystemColor; -abstract public class ItemTextInput extends ScreenPreference { +abstract public class TextInputPreference extends ScreenPreference { @NonNull private final Handler listener = new Handler(Looper.getMainLooper()); protected EditText textField; @NonNull protected String text = ""; - public ItemTextInput(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + public TextInputPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } - public ItemTextInput(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + public TextInputPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } - public ItemTextInput(@NonNull Context context, @Nullable AttributeSet attrs) { + public TextInputPreference(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } - public ItemTextInput(@NonNull Context context) { + public TextInputPreference(@NonNull Context context) { super(context); } @@ -71,6 +71,11 @@ abstract public class ItemTextInput extends ScreenPreference { } + public CharSequence getText() { + return text; + } + + protected void setText(CharSequence newText) { if (textField != null && newText != null && !text.equals(newText.toString())) { textField.setText(newText); diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/AppearanceScreen.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/AppearanceScreen.java index 33a66506..f1782182 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/AppearanceScreen.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/AppearanceScreen.java @@ -36,9 +36,11 @@ public class AppearanceScreen extends BaseScreenFragment { ItemNumpadFnKeyScale fnKeyWidth = new ItemNumpadFnKeyScale(findPreference(ItemNumpadFnKeyScale.NAME), activity.getSettings()); ItemNumpadKeyFontSize numpadKeyFontSize = new ItemNumpadKeyFontSize(findPreference(ItemNumpadKeyFontSize.NAME), activity.getSettings()); ItemSuggestionFontSize suggestionFontSize = new ItemSuggestionFontSize(findPreference(ItemSuggestionFontSize.NAME), activity.getSettings()); + ItemFnKeyOrder fnKeyOrder = new ItemFnKeyOrder(activity.getSettings(), findPreference(ItemFnKeyOrder.NAME)); ItemSelectLayoutType selectLayout = new ItemSelectLayoutType(findPreference(ItemSelectLayoutType.NAME), activity) .addOnChangeItem(alignment) + .addOnChangeItem(fnKeyOrder) .addOnChangeItem(fnKeyWidth) .addOnChangeItem(keyboardWidth) .addOnChangeItem(numpadKeyFontSize) diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemFnKeyOrder.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemFnKeyOrder.java new file mode 100644 index 00000000..a9dd734d --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemFnKeyOrder.java @@ -0,0 +1,24 @@ +package io.github.sspanak.tt9.preferences.screens.appearance; + +import androidx.preference.Preference; + +import io.github.sspanak.tt9.preferences.items.ItemClickable; +import io.github.sspanak.tt9.preferences.settings.SettingsStore; +import io.github.sspanak.tt9.util.sys.DeviceInfo; + +public class ItemFnKeyOrder extends ItemClickable implements ItemLayoutChangeReactive { + public static final String NAME = "screen_fn_key_order"; + public ItemFnKeyOrder(SettingsStore settings, Preference item) { + super(item); + onLayoutChange(settings.getMainViewLayout()); + } + + @Override protected boolean onClick(Preference p) { return true; } + + public void onLayoutChange(int mainViewLayout) { + if (item != null) { + item.setVisible(mainViewLayout == SettingsStore.LAYOUT_NUMPAD && !DeviceInfo.noTouchScreen(item.getContext())); + item.setIconSpaceReserved(false); + } + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/deleteWords/PreferenceSearchWords.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/deleteWords/PreferenceSearchWords.java index 80a96c15..fd33b9d3 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/deleteWords/PreferenceSearchWords.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/deleteWords/PreferenceSearchWords.java @@ -9,12 +9,12 @@ import androidx.annotation.Nullable; import java.util.ArrayList; import io.github.sspanak.tt9.db.DataStore; -import io.github.sspanak.tt9.preferences.items.ItemSearch; +import io.github.sspanak.tt9.preferences.items.SearchPreference; import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.util.ConsumerCompat; import io.github.sspanak.tt9.util.Logger; -public class PreferenceSearchWords extends ItemSearch { +public class PreferenceSearchWords extends SearchPreference { public static final String NAME = "dictionary_delete_words_search"; private static final String LOG_TAG = PreferenceSearchWords.class.getSimpleName(); diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderLegendPreference.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderLegendPreference.java new file mode 100644 index 00000000..71597f63 --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderLegendPreference.java @@ -0,0 +1,36 @@ +package io.github.sspanak.tt9.preferences.screens.fnKeyOrder; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import io.github.sspanak.tt9.R; +import io.github.sspanak.tt9.preferences.custom.PreferencePlainText; + +public class FnKeyOrderLegendPreference extends PreferencePlainText { + public FnKeyOrderLegendPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); populate(); } + public FnKeyOrderLegendPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); populate(); } + public FnKeyOrderLegendPreference(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); populate(); } + public FnKeyOrderLegendPreference(@NonNull Context context) { super(context); populate(); } + + private void populate() { + StringBuilder content = new StringBuilder(__(R.string.fn_key_order_legend)) + .append("\n1 = ").append(__(R.string.function_show_settings)) + .append("\n2 = ").append(__(R.string.function_add_word)) + .append("\n3 = ").append(__(R.string.virtual_key_shift)) + .append("\n4 = ").append(__(R.string.function_next_mode)) + .append("\n5 = ").append(__(R.string.function_backspace)) + .append("\n6 = ").append(__(R.string.function_filter_suggestions)) + .append("\n7 = ").append(__(R.string.function_edit_text)).append(" / ").append(__(R.string.function_voice_input)) + .append("\n8 = OK\n\n") + .append(__(R.string.fn_key_order_preview_tip)); + + setSummary(content); + } + + private String __(int resourceId) { + return getContext().getString(resourceId); + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderScreen.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderScreen.java new file mode 100644 index 00000000..fdbb5b6a --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderScreen.java @@ -0,0 +1,58 @@ +package io.github.sspanak.tt9.preferences.screens.fnKeyOrder; + +import io.github.sspanak.tt9.R; +import io.github.sspanak.tt9.preferences.PreferencesActivity; +import io.github.sspanak.tt9.preferences.screens.BaseScreenFragment; + +public class FnKeyOrderScreen extends BaseScreenFragment { + final public static String NAME = "FnKeyOrder"; + + private LeftFnOrderPreference left; + private RightFnOrderPreference right; + + public FnKeyOrderScreen() { init(); } + public FnKeyOrderScreen(PreferencesActivity activity) { init(activity); } + + @Override public String getName() { return NAME; } + @Override protected int getTitle() { return R.string.pref_category_fn_key_order; } + @Override protected int getXml() { return R.xml.prefs_screen_fn_key_order; } + + @Override + protected void onCreate() { + createTextFields(); + (new ItemResetFnKeyOrder(findPreference(ItemResetFnKeyOrder.NAME), left, right)).enableClickHandler(); + resetFontSize(true); + } + + private void createTextFields() { + left = findPreference(LeftFnOrderPreference.NAME); + right = findPreference(RightFnOrderPreference.NAME); + if (left != null && right != null) { + left.setTextChangeHandler(this::onTextChange); + right.setTextChangeHandler(this::onTextChange); + } + } + + private void onTextChange() { + if (left == null || right == null || activity == null) { + return; + } + + FnKeyOrderValidator validator = activity.getSettings().setFnKeyOrder(left.getText().toString(), right.getText().toString()); + left.setError(""); + right.setError(""); + + if (validator.getError() == null) { + return; + } + + if (validator.getErrorSide() == FnKeyOrderValidator.ERROR_SIDE_LEFT) { + left.setError(getString(validator.getError())); + } else if (validator.getErrorSide() == FnKeyOrderValidator.ERROR_SIDE_RIGHT) { + right.setError(getString(validator.getError())); + } else if (validator.getErrorSide() == FnKeyOrderValidator.ERROR_SIDE_BOTH) { + left.setError(getString(validator.getError())); + right.setError(getString(validator.getError())); + } + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderValidator.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderValidator.java new file mode 100644 index 00000000..7f549649 --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/FnKeyOrderValidator.java @@ -0,0 +1,107 @@ +package io.github.sspanak.tt9.preferences.screens.fnKeyOrder; + +import java.util.HashSet; +import java.util.Set; + +import io.github.sspanak.tt9.R; + +public class FnKeyOrderValidator { + public final static int ERROR_SIDE_LEFT = -1; + public final static int ERROR_SIDE_RIGHT = 1; + public final static int ERROR_SIDE_BOTH = 0; + + private Integer error; + private int errorSide = ERROR_SIDE_BOTH; + + private final String left; + private final String right; + + + public FnKeyOrderValidator(String left, String right) { + this.left = left; + this.right = right; + } + + + public Integer getError() { + return error; + } + + + public int getErrorSide() { + return errorSide; + } + + + public boolean validate() { + error = null; + errorSide = ERROR_SIDE_BOTH; + + return + validateLength(left, ERROR_SIDE_LEFT) && validateLength(right, ERROR_SIDE_RIGHT) + && validateDigits(left, ERROR_SIDE_LEFT) && validateDigits(right, ERROR_SIDE_RIGHT) + && validateNoRepeat(left, ERROR_SIDE_LEFT) && validateNoRepeat(right, ERROR_SIDE_RIGHT) + && validateNoOverlap(left, right); + } + + + private boolean validateLength(String text, int side) { + if (text == null || text.length() != 4) { + error = R.string.fn_key_order_error_wrong_key_count; + errorSide = side; + return false; + } + + return true; + } + + + private boolean validateDigits(String text, int side) { + if (text == null || !text.matches("^[1-8]+$")) { + error = R.string.fn_key_order_error_unsupported_key_code; + errorSide = side; + return false; + } + + return true; + } + + + private boolean validateNoRepeat(String text, int side) { + if (text == null) { + return true; + } + + Set digits = new HashSet<>(); + + for (char c : text.toCharArray()) { + int digit = Character.getNumericValue(c); + if (digits.contains(digit)) { + error = R.string.fn_key_order_error_duplicate_key; + errorSide = side; + return false; + } + digits.add(digit); + } + + return true; + } + + + private boolean validateNoOverlap(String column, String otherColumn) { + if (column == null || otherColumn == null) { + return true; + } + + for (int i = 0; i < column.length(); i++) { + char c = column.charAt(i); + if (otherColumn.indexOf(c) != -1) { + error = R.string.fn_key_order_error_key_on_both_sides; + errorSide = ERROR_SIDE_BOTH; + return false; + } + } + + return true; + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/ItemResetFnKeyOrder.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/ItemResetFnKeyOrder.java new file mode 100644 index 00000000..7869353e --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/ItemResetFnKeyOrder.java @@ -0,0 +1,32 @@ +package io.github.sspanak.tt9.preferences.screens.fnKeyOrder; + +import androidx.preference.Preference; + +import io.github.sspanak.tt9.preferences.items.ItemClickable; +import io.github.sspanak.tt9.preferences.settings.SettingsVirtualNumpad; + +public class ItemResetFnKeyOrder extends ItemClickable { + public final static String NAME = "pref_reset_fn_key_order"; + + private final LeftFnOrderPreference left; + private final RightFnOrderPreference right; + + public ItemResetFnKeyOrder(Preference item, LeftFnOrderPreference left, RightFnOrderPreference right) { + super(item); + this.left = left; + this.right = right; + } + + @Override + protected boolean onClick(Preference p) { + if (left == null || right == null) { + return false; + } + + left.setText(SettingsVirtualNumpad.DEFAULT_LFN_KEY_ORDER); + right.setText(SettingsVirtualNumpad.DEFAULT_RFN_KEY_ORDER); + left.onTextChange(); + + return true; + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/LeftFnOrderPreference.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/LeftFnOrderPreference.java new file mode 100644 index 00000000..8551d98b --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/LeftFnOrderPreference.java @@ -0,0 +1,71 @@ +package io.github.sspanak.tt9.preferences.screens.fnKeyOrder; + +import android.content.Context; +import android.text.InputType; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.PreferenceViewHolder; + +import io.github.sspanak.tt9.preferences.items.TextInputPreference; +import io.github.sspanak.tt9.preferences.settings.SettingsStore; + +public class LeftFnOrderPreference extends TextInputPreference { + public final static String NAME = "pref_lfn_key_order"; + + protected final SettingsStore settings; + @NonNull private Runnable textChangeHandler = () -> {}; + + public LeftFnOrderPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + this.settings = new SettingsStore(context); + } + public LeftFnOrderPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.settings = new SettingsStore(context); + } + public LeftFnOrderPreference(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + this.settings = new SettingsStore(context); + } + public LeftFnOrderPreference(@NonNull Context context) { + super(context); + this.settings = new SettingsStore(context); + } + + @Override + public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + populate(); + if (textField != null) { + textField.setInputType(InputType.TYPE_CLASS_NUMBER); + } + } + + void setTextChangeHandler(@NonNull Runnable handler) { + textChangeHandler = handler; + } + + protected int getChangeHandlerDebounceTime() { + return SettingsStore.TEXT_INPUT_PUNCTUATION_ORDER_DEBOUNCE_TIME; + } + + @Override + protected void onTextChange() { + textChangeHandler.run(); + } + + protected void populate() { + setText(settings.getLfnKeyOrder()); + } + + @Override + public void setError(@NonNull String error) { + super.setError(error); + } + + void setText(@NonNull String newText) { + super.setText(newText); + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/RightFnOrderPreference.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/RightFnOrderPreference.java new file mode 100644 index 00000000..c1cfc82d --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/fnKeyOrder/RightFnOrderPreference.java @@ -0,0 +1,21 @@ +package io.github.sspanak.tt9.preferences.screens.fnKeyOrder; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class RightFnOrderPreference extends LeftFnOrderPreference { + public final static String NAME = "pref_rfn_key_order"; + + public RightFnOrderPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } + public RightFnOrderPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } + public RightFnOrderPreference(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } + public RightFnOrderPreference(@NonNull Context context) { super(context); } + + @Override + protected void populate() { + setText(settings.getRfnKeyOrder()); + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languageSelection/PreferenceSearchLanguage.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languageSelection/PreferenceSearchLanguage.java index 3243d3f9..1bd9461a 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languageSelection/PreferenceSearchLanguage.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languageSelection/PreferenceSearchLanguage.java @@ -9,9 +9,9 @@ import androidx.preference.Preference; import java.util.ArrayList; -import io.github.sspanak.tt9.preferences.items.ItemSearch; +import io.github.sspanak.tt9.preferences.items.SearchPreference; -public class PreferenceSearchLanguage extends ItemSearch { +public class PreferenceSearchLanguage extends SearchPreference { @NonNull private ArrayList languageItems = new ArrayList<>(); private Preference noResultItem; diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/AbstractPreferenceCharList.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/AbstractPreferenceCharList.java index 2cf071bf..3b237e1f 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/AbstractPreferenceCharList.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/punctuation/AbstractPreferenceCharList.java @@ -9,10 +9,10 @@ import androidx.preference.PreferenceViewHolder; import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.languages.Language; -import io.github.sspanak.tt9.preferences.items.ItemTextInput; +import io.github.sspanak.tt9.preferences.items.TextInputPreference; import io.github.sspanak.tt9.preferences.settings.SettingsStore; -abstract class AbstractPreferenceCharList extends ItemTextInput { +abstract class AbstractPreferenceCharList extends TextInputPreference { @NonNull protected String currentChars = ""; protected Language language; private Runnable onRender; diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHotkeys.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHotkeys.java index fd3375b5..7f7b5e0f 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHotkeys.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHotkeys.java @@ -6,7 +6,7 @@ import android.view.KeyEvent; import io.github.sspanak.tt9.util.Logger; -public class SettingsHotkeys extends SettingsUI { +public class SettingsHotkeys extends SettingsVirtualNumpad { private static final String HOTKEY_VERSION = "hotkeys_v6"; public static final String FUNC_ADD_WORD = "key_add_word"; diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java index 42ecc3a6..43f6f0c8 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java @@ -2,7 +2,6 @@ package io.github.sspanak.tt9.preferences.settings; import android.content.Context; import android.content.res.Configuration; -import android.util.TypedValue; import android.view.Gravity; import androidx.appcompat.app.AppCompatDelegate; @@ -20,10 +19,6 @@ public class SettingsUI extends SettingsTyping { public final static int LAYOUT_SMALL = 3; public final static int LAYOUT_NUMPAD = 4; - public final static int NUMPAD_SHAPE_SQUARE = 0; - public final static int NUMPAD_SHAPE_V = 1; - public final static int NUMPAD_SHAPE_LONG_SPACE = 2; - private final int DEFAULT_LAYOUT; public final static int MIN_WIDTH_PERCENT = 50; @@ -42,10 +37,6 @@ public class SettingsUI extends SettingsTyping { } } - public boolean areArrowKeysHidden() { - return !prefs.getBoolean("pref_arrow_keys_visible", true); - } - public boolean getAddWordsNoConfirmation() { return prefs.getBoolean("add_word_no_confirmation", false); } @@ -84,40 +75,6 @@ public class SettingsUI extends SettingsTyping { prefsEditor.apply(); } - public int getNumpadKeyDefaultHeight() { - return context.getResources().getDimensionPixelSize(R.dimen.numpad_key_height); - } - - public int getNumpadKeyHeight() { - return getStringifiedInt("pref_numpad_key_height", getNumpadKeyDefaultHeight()); - } - - public float getNumpadFnKeyDefaultScale() { - // The simpler getResource.getFloat() requires API 29, so we must get the value manually. - try { - TypedValue outValue = new TypedValue(); - context.getResources().getValue(R.dimen.numpad_key_fn_layout_weight, outValue, true); - return outValue.getFloat(); - } catch (Exception e) { - return 0.625f; - } - } - - public float getNumpadFnKeyScale() { - return getStringifiedFloat("pref_numpad_fn_key_width", getNumpadFnKeyDefaultScale()); - } - - public int getNumpadKeyFontSizePercent() { - return isMainLayoutNumpad() ? getStringifiedInt("pref_numpad_key_font_size", 100) : 100; - } - - public int getNumpadShape() { - return getStringifiedInt("pref_numpad_shape", NUMPAD_SHAPE_SQUARE); - } - - public boolean isNumpadShapeLongSpace() { return getNumpadShape() == NUMPAD_SHAPE_LONG_SPACE; } - public boolean isNumpadShapeV() { return getNumpadShape() == NUMPAD_SHAPE_V; } - public int getSettingsFontSize() { int defaultSize = DeviceInfo.IS_QIN_F21 || DeviceInfo.IS_LG_X100S ? FONT_SIZE_LARGE : FONT_SIZE_DEFAULT; return getStringifiedInt("pref_font_size", defaultSize); diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsVirtualNumpad.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsVirtualNumpad.java new file mode 100644 index 00000000..e387c9c6 --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsVirtualNumpad.java @@ -0,0 +1,91 @@ +package io.github.sspanak.tt9.preferences.settings; + +import android.content.Context; +import android.util.TypedValue; + +import java.util.HashMap; + +import io.github.sspanak.tt9.R; +import io.github.sspanak.tt9.preferences.screens.fnKeyOrder.FnKeyOrderValidator; + +public class SettingsVirtualNumpad extends SettingsUI { + public final static int NUMPAD_SHAPE_SQUARE = 0; + public final static int NUMPAD_SHAPE_V = 1; + public final static int NUMPAD_SHAPE_LONG_SPACE = 2; + + public static final String DEFAULT_LFN_KEY_ORDER = "1234"; + public static final String DEFAULT_RFN_KEY_ORDER = "5678"; + + public static final HashMap KEY_ORDER_MAP = new HashMap<>() {{ + put('1', R.id.soft_key_wrapper_1); + put('2', R.id.soft_key_wrapper_2); + put('3', R.id.soft_key_wrapper_3); + put('4', R.id.soft_key_wrapper_4); + put('5', R.id.soft_key_wrapper_5); + put('6', R.id.soft_key_wrapper_6); + put('7', R.id.soft_key_wrapper_7); + put('8', R.id.soft_key_wrapper_8); + }}; + + SettingsVirtualNumpad(Context context) { + super(context); + } + + public boolean areArrowKeysHidden() { + return !prefs.getBoolean("pref_arrow_keys_visible", true); + } + + public String getLfnKeyOrder() { + return prefs.getString("pref_lfn_key_order", DEFAULT_LFN_KEY_ORDER); + } + + public String getRfnKeyOrder() { + return prefs.getString("pref_rfn_key_order", DEFAULT_RFN_KEY_ORDER); + } + + public FnKeyOrderValidator setFnKeyOrder(String left, String right) { + FnKeyOrderValidator validator = new FnKeyOrderValidator(left, right); + if (validator.validate()) { + prefsEditor + .putString("pref_rfn_key_order", right) + .putString("pref_lfn_key_order", left) + .apply(); + } + + return validator; + } + + public int getNumpadKeyDefaultHeight() { + return context.getResources().getDimensionPixelSize(R.dimen.numpad_key_height); + } + + public int getNumpadKeyHeight() { + return getStringifiedInt("pref_numpad_key_height", getNumpadKeyDefaultHeight()); + } + + public float getNumpadFnKeyDefaultScale() { + // The simpler getResource.getFloat() requires API 29, so we must get the value manually. + try { + TypedValue outValue = new TypedValue(); + context.getResources().getValue(R.dimen.numpad_key_fn_layout_weight, outValue, true); + return outValue.getFloat(); + } catch (Exception e) { + return 0.625f; + } + } + + public float getNumpadFnKeyScale() { + return getStringifiedFloat("pref_numpad_fn_key_width", getNumpadFnKeyDefaultScale()); + } + + public int getNumpadKeyFontSizePercent() { + return isMainLayoutNumpad() ? getStringifiedInt("pref_numpad_key_font_size", 100) : 100; + } + + public int getNumpadShape() { + return getStringifiedInt("pref_numpad_shape", NUMPAD_SHAPE_SQUARE); + } + + public boolean isNumpadShapeLongSpace() { return getNumpadShape() == NUMPAD_SHAPE_LONG_SPACE; } + public boolean isNumpadShapeV() { return getNumpadShape() == NUMPAD_SHAPE_V; } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java index 2847832f..0e6e0861 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java @@ -1,23 +1,31 @@ package io.github.sspanak.tt9.ui.main; import android.content.res.Resources; +import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import androidx.annotation.NonNull; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.ime.TraditionalT9; import io.github.sspanak.tt9.preferences.settings.SettingsStore; +import io.github.sspanak.tt9.preferences.settings.SettingsVirtualNumpad; import io.github.sspanak.tt9.ui.main.keys.SoftKey; import io.github.sspanak.tt9.ui.main.keys.SoftKeySettings; +import io.github.sspanak.tt9.util.Logger; import io.github.sspanak.tt9.util.sys.DeviceInfo; class MainLayoutNumpad extends BaseMainLayout { - private boolean isTextEditingShown = false; + private static final String LOG_TAG = MainLayoutNumpad.class.getSimpleName(); + + @NonNull private String lastFnKeyOrder = ""; private int height; + private boolean isTextEditingShown = false; MainLayoutNumpad(TraditionalT9 tt9) { @@ -217,18 +225,16 @@ class MainLayoutNumpad extends BaseMainLayout { // left Fn - ViewGroup left = view.findViewById(R.id.numpad_column_fn_left); - keys.add(left.findViewById(R.id.soft_key_settings)); - keys.add(left.findViewById(R.id.soft_key_add_word)); - keys.add(left.findViewById(R.id.soft_key_shift)); - keys.add(left.findViewById(R.id.soft_key_lf4)); + keys.add(view.findViewById(R.id.soft_key_settings)); + keys.add(view.findViewById(R.id.soft_key_add_word)); + keys.add(view.findViewById(R.id.soft_key_shift)); + keys.add(view.findViewById(R.id.soft_key_lf4)); // right Fn - ViewGroup right = view.findViewById(R.id.numpad_column_fn_right); - keys.add(right.findViewById(R.id.soft_key_numpad_backspace)); - keys.add(right.findViewById(R.id.soft_key_filter)); - keys.add(right.findViewById(R.id.soft_key_rf3)); - keys.add(right.findViewById(R.id.soft_key_numpad_ok)); + keys.add(view.findViewById(R.id.soft_key_numpad_backspace)); + keys.add(view.findViewById(R.id.soft_key_filter)); + keys.add(view.findViewById(R.id.soft_key_rf3)); + keys.add(view.findViewById(R.id.soft_key_numpad_ok)); // digits panel ViewGroup table = view.findViewById(R.id.main_soft_keys); @@ -270,11 +276,65 @@ class MainLayoutNumpad extends BaseMainLayout { } + private void reorderFnKeys() { + if (view == null) { + return; + } + + ViewGroup left = view.findViewById(R.id.numpad_column_fn_left); + ViewGroup right = view.findViewById(R.id.numpad_column_fn_right); + if (left == null || right == null) { + Logger.w(LOG_TAG, "Reordering keys failed: left or right column is null"); + return; + } + + String lfnOrder = tt9.getSettings().getLfnKeyOrder(); + String rfnOrder = tt9.getSettings().getRfnKeyOrder(); + + final String newOrder = lfnOrder + "," + rfnOrder; + if (newOrder.equals(lastFnKeyOrder)) { + Logger.d(LOG_TAG, "Preserving current key order: '" + lastFnKeyOrder + "'"); + return; + } + + Map keyWrappers = new HashMap<>(); + for (Map.Entry entry : SettingsVirtualNumpad.KEY_ORDER_MAP.entrySet()) { + keyWrappers.put(entry.getValue(), view.findViewById(entry.getValue())); + } + + reorderFnColumn(left, lfnOrder, keyWrappers); + reorderFnColumn(right, rfnOrder, keyWrappers); + + lastFnKeyOrder = newOrder; + Logger.d(LOG_TAG, "Reordered keys: '" + lastFnKeyOrder + "'"); + } + + + private void reorderFnColumn(ViewGroup column, String order, Map keyWrappers) { + for (char keyId : order.toCharArray()) { + Integer viewId = SettingsVirtualNumpad.KEY_ORDER_MAP.get(keyId); + if (viewId == null) { + continue; + } + + View key = keyWrappers.get(viewId); + if (key == null) { + Logger.w(LOG_TAG, "Failed reordering a NULL key with expected ID: " + keyId); + continue; + } + + ((ViewGroup) key.getParent()).removeView(key); + column.addView(key); + } + } + + @Override void render() { int defaultKeyHeight = calculateKeyHeight(); getView(); + reorderFnKeys(); enableClickHandlers(); setKeyHeight(defaultKeyHeight); preventEdgeToEdge(); diff --git a/app/src/main/res/layout/panel_numpad_left.xml b/app/src/main/res/layout/panel_numpad_left.xml index f0854544..92060a99 100644 --- a/app/src/main/res/layout/panel_numpad_left.xml +++ b/app/src/main/res/layout/panel_numpad_left.xml @@ -4,28 +4,28 @@ style="@style/TTheme.Numpad.Column.Fn" android:id="@+id/numpad_column_fn_left"> - + - + - + - + diff --git a/app/src/main/res/layout/panel_numpad_right.xml b/app/src/main/res/layout/panel_numpad_right.xml index 32fadb4a..9e4f691b 100644 --- a/app/src/main/res/layout/panel_numpad_right.xml +++ b/app/src/main/res/layout/panel_numpad_right.xml @@ -4,25 +4,29 @@ style="@style/TTheme.Numpad.Column.Fn" android:id="@+id/numpad_column_fn_right"> - + + + - + - + - + + + diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 58bafee8..c59f19b7 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -45,6 +45,7 @@ Режим АБВ Добавени думи Изтрий добавени думи + Ред на функционалните клавиши Съвместимост Облик Бутони за бърз достъп @@ -199,7 +200,7 @@ Неуспешно запазване на реда на знаците. Ред на символите на клавиш 1 Ред на символите на клавиш 0 - Възстанови реда по подразбиране + Възстанови реда по подразбиране Език Запази подредбата Забранен символ:%1$s @@ -210,10 +211,18 @@ V-образна Клавиши стрелки Натиснете и задръжте, за да отворите в браузъра. + Не са разрешени повтарящи се клавиши. + Легенда: + Съвет: След пренареждане на клавишите в колона 1, докоснете колона 2, за да видите резултата веднага (или обратно). Бутон „%1$s“ е зададен за функция „%2$s“. Искате ли да го зададете за „%3$s“? * Натиснете или задръжте клавиш, за да го присвоите на функцията „%1$s“.\n\n* Натиснете 0, за да отмените.\n\n* Натиснете 2, за да деактивирате функцията. Показвай текст при съставяне Оразмеряване чрез влачене Отмяна (Undo) Преизчисли долното отстояние + Колона 2 + Трябва да има точно по 4 клавиша в колона. + Разрешени са само кодове на клавиши от 1 до 8. + Един клавиш не може да бъде поставен и в двете колони. + Колона 1 diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index eb503d71..cb267f4b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -66,6 +66,7 @@ ABC-Modus Hinzugefügte Wörter Hinzugefügte Wörter löschen + Reihenfolge der Funktionstasten Kompatibilität Lade Wörterbuch Erscheinungsbild @@ -188,7 +189,7 @@ Zeichenreihenfolge konnte nicht gespeichert werden. Zeichenreihenfolge der 1-Taste Zeichenreihenfolge der 0-Taste - Standardreihenfolge wiederherstellen + Standardreihenfolge wiederherstellen Sprache Reihenfolge speichern Verbotenes Zeichen:%1$s @@ -203,6 +204,9 @@ Pfeiltasten Drücken und halten, um in einem Browser zu öffnen. Taste + Doppelte Tasten sind nicht erlaubt. + Legende: + Tipp: Nach dem Neuanordnen der Tasten in Spalte 1, tippe auf Spalte 2, um das Ergebnis sofort zu sehen (oder umgekehrt). \tDie Taste \"%1$s\" ist bereits der Funktion \"%2$s\" zugewiesen. Möchten Sie sie \"%3$s\" zuweisen? * Drücken oder halten Sie eine Taste, um sie der Funktion \"%1$s\" zuzuweisen.\n\n* Drücken Sie 0, um abzubrechen.\n\n* Drücken Sie 2, um die Funktion zu deaktivieren. Neu zuweisen @@ -218,4 +222,9 @@ Größe durch Ziehen ändern Rückgängig machen Unteren Abstand neu berechnen + Spalte 2 + Es müssen genau 4 Tasten pro Spalte sein. + Nur Tastencodes 1–8 sind erlaubt. + Eine Taste kann nicht in beiden Spalten platziert werden. + Spalte 1 diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index bd662441..23cc7a9e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -22,6 +22,7 @@ Modo ABC Palabras añadidas Eliminar palabras añadidas + Orden de las teclas de función Compatibilidad Apariencia Teclas de acceso rápido @@ -199,7 +200,7 @@ Error al guardar el orden de los caracteres. Orden de caracteres de la tecla 1 Orden de caracteres de la tecla 0 - Restaurar el orden predeterminado + Restaurar el orden predeterminado Idioma Guardar orden Carácter prohibido:%1$s @@ -210,10 +211,18 @@ Forma de V Teclas de flecha Mantén presionado para abrir en un navegador. + No se permiten teclas duplicadas. + Leyenda: + Sugerencia: Después de reorganizar las teclas en la columna 1, toca la columna 2 para ver el resultado al instante (o viceversa). La tecla \"%1$s\" ya está asignada a la función \"%2$s\". ¿Desea asignarla a \"%3$s\"? * Presione o mantenga pulsada una tecla para asignarla a la función \"%1$s\".\n\n* Presione 0 para cancelar.\n\n* Presione 2 para desactivar la función. Mostrar texto en composición Redimensionar arrastrando Deshacer Recalcular el relleno inferior + Columna 2 + Debe haber exactamente 4 teclas por columna. + Solo se permiten los códigos de tecla del 1 al 8. + Una tecla no puede colocarse en ambas columnas. + Columna 1 diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c041f891..09a255e4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -45,6 +45,7 @@ Saisie ABC Mots ajoutés Supprimer des mots ajoutés + Ordre des touches de fonction Compatibilité Apparance Echec du chargement. Mot inadmissible à la ligne %1$d de langue «%2$s». @@ -197,7 +198,7 @@ Échec de l’enregistrement de l’ordre des caractères. Ordre des caractères de la touche 1 Ordre des caractères de la touche 0 - Restaurer l’ordre par défaut + Restaurer l’ordre par défaut Langue Enregistrer l’ordre Caractère interdit:%1$s @@ -209,6 +210,9 @@ Touches fléchées Appuyez et maintenez pour ouvrir dans un navigateur. Touche + Les touches en double ne sont pas autorisées. + Légende : + Astuce : Après avoir réorganisé les touches dans la colonne 1, touchez la colonne 2 pour voir le résultat immédiatement (ou inversement). La touche \"%1$s\" est déjà attribuée à la fonction \"%2$s\". Voulez-vous l’attribuer à \"%3$s\" ? * Appuyez ou maintenez une touche pour l’attribuer à la fonction \"%1$s\".\n\n* Appuyez sur 0 pour annuler.\n\n* Appuyez sur 2 pour désactiver la fonction. (maintenir) @@ -216,4 +220,9 @@ Redimensionner en faisant glisser Annuler (Undo) Recalculer le remplissage inférieur + Colonne 2 + Il doit y avoir exactement 4 touches par colonne. + Seuls les codes de touche 1 à 8 sont autorisés. + Une touche ne peut pas être placée dans les deux colonnes. + Colonne 1 diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f307057b..9cf00f0d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -61,6 +61,7 @@ Modalità ABC Parole aggiunte Elimina parole aggiunte + Ordine dei tasti funzione Compatibilità Aspetto Scrittura facilitata @@ -186,7 +187,7 @@ Salvataggio dell’ordine dei caratteri non riuscito. Ordine dei caratteri del tasto 1 Ordine dei caratteri del tasto 0 - Ripristina ordine predefinito + Ripristina ordine predefinito Lingua Salvare l\'ordine Carattere vietato:%1$s @@ -201,6 +202,9 @@ Tasti freccia Tieni premuto per aprire nel browser. Tasto + Non sono consentiti tasti duplicati. + Legenda: + Suggerimento: Dopo aver riordinato i tasti nella colonna 1, tocca la colonna 2 per vedere subito il risultato (o viceversa). Il tasto \"%1$s\" è già assegnato alla funzione \"%2$s\". Vuoi assegnarlo a \"%3$s\"? * Premi o tieni premuto un tasto per assegnarlo alla funzione \"%1$s\".\n\n* Premi 0 per annullare.\n\n* Premi 2 per disabilitare la funzione. Riassegnare @@ -219,5 +223,10 @@ Ridimensionare trascinando Annulla (Undo) Ricalcola il margine inferiore + Colonna 2 + Devono esserci esattamente 4 tasti per colonna. + Sono consentiti solo i codici dei tasti da 1 a 8. + Un tasto non può essere inserito in entrambe le colonne. + Colonna 1 diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 6ddfb940..39849d57 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -20,6 +20,7 @@ מצב אבג מילים שהוספו מחק מילים שהוספו + סדר מקשי פונקציה הגדרות תאימות מראה מצב חיזוי @@ -200,7 +201,7 @@ שמירת סדר התווים נכשלה. סדר התווים של מקש 1 סדר התווים של מקש 0 - שחזר את הסדר המוגדר כברירת מחדל + שחזר את הסדר המוגדר כברירת מחדל שפה שמור את הסדר תו אסור:%1$s @@ -214,6 +215,9 @@ מקשי חצים אם אתה אוהב %1$s, אתה יכול לקנות לי בירה. לחצו והחזיקו כדי לפתוח בדפדפן. + לא ניתן להשתמש באותם מקשים פעמיים. + מקרא: + טיפ: לאחר שינוי סדר המקשים בעמודה 1, הקש על עמודה 2 כדי לראות את התוצאה מיד (או להפך). המקש \"%1$s\" כבר מוקצה לפונקציה \"%2$s\". האם ברצונך להקצות אותו ל-“%3$s”? * לחצו או החזיקו מקש כדי להקצות אותו לפונקציה \"%1$s\". \n\n* לחצו 0 כדי לבטל. \n\n* לחצו 2 כדי להשבית את הפונקציה. נקה מסנן @@ -223,4 +227,9 @@ שינוי גודל על ידי גרירה ביטול (Undo) חשב מחדש ריווח תחתון + עמודה 2 + חייבים להיות בדיוק 4 מקשים בכל עמודה. + רק קודי מקשים 1–8 מותרים. + לא ניתן למקם מקש אחד בשתי העמודות. + עמודה 1 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index bad788da..36b063bb 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -19,6 +19,7 @@ Pasirinkti komandą Apie programėlę ABC metodas + Funkcinių klavišų tvarka Suderinamumas Išvaizda Nuspėjamumas @@ -208,7 +209,7 @@ Nepavyko išsaugoti simbolių tvarkos. Simbolių tvarka ant klavišo 1 Simbolių tvarka ant klavišo 0 - Atkurti numatytąją tvarką + Atkurti numatytąją tvarką Kalba Išsaugoti tvarką Draudžiamas simbolis:%1$s @@ -219,10 +220,18 @@ V formos Rodyklių klavišai Paspauskite ir laikykite, kad atidarytumėte naršyklėje. + Pasikartojantys klavišai neleidžiami. + Legenda: + Patarimas: Perkėlus klavišus 1 stulpelyje, palieskite 2 stulpelį, kad iškart pamatytumėte rezultatą (arba atvirkščiai). Klavišas „%1$s“ jau priskirtas funkcijai „%2$s“. Ar norite jį priskirti „%3$s“? * Paspauskite arba palaikykite klavišą, kad priskirtumėte jį funkcijai „%1$s“.\n\n* Paspauskite 0, kad atšauktumėte.\n\n* Paspauskite 2, kad išjungtumėte funkciją. Rodyti rašomą tekstą Keisti dydį tempiant Atšaukti (Undo) Perskaičiuoti apatinį paraštę + Stulpelis 2 + Kiekvienoje stulpelyje turi būti tiksliai 4 klavišai. + Leidžiami tik klavišų kodai nuo 1 iki 8. + Vieno klavišo negalima dėti į abu stulpelius. + Stulpelis 1 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 60b267b9..c8f4a3c5 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -69,6 +69,7 @@ ABC-modus Toegevoegde woorden Verwijder toegevoegde woorden + Volgorde van functietoetsen Compatibiliteit Woordenboek laden Uiterlijk @@ -188,7 +189,7 @@ Opslaan van de tekenvolgorde mislukt. Tekenvolgorde van de 1-toets Tekenvolgorde van de 0-toets - Standaardvolgorde herstellen + Standaardvolgorde herstellen Taal Volgorde opslaan Verboden teken:%1$s @@ -202,6 +203,9 @@ V-vorm Druk lang in om in een browser te openen. Toets + Dubbele toetsen zijn niet toegestaan. + Legenda: + Tip: Na het herschikken van de toetsen in kolom 1, tik op kolom 2 om het resultaat direct te zien (of andersom). Toets \"%1$s\" is al toegewezen aan functie \"%2$s\". Wilt u deze toewijzen aan \"%3$s\"? * Druk of houd een toets ingedrukt om deze toe te wijzen aan de functie \"%1$s\".\n\n* Druk op 0 om te annuleren.\n\n* Druk op 2 om de functie uit te schakelen. Opnieuw toewijzen @@ -217,4 +221,9 @@ Compositietekst weergeven Ongedaan maken Onderrand opnieuw berekenen + Kolom 2 + Er moeten precies 4 toetsen per kolom zijn. + Alleen toetscodes 1–8 zijn toegestaan. + Eén toets kan niet in beide kolommen staan. + Kolom 1 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6c835f54..2650c0d8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -20,6 +20,7 @@ Modo ABC Palavras adicionadas Excluir palavras adicionadas + Ordem das teclas de função Compatibilidade Aparência Modo Predictivo @@ -201,7 +202,7 @@ Falha ao salvar a ordem dos caracteres. Ordem de caracteres da tecla 1 Ordem de caracteres da tecla 0 - Restaurar ordem padrão + Restaurar ordem padrão Idioma Salvar ordem Caractere proibido:%1$s @@ -214,6 +215,9 @@ Forma em V Teclas de seta Pressione e segure para abrir no navegador. + Teclas duplicadas não são permitidas. + Legenda: + Dica: Após reorganizar as teclas na coluna 1, toque na coluna 2 para ver o resultado imediatamente (ou vice-versa). A tecla \"%1$s\" já está atribuída à função \"%2$s\". Deseja atribuí-la a \"%3$s\"? * Pressione ou segure uma tecla para atribuí-la à função \"%1$s\".\n\n* Pressione 0 para cancelar.\n\n* Pressione 2 para desativar a função. Limpar Filtro @@ -223,4 +227,9 @@ Redimensionar arrastando Desfazer Recalcular o espaçamento inferior + Coluna 2 + Deve haver exatamente 4 teclas por coluna. + Apenas os códigos de tecla de 1 a 8 são permitidos. + Uma tecla não pode estar nas duas colunas. + Coluna 1 diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 00c84af6..9e248e0b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -52,6 +52,7 @@ Режим AБВ Добавленные слова Удалить добавленные слова + Порядок функциональных клавиш Cовместимость Внешний вид Горячие клавиши @@ -199,7 +200,7 @@ е удалось сохранить порядок символов. Порядок символов на клавише 1 Порядок символов на клавише 0 - Восстановить порядок по умолчанию + Восстановить порядок по умолчанию Язык Сохранить порядок Запрещённый символ:%1$s @@ -210,10 +211,18 @@ V-образная форма Клавиши со стрелками Нажмите и удерживайте, чтобы открыть в браузере. + Повторяющиеся клавиши не допускаются. + Условные обозначения: + Подсказка: После изменения порядка клавиш в колонке 1 нажмите на колонку 2, чтобы сразу увидеть результат (или наоборот). Клавиша «%1$s» уже назначена на функцию «%2$s». Назначить её на «%3$s»? * Нажмите или удерживайте клавишу, чтобы назначить её на функцию «%1$s».\n\n* Нажмите 0, чтобы отменить.\n\n* Нажмите 2, чтобы отключить функцию. Показывать текст при вводе Изменять размер перетаскиванием Отменить (Undo) Пересчитать нижний отступ + Столбец 2 + В каждой колонке должно быть ровно 4 клавиши. + Разрешены только коды клавиш от 1 до 8. + Одна клавиша не может находиться в обеих колонках. + Столбец 1 diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 3896b40f..1fee8058 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -63,6 +63,7 @@ ABC Modu Eklenen sözcükler Eklenen sözcükleri sil + Fonksiyon tuşlarının sırası Uyumluluk Sözlüğü yükle Görünüş @@ -201,7 +202,7 @@ Karakter sırası kaydedilemedi. 1 tuşunun karakter sırası 0 tuşunun karakter sırası - Varsayılan sırayı geri yükle + Varsayılan sırayı geri yükle Dil Sıralamayı kaydet Yasaklı karakter:%1$s @@ -214,6 +215,9 @@ Eğer %1$s\'ı beğendiyseniz bana bir bira ısmarlayabilirsiniz Tarayıcıda açmak için basılı tutun. Tuş + Yinelenen tuşlara izin verilmez. + Açıklama: + İpucu: 1. sütundaki tuşları yeniden sıraladıktan sonra sonucu hemen görmek için 2. sütuna dokunun (veya tam tersi). \"%1$s\" tuşu zaten \"%2$s\" işlevine atanmış. Onu \"%3$s\" işlevine atamak ister misiniz? * \"%1$s\" işlevine atamak için bir tuşa basın veya basılı tutun.\n\n* İptal etmek için 0\'a basın.\n\n* İşlevi devre dışı bırakmak için 2\'ye basın. (basılı tut) @@ -221,4 +225,9 @@ Sürükleyerek yeniden boyutlandır Geri al (Undo) Alt boşluğu yeniden hesapla + Sütun 2 + Her sütunda tam olarak 4 tuş olmalıdır. + Yalnızca 1–8 arası tuş kodlarına izin verilir. + Bir tuş her iki sütuna da yerleştirilemez. + Sütun 1 diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index c4ff49c1..0d3bce5a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -21,6 +21,7 @@ Режим АБВ Додані слова Видалити додані слова + Порядок функціональних клавіш Сумістність Зовнішній вигляд Предиктивний режим @@ -210,7 +211,7 @@ Не вдалося зберегти порядок символів. Порядок символів на клавіші 1 Порядок символів на клавіші 0 - Відновити початковий порядок + Відновити початковий порядок Мова Зберегти порядок Заборонений символ:%1$s @@ -221,10 +222,18 @@ V-подібна Клавіші зі стрілками Натисніть і утримуйте, щоб відкрити в браузері. + Повторювані клавіші не дозволені. + Умовні позначення: + Підказка: Після зміни порядку клавіш у стовпці 1, натисніть на стовпець 2, щоб одразу побачити результат (або навпаки). \"%1$s\" tuşu zaten \"%2$s\" işlevine atanmış. Onu \"%3$s\" işlevine atamak ister misiniz? * Натисніть або утримуйте клавішу, щоб призначити її функції «%1$s».\n\n* Натисніть 0, щоб скасувати.\n\n* Натисніть 2, щоб вимкнути функцію. Показувати текст під час введення Змінювати розмір перетягуванням Скасувати (Undo) Перерахувати нижній відступ + Стовпець 2 + У кожному стовпці має бути рівно 4 клавіші. + Дозволено лише коди клавіш від 1 до 8. + Одна клавіша не може бути в обох стовпцях. + Стовпець 1 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b845cc5..2393cc0f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,6 +8,7 @@ English only Loading… Language + Restore Default Order Search Results No results. @@ -34,6 +35,7 @@ Debug Options Delete Added Words Select Hotkeys + Function Key Order Compatibility Keypad Predictive Mode @@ -160,6 +162,15 @@ If you like %1$s, you could buy me a beer. Press and hold to open in the browser. + Column 1 + Column 2 + There must be exactly 4 keys per column. + Only key codes 1–8 are allowed. + One key cannot be placed in both columns. + No duplicate keys allowed. + Legend: + Hint: After reordering the keys in column 1, tap on column 2 to see the result immediately (or vice versa). + Key \"%1$s\" is already assigned to function \"%2$s\". Do you want to assign it to \"%3$s\"? * Press or hold a key to assign it to the \"%1$s\" function.\n\n* Press 0 to cancel.\n\n* Press 2 to disable the function. Reassign @@ -195,7 +206,6 @@ Missing mandatory characters:%1$s Forbidden character:%1$s Forbidden characters:%1$s - Restore Default Order Save Order Failed saving the character order. 1-key Character Order diff --git a/app/src/main/res/xml/prefs_screen_appearance.xml b/app/src/main/res/xml/prefs_screen_appearance.xml index f07e80a8..583a506c 100644 --- a/app/src/main/res/xml/prefs_screen_appearance.xml +++ b/app/src/main/res/xml/prefs_screen_appearance.xml @@ -14,6 +14,11 @@ app:key="pref_layout_type" app:title="@string/pref_layout" /> + + + + + + + + diff --git a/app/src/main/res/xml/prefs_screen_punctuation.xml b/app/src/main/res/xml/prefs_screen_punctuation.xml index 05d7a377..accf208c 100644 --- a/app/src/main/res/xml/prefs_screen_punctuation.xml +++ b/app/src/main/res/xml/prefs_screen_punctuation.xml @@ -16,7 +16,7 @@ + android:title="@string/restore_default_order" />