From 66f7928078edb162ab1c6fa4b1954a3a3aae6fef Mon Sep 17 00:00:00 2001 From: pelya Date: Thu, 30 Dec 2010 15:23:46 +0000 Subject: [PATCH] Option to customize on-screen keyboard layout --- project/java/Settings.java | 143 +++++++++++++++++- .../java/translations/values-de/strings.xml | 2 +- .../java/translations/values-fi/strings.xml | 2 +- .../java/translations/values-fr/strings.xml | 2 +- .../java/translations/values-ru/strings.xml | 2 +- .../java/translations/values-uk/strings.xml | 2 +- project/java/translations/values/strings.xml | 5 +- project/jni/application/src | 2 +- .../src/video/android/SDL_androidinput.c | 39 +++-- .../video/android/SDL_touchscreenkeyboard.c | 11 +- project/res/drawable/b1.png | Bin 0 -> 1279 bytes project/res/drawable/b2.png | Bin 0 -> 1475 bytes project/res/drawable/b3.png | Bin 0 -> 1488 bytes project/res/drawable/b4.png | Bin 0 -> 1386 bytes project/res/drawable/b5.png | Bin 0 -> 1496 bytes project/res/drawable/b6.png | Bin 0 -> 1487 bytes project/res/drawable/dpad.png | Bin 0 -> 11703 bytes project/res/drawable/keyboard.png | Bin 0 -> 1872 bytes 18 files changed, 189 insertions(+), 21 deletions(-) create mode 100644 project/res/drawable/b1.png create mode 100644 project/res/drawable/b2.png create mode 100644 project/res/drawable/b3.png create mode 100644 project/res/drawable/b4.png create mode 100644 project/res/drawable/b5.png create mode 100644 project/res/drawable/b6.png create mode 100644 project/res/drawable/dpad.png create mode 100644 project/res/drawable/keyboard.png diff --git a/project/java/Settings.java b/project/java/Settings.java index 605e36004..2f043c738 100644 --- a/project/java/Settings.java +++ b/project/java/Settings.java @@ -104,6 +104,10 @@ class Settings out.writeInt(Globals.CommandLine.length()); for( int i = 0; i < Globals.CommandLine.length(); i++ ) out.writeChar(Globals.CommandLine.charAt(i)); + out.writeInt(Globals.ScreenKbControlsLayout.length); + for( int i = 0; i < Globals.ScreenKbControlsLayout.length; i++ ) + for( int ii = 0; ii < 4; ii++ ) + out.writeInt(Globals.ScreenKbControlsLayout[i][ii]); out.close(); settingsLoaded = true; @@ -220,6 +224,12 @@ class Settings for( int i = 0; i < len; i++ ) b.append( settingsFile.readChar() ); Globals.CommandLine = b.toString(); + + if( settingsFile.readInt() != Globals.ScreenKbControlsLayout.length ) + throw new IOException(); + for( int i = 0; i < Globals.ScreenKbControlsLayout.length; i++ ) + for( int ii = 0; ii < 4; ii++ ) + Globals.ScreenKbControlsLayout[i][ii] = settingsFile.readInt(); settingsLoaded = true; @@ -470,6 +480,8 @@ class Settings items.add(p.getResources().getString(R.string.remap_screenkb)); + items.add(p.getResources().getString(R.string.screenkb_custom_layout)); + items.add(p.getResources().getString(R.string.ok)); AlertDialog.Builder builder = new AlertDialog.Builder(p); @@ -497,6 +509,10 @@ class Settings if( item == selected ) showRemapScreenKbConfig(p); selected++; + + if( item == selected ) + showCustomizeScreenKbLayout(p); + selected++; if( item == selected ) showConfigMainMenu(p); @@ -753,6 +769,10 @@ class Settings p.getResources().getString(R.string.controls_screenkb_small), p.getResources().getString(R.string.controls_screenkb_tiny) }; + for( int i = 0; i < Globals.ScreenKbControlsLayout.length; i++ ) + for( int ii = 0; ii < 4; ii++ ) + Globals.ScreenKbControlsLayout[i][ii] = 0; + AlertDialog.Builder builder = new AlertDialog.Builder(p); builder.setTitle(p.getResources().getString(R.string.controls_screenkb_size)); builder.setSingleChoiceItems(items, Globals.TouchscreenKeyboardSize, new DialogInterface.OnClickListener() @@ -1390,7 +1410,7 @@ class Settings p.keyListener = tool; } - public static class ScreenEdgesCalibrationTool implements TouchEventsListener, KeyEventsListener + static class ScreenEdgesCalibrationTool implements TouchEventsListener, KeyEventsListener { MainActivity p; ImageView img; @@ -1449,6 +1469,119 @@ class Settings } } + static void showCustomizeScreenKbLayout(final MainActivity p) + { + p.setText(p.getResources().getString(R.string.screenkb_custom_layout_help)); + CustomizeScreenKbLayoutTool tool = new CustomizeScreenKbLayoutTool(p); + p.touchListener = tool; + p.keyListener = tool; + }; + + static class CustomizeScreenKbLayoutTool implements TouchEventsListener, KeyEventsListener + { + MainActivity p; + FrameLayout layout = null; + ImageView imgs[] = new ImageView[Globals.ScreenKbControlsLayout.length]; + Bitmap bmps[] = new Bitmap[Globals.ScreenKbControlsLayout.length]; + int currentButton = 0; + int buttons[] = { + R.drawable.dpad, + R.drawable.keyboard, + R.drawable.b1, + R.drawable.b2, + R.drawable.b3, + R.drawable.b4, + R.drawable.b5, + R.drawable.b6 + }; + + public CustomizeScreenKbLayoutTool(MainActivity _p) + { + p = _p; + layout = new FrameLayout(p); + p.getVideoLayout().addView(layout); + currentButton = 0; + setupButton(true); + } + + void setupButton(boolean undo) + { + do { + currentButton += undo ? -1 : 1; + if(currentButton >= Globals.ScreenKbControlsLayout.length) + { + p.getVideoLayout().removeView(layout); + layout = null; + p.touchListener = null; + p.keyListener = null; + showScreenKeyboardConfigMainMenu(p); + return; + } + if(currentButton < 0) + { + currentButton = 0; + undo = false; + } + } while( ! Globals.ScreenKbControlsShown[currentButton] ); + + if( imgs[currentButton] == null ) + { + imgs[currentButton] = new ImageView(p); + imgs[currentButton].setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); + imgs[currentButton].setScaleType(ImageView.ScaleType.MATRIX); + bmps[currentButton] = BitmapFactory.decodeResource( p.getResources(), buttons[currentButton] ); + imgs[currentButton].setImageBitmap(bmps[currentButton]); + layout.addView(imgs[currentButton]); + } + Matrix m = new Matrix(); + RectF src = new RectF(0, 0, bmps[currentButton].getWidth(), bmps[currentButton].getHeight()); + RectF dst = new RectF(Globals.ScreenKbControlsLayout[currentButton][0], Globals.ScreenKbControlsLayout[currentButton][1], + Globals.ScreenKbControlsLayout[currentButton][2], Globals.ScreenKbControlsLayout[currentButton][3]); + m.setRectToRect(src, dst, Matrix.ScaleToFit.FILL); + imgs[currentButton].setImageMatrix(m); + } + + public void onTouchEvent(final MotionEvent ev) + { + if( ev.getAction() == MotionEvent.ACTION_DOWN ) + { + Globals.ScreenKbControlsLayout[currentButton][0] = (int)ev.getX(); + Globals.ScreenKbControlsLayout[currentButton][1] = (int)ev.getY(); + Globals.ScreenKbControlsLayout[currentButton][2] = (int)ev.getX(); + Globals.ScreenKbControlsLayout[currentButton][3] = (int)ev.getY(); + } + if( ev.getAction() == MotionEvent.ACTION_MOVE ) + { + if( Globals.ScreenKbControlsLayout[currentButton][0] > (int)ev.getX() ) + Globals.ScreenKbControlsLayout[currentButton][0] = (int)ev.getX(); + if( Globals.ScreenKbControlsLayout[currentButton][1] > (int)ev.getY() ) + Globals.ScreenKbControlsLayout[currentButton][1] = (int)ev.getY(); + if( Globals.ScreenKbControlsLayout[currentButton][2] < (int)ev.getX() ) + Globals.ScreenKbControlsLayout[currentButton][2] = (int)ev.getX(); + if( Globals.ScreenKbControlsLayout[currentButton][3] < (int)ev.getY() ) + Globals.ScreenKbControlsLayout[currentButton][3] = (int)ev.getY(); + } + + Matrix m = new Matrix(); + RectF src = new RectF(0, 0, bmps[currentButton].getWidth(), bmps[currentButton].getHeight()); + RectF dst = new RectF(Globals.ScreenKbControlsLayout[currentButton][0], Globals.ScreenKbControlsLayout[currentButton][1], + Globals.ScreenKbControlsLayout[currentButton][2], Globals.ScreenKbControlsLayout[currentButton][3]); + m.setRectToRect(src, dst, Matrix.ScaleToFit.FILL); + imgs[currentButton].setImageMatrix(m); + + if( ev.getAction() == MotionEvent.ACTION_UP ) + setupButton(false); + } + + public void onKeyEvent(final int keyCode) + { + if( layout != null && imgs[currentButton] != null ) + layout.removeView(imgs[currentButton]); + imgs[currentButton] = null; + setupButton(true); + } + } + // =============================================================================================== static void Apply(Activity p) @@ -1487,11 +1620,16 @@ class Settings nativeSetScreenKbKeyUsed(i, Globals.ScreenKbControlsShown[i] ? 1 : 0); for( int i = 0; i < Globals.RemapScreenKbKeycode.length; i++ ) nativeSetKeymapKeyScreenKb(i, SDL_Keys.values[Globals.RemapScreenKbKeycode[i]]); + for( int i = 0; i < Globals.ScreenKbControlsLayout.length; i++ ) + if( Globals.ScreenKbControlsLayout[i][0] < Globals.ScreenKbControlsLayout[i][2] ) + nativeSetScreenKbKeyLayout( i, Globals.ScreenKbControlsLayout[i][0], Globals.ScreenKbControlsLayout[i][1], + Globals.ScreenKbControlsLayout[i][2], Globals.ScreenKbControlsLayout[i][3]); for( int i = 0; i < Globals.RemapMultitouchGestureKeycode.length; i++ ) nativeSetKeymapKeyMultitouchGesture(i, Globals.MultitouchGesturesUsed[i] ? SDL_Keys.values[Globals.RemapMultitouchGestureKeycode[i]] : 0); nativeSetMultitouchGestureSensitivity(Globals.MultitouchGestureSensitivity); if( Globals.TouchscreenCalibration[2] > Globals.TouchscreenCalibration[0] ) - nativeSetTouchscreenCalibration(Globals.TouchscreenCalibration[0], Globals.TouchscreenCalibration[1], Globals.TouchscreenCalibration[2], Globals.TouchscreenCalibration[3]); + nativeSetTouchscreenCalibration(Globals.TouchscreenCalibration[0], Globals.TouchscreenCalibration[1], + Globals.TouchscreenCalibration[2], Globals.TouchscreenCalibration[3]); String lang = new String(Locale.getDefault().getLanguage()); if( Locale.getDefault().getCountry().length() > 0 ) @@ -1552,6 +1690,7 @@ class Settings private static native int nativeGetKeymapKeyScreenKb(int keynum); private static native void nativeSetKeymapKeyScreenKb(int keynum, int key); private static native void nativeSetScreenKbKeyUsed(int keynum, int used); + private static native void nativeSetScreenKbKeyLayout(int keynum, int x1, int y1, int x2, int y2); private static native int nativeGetKeymapKeyMultitouchGesture(int keynum); private static native void nativeSetKeymapKeyMultitouchGesture(int keynum, int key); private static native void nativeSetMultitouchGestureSensitivity(int sensitivity); diff --git a/project/java/translations/values-de/strings.xml b/project/java/translations/values-de/strings.xml index 60c966f2d..7b4552086 100644 --- a/project/java/translations/values-de/strings.xml +++ b/project/java/translations/values-de/strings.xml @@ -104,5 +104,5 @@ Geben Sie direkt Geben Kommandozeilenparameter Kalibrieren Touchscreen -Touch allen vier Rändern des Bildschirms, wenn Sie fertig sind, drücken Sie Zurück +Touch allen vier Rändern des Bildschirms, drücken Sie Menü, wenn Sie fertig diff --git a/project/java/translations/values-fi/strings.xml b/project/java/translations/values-fi/strings.xml index 5443781e4..941e4656a 100644 --- a/project/java/translations/values-fi/strings.xml +++ b/project/java/translations/values-fi/strings.xml @@ -104,5 +104,5 @@ Määritä hakemisto Määritä komentoriviparametrit Kalibroi kosketusnäyttö -Touch kaikki neljä reunaa näytön, paina Takaisin, kun olet valmis +Touch kaikki neljä reunaa näytön, paina Valikko, kun olet valmis diff --git a/project/java/translations/values-fr/strings.xml b/project/java/translations/values-fr/strings.xml index 9e1930dac..a99a18edd 100644 --- a/project/java/translations/values-fr/strings.xml +++ b/project/java/translations/values-fr/strings.xml @@ -107,5 +107,5 @@ Spécifiez le répertoire Spécifier les paramètres de ligne de commande Calibrer écran tactile -Touchez les quatre bords de l\u0026#39;écran, appuyez sur Retour lorsque vous avez terminé +Touchez les quatre bords de l\u0026#39;écran, appuyez sur MENU lorsque vous avez terminé diff --git a/project/java/translations/values-ru/strings.xml b/project/java/translations/values-ru/strings.xml index d227a93a0..347409752 100644 --- a/project/java/translations/values-ru/strings.xml +++ b/project/java/translations/values-ru/strings.xml @@ -97,5 +97,5 @@ Укажите каталог Укажите параметры командной строки Калибровка сенсорного экрана -Дотроньтесь до всех четырех краев экрана, потом нажмите Назад +Дотроньтесь до всех четырех краев экрана, потом нажмите MENU diff --git a/project/java/translations/values-uk/strings.xml b/project/java/translations/values-uk/strings.xml index ad164d362..2e348ae00 100644 --- a/project/java/translations/values-uk/strings.xml +++ b/project/java/translations/values-uk/strings.xml @@ -97,5 +97,5 @@ Вкажіть каталог Вкажіть параметри командного рядка Калібрування сенсорного екрану -Доторкнiться до всіх чотирьох країв екрану, потiм натисніть Назад +Доторкнiться до всіх чотирьох країв екрану, потiм натисніть MENU diff --git a/project/java/translations/values/strings.xml b/project/java/translations/values/strings.xml index 9961e711f..b562223ec 100644 --- a/project/java/translations/values/strings.xml +++ b/project/java/translations/values/strings.xml @@ -116,7 +116,10 @@ Rotate left two-finger gesture Rotate right two-finger gesture + Customize on-screen keyboard layout + Slide screen to add button, press Menu to undo last button + Calibrate touchscreen - Touch all four edges of the screen, press Back when done + Touch all four edges of the screen, press Menu when done diff --git a/project/jni/application/src b/project/jni/application/src index 4de17cd97..104f796a6 120000 --- a/project/jni/application/src +++ b/project/jni/application/src @@ -1 +1 @@ -alienblaster \ No newline at end of file +ballfield \ No newline at end of file diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c index d046f125c..75439199c 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c @@ -1416,7 +1416,7 @@ void ANDROID_InitOSKeymap() } JNIEXPORT jint JNICALL -JAVA_EXPORT_NAME(Settings_nativeGetKeymapKey) ( JNIEnv* env, jobject thiz, jint code) +JAVA_EXPORT_NAME(Settings_nativeGetKeymapKey) (JNIEnv* env, jobject thiz, jint code) { if( code < 0 || code > KEYCODE_LAST ) return SDL_KEY(UNKNOWN); @@ -1424,7 +1424,7 @@ JAVA_EXPORT_NAME(Settings_nativeGetKeymapKey) ( JNIEnv* env, jobject thiz, jint } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetKeymapKey) ( JNIEnv* env, jobject thiz, jint javakey, jint key) +JAVA_EXPORT_NAME(Settings_nativeSetKeymapKey) (JNIEnv* env, jobject thiz, jint javakey, jint key) { if( javakey < 0 || javakey > KEYCODE_LAST ) return; @@ -1432,7 +1432,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetKeymapKey) ( JNIEnv* env, jobject thiz, jint } JNIEXPORT jint JNICALL -JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyScreenKb) ( JNIEnv* env, jobject thiz, jint keynum) +JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyScreenKb) (JNIEnv* env, jobject thiz, jint keynum) { if( keynum < 0 || keynum > SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 + 4 ) return SDL_KEY(UNKNOWN); @@ -1444,7 +1444,7 @@ JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyScreenKb) ( JNIEnv* env, jobject th } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyScreenKb) ( JNIEnv* env, jobject thiz, jint keynum, jint key) +JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyScreenKb) (JNIEnv* env, jobject thiz, jint keynum, jint key) { if( keynum < 0 || keynum > SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 + 4 ) return; @@ -1454,7 +1454,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyScreenKb) ( JNIEnv* env, jobject th } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyUsed) ( JNIEnv* env, jobject thiz, jint keynum, jint used) +JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyUsed) (JNIEnv* env, jobject thiz, jint keynum, jint used) { SDL_Rect rect = {0, 0, 0, 0}; int key = -1; @@ -1470,7 +1470,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyUsed) ( JNIEnv* env, jobject thiz } JNIEXPORT jint JNICALL -JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyMultitouchGesture) ( JNIEnv* env, jobject thiz, jint keynum) +JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyMultitouchGesture) (JNIEnv* env, jobject thiz, jint keynum) { if( keynum < 0 || keynum >= MAX_MULTITOUCH_GESTURES ) return SDL_KEY(UNKNOWN); @@ -1478,21 +1478,21 @@ JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyMultitouchGesture) ( JNIEnv* env, j } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyMultitouchGesture) ( JNIEnv* env, jobject thiz, jint keynum, jint keycode) +JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyMultitouchGesture) (JNIEnv* env, jobject thiz, jint keynum, jint keycode) { if( keynum < 0 || keynum >= MAX_MULTITOUCH_GESTURES ) - return SDL_KEY(UNKNOWN); + return; multitouchGestureKeycode[keynum] = keycode; } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetMultitouchGestureSensitivity) ( JNIEnv* env, jobject thiz, jint sensitivity) +JAVA_EXPORT_NAME(Settings_nativeSetMultitouchGestureSensitivity) (JNIEnv* env, jobject thiz, jint sensitivity) { multitouchGestureSensitivity = sensitivity; } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetTouchscreenCalibration) (JNIEnv* env, jobject thiz, jint x1, jint y1, jint x2, jint y2) +JAVA_EXPORT_NAME(Settings_nativeSetTouchscreenCalibration) (JNIEnv* env, jobject thiz, jint x1, jint y1, jint x2, jint y2) { SDL_ANDROID_TouchscreenCalibrationX = x1; SDL_ANDROID_TouchscreenCalibrationY = y1; @@ -1500,6 +1500,25 @@ JAVA_EXPORT_NAME(Settings_nativeSetTouchscreenCalibration) (JNIEnv* env, jobjec SDL_ANDROID_TouchscreenCalibrationHeight = y2 - y1; } + +JNIEXPORT void JNICALL +JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyLayout) (JNIEnv* env, jobject thiz, jint keynum, jint x1, jint y1, jint x2, jint y2) +{ + SDL_Rect rect = {x1, y1, x2-x1, y2-y1}; + int key = -1; + __android_log_print(ANDROID_LOG_INFO, "libSDL", "nativeSetScreenKbKeyLayout: %d %d %d %d", (int)rect.x, (int)rect.y, (int)rect.w, (int)rect.h); + if( keynum == 0 ) + key = SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD; + if( keynum == 1 ) + key = SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT; + if( keynum - 2 >= 0 && keynum - 2 <= SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 ) + key = keynum - 2 + SDL_ANDROID_SCREENKEYBOARD_BUTTON_0; + + if( key >= 0 ) + SDL_ANDROID_SetScreenKeyboardButtonPos(key, &rect); +} + + JNIEXPORT void JNICALL JAVA_EXPORT_NAME(Settings_nativeInitKeymap) ( JNIEnv* env, jobject thiz ) { diff --git a/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c b/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c index 6079f9405..564930ff1 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c @@ -860,12 +860,19 @@ int SDL_ANDROID_SetScreenKeyboardButtonPos(int buttonId, SDL_Rect * pos) } else { - buttons[buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0] = *pos; + int i = buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0; + buttons[i] = *pos; if(touchscreenKeyboardTheme == 0) { - int i = buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0; prepareFontCharWireframe(FONT_BTN1 + i, MIN(buttons[i].h, buttons[i].w), MIN(buttons[i].h, buttons[i].w)); } + if( i < AutoFireButtonsNum ) + { + buttonsAutoFireRect[i].w = buttons[i].w * 2; + buttonsAutoFireRect[i].h = buttons[i].h * 2; + buttonsAutoFireRect[i].x = buttons[i].x - buttons[i].w / 2; + buttonsAutoFireRect[i].y = buttons[i].y - buttons[i].h / 2; + } } return 1; }; diff --git a/project/res/drawable/b1.png b/project/res/drawable/b1.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6babc51898e11df94ad93a1fca9fdc0f74960a GIT binary patch literal 1279 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Ea{HEjtmUzPnffIy<}iu zkSuYHC<)F_D=AMbN@Z|N$xljE@XSq2PYp^G2*>_w; z{-3GYzxn>zO{aGyZd7SmG-b-1q7(89Dm?i*w@Q5%5>S*V3g}YbTlrarBQSbugNu)? zOH!hs*wW0*uQReQiYdC>YBMXmTY5Kt-~IPK_h-NV=abx%AsE&g^H6-0kS-8@IKcz1UAKVSlQs7|KBa*4>Bozg`zOEN9&c!CtY2~c!UX}A=my3Z?N~$ex<8ytFO^$Z z8#UF`%Nbp|V6{m}>5*TOV6aN(KHY~VnMaCE7B0!{?_jKbxP$~`u#0o|58$YBUUV*XWM$|yZwXH>-Qad z&tJas{loKFqV-o_b97XTNWNOKjx#A!phSu<=H;ZKJ4@$2PBus}6kGT9L`jCD&7S?u z6Z+CBQ$=6DcD1Qb+mUKK<#g(o^vwkv{!618i((}XH$~29G@B?J{VyxY!I%A7)a`R6 z#peus-G%c_3r-eI{Urb5_3O>mufIm!=DZncQ)FhgIK?-^IX<3CkMSbQp~BXy25iYX zS&A;q-Z~RrK8q@Ue zZgG=kll8m3!C|v(ih9c*_j{{XuU-+NHDksM2fO*!pZ?~@iF~(kOi4~==H}-9R$Wr^ zC7!Y343q!0uZ6+l-L5)%df(K9jxAJ4Dp$PR;r!Hm@8fT8ts{Q@P%<+&uNLY`{e3ty zW@SW(@db&syK@R2KRY|^!^)K_?=e0&plGFYp_Y5s?GGOercIkx#eHC(g!>NG_5SFxdcjic|@rI#iC^OHM;^ZXfYSPRx{Pber5C@wDkmMSA5@#8<^h5)t$j@mrV zul{}PJD_k*)%kGtp%pjPK&NGpOkB9>E$tXdBOX8u{;x!KUTil-+1uY z%QOFT=DEL$_;uiL>hqF0D~$a0s@_fFk+VIY?Y-h>smLyT-0mE1K#wS=pgDl3;X^W8PMl^W=x>U&Ae zggrjYv$a=g{;F$PJN(nmryI|(`)-su|H#+Z*Eehm6Ipxd%_s5cIk7Vq+1K9s(2&(? zb<%T_s)zPE*2%qrg{fB}r6&onop@>6%)7%V>q=WrY*cTJUbo27f2NPl{{3@i&5KpM zJ9TS*G(If1o9wAP_1vM;DLM@29)}twpFQ>T=47ekEe$L`_W2)mpX(+Rv2szE?&6@; r52iyWGlXLo6Bp7zh)tJMRHscWk0|SGntDnm{r-UW|`ixe= literal 0 HcmV?d00001 diff --git a/project/res/drawable/b2.png b/project/res/drawable/b2.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5f2e6cd6186d8000d0fb54fc81c8a22a6dbf83 GIT binary patch literal 1475 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Ea{HEjtmUzPnffIy<}iu zkSuYHC<)F_D=AMbN@Z|N$xljE@XSq2PYp^qvNPMvSY- zzjycVolV>Ry6xz(pe`w)rrHf#{7q*CF<%u}J9QG*#0X9&A*F-jZ)f|P2GkgcIIZzI z7`CNJ({rIq^3p9PUv;l+pQPZ_v4k`C(XQ9Kc7IQ|Nq={5_ijVc^55kNW#7*1HNJ12 zer`^6pHj<##UgX-r%ju-#HjM!77w+_5m7NmepPX;TBRssmN+AEg&WI-kc>~hy(Not zB)Qi;X3%@E;n{?|$PGJEjTfX|nBei~q^$LZAHVZ0?p$8~Va?my+np1+4H~tL#gA-# zZJ(T$CZ)S}t%sS)LMy$P>k|d|*7|MuVB)msf6&Dm*?SVaJ61^r1e;bhez|%zROg>n z|Gan38Ckgp|1sb7a!A;*zx~|7181I|o?&6ndVHDe4LzP)8&^qQa8g`h6?y1_0GH%F z3Eed-x>`yqpZD<|-f>!0< z2jW}ZPn0KIFHKFpD=)m}^2Lf^){;#zR$tX$y?XWJPK;i3kyDx2Ac2!+Boj!fKp|y2)iB<2fUsYSSZdIJ= z^XL8V_wgcor#&#Vwe6iaabnlTix&fBtiRb=#odX&8ue=bzZ@;q+jn++^k$IjKDr_O z{JaM@JB8(wQ&X3kF+KVGMlVGwHMr)!^}4fh{B6sZEi)W_-V?xfellnWu z_5{gIk(d zgm%SQYHS{vSoeLzgk*Z53SMC{a^T5D<4V z!$d3JachuqBTub18ylN}y}kZH|9Li@$BrFqcWyY?-qxm4;qA?RZjNR1vuDq$iw|X` zR8&ZCb8~+Z`(XOyM&9jjhZPO}{^b|C^S!aJudnO*-o5#cdX?Sf?g-YH7ykSAyyfZ% z?(^Fh?ya5wN2o~WLotKC`i70g&yD$~9k}g&f6`0IX6Y$2x{`_x*(Kbb(k05JA+qLH zpTmLEvKG=+3PES&EnbN!?{Pn{kWrFDljrsn#;HmV_6iFgU8WT$v{-7&gP@|<&zU!M zyCz5M-^=ED`MrM!kC39Gea0L8bq*Jn2W74@KcqT`MRiGA=7Vc%Q*Acp&bIOYu4i(? z;_1)%XFg|G2Zdkd6$?+9b=;-GSFdUsXLI#s6K{^2HGFs5cYn;Qm*4lJgr{Fsh~pwR z+eVX>lDiyx&!$~iH1DUxmHmuc^e<_CR&^*lGeK_Ay_U=iF{?BydMg$&&aW@yI(|?3 z(7|wsAbCzt%;pI%qbV-`0K4H3b-p=&h8dF{QrkW(q zypZ!})2fgg5>J9>=7?#hd`q!uJIo%x^lp3M*H@x*=I&U*vh?OoegBiY44n8sn>;kT z%4KhHNXXfU$SN)pO zb!)=Y$^CXBbM78V3UpaiI78(1OoroC$}*GFo_>0>za_cJmEmX2ysmzkuPigpDa`g% toa>wX@R{!(<3En6g}*eO$}_St_;y$PYUQ8*l!1YP!PC{xWt~$(69DF3yB7ce literal 0 HcmV?d00001 diff --git a/project/res/drawable/b3.png b/project/res/drawable/b3.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1cacbdbbbef5f29fea4f2605187af545466d06 GIT binary patch literal 1488 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Ea{HEjtmUzPnffIy<}iu zkSuYHC<)F_D=AMbN@Z|N$xljE@XSq2PYp^qvO4PfV!5 zzjycVr6z9HyBVRdOnUOj2%P8+SHjS^wuVH+0K>ZT@q*m;|5|?j zw7hclx^kFYbCz|1Omx?VmnA~n)0I8H#2d{zemHh9t9xi|#ws^`f&CjdHcqWBzi_jT z%l*~s4?)ShA2Gjp|8hySfkFLSsb%|rNtI1AIbmhsksNBgfR!nrbW_VhMFE35rdAPw zqMDZy&%V{kQRmJ+-ISY}aIr2rD$)B~o1}x<=GNNG?az25LiY(mtA)mA?zq)f>Pa-9{f zP|k9N>ELeeJG{*w($%v?EppE>$-TAl3%sH}Z|9ypJx7naaxPi6jO}=z?Csz`)s2h9 zC)=>Gvm07k?#x}gZJU_5eq4j6;AVA&{=YY;e%iLP^mTfCMQW<*t5>gTy64!}C!Rm` zq_$yG*Mwz(WmDf*9yh;#?)1(zYj}i(g(c+W-MziLW1=G>bo4}bdu)mE*tuwri?U4m zY~Fj)73_cW=TDxgE5qk4pJ3o4Dk^%E`N5HeA`uOX8*JlvZQiNr7&uiX=jQSrK74q_ z+__U<-@UuMdq309qc@yI4DRl!yexk2&YhlR%cg&4T)>g!J;$~>%*8Tri zYhq&ZgJIgVX@8zCUAmOLn)R%2@4gH7?#1==^duxC9QfXOOjw;y%pv;qYooVSfd?2S zg;*PW{kqpv!HfSJSH$Uy7Xy8KeFL9GPssjbn3bLFtRuFxE8}$nW5tz=7aP~D)0@d@ znVGsdQflVk)`bnx)&-^|3R70gTfBZ|w1@k^GS-NnNFo2_{%J~bD>tA;9{we z2SJ6euQC^LO>f=!^MRm<@Be(GDe)YfKOG;RIw| zw!Obx$;4ykm-tuxwM~%wr&YTSKkCx?EWt7Vr0;pDlMim1oZZtBqSpKETG^hf#ccEI zj9Stc1+u(gZ4Q`a!gF`Q!8GF+0oQAEuB>kI)PJ<{lWHSdsSl&A!)DIQ3-*R6ew3V; zVd>VUpZFj~-Y@9y1fN}@8*_a8wwrf}$K|-F%{@4ErexM>IYlpx-hdllSw0or-pEx_ zJR!e3Co8jQ(}J5nQ$ts7G(53<(n^tQC*N%JkXWl8ulTlkN8w|uW6RcS)n%9c-0Zzc zpXcIXp4JroT@!+i9%k6lXWo>U8J2hcU#Eq7go?uClL4P6 zE}O}sHpxTvvBwgjh<&xv`Cs<$-fLMq>&tcqW`@PT%l|%O4&2JXz`)??>gTe~DWM4f DCbFzu literal 0 HcmV?d00001 diff --git a/project/res/drawable/b4.png b/project/res/drawable/b4.png new file mode 100644 index 0000000000000000000000000000000000000000..cc202ae13d5b9405e7931205c02f7f3635a5d52e GIT binary patch literal 1386 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Ea{HEjtmUzPnffIy<}iu zkSuYHC<)F_D=AMbN@Z|N$xljE@XSq2PYp^j?AU1Dk8Vp?cF?%Rrq>le zyK~=gN>IhDq|fKio$Ct|TOS{MF+;@q_H7G`j)Nw;EX{l^!Y!Ik4XKANv1on42cLVHo{&y^0 z8f|g?USCG7$TD@srOSOQwph(sH*V== z3w^!r?VR4KzPZ3y&&Hg0`m<`O)}D8*!VXq*4@$2uPp){N+xuziPFCmLw?5=BPuurf zZhrko)w=3E{%;xTRfK*RPi^vET|IA++wIVG`Mhj%+gNXJ$t=F(V|(oQ0uDnnz0&hl zVb&jiJe1p1Vsic2vyD3{gx99u=9-}>*1d4wIzF+V!v04TbELgCCYmi%n7aJ8(;lt+ z3u_p>HA|Ci?UzL?U;J^o){T}Jn{U=xSy^B1glI+bIPru zmQ?Ag_I<`))wvRG=fv+Ty#BedDDcmQ4}G5R+np4x__lX6++%HDr4#4*ZIYs?$sVqq zstMC1*5z!N#J}po={3yc^x%U3&@7eEFwh(m-SsPQe zS>BnMd6x7CQ_&+`VPRngMn;R~`}@~7h{spR&FuMY@48@;iK*$!m;*Hr&dhB4f3NY_ zF*hDQKBd`bgOs(VowWIB8uDQ$^X7%Y6J_cjteJiK!#-v?-WM(&nHJtWD`qhEzwbC@ zdijHAk7maMp`E&qnIGOV;FEiMc*7gvUca-meCDt6Y;}_FKDzQAhuB+}jtN}u0bR8X zZd_V+{y)w03@n!Z@&9adtM3|r?T#-qzI1A>Kk0g&dDFqYk1brePnK})wcT4$UBNKF z&ZIeANs#3Qt7Dwil@{FsizlhA;5_?Kf3;_8?}8a#Dw8WbHn_h&^kU}+ske3=yUX7vi6r%Q*X2gn3MytDx+-`%#p^jMuE;ZcDc+N+z<;ytjF?Ubx%NTN5rW-7eUBMbYJo zy=Qju?i=c?qvNf#_Uj$ z|F!=onV4Lel5qPXZ|pY1uLm!-H&thRTv#i4Zr9o=Q@a9Mnl7*8_@#E@L*f@lGl98N z#b(~{oOxyHOR*^%*RJtjd;9i=Z1$y_w&tug%=G#6boce*chhS;cWK0C-E5rwd+zM& z_m{FPN?1cmHsvPd4JmV?Dm_d>MOI?c6CTrF?)ZrZ;xN zWb0yyd=RVP7k%}G3CJH5YgMH02m_D99eL7;s zZ`r+fV>{m6ZJutu+tk1DG4tLOcJ7VZ;RXNNDjLwi>(B zvWt67V}q4g=ifPbP|)&5q;%ihM&H-6txjQIr`>P&QR}`QXWP*D&s^kG{2bf$nxWG3 z@*LhwkN^0#{Ql$f?b=tuHcs<-^u9#O?Cm>?Nm8=mx7L|tr0_B?%e(Y&$IGmqvkIJs zVtOIxYy31n7Gz3V8lC-cGq9&W{>bKwcjeMLjz3Yy*QRMa zE0;Z(dLo~3uS-E{#9|2wh2E2Qu2n>TO%OLN{0c(h@+fJv0= zPuBMym%gS58_3#LiR9+yrmC%oYIK?)TIsICBBkjf$yWaEOl9}&+qW-Xy0oa}d68w7 zNW-R^uY3+PI%_*F_#-Cr^4Z$xd*3fy5QvJ7zIgFsI{CVA8bv3n+`!{ZM{QVv8 zWR{&jS9o9X8(miW>VGd@tjPLvHd)=TX46)+gj-v+yEbk#{Pe^7l=z*Eu@*&7IFu%S zNM>KON>14>*WaK2*RNk!bTxWgW_K|Q<-I#_^TMU^w+C;H<9Pv-@5uh zC#}hD-yi1fvAxj0e*YgC|GJT8%evZ~yr0Bme2{%j%y0ISd%erY!VsieXM= QU|?YIboFyt=akR{06c`x761SM literal 0 HcmV?d00001 diff --git a/project/res/drawable/b6.png b/project/res/drawable/b6.png new file mode 100644 index 0000000000000000000000000000000000000000..83902c21042fd94d5562208664d4c912588d7cbe GIT binary patch literal 1487 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Ea{HEjtmUzPnffIy<}iu zkSuYHC<)F_D=AMbN@Z|N$xljE@XSq2PYp^qvOMM@p#3 z|Go9bk6$DxJHJW_TeI6^!?suKD;K=zX1laaQHevaYe9gA_muhD?7kWv;ZK^qNx&_4 z!NNzoRF7^toi+c;dhd0tN&k|=XQ!3T`gpc_d-1#3-_wqjCYNsBTk!nM-uHW}>zqXl=#X;tH~+qZ8=#Qqe0 zyY_kEre7v;`8lCB414ds-NMh7wm$y&kMEN=TuO1g)#fO+dKTl^=gq5xh1=NXpD%cp zk?0z_#A~+h_DdVyn4GZ{o;I_|^M3TCR$EQp{roGh$la@3EqQnDd#`EjZpTGAw|;pU zbmrd|<9+|0S^ufbZ~vwD?)c*$)-zi?S4U4<;P;H{@4q&$u~*N@dAgmP zqBSY5@r+PFv55Sd4+=boCYRkhQ+SJqIq&xVIg3{C#~S! zH6Kqrzi+GYE3oPKr%y&z)zzvT+k1O@7VQ6DY!m(S%))Cy@;{0bf`3F$f6+0MScyyxarHZon5`}Xb3Vde)17CtdJ zu)M)G?(5UtC+Avg2ThwgH8C;KvFti$e~n~n)3@d`@&#Nm$7j!+dGNr21NF~a+$}ku zK7Cs0SMl&ryUP3j_6)CHy)rO0Rh?T`)77mkmX?;jS6_BwvE@VMZRWG2QgtF?VqEL>QTT{Ah}Gi=CkVsqj;oO!BYli-JsjU7JWqUxQ2 zyj}&GJ4-(^YC5?pzPWd|anZ|u`Guc^6czPN&dteT^mkiq=oQBlX`ATf!Moq_`b)M` z{&Ob$&a`J?n>=~;|C2WTXC@|x-aWoU>9P&mq3oiIn;oqpe*OKorp-mG^V+nqJ@@Z+ zPSj`n7-GRAzc)d^%f8gve1&l?o9?R%$Gz_A%y_fNFm>OO3k$kVF8}TE>!JCJ=vA5( zy^jhw+xG8i*~fqHu;s2(j|UF7!Uds$j4INW&@*Qfq#L*_>ub{vE z%^mA|ZrgM=tysc&q9yJB*;PS_$rJpK3UlTNzMc3;AnM#+&ui=jpP%ve^u>qnx%B2# z`1F)mi6!ltzaHpaYaJ`IWM)C?lxXQmLTo2q+BTc+G&*&q?Tp^uUXL9T zj$VI-x0rqZ{C2KaT<(dr|2O-y%zq!Sg5%(#q#v4(6B*_lmu{S}Wa{b7_1QAQK0y<_ zmah2WF-fI$qlM5%jigSAY5Div!rveNdGzJvoc|mK3~5}GB)+g4u4Q0gVDNPHb6Mw< G&;$Sy1IHf# literal 0 HcmV?d00001 diff --git a/project/res/drawable/dpad.png b/project/res/drawable/dpad.png new file mode 100644 index 0000000000000000000000000000000000000000..38f369f55a18accb1a0eda3f3db1903ab7863f40 GIT binary patch literal 11703 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 AjQ{`u literal 0 HcmV?d00001 diff --git a/project/res/drawable/keyboard.png b/project/res/drawable/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..62d2358c37bbdfcad539c48a8d88a132121c27ce GIT binary patch literal 1872 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Ea{HEjtmUzPnffIy<}iu zkSuYHC<)F_D=AMbN@Z|N$xljE@XSq2PYp^p0-_)G6Td115B#iB0`+0t2A z2FBLeyUx$gUa@7lma{?G?`@fxnFmi5&00{&k#Uy4MuTmU$&|1pmy_KKb>~S0x}8qH zbvbGBckQ}m?_VES5Tdilh3{(4s-u_H{Xe|=_BM;R;oZA+GgpW2zyI(1;^QA4$!+>+ zGtZ{h%gy!(2ao)#i3cle{NC#pcD=Y*vUfvM4RB^UJqRio5tD4Ar z+o<${!n9UNg=1UxX#KM36f(5jZs70mI3wf6rZDEyFHQdadCeb{c%a5dS>xThp~ooI#e2V zl`}m3-7zt|NaDVaHKT{xWRGK$9@$o(Zr@y({KERw=3_2X+ z&2GB**#UEu!;`_LYFri3%0)5>V78mvZPOs{{{9_^A@-) zT*SQ3axV8#rcXbc_WU~XDT?8k3unC26StiP6BzAO=Ek{2yR)C0XRAGL6Q9amjw5^7 zCtDPJXkbV>rlJzCNV$)@eNlwgB9D3ET&!LvgG3ohR&9E^8mkpkNS-krBX1O^Q zbxj$1Ntc)P{&@8%bx-k=4w-YuZW_#woyzzv>cSmb zr=yIoGJ1qIcbXNvGQ2A*`_{}kW`DYb%v0Xyw^wYUCO&jh)b~5GLS?h! z$<&qhUf)i(9NC^OJHgUH`}hp?rMGrm;f_sR#piIdS8U_5Ef+tvPB0T+**PVk=Td0j z_bE$OEq}XWS#G(|vK`EBE8kkJF1tI~G2CqNjqbe@_<8;~MCG68Jz*+pEq%lCz_&V4 z+wAL8PASiNK5Ih4q9ikWbN8vmjx#P^xuxy8!-{{x^4G$iHxI;me-_xJ_p(X2%fr$= zg1OG+VOG{b-_uV;o~g6#^^i0)wCnr%(^B)|9L`Y52j6y2O*54`*6~KE*WbHhnwQ`V zrcEU9c!k zc!q(N)wcB+XME1j$p5|W&v*aL|DUdZT+b@OAouhd`|A&q4Gatn44$rjF6*2UngFVB BlPCZH literal 0 HcmV?d00001