Swap the Enter and Action keys when needed

When IME_FLAG_NO_ENTER_ACTION is set.
This commit is contained in:
Jules Aguillon 2022-01-10 00:27:22 +01:00
parent 53113cadd9
commit dfec26a93b
4 changed files with 42 additions and 2 deletions

View File

@ -36,6 +36,7 @@ final class Config
public int key_flags_to_remove; public int key_flags_to_remove;
public String actionLabel; // Might be 'null' public String actionLabel; // Might be 'null'
public int actionId; // Meaningful only when 'actionLabel' isn't 'null' public int actionId; // Meaningful only when 'actionLabel' isn't 'null'
public boolean swapEnterActionKey; // Swap the "enter" and "action" keys
public final IKeyEventHandler handler; public final IKeyEventHandler handler;
@ -66,6 +67,7 @@ final class Config
key_flags_to_remove = 0; key_flags_to_remove = 0;
actionLabel = null; actionLabel = null;
actionId = 0; actionId = 0;
swapEnterActionKey = false;
handler = h; handler = h;
} }

View File

@ -162,12 +162,15 @@ public class Keyboard2 extends InputMethodService
{ {
_config.actionLabel = info.actionLabel.toString(); _config.actionLabel = info.actionLabel.toString();
_config.actionId = info.actionId; _config.actionId = info.actionId;
_config.swapEnterActionKey = false;
} }
else else
{ {
int action = info.imeOptions & EditorInfo.IME_MASK_ACTION; int action = info.imeOptions & EditorInfo.IME_MASK_ACTION;
_config.actionLabel = actionLabel_of_imeAction(action); // Might be null _config.actionLabel = actionLabel_of_imeAction(action); // Might be null
_config.actionId = action; _config.actionId = action;
_config.swapEnterActionKey =
(info.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0;
} }
} }

View File

@ -9,6 +9,7 @@ import android.os.Message;
import android.os.Vibrator; import android.os.Vibrator;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.widget.PopupWindow; import android.widget.PopupWindow;
@ -68,10 +69,18 @@ public class Keyboard2View extends View
// Replace the action key to show the right label. // Replace the action key to show the right label.
KeyValue action_key = null; KeyValue action_key = null;
if (_config.actionLabel != null) if (_config.actionLabel != null)
{
action_key = new KeyValue(_config.actionLabel, _config.actionLabel, action_key = new KeyValue(_config.actionLabel, _config.actionLabel,
KeyValue.CHAR_NONE, KeyValue.EVENT_ACTION, KeyValue.FLAG_NOREPEAT); KeyValue.CHAR_NONE, KeyValue.EVENT_ACTION, KeyValue.FLAG_NOREPEAT);
kw = kw.replaceKeys( }
new KeyboardData.ReplaceKeysByEvent(KeyValue.EVENT_ACTION, action_key)); if (_config.swapEnterActionKey && action_key != null)
kw = kw.replaceKeys(
new KeyboardData.ReplaceKeysByEvent2(KeyEvent.KEYCODE_ENTER,
action_key, KeyValue.EVENT_ACTION,
KeyValue.getKeyByName("enter")));
else
kw = kw.replaceKeys(
new KeyboardData.ReplaceKeysByEvent(KeyValue.EVENT_ACTION, action_key));
_keyboard = kw; _keyboard = kw;
reset(); reset();
} }

View File

@ -201,4 +201,30 @@ class KeyboardData
return (k != null && k.eventCode == _eventCode) ? _replacement : k; return (k != null && k.eventCode == _eventCode) ? _replacement : k;
} }
} }
/* Replace two keys at the same time. Used for swaping keys. */
public static class ReplaceKeysByEvent2 implements MapKeys
{
private final int _e1;
private final KeyValue _r1;
private final int _e2;
private final KeyValue _r2;
public ReplaceKeysByEvent2(int e1, KeyValue r1, int e2, KeyValue r2)
{
_e1 = e1;
_r1 = r1;
_e2 = e2;
_r2 = r2;
}
public KeyValue map(KeyValue k)
{
if (k == null)
return null;
if (k.eventCode == _e1) return _r1;
if (k.eventCode == _e2) return _r2;
return k;
}
}
} }