diff --git a/app/src/main/java/cfpi_fpsi/eu/titanboard/TitanboardIME.java b/app/src/main/java/cfpi_fpsi/eu/titanboard/TitanboardIME.java index 03e30d1..e1a8458 100644 --- a/app/src/main/java/cfpi_fpsi/eu/titanboard/TitanboardIME.java +++ b/app/src/main/java/cfpi_fpsi/eu/titanboard/TitanboardIME.java @@ -1,28 +1,77 @@ package cfpi_fpsi.eu.titanboard; import android.inputmethodservice.InputMethodService; -import android.view.KeyCharacterMap; +import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.util.HashMap; + public class TitanboardIME extends InputMethodService { + private HashMap keymap; + + @Override + public void onCreate() { + super.onCreate(); + + keymap = new HashMap<>(); + // We load the keymap from the XML file into a variable + XmlPullParser parser = getResources().getXml(getResources() + .getIdentifier("keymap_titan", "xml", getPackageName())); + int code = 0; + int value = 0; + int alt = 0; + try { + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + switch (parser.getEventType()) { + case XmlPullParser.START_TAG: + if (parser.getName().equals("key")) { + for (int i = 0; i < parser.getAttributeCount(); ++i) { + switch (parser.getAttributeName(i)) { + case "code": + code = Integer.parseInt(parser.getAttributeValue(i)); + Log.d("STATE", "KeyCode: " + code); + break; + case "value": + value = Integer.parseInt(String.valueOf(parser.getAttributeValue(i).codePointAt(0))); + break; + case "alt": + alt = Integer.parseInt(String.valueOf(parser.getAttributeValue(i).codePointAt(0))); + break; + } + } + } + break; + case XmlPullParser.END_TAG: + if (parser.getName().equals("key")) { + Log.d("STATE", "Adding KeyCode " + code + " which corresponds to: " + value + " and " + alt); + keymap.put(code, new int[] { value, alt }); + } + break; + default: + break; + } + + parser.next(); + } + } catch (XmlPullParserException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + @Override public View onCreateInputView() { return getLayoutInflater().inflate(R.layout.input, null); } - @Override - public View onCreateCandidatesView() { - return null; - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - return super.onKeyUp(keyCode, event); - } - @Override public boolean onKeyDown(int keyCode, KeyEvent event) { InputConnection conn = getCurrentInputConnection(); @@ -47,12 +96,25 @@ public class TitanboardIME extends InputMethodService { case KeyEvent.KEYCODE_DEL: conn.deleteSurroundingText(1, 0); return true; - default: - // We get the current key mapping. - KeyCharacterMap map = event.getKeyCharacterMap(); - // And we send the character to the app. - conn.commitText(new String(Character.toChars(map.get(keyCode, event.getMetaState()))), 1); + // We suppress the alt keys so the system cannot use them. + case KeyEvent.KEYCODE_ALT_LEFT: + case KeyEvent.KEYCODE_ALT_RIGHT: return true; + default: + // And we send the character to the app. + int[] key = keymap.get(keyCode); + if (key != null) { + if (event.isAltPressed()) { + conn.commitText(new String(Character.toChars(key[1])), 1); + } else if (event.isShiftPressed()) { + conn.commitText(new String(Character.toChars(key[0])).toUpperCase(), 1); + } else { + conn.commitText(new String(Character.toChars(key[0])), 1); + } + return true; + } else { + return false; + } } } } diff --git a/app/src/main/res/xml/keymap_titan.xml b/app/src/main/res/xml/keymap_titan.xml new file mode 100644 index 0000000..739083e --- /dev/null +++ b/app/src/main/res/xml/keymap_titan.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file