abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.keyboard2/KeyEventHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/juloo.keyboard2/KeyEventHandler.java')
-rw-r--r--srcs/juloo.keyboard2/KeyEventHandler.java112
1 files changed, 80 insertions, 32 deletions
diff --git a/srcs/juloo.keyboard2/KeyEventHandler.java b/srcs/juloo.keyboard2/KeyEventHandler.java
index 5d23903..ebf838c 100644
--- a/srcs/juloo.keyboard2/KeyEventHandler.java
+++ b/srcs/juloo.keyboard2/KeyEventHandler.java
@@ -1,42 +1,63 @@
package juloo.keyboard2;
+import android.os.Looper;
import android.view.KeyEvent;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
class KeyEventHandler implements Config.IKeyEventHandler
{
- private IReceiver _recv;
+ IReceiver _recv;
+ Autocapitalisation _autocap;
- public KeyEventHandler(IReceiver recv)
+ public int actionId; // Action performed by the Action key.
+
+ public KeyEventHandler(Looper looper, IReceiver recv)
{
_recv = recv;
+ _autocap = new Autocapitalisation(looper,
+ this.new Autocapitalisation_callback());
+ }
+
+ /** Editing just started. */
+ public void started(EditorInfo info)
+ {
+ _autocap.started(info, _recv.getCurrentInputConnection());
+ }
+
+ /** Selection has been updated. */
+ public void selection_updated(int oldSelStart, int newSelStart)
+ {
+ _autocap.selection_updated(oldSelStart, newSelStart);
}
- public void handleKeyUp(KeyValue key, Pointers.Modifiers mods)
+ /** A key has been released. */
+ public void key_up(KeyValue key, Pointers.Modifiers mods)
{
if (key == null)
return;
switch (key.getKind())
{
- case Char:
- _recv.commitChar(key.getChar());
- break;
- case String:
- _recv.commitText(key.getString());
- break;
+ case Char: send_text(String.valueOf(key.getChar())); break;
+ case String: send_text(key.getString()); break;
case Event:
switch (key.getEvent())
{
case CONFIG: _recv.showKeyboardConfig(); break;
case SWITCH_TEXT:
- case SWITCH_SECOND_BACK: _recv.switchMain(); break;
- case SWITCH_NUMERIC: _recv.switchNumeric(); break;
+ case SWITCH_SECOND_BACK: _recv.switch_main(); break;
+ case SWITCH_NUMERIC: _recv.switch_layout(R.xml.numeric); break;
case SWITCH_EMOJI: _recv.setPane_emoji(); break;
case SWITCH_BACK_EMOJI: _recv.setPane_normal(); break;
case CHANGE_METHOD: _recv.switchToNextInputMethod(); break;
- case ACTION: _recv.performAction(); break;
- case SWITCH_SECOND: _recv.switchSecond(); break;
- case SWITCH_GREEKMATH: _recv.switchGreekmath(); break;
- case CAPS_LOCK: _recv.enableCapsLock(); break;
+ case ACTION:
+ InputConnection conn = _recv.getCurrentInputConnection();
+ if (conn != null)
+ conn.performEditorAction(actionId);
+ break;
+ case SWITCH_SECOND: _recv.switch_second(); break;
+ case SWITCH_GREEKMATH: _recv.switch_layout(R.xml.greekmath); break;
+ case CAPS_LOCK: _recv.set_shift_state(true, true); break;
}
break;
case Keyevent:
@@ -57,17 +78,17 @@ class KeyEventHandler implements Config.IKeyEventHandler
// getCurrentInputConnection().deleteSurroundingText(before, after);
// }
- private int sendMetaKey(int eventCode, int metaFlags, int metaState, boolean down)
+ int sendMetaKey(int eventCode, int metaFlags, int metaState, boolean down)
{
int action;
int updatedMetaState;
if (down) { action = KeyEvent.ACTION_DOWN; updatedMetaState = metaState | metaFlags; }
else { action = KeyEvent.ACTION_UP; updatedMetaState = metaState & ~metaFlags; }
- _recv.sendKeyEvent(action, eventCode, metaState);
+ send_keyevent(action, eventCode, metaState);
return updatedMetaState;
}
- private int sendMetaKeyForModifier(KeyValue.Modifier mod, int metaState, boolean down)
+ int sendMetaKeyForModifier(KeyValue.Modifier mod, int metaState, boolean down)
{
switch (mod)
{
@@ -86,16 +107,35 @@ class KeyEventHandler implements Config.IKeyEventHandler
/*
* Don't set KeyEvent.FLAG_SOFT_KEYBOARD.
*/
- private void handleKeyUpWithModifier(int keyCode, Pointers.Modifiers mods)
- {
+ void handleKeyUpWithModifier(int keyCode, Pointers.Modifiers mods)
+ {
int metaState = 0;
for (int i = 0; i < mods.size(); i++)
metaState = sendMetaKeyForModifier(mods.get(i), metaState, true);
- _recv.sendKeyEvent(KeyEvent.ACTION_DOWN, keyCode, metaState);
- _recv.sendKeyEvent(KeyEvent.ACTION_UP, keyCode, metaState);
+ send_keyevent(KeyEvent.ACTION_DOWN, keyCode, metaState);
+ send_keyevent(KeyEvent.ACTION_UP, keyCode, metaState);
for (int i = mods.size() - 1; i >= 0; i--)
metaState = sendMetaKeyForModifier(mods.get(i), metaState, false);
- }
+ }
+
+ void send_keyevent(int eventAction, int eventCode, int meta)
+ {
+ InputConnection conn = _recv.getCurrentInputConnection();
+ if (conn == null)
+ return;
+ conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, meta));
+ if (eventAction == KeyEvent.ACTION_UP)
+ _autocap.event_sent(eventCode, meta);
+ }
+
+ void send_text(CharSequence text)
+ {
+ InputConnection conn = _recv.getCurrentInputConnection();
+ if (conn == null)
+ return;
+ conn.commitText(text, 1);
+ _autocap.typed(text);
+ }
public static interface IReceiver
{
@@ -103,17 +143,25 @@ class KeyEventHandler implements Config.IKeyEventHandler
public void setPane_emoji();
public void setPane_normal();
public void showKeyboardConfig();
- public void performAction();
- public void enableCapsLock();
- public void switchMain();
- public void switchNumeric();
- public void switchSecond();
- public void switchGreekmath();
+ public void switch_main();
+ public void switch_second();
+ public void switch_layout(int layout_id);
+
+ public void set_shift_state(boolean state, boolean lock);
- public void sendKeyEvent(int eventAction, int eventCode, int meta);
+ public InputConnection getCurrentInputConnection();
+ }
- public void commitText(String text);
- public void commitChar(char c);
+ class Autocapitalisation_callback implements Autocapitalisation.Callback
+ {
+ @Override
+ public void update_shift_state(boolean should_enable, boolean should_disable)
+ {
+ if (should_enable)
+ _recv.set_shift_state(true, false);
+ else if (should_disable)
+ _recv.set_shift_state(false, false);
+ }
}
}