commit 90167a986b166f4fb0e97b90bf63993b1c40d1a3 Author: juloo Date: Thu Jul 30 20:14:55 2015 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..67678d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +build.xml +local.properties +proguard-project.txt +bin/* +gen/* diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..10f5dac --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/ant.properties b/ant.properties new file mode 100644 index 0000000..823213a --- /dev/null +++ b/ant.properties @@ -0,0 +1,18 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked into Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. +source.dir=srcs + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + diff --git a/project.properties b/project.properties new file mode 100644 index 0000000..00cf62b --- /dev/null +++ b/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-22 diff --git a/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000..96a442e Binary files /dev/null and b/res/drawable-hdpi/ic_launcher.png differ diff --git a/res/drawable-ldpi/ic_launcher.png b/res/drawable-ldpi/ic_launcher.png new file mode 100644 index 0000000..9923872 Binary files /dev/null and b/res/drawable-ldpi/ic_launcher.png differ diff --git a/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000..359047d Binary files /dev/null and b/res/drawable-mdpi/ic_launcher.png differ diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000..71c6d76 Binary files /dev/null and b/res/drawable-xhdpi/ic_launcher.png differ diff --git a/res/layout/input.xml b/res/layout/input.xml new file mode 100644 index 0000000..2024057 --- /dev/null +++ b/res/layout/input.xml @@ -0,0 +1,8 @@ + + diff --git a/res/values/colors.xml b/res/values/colors.xml new file mode 100644 index 0000000..0890645 --- /dev/null +++ b/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #111111 + #303030 + #000000 + #BFBFBF + diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000..1ebc280 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Keyboard 2.0 + lol + diff --git a/res/xml/azerty.xml b/res/xml/azerty.xml new file mode 100644 index 0000000..72e4753 --- /dev/null +++ b/res/xml/azerty.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/method.xml b/res/xml/method.xml new file mode 100644 index 0000000..fdf120f --- /dev/null +++ b/res/xml/method.xml @@ -0,0 +1,10 @@ + + + + diff --git a/srcs/juloo.keyboard2/KeyValue.java b/srcs/juloo.keyboard2/KeyValue.java new file mode 100644 index 0000000..4c16b74 --- /dev/null +++ b/srcs/juloo.keyboard2/KeyValue.java @@ -0,0 +1,76 @@ +package juloo.keyboard2; + +import android.view.KeyEvent; +import java.util.HashMap; + +enum KeyValue +{ + KEY_A("a", 'a'), + KEY_B("b", 'b'), + KEY_C("c", 'c'), + KEY_D("d", 'd'), + KEY_E("e", 'e'), + KEY_F("f", 'f'), + KEY_G("g", 'g'), + KEY_H("h", 'h'), + KEY_I("i", 'i'), + KEY_J("j", 'j'), + KEY_K("k", 'k'), + KEY_L("l", 'l'), + KEY_M("m", 'm'), + KEY_N("n", 'n'), + KEY_O("o", 'o'), + KEY_P("p", 'p'), + KEY_Q("q", 'q'), + KEY_R("r", 'r'), + KEY_S("s", 's'), + KEY_T("t", 't'), + KEY_U("u", 'u'), + KEY_V("v", 'v'), + KEY_W("w", 'w'), + KEY_X("x", 'x'), + KEY_Y("y", 'y'), + KEY_Z("z", 'z'), + KEY_0("0", '0'), + KEY_1("1", '1'), + KEY_2("2", '2'), + KEY_3("3", '3'), + KEY_4("4", '4'), + KEY_5("5", '5'), + KEY_6("6", '6'), + KEY_7("7", '7'), + KEY_8("8", '8'), + KEY_9("9", '9'); + + private String _name; + private char _char; + + private KeyValue(String name, char c) + { + _name = name; + _char = c; + } + + public String getName() + { + return (_name); + } + + public char getChar() + { + return (_char); + } + + private static HashMap keys = new HashMap(); + + static + { + for (KeyValue k : KeyValue.values()) + keys.put(k.getName(), k); + } + + public static KeyValue getKeyByName(String name) + { + return (KeyValue.keys.get(name)); + } +} diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java new file mode 100644 index 0000000..d1ed613 --- /dev/null +++ b/srcs/juloo.keyboard2/Keyboard2.java @@ -0,0 +1,25 @@ +package juloo.keyboard2; + +import android.inputmethodservice.InputMethodService; +import android.util.Log; +import android.view.View; + +public class Keyboard2 extends InputMethodService +{ + public static final String TAG = "Keyboard_2.0"; + + private Keyboard2View _inputView; + + @Override + public View onCreateInputView() + { + _inputView = (Keyboard2View)getLayoutInflater().inflate(R.layout.input, null); + _inputView.loadKeyboard(R.xml.azerty); + return (_inputView); + } + + public static void log(String str) + { + Log.d(TAG, str); + } +} diff --git a/srcs/juloo.keyboard2/Keyboard2View.java b/srcs/juloo.keyboard2/Keyboard2View.java new file mode 100644 index 0000000..cb59cba --- /dev/null +++ b/srcs/juloo.keyboard2/Keyboard2View.java @@ -0,0 +1,276 @@ +package juloo.keyboard2; + +import android.content.Context; +import android.content.res.XmlResourceParser; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.MotionEvent; +import android.view.View; +import java.util.ArrayList; + +public class Keyboard2View extends View + implements View.OnTouchListener +{ + private static final float KEY_PER_ROW = 10; + private static final float KEY_MARGIN_DPI = 2; + private static final float KEY_PADDING_DPI = 6; + private static final float KEY_HEIGHT_DPI = 40; + private static final float KEY_LABEL_DPI = 16; + private static final float KEY_SUBLABEL_DPI = 12; + + private ArrayList _rows; + + private float _keyWidth; + private float _keyHeight; + private float _keyMargin; + private float _keyPadding; + + private Paint _keyBgPaint; + private Paint _keyDownBgPaint; + private Paint _keyLabelPaint; + private Paint _keySubLabelPaint; + + public Keyboard2View(Context context, AttributeSet attrs) + { + super(context, attrs); + _rows = null; + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + _keyMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, KEY_MARGIN_DPI, dm); + _keyHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, KEY_HEIGHT_DPI, dm); + _keyPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, KEY_PADDING_DPI, dm); + _keyWidth = (dm.widthPixels - _keyMargin) / KEY_PER_ROW - _keyMargin; + _keyBgPaint = new Paint(); + _keyBgPaint.setColor(getResources().getColor(R.color.key_bg)); + _keyDownBgPaint = new Paint(); + _keyDownBgPaint.setColor(getResources().getColor(R.color.key_down_bg)); + _keyLabelPaint = new Paint(); + _keyLabelPaint.setColor(getResources().getColor(R.color.key_label)); + _keyLabelPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, KEY_LABEL_DPI, dm)); + _keyLabelPaint.setTextAlign(Paint.Align.CENTER); + _keySubLabelPaint = new Paint(); + _keySubLabelPaint.setColor(getResources().getColor(R.color.key_label)); + _keySubLabelPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, KEY_SUBLABEL_DPI, dm)); + _keySubLabelPaint.setTextAlign(Paint.Align.CENTER); + setOnTouchListener(this); + } + + public void loadKeyboard(int res) + { + XmlResourceParser parser = getContext().getResources().getXml(res); + ArrayList rows = new ArrayList(); + + try + { + int status; + + while (parser.next() != XmlResourceParser.START_TAG) + continue ; + if (!parser.getName().equals("keyboard")) + throw new Exception("Unknow tag: " + parser.getName()); + while ((status = parser.next()) != XmlResourceParser.END_DOCUMENT) + { + if (status == XmlResourceParser.START_TAG) + { + String tag = parser.getName(); + if (tag.equals("row")) + rows.add(new Row(parser, _keyWidth, _keyMargin)); + else + throw new Exception("Unknow keyboard tag: " + tag); + } + } + _rows = rows; + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + @Override + public boolean onTouch(View v, MotionEvent event) + { + String log; + + log = "Action: "; + switch (event.getAction()) + { + case MotionEvent.ACTION_POINTER_DOWN: + log += "NEW POINTER DOWN"; + break ; + case MotionEvent.ACTION_POINTER_UP: + log += "NEW POINTER UP"; + break ; + case MotionEvent.ACTION_DOWN: + log += "DOWN"; + break ; + case MotionEvent.ACTION_UP: + log += "UP"; + break ; + case MotionEvent.ACTION_MOVE: + log += "MOVE"; + break ; + case MotionEvent.ACTION_CANCEL: + log += "CANCEL"; + break ; + default: + log += "UNKNOW"; + break ; + } + for (int p = 0; p < event.getPointerCount(); p++) + { + log += ", P#"; + log += String.valueOf(p); + log += ": "; + log += String.valueOf(event.getX(p)); + log += "/"; + log += String.valueOf(event.getY(p)); + } + Keyboard2.log(log); + return (true); + } + + private Key getKeyAt(float at_x, float at_y) + { + float x; + float y; + + y = _keyMargin; + for (Row row : _rows) + { + x = (KEY_PER_ROW * (_keyMargin + _keyWidth) - _keyMargin - row.getWidth()) / 2 + _keyMargin; + for (Key k : row) + { + float keyW = _keyWidth * k.width; + if (at_x >= x && at_x < (x + keyW) + && at_y >= y && at_y < (y + _keyHeight)) + return (k); + x += keyW + _keyMargin; + } + y += _keyHeight + _keyMargin; + } + return (null); + } + + @Override + public void onMeasure(int wSpec, int hSpec) + { + int height; + + if (_rows == null) + height = 0; + else + height = (int)((_keyHeight + _keyMargin) * (float)_rows.size() + _keyMargin); + setMeasuredDimension(MeasureSpec.getSize(wSpec), height); + } + + @Override + protected void onDraw(Canvas canvas) + { + float x; + float y; + + if (_rows == null) + return ; + y = _keyMargin; + for (Row row : _rows) + { + x = (KEY_PER_ROW * (_keyMargin + _keyWidth) - _keyMargin - row.getWidth()) / 2 + _keyMargin; + for (Key k : row) + { + float keyW = _keyWidth * k.width; + if (k.down) + canvas.drawRect(x, y, x + keyW, y + _keyHeight, _keyBgPaint); + else + canvas.drawRect(x, y, x + keyW, y + _keyHeight, _keyDownBgPaint); + if (k.key0 != null) + canvas.drawText(new char[]{k.key0.getChar()}, 0, 1, + keyW / 2 + x, (_keyHeight + _keyLabelPaint.getTextSize()) / 2 + y, _keyLabelPaint); + if (k.key1 != null) + canvas.drawText(new char[]{k.key1.getChar()}, 0, 1, + x + _keyPadding, y + _keyPadding, _keySubLabelPaint); + if (k.key2 != null) + canvas.drawText(new char[]{k.key2.getChar()}, 0, 1, + x + keyW - _keyPadding, y + _keyPadding, _keySubLabelPaint); + if (k.key3 != null) + canvas.drawText(new char[]{k.key3.getChar()}, 0, 1, + x + _keyPadding, y + _keyHeight - _keyPadding, _keySubLabelPaint); + if (k.key4 != null) + canvas.drawText(new char[]{k.key4.getChar()}, 0, 1, + x + keyW - _keyPadding, y + _keyHeight - _keyPadding, _keySubLabelPaint); + x += keyW + _keyMargin; + } + y += _keyHeight + _keyMargin; + } + } + + private class Row extends ArrayList + { + private float _width; + + public Row(XmlResourceParser parser, float keyWidth, float keyMargin) throws Exception + { + super(); + + int status; + _width = 0; + while ((status = parser.next()) != XmlResourceParser.END_TAG) + { + if (status == XmlResourceParser.START_TAG) + { + String tag = parser.getName(); + if (tag.equals("key")) + { + Key k = new Key(parser); + if (_width != 0f) + _width += keyMargin; + _width += keyWidth * k.width; + add(k); + } + else + throw new Exception("Unknow row tag: " + tag); + } + } + } + + public float getWidth() + { + return (_width); + } + } + + private class Key + { + public KeyValue key0; + public KeyValue key1; + public KeyValue key2; + public KeyValue key3; + public KeyValue key4; + + public float width; + + public boolean down; + + public Key(XmlResourceParser parser) throws Exception + { + down = false; + key0 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key0")); + key1 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key1")); + key2 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key2")); + key3 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key3")); + key4 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key4")); + try + { + width = parser.getAttributeFloatValue(null, "width", 1f); + } + catch (Exception e) + { + width = 1f; + } + while (parser.next() != XmlResourceParser.END_TAG) + continue ; + } + } +}