mirror of
https://github.com/Julow/Unexpected-Keyboard.git
synced 2025-06-20 09:47:46 +02:00
Improve the code for dynamic updates of the layout
This commit is contained in:
parent
4964bfb87f
commit
e92504ae92
2
Makefile
2
Makefile
@ -3,7 +3,7 @@
|
|||||||
PACKAGE_NAME = juloo.keyboard2
|
PACKAGE_NAME = juloo.keyboard2
|
||||||
|
|
||||||
ANDROID_PLATFORM_VERSION = android-30
|
ANDROID_PLATFORM_VERSION = android-30
|
||||||
JAVA_VERSION = 1.7
|
JAVA_VERSION = 1.8
|
||||||
|
|
||||||
SRC_DIR = srcs
|
SRC_DIR = srcs
|
||||||
ASSETS_DIR = assets
|
ASSETS_DIR = assets
|
||||||
|
@ -8,6 +8,7 @@ import android.os.Build;
|
|||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
|
||||||
final class Config
|
final class Config
|
||||||
{
|
{
|
||||||
@ -118,6 +119,36 @@ final class Config
|
|||||||
theme = getThemeId(res, prefs.getString("theme", ""));
|
theme = getThemeId(res, prefs.getString("theme", ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Update the layout according to the configuration.
|
||||||
|
* - Remove the switching key if it isn't needed
|
||||||
|
* - Remove keys from other locales
|
||||||
|
* - Replace the action key to show the right label
|
||||||
|
* - Swap the enter and action keys
|
||||||
|
*/
|
||||||
|
public KeyboardData modify_layout(KeyboardData kw)
|
||||||
|
{
|
||||||
|
KeyValue action_key = (actionLabel == null) ? null :
|
||||||
|
new KeyValue(actionLabel, actionLabel, KeyValue.CHAR_NONE,
|
||||||
|
KeyValue.EVENT_ACTION, KeyValue.FLAG_NOREPEAT);
|
||||||
|
return kw.replaceKeys(key -> {
|
||||||
|
if (key == null)
|
||||||
|
return null;
|
||||||
|
switch (key.eventCode)
|
||||||
|
{
|
||||||
|
case KeyValue.EVENT_CHANGE_METHOD:
|
||||||
|
return shouldOfferSwitchingToNextInputMethod ? key : null;
|
||||||
|
case KeyEvent.KEYCODE_ENTER:
|
||||||
|
return (swapEnterActionKey && action_key != null) ? action_key : key;
|
||||||
|
case KeyValue.EVENT_ACTION:
|
||||||
|
return (swapEnterActionKey && action_key != null) ?
|
||||||
|
KeyValue.getKeyByName("enter") : action_key;
|
||||||
|
default:
|
||||||
|
if ((key.flags & key_flags_to_remove) != 0)
|
||||||
|
return null;
|
||||||
|
return key;
|
||||||
|
}});
|
||||||
|
}
|
||||||
|
|
||||||
private float getDipPref(DisplayMetrics dm, SharedPreferences prefs, String pref_name, float def)
|
private float getDipPref(DisplayMetrics dm, SharedPreferences prefs, String pref_name, float def)
|
||||||
{
|
{
|
||||||
float value;
|
float value;
|
||||||
|
@ -51,7 +51,6 @@ class KeyValue
|
|||||||
public static final int FLAG_ACCENT_MACRON = (1 << 27);
|
public static final int FLAG_ACCENT_MACRON = (1 << 27);
|
||||||
public static final int FLAG_ACCENT_ORDINAL = (1 << 28);
|
public static final int FLAG_ACCENT_ORDINAL = (1 << 28);
|
||||||
|
|
||||||
|
|
||||||
public static final int FLAGS_ACCENTS = FLAG_ACCENT1 | FLAG_ACCENT2 |
|
public static final int FLAGS_ACCENTS = FLAG_ACCENT1 | FLAG_ACCENT2 |
|
||||||
FLAG_ACCENT3 | FLAG_ACCENT4 | FLAG_ACCENT5 | FLAG_ACCENT6 |
|
FLAG_ACCENT3 | FLAG_ACCENT4 | FLAG_ACCENT5 | FLAG_ACCENT6 |
|
||||||
FLAG_ACCENT_CARON | FLAG_ACCENT_MACRON | FLAG_ACCENT_SUPERSCRIPT |
|
FLAG_ACCENT_CARON | FLAG_ACCENT_MACRON | FLAG_ACCENT_SUPERSCRIPT |
|
||||||
|
@ -55,28 +55,7 @@ public class Keyboard2View extends View
|
|||||||
|
|
||||||
public void setKeyboard(KeyboardData kw)
|
public void setKeyboard(KeyboardData kw)
|
||||||
{
|
{
|
||||||
if (!_config.shouldOfferSwitchingToNextInputMethod)
|
_keyboard = _config.modify_layout(kw);
|
||||||
kw = kw.replaceKeys(
|
|
||||||
new KeyboardData.ReplaceKeysByEvent(KeyValue.EVENT_CHANGE_METHOD, null));
|
|
||||||
if (_config.key_flags_to_remove != 0)
|
|
||||||
kw = kw.replaceKeys(
|
|
||||||
new KeyboardData.ReplaceKeysByFlags(_config.key_flags_to_remove, null));
|
|
||||||
// Replace the action key to show the right label.
|
|
||||||
KeyValue action_key = null;
|
|
||||||
if (_config.actionLabel != null)
|
|
||||||
{
|
|
||||||
action_key = new KeyValue(_config.actionLabel, _config.actionLabel,
|
|
||||||
KeyValue.CHAR_NONE, KeyValue.EVENT_ACTION, KeyValue.FLAG_NOREPEAT);
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
class KeyboardData
|
class KeyboardData
|
||||||
{
|
{
|
||||||
@ -184,7 +185,8 @@ class KeyboardData
|
|||||||
|
|
||||||
public Key replaceKeys(MapKeys f)
|
public Key replaceKeys(MapKeys f)
|
||||||
{
|
{
|
||||||
return new Key(f.map(key0), f.map(key1), f.map(key2), f.map(key3), f.map(key4), width, shift, edgekeys);
|
return new Key(f.apply(key0), f.apply(key1), f.apply(key2),
|
||||||
|
f.apply(key3), f.apply(key4), width, shift, edgekeys);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** New key with the width multiplied by 's'. */
|
/** New key with the width multiplied by 's'. */
|
||||||
@ -194,70 +196,7 @@ class KeyboardData
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static abstract interface MapKeys
|
public static abstract interface MapKeys extends Function<KeyValue, KeyValue> { }
|
||||||
{
|
|
||||||
public abstract KeyValue map(KeyValue k);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ReplaceKeysByFlags implements MapKeys
|
|
||||||
{
|
|
||||||
private final int _flags;
|
|
||||||
private final KeyValue _replacement;
|
|
||||||
|
|
||||||
public ReplaceKeysByFlags(int flags, KeyValue r)
|
|
||||||
{
|
|
||||||
_flags = flags;
|
|
||||||
_replacement = r;
|
|
||||||
}
|
|
||||||
|
|
||||||
public KeyValue map(KeyValue k)
|
|
||||||
{
|
|
||||||
return (k != null && (k.flags & _flags) != 0) ? _replacement : k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ReplaceKeysByEvent implements MapKeys
|
|
||||||
{
|
|
||||||
private final int _eventCode;
|
|
||||||
private final KeyValue _replacement;
|
|
||||||
|
|
||||||
public ReplaceKeysByEvent(int ev, KeyValue r)
|
|
||||||
{
|
|
||||||
_eventCode = ev;
|
|
||||||
_replacement = r;
|
|
||||||
}
|
|
||||||
|
|
||||||
public KeyValue map(KeyValue 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Parsing utils */
|
/** Parsing utils */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user