1
0
Fork 0

added a separate Shift key

This commit is contained in:
sspanak 2024-09-18 15:53:59 +03:00 committed by Dimo Karaivanov
parent 3a5263ccf6
commit d59c78ccc9
16 changed files with 169 additions and 113 deletions

View file

@ -6,7 +6,6 @@ import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.DataStore; import io.github.sspanak.tt9.db.DataStore;
import io.github.sspanak.tt9.db.words.DictionaryLoader; import io.github.sspanak.tt9.db.words.DictionaryLoader;
import io.github.sspanak.tt9.ime.modes.InputMode; import io.github.sspanak.tt9.ime.modes.InputMode;
import io.github.sspanak.tt9.ime.modes.ModeABC;
import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.UI;
import io.github.sspanak.tt9.ui.dialogs.AddWordDialog; import io.github.sspanak.tt9.ui.dialogs.AddWordDialog;
@ -135,28 +134,19 @@ abstract public class CommandHandler extends TextEditingHandler {
return; return;
} else if (allowedInputModes.size() == 1 && allowedInputModes.contains(InputMode.MODE_123)) { } else if (allowedInputModes.size() == 1 && allowedInputModes.contains(InputMode.MODE_123)) {
mInputMode = !mInputMode.is123() ? InputMode.getInstance(settings, mLanguage, inputType, textField, InputMode.MODE_123) : mInputMode; mInputMode = !mInputMode.is123() ? InputMode.getInstance(settings, mLanguage, inputType, textField, InputMode.MODE_123) : mInputMode;
}
// when typing a word or viewing scrolling the suggestions, only change the case
else if (!suggestionOps.isEmpty()) {
nextTextCase();
}
// make "abc" and "ABC" separate modes from user perspective
else if (mInputMode instanceof ModeABC && mLanguage.hasUpperCase() && mInputMode.getTextCase() == InputMode.CASE_LOWER) {
mInputMode.nextTextCase();
} else { } else {
suggestionOps.cancelDelayedAccept();
mInputMode.onAcceptSuggestion(suggestionOps.acceptIncomplete());
resetKeyRepeat();
int nextModeIndex = (allowedInputModes.indexOf(mInputMode.getId()) + 1) % allowedInputModes.size(); int nextModeIndex = (allowedInputModes.indexOf(mInputMode.getId()) + 1) % allowedInputModes.size();
mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, allowedInputModes.get(nextModeIndex)); mInputMode = InputMode.getInstance(settings, mLanguage, inputType, textField, allowedInputModes.get(nextModeIndex));
mInputMode.setTextFieldCase(inputType.determineTextCase()); mInputMode.setTextFieldCase(inputType.determineTextCase());
mInputMode.determineNextWordTextCase(textField.getStringBeforeCursor()); mInputMode.determineNextWordTextCase(textField.getStringBeforeCursor());
resetKeyRepeat();
} }
// save the settings for the next time // save the settings for the next time
settings.saveInputMode(mInputMode.getId()); settings.saveInputMode(mInputMode.getId());
settings.saveTextCase(mInputMode.getTextCase());
statusBar.setText(mInputMode);
} }
@ -220,7 +210,7 @@ abstract public class CommandHandler extends TextEditingHandler {
} }
suggestionOps.cancelDelayedAccept(); suggestionOps.cancelDelayedAccept();
suggestionOps.acceptIncomplete(); mInputMode.onAcceptSuggestion(suggestionOps.acceptIncomplete());
mInputMode.reset(); mInputMode.reset();
mainView.showCommandPalette(); mainView.showCommandPalette();

View file

@ -102,6 +102,10 @@ public abstract class HotkeyHandler extends CommandHandler {
return onKeySelectKeyboard(validateOnly); return onKeySelectKeyboard(validateOnly);
} }
if (keyCode == settings.getKeyShift()) {
return onKeyNextTextCase(validateOnly);
}
if (keyCode == settings.getKeyShowSettings()) { if (keyCode == settings.getKeyShowSettings()) {
return onKeyShowSettings(validateOnly); return onKeyShowSettings(validateOnly);
} }
@ -283,6 +287,7 @@ public abstract class HotkeyHandler extends CommandHandler {
suggestionOps.scheduleDelayedAccept(mInputMode.getAutoAcceptTimeout()); // restart the timer suggestionOps.scheduleDelayedAccept(mInputMode.getAutoAcceptTimeout()); // restart the timer
nextInputMode(); nextInputMode();
statusBar.setText(mInputMode);
mainView.render(); mainView.render();
if (settings.isMainLayoutStealth()) { if (settings.isMainLayoutStealth()) {
@ -294,6 +299,24 @@ public abstract class HotkeyHandler extends CommandHandler {
} }
public boolean onKeyNextTextCase(boolean validateOnly) {
if (validateOnly) {
return true;
}
suggestionOps.scheduleDelayedAccept(mInputMode.getAutoAcceptTimeout()); // restart the timer
nextTextCase();
statusBar.setText(mInputMode);
mainView.render();
if (settings.isMainLayoutStealth()) {
UI.toastShortSingle(this, mInputMode.getClass().getSimpleName(), mInputMode.toString());
}
return true;
}
private boolean onKeySelectKeyboard(boolean validateOnly) { private boolean onKeySelectKeyboard(boolean validateOnly) {
if (!isInputViewShown() || shouldBeOff()) { if (!isInputViewShown() || shouldBeOff()) {
return false; return false;

View file

@ -55,7 +55,8 @@ public class Key {
|| keyCode == settings.getKeyPreviousSuggestion() || keyCode == settings.getKeyPreviousSuggestion()
|| keyCode == settings.getKeyNextSuggestion() || keyCode == settings.getKeyNextSuggestion()
|| keyCode == settings.getKeyNextInputMode() || keyCode == settings.getKeyNextInputMode()
|| keyCode == settings.getKeyNextLanguage(); || keyCode == settings.getKeyNextLanguage()
|| keyCode == settings.getKeyShift();
} }

View file

@ -93,6 +93,7 @@ public class Hotkeys {
defaultKeys.put(SectionKeymap.ITEM_NEXT_INPUT_MODE, KeyEvent.KEYCODE_POUND); defaultKeys.put(SectionKeymap.ITEM_NEXT_INPUT_MODE, KeyEvent.KEYCODE_POUND);
defaultKeys.put(SectionKeymap.ITEM_NEXT_LANGUAGE, -KeyEvent.KEYCODE_POUND); // negative means "hold" defaultKeys.put(SectionKeymap.ITEM_NEXT_LANGUAGE, -KeyEvent.KEYCODE_POUND); // negative means "hold"
defaultKeys.put(SectionKeymap.ITEM_SELECT_KEYBOARD, KeyEvent.KEYCODE_UNKNOWN); defaultKeys.put(SectionKeymap.ITEM_SELECT_KEYBOARD, KeyEvent.KEYCODE_UNKNOWN);
defaultKeys.put(SectionKeymap.ITEM_SHIFT, -KeyEvent.KEYCODE_STAR);
defaultKeys.put(SectionKeymap.ITEM_SHOW_SETTINGS, KeyEvent.KEYCODE_UNKNOWN); defaultKeys.put(SectionKeymap.ITEM_SHOW_SETTINGS, KeyEvent.KEYCODE_UNKNOWN);
defaultKeys.put(SectionKeymap.ITEM_VOICE_INPUT, KeyEvent.KEYCODE_UNKNOWN); defaultKeys.put(SectionKeymap.ITEM_VOICE_INPUT, KeyEvent.KEYCODE_UNKNOWN);

View file

@ -31,6 +31,7 @@ public class HotkeysScreen extends BaseScreenFragment {
findPreference(SectionKeymap.ITEM_NEXT_INPUT_MODE), findPreference(SectionKeymap.ITEM_NEXT_INPUT_MODE),
findPreference(SectionKeymap.ITEM_NEXT_LANGUAGE), findPreference(SectionKeymap.ITEM_NEXT_LANGUAGE),
findPreference(SectionKeymap.ITEM_SELECT_KEYBOARD), findPreference(SectionKeymap.ITEM_SELECT_KEYBOARD),
findPreference(SectionKeymap.ITEM_SHIFT),
findPreference(SectionKeymap.ITEM_SHOW_SETTINGS), findPreference(SectionKeymap.ITEM_SHOW_SETTINGS),
findPreference(SectionKeymap.ITEM_VOICE_INPUT), findPreference(SectionKeymap.ITEM_VOICE_INPUT),
}; };

View file

@ -24,6 +24,7 @@ public class SectionKeymap {
public static final String ITEM_NEXT_INPUT_MODE = "key_next_input_mode"; public static final String ITEM_NEXT_INPUT_MODE = "key_next_input_mode";
public static final String ITEM_NEXT_LANGUAGE = "key_next_language"; public static final String ITEM_NEXT_LANGUAGE = "key_next_language";
public static final String ITEM_SELECT_KEYBOARD = "key_select_keyboard"; public static final String ITEM_SELECT_KEYBOARD = "key_select_keyboard";
public static final String ITEM_SHIFT = "key_shift";
public static final String ITEM_SHOW_SETTINGS = "key_show_settings"; public static final String ITEM_SHOW_SETTINGS = "key_show_settings";
public static final String ITEM_VOICE_INPUT = "key_voice_input"; public static final String ITEM_VOICE_INPUT = "key_voice_input";

View file

@ -11,7 +11,7 @@ class SettingsHotkeys extends SettingsHacks {
SettingsHotkeys(Context context) { super(context); } SettingsHotkeys(Context context) { super(context); }
public boolean areHotkeysInitialized() { public boolean areHotkeysInitialized() {
return !prefs.getBoolean("hotkeys_v3_initialized", false); return !prefs.getBoolean("hotkeys_v4_initialized", false);
} }
public void setDefaultKeys(HashMap<String, Integer> defaultKeys) { public void setDefaultKeys(HashMap<String, Integer> defaultKeys) {
@ -19,7 +19,7 @@ class SettingsHotkeys extends SettingsHacks {
prefsEditor.putString(key, String.valueOf(defaultKeys.get(key))); prefsEditor.putString(key, String.valueOf(defaultKeys.get(key)));
} }
prefsEditor.putBoolean("hotkeys_v3_initialized", true).apply(); prefsEditor.putBoolean("hotkeys_v4_initialized", true).apply();
} }
@ -61,6 +61,9 @@ class SettingsHotkeys extends SettingsHacks {
public int getKeySelectKeyboard() { public int getKeySelectKeyboard() {
return getFunctionKey(SectionKeymap.ITEM_SELECT_KEYBOARD); return getFunctionKey(SectionKeymap.ITEM_SELECT_KEYBOARD);
} }
public int getKeyShift() {
return getFunctionKey(SectionKeymap.ITEM_SHIFT);
}
public int getKeyShowSettings() { public int getKeyShowSettings() {
return getFunctionKey(SectionKeymap.ITEM_SHOW_SETTINGS); return getFunctionKey(SectionKeymap.ITEM_SHOW_SETTINGS);
} }

View file

@ -113,8 +113,8 @@ class MainLayoutNumpad extends BaseMainLayout {
if ( if (
keyId == R.id.soft_key_add_word keyId == R.id.soft_key_add_word
|| keyId == R.id.soft_key_input_mode || keyId == R.id.soft_key_lf3
|| keyId == R.id.soft_key_language || keyId == R.id.soft_key_lf4
|| keyId == R.id.soft_key_filter_suggestions || keyId == R.id.soft_key_filter_suggestions
) { ) {
key.setEnabled(false); key.setEnabled(false);
@ -145,8 +145,8 @@ class MainLayoutNumpad extends BaseMainLayout {
if ( if (
keyId == R.id.soft_key_add_word keyId == R.id.soft_key_add_word
|| keyId == R.id.soft_key_input_mode || keyId == R.id.soft_key_lf3
|| keyId == R.id.soft_key_language || keyId == R.id.soft_key_lf4
|| keyId == R.id.soft_key_filter_suggestions || keyId == R.id.soft_key_filter_suggestions
) { ) {
key.setEnabled(true); key.setEnabled(true);

View file

@ -262,7 +262,9 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement
} }
sb.setSpan(new RelativeSizeSpan(complexLabelTitleSize), 0, titleLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE); sb.setSpan(new RelativeSizeSpan(complexLabelTitleSize), 0, titleLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
sb.setSpan(new StyleSpan(Typeface.ITALIC), 0, titleLength, Spanned.SPAN_EXCLUSIVE_INCLUSIVE); if (!new Text(title).startsWithGraphic()) {
sb.setSpan(new StyleSpan(Typeface.ITALIC), 0, titleLength, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
sb.setSpan(new RelativeSizeSpan(padding), titleLength, titleLength + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE); sb.setSpan(new RelativeSizeSpan(padding), titleLength, titleLength + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
sb.setSpan(new RelativeSizeSpan(complexLabelSubTitleSize), titleLength + 1, sb.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); sb.setSpan(new RelativeSizeSpan(complexLabelSubTitleSize), titleLength + 1, sb.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);

View file

@ -1,56 +0,0 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.ui.Vibration;
public class SoftKeyInputMode extends SwipeableKey {
public SoftKeyInputMode(Context context) {
super(context);
}
public SoftKeyInputMode(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SoftKeyInputMode(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void handleHold() {
preventRepeat();
if (validateTT9Handler()) {
vibrate(Vibration.getHoldVibration());
tt9.selectKeyboard();
}
}
@Override
protected boolean handleRelease() {
return notSwiped() && validateTT9Handler() && tt9.onKeyNextInputMode(false);
}
@Override
protected void handleEndSwipeX(float position, float delta) {
if (validateTT9Handler()) {
tt9.nextKeyboard();
}
}
@Override
protected int getNoEmojiTitle() {
return R.string.virtual_key_input_mode;
}
@Override
public void render() {
super.render();
if (tt9 != null) {
setEnabled(!tt9.isVoiceInputActive());
}
}
}

View file

@ -0,0 +1,74 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.graphics.Paint;
import android.os.Build;
import android.util.AttributeSet;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.ui.Vibration;
public class SoftKeyLF4 extends SwipeableKey {
private final static float GLOBE_SIZE = 0.35f;
public SoftKeyLF4(Context context) {
super(context);
complexLabelTitleSize = GLOBE_SIZE;
}
public SoftKeyLF4(Context context, AttributeSet attrs) {
super(context, attrs);
complexLabelTitleSize = GLOBE_SIZE;
}
public SoftKeyLF4(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
complexLabelTitleSize = GLOBE_SIZE;
}
@Override
protected void handleHold() {
preventRepeat();
if (validateTT9Handler() && tt9.onKeyNextLanguage(false)) {
vibrate(Vibration.getHoldVibration());
}
}
@Override
protected boolean handleRelease() {
return notSwiped() && validateTT9Handler() && tt9.onKeyNextInputMode(false);
}
@Override
protected void handleEndSwipeX(float position, float delta) {
if (validateTT9Handler()) {
tt9.nextKeyboard();
}
}
@Override
protected void handleEndSwipeY(float position, float delta) {
if (validateTT9Handler()) {
tt9.selectKeyboard();
}
}
@Override
protected String getTitle() {
return "🌐";
}
@Override
protected String getSubTitle() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && new Paint().hasGlyph("")) {
return "";
}
return getContext().getString(R.string.virtual_key_input_mode).toUpperCase();
}
@Override
public void render() {
setTextSize(28);
super.render();
setEnabled(tt9 != null && !tt9.isVoiceInputActive());
}
}

View file

@ -1,23 +0,0 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.util.AttributeSet;
public class SoftKeyNextLanguage extends SoftKey {
public SoftKeyNextLanguage(Context context) { super(context); }
public SoftKeyNextLanguage(Context context, AttributeSet attrs) { super(context, attrs); }
public SoftKeyNextLanguage(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override
protected boolean handleRelease() {
return validateTT9Handler() && tt9.onKeyNextLanguage(false);
}
@Override
public void render() {
super.render();
if (tt9 != null) {
setEnabled(!tt9.isInputModeNumeric() && !tt9.isVoiceInputActive());
}
}
}

View file

@ -0,0 +1,37 @@
package io.github.sspanak.tt9.ui.main.keys;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
public class SoftKeyShift extends SoftKey {
public SoftKeyShift(Context context) {
super(context);
}
public SoftKeyShift(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SoftKeyShift(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected boolean handleRelease() {
return validateTT9Handler() && tt9.onKeyNextTextCase(false);
}
@Override
protected String getTitle() {
return "";
}
@Override
public void render() {
setTextSize(30);
setTypeface(Typeface.DEFAULT_BOLD);
super.render();
setEnabled(tt9 != null && !tt9.isVoiceInputActive());
}
}

View file

@ -62,7 +62,8 @@
style="@android:style/Widget.Holo.Button.Borderless" style="@android:style/Widget.Holo.Button.Borderless"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="@dimen/numpad_control_key_layout_weight" /> android:layout_weight="@dimen/numpad_control_key_layout_weight"
android:textSize="@dimen/soft_key_icon_size" />
<View <View
android:id="@+id/separator_2_1" android:id="@+id/separator_2_1"
@ -97,14 +98,12 @@
android:layout_height="@dimen/numpad_key_height" android:layout_height="@dimen/numpad_key_height"
android:layoutDirection="ltr"> android:layoutDirection="ltr">
<io.github.sspanak.tt9.ui.main.keys.SoftKeyInputMode <io.github.sspanak.tt9.ui.main.keys.SoftKeyShift
android:id="@+id/soft_key_input_mode" android:id="@+id/soft_key_lf3"
style="@android:style/Widget.Holo.Button.Borderless" style="@android:style/Widget.Holo.Button.Borderless"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="@dimen/numpad_control_key_layout_weight" android:layout_weight="@dimen/numpad_control_key_layout_weight" />
android:text="⌨"
android:textSize="@dimen/soft_key_icon_size" />
<View <View
android:id="@+id/separator_3_1" android:id="@+id/separator_3_1"
@ -130,7 +129,6 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="@dimen/numpad_control_key_layout_weight" /> android:layout_weight="@dimen/numpad_control_key_layout_weight" />
</LinearLayout> </LinearLayout>
<!-- Row 4 --> <!-- Row 4 -->
@ -140,13 +138,12 @@
android:layout_height="@dimen/numpad_key_height" android:layout_height="@dimen/numpad_key_height"
android:layoutDirection="ltr"> android:layoutDirection="ltr">
<io.github.sspanak.tt9.ui.main.keys.SoftKeyNextLanguage <io.github.sspanak.tt9.ui.main.keys.SoftKeyLF4
android:id="@+id/soft_key_language" android:id="@+id/soft_key_lf4"
style="@android:style/Widget.Holo.Button.Borderless" style="@android:style/Widget.Holo.Button.Borderless"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="@dimen/numpad_control_key_layout_weight" android:layout_weight="@dimen/numpad_control_key_layout_weight" />
android:text="🌐" />
<View <View
android:id="@+id/separator_4_1" android:id="@+id/separator_4_1"

View file

@ -208,6 +208,7 @@
<string name="virtual_key_del" translatable="false">Del</string> <string name="virtual_key_del" translatable="false">Del</string>
<string name="virtual_key_input_mode" translatable="false">Mode</string> <string name="virtual_key_input_mode" translatable="false">Mode</string>
<string name="virtual_key_settings" translatable="false">Cfg</string> <string name="virtual_key_settings" translatable="false">Cfg</string>
<string name="virtual_key_shift" translatable="false">Shift</string>
<string name="virtual_key_text_editing" translatable="false">Copy</string> <string name="virtual_key_text_editing" translatable="false">Copy</string>
<string name="voice_input_listening">Speak</string> <string name="voice_input_listening">Speak</string>

View file

@ -46,6 +46,10 @@
app:key="key_select_keyboard" app:key="key_select_keyboard"
app:title="@string/function_select_keyboard" /> app:title="@string/function_select_keyboard" />
<DropDownPreference
app:key="key_shift"
app:title="@string/virtual_key_shift" />
<DropDownPreference <DropDownPreference
app:key="key_show_settings" app:key="key_show_settings"
app:title="@string/function_show_settings" /> app:title="@string/function_show_settings" />