├── .gitattributes ├── .gitignore ├── README.md ├── app ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── aidl │ └── com │ │ └── android │ │ └── internal │ │ └── telephony │ │ └── ITelephony.aidl │ ├── assets │ ├── bb_key_1_2 │ │ ├── alt_hw.json │ │ ├── english_hw.json │ │ ├── keyboard_mechanics.json │ │ ├── russian_hw.json │ │ ├── russian_translit_hw.json │ │ └── ukraine_hw.json │ ├── js_patches │ │ ├── keyboard_core.lp700.js │ │ ├── keyboard_mechanics.ctrl_acxvz_with_nav_key.js │ │ ├── keyboard_mechanics.ctrl_lang_switch.js │ │ ├── keyboard_mechanics.del_double_tripple_for_blind.js │ │ ├── keyboard_mechanics.double_tap_sensor_disable.js │ │ ├── keyboard_mechanics.key0_lang_switch_disable.js │ │ ├── keyboard_mechanics.nav_with_appswith.js │ │ ├── keyboard_mechanics.shift_enter_disable.js │ │ ├── keyboard_mechanics.test.letter_exception_action.js │ │ ├── keyonekb2_as_options.test.ctrl_q.js │ │ ├── online.editor.js.json.txt │ │ ├── plugin_data.test.del_plugin.js │ │ ├── unihertz_keyboard_mechanics.ctrl_acxvz_with_nav_key.js │ │ └── unihertz_keyboard_mechanics.nav_with_appswith.js │ ├── keyboard_core.json │ ├── keyboard_layouts.json │ ├── keyonekb2_as_options.json │ ├── plugin_data.json │ ├── uhtz_slim_pocket │ │ ├── pocket_alt_hw.json │ │ ├── pocket_english_hw.json │ │ ├── pocket_russian_hw.json │ │ ├── titan_slim_alt_hw.json │ │ ├── titan_slim_english_hw.json │ │ ├── titan_slim_estonian_hw.json │ │ ├── titan_slim_latvian_hw.json │ │ ├── titan_slim_russian_hw.json │ │ ├── titan_slim_russian_key2_hw.json │ │ ├── titan_slim_russian_kika_hw.json │ │ ├── titan_slim_russian_translit2_hw.json │ │ ├── titan_slim_russian_translit_hw.json │ │ └── unihertz_keyboard_mechanics.json │ └── uhtz_titan │ │ ├── titan_alt_hw.json │ │ ├── titan_english_hw.json │ │ ├── titan_keyboard_mechanics.json │ │ ├── titan_russian_kika_hw.json │ │ ├── titan_russian_translit2_hw.json │ │ ├── titan_russian_translit_hw.json │ │ ├── titan_russian_zynaps_hw.json │ │ ├── titan_ukranian_kika_hw.json │ │ └── titan_ukranian_zynaps_hw.json │ ├── java │ └── com │ │ ├── google │ │ └── android │ │ │ └── voiceime │ │ │ ├── ActivityHelper.java │ │ │ ├── ITrigger.java │ │ │ ├── ImeTrigger.java │ │ │ ├── IntentApiTrigger.java │ │ │ ├── ServiceBridge.java │ │ │ ├── ServiceHelper.java │ │ │ └── VoiceRecognitionTrigger.java │ │ └── sateda │ │ └── keyonekb2 │ │ ├── ActivityKeyboardTest.java │ │ ├── ActivityMain.java │ │ ├── ActivitySettings.java │ │ ├── ActivitySettingsMore.java │ │ ├── FileJsonUtils.java │ │ ├── InputMethodServiceCoreCustomizable.java │ │ ├── InputMethodServiceCoreGesture.java │ │ ├── InputMethodServiceCoreKeyPress.java │ │ ├── IntentNotifications.java │ │ ├── IntentQuickSettings.java │ │ ├── KeyboardLayout.java │ │ ├── KeyboardLayoutManager.java │ │ ├── KeyoneIME.java │ │ ├── KeyoneKb2AccessibilityService.java │ │ ├── KeyoneKb2Settings.java │ │ ├── NotificationProcessor.java │ │ ├── SatedaKeyboard.java │ │ ├── SearchClickPlugin.java │ │ ├── ViewPopupScreenKeyboard.java │ │ ├── ViewSatedaKeyboard.java │ │ └── input │ │ └── CallStateCallback.java │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable-xhdpi │ ├── ic_backspace_white_24dp.png │ ├── ic_eng_shift_all.png │ ├── ic_eng_shift_first.png │ ├── ic_eng_small.png │ ├── ic_est_shift_all.png │ ├── ic_est_shift_first.png │ ├── ic_est_small.png │ ├── ic_kb.png │ ├── ic_kb_alt.png │ ├── ic_kb_alt_all.png │ ├── ic_kb_alt_one.png │ ├── ic_kb_digits.png │ ├── ic_kb_nav.png │ ├── ic_kb_nav_fn.png │ ├── ic_kb_sym.png │ ├── ic_kb_sym_all.png │ ├── ic_kb_sym_one.png │ ├── ic_keyboard_return_white_24dp.png │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── ic_lv_shift_all.png │ ├── ic_lv_shift_first.png │ ├── ic_lv_small.png │ ├── ic_rus_shift_all.png │ ├── ic_rus_shift_first.png │ ├── ic_rus_small.png │ ├── ic_ukr_shift_all.png │ ├── ic_ukr_shift_first.png │ └── ic_ukr_small.png │ ├── drawable │ ├── ic_flag_eesti_col.xml │ ├── ic_flag_gb_col.xml │ ├── ic_flag_latvija_col.xml │ ├── ic_flag_russia_col.xml │ ├── ic_flag_ukraine_col.xml │ ├── ic_launcher_background.xml │ ├── key_background.xml │ ├── normal.xml │ └── pressed.xml │ ├── layout │ ├── activity_keyboard_test.xml │ ├── activity_main.xml │ ├── activity_more_settings.xml │ ├── activity_settings.xml │ ├── developer_settings.xml │ ├── key_preview.xml │ ├── keyboard.xml │ └── keyboard_popup_layout.xml │ ├── mipmap-hdpi │ ├── ic_backspace_white_24dp.png │ ├── ic_eng_shift_all.png │ ├── ic_eng_shift_first.png │ ├── ic_eng_small.png │ ├── ic_est_shift_all.png │ ├── ic_est_shift_first.png │ ├── ic_est_small.png │ ├── ic_gesture_icon_input.png │ ├── ic_gesture_icon_input_up_down.png │ ├── ic_gesture_icon_off.png │ ├── ic_gesture_icon_pointer.png │ ├── ic_gesture_icon_view.png │ ├── ic_kb_alt.png │ ├── ic_kb_alt_one.png │ ├── ic_kb_digits.png │ ├── ic_kb_nav.png │ ├── ic_kb_nav_fn.png │ ├── ic_kb_sym.png │ ├── ic_kb_sym_one.png │ ├── ic_keyboard_return_white_24dp.png │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── ic_lv_shift_all.png │ ├── ic_lv_shift_first.png │ ├── ic_lv_small.png │ ├── ic_rus_shift_all.png │ ├── ic_rus_shift_first.png │ ├── ic_rus_small.png │ ├── ic_ukr_shift_all.png │ ├── ic_ukr_shift_first.png │ └── ic_ukr_small.png │ ├── mipmap-xhdpi │ ├── ic_backspace_white_24dp.png │ ├── ic_keyboard_return_white_24dp.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_backspace_white_24dp.png │ ├── ic_keyboard_return_white_24dp.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_backspace_white_24dp.png │ ├── ic_down_arrow_white.png │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── ic_left_arrow_white.png │ ├── ic_right_arrow_white.png │ └── ic_up_arrow_white.png │ ├── raw │ └── scan_code_key_code.json │ ├── values-night │ └── themes.xml │ ├── values-ru │ └── strings.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── themes.xml │ └── xml │ ├── keyonekb_accessibility_service_config.xml │ ├── keyonekb_input_method.xml │ ├── navigation.xml │ ├── pocket_symbol.xml │ ├── space_empty.xml │ └── symbol.xml ├── build.gradle ├── design ├── ic_eng_shift_all.psd ├── ic_eng_shift_first.psd ├── ic_eng_small.psd ├── ic_est_shift_all.psd ├── ic_est_shift_first.psd ├── ic_est_small.psd ├── ic_gesture_icon.psd ├── ic_kb.psd ├── ic_kb_alt.psd ├── ic_kb_alt_all.psd ├── ic_kb_alt_one.psd ├── ic_kb_digits.psd ├── ic_kb_nav.psd ├── ic_kb_nav_fn.psd ├── ic_kb_sym.psd ├── ic_kb_sym_all.psd ├── ic_kb_sym_one.psd ├── ic_launcher.psd ├── ic_lv_shift_all.psd ├── ic_lv_shift_first.psd ├── ic_lv_small.psd ├── ic_rus_shift_all.psd ├── ic_rus_shift_first.psd ├── ic_rus_small.psd ├── ic_ukr_shift_all.psd ├── ic_ukr_shift_first.psd └── ic_ukr_small.psd ├── doc ├── release_2_4.txt ├── release_2_5.txt ├── release_2_6.txt ├── release_2_7.txt └── schema │ ├── alt_hw.schema.json │ ├── hw.schema.json │ ├── keyboard_core.schema.json │ ├── keyboard_layouts.schema.json │ ├── keyboard_mechanics.schema.json │ ├── keyonekb2_as_options.schema.json │ └── plugin_data.schema.json ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | /build/ 17 | /.gradle/ 18 | /.idea/ 19 | /app/build/ 20 | /app/release/ 21 | /app/debug/ 22 | /release/ 23 | /debug/ 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KeyoneKB2 2 | 3 | #### 4 INTERNATIONAL USE 4 | ### KeyoneKB2 hardware keyboard is translation and customization READY and can be easily adopted by community to other languages and keyboard layouts 5 | 6 | KeyoneKb2 кастомная хардварная клавиатура для Blackberry KEY1 и KEY2 (в том числе НЕ_РСТ) (Android 7/8.1+), а также Unihertz Titan Pocket и Slim (кроме жестов по клавиатуре в режиме ввода текста). 7 | Наиболее современных устройств (относительно конечно) с одновременно самой удобной «железной» клавиатурой (относительно конечно). И то, и другое компримис, но за неимением большего как говорится.. 8 | 9 | Клавиатура претендует на то, чтобы быть удобнее, чем (очень хорошая) клавиатура Blackberry Keyboard, чтобы у разработчиков RIM (где бы они сейчас не работали) ушки горели. 10 | 11 | Клавиатура ОТ фанатов ввода на хардварной клаве и ДЛЯ фанатов ввода на харварной клаве. Для тех кто не может смириться с тыканьем в стекляшку с постоянными ошибками; с отсутствием ctrl+cxvz, хоткеев, сочетаний клавиш и пр. И ради этого готов мириться с небольшим экраном, поганой камерой и не самым мощным «железом». Ну или просто ностальгирует :) 12 | 13 | Мы попытались привнести новый, более удобный (даже в сравнении с «родной» Blackberry Keyboard) пользовательский опыт в работу на «железной» клаве. Да-да, это кому-то еще интересно. 14 | 15 | Цель — сделать удобство работы с текстом таким, чтобы не надо было убирать руки с клавиатуры и гладить стекло. Для этого широко применяются разного рода перемещения по тексту и жесты по клавиатуре. 16 | 17 | Уделяли немалое внимание работе одной рукой, что, например, затруднено в родной «клаве» и каком-нибудь rukeyboard из-за смены языка двумя руками. Ну и куча прочих других удосбств. 18 | 19 | По архитектуре программного кода клавиатура сделана весьма расширяемо и настраиваемо, и может быть адаптирована для других устройств и языков. Но придется приложить руку. 20 | 21 | # Инструкция на wiki 22 | https://github.com/tim-ecoder/KeyoneKB/wiki#%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F 23 | 24 | # БЛАГОДАРНОСТИ 25 | * Основатель: Артем Твердохлеб aka l3n1n-ua (UA) 26 | * Соавтор: krab-ubica (RUS) 27 | * Соавтор: Henry2005 aka CapitanNemo (BY) 28 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | } 4 | 5 | 6 | 7 | android { 8 | signingConfigs { 9 | debug { 10 | storeFile file('d:\\Programming\\keystores\\keystore2.jks') 11 | storePassword 'qwerty' 12 | keyAlias 'key0' 13 | keyPassword 'qwerty' 14 | } 15 | release { 16 | storeFile file('d:\\Programming\\keystores\\keystore2.jks') 17 | storePassword 'qwerty' 18 | keyAlias 'key0' 19 | keyPassword 'qwerty' 20 | } 21 | } 22 | 23 | lintOptions { 24 | disable 'ExpiredTargetSdkVersion' 25 | } 26 | 27 | compileSdkVersion 28 28 | 29 | defaultConfig { 30 | applicationId "com.sateda.keyonekb2" 31 | minSdkVersion 27 32 | targetSdkVersion 27 33 | //TODO: ---- Меняем versionCode, versionName каждый публичный выкат даже для тестеров ---- 34 | // В номере билда build X.Y X<10 Y<10 35 | // иначе versionCode станет пятизначным, возврат потом к 4 знакам потребует сносить приложение т.к. ОС не дает откатывать 36 | versionCode 2607 37 | versionName "v2.7b46-jsp5-osk4-ts1-cp1-tgh1-sp1-ckp5-cc1-nm2-sel1-uht7" 38 | //TODO: ---------------------------- 39 | 40 | /** 41 | * На этапе разработки, чтобы видеть между билдами какие функции менялись 42 | * -RC6-sr6-ckp11v22-gm23-sp12-nm22 43 | * 44 | * RC6 - Release candidate 45 | * 46 | * sr6 - Speech recognition 47 | * ckp - Core key press 48 | * cc - Core customizable 49 | * gm - Gesture movement 50 | * sp - Search plugins 51 | * nm - Navigation mode 52 | * jsp - javascript patching 53 | * uhsp - unihertz slim|pocket api >=28 54 | * osk - on-screen-keyboard 55 | * tgh - telegram hack 56 | * ts - toast 57 | * uht - unihertz titan (big) 58 | */ 59 | 60 | //testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 61 | signingConfig signingConfigs.debug 62 | } 63 | applicationVariants.all { variant -> 64 | variant.outputs.all { 65 | //outputFileName = "KeyoneKB2-${variant.name}-${variant.versionName}.apk" 66 | outputFileName = "KeyoneKB2-${variant.versionName}.apk" 67 | } 68 | } 69 | 70 | buildTypes { 71 | debug { 72 | signingConfig signingConfigs.debug 73 | debuggable true 74 | } 75 | release { 76 | signingConfig signingConfigs.release 77 | debuggable false 78 | minifyEnabled true 79 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 80 | } 81 | } 82 | 83 | compileOptions { 84 | sourceCompatibility JavaVersion.VERSION_1_8 85 | targetCompatibility JavaVersion.VERSION_1_8 86 | } 87 | 88 | //TODO: Иначе release версия не собирается 89 | lintOptions { 90 | abortOnError false 91 | } 92 | 93 | } 94 | 95 | dependencies { 96 | 97 | implementation 'com.android.support:appcompat-v7:25.4.0' 98 | //implementation 'com.android.support.constraint:constraint-layout:1.1.0' 99 | implementation 'com.google.code.gson:gson:2.8.7' 100 | implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0' 101 | implementation 'com.pes.materialcolorpicker:library:1.2.5' 102 | //implementation 'com.arakelian:java-jq:1.3.0' 103 | //implementation 'org.webjars:lodash:4.17.15' 104 | //compile 'com.eclipsesource.j2v8:j2v8:6.2.1@aar' 105 | //implementation 'com.github.LiquidPlayer:LiquidCore:0.6.2' 106 | implementation 'com.faendir.rhino:rhino-android:1.6.0' 107 | 108 | 109 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | 23 | # This will strip `Log.v`, `Log.d`, and `Log.i` statements and will leave `Log.w` and `Log.e` statements intact. 24 | 25 | -assumenosideeffects class android.util.Log { 26 | public static boolean isLoggable(java.lang.String, int); 27 | public static int v(...); 28 | public static int d(...); 29 | public static int i(...); 30 | } 31 | 32 | 33 | #TODO: Переделать исключение конкретно для этого случая, чтобы остальное все-таки зачищать в релизе 34 | #-dontshrink 35 | 36 | #Без этого вырезает XmlBlock$Parser 37 | -dontwarn org.xmlpull.v1.** 38 | -dontnote org.xmlpull.v1.** 39 | -dontwarn android.content.res.** 40 | -dontnote android.content.res.** 41 | -keep class org.xmlpull.** { *; } 42 | -keep class com.android.internal.telephony.** { *; } 43 | -keep class com.sateda.keyonekb2.KeyboardLayout { *; } 44 | -keep class com.sateda.keyonekb2.KeyboardLayout$* { *; } 45 | -keep class com.sateda.keyonekb2.SearchClickPlugin$SearchClickPluginData { *; } 46 | -keep class com.sateda.keyonekb2.SearchClickPlugin$SearchClickPluginData$* { *; } 47 | -keep class com.sateda.keyonekb2.KeyoneKb2Settings$CoreKeyboardSettings { *; } 48 | -keep class com.sateda.keyonekb2.InputMethodServiceCoreCustomizable$KeyboardMechanics { *; } 49 | -keep class com.sateda.keyonekb2.InputMethodServiceCoreCustomizable$KeyboardMechanics$* { *; } 50 | -keep class com.sateda.keyonekb2.KeyoneKb2AccessibilityService$KeyoneKb2AccServiceOptions { *; } 51 | -keep class com.sateda.keyonekb2.KeyoneKb2AccessibilityService$KeyoneKb2AccServiceOptions$* { *; } 52 | -keep class org.mozilla.javascript.** { *; } -------------------------------------------------------------------------------- /app/src/main/aidl/com/android/internal/telephony/ITelephony.aidl: -------------------------------------------------------------------------------- 1 | // ITelephony.aidl 2 | package com.android.internal.telephony; 3 | 4 | // Declare any non-default types here with import statements 5 | 6 | interface ITelephony { 7 | 8 | boolean endCall(); 9 | 10 | void answerRingingCall(); 11 | 12 | void silenceRinger(); 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/assets/bb_key_1_2/alt_hw.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "key-code" : "KEYCODE_Q", 3 | "single-press-alt-shift-mode" : "~", 4 | "single-press-alt-mode" : "#", 5 | "alt-more-variants" : "№" 6 | }, { 7 | "key-code" : "KEYCODE_W", 8 | "single-press-alt-shift-mode" : "ˋ", 9 | "single-press-alt-mode" : "1", 10 | "alt-more-variants" : "º" 11 | }, { 12 | "key-code" : "KEYCODE_E", 13 | "single-press-alt-shift-mode" : "{", 14 | "single-press-alt-mode" : "2", 15 | "alt-more-variants" : "[" 16 | }, { 17 | "key-code" : "KEYCODE_R", 18 | "single-press-alt-shift-mode" : "}", 19 | "single-press-alt-mode" : "3", 20 | "alt-more-variants" : "]" 21 | }, { 22 | "key-code" : "KEYCODE_T", 23 | "single-press-alt-shift-mode" : "[", 24 | "single-press-alt-mode" : "(", 25 | "alt-more-variants" : "←<{[" 26 | }, { 27 | "key-code" : "KEYCODE_Y", 28 | "single-press-alt-shift-mode" : "]", 29 | "single-press-alt-mode" : ")", 30 | "alt-more-variants" : "→>}]" 31 | }, { 32 | "key-code" : "KEYCODE_U", 33 | "single-press-alt-shift-mode" : "<", 34 | "single-press-alt-mode" : "_", 35 | "alt-more-variants" : "—←" 36 | }, { 37 | "key-code" : "KEYCODE_I", 38 | "single-press-alt-shift-mode" : ">", 39 | "single-press-alt-mode" : "-", 40 | "alt-more-variants" : "—→" 41 | }, { 42 | "key-code" : "KEYCODE_O", 43 | "single-press-alt-shift-mode" : "^", 44 | "single-press-alt-mode" : "+", 45 | "alt-more-variants" : "↑" 46 | }, { 47 | "key-code" : "KEYCODE_P", 48 | "single-press-alt-shift-mode" : "%", 49 | "single-press-alt-mode" : "@" 50 | }, { 51 | "key-code" : "KEYCODE_A", 52 | "single-press-alt-shift-mode" : "=", 53 | "single-press-alt-mode" : "*", 54 | "alt-more-variants" : "≠" 55 | }, { 56 | "key-code" : "KEYCODE_S", 57 | "single-press-alt-shift-mode" : "÷", 58 | "single-press-alt-mode" : "4" 59 | }, { 60 | "key-code" : "KEYCODE_D", 61 | "single-press-alt-shift-mode" : "±", 62 | "single-press-alt-mode" : "5" 63 | }, { 64 | "key-code" : "KEYCODE_F", 65 | "single-press-alt-shift-mode" : "•", 66 | "single-press-alt-mode" : "6" 67 | }, { 68 | "key-code" : "KEYCODE_G", 69 | "single-press-alt-shift-mode" : "\\", 70 | "single-press-alt-mode" : "/" 71 | }, { 72 | "key-code" : "KEYCODE_H", 73 | "single-press-alt-shift-mode" : "|", 74 | "single-press-alt-mode" : ":" 75 | }, { 76 | "key-code" : "KEYCODE_J", 77 | "single-press-alt-shift-mode" : "&", 78 | "single-press-alt-mode" : ";" 79 | }, { 80 | "key-code" : "KEYCODE_K", 81 | "single-press-alt-shift-mode" : "©", 82 | "single-press-alt-mode" : "'", 83 | "alt-more-variants" : "º" 84 | }, { 85 | "key-code" : "KEYCODE_L", 86 | "single-press-alt-shift-mode" : "˽", 87 | "single-press-alt-mode" : "\"" 88 | }, { 89 | "key-code" : "KEYCODE_Z", 90 | "single-press-alt-shift-mode" : "«", 91 | "single-press-alt-mode" : "7" 92 | }, { 93 | "key-code" : "KEYCODE_X", 94 | "single-press-alt-shift-mode" : "»", 95 | "single-press-alt-mode" : "8" 96 | }, { 97 | "key-code" : "KEYCODE_C", 98 | "single-press-alt-shift-mode" : "™", 99 | "single-press-alt-mode" : "9" 100 | }, { 101 | "key-code" : "KEYCODE_V", 102 | "single-press-alt-shift-mode" : "¿", 103 | "single-press-alt-mode" : "?", 104 | "alt-more-variants" : "↓" 105 | }, { 106 | "key-code" : "KEYCODE_B", 107 | "single-press-alt-shift-mode" : "¡", 108 | "single-press-alt-mode" : "!" 109 | }, { 110 | "key-code" : "KEYCODE_N", 111 | "single-press-alt-shift-mode" : "Ʃ", 112 | "single-press-alt-mode" : "," 113 | }, { 114 | "key-code" : "KEYCODE_M", 115 | "single-press-alt-shift-mode" : "§", 116 | "single-press-alt-mode" : "." 117 | }, { 118 | "key-code" : "KEYCODE_4", 119 | "single-press-alt-shift-mode" : "€", 120 | "single-press-alt-mode" : "$", 121 | "alt-more-variants" : "₽₴₩£₪¥$€" 122 | }, { 123 | "key-code" : "KEYCODE_0", 124 | "single-press-alt-shift-mode" : "0", 125 | "single-press-alt-mode" : "0" 126 | } ] -------------------------------------------------------------------------------- /app/src/main/assets/bb_key_1_2/english_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "English", 3 | "alt-mode-layout" : "bb_key_1_2/alt_hw", 4 | "sym-mode-layout" : "symbol", 5 | "key-mapping" : [ { 6 | "key-code" : "KEYCODE_4", 7 | "single-press" : "$", 8 | "single-press-shift-mode" : "$" 9 | }, { 10 | "key-code" : "KEYCODE_Q", 11 | "single-press" : "q", 12 | "single-press-shift-mode" : "Q" 13 | }, { 14 | "key-code" : "KEYCODE_W", 15 | "single-press" : "w", 16 | "single-press-shift-mode" : "W" 17 | }, { 18 | "key-code" : "KEYCODE_E", 19 | "single-press" : "e", 20 | "single-press-shift-mode" : "E" 21 | }, { 22 | "key-code" : "KEYCODE_R", 23 | "single-press" : "r", 24 | "single-press-shift-mode" : "R" 25 | }, { 26 | "key-code" : "KEYCODE_T", 27 | "single-press" : "t", 28 | "single-press-shift-mode" : "T" 29 | }, { 30 | "key-code" : "KEYCODE_Y", 31 | "single-press" : "y", 32 | "single-press-shift-mode" : "Y" 33 | }, { 34 | "key-code" : "KEYCODE_U", 35 | "single-press" : "u", 36 | "single-press-shift-mode" : "U" 37 | }, { 38 | "key-code" : "KEYCODE_I", 39 | "single-press" : "i", 40 | "single-press-shift-mode" : "I" 41 | }, { 42 | "key-code" : "KEYCODE_O", 43 | "single-press" : "o", 44 | "single-press-shift-mode" : "O" 45 | }, { 46 | "key-code" : "KEYCODE_P", 47 | "single-press" : "p", 48 | "single-press-shift-mode" : "P" 49 | }, { 50 | "key-code" : "KEYCODE_A", 51 | "single-press" : "a", 52 | "single-press-shift-mode" : "A" 53 | }, { 54 | "key-code" : "KEYCODE_S", 55 | "single-press" : "s", 56 | "single-press-shift-mode" : "S" 57 | }, { 58 | "key-code" : "KEYCODE_D", 59 | "single-press" : "d", 60 | "single-press-shift-mode" : "D" 61 | }, { 62 | "key-code" : "KEYCODE_F", 63 | "single-press" : "f", 64 | "single-press-shift-mode" : "F" 65 | }, { 66 | "key-code" : "KEYCODE_G", 67 | "single-press" : "g", 68 | "single-press-shift-mode" : "G" 69 | }, { 70 | "key-code" : "KEYCODE_H", 71 | "single-press" : "h", 72 | "single-press-shift-mode" : "H" 73 | }, { 74 | "key-code" : "KEYCODE_J", 75 | "single-press" : "j", 76 | "single-press-shift-mode" : "J" 77 | }, { 78 | "key-code" : "KEYCODE_K", 79 | "single-press" : "k", 80 | "single-press-shift-mode" : "K" 81 | }, { 82 | "key-code" : "KEYCODE_L", 83 | "single-press" : "l", 84 | "single-press-shift-mode" : "L" 85 | }, { 86 | "key-code" : "KEYCODE_Z", 87 | "single-press" : "z", 88 | "single-press-shift-mode" : "Z" 89 | }, { 90 | "key-code" : "KEYCODE_X", 91 | "single-press" : "x", 92 | "single-press-shift-mode" : "X" 93 | }, { 94 | "key-code" : "KEYCODE_C", 95 | "single-press" : "c", 96 | "single-press-shift-mode" : "C" 97 | }, { 98 | "key-code" : "KEYCODE_V", 99 | "single-press" : "v", 100 | "single-press-shift-mode" : "V" 101 | }, { 102 | "key-code" : "KEYCODE_B", 103 | "single-press" : "b", 104 | "single-press-shift-mode" : "B" 105 | }, { 106 | "key-code" : "KEYCODE_N", 107 | "single-press" : "n", 108 | "single-press-shift-mode" : "N" 109 | }, { 110 | "key-code" : "KEYCODE_M", 111 | "single-press" : "m", 112 | "single-press-shift-mode" : "M" 113 | }, { 114 | "key-code" : "KEYCODE_0", 115 | "single-press" : "0", 116 | "single-press-shift-mode" : "0" 117 | } ] 118 | } -------------------------------------------------------------------------------- /app/src/main/assets/bb_key_1_2/russian_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "bb_key_1_2/alt_hw", 4 | "sym-mode-layout" : "symbol", 5 | "key-mapping" : [ { 6 | "key-code" : "KEYCODE_4", 7 | "single-press" : "б", 8 | "single-press-shift-mode" : "Б", 9 | "double-press" : "ю", 10 | "double-press-shift-mode" : "Ю" 11 | }, { 12 | "key-code" : "KEYCODE_Q", 13 | "single-press" : "й", 14 | "single-press-shift-mode" : "Й", 15 | "double-press" : "ë", 16 | "double-press-shift-mode" : "Ë" 17 | }, { 18 | "key-code" : "KEYCODE_W", 19 | "single-press" : "ц", 20 | "single-press-shift-mode" : "Ц" 21 | }, { 22 | "key-code" : "KEYCODE_E", 23 | "single-press" : "у", 24 | "single-press-shift-mode" : "У" 25 | }, { 26 | "key-code" : "KEYCODE_R", 27 | "single-press" : "к", 28 | "single-press-shift-mode" : "К" 29 | }, { 30 | "key-code" : "KEYCODE_T", 31 | "single-press" : "е", 32 | "single-press-shift-mode" : "Е" 33 | }, { 34 | "key-code" : "KEYCODE_Y", 35 | "single-press" : "н", 36 | "single-press-shift-mode" : "Н" 37 | }, { 38 | "key-code" : "KEYCODE_U", 39 | "single-press" : "г", 40 | "single-press-shift-mode" : "Г" 41 | }, { 42 | "key-code" : "KEYCODE_I", 43 | "single-press" : "ш", 44 | "single-press-shift-mode" : "Ш" 45 | }, { 46 | "key-code" : "KEYCODE_O", 47 | "single-press" : "з", 48 | "single-press-shift-mode" : "З", 49 | "double-press" : "щ", 50 | "double-press-shift-mode" : "Щ" 51 | }, { 52 | "key-code" : "KEYCODE_P", 53 | "single-press" : "х", 54 | "single-press-shift-mode" : "Х", 55 | "double-press" : "э", 56 | "double-press-shift-mode" : "Э" 57 | }, { 58 | "key-code" : "KEYCODE_A", 59 | "single-press" : "ф", 60 | "single-press-shift-mode" : "Ф" 61 | }, { 62 | "key-code" : "KEYCODE_S", 63 | "single-press" : "ы", 64 | "single-press-shift-mode" : "Ы" 65 | }, { 66 | "key-code" : "KEYCODE_D", 67 | "single-press" : "в", 68 | "single-press-shift-mode" : "В" 69 | }, { 70 | "key-code" : "KEYCODE_F", 71 | "single-press" : "а", 72 | "single-press-shift-mode" : "А" 73 | }, { 74 | "key-code" : "KEYCODE_G", 75 | "single-press" : "п", 76 | "single-press-shift-mode" : "П" 77 | }, { 78 | "key-code" : "KEYCODE_H", 79 | "single-press" : "р", 80 | "single-press-shift-mode" : "Р" 81 | }, { 82 | "key-code" : "KEYCODE_J", 83 | "single-press" : "о", 84 | "single-press-shift-mode" : "О" 85 | }, { 86 | "key-code" : "KEYCODE_K", 87 | "single-press" : "л", 88 | "single-press-shift-mode" : "Л" 89 | }, { 90 | "key-code" : "KEYCODE_L", 91 | "single-press" : "д", 92 | "single-press-shift-mode" : "Д", 93 | "double-press" : "ж", 94 | "double-press-shift-mode" : "Ж" 95 | }, { 96 | "key-code" : "KEYCODE_Z", 97 | "single-press" : "я", 98 | "single-press-shift-mode" : "Я" 99 | }, { 100 | "key-code" : "KEYCODE_X", 101 | "single-press" : "ч", 102 | "single-press-shift-mode" : "Ч" 103 | }, { 104 | "key-code" : "KEYCODE_C", 105 | "single-press" : "с", 106 | "single-press-shift-mode" : "С" 107 | }, { 108 | "key-code" : "KEYCODE_V", 109 | "single-press" : "м", 110 | "single-press-shift-mode" : "М" 111 | }, { 112 | "key-code" : "KEYCODE_B", 113 | "single-press" : "и", 114 | "single-press-shift-mode" : "И" 115 | }, { 116 | "key-code" : "KEYCODE_N", 117 | "single-press" : "т", 118 | "single-press-shift-mode" : "Т" 119 | }, { 120 | "key-code" : "KEYCODE_M", 121 | "single-press" : "ь", 122 | "single-press-shift-mode" : "Ь", 123 | "double-press" : "ъ", 124 | "double-press-shift-mode" : "Ъ" 125 | }, { 126 | "key-code" : "KEYCODE_0", 127 | "single-press" : "0", 128 | "single-press-shift-mode" : "0" 129 | } ] 130 | } -------------------------------------------------------------------------------- /app/src/main/assets/bb_key_1_2/russian_translit_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "bb_key_1_2/alt_hw", 4 | "sym-mode-layout" : "symbol", 5 | "key-mapping" : [ { 6 | "key-code" : "KEYCODE_4", 7 | "single-press" : "ь", 8 | "single-press-shift-mode" : "Ь", 9 | "double-press" : "ъ", 10 | "double-press-shift-mode" : "Ъ" 11 | }, { 12 | "key-code" : "KEYCODE_Q", 13 | "single-press" : "я", 14 | "single-press-shift-mode" : "Я" 15 | }, { 16 | "key-code" : "KEYCODE_W", 17 | "single-press" : "ш", 18 | "single-press-shift-mode" : "Ш", 19 | "double-press" : "щ", 20 | "double-press-shift-mode" : "Щ" 21 | }, { 22 | "key-code" : "KEYCODE_E", 23 | "single-press" : "е", 24 | "single-press-shift-mode" : "Е", 25 | "double-press" : "э", 26 | "double-press-shift-mode" : "Э" 27 | }, { 28 | "key-code" : "KEYCODE_R", 29 | "single-press" : "р", 30 | "single-press-shift-mode" : "Р" 31 | }, { 32 | "key-code" : "KEYCODE_T", 33 | "single-press" : "т", 34 | "single-press-shift-mode" : "Т" 35 | }, { 36 | "key-code" : "KEYCODE_Y", 37 | "single-press" : "ы", 38 | "single-press-shift-mode" : "Ы" 39 | }, { 40 | "key-code" : "KEYCODE_U", 41 | "single-press" : "у", 42 | "single-press-shift-mode" : "У", 43 | "double-press" : "ю", 44 | "double-press-shift-mode" : "Ю" 45 | }, { 46 | "key-code" : "KEYCODE_I", 47 | "single-press" : "и", 48 | "single-press-shift-mode" : "И" 49 | }, { 50 | "key-code" : "KEYCODE_O", 51 | "single-press" : "о", 52 | "single-press-shift-mode" : "О" 53 | }, { 54 | "key-code" : "KEYCODE_P", 55 | "single-press" : "п", 56 | "single-press-shift-mode" : "П" 57 | }, { 58 | "key-code" : "KEYCODE_A", 59 | "single-press" : "а", 60 | "single-press-shift-mode" : "А" 61 | }, { 62 | "key-code" : "KEYCODE_S", 63 | "single-press" : "с", 64 | "single-press-shift-mode" : "С" 65 | }, { 66 | "key-code" : "KEYCODE_D", 67 | "single-press" : "д", 68 | "single-press-shift-mode" : "Д" 69 | }, { 70 | "key-code" : "KEYCODE_F", 71 | "single-press" : "ф", 72 | "single-press-shift-mode" : "Ф" 73 | }, { 74 | "key-code" : "KEYCODE_G", 75 | "single-press" : "г", 76 | "single-press-shift-mode" : "Г" 77 | }, { 78 | "key-code" : "KEYCODE_H", 79 | "single-press" : "ч", 80 | "single-press-shift-mode" : "Ч" 81 | }, { 82 | "key-code" : "KEYCODE_J", 83 | "single-press" : "й", 84 | "single-press-shift-mode" : "Й", 85 | "double-press" : "ë", 86 | "double-press-shift-mode" : "Ë" 87 | }, { 88 | "key-code" : "KEYCODE_K", 89 | "single-press" : "к", 90 | "single-press-shift-mode" : "К" 91 | }, { 92 | "key-code" : "KEYCODE_L", 93 | "single-press" : "л", 94 | "single-press-shift-mode" : "Л" 95 | }, { 96 | "key-code" : "KEYCODE_Z", 97 | "single-press" : "ж", 98 | "single-press-shift-mode" : "Ж", 99 | "double-press" : "з", 100 | "double-press-shift-mode" : "З" 101 | }, { 102 | "key-code" : "KEYCODE_X", 103 | "single-press" : "х", 104 | "single-press-shift-mode" : "Х" 105 | }, { 106 | "key-code" : "KEYCODE_C", 107 | "single-press" : "ц", 108 | "single-press-shift-mode" : "Ц" 109 | }, { 110 | "key-code" : "KEYCODE_V", 111 | "single-press" : "в", 112 | "single-press-shift-mode" : "В" 113 | }, { 114 | "key-code" : "KEYCODE_B", 115 | "single-press" : "б", 116 | "single-press-shift-mode" : "Б" 117 | }, { 118 | "key-code" : "KEYCODE_N", 119 | "single-press" : "н", 120 | "single-press-shift-mode" : "Н" 121 | }, { 122 | "key-code" : "KEYCODE_M", 123 | "single-press" : "м", 124 | "single-press-shift-mode" : "М" 125 | }, { 126 | "key-code" : "KEYCODE_0", 127 | "single-press" : "0", 128 | "single-press-shift-mode" : "0" 129 | } ] 130 | } -------------------------------------------------------------------------------- /app/src/main/assets/bb_key_1_2/ukraine_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Українська", 3 | "alt-mode-layout" : "bb_key_1_2/alt_hw", 4 | "sym-mode-layout" : "symbol", 5 | "key-mapping" : [ { 6 | "key-code" : "KEYCODE_4", 7 | "single-press" : "б", 8 | "single-press-shift-mode" : "Б", 9 | "double-press" : "ю", 10 | "double-press-shift-mode" : "Ю" 11 | }, { 12 | "key-code" : "KEYCODE_Q", 13 | "single-press" : "й", 14 | "single-press-shift-mode" : "Й" 15 | }, { 16 | "key-code" : "KEYCODE_W", 17 | "single-press" : "ц", 18 | "single-press-shift-mode" : "Ц" 19 | }, { 20 | "key-code" : "KEYCODE_E", 21 | "single-press" : "у", 22 | "single-press-shift-mode" : "У" 23 | }, { 24 | "key-code" : "KEYCODE_R", 25 | "single-press" : "к", 26 | "single-press-shift-mode" : "К" 27 | }, { 28 | "key-code" : "KEYCODE_T", 29 | "single-press" : "е", 30 | "single-press-shift-mode" : "Е" 31 | }, { 32 | "key-code" : "KEYCODE_Y", 33 | "single-press" : "н", 34 | "single-press-shift-mode" : "Н" 35 | }, { 36 | "key-code" : "KEYCODE_U", 37 | "single-press" : "г", 38 | "single-press-shift-mode" : "Г" 39 | }, { 40 | "key-code" : "KEYCODE_I", 41 | "single-press" : "ш", 42 | "single-press-shift-mode" : "Ш" 43 | }, { 44 | "key-code" : "KEYCODE_O", 45 | "single-press" : "з", 46 | "single-press-shift-mode" : "З", 47 | "double-press" : "щ", 48 | "double-press-shift-mode" : "Щ" 49 | }, { 50 | "key-code" : "KEYCODE_P", 51 | "single-press" : "х", 52 | "single-press-shift-mode" : "Х", 53 | "double-press" : "є", 54 | "double-press-shift-mode" : "Є" 55 | }, { 56 | "key-code" : "KEYCODE_A", 57 | "single-press" : "ф", 58 | "single-press-shift-mode" : "Ф" 59 | }, { 60 | "key-code" : "KEYCODE_S", 61 | "single-press" : "і", 62 | "single-press-shift-mode" : "І", 63 | "double-press" : "ї", 64 | "double-press-shift-mode" : "Ї" 65 | }, { 66 | "key-code" : "KEYCODE_D", 67 | "single-press" : "в", 68 | "single-press-shift-mode" : "В" 69 | }, { 70 | "key-code" : "KEYCODE_F", 71 | "single-press" : "а", 72 | "single-press-shift-mode" : "А" 73 | }, { 74 | "key-code" : "KEYCODE_G", 75 | "single-press" : "п", 76 | "single-press-shift-mode" : "П" 77 | }, { 78 | "key-code" : "KEYCODE_H", 79 | "single-press" : "р", 80 | "single-press-shift-mode" : "Р" 81 | }, { 82 | "key-code" : "KEYCODE_J", 83 | "single-press" : "о", 84 | "single-press-shift-mode" : "О" 85 | }, { 86 | "key-code" : "KEYCODE_K", 87 | "single-press" : "л", 88 | "single-press-shift-mode" : "Л" 89 | }, { 90 | "key-code" : "KEYCODE_L", 91 | "single-press" : "д", 92 | "single-press-shift-mode" : "Д", 93 | "double-press" : "ж", 94 | "double-press-shift-mode" : "Ж" 95 | }, { 96 | "key-code" : "KEYCODE_Z", 97 | "single-press" : "я", 98 | "single-press-shift-mode" : "Я" 99 | }, { 100 | "key-code" : "KEYCODE_X", 101 | "single-press" : "ч", 102 | "single-press-shift-mode" : "Ч" 103 | }, { 104 | "key-code" : "KEYCODE_C", 105 | "single-press" : "с", 106 | "single-press-shift-mode" : "С" 107 | }, { 108 | "key-code" : "KEYCODE_V", 109 | "single-press" : "м", 110 | "single-press-shift-mode" : "М" 111 | }, { 112 | "key-code" : "KEYCODE_B", 113 | "single-press" : "и", 114 | "single-press-shift-mode" : "И" 115 | }, { 116 | "key-code" : "KEYCODE_N", 117 | "single-press" : "т", 118 | "single-press-shift-mode" : "Т" 119 | }, { 120 | "key-code" : "KEYCODE_M", 121 | "single-press" : "ь", 122 | "single-press-shift-mode" : "Ь", 123 | "double-press" : "'" 124 | }, { 125 | "key-code" : "KEYCODE_0", 126 | "single-press" : "0", 127 | "single-press-shift-mode" : "0" 128 | } ] 129 | } -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_core.lp700.js: -------------------------------------------------------------------------------- 1 | json["time-long-press"]=700; -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_mechanics.ctrl_acxvz_with_nav_key.js: -------------------------------------------------------------------------------- 1 | //Чтобы команды CTRL+ACXVZ работали в NAV режиме (и в постоянном и при удержании) 2 | 3 | let nav_kgp = json["nav-key-group-processors"]; 4 | 5 | nav_kgp.push( 6 | { 7 | "key-codes": [ 8 | "KEYCODE_A" 9 | ], 10 | "on-short-press": [ 11 | { 12 | "action-method-name": "ActionSendCtrlPlusKey", 13 | "method-needs-key-press-parameter": true, 14 | "stop-processing-at-success-result": true 15 | } 16 | ] 17 | }, 18 | { 19 | "key-codes": [ 20 | "KEYCODE_C" 21 | ], 22 | "on-short-press": [ 23 | { 24 | "action-method-name": "ActionSendCtrlPlusKey", 25 | "method-needs-key-press-parameter": true, 26 | "stop-processing-at-success-result": true 27 | } 28 | ] 29 | }, { 30 | "key-codes": [ 31 | "KEYCODE_X" 32 | ], 33 | "on-short-press": [ 34 | { 35 | "action-method-name": "ActionSendCtrlPlusKey", 36 | "method-needs-key-press-parameter": true, 37 | "stop-processing-at-success-result": true 38 | } 39 | ] 40 | }, 41 | { 42 | "key-codes": [ 43 | "KEYCODE_V" 44 | ], 45 | "on-short-press": [ 46 | { 47 | "action-method-name": "ActionSendCtrlPlusKey", 48 | "method-needs-key-press-parameter": true, 49 | "stop-processing-at-success-result": true 50 | } 51 | ] 52 | }, 53 | { 54 | "key-codes": [ 55 | "KEYCODE_Z" 56 | ], 57 | "on-short-press": [ 58 | { 59 | "action-method-name": "ActionSendCtrlPlusKey", 60 | "method-needs-key-press-parameter": true, 61 | "stop-processing-at-success-result": true 62 | } 63 | ] 64 | } 65 | ); 66 | 67 | -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_mechanics.ctrl_lang_switch.js: -------------------------------------------------------------------------------- 1 | //Добавляем смену раскладки на ctrl 2 | 3 | let kc_ctrl = json["key-group-processors"] 4 | .find(kgp => kgp["key-codes"] 5 | .find(kc => kc === "KEYCODE_CTRL_RIGHT") 6 | ); 7 | 8 | 9 | kc_ctrl["on-short-press"].unshift({ 10 | "action-method-name": "ActionChangeKeyboardLayout", 11 | "need-update-visual-state": true 12 | }); 13 | 14 | kc_ctrl["on-undo-short-press"] = [ 15 | { 16 | "action-method-name": "ActionChangeBackKeyboardLayout", 17 | "need-update-visual-state": true 18 | } 19 | ]; 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_mechanics.del_double_tripple_for_blind.js: -------------------------------------------------------------------------------- 1 | //Для случая когда надо добавить функции on-double-press и пр. для DEL 2 | 3 | let kc_del = json["key-group-processors"] 4 | .find(kgp => kgp["key-codes"] 5 | .find(kc => kc === "KEYCODE_DEL") 6 | ); 7 | kc_del["on-double-press"] = [ 8 | 9 | { 10 | "action-method-name": "ActionDeletePrevWord", 11 | 12 | "stop-processing-at-success-result": true 13 | }, { 14 | "meta-mode-method-names": [ 15 | "MetaIsShiftPressed" 16 | ], 17 | "action-method-name": "ActionDeleteFwdWord", 18 | "stop-processing-at-success-result": true 19 | } 20 | ]; 21 | kc_del["on-long-press"] = [ 22 | { 23 | "meta-mode-method-names": [ 24 | "MetaIsShiftPressed" 25 | ], 26 | "action-method-name": "ActionDeleteUntilFwdCrLf", 27 | "stop-processing-at-success-result": true 28 | }, 29 | { 30 | "action-method-name": "ActionDeleteUntilPrevCrLf", 31 | "stop-processing-at-success-result": true 32 | } 33 | ]; 34 | kc_del["on-triple-press"] = [ 35 | { 36 | "meta-mode-method-names": [ 37 | "MetaIsShiftPressed" 38 | ], 39 | "action-method-name": "ActionDeleteUntilFwdCrLf", 40 | "stop-processing-at-success-result": true 41 | }, 42 | { 43 | "action-method-name": "ActionDeleteUntilPrevCrLf", 44 | "stop-processing-at-success-result": true 45 | } 46 | ]; 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_mechanics.double_tap_sensor_disable.js: -------------------------------------------------------------------------------- 1 | json["gesture-processor"]["on-gesture-double-click"].find(v => v["action-method-name"] === "ActionTryChangeGestureModeStateAtInputMode")["action-method-name"] = "ActionDoNothing"; 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_mechanics.key0_lang_switch_disable.js: -------------------------------------------------------------------------------- 1 | //Отключение смены раскладки на key0 2 | 3 | let kc_key0 = json["key-group-processors"] 4 | .find(kgp => kgp["key-codes"] 5 | .find(kc => kc === "KEYCODE_0") 6 | ); 7 | 8 | kc_key0["on-short-press"] = kc_key0["on-short-press"].filter((a) => a["action-method-name"] !== "ActionChangeKeyboardLayout"); 9 | kc_key0["on-undo-short-press"] = null; -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_mechanics.nav_with_appswith.js: -------------------------------------------------------------------------------- 1 | // NAV режим управляется через кнопку APP_SWITCH (ее функция по переключению приложений отключается) 2 | 3 | let nav_kgp = json["key-group-processors"] 4 | .find(kgp => kgp["key-codes"] 5 | .find(kc => kc === "KEYCODE_SYM")); 6 | 7 | nav_kgp["key-codes"].push("KEYCODE_APP_SWITCH"); -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_mechanics.shift_enter_disable.js: -------------------------------------------------------------------------------- 1 | // Для случая когда надо удалить одно из действий 2 | 3 | let enter_osp = json["key-group-processors"] 4 | .find(kgp => kgp["key-codes"] 5 | .find(kc => kc === "KEYCODE_ENTER")) 6 | ["on-short-press"]; 7 | 8 | enter_osp.splice( 9 | enter_osp.findIndex( 10 | act => act["meta-mode-method-names"] 11 | && act["meta-mode-method-names"] 12 | .find (mmmn => mmmn === "MetaIsShiftPressed")), 13 | 1); 14 | -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyboard_mechanics.test.letter_exception_action.js: -------------------------------------------------------------------------------- 1 | //Проверка как работает навешивание действия на одну из группы букв. Тогда как вся группа букв в базовом механикс определена все вместе. 2 | 3 | json["key-group-processors"].unshift( { 4 | "key-codes": [ 5 | "KEYCODE_Q" 6 | ], 7 | "on-short-press": [ 8 | { 9 | "meta-mode-method-names": [ 10 | "MetaIsCtrlPressed" 11 | ], 12 | "action-method-name": "ActionMoveCursorPrevWord", 13 | "method-needs-key-event-parameter": true, 14 | "stop-processing-at-success-result": true 15 | } 16 | ] 17 | }); -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/keyonekb2_as_options.test.ctrl_q.js: -------------------------------------------------------------------------------- 1 | // Добавление CTRL+Q на кастомное действие 2 | // Работает вместе с mechanics.js4 3 | json["retranslate-keyboard-meta-key-plus-key-list"].push( { 4 | "meta-key-code": "META_FUNCTION_ON", 5 | "key-key-code": "KEYCODE_Q" 6 | }); -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/online.editor.js.json.txt: -------------------------------------------------------------------------------- 1 | https://jsoneditoronline.org/#left=local.zavoxa&right=local.zibupo -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/plugin_data.test.del_plugin.js: -------------------------------------------------------------------------------- 1 | //Для случая когда надо удалить лишний плагин 2 | json["search-plugins"] = json["search-plugins"].filter((val) => val["package-name"] !== "ru.yandex.yandexmaps1"); -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/unihertz_keyboard_mechanics.ctrl_acxvz_with_nav_key.js: -------------------------------------------------------------------------------- 1 | //Чтобы команды CTRL+ACXVZ работали в NAV режиме (и в постоянном и при удержании) 2 | 3 | let nav_kgp = json["nav-key-group-processors"]; 4 | 5 | nav_kgp.push( 6 | { 7 | "key-codes": [ 8 | "KEYCODE_A" 9 | ], 10 | "on-short-press": [ 11 | { 12 | "action-method-name": "ActionSendCtrlPlusKey", 13 | "method-needs-key-press-parameter": true, 14 | "stop-processing-at-success-result": true 15 | } 16 | ] 17 | }, 18 | { 19 | "key-codes": [ 20 | "KEYCODE_C" 21 | ], 22 | "on-short-press": [ 23 | { 24 | "action-method-name": "ActionSendCtrlPlusKey", 25 | "method-needs-key-press-parameter": true, 26 | "stop-processing-at-success-result": true 27 | } 28 | ] 29 | }, { 30 | "key-codes": [ 31 | "KEYCODE_X" 32 | ], 33 | "on-short-press": [ 34 | { 35 | "action-method-name": "ActionSendCtrlPlusKey", 36 | "method-needs-key-press-parameter": true, 37 | "stop-processing-at-success-result": true 38 | } 39 | ] 40 | }, 41 | { 42 | "key-codes": [ 43 | "KEYCODE_V" 44 | ], 45 | "on-short-press": [ 46 | { 47 | "action-method-name": "ActionSendCtrlPlusKey", 48 | "method-needs-key-press-parameter": true, 49 | "stop-processing-at-success-result": true 50 | } 51 | ] 52 | }, 53 | { 54 | "key-codes": [ 55 | "KEYCODE_Z" 56 | ], 57 | "on-short-press": [ 58 | { 59 | "action-method-name": "ActionSendCtrlPlusKey", 60 | "method-needs-key-press-parameter": true, 61 | "stop-processing-at-success-result": true 62 | } 63 | ] 64 | } 65 | ); 66 | 67 | -------------------------------------------------------------------------------- /app/src/main/assets/js_patches/unihertz_keyboard_mechanics.nav_with_appswith.js: -------------------------------------------------------------------------------- 1 | // NAV режим управляется через кнопку APP_SWITCH (ее функция по переключению приложений отключается) 2 | 3 | let nav_kgp = json["key-group-processors"] 4 | .find(kgp => kgp["key-codes"] 5 | .find(kc => kc === "KEYCODE_SYM")); 6 | 7 | nav_kgp["key-codes"].push("KEYCODE_APP_SWITCH"); -------------------------------------------------------------------------------- /app/src/main/assets/keyboard_core.json: -------------------------------------------------------------------------------- 1 | { 2 | "time-short-press" : 175, 3 | "time-double-press" : 225, 4 | "time-triple-press" : 275, 5 | "time-long-press" : 600, 6 | "time-long-after-short-press" : 600, 7 | "time-wait-gesture-upon-key0-hold" : 1000, 8 | "gesture-finger-press-radius" : 45, 9 | "gesture-motion-base-sensitivity" : 53, 10 | "gesture-row4-begin-y" : 415, 11 | "gesture-row1-begin-y" : 25, 12 | "time-vibrate" : 30 13 | } -------------------------------------------------------------------------------- /app/src/main/assets/keyonekb2_as_options.json: -------------------------------------------------------------------------------- 1 | { 2 | "search-plugins-enabled": true, 3 | "retranslate-keyboard-key-codes": [ 4 | "KEYCODE_FUNCTION", 5 | "KEYCODE_HOME", 6 | "KEYCODE_APP_SWITCH" 7 | ], 8 | "retranslate-keyboard-meta-key-plus-key-list": [ 9 | { 10 | "meta-key-code": "META_FUNCTION_ON", 11 | "key-key-code": "KEYCODE_A" 12 | }, { 13 | "meta-key-code": "META_FUNCTION_ON", 14 | "key-key-code": "KEYCODE_C" 15 | }, { 16 | "meta-key-code": "META_FUNCTION_ON", 17 | "key-key-code": "KEYCODE_V" 18 | }, { 19 | "meta-key-code": "META_FUNCTION_ON", 20 | "key-key-code": "KEYCODE_X" 21 | }, { 22 | "meta-key-code": "META_FUNCTION_ON", 23 | "key-key-code": "KEYCODE_Z" 24 | } 25 | ], 26 | "digits-pad-plugin-enabled" : true, 27 | "digits-pad-plugin-app-markers" : [ 28 | { 29 | "package-name" : "com.android.dialer", 30 | "digits-pad-marker-node-id" : "com.android.dialer:id/dialpad_view" 31 | }, { 32 | "package-name" : "com.tct.calculator.bb" 33 | }, { 34 | "package-name" : "com.hb.dialer.free", 35 | "digits-pad-marker-node-id" : "com.hb.dialer.free:id/dialpad_frame" 36 | } 37 | ], 38 | "selected-node-click-hack" : true, 39 | "selected-node-highlight" : true 40 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/pocket_alt_hw.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "key-code" : "KEYCODE_Q", 3 | "single-press-alt-shift-mode" : "~", 4 | "single-press-alt-mode" : "0" 5 | }, { 6 | "key-code" : "KEYCODE_W", 7 | "single-press-alt-shift-mode" : "ˋ", 8 | "single-press-alt-mode" : "1" 9 | }, { 10 | "key-code" : "KEYCODE_E", 11 | "single-press-alt-shift-mode" : "{", 12 | "single-press-alt-mode" : "2" 13 | }, { 14 | "key-code" : "KEYCODE_R", 15 | "single-press-alt-shift-mode" : "}", 16 | "single-press-alt-mode" : "3" 17 | }, { 18 | "key-code" : "KEYCODE_T", 19 | "single-press-alt-shift-mode" : "[", 20 | "single-press-alt-mode" : "(", 21 | "alt-more-variants" : "{[(<«" 22 | }, { 23 | "key-code" : "KEYCODE_Y", 24 | "single-press-alt-shift-mode" : "]", 25 | "single-press-alt-mode" : ")", 26 | "alt-more-variants" : "}])>»" 27 | }, { 28 | "key-code" : "KEYCODE_U", 29 | "single-press-alt-shift-mode" : "<", 30 | "single-press-alt-mode" : "_" 31 | }, { 32 | "key-code" : "KEYCODE_I", 33 | "single-press-alt-shift-mode" : ">", 34 | "single-press-alt-mode" : "-" 35 | }, { 36 | "key-code" : "KEYCODE_O", 37 | "single-press-alt-shift-mode" : "^", 38 | "single-press-alt-mode" : "/", 39 | "alt-more-variants" : "→←↓↑" 40 | }, { 41 | "key-code" : "KEYCODE_P", 42 | "single-press-alt-shift-mode" : "%", 43 | "single-press-alt-mode" : ":" 44 | }, { 45 | "key-code" : "KEYCODE_A", 46 | "single-press-alt-shift-mode" : "=", 47 | "single-press-alt-mode" : "@" 48 | }, { 49 | "key-code" : "KEYCODE_S", 50 | "single-press-alt-shift-mode" : "÷", 51 | "single-press-alt-mode" : "4" 52 | }, { 53 | "key-code" : "KEYCODE_D", 54 | "single-press-alt-shift-mode" : "±", 55 | "single-press-alt-mode" : "5" 56 | }, { 57 | "key-code" : "KEYCODE_F", 58 | "single-press-alt-shift-mode" : "•", 59 | "single-press-alt-mode" : "6" 60 | }, { 61 | "key-code" : "KEYCODE_G", 62 | "single-press-alt-shift-mode" : "\\", 63 | "single-press-alt-mode" : "*" 64 | }, { 65 | "key-code" : "KEYCODE_H", 66 | "single-press-alt-shift-mode" : "|", 67 | "single-press-alt-mode" : "#" 68 | }, { 69 | "key-code" : "KEYCODE_J", 70 | "single-press-alt-shift-mode" : "&", 71 | "single-press-alt-mode" : "+", 72 | "alt-more-variants" : "+±" 73 | }, { 74 | "key-code" : "KEYCODE_K", 75 | "single-press-alt-shift-mode" : "©", 76 | "single-press-alt-mode" : "\"" 77 | }, { 78 | "key-code" : "KEYCODE_L", 79 | "single-press-alt-shift-mode" : "˽", 80 | "single-press-alt-mode" : "'" 81 | }, { 82 | "key-code" : "KEYCODE_Z", 83 | "single-press-alt-shift-mode" : "«", 84 | "single-press-alt-mode" : "!" 85 | }, { 86 | "key-code" : "KEYCODE_X", 87 | "single-press-alt-shift-mode" : "»", 88 | "single-press-alt-mode" : "7" 89 | }, { 90 | "key-code" : "KEYCODE_C", 91 | "single-press-alt-shift-mode" : "™", 92 | "single-press-alt-mode" : "8" 93 | }, { 94 | "key-code" : "KEYCODE_V", 95 | "single-press-alt-shift-mode" : "¿", 96 | "single-press-alt-mode" : "9", 97 | "alt-more-variants" : "¿?" 98 | }, { 99 | "key-code" : "KEYCODE_B", 100 | "single-press-alt-shift-mode" : "¡", 101 | "single-press-alt-mode" : "." 102 | }, { 103 | "key-code" : "KEYCODE_N", 104 | "single-press-alt-shift-mode" : "Ʃ", 105 | "single-press-alt-mode" : "," 106 | }, { 107 | "key-code" : "KEYCODE_M", 108 | "single-press-alt-shift-mode" : "§", 109 | "single-press-alt-mode" : "?" 110 | }, { 111 | "key-code" : "KEYCODE_4", 112 | "single-press-alt-shift-mode" : "€", 113 | "single-press-alt-mode" : "$", 114 | "alt-more-variants" : "₽₴₩£₪¥$€" 115 | } ] -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/pocket_english_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "English", 3 | "alt-mode-layout" : "pocket_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ { 6 | "key-code" : "KEYCODE_4", 7 | "single-press" : "$", 8 | "single-press-shift-mode" : "€" 9 | }, { 10 | "key-code" : "KEYCODE_Q", 11 | "single-press" : "q", 12 | "single-press-shift-mode" : "Q" 13 | }, { 14 | "key-code" : "KEYCODE_W", 15 | "single-press" : "w", 16 | "single-press-shift-mode" : "W" 17 | }, { 18 | "key-code" : "KEYCODE_E", 19 | "single-press" : "e", 20 | "single-press-shift-mode" : "E" 21 | }, { 22 | "key-code" : "KEYCODE_R", 23 | "single-press" : "r", 24 | "single-press-shift-mode" : "R" 25 | }, { 26 | "key-code" : "KEYCODE_T", 27 | "single-press" : "t", 28 | "single-press-shift-mode" : "T" 29 | }, { 30 | "key-code" : "KEYCODE_Y", 31 | "single-press" : "y", 32 | "single-press-shift-mode" : "Y" 33 | }, { 34 | "key-code" : "KEYCODE_U", 35 | "single-press" : "u", 36 | "single-press-shift-mode" : "U" 37 | }, { 38 | "key-code" : "KEYCODE_I", 39 | "single-press" : "i", 40 | "single-press-shift-mode" : "I" 41 | }, { 42 | "key-code" : "KEYCODE_O", 43 | "single-press" : "o", 44 | "single-press-shift-mode" : "O" 45 | }, { 46 | "key-code" : "KEYCODE_P", 47 | "single-press" : "p", 48 | "single-press-shift-mode" : "P" 49 | }, { 50 | "key-code" : "KEYCODE_A", 51 | "single-press" : "a", 52 | "single-press-shift-mode" : "A" 53 | }, { 54 | "key-code" : "KEYCODE_S", 55 | "single-press" : "s", 56 | "single-press-shift-mode" : "S" 57 | }, { 58 | "key-code" : "KEYCODE_D", 59 | "single-press" : "d", 60 | "single-press-shift-mode" : "D" 61 | }, { 62 | "key-code" : "KEYCODE_F", 63 | "single-press" : "f", 64 | "single-press-shift-mode" : "F" 65 | }, { 66 | "key-code" : "KEYCODE_G", 67 | "single-press" : "g", 68 | "single-press-shift-mode" : "G" 69 | }, { 70 | "key-code" : "KEYCODE_H", 71 | "single-press" : "h", 72 | "single-press-shift-mode" : "H" 73 | }, { 74 | "key-code" : "KEYCODE_J", 75 | "single-press" : "j", 76 | "single-press-shift-mode" : "J" 77 | }, { 78 | "key-code" : "KEYCODE_K", 79 | "single-press" : "k", 80 | "single-press-shift-mode" : "K" 81 | }, { 82 | "key-code" : "KEYCODE_L", 83 | "single-press" : "l", 84 | "single-press-shift-mode" : "L" 85 | }, { 86 | "key-code" : "KEYCODE_Z", 87 | "single-press" : "z", 88 | "single-press-shift-mode" : "Z" 89 | }, { 90 | "key-code" : "KEYCODE_X", 91 | "single-press" : "x", 92 | "single-press-shift-mode" : "X" 93 | }, { 94 | "key-code" : "KEYCODE_C", 95 | "single-press" : "c", 96 | "single-press-shift-mode" : "C" 97 | }, { 98 | "key-code" : "KEYCODE_V", 99 | "single-press" : "v", 100 | "single-press-shift-mode" : "V" 101 | }, { 102 | "key-code" : "KEYCODE_B", 103 | "single-press" : "b", 104 | "single-press-shift-mode" : "B" 105 | }, { 106 | "key-code" : "KEYCODE_N", 107 | "single-press" : "n", 108 | "single-press-shift-mode" : "N" 109 | }, { 110 | "key-code" : "KEYCODE_M", 111 | "single-press" : "m", 112 | "single-press-shift-mode" : "M" 113 | } ] 114 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/pocket_russian_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "pocket_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | { 7 | "key-code" : "KEYCODE_Q", 8 | "single-press" : "й", 9 | "single-press-shift-mode" : "Й", 10 | "double-press" : "ц", 11 | "double-press-shift-mode" : "Ц" 12 | }, { 13 | "key-code" : "KEYCODE_W", 14 | "single-press" : "у", 15 | "single-press-shift-mode" : "У" 16 | }, { 17 | "key-code" : "KEYCODE_E", 18 | "single-press" : "к", 19 | "single-press-shift-mode" : "К" 20 | }, { 21 | "key-code" : "KEYCODE_R", 22 | "single-press" : "е", 23 | "single-press-shift-mode" : "Е", 24 | "double-press" : "ë", 25 | "double-press-shift-mode" : "Ë" 26 | }, { 27 | "key-code" : "KEYCODE_T", 28 | "single-press" : "н", 29 | "single-press-shift-mode" : "Н" 30 | }, { 31 | "key-code" : "KEYCODE_Y", 32 | "single-press" : "г", 33 | "single-press-shift-mode" : "Г" 34 | }, { 35 | "key-code" : "KEYCODE_U", 36 | "single-press" : "ш", 37 | "single-press-shift-mode" : "Ш", 38 | "double-press" : "щ", 39 | "double-press-shift-mode" : "Щ" 40 | }, { 41 | "key-code" : "KEYCODE_I", 42 | "single-press" : "з", 43 | "single-press-shift-mode" : "З" 44 | }, { 45 | "key-code" : "KEYCODE_O", 46 | "single-press" : "х", 47 | "single-press-shift-mode" : "Х", 48 | "double-press" : "ъ", 49 | "double-press-shift-mode" : "Ъ" 50 | }, { 51 | "key-code" : "KEYCODE_P", 52 | "single-press" : "ю", 53 | "single-press-shift-mode" : "Ю" 54 | }, { 55 | "key-code" : "KEYCODE_A", 56 | "single-press" : "ф", 57 | "single-press-shift-mode" : "Ф", 58 | "double-press" : "ы", 59 | "double-press-shift-mode" : "Ы" 60 | }, { 61 | "key-code" : "KEYCODE_S", 62 | "single-press" : "в", 63 | "single-press-shift-mode" : "В" 64 | }, { 65 | "key-code" : "KEYCODE_D", 66 | "single-press" : "а", 67 | "single-press-shift-mode" : "А" 68 | }, { 69 | "key-code" : "KEYCODE_F", 70 | "single-press" : "п", 71 | "single-press-shift-mode" : "П" 72 | }, { 73 | "key-code" : "KEYCODE_G", 74 | "single-press" : "р", 75 | "single-press-shift-mode" : "Р" 76 | }, { 77 | "key-code" : "KEYCODE_H", 78 | "single-press" : "о", 79 | "single-press-shift-mode" : "О" 80 | }, { 81 | "key-code" : "KEYCODE_J", 82 | "single-press" : "л", 83 | "single-press-shift-mode" : "Л" 84 | }, { 85 | "key-code" : "KEYCODE_K", 86 | "single-press" : "д", 87 | "single-press-shift-mode" : "Д" 88 | }, { 89 | "key-code" : "KEYCODE_L", 90 | "single-press" : "ж", 91 | "single-press-shift-mode" : "Ж", 92 | "double-press" : "э", 93 | "double-press-shift-mode" : "Э" 94 | }, { 95 | "key-code" : "KEYCODE_Z", 96 | "single-press" : "я", 97 | "single-press-shift-mode" : "Я", 98 | "double-press" : "ч", 99 | "double-press-shift-mode" : "Ч" 100 | }, { 101 | "key-code" : "KEYCODE_X", 102 | "single-press" : "с", 103 | "single-press-shift-mode" : "С" 104 | }, { 105 | "key-code" : "KEYCODE_C", 106 | "single-press" : "м", 107 | "single-press-shift-mode" : "М" 108 | }, { 109 | "key-code" : "KEYCODE_V", 110 | "single-press" : "и", 111 | "single-press-shift-mode" : "И" 112 | }, { 113 | "key-code" : "KEYCODE_B", 114 | "single-press" : "т", 115 | "single-press-shift-mode" : "Т" 116 | }, { 117 | "key-code" : "KEYCODE_N", 118 | "single-press" : "ь", 119 | "single-press-shift-mode" : "Ь" 120 | }, { 121 | "key-code" : "KEYCODE_M", 122 | "single-press" : "б", 123 | "single-press-shift-mode" : "Б" 124 | } ] 125 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_alt_hw.json: -------------------------------------------------------------------------------- 1 | [ 2 | 3 | 4 | { 5 | "key-code" : "KEYCODE_Q", 6 | "single-press-alt-shift-mode" : "~", 7 | "single-press-alt-mode" : "0" 8 | }, { 9 | "key-code" : "KEYCODE_W", 10 | "single-press-alt-shift-mode" : "ˋ", 11 | "single-press-alt-mode" : "1" 12 | }, { 13 | "key-code" : "KEYCODE_E", 14 | "single-press-alt-shift-mode" : "{", 15 | "single-press-alt-mode" : "2" 16 | }, { 17 | "key-code" : "KEYCODE_R", 18 | "single-press-alt-shift-mode" : "}", 19 | "single-press-alt-mode" : "3", 20 | "alt-more-variants" : "®" 21 | }, { 22 | "key-code" : "KEYCODE_T", 23 | "single-press-alt-shift-mode" : "[", 24 | "single-press-alt-mode" : "(", 25 | "alt-more-variants" : "{[(<«" 26 | }, { 27 | "key-code" : "KEYCODE_Y", 28 | "single-press-alt-shift-mode" : "]", 29 | "single-press-alt-mode" : ")", 30 | "alt-more-variants" : "}])>»" 31 | }, { 32 | "key-code" : "KEYCODE_U", 33 | "single-press-alt-shift-mode" : "<", 34 | "single-press-alt-mode" : "-", 35 | "alt-more-variants" : "–—" 36 | }, { 37 | "key-code" : "KEYCODE_I", 38 | "single-press-alt-shift-mode" : ">", 39 | "single-press-alt-mode" : "_" 40 | }, { 41 | "key-code" : "KEYCODE_O", 42 | "single-press-alt-shift-mode" : "^", 43 | "single-press-alt-mode" : "/", 44 | "alt-more-variants" : "\\↑↓←→" 45 | }, { 46 | "key-code" : "KEYCODE_P", 47 | "single-press-alt-shift-mode" : "%", 48 | "single-press-alt-mode" : ":" 49 | }, 50 | 51 | 52 | { 53 | "key-code" : "KEYCODE_A", 54 | "single-press-alt-shift-mode" : "=", 55 | "single-press-alt-mode" : "@" 56 | }, { 57 | "key-code" : "KEYCODE_S", 58 | "single-press-alt-shift-mode" : "÷", 59 | "single-press-alt-mode" : "4", 60 | "alt-more-variants" : "$€₽₴₩£₪¥" 61 | }, { 62 | "key-code" : "KEYCODE_D", 63 | "single-press-alt-shift-mode" : "±", 64 | "single-press-alt-mode" : "5" 65 | }, { 66 | "key-code" : "KEYCODE_F", 67 | "single-press-alt-shift-mode" : "•", 68 | "single-press-alt-mode" : "6" 69 | }, { 70 | "key-code" : "KEYCODE_G", 71 | "single-press-alt-shift-mode" : "\\", 72 | "single-press-alt-mode" : "*" 73 | }, { 74 | "key-code" : "KEYCODE_H", 75 | "single-press-alt-shift-mode" : "|", 76 | "single-press-alt-mode" : "#" 77 | }, { 78 | "key-code" : "KEYCODE_J", 79 | "single-press-alt-shift-mode" : "&", 80 | "single-press-alt-mode" : "+", 81 | "alt-more-variants" : "±" 82 | }, { 83 | "key-code" : "KEYCODE_K", 84 | "single-press-alt-shift-mode" : "∞", 85 | "single-press-alt-mode" : "\"" 86 | }, { 87 | "key-code" : "KEYCODE_L", 88 | "single-press-alt-shift-mode" : "˽", 89 | "single-press-alt-mode" : "'" 90 | }, 91 | 92 | 93 | { 94 | "key-code" : "KEYCODE_Z", 95 | "single-press-alt-shift-mode" : "«", 96 | "single-press-alt-mode" : "!", 97 | "alt-more-variants" : "¡" 98 | }, { 99 | "key-code" : "KEYCODE_X", 100 | "single-press-alt-shift-mode" : "»", 101 | "single-press-alt-mode" : "7" 102 | }, { 103 | "key-code" : "KEYCODE_C", 104 | "single-press-alt-shift-mode" : "©", 105 | "single-press-alt-mode" : "8", 106 | "alt-more-variants" : "™" 107 | }, { 108 | "key-code" : "KEYCODE_V", 109 | "single-press-alt-shift-mode" : "¿", 110 | "single-press-alt-mode" : "9" 111 | }, { 112 | "key-code" : "KEYCODE_B", 113 | "single-press-alt-shift-mode" : "¡", 114 | "single-press-alt-mode" : "." 115 | }, { 116 | "key-code" : "KEYCODE_N", 117 | "single-press-alt-shift-mode" : "Ʃ", 118 | "single-press-alt-mode" : "," 119 | }, { 120 | "key-code" : "KEYCODE_M", 121 | "single-press-alt-shift-mode" : "§", 122 | "single-press-alt-mode" : "?", 123 | "alt-more-variants" : "¿" 124 | }, { 125 | "key-code" : "KEYCODE_4", 126 | "single-press-alt-shift-mode" : "€", 127 | "single-press-alt-mode" : "$", 128 | "alt-more-variants" : "₽₴₩£₪¥$€" 129 | } 130 | 131 | 132 | ] -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_english_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "English", 3 | "alt-mode-layout" : "uhtz_slim_pocket/titan_slim_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | 7 | 8 | { 9 | "key-code" : "KEYCODE_Q", 10 | "single-press" : "q", 11 | "single-press-shift-mode" : "Q" 12 | }, { 13 | "key-code" : "KEYCODE_W", 14 | "single-press" : "w", 15 | "single-press-shift-mode" : "W" 16 | }, { 17 | "key-code" : "KEYCODE_E", 18 | "single-press" : "e", 19 | "single-press-shift-mode" : "E" 20 | }, { 21 | "key-code" : "KEYCODE_R", 22 | "single-press" : "r", 23 | "single-press-shift-mode" : "R" 24 | }, { 25 | "key-code" : "KEYCODE_T", 26 | "single-press" : "t", 27 | "single-press-shift-mode" : "T" 28 | }, { 29 | "key-code" : "KEYCODE_Y", 30 | "single-press" : "y", 31 | "single-press-shift-mode" : "Y" 32 | }, { 33 | "key-code" : "KEYCODE_U", 34 | "single-press" : "u", 35 | "single-press-shift-mode" : "U" 36 | }, { 37 | "key-code" : "KEYCODE_I", 38 | "single-press" : "i", 39 | "single-press-shift-mode" : "I" 40 | }, { 41 | "key-code" : "KEYCODE_O", 42 | "single-press" : "o", 43 | "single-press-shift-mode" : "O" 44 | }, { 45 | "key-code" : "KEYCODE_P", 46 | "single-press" : "p", 47 | "single-press-shift-mode" : "P" 48 | }, 49 | 50 | 51 | { 52 | "key-code" : "KEYCODE_A", 53 | "single-press" : "a", 54 | "single-press-shift-mode" : "A" 55 | }, { 56 | "key-code" : "KEYCODE_S", 57 | "single-press" : "s", 58 | "single-press-shift-mode" : "S" 59 | }, { 60 | "key-code" : "KEYCODE_D", 61 | "single-press" : "d", 62 | "single-press-shift-mode" : "D" 63 | }, { 64 | "key-code" : "KEYCODE_F", 65 | "single-press" : "f", 66 | "single-press-shift-mode" : "F" 67 | }, { 68 | "key-code" : "KEYCODE_G", 69 | "single-press" : "g", 70 | "single-press-shift-mode" : "G" 71 | }, { 72 | "key-code" : "KEYCODE_H", 73 | "single-press" : "h", 74 | "single-press-shift-mode" : "H" 75 | }, { 76 | "key-code" : "KEYCODE_J", 77 | "single-press" : "j", 78 | "single-press-shift-mode" : "J" 79 | }, { 80 | "key-code" : "KEYCODE_K", 81 | "single-press" : "k", 82 | "single-press-shift-mode" : "K" 83 | }, { 84 | "key-code" : "KEYCODE_L", 85 | "single-press" : "l", 86 | "single-press-shift-mode" : "L" 87 | }, 88 | 89 | 90 | { 91 | "key-code" : "KEYCODE_Z", 92 | "single-press" : "z", 93 | "single-press-shift-mode" : "Z" 94 | }, { 95 | "key-code" : "KEYCODE_X", 96 | "single-press" : "x", 97 | "single-press-shift-mode" : "X" 98 | }, { 99 | "key-code" : "KEYCODE_C", 100 | "single-press" : "c", 101 | "single-press-shift-mode" : "C" 102 | }, { 103 | "key-code" : "KEYCODE_V", 104 | "single-press" : "v", 105 | "single-press-shift-mode" : "V" 106 | }, { 107 | "key-code" : "KEYCODE_B", 108 | "single-press" : "b", 109 | "single-press-shift-mode" : "B" 110 | }, { 111 | "key-code" : "KEYCODE_N", 112 | "single-press" : "n", 113 | "single-press-shift-mode" : "N" 114 | }, { 115 | "key-code" : "KEYCODE_M", 116 | "single-press" : "m", 117 | "single-press-shift-mode" : "M" 118 | } 119 | 120 | 121 | ] 122 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_estonian_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Эстонский", 3 | "alt-mode-layout" : "uhtz_slim_pocket/titan_slim_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | 7 | 8 | { 9 | "key-code" : "KEYCODE_Q", 10 | "single-press" : "q", 11 | "single-press-shift-mode" : "Q", 12 | "double-press" : "õ", 13 | "double-press-shift-mode" : "Õ" 14 | }, { 15 | "key-code" : "KEYCODE_W", 16 | "single-press" : "w", 17 | "single-press-shift-mode" : "W" 18 | }, { 19 | "key-code" : "KEYCODE_E", 20 | "single-press" : "e", 21 | "single-press-shift-mode" : "E" 22 | }, { 23 | "key-code" : "KEYCODE_R", 24 | "single-press" : "r", 25 | "single-press-shift-mode" : "R" 26 | }, { 27 | "key-code" : "KEYCODE_T", 28 | "single-press" : "t", 29 | "single-press-shift-mode" : "T" 30 | }, { 31 | "key-code" : "KEYCODE_Y", 32 | "single-press" : "y", 33 | "single-press-shift-mode" : "Y" 34 | }, { 35 | "key-code" : "KEYCODE_U", 36 | "single-press" : "u", 37 | "single-press-shift-mode" : "U", 38 | "double-press" : "ü", 39 | "double-press-shift-mode" : "Ü" 40 | }, { 41 | "key-code" : "KEYCODE_I", 42 | "single-press" : "i", 43 | "single-press-shift-mode" : "I" 44 | }, { 45 | "key-code" : "KEYCODE_O", 46 | "single-press" : "o", 47 | "single-press-shift-mode" : "O", 48 | "double-press" : "ö", 49 | "double-press-shift-mode" : "Ö" 50 | }, { 51 | "key-code" : "KEYCODE_P", 52 | "single-press" : "p", 53 | "single-press-shift-mode" : "P" 54 | }, 55 | 56 | 57 | { 58 | "key-code" : "KEYCODE_A", 59 | "single-press" : "a", 60 | "single-press-shift-mode" : "A", 61 | "double-press" : "ä", 62 | "double-press-shift-mode" : "Ä" 63 | }, { 64 | "key-code" : "KEYCODE_S", 65 | "single-press" : "s", 66 | "single-press-shift-mode" : "S", 67 | "double-press" : "š", 68 | "double-press-shift-mode" : "Š" 69 | }, { 70 | "key-code" : "KEYCODE_D", 71 | "single-press" : "d", 72 | "single-press-shift-mode" : "D" 73 | }, { 74 | "key-code" : "KEYCODE_F", 75 | "single-press" : "f", 76 | "single-press-shift-mode" : "F" 77 | }, { 78 | "key-code" : "KEYCODE_G", 79 | "single-press" : "g", 80 | "single-press-shift-mode" : "G" 81 | }, { 82 | "key-code" : "KEYCODE_H", 83 | "single-press" : "h", 84 | "single-press-shift-mode" : "H" 85 | }, { 86 | "key-code" : "KEYCODE_J", 87 | "single-press" : "j", 88 | "single-press-shift-mode" : "J" 89 | }, { 90 | "key-code" : "KEYCODE_K", 91 | "single-press" : "k", 92 | "single-press-shift-mode" : "K" 93 | }, { 94 | "key-code" : "KEYCODE_L", 95 | "single-press" : "l", 96 | "single-press-shift-mode" : "L" 97 | }, 98 | 99 | 100 | { 101 | "key-code" : "KEYCODE_Z", 102 | "single-press" : "z", 103 | "single-press-shift-mode" : "Z", 104 | "double-press" : "ž", 105 | "double-press-shift-mode" : "Ž" 106 | }, { 107 | "key-code" : "KEYCODE_X", 108 | "single-press" : "x", 109 | "single-press-shift-mode" : "X" 110 | }, { 111 | "key-code" : "KEYCODE_C", 112 | "single-press" : "c", 113 | "single-press-shift-mode" : "C" 114 | }, { 115 | "key-code" : "KEYCODE_V", 116 | "single-press" : "v", 117 | "single-press-shift-mode" : "V" 118 | }, { 119 | "key-code" : "KEYCODE_B", 120 | "single-press" : "b", 121 | "single-press-shift-mode" : "B" 122 | }, { 123 | "key-code" : "KEYCODE_N", 124 | "single-press" : "n", 125 | "single-press-shift-mode" : "N" 126 | }, { 127 | "key-code" : "KEYCODE_M", 128 | "single-press" : "m", 129 | "single-press-shift-mode" : "M" 130 | } 131 | 132 | 133 | ] 134 | } 135 | -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_latvian_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Латышский", 3 | "alt-mode-layout" : "uhtz_slim_pocket/titan_slim_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | 7 | 8 | { 9 | "key-code" : "KEYCODE_Q", 10 | "single-press" : "q", 11 | "single-press-shift-mode" : "Q" 12 | }, { 13 | "key-code" : "KEYCODE_W", 14 | "single-press" : "w", 15 | "single-press-shift-mode" : "W" 16 | }, { 17 | "key-code" : "KEYCODE_E", 18 | "single-press" : "e", 19 | "single-press-shift-mode" : "E", 20 | "double-press" : "ē", 21 | "double-press-shift-mode" : "Ē" 22 | }, { 23 | "key-code" : "KEYCODE_R", 24 | "single-press" : "r", 25 | "single-press-shift-mode" : "R" 26 | }, { 27 | "key-code" : "KEYCODE_T", 28 | "single-press" : "t", 29 | "single-press-shift-mode" : "T" 30 | }, { 31 | "key-code" : "KEYCODE_Y", 32 | "single-press" : "y", 33 | "single-press-shift-mode" : "Y" 34 | }, { 35 | "key-code" : "KEYCODE_U", 36 | "single-press" : "u", 37 | "single-press-shift-mode" : "U", 38 | "double-press" : "ū", 39 | "double-press-shift-mode" : "Ū" 40 | }, { 41 | "key-code" : "KEYCODE_I", 42 | "single-press" : "i", 43 | "single-press-shift-mode" : "I", 44 | "double-press" : "ī", 45 | "double-press-shift-mode" : "Ī" 46 | }, { 47 | "key-code" : "KEYCODE_O", 48 | "single-press" : "o", 49 | "single-press-shift-mode" : "O" 50 | }, { 51 | "key-code" : "KEYCODE_P", 52 | "single-press" : "p", 53 | "single-press-shift-mode" : "P" 54 | }, 55 | 56 | 57 | { 58 | "key-code" : "KEYCODE_A", 59 | "single-press" : "a", 60 | "single-press-shift-mode" : "A", 61 | "double-press" : "ā", 62 | "double-press-shift-mode" : "Ā" 63 | }, { 64 | "key-code" : "KEYCODE_S", 65 | "single-press" : "s", 66 | "single-press-shift-mode" : "S", 67 | "double-press" : "š", 68 | "double-press-shift-mode" : "Š" 69 | }, { 70 | "key-code" : "KEYCODE_D", 71 | "single-press" : "d", 72 | "single-press-shift-mode" : "D" 73 | }, { 74 | "key-code" : "KEYCODE_F", 75 | "single-press" : "f", 76 | "single-press-shift-mode" : "F" 77 | }, { 78 | "key-code" : "KEYCODE_G", 79 | "single-press" : "g", 80 | "single-press-shift-mode" : "G", 81 | "double-press" : "ģ", 82 | "double-press-shift-mode" : "Ģ" 83 | }, { 84 | "key-code" : "KEYCODE_H", 85 | "single-press" : "h", 86 | "single-press-shift-mode" : "H" 87 | }, { 88 | "key-code" : "KEYCODE_J", 89 | "single-press" : "j", 90 | "single-press-shift-mode" : "J" 91 | }, { 92 | "key-code" : "KEYCODE_K", 93 | "single-press" : "k", 94 | "single-press-shift-mode" : "K", 95 | "double-press" : "ķ", 96 | "double-press-shift-mode" : "Ķ" 97 | }, { 98 | "key-code" : "KEYCODE_L", 99 | "single-press" : "l", 100 | "single-press-shift-mode" : "L", 101 | "double-press" : "ļ", 102 | "double-press-shift-mode" : "Ļ" 103 | }, 104 | 105 | 106 | { 107 | "key-code" : "KEYCODE_Z", 108 | "single-press" : "z", 109 | "single-press-shift-mode" : "Z", 110 | "double-press" : "ž", 111 | "double-press-shift-mode" : "Ž" 112 | }, { 113 | "key-code" : "KEYCODE_X", 114 | "single-press" : "x", 115 | "single-press-shift-mode" : "X" 116 | }, { 117 | "key-code" : "KEYCODE_C", 118 | "single-press" : "c", 119 | "single-press-shift-mode" : "C", 120 | "double-press" : "č", 121 | "double-press-shift-mode" : "Č" 122 | }, { 123 | "key-code" : "KEYCODE_V", 124 | "single-press" : "v", 125 | "single-press-shift-mode" : "V" 126 | }, { 127 | "key-code" : "KEYCODE_B", 128 | "single-press" : "b", 129 | "single-press-shift-mode" : "B" 130 | }, { 131 | "key-code" : "KEYCODE_N", 132 | "single-press" : "n", 133 | "single-press-shift-mode" : "N", 134 | "double-press" : "ņ", 135 | "double-press-shift-mode" : "Ņ" 136 | }, { 137 | "key-code" : "KEYCODE_M", 138 | "single-press" : "m", 139 | "single-press-shift-mode" : "M" 140 | } 141 | 142 | 143 | ] 144 | } 145 | -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_russian_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "uhtz_slim_pocket/titan_slim_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | 7 | 8 | { 9 | "key-code" : "KEYCODE_Q", 10 | "single-press" : "й", 11 | "single-press-shift-mode" : "Й", 12 | "double-press" : "ё", 13 | "double-press-shift-mode" : "Ё" 14 | }, { 15 | "key-code" : "KEYCODE_W", 16 | "single-press" : "ц", 17 | "single-press-shift-mode" : "Ц" 18 | }, { 19 | "key-code" : "KEYCODE_E", 20 | "single-press" : "у", 21 | "single-press-shift-mode" : "У" 22 | }, { 23 | "key-code" : "KEYCODE_R", 24 | "single-press" : "к", 25 | "single-press-shift-mode" : "К" 26 | }, { 27 | "key-code" : "KEYCODE_T", 28 | "single-press" : "е", 29 | "single-press-shift-mode" : "Е" 30 | }, { 31 | "key-code" : "KEYCODE_Y", 32 | "single-press" : "н", 33 | "single-press-shift-mode" : "Н" 34 | }, { 35 | "key-code" : "KEYCODE_U", 36 | "single-press" : "г", 37 | "single-press-shift-mode" : "Г" 38 | }, { 39 | "key-code" : "KEYCODE_I", 40 | "single-press" : "ш", 41 | "single-press-shift-mode" : "Ш", 42 | "double-press" : "щ", 43 | "double-press-shift-mode" : "Щ" 44 | }, { 45 | "key-code" : "KEYCODE_O", 46 | "single-press" : "з", 47 | "single-press-shift-mode" : "З" 48 | }, { 49 | "key-code" : "KEYCODE_P", 50 | "single-press" : "х", 51 | "single-press-shift-mode" : "Х", 52 | "double-press" : "э", 53 | "double-press-shift-mode" : "Э" 54 | }, 55 | 56 | 57 | { 58 | "key-code" : "KEYCODE_A", 59 | "single-press" : "ф", 60 | "single-press-shift-mode" : "Ф" 61 | }, { 62 | "key-code" : "KEYCODE_S", 63 | "single-press" : "ы", 64 | "single-press-shift-mode" : "Ы" 65 | }, { 66 | "key-code" : "KEYCODE_D", 67 | "single-press" : "в", 68 | "single-press-shift-mode" : "В" 69 | }, { 70 | "key-code" : "KEYCODE_F", 71 | "single-press" : "а", 72 | "single-press-shift-mode" : "А" 73 | }, { 74 | "key-code" : "KEYCODE_G", 75 | "single-press" : "п", 76 | "single-press-shift-mode" : "П" 77 | }, { 78 | "key-code" : "KEYCODE_H", 79 | "single-press" : "р", 80 | "single-press-shift-mode" : "Р" 81 | }, { 82 | "key-code" : "KEYCODE_J", 83 | "single-press" : "о", 84 | "single-press-shift-mode" : "О" 85 | }, { 86 | "key-code" : "KEYCODE_K", 87 | "single-press" : "л", 88 | "single-press-shift-mode" : "Л" 89 | }, { 90 | "key-code" : "KEYCODE_L", 91 | "single-press" : "д", 92 | "single-press-shift-mode" : "Д", 93 | "double-press" : "ж", 94 | "double-press-shift-mode" : "Ж" 95 | }, 96 | 97 | 98 | { 99 | "key-code" : "KEYCODE_Z", 100 | "single-press" : "я", 101 | "single-press-shift-mode" : "Я", 102 | "double-press" : "ч", 103 | "double-press-shift-mode" : "Ч" 104 | }, { 105 | "key-code" : "KEYCODE_X", 106 | "single-press" : "с", 107 | "single-press-shift-mode" : "С" 108 | }, { 109 | "key-code" : "KEYCODE_C", 110 | "single-press" : "м", 111 | "single-press-shift-mode" : "М" 112 | }, { 113 | "key-code" : "KEYCODE_V", 114 | "single-press" : "и", 115 | "single-press-shift-mode" : "И" 116 | }, { 117 | "key-code" : "KEYCODE_B", 118 | "single-press" : "т", 119 | "single-press-shift-mode" : "Т" 120 | }, { 121 | "key-code" : "KEYCODE_N", 122 | "single-press" : "б", 123 | "single-press-shift-mode" : "Б", 124 | "double-press" : "ь", 125 | "double-press-shift-mode" : "Ь" 126 | }, { 127 | "key-code" : "KEYCODE_M", 128 | "single-press" : "ю", 129 | "single-press-shift-mode" : "Ю", 130 | "double-press" : "ъ", 131 | "double-press-shift-mode" : "Ъ" 132 | } 133 | 134 | ] 135 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_russian_key2_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "uhtz_slim_pocket/titan_slim_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | 7 | 8 | { 9 | "key-code" : "KEYCODE_Q", 10 | "single-press" : "й", 11 | "single-press-shift-mode" : "Й", 12 | "double-press" : "ё", 13 | "double-press-shift-mode" : "Ё" 14 | }, { 15 | "key-code" : "KEYCODE_W", 16 | "single-press" : "ц", 17 | "single-press-shift-mode" : "Ц" 18 | }, { 19 | "key-code" : "KEYCODE_E", 20 | "single-press" : "у", 21 | "single-press-shift-mode" : "У" 22 | }, { 23 | "key-code" : "KEYCODE_R", 24 | "single-press" : "к", 25 | "single-press-shift-mode" : "К" 26 | }, { 27 | "key-code" : "KEYCODE_T", 28 | "single-press" : "е", 29 | "single-press-shift-mode" : "Е" 30 | }, { 31 | "key-code" : "KEYCODE_Y", 32 | "single-press" : "н", 33 | "single-press-shift-mode" : "Н" 34 | }, { 35 | "key-code" : "KEYCODE_U", 36 | "single-press" : "г", 37 | "single-press-shift-mode" : "Г" 38 | }, { 39 | "key-code" : "KEYCODE_I", 40 | "single-press" : "ш", 41 | "single-press-shift-mode" : "Ш", 42 | "double-press" : "щ", 43 | "double-press-shift-mode" : "Щ" 44 | }, { 45 | "key-code" : "KEYCODE_O", 46 | "single-press" : "з", 47 | "single-press-shift-mode" : "З" 48 | }, { 49 | "key-code" : "KEYCODE_P", 50 | "single-press" : "х", 51 | "single-press-shift-mode" : "Х", 52 | "double-press" : "э", 53 | "double-press-shift-mode" : "Э" 54 | }, 55 | 56 | 57 | { 58 | "key-code" : "KEYCODE_A", 59 | "single-press" : "ф", 60 | "single-press-shift-mode" : "Ф" 61 | }, { 62 | "key-code" : "KEYCODE_S", 63 | "single-press" : "ы", 64 | "single-press-shift-mode" : "Ы" 65 | }, { 66 | "key-code" : "KEYCODE_D", 67 | "single-press" : "в", 68 | "single-press-shift-mode" : "В" 69 | }, { 70 | "key-code" : "KEYCODE_F", 71 | "single-press" : "а", 72 | "single-press-shift-mode" : "А" 73 | }, { 74 | "key-code" : "KEYCODE_G", 75 | "single-press" : "п", 76 | "single-press-shift-mode" : "П" 77 | }, { 78 | "key-code" : "KEYCODE_H", 79 | "single-press" : "р", 80 | "single-press-shift-mode" : "Р" 81 | }, { 82 | "key-code" : "KEYCODE_J", 83 | "single-press" : "о", 84 | "single-press-shift-mode" : "О" 85 | }, { 86 | "key-code" : "KEYCODE_K", 87 | "single-press" : "л", 88 | "single-press-shift-mode" : "Л" 89 | }, { 90 | "key-code" : "KEYCODE_L", 91 | "single-press" : "д", 92 | "single-press-shift-mode" : "Д", 93 | "double-press" : "ж", 94 | "double-press-shift-mode" : "Ж" 95 | }, 96 | 97 | 98 | { 99 | "key-code" : "KEYCODE_Z", 100 | "single-press" : "я", 101 | "single-press-shift-mode" : "Я" 102 | }, { 103 | "key-code" : "KEYCODE_X", 104 | "single-press" : "ч", 105 | "single-press-shift-mode" : "Ч" 106 | }, { 107 | "key-code" : "KEYCODE_C", 108 | "single-press" : "с", 109 | "single-press-shift-mode" : "С" 110 | }, { 111 | "key-code" : "KEYCODE_V", 112 | "single-press" : "м", 113 | "single-press-shift-mode" : "М" 114 | }, { 115 | "key-code" : "KEYCODE_B", 116 | "single-press" : "и", 117 | "single-press-shift-mode" : "И", 118 | "double-press" : "т", 119 | "double-press-shift-mode" : "Т" 120 | }, { 121 | "key-code" : "KEYCODE_N", 122 | "single-press" : "ь", 123 | "single-press-shift-mode" : "Ь", 124 | "double-press" : "ъ", 125 | "double-press-shift-mode" : "Ъ" 126 | }, { 127 | "key-code" : "KEYCODE_M", 128 | "single-press" : "б", 129 | "single-press-shift-mode" : "Б", 130 | "double-press" : "ю", 131 | "double-press-shift-mode" : "Ю" 132 | } 133 | 134 | 135 | ] 136 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_russian_kika_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский-kika", 3 | "alt-mode-layout" : "uhtz_slim_pocket/titan_slim_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | 7 | 8 | { 9 | "key-code" : "KEYCODE_Q", 10 | "single-press" : "й", 11 | "single-press-shift-mode" : "Й", 12 | "double-press" : "ц", 13 | "double-press-shift-mode" : "Ц" 14 | }, { 15 | "key-code" : "KEYCODE_W", 16 | "single-press" : "у", 17 | "single-press-shift-mode" : "У" 18 | }, { 19 | "key-code" : "KEYCODE_E", 20 | "single-press" : "к", 21 | "single-press-shift-mode" : "К" 22 | }, { 23 | "key-code" : "KEYCODE_R", 24 | "single-press" : "е", 25 | "single-press-shift-mode" : "Е", 26 | "double-press" : "ё", 27 | "double-press-shift-mode" : "Ё" 28 | }, { 29 | "key-code" : "KEYCODE_T", 30 | "single-press" : "н", 31 | "single-press-shift-mode" : "Н" 32 | }, { 33 | "key-code" : "KEYCODE_Y", 34 | "single-press" : "г", 35 | "single-press-shift-mode" : "Г" 36 | }, { 37 | "key-code" : "KEYCODE_U", 38 | "single-press" : "ш", 39 | "single-press-shift-mode" : "Ш", 40 | "double-press" : "щ", 41 | "double-press-shift-mode" : "Щ" 42 | }, { 43 | "key-code" : "KEYCODE_I", 44 | "single-press" : "з", 45 | "single-press-shift-mode" : "З" 46 | }, { 47 | "key-code" : "KEYCODE_O", 48 | "single-press" : "х", 49 | "single-press-shift-mode" : "Х", 50 | "double-press" : "ъ", 51 | "double-press-shift-mode" : "Ъ" 52 | }, { 53 | "key-code" : "KEYCODE_P", 54 | "single-press" : "ю", 55 | "single-press-shift-mode" : "Ю" 56 | }, 57 | 58 | 59 | { 60 | "key-code" : "KEYCODE_A", 61 | "single-press" : "ф", 62 | "single-press-shift-mode" : "Ф", 63 | "double-press" : "ы", 64 | "double-press-shift-mode" : "Ы" 65 | }, { 66 | "key-code" : "KEYCODE_S", 67 | "single-press" : "в", 68 | "single-press-shift-mode" : "В" 69 | }, { 70 | "key-code" : "KEYCODE_D", 71 | "single-press" : "а", 72 | "single-press-shift-mode" : "А" 73 | }, { 74 | "key-code" : "KEYCODE_F", 75 | "single-press" : "п", 76 | "single-press-shift-mode" : "П" 77 | }, { 78 | "key-code" : "KEYCODE_G", 79 | "single-press" : "р", 80 | "single-press-shift-mode" : "Р" 81 | }, { 82 | "key-code" : "KEYCODE_H", 83 | "single-press" : "о", 84 | "single-press-shift-mode" : "О" 85 | }, { 86 | "key-code" : "KEYCODE_J", 87 | "single-press" : "л", 88 | "single-press-shift-mode" : "Л" 89 | }, { 90 | "key-code" : "KEYCODE_K", 91 | "single-press" : "д", 92 | "single-press-shift-mode" : "Д" 93 | }, { 94 | "key-code" : "KEYCODE_L", 95 | "single-press" : "ж", 96 | "single-press-shift-mode" : "Ж", 97 | "double-press" : "э", 98 | "double-press-shift-mode" : "Э" 99 | }, 100 | 101 | 102 | { 103 | "key-code" : "KEYCODE_Z", 104 | "single-press" : "я", 105 | "single-press-shift-mode" : "Я", 106 | "double-press" : "ч", 107 | "double-press-shift-mode" : "Ч" 108 | }, { 109 | "key-code" : "KEYCODE_X", 110 | "single-press" : "с", 111 | "single-press-shift-mode" : "С" 112 | }, { 113 | "key-code" : "KEYCODE_C", 114 | "single-press" : "м", 115 | "single-press-shift-mode" : "М" 116 | }, { 117 | "key-code" : "KEYCODE_V", 118 | "single-press" : "и", 119 | "single-press-shift-mode" : "И" 120 | }, { 121 | "key-code" : "KEYCODE_B", 122 | "single-press" : "т", 123 | "single-press-shift-mode" : "Т" 124 | }, { 125 | "key-code" : "KEYCODE_N", 126 | "single-press" : "ь", 127 | "single-press-shift-mode" : "Ь" 128 | }, { 129 | "key-code" : "KEYCODE_M", 130 | "single-press" : "б", 131 | "single-press-shift-mode" : "Б" 132 | } 133 | 134 | ] 135 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_russian_translit2_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Транслит kika", 3 | "alt-mode-layout" : "uhtz_slim_pocket/titan_slim_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | { 7 | "key-code" : "KEYCODE_Q", 8 | "single-press" : "я", 9 | "single-press-shift-mode" : "Я" 10 | }, { 11 | "key-code" : "KEYCODE_W", 12 | "single-press" : "ш", 13 | "single-press-shift-mode" : "Ш", 14 | "double-press" : "щ", 15 | "double-press-shift-mode" : "Щ" 16 | }, { 17 | "key-code" : "KEYCODE_E", 18 | "single-press" : "е", 19 | "single-press-shift-mode" : "Е", 20 | "double-press" : "э", 21 | "double-press-shift-mode" : "Э" 22 | }, { 23 | "key-code" : "KEYCODE_R", 24 | "single-press" : "р", 25 | "single-press-shift-mode" : "Р" 26 | }, { 27 | "key-code" : "KEYCODE_T", 28 | "single-press" : "т", 29 | "single-press-shift-mode" : "Т" 30 | }, { 31 | "key-code" : "KEYCODE_Y", 32 | "single-press" : "ы", 33 | "single-press-shift-mode" : "Ы" 34 | }, { 35 | "key-code" : "KEYCODE_U", 36 | "single-press" : "у", 37 | "single-press-shift-mode" : "У", 38 | "double-press" : "ю", 39 | "double-press-shift-mode" : "Ю" 40 | }, { 41 | "key-code" : "KEYCODE_I", 42 | "single-press" : "и", 43 | "single-press-shift-mode" : "И", 44 | "double-press" : "й", 45 | "double-press-shift-mode" : "Й" 46 | }, { 47 | "key-code" : "KEYCODE_O", 48 | "single-press" : "о", 49 | "single-press-shift-mode" : "О", 50 | "double-press" : "ё", 51 | "double-press-shift-mode" : "Ё" 52 | }, { 53 | "key-code" : "KEYCODE_P", 54 | "single-press" : "п", 55 | "single-press-shift-mode" : "П" 56 | }, { 57 | "key-code" : "KEYCODE_A", 58 | "single-press" : "а", 59 | "single-press-shift-mode" : "А" 60 | }, { 61 | "key-code" : "KEYCODE_S", 62 | "single-press" : "с", 63 | "single-press-shift-mode" : "С" 64 | }, { 65 | "key-code" : "KEYCODE_D", 66 | "single-press" : "д", 67 | "single-press-shift-mode" : "Д" 68 | }, { 69 | "key-code" : "KEYCODE_F", 70 | "single-press" : "ф", 71 | "single-press-shift-mode" : "Ф" 72 | }, { 73 | "key-code" : "KEYCODE_G", 74 | "single-press" : "г", 75 | "single-press-shift-mode" : "Г" 76 | }, { 77 | "key-code" : "KEYCODE_H", 78 | "single-press" : "ч", 79 | "single-press-shift-mode" : "Ч" 80 | }, { 81 | "key-code" : "KEYCODE_J", 82 | "single-press" : "ь", 83 | "single-press-shift-mode" : "Ь", 84 | "double-press" : "ъ", 85 | "double-press-shift-mode" : "Ъ" 86 | }, { 87 | "key-code" : "KEYCODE_K", 88 | "single-press" : "к", 89 | "single-press-shift-mode" : "К" 90 | }, { 91 | "key-code" : "KEYCODE_L", 92 | "single-press" : "л", 93 | "single-press-shift-mode" : "Л" 94 | }, { 95 | "key-code" : "KEYCODE_Z", 96 | "single-press" : "ж", 97 | "single-press-shift-mode" : "Ж", 98 | "double-press" : "з", 99 | "double-press-shift-mode" : "З" 100 | }, { 101 | "key-code" : "KEYCODE_X", 102 | "single-press" : "х", 103 | "single-press-shift-mode" : "Х" 104 | }, { 105 | "key-code" : "KEYCODE_C", 106 | "single-press" : "ц", 107 | "single-press-shift-mode" : "Ц" 108 | }, { 109 | "key-code" : "KEYCODE_V", 110 | "single-press" : "в", 111 | "single-press-shift-mode" : "В" 112 | }, { 113 | "key-code" : "KEYCODE_B", 114 | "single-press" : "б", 115 | "single-press-shift-mode" : "Б" 116 | }, { 117 | "key-code" : "KEYCODE_N", 118 | "single-press" : "н", 119 | "single-press-shift-mode" : "Н" 120 | }, { 121 | "key-code" : "KEYCODE_M", 122 | "single-press" : "м", 123 | "single-press-shift-mode" : "М" 124 | } ] 125 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_slim_pocket/titan_slim_russian_translit_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "uhtz_slim_pocket/titan_slim_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | { 7 | "key-code" : "KEYCODE_Q", 8 | "single-press" : "я", 9 | "single-press-shift-mode" : "Я", 10 | "double-press" : "э", 11 | "double-press-shift-mode" : "Э" 12 | }, { 13 | "key-code" : "KEYCODE_W", 14 | "single-press" : "ш", 15 | "single-press-shift-mode" : "Ш", 16 | "double-press" : "щ", 17 | "double-press-shift-mode" : "Щ" 18 | }, { 19 | "key-code" : "KEYCODE_E", 20 | "single-press" : "е", 21 | "single-press-shift-mode" : "Е", 22 | "double-press" : "ё", 23 | "double-press-shift-mode" : "Ё" 24 | }, { 25 | "key-code" : "KEYCODE_R", 26 | "single-press" : "р", 27 | "single-press-shift-mode" : "Р" 28 | }, { 29 | "key-code" : "KEYCODE_T", 30 | "single-press" : "т", 31 | "single-press-shift-mode" : "Т" 32 | }, { 33 | "key-code" : "KEYCODE_Y", 34 | "single-press" : "ы", 35 | "single-press-shift-mode" : "Ы" 36 | }, { 37 | "key-code" : "KEYCODE_U", 38 | "single-press" : "у", 39 | "single-press-shift-mode" : "У", 40 | "double-press" : "ю", 41 | "double-press-shift-mode" : "Ю" 42 | }, { 43 | "key-code" : "KEYCODE_I", 44 | "single-press" : "и", 45 | "single-press-shift-mode" : "И", 46 | "double-press" : "й", 47 | "double-press-shift-mode" : "Й" 48 | }, { 49 | "key-code" : "KEYCODE_O", 50 | "single-press" : "о", 51 | "single-press-shift-mode" : "О" 52 | }, { 53 | "key-code" : "KEYCODE_P", 54 | "single-press" : "п", 55 | "single-press-shift-mode" : "П" 56 | }, { 57 | "key-code" : "KEYCODE_A", 58 | "single-press" : "а", 59 | "single-press-shift-mode" : "А" 60 | }, { 61 | "key-code" : "KEYCODE_S", 62 | "single-press" : "с", 63 | "single-press-shift-mode" : "С" 64 | }, { 65 | "key-code" : "KEYCODE_D", 66 | "single-press" : "д", 67 | "single-press-shift-mode" : "Д" 68 | }, { 69 | "key-code" : "KEYCODE_F", 70 | "single-press" : "ф", 71 | "single-press-shift-mode" : "Ф" 72 | }, { 73 | "key-code" : "KEYCODE_G", 74 | "single-press" : "г", 75 | "single-press-shift-mode" : "Г" 76 | }, { 77 | "key-code" : "KEYCODE_H", 78 | "single-press" : "х", 79 | "single-press-shift-mode" : "Х" 80 | }, { 81 | "key-code" : "KEYCODE_J", 82 | "single-press" : "ж", 83 | "single-press-shift-mode" : "Ж" 84 | }, { 85 | "key-code" : "KEYCODE_K", 86 | "single-press" : "к", 87 | "single-press-shift-mode" : "К" 88 | }, { 89 | "key-code" : "KEYCODE_L", 90 | "single-press" : "л", 91 | "single-press-shift-mode" : "Л" 92 | }, { 93 | "key-code" : "KEYCODE_Z", 94 | "single-press" : "з", 95 | "single-press-shift-mode" : "З" 96 | }, { 97 | "key-code" : "KEYCODE_X", 98 | "single-press" : "ь", 99 | "single-press-shift-mode" : "Ь", 100 | "double-press" : "ъ", 101 | "double-press-shift-mode" : "Ъ" 102 | }, { 103 | "key-code" : "KEYCODE_C", 104 | "single-press" : "ц", 105 | "single-press-shift-mode" : "Ц", 106 | "double-press" : "ч", 107 | "double-press-shift-mode" : "Ч" 108 | }, { 109 | "key-code" : "KEYCODE_V", 110 | "single-press" : "в", 111 | "single-press-shift-mode" : "В" 112 | }, { 113 | "key-code" : "KEYCODE_B", 114 | "single-press" : "б", 115 | "single-press-shift-mode" : "Б" 116 | }, { 117 | "key-code" : "KEYCODE_N", 118 | "single-press" : "н", 119 | "single-press-shift-mode" : "Н" 120 | }, { 121 | "key-code" : "KEYCODE_M", 122 | "single-press" : "м", 123 | "single-press-shift-mode" : "М" 124 | } ] 125 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_titan/titan_alt_hw.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "key-code" : "KEYCODE_Q", 3 | "single-press-alt-shift-mode" : "%", 4 | "single-press-alt-mode" : ":", 5 | "alt-more-variants" : "№" 6 | }, { 7 | "key-code" : "KEYCODE_W", 8 | "single-press-alt-shift-mode" : "<", 9 | "single-press-alt-mode" : "/", 10 | "alt-more-variants" : "º" 11 | }, { 12 | "key-code" : "KEYCODE_E", 13 | "single-press-alt-shift-mode" : ">", 14 | "single-press-alt-mode" : "_", 15 | "alt-more-variants" : "[" 16 | }, { 17 | "key-code" : "KEYCODE_R", 18 | "single-press-alt-shift-mode" : "^", 19 | "single-press-alt-mode" : "-", 20 | "alt-more-variants" : "]" 21 | }, { 22 | "key-code" : "KEYCODE_T", 23 | "single-press-alt-shift-mode" : "[", 24 | "single-press-alt-mode" : "(", 25 | "alt-more-variants" : "←<{[" 26 | }, { 27 | "key-code" : "KEYCODE_Y", 28 | "single-press-alt-shift-mode" : "]", 29 | "single-press-alt-mode" : ")", 30 | "alt-more-variants" : "→>}]" 31 | }, { 32 | "key-code" : "KEYCODE_U", 33 | "single-press-alt-shift-mode" : "ˋ", 34 | "single-press-alt-mode" : "1", 35 | "alt-more-variants" : "—←" 36 | }, { 37 | "key-code" : "KEYCODE_I", 38 | "single-press-alt-shift-mode" : "{", 39 | "single-press-alt-mode" : "2", 40 | "alt-more-variants" : "—→" 41 | }, { 42 | "key-code" : "KEYCODE_O", 43 | "single-press-alt-shift-mode" : "}", 44 | "single-press-alt-mode" : "3", 45 | "alt-more-variants" : "↑" 46 | }, { 47 | "key-code" : "KEYCODE_P", 48 | "single-press-alt-shift-mode" : "~", 49 | "single-press-alt-mode" : "0" 50 | }, { 51 | "key-code" : "KEYCODE_A", 52 | "single-press-alt-shift-mode" : "=", 53 | "single-press-alt-mode" : "@", 54 | "alt-more-variants" : "≠" 55 | }, { 56 | "key-code" : "KEYCODE_S", 57 | "single-press-alt-shift-mode" : "&", 58 | "single-press-alt-mode" : "'" 59 | }, { 60 | "key-code" : "KEYCODE_D", 61 | "single-press-alt-shift-mode" : "©", 62 | "single-press-alt-mode" : "\"" 63 | }, { 64 | "key-code" : "KEYCODE_F", 65 | "single-press-alt-shift-mode" : "˽", 66 | "single-press-alt-mode" : "+" 67 | }, { 68 | "key-code" : "KEYCODE_G", 69 | "single-press-alt-shift-mode" : "\\", 70 | "single-press-alt-mode" : "*" 71 | }, { 72 | "key-code" : "KEYCODE_H", 73 | "single-press-alt-shift-mode" : "|", 74 | "single-press-alt-mode" : "#" 75 | }, { 76 | "key-code" : "KEYCODE_J", 77 | "single-press-alt-shift-mode" : "÷", 78 | "single-press-alt-mode" : "4" 79 | }, { 80 | "key-code" : "KEYCODE_K", 81 | "single-press-alt-shift-mode" : "±", 82 | "single-press-alt-mode" : "5", 83 | "alt-more-variants" : "º" 84 | }, { 85 | "key-code" : "KEYCODE_L", 86 | "single-press-alt-shift-mode" : "•", 87 | "single-press-alt-mode" : "6" 88 | }, { 89 | "key-code" : "KEYCODE_Z", 90 | "single-press-alt-shift-mode" : "«", 91 | "single-press-alt-mode" : "!" 92 | }, { 93 | "key-code" : "KEYCODE_X", 94 | "single-press-alt-shift-mode" : "¡", 95 | "single-press-alt-mode" : "?" 96 | }, { 97 | "key-code" : "KEYCODE_C", 98 | "single-press-alt-shift-mode" : "Ʃ", 99 | "single-press-alt-mode" : "," 100 | }, { 101 | "key-code" : "KEYCODE_V", 102 | "single-press-alt-shift-mode" : "§", 103 | "single-press-alt-mode" : ".", 104 | "alt-more-variants" : "↓" 105 | }, { 106 | "key-code" : "KEYCODE_B", 107 | "single-press-alt-shift-mode" : "»", 108 | "single-press-alt-mode" : "7" 109 | }, { 110 | "key-code" : "KEYCODE_N", 111 | "single-press-alt-shift-mode" : "™", 112 | "single-press-alt-mode" : "8" 113 | }, { 114 | "key-code" : "KEYCODE_M", 115 | "single-press-alt-shift-mode" : "¿", 116 | "single-press-alt-mode" : "9" 117 | }, { 118 | "key-code" : "KEYCODE_4", 119 | "single-press-alt-shift-mode" : "€", 120 | "single-press-alt-mode" : "$", 121 | "alt-more-variants" : "₽₴₩£₪¥$€" 122 | }, { 123 | "key-code" : "KEYCODE_0", 124 | "single-press-alt-shift-mode" : "0", 125 | "single-press-alt-mode" : "0" 126 | } ] -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_titan/titan_english_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "English", 3 | "alt-mode-layout" : "uhtz_titan/titan_alt_hw", 4 | "sym-mode-layout" : "symbol", 5 | "key-mapping" : [ { 6 | "key-code" : "KEYCODE_4", 7 | "single-press" : "$", 8 | "single-press-shift-mode" : "$" 9 | }, { 10 | "key-code" : "KEYCODE_Q", 11 | "single-press" : "q", 12 | "single-press-shift-mode" : "Q" 13 | }, { 14 | "key-code" : "KEYCODE_W", 15 | "single-press" : "w", 16 | "single-press-shift-mode" : "W" 17 | }, { 18 | "key-code" : "KEYCODE_E", 19 | "single-press" : "e", 20 | "single-press-shift-mode" : "E" 21 | }, { 22 | "key-code" : "KEYCODE_R", 23 | "single-press" : "r", 24 | "single-press-shift-mode" : "R" 25 | }, { 26 | "key-code" : "KEYCODE_T", 27 | "single-press" : "t", 28 | "single-press-shift-mode" : "T" 29 | }, { 30 | "key-code" : "KEYCODE_Y", 31 | "single-press" : "y", 32 | "single-press-shift-mode" : "Y" 33 | }, { 34 | "key-code" : "KEYCODE_U", 35 | "single-press" : "u", 36 | "single-press-shift-mode" : "U" 37 | }, { 38 | "key-code" : "KEYCODE_I", 39 | "single-press" : "i", 40 | "single-press-shift-mode" : "I" 41 | }, { 42 | "key-code" : "KEYCODE_O", 43 | "single-press" : "o", 44 | "single-press-shift-mode" : "O" 45 | }, { 46 | "key-code" : "KEYCODE_P", 47 | "single-press" : "p", 48 | "single-press-shift-mode" : "P" 49 | }, { 50 | "key-code" : "KEYCODE_A", 51 | "single-press" : "a", 52 | "single-press-shift-mode" : "A" 53 | }, { 54 | "key-code" : "KEYCODE_S", 55 | "single-press" : "s", 56 | "single-press-shift-mode" : "S" 57 | }, { 58 | "key-code" : "KEYCODE_D", 59 | "single-press" : "d", 60 | "single-press-shift-mode" : "D" 61 | }, { 62 | "key-code" : "KEYCODE_F", 63 | "single-press" : "f", 64 | "single-press-shift-mode" : "F" 65 | }, { 66 | "key-code" : "KEYCODE_G", 67 | "single-press" : "g", 68 | "single-press-shift-mode" : "G" 69 | }, { 70 | "key-code" : "KEYCODE_H", 71 | "single-press" : "h", 72 | "single-press-shift-mode" : "H" 73 | }, { 74 | "key-code" : "KEYCODE_J", 75 | "single-press" : "j", 76 | "single-press-shift-mode" : "J" 77 | }, { 78 | "key-code" : "KEYCODE_K", 79 | "single-press" : "k", 80 | "single-press-shift-mode" : "K" 81 | }, { 82 | "key-code" : "KEYCODE_L", 83 | "single-press" : "l", 84 | "single-press-shift-mode" : "L" 85 | }, { 86 | "key-code" : "KEYCODE_Z", 87 | "single-press" : "z", 88 | "single-press-shift-mode" : "Z" 89 | }, { 90 | "key-code" : "KEYCODE_X", 91 | "single-press" : "x", 92 | "single-press-shift-mode" : "X" 93 | }, { 94 | "key-code" : "KEYCODE_C", 95 | "single-press" : "c", 96 | "single-press-shift-mode" : "C" 97 | }, { 98 | "key-code" : "KEYCODE_V", 99 | "single-press" : "v", 100 | "single-press-shift-mode" : "V" 101 | }, { 102 | "key-code" : "KEYCODE_B", 103 | "single-press" : "b", 104 | "single-press-shift-mode" : "B" 105 | }, { 106 | "key-code" : "KEYCODE_N", 107 | "single-press" : "n", 108 | "single-press-shift-mode" : "N" 109 | }, { 110 | "key-code" : "KEYCODE_M", 111 | "single-press" : "m", 112 | "single-press-shift-mode" : "M" 113 | }, { 114 | "key-code" : "KEYCODE_0", 115 | "single-press" : "0", 116 | "single-press-shift-mode" : "0" 117 | } ] 118 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_titan/titan_russian_kika_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "uhtz_titan/titan_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ { }, { 6 | "key-code" : "KEYCODE_Q", 7 | "single-press" : "й", 8 | "single-press-shift-mode" : "Й", 9 | "double-press" : "ц", 10 | "double-press-shift-mode" : "Ц" 11 | }, { 12 | "key-code" : "KEYCODE_W", 13 | "single-press" : "у", 14 | "single-press-shift-mode" : "У" 15 | }, { 16 | "key-code" : "KEYCODE_E", 17 | "single-press" : "к", 18 | "single-press-shift-mode" : "К" 19 | }, { 20 | "key-code" : "KEYCODE_R", 21 | "single-press" : "е", 22 | "single-press-shift-mode" : "Е", 23 | "double-press" : "ë", 24 | "double-press-shift-mode" : "Ë" 25 | }, { 26 | "key-code" : "KEYCODE_T", 27 | "single-press" : "н", 28 | "single-press-shift-mode" : "Н" 29 | }, { 30 | "key-code" : "KEYCODE_Y", 31 | "single-press" : "г", 32 | "single-press-shift-mode" : "Г" 33 | }, { 34 | "key-code" : "KEYCODE_U", 35 | "single-press" : "ш", 36 | "single-press-shift-mode" : "Ш", 37 | "double-press" : "щ", 38 | "double-press-shift-mode" : "Щ" 39 | }, { 40 | "key-code" : "KEYCODE_I", 41 | "single-press" : "з", 42 | "single-press-shift-mode" : "З" 43 | }, { 44 | "key-code" : "KEYCODE_O", 45 | "single-press" : "х", 46 | "single-press-shift-mode" : "Х", 47 | "double-press" : "ъ", 48 | "double-press-shift-mode" : "Ъ" 49 | }, { 50 | "key-code" : "KEYCODE_P", 51 | "single-press" : "ю", 52 | "single-press-shift-mode" : "Ю" 53 | }, { 54 | "key-code" : "KEYCODE_A", 55 | "single-press" : "ф", 56 | "single-press-shift-mode" : "Ф", 57 | "double-press" : "ы", 58 | "double-press-shift-mode" : "Ы" 59 | }, { 60 | "key-code" : "KEYCODE_S", 61 | "single-press" : "в", 62 | "single-press-shift-mode" : "В" 63 | }, { 64 | "key-code" : "KEYCODE_D", 65 | "single-press" : "а", 66 | "single-press-shift-mode" : "А" 67 | }, { 68 | "key-code" : "KEYCODE_F", 69 | "single-press" : "п", 70 | "single-press-shift-mode" : "П" 71 | }, { 72 | "key-code" : "KEYCODE_G", 73 | "single-press" : "р", 74 | "single-press-shift-mode" : "Р" 75 | }, { 76 | "key-code" : "KEYCODE_H", 77 | "single-press" : "о", 78 | "single-press-shift-mode" : "О" 79 | }, { 80 | "key-code" : "KEYCODE_J", 81 | "single-press" : "л", 82 | "single-press-shift-mode" : "Л" 83 | }, { 84 | "key-code" : "KEYCODE_K", 85 | "single-press" : "д", 86 | "single-press-shift-mode" : "Д" 87 | }, { 88 | "key-code" : "KEYCODE_L", 89 | "single-press" : "ж", 90 | "single-press-shift-mode" : "Ж", 91 | "double-press" : "э", 92 | "double-press-shift-mode" : "Э" 93 | }, { 94 | "key-code" : "KEYCODE_Z", 95 | "single-press" : "я", 96 | "single-press-shift-mode" : "Я", 97 | "double-press" : "ч", 98 | "double-press-shift-mode" : "Ч" 99 | }, { 100 | "key-code" : "KEYCODE_X", 101 | "single-press" : "с", 102 | "single-press-shift-mode" : "С" 103 | }, { 104 | "key-code" : "KEYCODE_C", 105 | "single-press" : "м", 106 | "single-press-shift-mode" : "М" 107 | }, { 108 | "key-code" : "KEYCODE_V", 109 | "single-press" : "и", 110 | "single-press-shift-mode" : "И" 111 | }, { 112 | "key-code" : "KEYCODE_B", 113 | "single-press" : "т", 114 | "single-press-shift-mode" : "Т" 115 | }, { 116 | "key-code" : "KEYCODE_N", 117 | "single-press" : "ь", 118 | "single-press-shift-mode" : "Ь" 119 | }, { 120 | "key-code" : "KEYCODE_M", 121 | "single-press" : "б", 122 | "single-press-shift-mode" : "Б" 123 | } ] 124 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_titan/titan_russian_translit2_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Транслит kika", 3 | "alt-mode-layout" : "uhtz_titan/titan_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | { 7 | "key-code" : "KEYCODE_Q", 8 | "single-press" : "я", 9 | "single-press-shift-mode" : "Я" 10 | }, { 11 | "key-code" : "KEYCODE_W", 12 | "single-press" : "ш", 13 | "single-press-shift-mode" : "Ш", 14 | "double-press" : "щ", 15 | "double-press-shift-mode" : "Щ" 16 | }, { 17 | "key-code" : "KEYCODE_E", 18 | "single-press" : "е", 19 | "single-press-shift-mode" : "Е", 20 | "double-press" : "э", 21 | "double-press-shift-mode" : "Э" 22 | }, { 23 | "key-code" : "KEYCODE_R", 24 | "single-press" : "р", 25 | "single-press-shift-mode" : "Р" 26 | }, { 27 | "key-code" : "KEYCODE_T", 28 | "single-press" : "т", 29 | "single-press-shift-mode" : "Т" 30 | }, { 31 | "key-code" : "KEYCODE_Y", 32 | "single-press" : "ы", 33 | "single-press-shift-mode" : "Ы" 34 | }, { 35 | "key-code" : "KEYCODE_U", 36 | "single-press" : "у", 37 | "single-press-shift-mode" : "У", 38 | "double-press" : "ю", 39 | "double-press-shift-mode" : "Ю" 40 | }, { 41 | "key-code" : "KEYCODE_I", 42 | "single-press" : "и", 43 | "single-press-shift-mode" : "И", 44 | "double-press" : "й", 45 | "double-press-shift-mode" : "Й" 46 | }, { 47 | "key-code" : "KEYCODE_O", 48 | "single-press" : "о", 49 | "single-press-shift-mode" : "О", 50 | "double-press" : "ё", 51 | "double-press-shift-mode" : "Ё" 52 | }, { 53 | "key-code" : "KEYCODE_P", 54 | "single-press" : "п", 55 | "single-press-shift-mode" : "П" 56 | }, { 57 | "key-code" : "KEYCODE_A", 58 | "single-press" : "а", 59 | "single-press-shift-mode" : "А" 60 | }, { 61 | "key-code" : "KEYCODE_S", 62 | "single-press" : "с", 63 | "single-press-shift-mode" : "С" 64 | }, { 65 | "key-code" : "KEYCODE_D", 66 | "single-press" : "д", 67 | "single-press-shift-mode" : "Д" 68 | }, { 69 | "key-code" : "KEYCODE_F", 70 | "single-press" : "ф", 71 | "single-press-shift-mode" : "Ф" 72 | }, { 73 | "key-code" : "KEYCODE_G", 74 | "single-press" : "г", 75 | "single-press-shift-mode" : "Г" 76 | }, { 77 | "key-code" : "KEYCODE_H", 78 | "single-press" : "ч", 79 | "single-press-shift-mode" : "Ч" 80 | }, { 81 | "key-code" : "KEYCODE_J", 82 | "single-press" : "ь", 83 | "single-press-shift-mode" : "Ь", 84 | "double-press" : "ъ", 85 | "double-press-shift-mode" : "Ъ" 86 | }, { 87 | "key-code" : "KEYCODE_K", 88 | "single-press" : "к", 89 | "single-press-shift-mode" : "К" 90 | }, { 91 | "key-code" : "KEYCODE_L", 92 | "single-press" : "л", 93 | "single-press-shift-mode" : "Л" 94 | }, { 95 | "key-code" : "KEYCODE_Z", 96 | "single-press" : "ж", 97 | "single-press-shift-mode" : "Ж", 98 | "double-press" : "з", 99 | "double-press-shift-mode" : "З" 100 | }, { 101 | "key-code" : "KEYCODE_X", 102 | "single-press" : "х", 103 | "single-press-shift-mode" : "Х" 104 | }, { 105 | "key-code" : "KEYCODE_C", 106 | "single-press" : "ц", 107 | "single-press-shift-mode" : "Ц" 108 | }, { 109 | "key-code" : "KEYCODE_V", 110 | "single-press" : "в", 111 | "single-press-shift-mode" : "В" 112 | }, { 113 | "key-code" : "KEYCODE_B", 114 | "single-press" : "б", 115 | "single-press-shift-mode" : "Б" 116 | }, { 117 | "key-code" : "KEYCODE_N", 118 | "single-press" : "н", 119 | "single-press-shift-mode" : "Н" 120 | }, { 121 | "key-code" : "KEYCODE_M", 122 | "single-press" : "м", 123 | "single-press-shift-mode" : "М" 124 | } ] 125 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_titan/titan_russian_translit_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "uhtz_titan/titan_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ 6 | { 7 | "key-code" : "KEYCODE_Q", 8 | "single-press" : "я", 9 | "single-press-shift-mode" : "Я" 10 | }, { 11 | "key-code" : "KEYCODE_W", 12 | "single-press" : "ш", 13 | "single-press-shift-mode" : "Ш", 14 | "double-press" : "щ", 15 | "double-press-shift-mode" : "Щ" 16 | }, { 17 | "key-code" : "KEYCODE_E", 18 | "single-press" : "е", 19 | "single-press-shift-mode" : "Е", 20 | "double-press" : "э", 21 | "double-press-shift-mode" : "Э" 22 | }, { 23 | "key-code" : "KEYCODE_R", 24 | "single-press" : "р", 25 | "single-press-shift-mode" : "Р" 26 | }, { 27 | "key-code" : "KEYCODE_T", 28 | "single-press" : "т", 29 | "single-press-shift-mode" : "Т" 30 | }, { 31 | "key-code" : "KEYCODE_Y", 32 | "single-press" : "ы", 33 | "single-press-shift-mode" : "Ы" 34 | }, { 35 | "key-code" : "KEYCODE_U", 36 | "single-press" : "у", 37 | "single-press-shift-mode" : "У", 38 | "double-press" : "ю", 39 | "double-press-shift-mode" : "Ю" 40 | }, { 41 | "key-code" : "KEYCODE_I", 42 | "single-press" : "и", 43 | "single-press-shift-mode" : "И", 44 | "double-press" : "й", 45 | "double-press-shift-mode" : "Й" 46 | }, { 47 | "key-code" : "KEYCODE_O", 48 | "single-press" : "о", 49 | "single-press-shift-mode" : "О", 50 | "double-press" : "ё", 51 | "double-press-shift-mode" : "Ё" 52 | }, { 53 | "key-code" : "KEYCODE_P", 54 | "single-press" : "п", 55 | "single-press-shift-mode" : "П" 56 | }, { 57 | "key-code" : "KEYCODE_A", 58 | "single-press" : "а", 59 | "single-press-shift-mode" : "А" 60 | }, { 61 | "key-code" : "KEYCODE_S", 62 | "single-press" : "с", 63 | "single-press-shift-mode" : "С" 64 | }, { 65 | "key-code" : "KEYCODE_D", 66 | "single-press" : "д", 67 | "single-press-shift-mode" : "Д" 68 | }, { 69 | "key-code" : "KEYCODE_F", 70 | "single-press" : "ф", 71 | "single-press-shift-mode" : "Ф" 72 | }, { 73 | "key-code" : "KEYCODE_G", 74 | "single-press" : "г", 75 | "single-press-shift-mode" : "Г" 76 | }, { 77 | "key-code" : "KEYCODE_H", 78 | "single-press" : "х", 79 | "single-press-shift-mode" : "Х" 80 | }, { 81 | "key-code" : "KEYCODE_J", 82 | "single-press" : "ж", 83 | "single-press-shift-mode" : "Ж" 84 | }, { 85 | "key-code" : "KEYCODE_K", 86 | "single-press" : "к", 87 | "single-press-shift-mode" : "К" 88 | }, { 89 | "key-code" : "KEYCODE_L", 90 | "single-press" : "л", 91 | "single-press-shift-mode" : "Л" 92 | }, { 93 | "key-code" : "KEYCODE_Z", 94 | "single-press" : "з", 95 | "single-press-shift-mode" : "З" 96 | }, { 97 | "key-code" : "KEYCODE_X", 98 | "single-press" : "ь", 99 | "single-press-shift-mode" : "Ь", 100 | "double-press" : "ъ", 101 | "double-press-shift-mode" : "Ъ" 102 | }, { 103 | "key-code" : "KEYCODE_C", 104 | "single-press" : "ц", 105 | "single-press-shift-mode" : "Ц", 106 | "double-press" : "ч", 107 | "double-press-shift-mode" : "Ч" 108 | }, { 109 | "key-code" : "KEYCODE_V", 110 | "single-press" : "в", 111 | "single-press-shift-mode" : "В" 112 | }, { 113 | "key-code" : "KEYCODE_B", 114 | "single-press" : "б", 115 | "single-press-shift-mode" : "Б" 116 | }, { 117 | "key-code" : "KEYCODE_N", 118 | "single-press" : "н", 119 | "single-press-shift-mode" : "Н" 120 | }, { 121 | "key-code" : "KEYCODE_M", 122 | "single-press" : "м", 123 | "single-press-shift-mode" : "М" 124 | } ] 125 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_titan/titan_russian_zynaps_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Русский", 3 | "alt-mode-layout" : "uhtz_titan/titan_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ { }, { 6 | "key-code" : "KEYCODE_Q", 7 | "single-press" : "й", 8 | "single-press-shift-mode" : "Й" 9 | }, { 10 | "key-code" : "KEYCODE_W", 11 | "single-press" : "ц", 12 | "single-press-shift-mode" : "Ц" 13 | }, { 14 | "key-code" : "KEYCODE_E", 15 | "single-press" : "у", 16 | "single-press-shift-mode" : "У" 17 | }, { 18 | "key-code" : "KEYCODE_R", 19 | "single-press" : "к", 20 | "single-press-shift-mode" : "К" 21 | }, { 22 | "key-code" : "KEYCODE_T", 23 | "single-press" : "е", 24 | "single-press-shift-mode" : "Е", 25 | "double-press" : "ё", 26 | "double-press-shift-mode" : "Ё" 27 | }, { 28 | "key-code" : "KEYCODE_Y", 29 | "single-press" : "н", 30 | "single-press-shift-mode" : "Н" 31 | }, { 32 | "key-code" : "KEYCODE_U", 33 | "single-press" : "г", 34 | "single-press-shift-mode" : "Г" 35 | }, { 36 | "key-code" : "KEYCODE_I", 37 | "single-press" : "ш", 38 | "single-press-shift-mode" : "Ш", 39 | "double-press" : "щ", 40 | "double-press-shift-mode" : "Щ" 41 | }, { 42 | "key-code" : "KEYCODE_O", 43 | "single-press" : "з", 44 | "single-press-shift-mode" : "З" 45 | }, { 46 | "key-code" : "KEYCODE_P", 47 | "single-press" : "х", 48 | "single-press-shift-mode" : "Х", 49 | "double-press" : "ъ", 50 | "double-press-shift-mode" : "Ъ" 51 | }, { 52 | "key-code" : "KEYCODE_A", 53 | "single-press" : "ы", 54 | "single-press-shift-mode" : "Ы", 55 | "double-press" : "ф", 56 | "double-press-shift-mode" : "Ф" 57 | }, { 58 | "key-code" : "KEYCODE_S", 59 | "single-press" : "в", 60 | "single-press-shift-mode" : "В" 61 | }, { 62 | "key-code" : "KEYCODE_D", 63 | "single-press" : "а", 64 | "single-press-shift-mode" : "А" 65 | }, { 66 | "key-code" : "KEYCODE_F", 67 | "single-press" : "п", 68 | "single-press-shift-mode" : "П" 69 | }, { 70 | "key-code" : "KEYCODE_G", 71 | "single-press" : "р", 72 | "single-press-shift-mode" : "Р" 73 | }, { 74 | "key-code" : "KEYCODE_H", 75 | "single-press" : "о", 76 | "single-press-shift-mode" : "О" 77 | }, { 78 | "key-code" : "KEYCODE_J", 79 | "single-press" : "л", 80 | "single-press-shift-mode" : "Л" 81 | }, { 82 | "key-code" : "KEYCODE_K", 83 | "single-press" : "д", 84 | "single-press-shift-mode" : "Д" 85 | }, { 86 | "key-code" : "KEYCODE_L", 87 | "single-press" : "ж", 88 | "single-press-shift-mode" : "Ж", 89 | "double-press" : "э", 90 | "double-press-shift-mode" : "Э" 91 | }, { 92 | "key-code" : "KEYCODE_Z", 93 | "single-press" : "ч", 94 | "single-press-shift-mode" : "Ч", 95 | "double-press" : "я", 96 | "double-press-shift-mode" : "Я" 97 | }, { 98 | "key-code" : "KEYCODE_X", 99 | "single-press" : "с", 100 | "single-press-shift-mode" : "С" 101 | }, { 102 | "key-code" : "KEYCODE_C", 103 | "single-press" : "м", 104 | "single-press-shift-mode" : "М" 105 | }, { 106 | "key-code" : "KEYCODE_V", 107 | "single-press" : "и", 108 | "single-press-shift-mode" : "И" 109 | }, { 110 | "key-code" : "KEYCODE_B", 111 | "single-press" : "т", 112 | "single-press-shift-mode" : "Т" 113 | }, { 114 | "key-code" : "KEYCODE_N", 115 | "single-press" : "ь", 116 | "single-press-shift-mode" : "Ь" 117 | }, { 118 | "key-code" : "KEYCODE_M", 119 | "single-press" : "б", 120 | "single-press-shift-mode" : "Б", 121 | "double-press" : "ю", 122 | "double-press-shift-mode" : "Ю" 123 | } ] 124 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_titan/titan_ukranian_kika_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Украинский", 3 | "alt-mode-layout" : "uhtz_titan/titan_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ { }, { 6 | "key-code" : "KEYCODE_Q", 7 | "single-press" : "й", 8 | "single-press-shift-mode" : "Й", 9 | "double-press" : "ц", 10 | "double-press-shift-mode" : "Ц" 11 | }, { 12 | "key-code" : "KEYCODE_W", 13 | "single-press" : "у", 14 | "single-press-shift-mode" : "У" 15 | }, { 16 | "key-code" : "KEYCODE_E", 17 | "single-press" : "к", 18 | "single-press-shift-mode" : "К" 19 | }, { 20 | "key-code" : "KEYCODE_R", 21 | "single-press" : "е", 22 | "single-press-shift-mode" : "Е" 23 | }, { 24 | "key-code" : "KEYCODE_T", 25 | "single-press" : "н", 26 | "single-press-shift-mode" : "Н" 27 | }, { 28 | "key-code" : "KEYCODE_Y", 29 | "single-press" : "г", 30 | "single-press-shift-mode" : "Г" 31 | }, { 32 | "key-code" : "KEYCODE_U", 33 | "single-press" : "ш", 34 | "single-press-shift-mode" : "Ш", 35 | "double-press" : "щ", 36 | "double-press-shift-mode" : "Щ" 37 | }, { 38 | "key-code" : "KEYCODE_I", 39 | "single-press" : "з", 40 | "single-press-shift-mode" : "З" 41 | }, { 42 | "key-code" : "KEYCODE_O", 43 | "single-press" : "х", 44 | "single-press-shift-mode" : "Х" 45 | }, { 46 | "key-code" : "KEYCODE_P", 47 | "single-press" : "ю", 48 | "single-press-shift-mode" : "Ю", 49 | "double-press" : "ї", 50 | "double-press-shift-mode" : "Ї" 51 | }, { 52 | "key-code" : "KEYCODE_A", 53 | "single-press" : "і", 54 | "single-press-shift-mode" : "І", 55 | "double-press" : "ф", 56 | "double-press-shift-mode" : "Ф" 57 | }, { 58 | "key-code" : "KEYCODE_S", 59 | "single-press" : "в", 60 | "single-press-shift-mode" : "В" 61 | }, { 62 | "key-code" : "KEYCODE_D", 63 | "single-press" : "а", 64 | "single-press-shift-mode" : "А" 65 | }, { 66 | "key-code" : "KEYCODE_F", 67 | "single-press" : "п", 68 | "single-press-shift-mode" : "П" 69 | }, { 70 | "key-code" : "KEYCODE_G", 71 | "single-press" : "р", 72 | "single-press-shift-mode" : "Р" 73 | }, { 74 | "key-code" : "KEYCODE_H", 75 | "single-press" : "о", 76 | "single-press-shift-mode" : "О" 77 | }, { 78 | "key-code" : "KEYCODE_J", 79 | "single-press" : "л", 80 | "single-press-shift-mode" : "Л" 81 | }, { 82 | "key-code" : "KEYCODE_K", 83 | "single-press" : "д", 84 | "single-press-shift-mode" : "Д" 85 | }, { 86 | "key-code" : "KEYCODE_L", 87 | "single-press" : "ж", 88 | "single-press-shift-mode" : "Ж", 89 | "double-press" : "є", 90 | "double-press-shift-mode" : "Є" 91 | }, { 92 | "key-code" : "KEYCODE_Z", 93 | "single-press" : "я", 94 | "single-press-shift-mode" : "Я", 95 | "double-press" : "ч", 96 | "double-press-shift-mode" : "Ч" 97 | }, { 98 | "key-code" : "KEYCODE_X", 99 | "single-press" : "с", 100 | "single-press-shift-mode" : "С" 101 | }, { 102 | "key-code" : "KEYCODE_C", 103 | "single-press" : "м", 104 | "single-press-shift-mode" : "М" 105 | }, { 106 | "key-code" : "KEYCODE_V", 107 | "single-press" : "и", 108 | "single-press-shift-mode" : "И" 109 | }, { 110 | "key-code" : "KEYCODE_B", 111 | "single-press" : "т", 112 | "single-press-shift-mode" : "Т" 113 | }, { 114 | "key-code" : "KEYCODE_N", 115 | "single-press" : "ь", 116 | "single-press-shift-mode" : "Ь" 117 | }, { 118 | "key-code" : "KEYCODE_M", 119 | "single-press" : "б", 120 | "single-press-shift-mode" : "Б" 121 | } ] 122 | } -------------------------------------------------------------------------------- /app/src/main/assets/uhtz_titan/titan_ukranian_zynaps_hw.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard-name" : "Украинский", 3 | "alt-mode-layout" : "uhtz_titan/titan_alt_hw", 4 | "sym-mode-layout" : "pocket_symbol", 5 | "key-mapping" : [ { }, { 6 | "key-code" : "KEYCODE_Q", 7 | "single-press" : "й", 8 | "single-press-shift-mode" : "Й" 9 | }, { 10 | "key-code" : "KEYCODE_W", 11 | "single-press" : "ц", 12 | "single-press-shift-mode" : "Ц" 13 | }, { 14 | "key-code" : "KEYCODE_E", 15 | "single-press" : "у", 16 | "single-press-shift-mode" : "У" 17 | }, { 18 | "key-code" : "KEYCODE_R", 19 | "single-press" : "к", 20 | "single-press-shift-mode" : "К" 21 | }, { 22 | "key-code" : "KEYCODE_T", 23 | "single-press" : "е", 24 | "single-press-shift-mode" : "Е" 25 | }, { 26 | "key-code" : "KEYCODE_Y", 27 | "single-press" : "н", 28 | "single-press-shift-mode" : "Н" 29 | }, { 30 | "key-code" : "KEYCODE_U", 31 | "single-press" : "г", 32 | "single-press-shift-mode" : "Г" 33 | }, { 34 | "key-code" : "KEYCODE_I", 35 | "single-press" : "ш", 36 | "single-press-shift-mode" : "Ш", 37 | "double-press" : "щ", 38 | "double-press-shift-mode" : "Щ" 39 | }, { 40 | "key-code" : "KEYCODE_O", 41 | "single-press" : "з", 42 | "single-press-shift-mode" : "З" 43 | }, { 44 | "key-code" : "KEYCODE_P", 45 | "single-press" : "х", 46 | "single-press-shift-mode" : "Х", 47 | "double-press" : "ї", 48 | "double-press-shift-mode" : "Ї" 49 | }, { 50 | "key-code" : "KEYCODE_A", 51 | "single-press" : "і", 52 | "single-press-shift-mode" : "І", 53 | "double-press" : "ф", 54 | "double-press-shift-mode" : "Ф" 55 | }, { 56 | "key-code" : "KEYCODE_S", 57 | "single-press" : "в", 58 | "single-press-shift-mode" : "В" 59 | }, { 60 | "key-code" : "KEYCODE_D", 61 | "single-press" : "а", 62 | "single-press-shift-mode" : "А" 63 | }, { 64 | "key-code" : "KEYCODE_F", 65 | "single-press" : "п", 66 | "single-press-shift-mode" : "П" 67 | }, { 68 | "key-code" : "KEYCODE_G", 69 | "single-press" : "р", 70 | "single-press-shift-mode" : "Р" 71 | }, { 72 | "key-code" : "KEYCODE_H", 73 | "single-press" : "о", 74 | "single-press-shift-mode" : "О" 75 | }, { 76 | "key-code" : "KEYCODE_J", 77 | "single-press" : "л", 78 | "single-press-shift-mode" : "Л" 79 | }, { 80 | "key-code" : "KEYCODE_K", 81 | "single-press" : "д", 82 | "single-press-shift-mode" : "Д" 83 | }, { 84 | "key-code" : "KEYCODE_L", 85 | "single-press" : "ж", 86 | "single-press-shift-mode" : "Ж", 87 | "double-press" : "є", 88 | "double-press-shift-mode" : "Є" 89 | }, { 90 | "key-code" : "KEYCODE_Z", 91 | "single-press" : "ч", 92 | "single-press-shift-mode" : "Ч", 93 | "double-press" : "я", 94 | "double-press-shift-mode" : "Я" 95 | }, { 96 | "key-code" : "KEYCODE_X", 97 | "single-press" : "с", 98 | "single-press-shift-mode" : "С" 99 | }, { 100 | "key-code" : "KEYCODE_C", 101 | "single-press" : "м", 102 | "single-press-shift-mode" : "М" 103 | }, { 104 | "key-code" : "KEYCODE_V", 105 | "single-press" : "и", 106 | "single-press-shift-mode" : "И" 107 | }, { 108 | "key-code" : "KEYCODE_B", 109 | "single-press" : "т", 110 | "single-press-shift-mode" : "Т" 111 | }, { 112 | "key-code" : "KEYCODE_N", 113 | "single-press" : "ь", 114 | "single-press-shift-mode" : "Ь" 115 | }, { 116 | "key-code" : "KEYCODE_M", 117 | "single-press" : "б", 118 | "single-press-shift-mode" : "Б", 119 | "double-press" : "ю", 120 | "double-press-shift-mode" : "Ю" 121 | } ] 122 | } -------------------------------------------------------------------------------- /app/src/main/java/com/google/android/voiceime/ActivityHelper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2011 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.google.android.voiceime; 18 | 19 | import android.app.Activity; 20 | import android.app.AlertDialog; 21 | import android.app.Dialog; 22 | import android.content.DialogInterface; 23 | import android.content.Intent; 24 | import android.os.Build; 25 | import android.os.Bundle; 26 | import android.speech.RecognizerIntent; 27 | 28 | import java.util.ArrayList; 29 | 30 | /** 31 | * Helper activity used for triggering the Intent recognition, and for collecting the results. 32 | */ 33 | public class ActivityHelper extends Activity { 34 | 35 | @SuppressWarnings("unused") 36 | private static final String TAG = "ActivityHelper"; 37 | 38 | private static final int RECOGNITION_REQUEST = 1; 39 | 40 | private ServiceBridge mServiceBridge; 41 | 42 | @Override 43 | protected void onCreate(Bundle bundle) { 44 | super.onCreate(bundle); 45 | 46 | mServiceBridge = new ServiceBridge(); 47 | 48 | Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 49 | intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName()); 50 | intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 51 | RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 52 | intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5); 53 | 54 | // Specify the recognition language if provided. 55 | if (bundle != null) { 56 | String languageLocale = bundle.getString(RecognizerIntent.EXTRA_LANGUAGE); 57 | if (languageLocale != null) { 58 | intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, languageLocale); 59 | } 60 | } 61 | startActivityForResult(intent, RECOGNITION_REQUEST); 62 | } 63 | 64 | @Override 65 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 66 | if (requestCode == RECOGNITION_REQUEST && data != null 67 | && data.hasExtra(RecognizerIntent.EXTRA_RESULTS)) { 68 | ArrayList results = data 69 | .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 70 | createResultDialog(results.toArray(new String[results.size()])).show(); 71 | } else { 72 | notifyResult(null); 73 | } 74 | } 75 | 76 | private Dialog createResultDialog(final String[] recognitionResults) { 77 | AlertDialog.Builder builder; 78 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 79 | builder = new AlertDialog.Builder(this); 80 | } else { 81 | builder = new AlertDialog.Builder(this, 82 | android.R.style.Theme_Holo_Dialog_NoActionBar); 83 | } 84 | 85 | builder.setItems(recognitionResults, new DialogInterface.OnClickListener() { 86 | 87 | @Override 88 | public void onClick(DialogInterface dialog, int which) { 89 | notifyResult(recognitionResults[which]); 90 | } 91 | }); 92 | 93 | builder.setCancelable(true); 94 | builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 95 | 96 | @Override 97 | public void onCancel(DialogInterface dialog) { 98 | notifyResult(null); 99 | } 100 | }); 101 | 102 | builder.setNeutralButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 103 | 104 | @Override 105 | public void onClick(DialogInterface dialog, int which) { 106 | notifyResult(null); 107 | } 108 | }); 109 | 110 | return builder.create(); 111 | } 112 | 113 | private void notifyResult(String result) { 114 | mServiceBridge.notifyResult(this, result); 115 | finish(); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /app/src/main/java/com/google/android/voiceime/ITrigger.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2011 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.google.android.voiceime; 18 | 19 | /** 20 | * Triggers a voice recognition. 21 | */ 22 | interface ITrigger { 23 | 24 | /** 25 | * Start a voice recognition. 26 | * 27 | * @param language The voice recognition language. 28 | */ 29 | public abstract void startVoiceRecognition(String language); 30 | 31 | /** 32 | * Notifies that the calling IME started. 33 | */ 34 | public abstract void onStartInputView(); 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/google/android/voiceime/ImeTrigger.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2011 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.google.android.voiceime; 18 | 19 | import android.content.Context; 20 | import android.inputmethodservice.InputMethodService; 21 | import android.os.Build; 22 | import android.view.inputmethod.InputMethodInfo; 23 | import android.view.inputmethod.InputMethodManager; 24 | import android.view.inputmethod.InputMethodSubtype; 25 | 26 | import java.util.List; 27 | import java.util.Map; 28 | 29 | /** 30 | * Triggers a voice recognition using Google voice typing. 31 | */ 32 | class ImeTrigger implements ITrigger { 33 | 34 | private static final String VOICE_IME_SUBTYPE_MODE = "voice"; 35 | 36 | private static final String VOICE_IME_PACKAGE_PREFIX = "com.google.android"; 37 | 38 | private final InputMethodService mInputMethodService; 39 | 40 | public ImeTrigger(InputMethodService inputMethodService) { 41 | mInputMethodService = inputMethodService; 42 | } 43 | 44 | /** 45 | * Switches to Voice IME. 46 | */ 47 | @Override 48 | public void startVoiceRecognition(String language) { 49 | InputMethodManager inputMethodManager = getInputMethodManager(mInputMethodService); 50 | 51 | InputMethodInfo inputMethodInfo = getVoiceImeInputMethodInfo(inputMethodManager); 52 | 53 | if (inputMethodInfo == null) { 54 | return; 55 | } 56 | 57 | inputMethodManager.setInputMethodAndSubtype(mInputMethodService.getWindow().getWindow() 58 | .getAttributes().token, 59 | inputMethodInfo.getId(), 60 | getVoiceImeSubtype(inputMethodManager, inputMethodInfo)); 61 | } 62 | 63 | private static InputMethodManager getInputMethodManager(InputMethodService inputMethodService) { 64 | return (InputMethodManager) inputMethodService 65 | .getSystemService(Context.INPUT_METHOD_SERVICE); 66 | } 67 | 68 | private InputMethodSubtype getVoiceImeSubtype( 69 | InputMethodManager inputMethodManager, InputMethodInfo inputMethodInfo) 70 | throws SecurityException, 71 | IllegalArgumentException { 72 | Map> map = inputMethodManager 73 | .getShortcutInputMethodsAndSubtypes(); 74 | List list = map.get(inputMethodInfo); 75 | if (list != null && list.size() > 0) { 76 | return list.get(0); 77 | } else { 78 | return null; 79 | } 80 | } 81 | 82 | private static InputMethodInfo getVoiceImeInputMethodInfo(InputMethodManager inputMethodManager) 83 | throws SecurityException, IllegalArgumentException { 84 | for (InputMethodInfo inputMethodInfo : inputMethodManager.getEnabledInputMethodList()) { 85 | for (int i = 0; i < inputMethodInfo.getSubtypeCount(); i++) { 86 | InputMethodSubtype subtype = inputMethodInfo.getSubtypeAt(i); 87 | if (VOICE_IME_SUBTYPE_MODE.equals(subtype.getMode())) { 88 | if (inputMethodInfo.getComponent().getPackageName() 89 | .startsWith(VOICE_IME_PACKAGE_PREFIX)) { 90 | return inputMethodInfo; 91 | } 92 | } 93 | } 94 | } 95 | return null; 96 | } 97 | 98 | /** 99 | * Returns true if an implementation of Voice IME is installed. 100 | */ 101 | public static boolean isInstalled(InputMethodService inputMethodService) { 102 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 103 | return false; 104 | } 105 | 106 | InputMethodInfo inputMethodInfo = getVoiceImeInputMethodInfo( 107 | getInputMethodManager(inputMethodService)); 108 | 109 | if (inputMethodInfo == null) { 110 | return false; 111 | } 112 | 113 | return inputMethodInfo.getSubtypeCount() > 0; 114 | } 115 | 116 | @Override 117 | public void onStartInputView() { 118 | // Empty. Voice IME pastes the recognition result directly into the text 119 | // view 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /app/src/main/java/com/google/android/voiceime/ServiceBridge.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2011 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.google.android.voiceime; 18 | 19 | import android.content.ComponentName; 20 | import android.content.Context; 21 | import android.content.Intent; 22 | import android.content.ServiceConnection; 23 | import android.os.IBinder; 24 | 25 | /** 26 | * Handles the connection, and the method call, and the call backs between the IME and the activity. 27 | */ 28 | class ServiceBridge { 29 | 30 | @SuppressWarnings("unused") 31 | private static final String TAG = "ServiceBridge"; 32 | 33 | private final IntentApiTrigger.Callback mCallback; 34 | 35 | public ServiceBridge() { 36 | this(null); 37 | } 38 | 39 | public ServiceBridge(IntentApiTrigger.Callback callback) { 40 | mCallback = callback; 41 | } 42 | 43 | /** 44 | * Start a voice search recognition. 45 | */ 46 | public void startVoiceRecognition(final Context context, final String languageCode) { 47 | final ConnectionRequest conReq = new ConnectionRequest(languageCode); 48 | conReq.setServiceCallback(new ServiceHelper.Callback() { 49 | 50 | @Override 51 | public void onResult(final String recognitionResult) { 52 | mCallback.onRecognitionResult(recognitionResult); 53 | context.unbindService(conReq); 54 | } 55 | }); 56 | 57 | context.bindService(new Intent(context, 58 | ServiceHelper.class), conReq, Context.BIND_AUTO_CREATE); 59 | } 60 | 61 | public void notifyResult(Context context, String recognitionResult) { 62 | ServiceConnection conn = new ConnectionResponse(context, recognitionResult); 63 | context.bindService(new Intent(context, 64 | ServiceHelper.class), conn, Context.BIND_AUTO_CREATE); 65 | } 66 | 67 | /** 68 | * Service connection for requesting a recognition. 69 | */ 70 | private class ConnectionRequest implements ServiceConnection { 71 | 72 | private final String mLanguageCode; 73 | 74 | private ServiceHelper.Callback mServiceCallback; 75 | 76 | private ConnectionRequest(String languageCode) { 77 | mLanguageCode = languageCode; 78 | } 79 | 80 | private void setServiceCallback(ServiceHelper.Callback callback) { 81 | mServiceCallback = callback; 82 | } 83 | 84 | @Override 85 | public void onServiceConnected(ComponentName className, IBinder service) { 86 | ServiceHelper serviceHelper = 87 | ((ServiceHelper.ServiceHelperBinder) service).getService(); 88 | serviceHelper.startRecognition(mLanguageCode, mServiceCallback); 89 | } 90 | 91 | @Override 92 | public void onServiceDisconnected(ComponentName className) { 93 | // Empty 94 | } 95 | } 96 | 97 | /** 98 | * Service connection for notifying a recognition result. 99 | */ 100 | private class ConnectionResponse implements ServiceConnection { 101 | 102 | private final String mRecognitionResult; 103 | private final Context mContext; 104 | 105 | private ConnectionResponse(Context context, String recognitionResult) { 106 | mRecognitionResult = recognitionResult; 107 | mContext = context; 108 | } 109 | 110 | @Override 111 | public void onServiceDisconnected(ComponentName name) { 112 | // Empty 113 | } 114 | 115 | @Override 116 | public void onServiceConnected(ComponentName name, IBinder service) { 117 | ServiceHelper serviceHelper = 118 | ((ServiceHelper.ServiceHelperBinder) service).getService(); 119 | serviceHelper.notifyResult(mRecognitionResult); 120 | mContext.unbindService(this); 121 | } 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /app/src/main/java/com/google/android/voiceime/ServiceHelper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2011 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.google.android.voiceime; 18 | 19 | import android.app.Service; 20 | import android.content.Intent; 21 | import android.os.Binder; 22 | import android.os.IBinder; 23 | import android.util.Log; 24 | 25 | /** 26 | * Service helper that connects the IME with the activity that triggers the recognition 27 | * and that will receive the recognition result. 28 | */ 29 | public class ServiceHelper extends Service { 30 | 31 | private static final String TAG = "ServiceHelper"; 32 | 33 | private final IBinder mBinder = new ServiceHelperBinder(); 34 | 35 | private Callback mCallback; 36 | 37 | @Override 38 | public IBinder onBind(Intent arg0) { 39 | return mBinder; 40 | } 41 | 42 | @Override 43 | public void onCreate() { 44 | super.onCreate(); 45 | Log.i(TAG, "#onCreate"); 46 | } 47 | 48 | @Override 49 | public void onDestroy() { 50 | super.onDestroy(); 51 | Log.i(TAG, "#onDestroy"); 52 | } 53 | 54 | public void startRecognition(String languageLocale, Callback callback) { 55 | Log.i(TAG, "#startRecognition"); 56 | mCallback = callback; 57 | Intent intent = new Intent(this, ActivityHelper.class); 58 | intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 59 | startActivity(intent); 60 | } 61 | 62 | public void notifyResult(String recognitionResult) { 63 | if (mCallback != null) { 64 | mCallback.onResult(recognitionResult); 65 | } 66 | } 67 | 68 | public interface Callback { 69 | void onResult(String recognitionResult); 70 | } 71 | 72 | public class ServiceHelperBinder extends Binder { 73 | ServiceHelper getService() { 74 | return ServiceHelper.this; 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/sateda/keyonekb2/IntentNotifications.java: -------------------------------------------------------------------------------- 1 | package com.sateda.keyonekb2; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | public class IntentNotifications extends AppCompatActivity { 7 | 8 | public static final String ACTION = "com.sateda.keyonekb2.IntentNotifications"; 9 | 10 | /** 11 | * Called when the activity is first created. 12 | */ 13 | @Override 14 | public void onCreate(Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | 17 | if (KeyoneKb2AccessibilityService.Instance != null) 18 | KeyoneKb2AccessibilityService.Instance.IntentNotifications(); 19 | 20 | finish(); 21 | } 22 | 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/sateda/keyonekb2/IntentQuickSettings.java: -------------------------------------------------------------------------------- 1 | package com.sateda.keyonekb2; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | public class IntentQuickSettings extends AppCompatActivity { 7 | 8 | public static final String ACTION = "com.sateda.keyonekb2.IntentQuickSettings"; 9 | 10 | /** Called when the activity is first created. */ 11 | @Override 12 | public void onCreate(Bundle savedInstanceState) { 13 | super.onCreate(savedInstanceState); 14 | //final Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS); 15 | //final Intent intent = new Intent(Settings.System.); 16 | //sendBroadcast(); 17 | 18 | if(KeyoneKb2AccessibilityService.Instance != null) 19 | KeyoneKb2AccessibilityService.Instance.IntentQuickSettings(); 20 | 21 | 22 | //startActivity(intent); 23 | finish(); 24 | } 25 | 26 | 27 | } 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/sateda/keyonekb2/KeyboardLayout.java: -------------------------------------------------------------------------------- 1 | package com.sateda.keyonekb2; 2 | 3 | import android.view.View; 4 | import com.fasterxml.jackson.annotation.JsonProperty; 5 | 6 | import java.util.Collection; 7 | 8 | 9 | public class KeyboardLayout { 10 | 11 | @JsonProperty(index=10) 12 | public String KeyboardName = ""; 13 | 14 | @JsonProperty(index=20) 15 | public String AltModeLayout = ""; 16 | 17 | @JsonProperty(index=30) 18 | public String SymModeLayout = ""; 19 | public int SymXmlId = 0; 20 | 21 | public KeyboardLayoutOptions Resources; 22 | 23 | @JsonProperty(index=40) 24 | public Collection KeyMapping; 25 | 26 | public static class KeyVariants { 27 | @JsonProperty(index=10) 28 | public String KeyCode = null; 29 | public int KeyCodeInt = 0; 30 | @JsonProperty(index=20) 31 | public Character SinglePress = null; 32 | @JsonProperty(index=30) 33 | public Character SinglePressShiftMode = null; 34 | @JsonProperty(index=40) 35 | public Character DoublePress = null; 36 | @JsonProperty(index=50) 37 | public Character DoublePressShiftMode = null; 38 | @JsonProperty(index=60) 39 | public Character SinglePressAltMode = null; 40 | @JsonProperty(index=70) 41 | public Character SinglePressAltShiftMode = null; 42 | @JsonProperty(index=80) 43 | public String AltMoreVariants = null; 44 | } 45 | 46 | public static class KeyboardLayoutOptions { 47 | 48 | public static class IconRes { 49 | int MipmapResId; 50 | int DrawableResId; 51 | } 52 | 53 | public static IconRes CreateIconRes(int mipmapResId, int drawableResId) { 54 | IconRes res = new IconRes(); 55 | res.MipmapResId = mipmapResId; 56 | res.DrawableResId = drawableResId; 57 | return res; 58 | } 59 | 60 | @JsonProperty(index=10) 61 | String OptionsName; 62 | @JsonProperty(index=20) 63 | String KeyboardMapping; 64 | @JsonProperty(index=30) 65 | String IconLowercase; 66 | IconRes IconLowercaseRes; 67 | @JsonProperty(index=40) 68 | String IconFirstShift; 69 | IconRes IconFirstShiftRes; 70 | @JsonProperty(index=50) 71 | String IconCapslock; 72 | IconRes IconCapsRes; 73 | @JsonProperty(index=55) 74 | String Flag; 75 | int FlagResId; 76 | @JsonProperty(index=60) 77 | String CustomKeyboardMechanics; 78 | 79 | @JsonProperty(index=70) 80 | String DeviceModelRegexp; 81 | 82 | int id = 0; 83 | 84 | public KeyboardLayoutOptions() { 85 | IconCapsRes = new IconRes(); 86 | IconFirstShiftRes = new IconRes(); 87 | IconLowercaseRes = new IconRes(); 88 | } 89 | 90 | String getPreferenceName() { 91 | return "GENERATED_PREF_KEYBOARD_LAYOUT_" + KeyboardMapping; 92 | } 93 | 94 | int getId() { 95 | if(id == 0) { 96 | id = View.generateViewId(); 97 | } 98 | return id; 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /app/src/main/java/com/sateda/keyonekb2/SatedaKeyboard.java: -------------------------------------------------------------------------------- 1 | package com.sateda.keyonekb2; 2 | 3 | import android.content.Context; 4 | import android.content.res.Resources; 5 | import android.content.res.XmlResourceParser; 6 | import android.inputmethodservice.Keyboard; 7 | 8 | public class SatedaKeyboard extends Keyboard { 9 | 10 | private int currentHeight; 11 | 12 | public SatedaKeyboard(Context context, int xmlLayoutResId, int pref_swipe_panel_height) { 13 | super(context, xmlLayoutResId); 14 | currentHeight = ViewSatedaKeyboard.BASE_HEIGHT + pref_swipe_panel_height * 10; 15 | } 16 | 17 | @Override 18 | public int getHeight() { 19 | return currentHeight; 20 | } 21 | 22 | @Override 23 | protected Key createKeyFromXml(Resources res, Row parent, int x, int y, 24 | XmlResourceParser parser) { 25 | Key key = new Key(res, parent, x, y, parser); 26 | 27 | return key; 28 | } 29 | 30 | public void changeKeyHeight(double height_modifier) 31 | { 32 | int height = 0; 33 | for(Keyboard.Key key : getKeys()) { 34 | key.height *= height_modifier; 35 | key.y *= height_modifier; 36 | height = key.height; 37 | } 38 | setKeyHeight(height); 39 | getNearestKeys(0, 0); //somehow adding this fixed a weird bug where bottom row keys could not be pressed if keyboard height is too tall.. from the Keyboard source code seems like calling this will recalculate some values used in keypress detection calculation 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/sateda/keyonekb2/ViewPopupScreenKeyboard.java: -------------------------------------------------------------------------------- 1 | package com.sateda.keyonekb2; 2 | 3 | import android.content.Context; 4 | import android.graphics.Canvas; 5 | import android.inputmethodservice.Keyboard; 6 | import android.inputmethodservice.KeyboardView; 7 | 8 | 9 | import android.util.AttributeSet; 10 | import android.util.Log; 11 | 12 | import java.util.List; 13 | 14 | import static com.sateda.keyonekb2.InputMethodServiceCoreKeyPress.TAG2; 15 | 16 | 17 | public class ViewPopupScreenKeyboard extends KeyboardView { 18 | 19 | 20 | private int countKeys; 21 | private int indexPopupPressed; 22 | private float touchX; 23 | private float leftX; 24 | private int keyWidth; 25 | private int totalWidth; 26 | 27 | 28 | 29 | public ViewPopupScreenKeyboard(Context context, AttributeSet attrs) { 30 | super(context, attrs); 31 | keyWidth = 0; 32 | totalWidth = 0; 33 | 34 | } 35 | 36 | public ViewPopupScreenKeyboard(Context context, AttributeSet attrs, int defStyleAttr) { 37 | super(context, attrs, defStyleAttr); 38 | } 39 | 40 | 41 | public void startXindex(float x, int totalWidth, int keyboardWidth, float leftX) { 42 | List keys = getKeyboard().getKeys(); 43 | countKeys = keys.size(); 44 | touchX = x; 45 | this.totalWidth = totalWidth; 46 | this.leftX = leftX; 47 | keyWidth = keyboardWidth / countKeys; 48 | int startX = (totalWidth-keyboardWidth)/2; 49 | if((int)touchX <= (startX + keyWidth)) { 50 | indexPopupPressed = 0; 51 | } else if((int)touchX >= (startX + keyboardWidth- keyWidth)) { 52 | indexPopupPressed = countKeys-1; 53 | } else{ 54 | indexPopupPressed = ((int)touchX-(int)leftX)/ keyWidth; 55 | } 56 | Log.d(TAG2, "startXindex keys "+countKeys); 57 | } 58 | 59 | public int getCurrentIndex() { 60 | return indexPopupPressed; 61 | } 62 | 63 | public void coordsToIndexKey(float x) { 64 | 65 | if(keyWidth <= 0) return; 66 | //Log.d(TAG, "coordsToIndexKey leftX "+leftX+" totalWidht "+totalWidht); 67 | 68 | if(indexPopupPressed != ((int)x-(int)leftX)/ keyWidth){ 69 | indexPopupPressed = ((int)x-(int)leftX)/ keyWidth; 70 | if(indexPopupPressed > countKeys-1) indexPopupPressed = countKeys-1; 71 | if(indexPopupPressed < 0) indexPopupPressed = 0; 72 | invalidateAllKeys(); 73 | Log.d(TAG2, "coordsToIndexKey indexPopupPressed "+indexPopupPressed); 74 | } 75 | } 76 | 77 | @Override 78 | public void onDraw(Canvas canvas) { 79 | 80 | int n = 0; 81 | List keys = getKeyboard().getKeys(); 82 | for(Keyboard.Key key: keys) { 83 | if(n == indexPopupPressed){ 84 | key.pressed = true; 85 | }else{ 86 | key.pressed = false; 87 | } 88 | n++; 89 | } 90 | 91 | super.onDraw(canvas); 92 | 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/com/sateda/keyonekb2/input/CallStateCallback.java: -------------------------------------------------------------------------------- 1 | package com.sateda.keyonekb2.input; 2 | 3 | import android.telephony.PhoneStateListener; 4 | import android.telephony.TelephonyManager; 5 | import android.util.Log; 6 | 7 | import static com.sateda.keyonekb2.InputMethodServiceCoreKeyPress.TAG2; 8 | 9 | public class CallStateCallback extends PhoneStateListener { 10 | 11 | private boolean calling; 12 | 13 | public void onCallStateChanged(int state, String incomingNumber) { 14 | 15 | Log.d(TAG2, "onCallStateChanged state = "+state); 16 | if(state == TelephonyManager.CALL_STATE_IDLE) 17 | calling = false; 18 | else 19 | calling = true; 20 | //if(state == TelephonyManager.CALL_STATE_RINGING) 21 | //else if(state == TelephonyManager.CALL_STATE_OFFHOOK) 22 | // calling = true; 23 | 24 | } 25 | 26 | public boolean isCalling() { 27 | return calling; 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_backspace_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_backspace_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_eng_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_eng_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_eng_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_eng_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_eng_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_eng_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_est_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_est_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_est_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_est_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_est_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_est_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_alt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_alt.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_alt_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_alt_all.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_alt_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_alt_one.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_digits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_digits.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_nav.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_nav_fn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_nav_fn.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_sym.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_sym.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_sym_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_sym_all.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_kb_sym_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_kb_sym_one.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_keyboard_return_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_keyboard_return_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_lv_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_lv_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_lv_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_lv_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_lv_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_lv_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_rus_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_rus_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_rus_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_rus_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_rus_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_rus_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ukr_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_ukr_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ukr_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_ukr_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ukr_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/drawable-xhdpi/ic_ukr_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_eesti_col.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_gb_col.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_latvija_col.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_russia_col.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_ukraine_col.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/key_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pressed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_keyboard_test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 15 | 22 | 23 | 24 | 31 | 38 | 39 | 40 | 44 | 46 | 48 | 56 | 59 | 60 | 69 | 72 | 81 | 86 | 87 | 94 | 95 | -------------------------------------------------------------------------------- /app/src/main/res/layout/developer_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 21 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/key_preview.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/keyboard.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/keyboard_popup_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_backspace_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_backspace_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_eng_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_eng_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_eng_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_eng_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_eng_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_eng_small.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_est_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_est_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_est_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_est_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_est_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_est_small.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_gesture_icon_input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_gesture_icon_input.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_gesture_icon_input_up_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_gesture_icon_input_up_down.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_gesture_icon_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_gesture_icon_off.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_gesture_icon_pointer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_gesture_icon_pointer.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_gesture_icon_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_gesture_icon_view.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_kb_alt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_kb_alt.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_kb_alt_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_kb_alt_one.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_kb_digits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_kb_digits.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_kb_nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_kb_nav.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_kb_nav_fn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_kb_nav_fn.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_kb_sym.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_kb_sym.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_kb_sym_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_kb_sym_one.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_keyboard_return_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_keyboard_return_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_lv_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_lv_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_lv_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_lv_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_lv_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_lv_small.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_rus_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_rus_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_rus_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_rus_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_rus_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_rus_small.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_ukr_shift_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_ukr_shift_all.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_ukr_shift_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_ukr_shift_first.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_ukr_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-hdpi/ic_ukr_small.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_backspace_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xhdpi/ic_backspace_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_keyboard_return_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xhdpi/ic_keyboard_return_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_backspace_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxhdpi/ic_backspace_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_keyboard_return_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxhdpi/ic_keyboard_return_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_backspace_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxxhdpi/ic_backspace_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_down_arrow_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxxhdpi/ic_down_arrow_white.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_left_arrow_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxxhdpi/ic_left_arrow_white.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_right_arrow_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxxhdpi/ic_right_arrow_white.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_up_arrow_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/app/src/main/res/mipmap-xxxhdpi/ic_up_arrow_white.png -------------------------------------------------------------------------------- /app/src/main/res/raw/scan_code_key_code.json: -------------------------------------------------------------------------------- 1 | { 2 | "5":11,"16":45,"17":51,"18":33,"19":46,"20":48,"21":53,"22":49,"23":37,"24":43,"25":44, 3 | "30":29,"31":47,"32":32,"33":34,"34":35,"35":36,"36":38,"37":39,"38":40, 4 | "-7":7,"44":54,"45":52,"46":31,"47":50,"48":30,"49":42,"50":41} -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | 11 | #008577 12 | #3F51B5 13 | #D81B60 14 | 15 | #FF000000 16 | #000000 17 | #ff808080 18 | #bbffffff 19 | 20 | 21 | #000000 22 | #A8A8A8 23 | #646464 24 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | 22 | 52dip 23 | 20sp 24 | 16sp 25 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/xml/keyonekb_accessibility_service_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/xml/keyonekb_input_method.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/xml/navigation.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/xml/pocket_symbol.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/xml/space_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 16 | 17 | 21 | 22 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/xml/symbol.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | repositories { 4 | google() 5 | mavenLocal() 6 | mavenCentral() 7 | maven { url "https://repo.grails.org/grails/core/" } 8 | //jcenter() 9 | } 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:4.2.2' 12 | //classpath 'com.android.tools.build:gradle:3.1.4' 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | google() 21 | mavenLocal() 22 | //jcenter() 23 | mavenCentral() 24 | //maven { url 'https://jitpack.io' } 25 | maven { url "https://repo.grails.org/grails/core/" } 26 | } 27 | } 28 | 29 | 30 | task clean(type: Delete) { 31 | delete rootProject.buildDir 32 | } 33 | -------------------------------------------------------------------------------- /design/ic_eng_shift_all.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_eng_shift_all.psd -------------------------------------------------------------------------------- /design/ic_eng_shift_first.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_eng_shift_first.psd -------------------------------------------------------------------------------- /design/ic_eng_small.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_eng_small.psd -------------------------------------------------------------------------------- /design/ic_est_shift_all.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_est_shift_all.psd -------------------------------------------------------------------------------- /design/ic_est_shift_first.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_est_shift_first.psd -------------------------------------------------------------------------------- /design/ic_est_small.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_est_small.psd -------------------------------------------------------------------------------- /design/ic_gesture_icon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_gesture_icon.psd -------------------------------------------------------------------------------- /design/ic_kb.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb.psd -------------------------------------------------------------------------------- /design/ic_kb_alt.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_alt.psd -------------------------------------------------------------------------------- /design/ic_kb_alt_all.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_alt_all.psd -------------------------------------------------------------------------------- /design/ic_kb_alt_one.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_alt_one.psd -------------------------------------------------------------------------------- /design/ic_kb_digits.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_digits.psd -------------------------------------------------------------------------------- /design/ic_kb_nav.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_nav.psd -------------------------------------------------------------------------------- /design/ic_kb_nav_fn.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_nav_fn.psd -------------------------------------------------------------------------------- /design/ic_kb_sym.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_sym.psd -------------------------------------------------------------------------------- /design/ic_kb_sym_all.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_sym_all.psd -------------------------------------------------------------------------------- /design/ic_kb_sym_one.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_kb_sym_one.psd -------------------------------------------------------------------------------- /design/ic_launcher.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_launcher.psd -------------------------------------------------------------------------------- /design/ic_lv_shift_all.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_lv_shift_all.psd -------------------------------------------------------------------------------- /design/ic_lv_shift_first.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_lv_shift_first.psd -------------------------------------------------------------------------------- /design/ic_lv_small.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_lv_small.psd -------------------------------------------------------------------------------- /design/ic_rus_shift_all.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_rus_shift_all.psd -------------------------------------------------------------------------------- /design/ic_rus_shift_first.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_rus_shift_first.psd -------------------------------------------------------------------------------- /design/ic_rus_small.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_rus_small.psd -------------------------------------------------------------------------------- /design/ic_ukr_shift_all.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_ukr_shift_all.psd -------------------------------------------------------------------------------- /design/ic_ukr_shift_first.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_ukr_shift_first.psd -------------------------------------------------------------------------------- /design/ic_ukr_small.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/design/ic_ukr_small.psd -------------------------------------------------------------------------------- /doc/release_2_7.txt: -------------------------------------------------------------------------------- 1 | Доработки/улучшения 2 | 3 | REF Легкий рефакторинг наэкранных клавиатур 4 | Всплывающие доп-буквы вынесены вверх для UHZ S|P 5 | Переработана настройка высоты свайп-панели 6 | Кнопки в свайп-панели во весь размер 7 | Флаг позиционируется относительно названия раскладки 8 | Стрелочки позиционируются по центру 9 | 10 | FI4 Ctrl+Alt Вставка буфера обмена по буквам для обмана антивставочных скриптов на сайтах 11 | 12 | FI4 Хождение по словам теперь проезжает пунктуацию автоматом 13 | 14 | FI4 Доработка кликер-плагинов для приложений модов-клонов, которые меняют одну букву имени пакета, доработка телеграм-хака для клонов телеграм 15 | 16 | FI4 удерживание на наэкрной панели (нав и свайп) делает повтор ввода 17 | 18 | [BB K1|2] FI4 Добавил в 0 (ноль) в наэкранную SYM клавиатуру 19 | 20 | FI4 Активировал работу хард-кнопиу DEL в NAV режиме 21 | 22 | [UHZ T] Сделал костыль для unihertz чтобы работал ctrl+c когда выделение шло влево до упора 23 | 24 | 25 | 26 | Исправленные ошибки 27 | 28 | BUG-FIX Поправлена работа свайп-панели: 29 | [UHZ S|P] Свайп-панель теперь открывается при входе в режим редактирования без необходимости тапа в поле ввода 30 | [BB K1|2] Как выяснилось не работало как-то криво то не убиралось, то не появлялось 31 | 32 | BUG-FIX Предыдущий toast о смене языка (если висит) заменяется новым. Это важно для интеграции с TLT (text layout tools) 33 | 34 | BUG-FIX Не очищался массив key-down для single-press 35 | 36 | BUG-FIX При перемещении курсора через удерживание SYM не применялась автоматическая простановка заглавной буквы 37 | 38 | BUG-FIX Не озаглавливалась буква при alt+del 39 | 40 | [UHZ T] Пофиксил чтобы паразитные v, x не вставлялись в TG когда делаешь ctrl+v, ctrl+x 41 | 42 | [UHZ ?] Пофиксил Сбрасывались настройки 43 | 44 | 45 | 46 | Кастомизации 47 | 48 | FI4 Переработка NAV механизма и вынесение его в JSON 49 | 50 | Добавлена поддержка Unihertz Titan и раскладки к нему (совместно с zynaps нашли даже как сделать и ctrl и нав-режим) 51 | 52 | Add latvian/estonian layouts 53 | 54 | FI4 Движок JavaScript для точечного patch-инга json-ов. 55 | FI4 JS патчи теперь можно включать/выключать через меню расширенные настройки 56 | Полезно, чтобы не накатывать каждый раз своих изменения когда разработчик меняет mechanics 57 | Чтобы можно было пробовать на удобство изменения, которые сделали другие пользователи для себя 58 | 59 | REF Переделано хранение json файлов в исходниках приложения (файлы перенесены в Assets и разбиты по папкам) 60 | 61 | FI4 В mechanics можно делать кастомизацию на отдельные кнопки (одну из группы). 62 | В памяти настройки каждой кнопки из группы размножаются/копируются для каждой кнопки, поэтому изменения будут применяться только к той кнопке, в которой надо применить либо секции mechanics, либо js-patch. 63 | Это сильно расширяет возможности кастомизации приложения для кейсов, например, когда сломалась какая-то кнопка. -------------------------------------------------------------------------------- /doc/schema/alt_hw.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Generated schema for Root", 4 | "type": "array", 5 | "items": { 6 | "type": "object", 7 | "properties": { 8 | "key-code": { 9 | "type": "string" 10 | }, 11 | "single-press-alt-shift-mode": { 12 | "type": "string" 13 | }, 14 | "single-press-alt-mode": { 15 | "type": "string" 16 | }, 17 | "alt-more-variants": { 18 | "type": "string" 19 | } 20 | }, 21 | "required": [ 22 | "key-code", 23 | "single-press-alt-shift-mode", 24 | "single-press-alt-mode" 25 | ] 26 | } 27 | } -------------------------------------------------------------------------------- /doc/schema/hw.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Generated schema for Root", 4 | "type": "object", 5 | "properties": { 6 | "keyboard-name": { 7 | "type": "string" 8 | }, 9 | "alt-mode-layout": { 10 | "type": "string" 11 | }, 12 | "sym-mode-layout": { 13 | "type": "string" 14 | }, 15 | "key-mapping": { 16 | "type": "array", 17 | "items": { 18 | "type": "object", 19 | "properties": { 20 | "key-code": { 21 | "type": "string" 22 | }, 23 | "single-press": { 24 | "type": "string" 25 | }, 26 | "single-press-shift-mode": { 27 | "type": "string" 28 | }, 29 | "double-press": { 30 | "type": "string" 31 | }, 32 | "double-press-shift-mode": { 33 | "type": "string" 34 | } 35 | }, 36 | "required": [ 37 | "key-code", 38 | "single-press", 39 | "single-press-shift-mode" 40 | ] 41 | } 42 | } 43 | }, 44 | "required": [ 45 | "keyboard-name", 46 | "alt-mode-layout", 47 | "sym-mode-layout", 48 | "key-mapping" 49 | ] 50 | } -------------------------------------------------------------------------------- /doc/schema/keyboard_core.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Generated schema for Root", 4 | "type": "object", 5 | "properties": { 6 | "time-short-press": { 7 | "type": "number" 8 | }, 9 | "time-double-press": { 10 | "type": "number" 11 | }, 12 | "time-triple-press": { 13 | "type": "number" 14 | }, 15 | "time-long-press": { 16 | "type": "number" 17 | }, 18 | "time-long-after-short-press": { 19 | "type": "number" 20 | }, 21 | "time-wait-gesture-upon-key0-hold": { 22 | "type": "number" 23 | }, 24 | "gesture-finger-press-radius": { 25 | "type": "number" 26 | }, 27 | "gesture-motion-base-sensitivity": { 28 | "type": "number" 29 | }, 30 | "gesture-row4-begin-y": { 31 | "type": "number" 32 | }, 33 | "gesture-row1-begin-y": { 34 | "type": "number" 35 | }, 36 | "time-vibrate": { 37 | "type": "number" 38 | } 39 | }, 40 | "required": [ 41 | "time-short-press", 42 | "time-double-press", 43 | "time-triple-press", 44 | "time-long-press", 45 | "time-long-after-short-press", 46 | "time-wait-gesture-upon-key0-hold", 47 | "gesture-finger-press-radius", 48 | "gesture-motion-base-sensitivity", 49 | "gesture-row4-begin-y", 50 | "gesture-row1-begin-y", 51 | "time-vibrate" 52 | ] 53 | } -------------------------------------------------------------------------------- /doc/schema/keyboard_layouts.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Generated schema for Root", 4 | "type": "array", 5 | "items": { 6 | "type": "object", 7 | "properties": { 8 | "options-name": { 9 | "type": "string" 10 | }, 11 | "keyboard-mapping": { 12 | "type": "string" 13 | }, 14 | "icon-lowercase": { 15 | "type": "string" 16 | }, 17 | "icon-first-shift": { 18 | "type": "string" 19 | }, 20 | "icon-capslock": { 21 | "type": "string" 22 | }, 23 | "flag": { 24 | "type": "string" 25 | }, 26 | "device-model-regexp": { 27 | "type": "string" 28 | }, 29 | "custom-keyboard-mechanics": { 30 | "type": "string" 31 | } 32 | }, 33 | "required": [ 34 | "options-name", 35 | "keyboard-mapping", 36 | "icon-lowercase", 37 | "icon-first-shift", 38 | "icon-capslock", 39 | "flag", 40 | "device-model-regexp" 41 | ] 42 | } 43 | } -------------------------------------------------------------------------------- /doc/schema/keyonekb2_as_options.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Generated schema for Root", 4 | "type": "object", 5 | "properties": { 6 | "search-plugins-enabled": { 7 | "type": "boolean" 8 | }, 9 | "retranslate-keyboard-key-codes": { 10 | "type": "array", 11 | "items": { 12 | "type": "string" 13 | } 14 | }, 15 | "retranslate-keyboard-meta-key-plus-key-list": { 16 | "type": "array", 17 | "items": { 18 | "type": "object", 19 | "properties": { 20 | "meta-key-code": { 21 | "type": "string" 22 | }, 23 | "key-key-code": { 24 | "type": "string" 25 | } 26 | }, 27 | "required": [ 28 | "meta-key-code", 29 | "key-key-code" 30 | ] 31 | } 32 | }, 33 | "digits-pad-plugin-enabled": { 34 | "type": "boolean" 35 | }, 36 | "digits-pad-plugin-app-markers": { 37 | "type": "array", 38 | "items": { 39 | "type": "object", 40 | "properties": { 41 | "package-name": { 42 | "type": "string" 43 | }, 44 | "digits-pad-marker-node-id": { 45 | "type": "string" 46 | } 47 | }, 48 | "required": [ 49 | "package-name" 50 | ] 51 | } 52 | }, 53 | "selected-node-click-hack": { 54 | "type": "boolean" 55 | }, 56 | "selected-node-highlight": { 57 | "type": "boolean" 58 | } 59 | }, 60 | "required": [ 61 | "search-plugins-enabled", 62 | "retranslate-keyboard-key-codes", 63 | "retranslate-keyboard-meta-key-plus-key-list", 64 | "digits-pad-plugin-enabled", 65 | "digits-pad-plugin-app-markers", 66 | "selected-node-click-hack", 67 | "selected-node-highlight" 68 | ] 69 | } -------------------------------------------------------------------------------- /doc/schema/plugin_data.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Generated schema for Root", 4 | "type": "object", 5 | "properties": { 6 | "default-search-words": { 7 | "type": "array", 8 | "items": { 9 | "type": "string" 10 | } 11 | }, 12 | "search-plugins": { 13 | "type": "array", 14 | "items": { 15 | "type": "object", 16 | "properties": { 17 | "package-name": { 18 | "type": "string" 19 | }, 20 | "additional-event-type-type-window-content-changed": { 21 | "type": "boolean" 22 | }, 23 | "custom-click-adapter-click-parent": { 24 | "type": "boolean" 25 | }, 26 | "dynamic-search-method": { 27 | "type": "array", 28 | "items": { 29 | "type": "object", 30 | "properties": { 31 | "dynamic-search-method-function": { 32 | "type": "string" 33 | }, 34 | "contains-string": { 35 | "type": "string" 36 | } 37 | }, 38 | "required": [ 39 | "dynamic-search-method-function", 40 | "contains-string" 41 | ] 42 | } 43 | }, 44 | "wait-before-send-char-ms": { 45 | "type": "number" 46 | }, 47 | "search-field-id": { 48 | "type": "string" 49 | } 50 | }, 51 | "required": [ 52 | "package-name" 53 | ] 54 | } 55 | }, 56 | "clicker-plugins": { 57 | "type": "array", 58 | "items": { 59 | "type": "object", 60 | "properties": { 61 | "package-name": { 62 | "type": "string" 63 | }, 64 | "additional-event-type-type-window-content-changed": { 65 | "type": "boolean" 66 | }, 67 | "search-field-id": { 68 | "type": "string" 69 | }, 70 | "custom-click-adapter-click-first-child": { 71 | "type": "boolean" 72 | }, 73 | "wait-before-send-char-ms": { 74 | "type": "number" 75 | } 76 | }, 77 | "required": [ 78 | "package-name", 79 | "search-field-id" 80 | ] 81 | } 82 | } 83 | }, 84 | "required": [ 85 | "default-search-words", 86 | "search-plugins", 87 | "clicker-plugins" 88 | ] 89 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=false 20 | 21 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tim-ecoder/KeyoneKB/5ad62b8a143c18d96b5e8b52d15fad4890d1dfa7/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon May 10 19:45:41 EEST 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name = "KeyoneKB2" --------------------------------------------------------------------------------