├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── thumbkey.png │ │ │ ├── font │ │ │ │ └── nasin_nanpa_4_0_2.otf │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── xml │ │ │ │ ├── method.xml │ │ │ │ └── locales_config.xml │ │ │ ├── drawable │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ └── thumb_key_icon.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── values-cs │ │ │ │ └── strings.xml │ │ │ ├── values-ca │ │ │ │ └── strings.xml │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── values-pl │ │ │ │ └── strings.xml │ │ │ └── values-zh-rCN │ │ │ │ └── strings.xml │ │ ├── ic_launcher-playstore.png │ │ ├── java │ │ │ └── com │ │ │ │ └── dessalines │ │ │ │ └── thumbkey │ │ │ │ ├── ui │ │ │ │ ├── theme │ │ │ │ │ ├── Type.kt │ │ │ │ │ ├── Shape.kt │ │ │ │ │ └── Theme.kt │ │ │ │ └── components │ │ │ │ │ ├── common │ │ │ │ │ ├── TextFields.kt │ │ │ │ │ └── Dialogs.kt │ │ │ │ │ └── setup │ │ │ │ │ └── SetupScreen.kt │ │ │ │ ├── keyboards │ │ │ │ ├── DEMessagEaseLeft.kt │ │ │ │ ├── FAThumbKeySamsung.kt │ │ │ │ ├── DEMessagEaseLeftInvertedNumpad.kt │ │ │ │ ├── ENQBasedLeft.kt │ │ │ │ ├── ENMessagEaseLeft.kt │ │ │ │ ├── ENMessagEaseLeftSymbols.kt │ │ │ │ ├── ENMessagEaseSymbolsTwoHands.kt │ │ │ │ ├── HEMessagEase.kt │ │ │ │ ├── NumericENDENL.kt │ │ │ │ ├── ARThumbKeyLevant.kt │ │ │ │ ├── NumericHyper.kt │ │ │ │ ├── KAThumbKey.kt │ │ │ │ ├── NumericFlipped.kt │ │ │ │ ├── NumericArabic.kt │ │ │ │ ├── NumericTypeSplit.kt │ │ │ │ ├── Numeric.kt │ │ │ │ ├── NumericFrenchTypeSplit.kt │ │ │ │ ├── NumericMyanmar.kt │ │ │ │ ├── NumericFarsiSamsung.kt │ │ │ │ ├── HEThumbKey.kt │ │ │ │ ├── NumericENMessagEase.kt │ │ │ │ ├── NumericESMessagEase.kt │ │ │ │ ├── NumericDual.kt │ │ │ │ ├── NumericFrench.kt │ │ │ │ ├── NumericFarsi.kt │ │ │ │ ├── FAThumbKey.kt │ │ │ │ ├── NumericPTEN.kt │ │ │ │ ├── DEMessagEaseInvertedNumpad.kt │ │ │ │ ├── NumericNordicMessagEase.kt │ │ │ │ └── HEMessagEaseSymbols.kt │ │ │ │ ├── textprocessors │ │ │ │ └── TextProcessor.kt │ │ │ │ ├── utils │ │ │ │ └── AutoCapitalizers.kt │ │ │ │ └── ComposeKeyboardView.kt │ │ ├── assets │ │ │ └── RELEASES.md │ │ └── AndroidManifest.xml │ └── debug │ │ └── res │ │ └── values │ │ └── strings.xml └── proguard-rules.pro ├── fastlane └── metadata │ └── android │ ├── da │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── br │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── de │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── es │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── fr │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── ru │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── uk │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── en-US │ ├── title.txt │ ├── changelogs │ │ ├── 6.txt │ │ ├── 149.txt │ │ ├── 148.txt │ │ ├── 134.txt │ │ ├── 161.txt │ │ ├── 144.txt │ │ ├── 135.txt │ │ ├── 147.txt │ │ ├── 157.txt │ │ ├── 137.txt │ │ ├── 132.txt │ │ ├── 151.txt │ │ ├── 133.txt │ │ ├── 140.txt │ │ ├── 139.txt │ │ ├── 131.txt │ │ ├── 150.txt │ │ ├── 130.txt │ │ ├── 152.txt │ │ ├── 143.txt │ │ ├── 158.txt │ │ ├── 159.txt │ │ ├── 141.txt │ │ ├── 160.txt │ │ ├── 146.txt │ │ ├── 138.txt │ │ ├── 153.txt │ │ ├── 142.txt │ │ ├── 164.txt │ │ ├── 136.txt │ │ ├── 163.txt │ │ ├── 162.txt │ │ ├── 156.txt │ │ ├── 154.txt │ │ ├── 165.txt │ │ ├── 155.txt │ │ └── 145.txt │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ ├── phoneScreenshots │ │ │ └── 1.png │ │ └── userGuideImages │ │ │ ├── modify_keys_example_1.png │ │ │ ├── modify_keys_example_2.png │ │ │ └── modify_keys_example_3.png │ └── full_description.txt │ └── fa │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt ├── .editorconfig ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature_request.yml │ ├── layout.yml │ └── issue_report.yml └── CODEOWNERS ├── renovate.json ├── .gitignore ├── settings.gradle ├── generate_changelog.sh ├── .woodpecker.yml ├── gradle.properties ├── cliff.toml └── gradlew.bat /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /fastlane/metadata/android/da/title.txt: -------------------------------------------------------------------------------- 1 | Tommeltast -------------------------------------------------------------------------------- /fastlane/metadata/android/br/title.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/title.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/title.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/title.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/title.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/title.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fa/title.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key (کلید-شصتی) -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/6.txt: -------------------------------------------------------------------------------- 1 | An initial release. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/149.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fa/short_description.txt: -------------------------------------------------------------------------------- 1 | یک کیبرد محافظ حریم شخصی برای انگشت شصت شما -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{kt,kts}] 2 | ktlint_function_naming_ignore_when_annotated_with=Composable 3 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | A privacy-conscious keyboard made for your thumbs. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/da/short_description.txt: -------------------------------------------------------------------------------- 1 | Et privatlivsbevidst tastatur lavet til dine tommelfingre. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/short_description.txt: -------------------------------------------------------------------------------- 1 | Un clavier respectueux de la vie privée conçu pour vos pouces. -------------------------------------------------------------------------------- /app/src/main/res/thumbkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/thumbkey.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de/short_description.txt: -------------------------------------------------------------------------------- 1 | Eine privatsphären-respektierende Tastatur gemacht für deine Daumen. -------------------------------------------------------------------------------- /fastlane/metadata/android/es/short_description.txt: -------------------------------------------------------------------------------- 1 | Un teclado conciente de la privacidad hecho para tus pulgares. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/short_description.txt: -------------------------------------------------------------------------------- 1 | Конфиденциальная клавиатура, созданная для ваших больших пальцев. -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/short_description.txt: -------------------------------------------------------------------------------- 1 | Конфіденційна клавіатура, створена для ваших великих пальців. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/br/short_description.txt: -------------------------------------------------------------------------------- 1 | Ur c'hlavier graet evit ho pizied-meud hag a zouj ho buhez prevez. 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Thumb-Key (Debug) 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/res/font/nasin_nanpa_4_0_2.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/font/nasin_nanpa_4_0_2.otf -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Discussion 4 | url: https://lemmy.ml/c/thumbkey 5 | about: Discussion board 6 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @dessalines @alerque 2 | app/src/main/java/com/dessalines/thumbkey/keyboards/TRArti.kt @alerque 3 | app/src/main/java/com/dessalines/thumbkey/keyboards/RUArti.kt @alerque 4 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:recommended"], 4 | "schedule": ["every weekend"], 5 | "automerge": true 6 | } 7 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/userGuideImages/modify_keys_example_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/fastlane/metadata/android/en-US/images/userGuideImages/modify_keys_example_1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/userGuideImages/modify_keys_example_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/fastlane/metadata/android/en-US/images/userGuideImages/modify_keys_example_2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/userGuideImages/modify_keys_example_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessalines/thumb-key/HEAD/fastlane/metadata/android/en-US/images/userGuideImages/modify_keys_example_3.png -------------------------------------------------------------------------------- /app/src/main/res/xml/method.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey.ui.theme 2 | 3 | import androidx.compose.material3.Typography 4 | 5 | // Set of Material typography styles to start with 6 | val Typography = Typography() 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /*/build/ 8 | /captures 9 | /Gemfile* 10 | .externalNativeBuild 11 | .cxx 12 | local.properties 13 | app/release 14 | app/schemas 15 | .project 16 | .settings 17 | .classpath 18 | .kotlin 19 | build.sh 20 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/148.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.30 2 | 3 | - Fixing key mods. by @dessalines in [#1374](https://github.com/dessalines/thumb-key/pull/1374) 4 | 5 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.29...4.0.30 6 | 7 | 8 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/134.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.16 2 | 3 | - Fix ´ compose in dvorak Shifted by @lyluqo in [#1238](https://github.com/dessalines/thumb-key/pull/1238) 4 | 5 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.15...4.0.16 6 | 7 | 8 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/161.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 5.0.6 2 | 3 | - add top bottom key actions (closes #1418) by @pohmelie in [#1512](https://github.com/dessalines/thumb-key/pull/1512) 4 | 5 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.5...5.0.6 6 | 7 | 8 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/144.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.26 2 | 3 | - ENMessagEaseSymbolsModifiers: Enter & Tab by @W-Bosman in [#1331](https://github.com/dessalines/thumb-key/pull/1331) 4 | 5 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.25...4.0.26 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionSha256Sum=72f44c9f8ebcb1af43838f45ee5c4aa9c5444898b3468ab3f4af7b6076c5bc3f 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip 5 | networkTimeout=10000 6 | validateDistributionUrl=true 7 | zipStoreBase=GRADLE_USER_HOME 8 | zipStorePath=wrapper/dists 9 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/135.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.17 2 | 3 | - Relatively large change to JAKanaThumbKey.kt by @K0baU in [#1241](https://github.com/dessalines/thumb-key/pull/1241) 4 | - Add Breton translation by @zeecho in [#1240](https://github.com/dessalines/thumb-key/pull/1240) 5 | 6 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.16...4.0.17 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey.ui.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material3.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = 8 | Shapes( 9 | small = RoundedCornerShape(4.dp), 10 | medium = RoundedCornerShape(4.dp), 11 | large = RoundedCornerShape(0.dp), 12 | ) 13 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/147.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.29 2 | 3 | - Using lets instead of null and empty checks. by @dessalines in [#1369](https://github.com/dessalines/thumb-key/pull/1369) 4 | - feature/key_modifications by @Toldry in [#1364](https://github.com/dessalines/thumb-key/pull/1364) 5 | 6 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.28...4.0.29 7 | 8 | 9 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/157.txt: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## What's Changed in 5.0.2 6 | 7 | - Revert "Fix bottom padding for Android 15+ " by @dessalines in [#1465](https://github.com/dessalines/thumb-key/pull/1465) 8 | 9 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.1...5.0.2 10 | 11 | 12 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/137.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.19 2 | 3 | - add hyper layout by @luminespire in [#1260](https://github.com/dessalines/thumb-key/pull/1260) 4 | 5 | ## New Contributors 6 | 7 | - @luminespire made their first contribution in [#1260](https://github.com/dessalines/thumb-key/pull/1260) 8 | 9 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.18...4.0.19 10 | 11 | 12 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/132.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.14 2 | 3 | - Update NumericWide ° \* # by @lyluqo in [#1227](https://github.com/dessalines/thumb-key/pull/1227) 4 | - Fix swipe types of NumericWide by @lyluqo in [#1226](https://github.com/dessalines/thumb-key/pull/1226) 5 | - Fix dvorak compose ´ by @lyluqo in [#1225](https://github.com/dessalines/thumb-key/pull/1225) 6 | 7 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.13...4.0.14 8 | 9 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/151.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.33 2 | 3 | - Merge remote-tracking branch 'refs/remotes/origin/main' by @dessalines 4 | - modify keys: support keyboards up to size 10x10 by @Toldry in [#1386](https://github.com/dessalines/thumb-key/pull/1386) 5 | - feat: added `keyAction` to key mods by @Toldry in [#1385](https://github.com/dessalines/thumb-key/pull/1385) 6 | 7 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.32...4.0.33 8 | 9 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/133.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.15 2 | 3 | - Layout portuguese dvorak wide by @lyluqo in [#1234](https://github.com/dessalines/thumb-key/pull/1234) 4 | - Add Tab, Esc in dvorak-wide by @lyluqo in [#1232](https://github.com/dessalines/thumb-key/pull/1232) 5 | - Add Breton French compose keyboard by @zeecho in [#1231](https://github.com/dessalines/thumb-key/pull/1231) 6 | 7 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.14...4.0.15 8 | 9 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/140.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.22 2 | 3 | - Add voice input option to README.md by @jm355 in [#1286](https://github.com/dessalines/thumb-key/pull/1286) 4 | - Update ENThumbKeyWordsSymbols.kt by @jm355 in [#1282](https://github.com/dessalines/thumb-key/pull/1282) 5 | - Slightly loosen password field definition for disabling animations by @bklaase in [#1280](https://github.com/dessalines/thumb-key/pull/1280) 6 | 7 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.21...4.0.22 8 | 9 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/139.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.21 2 | 3 | - adds variant layout: English Twohanded with symbols, numbers, and arrows by @bklaase in [#1278](https://github.com/dessalines/thumb-key/pull/1278) 4 | - Add "I'll" autocapitalizer for word layout by @jm355 in [#1275](https://github.com/dessalines/thumb-key/pull/1275) 5 | - neon theme make purple slightly brighter. by @bklaase in [#1276](https://github.com/dessalines/thumb-key/pull/1276) 6 | 7 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.20...4.0.21 8 | 9 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/131.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.13 2 | 3 | - Adding Arabic levant thumbkey keyboard. by @dessalines in [#1224](https://github.com/dessalines/thumb-key/pull/1224) 4 | - Support for CTRL&ALT modified keyboards. ENMessagEaseSymbolsModified. by @W-Bosman in [#1220](https://github.com/dessalines/thumb-key/pull/1220) 5 | 6 | ## New Contributors 7 | 8 | - @W-Bosman made their first contribution in [#1220](https://github.com/dessalines/thumb-key/pull/1220) 9 | 10 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.12...4.0.13 11 | 12 | 13 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/150.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.32 2 | 3 | - Fix issue: key modifications screen shows error by @Toldry in [#1377](https://github.com/dessalines/thumb-key/pull/1377) 4 | - Added greek keyboards with greek layout and greek character accents by @VMichailidis in [#1376](https://github.com/dessalines/thumb-key/pull/1376) 5 | 6 | ## New Contributors 7 | 8 | - @VMichailidis made their first contribution in [#1376](https://github.com/dessalines/thumb-key/pull/1376) 9 | 10 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.31...4.0.32 11 | 12 | 13 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/130.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.12 2 | 3 | - Adding fastlane generation. by @dessalines in [#1219](https://github.com/dessalines/thumb-key/pull/1219) 4 | - Using a center-aligned app bar. by @dessalines in [#1217](https://github.com/dessalines/thumb-key/pull/1217) 5 | - Fixing icon dep. by @dessalines in [#1214](https://github.com/dessalines/thumb-key/pull/1214) 6 | - Add Layout english dvorak wide compose by @lyluqo in [#1213](https://github.com/dessalines/thumb-key/pull/1213) 7 | 8 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.11...4.0.12 9 | 10 | 11 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | plugins { 8 | id 'com.android.application' version '8.13.2' 9 | id 'com.android.library' version '8.13.2' 10 | id 'org.jetbrains.kotlin.android' version '2.2.21' 11 | } 12 | } 13 | dependencyResolutionManagement { 14 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 15 | repositories { 16 | google() 17 | mavenCentral() 18 | maven { url 'https://jitpack.io' } 19 | } 20 | } 21 | rootProject.name = "com.dessalines.thumbkey" 22 | include ':app' 23 | -------------------------------------------------------------------------------- /app/src/main/res/xml/locales_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/152.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.34 2 | 3 | - added combining marks example by @Toldry in [#1395](https://github.com/dessalines/thumb-key/pull/1395) 4 | - Adjust Vietnamese layout to use correct tone marks by @3T1C in [#1391](https://github.com/dessalines/thumb-key/pull/1391) 5 | - Adding android lint. by @dessalines in [#1390](https://github.com/dessalines/thumb-key/pull/1390) 6 | 7 | ## New Contributors 8 | 9 | - @3T1C made their first contribution in [#1391](https://github.com/dessalines/thumb-key/pull/1391) 10 | 11 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.33...4.0.34 12 | 13 | 14 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/143.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.25 2 | 3 | - Add turkish locale. 4 | - A few code fixes. by @dessalines in [#1313](https://github.com/dessalines/thumb-key/pull/1313) 5 | - Adding DE_THUMBKEY_WORDS layout. by @dessalines in [#1312](https://github.com/dessalines/thumb-key/pull/1312) 6 | 7 | ## New Contributors 8 | 9 | - @weblate made their first contribution in [#1316](https://github.com/dessalines/thumb-key/pull/1316) 10 | - @dessalines made their first contribution in [#1313](https://github.com/dessalines/thumb-key/pull/1313) 11 | 12 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.24...4.0.25 13 | 14 | 15 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/158.txt: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## What's Changed in 5.0.3 6 | 7 | - Adding setting to ignore bottom padding. by @dessalines in [#1477](https://github.com/dessalines/thumb-key/pull/1477) 8 | - Update README.md by @Toldry in [#1480](https://github.com/dessalines/thumb-key/pull/1480) 9 | - Move migrations to own file. by @dessalines in [#1479](https://github.com/dessalines/thumb-key/pull/1479) 10 | - Fix a few stringres param issues. by @dessalines in [#1478](https://github.com/dessalines/thumb-key/pull/1478) 11 | 12 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.2...5.0.3 13 | 14 | 15 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/159.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 5.0.4 2 | 3 | - limfjorden's PR by @dessalines in [#1496](https://github.com/dessalines/thumb-key/pull/1496) 4 | - add "show toast on layout switch" option by @pohmelie in [#1495](https://github.com/dessalines/thumb-key/pull/1495) 5 | - feat: Add swipeReturn to key mods by @Toldry in [#1493](https://github.com/dessalines/thumb-key/pull/1493) 6 | - add extensionDefinitionPrefix to key mods YAML by @Toldry in [#1492](https://github.com/dessalines/thumb-key/pull/1492) 7 | - Update README.md by @Toldry in [#1490](https://github.com/dessalines/thumb-key/pull/1490) 8 | 9 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.3...5.0.4 10 | 11 | 12 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/141.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.23 2 | 3 | - Update Hyper symbol layer and punctuation by @luminespire in [#1293](https://github.com/dessalines/thumb-key/pull/1293) 4 | - Update old br-fr keyboards and create a new BRFRThumbKeyV3 by @zeecho in [#1290](https://github.com/dessalines/thumb-key/pull/1290) 5 | - Draft: use minSwipeLength setting for DragReturn and Circular detection by @stfstf123 in [#1244](https://github.com/dessalines/thumb-key/pull/1244) 6 | 7 | ## New Contributors 8 | 9 | - @stfstf123 made their first contribution in [#1244](https://github.com/dessalines/thumb-key/pull/1244) 10 | 11 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.22...4.0.23 12 | 13 | 14 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/160.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 5.0.5 2 | 3 | - adds new layout: english twohands symbols numbers arrows compact. by @bklaase in [#1507](https://github.com/dessalines/thumb-key/pull/1507) 4 | - Remove mention of the deprecated moving cursor up or down lines from the README by @JulienVig in [#1506](https://github.com/dessalines/thumb-key/pull/1506) 5 | - Add option to disable fullscreen editor by @jm355 in [#1499](https://github.com/dessalines/thumb-key/pull/1499) 6 | 7 | ## New Contributors 8 | 9 | - @JulienVig made their first contribution in [#1506](https://github.com/dessalines/thumb-key/pull/1506) 10 | 11 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.4...5.0.5 12 | 13 | 14 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/146.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.28 2 | 3 | - added flipped numpad layout for EN thumbkey by @axolotl-being in [#1363](https://github.com/dessalines/thumb-key/pull/1363) 4 | - Adding DE_TYPESPLIT_IMPROVED. by @dessalines in [#1360](https://github.com/dessalines/thumb-key/pull/1360) 5 | - fixed Hebrew final letters by @Toldry in [#1349](https://github.com/dessalines/thumb-key/pull/1349) 6 | 7 | ## New Contributors 8 | 9 | - @axolotl-being made their first contribution in [#1363](https://github.com/dessalines/thumb-key/pull/1363) 10 | - @Toldry made their first contribution in [#1349](https://github.com/dessalines/thumb-key/pull/1349) 11 | 12 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.27...4.0.28 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/DEMessagEaseLeft.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.KeyboardDefinition 6 | import com.dessalines.thumbkey.utils.KeyboardDefinitionModes 7 | import com.dessalines.thumbkey.utils.lastColKeysToFirst 8 | 9 | val KB_DE_MESSAGEASE_LEFT: KeyboardDefinition = 10 | KeyboardDefinition( 11 | title = "deutsch messagease left-handed", 12 | modes = 13 | KeyboardDefinitionModes( 14 | main = lastColKeysToFirst(KB_DE_MESSAGEASE_MAIN), 15 | shifted = lastColKeysToFirst(KB_DE_MESSAGEASE_SHIFTED), 16 | numeric = lastColKeysToFirst(KB_EN_MESSAGEASE_NUMERIC), 17 | ), 18 | ) 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/FAThumbKeySamsung.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_FA_THUMBKEY_SAMSUNG: KeyboardDefinition = 12 | KeyboardDefinition( 13 | title = "فارسی thumb-key samsung", 14 | modes = 15 | KeyboardDefinitionModes( 16 | main = KB_FA_THUMBKEY_MAIN, 17 | shifted = KB_FA_THUMBKEY_MAIN, 18 | numeric = FARSI_NUMERIC_SAMSUNG_KEYBOARD, 19 | ), 20 | ) 21 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/138.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.20 2 | 3 | - Slight tweaks to en typesplit programming layout by @bklaase in [#1274](https://github.com/dessalines/thumb-key/pull/1274) 4 | - add English Typesplit layout, optimized for programming by @bklaase in [#1272](https://github.com/dessalines/thumb-key/pull/1272) 5 | - add hyper space and minor fixes to hyper by @luminespire in [#1268](https://github.com/dessalines/thumb-key/pull/1268) 6 | - Add layout with words and common symbols by @jm355 in [#1262](https://github.com/dessalines/thumb-key/pull/1262) 7 | - Update README.md to include other voice input option (transcribro) by @jm355 in [#1263](https://github.com/dessalines/thumb-key/pull/1263) 8 | 9 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.19...4.0.20 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/DEMessagEaseLeftInvertedNumpad.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.KeyboardDefinition 6 | import com.dessalines.thumbkey.utils.KeyboardDefinitionModes 7 | import com.dessalines.thumbkey.utils.lastColKeysToFirst 8 | 9 | val KB_DE_MESSAGEASE_LEFT_INVERTED_NUMPAD: KeyboardDefinition = 10 | KeyboardDefinition( 11 | title = "deutsch messagease left-handed, inverted numpad", 12 | modes = 13 | KeyboardDefinitionModes( 14 | main = lastColKeysToFirst(KB_DE_MESSAGEASE_MAIN), 15 | shifted = lastColKeysToFirst(KB_DE_MESSAGEASE_SHIFTED), 16 | numeric = lastColKeysToFirst(KB_DE_MESSAGEASE_INVERTED_NUMPAD_NUMERIC), 17 | ), 18 | ) 19 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/153.txt: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## What's Changed in 4.0.35 6 | 7 | - Merge remote-tracking branch 'refs/remotes/origin/main' by @dessalines 8 | - Merge remote-tracking branch 'refs/remotes/origin/main' by @dessalines 9 | - fix emoji picker ignoring navigationBars in Android 15 by @mruncreative in [#1413](https://github.com/dessalines/thumb-key/pull/1413) 10 | - Added Keyboard: MessagEase German Left / Inverted Numpad by @beeh5 in [#1408](https://github.com/dessalines/thumb-key/pull/1408) 11 | 12 | ## New Contributors 13 | 14 | - @beeh5 made their first contribution in [#1408](https://github.com/dessalines/thumb-key/pull/1408) 15 | 16 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.34...4.0.35 17 | 18 | 19 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/142.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.24 2 | 3 | - Toki Pona keyboard improvments by @nfd9001 in [#1308](https://github.com/dessalines/thumb-key/pull/1308) 4 | - Smart Quotes „“ Tested by @mruncreative in [#1309](https://github.com/dessalines/thumb-key/pull/1309) 5 | - Add ENESCATwoHands layout by @josereyesjrz in [#1301](https://github.com/dessalines/thumb-key/pull/1301) 6 | 7 | ## New Contributors 8 | 9 | - @nfd9001 made their first contribution in [#1308](https://github.com/dessalines/thumb-key/pull/1308) 10 | - @mruncreative made their first contribution in [#1309](https://github.com/dessalines/thumb-key/pull/1309) 11 | - @josereyesjrz made their first contribution in [#1301](https://github.com/dessalines/thumb-key/pull/1301) 12 | 13 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.23...4.0.24 14 | 15 | 16 | -------------------------------------------------------------------------------- /generate_changelog.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | # Creating the new tag and version code 5 | new_tag="$1" 6 | new_version_code="$2" 7 | 8 | # Replacing the versions in the app/build.gradle.kts 9 | app_build_gradle="app/build.gradle.kts" 10 | sed -i "s/versionCode = .*/versionCode = $new_version_code/" $app_build_gradle 11 | sed -i "s/versionName = .*/versionName = \"$new_tag\"/" $app_build_gradle 12 | 13 | # Writing to the Releases.md asset that's loaded inside the app 14 | tmp_file="tmp_release.md" 15 | assets_releases="app/src/main/assets/RELEASES.md" 16 | git cliff --unreleased --tag "$new_tag" --output $tmp_file 17 | prettier -w $tmp_file 18 | 19 | cp $tmp_file $assets_releases 20 | rm $tmp_file 21 | 22 | # Adding to RELEASES.md 23 | git cliff --tag "$new_tag" --output RELEASES.md 24 | prettier -w RELEASES.md 25 | 26 | # Add them all to git 27 | git add $assets_releases $app_build_gradle RELEASES.md 28 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key is a privacy-conscious smart keyboard, made specifically for your thumbs. 2 | 3 | It features a 3x3 grid layout, and uses swipes for the less common letters. Its easy to learn, and designed for fast typing speeds. 4 | 5 | Instead of relying on profit-driven, privacy-offending word and sentence prediction for accuracy, as do most popular phone keyboards like Gboard and Swiftkey, Thumb-Key uses large keys with predictable positions, to prevent your eyes from hunting and pecking for letters. 6 | 7 | As the key positions get ingrained into your muscle memory, eventually you'll be able to appromixate the fast speeds of touch-typing, your eyes never having to leave the text edit area. 8 | 9 | This project is a follow-up to the now unmaintained (and closed-source) MessagEase Keyboard, which is its main inspiration. 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fa/full_description.txt: -------------------------------------------------------------------------------- 1 | Thumb-key یک کیبرد هوشمند و محافظ حریم شخصی است، که به صورت ویژه برای انگشت شصت شما طراحی شده. 2 | 3 | این برنامه یک لایه شبکه ای 3 در 3 را در اختیار شما میگذارد، و از کشیدن انگشت برای کلمات کمتر رایج استفاده میکند. بسیار ساده برای یادگیری و طراحی شده برای تایپ کردن سریع است. 4 | 5 | به جای اتکا به سود محور بودن، حدس زدن کلمات و جملات بعدی شما به شکلی ناقض حریم خصوصی به بهانه دقت، طوری که اکثر کیبردها مثل Gboard یا Swift key انجام میدهد، Thumb-key از کلید های بزرگ با مکان قابل حدس استفاده میکند، تا چشم شما به دنبال مکان کلمات روی کیبرد نباشد. 6 | 7 | همچنان که جای کلیدها در حافظه عضلانی شما ذخیره میشود، به مرور شما میتوانید مکان حدودی کلیدهای لمسی را یاد بگیرید، و چشم شما هرگز منقطه ویرایش متن را ترک نخواهد کرد. 8 | 9 | این پروژه یک دنبال از MessagEase Keyboard است که دیگر نگهداری نمیشود (و متن بسته است)، که منبع اصلی الهام آن است. -------------------------------------------------------------------------------- /fastlane/metadata/android/da/full_description.txt: -------------------------------------------------------------------------------- 1 | Tommeltast er et privatlivsbevidst smart tastatur, lavet specifikt til dine tommelfingre. 2 | 3 | Det består af et 3x3 tastaturgitter, og benytter swipes til de mindre hyppige bogstaver. 4 | 5 | I stedet for at være afhænging af profitdreven og privatlivskrænkende forudsigelse af ord og sætninger, som de fleste populære tastaturer som Gboard og Swiftkey, bruger Tommeltast store taster med forudsigelige positioner. På den måde kan præcision stadig opnås, og samtdig behøver dine øjne ikke søge og prikke præcist efter bogstaver. 6 | 7 | Efterhånden som tasternes positioner bliver indgroede i din fingre, vil du nå samme hastighed som ved normal tastning uden at behøve at kigge på tastaturet, mens du skriver. 8 | 9 | Dette projekt er en efterfølger til det nu forladte (og closed-source) MessagEase Tastatur, hvilket er projektes største inspirationskilde. -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/164.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 5.0.9 2 | 3 | - Adding a few keyboards. by @dessalines in [#1611](https://github.com/dessalines/thumb-key/pull/1611) 4 | - Update FRENFrappeFluideV1: Better spot for backtick, on main layer by @jiquiame in [#1598](https://github.com/dessalines/thumb-key/pull/1598) 5 | - Update FRENFrappeFluideV1: Add ff and gh by @jiquiame in [#1594](https://github.com/dessalines/thumb-key/pull/1594) 6 | - Update FRENFrappeFluideV1: Add # to principal layer in [#1590](https://github.com/dessalines/thumb-key/pull/1590) 7 | - switch language resets to main by @Toldry in [#1586](https://github.com/dessalines/thumb-key/pull/1586) 8 | 9 | ## New Contributors 10 | 11 | - @jiquiame made their first contribution in [#1598](https://github.com/dessalines/thumb-key/pull/1598) 12 | 13 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.8...5.0.9 14 | 15 | 16 | -------------------------------------------------------------------------------- /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.kts. 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 | -dontwarn okhttp3.internal.platform.** 23 | -dontwarn org.conscrypt.** 24 | -dontwarn org.bouncycastle.** 25 | -dontwarn org.openjsse.** 26 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/full_description.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key - це розумна клавіатура, яка зосереджена на конфіденційності і створена спеціально для ваших великих пальців. 2 | 3 | Вона має макет сітки 3x3 і використовує гортання для менш поширених літер. Її легко освоїти та розроблено для швидкого введення тексту. 4 | 5 | Замість того, щоб покладатися на точність передбачення слів і речень, орієнтованих на отримання прибутку та порушення конфіденційності, як роблять більшість популярних телефонних клавіатур, таких як Gboard і Swiftkey, Thumb-Key використовує великі клавіші з передбачуваним положенням, щоб ваші очі не шукали букви. 6 | 7 | Коли ключові позиції закріпляться у вашій м'язовій пам'яті, ви зможете засвоїти високу швидкість набору тексту, не відриваючи очей від області редагування тексту. 8 | 9 | Цей проект є продовженням клавіатури MessagEase Keyboard, яка зараз не підтримується (і має закритий код), і є головним джерелом натхнення. 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/full_description.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key - это клавиатура с акцентом на конфиденциальность, созданная специально для ваших больших пальцев. 2 | 3 | Она предлагает сетку раскладки 3x3 и использует свайпы для редко используемых букв. Легко осваивается и разработана для быстрого набора текста. 4 | 5 | В отличие от популярных клавиатур, таких как Gboard и SwiftKey, которые полагаются на предсказание слов и нарушают конфиденциальность в целях прибыли, Thumb-Key использует большие клавиши с предсказуемым расположением, чтобы ускорить набор текста и сократить время поиска букв на клавиатуре. 6 | 7 | После того как положение клавиш запомнится вашей мускульной памятью, вы сможете достичь скорости набора близкой к той, которую можно достичь с техникой слепой печати, не отводя глаз от области редактирования текста. 8 | 9 | Главным вдохновлением для этого проекта послужила клавиатура MessagEase Keyboard, которая имеет закрытый код и больше не поддерживается. 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/136.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.18 2 | 3 | - Theme/neon -> slightly mute purple to better fit android app palettes by @bklaase in [#1259](https://github.com/dessalines/thumb-key/pull/1259) 4 | - Add Neon theme(s) by @bklaase in [#1258](https://github.com/dessalines/thumb-key/pull/1258) 5 | - Skipping weblate updates for git cliff. by @dessalines 6 | - Adding more weblate share to readme. by @dessalines in [#1246](https://github.com/dessalines/thumb-key/pull/1246) 7 | - Use svg badge by @dessalines 8 | - Adding weblate translations url. by @dessalines in [#1242](https://github.com/dessalines/thumb-key/pull/1242) 9 | 10 | ## New Contributors 11 | 12 | - @bklaase made their first contribution in [#1259](https://github.com/dessalines/thumb-key/pull/1259) 13 | - @weblate made their first contribution in [#1247](https://github.com/dessalines/thumb-key/pull/1247) 14 | 15 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.17...4.0.18 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/ENQBasedLeft.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_EN_QBASED_LEFT: KeyboardDefinition = 12 | KeyboardDefinition( 13 | title = "english qbased left-handed", 14 | modes = 15 | KeyboardDefinitionModes( 16 | main = lastColKeysToFirst(KB_EN_QBASED_MAIN), 17 | shifted = lastColKeysToFirst(KB_EN_QBASED_SHIFTED), 18 | numeric = lastColKeysToFirst(NUMERIC_KEYBOARD), 19 | ), 20 | settings = 21 | KeyboardDefinitionSettings( 22 | autoCapitalizers = arrayOf(::autoCapitalizeI, ::autoCapitalizeIApostrophe), 23 | ), 24 | ) 25 | -------------------------------------------------------------------------------- /fastlane/metadata/android/br/full_description.txt: -------------------------------------------------------------------------------- 1 | Ur c'hlavier speredek doujus d'ar vuhez prevez eo Thumb-Key, graet eo bet evit ho pizied-meud. 2 | 3 | Implijet e vez ur gael 3x3 gantañ hag arveret ar mod riklañ (swipe) evit al lizherennoù ar rouezañ. Aes eo da zeskiñ ha krouet e oa bet evit skrivañ buan. 4 | 5 | E-lec'h kaout fiziañs e kinnigoù gerioù diazezet war pal arc'hantus hag a lak ho puhez prevez en arvar evel ma vez graet gant ar c'hlavierioù Android ar brudetañ evel Gboard ha Swiftkey, arverañ a ra Thumb-key stokelloù ledan gant lec'hiadurioù stabil evit mirout ho taoulagad ouzh mont da chaseal al lizherennoù. 6 | 7 | Tamm-ha-tamm e vo gwriziaouet lec'hiadurioù al lizherennoù e-barzh ho memor kigennel hag a-benn ar fin e c'hallit tostaat eus an tizh skrivañ gant klavier mod urzhiataer hep kaout ezhomm sellet ouzh un dra all eget ar vaezienn destenn. 8 | 9 | Warlec'hiad klavier kozh (ha gant tarzh serret) MessagEase Keyboard eo ar raktres-mañ. E awen pennañ eo hemañ. 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/full_description.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key es un teclado inteligente enfocado en la privacidad, hecho específicamente para tus pulgares. 2 | 3 | Se caracteriza por su rejilla 3x3, y utiliza deslizamientos para las letras menos comunes. Es fácil de aprender y está diseñado para escribir a gran velocidad. 4 | 5 | En lugar de basarse en la predicción de palabras y frases con fines lucrativos y que atentan contra la privacidad, como hacen la mayoría de los teclados telefónicos populares como Gboard y Swiftkey, Thumb-Key utiliza teclas grandes con posiciones predecibles, para evitar que tus ojos busquen y picoteen letras. 6 | 7 | A medida que las posiciones de las teclas se arraiguen en tu memoria muscular, serás capaz de asimilar las rápidas velocidades de la escritura táctil, sin tener que apartar los ojos del área de edición de texto. 8 | 9 | Este proyecto es una continuación del ya sin mantenimiento (y de código cerrado) Teclado MessagEase, que es su principal inspiración. 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/ENMessagEaseLeft.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_EN_MESSAGEASE_LEFT: KeyboardDefinition = 12 | KeyboardDefinition( 13 | title = "english messagease left-handed", 14 | modes = 15 | KeyboardDefinitionModes( 16 | main = lastColKeysToFirst(KB_EN_MESSAGEASE_MAIN), 17 | shifted = lastColKeysToFirst(KB_EN_MESSAGEASE_SHIFTED), 18 | numeric = lastColKeysToFirst(KB_EN_MESSAGEASE_NUMERIC), 19 | ), 20 | settings = 21 | KeyboardDefinitionSettings( 22 | autoCapitalizers = arrayOf(::autoCapitalizeI, ::autoCapitalizeIApostrophe), 23 | ), 24 | ) 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/textprocessors/TextProcessor.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey.textprocessors 2 | 3 | import android.view.KeyEvent 4 | import com.dessalines.thumbkey.IMEService 5 | 6 | interface TextProcessor { 7 | // intercepts text to be committed 8 | fun handleCommitText( 9 | ime: IMEService, 10 | input: CharSequence, 11 | ) 12 | 13 | // intercepts non-text key events (e.g. ENTER, DEL, DPAD) 14 | fun handleKeyEvent( 15 | ime: IMEService, 16 | ev: KeyEvent, 17 | ) 18 | 19 | // notifies before input ends (e.g. keyboard hidden) or other IME action (eg. copy, paste, emoji mode toggle) 20 | fun handleFinishInput(ime: IMEService) 21 | 22 | // notifies on selection update 23 | fun handleCursorUpdate( 24 | ime: IMEService, 25 | oldSelStart: Int, 26 | oldSelEnd: Int, 27 | newSelStart: Int, 28 | newSelEnd: Int, 29 | ) 30 | 31 | // manually update position after switching layouts 32 | fun updateCursorPosition(ime: IMEService) 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/ENMessagEaseLeftSymbols.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_EN_MESSAGEASE_LEFT_SYMBOLS: KeyboardDefinition = 12 | KeyboardDefinition( 13 | title = "english messagease left-handed symbols", 14 | modes = 15 | KeyboardDefinitionModes( 16 | main = lastColKeysToFirst(KB_EN_MESSAGEASE_SYMBOLS_MAIN), 17 | shifted = lastColKeysToFirst(KB_EN_MESSAGEASE_SYMBOLS_SHIFTED), 18 | numeric = lastColKeysToFirst(KB_EN_MESSAGEASE_NUMERIC), 19 | ), 20 | settings = 21 | KeyboardDefinitionSettings( 22 | autoCapitalizers = arrayOf(::autoCapitalizeI, ::autoCapitalizeIApostrophe), 23 | ), 24 | ) 25 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/full_description.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key est un clavier intelligent respectueux de la vie privée, conçu spécialement pour vos pouces. 2 | 3 | Il est constitué d'une grille 3x3, et utilise le balayage (swipe) pour les lettres les moins fréquentes. C'est facile à apprendre, et conçu pour une écriture rapide. 4 | 5 | Au lieu de s'appuyer sur une prédiction des mots et des phrases basée sur le profit et portant atteinte à la vie privée, comme le font les claviers Android les plus populaires comme Gboard et Swiftkey, Thumb-Key utilise de larges touches avec des positions stables, pour éviter à vos yeux de partir à la chasse aux lettres. 6 | 7 | Au fur et à mesure, la position des lettres va s'ancrer dans votre mémoire musculaire, et vous pourrez approcher la vitesse rapide de l'écriture au clavier à 10 doigts, sans que vos yeux aient besoin de quitter la zone d'écriture. 8 | 9 | Ce projet s'inscrit dans la lignée du clavier MessagEase Keyboard, qui n'est plus maintenu (et n'est pas open-source). C'est sa principale source d'inspiration. 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/full_description.txt: -------------------------------------------------------------------------------- 1 | Thumb-Key ist eine intelligente Tastatur die deine Privatsphäre respektiert und speziell für deine Daumen gemacht ist. 2 | 3 | Sie besteht aus einem 3 mal 3 feldern, und benutzt wisch-muster für weniger verwendete Buchstaben. Die Tastatur ist einfach zu lernen und wurde für schnelles schreiben konzipiert. 4 | 5 | Anders als profit-orientiert, privatsphären-verletzende autokorrektur zu sehen wie Gboard und SwiftKey benutzt Thumb-Key eine 3x3 Tastenmatrix um zu verhindern dass deine Augen nach dem nächsten Buchstaben ausschau halten müssen. 6 | 7 | Sobald die Tastenpositionen drauf hast wirst du fast so schnell sein wie mit einer herkömmlichen touch-tastatur. Deine Augen müssen nie wieder vom Text wegsehen. 8 | 9 | Diese Projekt ist eine fortsetzung vom mittlerweile eingestellten (und nicht Quelloffenen-Projekt) MessagEase Keyboard, welche die Hauptinspiration ist. 10 | This project is a follow-up to the now unmaintained (and closed-source) MessagEase Keyboard, which is its main inspiration. 11 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/163.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 5.0.8 2 | 3 | - Add `ch` to frenfrappefluidev1 by @antoinepouille in [#1584](https://github.com/dessalines/thumb-key/pull/1584) 4 | - Adds Korean Thumb-Key layout by @Hate9 in [#1575](https://github.com/dessalines/thumb-key/pull/1575) 5 | - Update fren frappefluide v1 : move delete_word by @antoinepouille in [#1570](https://github.com/dessalines/thumb-key/pull/1570) 6 | - Update FREN_frappefluide_v1 by @antoinepouille in [#1550](https://github.com/dessalines/thumb-key/pull/1550) 7 | - ENMessagEaseSymbolsModifiers: Add "up" and "down" keys by @federvieh in [#1560](https://github.com/dessalines/thumb-key/pull/1560) 8 | - CommonKeys: Add return programming key item by @federvieh in [#1561](https://github.com/dessalines/thumb-key/pull/1561) 9 | - Key modifications: Fix NPE if ctrled/alted are empty by @federvieh in [#1552](https://github.com/dessalines/thumb-key/pull/1552) 10 | 11 | ## New Contributors 12 | 13 | - @federvieh made their first contribution in [#1560](https://github.com/dessalines/thumb-key/pull/1560) 14 | 15 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.7...5.0.8 16 | 17 | 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/162.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 5.0.7 2 | 3 | - Add Korean layout and custom input processor implementation by @uranium-boy in [#1534](https://github.com/dessalines/thumb-key/pull/1534) 4 | - Update README.md by @jwkwshjsjsj in [#1531](https://github.com/dessalines/thumb-key/pull/1531) 5 | - Verify apk fingerprint. by @dessalines in [#1528](https://github.com/dessalines/thumb-key/pull/1528) 6 | - English based Latvian keyboard by @HX3A in [#1522](https://github.com/dessalines/thumb-key/pull/1522) 7 | - downgrade agp version (closes #1514) by @pohmelie in [#1521](https://github.com/dessalines/thumb-key/pull/1521) 8 | - add top bottom action keys to documentation by @pohmelie in [#1520](https://github.com/dessalines/thumb-key/pull/1520) 9 | 10 | ## New Contributors 11 | 12 | - @uranium-boy made their first contribution in [#1534](https://github.com/dessalines/thumb-key/pull/1534) 13 | - @jwkwshjsjsj made their first contribution in [#1531](https://github.com/dessalines/thumb-key/pull/1531) 14 | - @HX3A made their first contribution in [#1522](https://github.com/dessalines/thumb-key/pull/1522) 15 | 16 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.6...5.0.7 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/assets/RELEASES.md: -------------------------------------------------------------------------------- 1 | ## What's Changed in 5.0.12 2 | 3 | - Adding a fast toggle for hiding letters. by @dessalines in [#1706](https://github.com/dessalines/thumb-key/pull/1706) 4 | - Adding norsk data driven layout. by @dessalines in [#1705](https://github.com/dessalines/thumb-key/pull/1705) 5 | - add keyboard name comments by @Toldry in [#1693](https://github.com/dessalines/thumb-key/pull/1693) 6 | - Add Thai language by @sarchar in [#1700](https://github.com/dessalines/thumb-key/pull/1700) 7 | - add more key actions by @Toldry in [#1692](https://github.com/dessalines/thumb-key/pull/1692) 8 | - Add kannada language. by @dessalines in [#1691](https://github.com/dessalines/thumb-key/pull/1691) 9 | - fix numeric wide underscore by @Toldry in [#1690](https://github.com/dessalines/thumb-key/pull/1690) 10 | - Add instructions on spacebar word swiping to readme. by @dessalines in [#1689](https://github.com/dessalines/thumb-key/pull/1689) 11 | - Using resources.getString by @dessalines in [#1688](https://github.com/dessalines/thumb-key/pull/1688) 12 | - add ToggleABCMode key action by @Toldry in [#1677](https://github.com/dessalines/thumb-key/pull/1677) 13 | 14 | ## New Contributors 15 | 16 | - @sarchar made their first contribution in [#1700](https://github.com/dessalines/thumb-key/pull/1700) 17 | 18 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.11...5.0.12 19 | 20 | 21 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/156.txt: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## What's Changed in 5.0.1 6 | 7 | - Fix bottom padding for Android 15+ by @juschmitt in [#1463](https://github.com/dessalines/thumb-key/pull/1463) 8 | - Fix navigation header back action by @alerque in [#1464](https://github.com/dessalines/thumb-key/pull/1464) 9 | - Add RU adaption of 'türkçe artı çok' layout by @alerque in [#1460](https://github.com/dessalines/thumb-key/pull/1460) 10 | - Accomodate lack of shifted support on numeric layouts by @alerque 11 | - Adding alerque as a codeowner. by @dessalines in [#1459](https://github.com/dessalines/thumb-key/pull/1459) 12 | - add `HideKeyboard` to readme by @pohmelie in [#1458](https://github.com/dessalines/thumb-key/pull/1458) 13 | - Invert primary/secondary currency for TR vs. KZ use by @alerque 14 | - Override key actions with thumb-key Russian letters by @alerque 15 | - Shuffle symbols around on 'TR Artı' to accomodate Thumb Key Russian letters by @alerque 16 | - Reduce error-prone duplicate symbols with copied and modified keys by @alerque 17 | - Initialize Russian layout based on 'türkçe artı çok' by @alerque 18 | - Add utility methods to keys for easier modification of existing layouts by @alerque 19 | 20 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.0...5.0.1 21 | 22 | 23 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/154.txt: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## What's Changed in 4.0.36 6 | 7 | - Add Serbian language layouts, both Cyrillic and Latin scripts by @markokocic in [#1440](https://github.com/dessalines/thumb-key/pull/1440) 8 | - Restore colon and semi-colon to TR+ keyboard by @alerque in [#1438](https://github.com/dessalines/thumb-key/pull/1438) 9 | - Implement 3-row emoji picker for wide layout keyboards by @alerque in [#1422](https://github.com/dessalines/thumb-key/pull/1422) 10 | - Make emoji keyboard row count automatic based on main layout by @alerque 11 | - Implement 3-row emoji picker for wide layout keyboards by @alerque 12 | - Small follow up tweaks to TR+ keyboard by @alerque in [#1421](https://github.com/dessalines/thumb-key/pull/1421) 13 | - Add new TR+ keyboard with EN+TR language and typographic symbols by @alerque in [#1420](https://github.com/dessalines/thumb-key/pull/1420) 14 | - ntfy message fix. by @dessalines in [#1419](https://github.com/dessalines/thumb-key/pull/1419) 15 | 16 | ## New Contributors 17 | 18 | - @markokocic made their first contribution in [#1440](https://github.com/dessalines/thumb-key/pull/1440) 19 | - @alerque made their first contribution in [#1438](https://github.com/dessalines/thumb-key/pull/1438) 20 | 21 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.35...4.0.36 22 | 23 | 24 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/165.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 5.0.10 2 | 3 | - Fixed kana cycle: tsu -> sokuon -> zu by @DeBestTrap in [#1640](https://github.com/dessalines/thumb-key/pull/1640) 4 | - fix: korean composition breaking when switching layouts by @uranium-boy in [#1636](https://github.com/dessalines/thumb-key/pull/1636) 5 | - Add back `gh` to français frappefluide by @jiquiame in [#1639](https://github.com/dessalines/thumb-key/pull/1639) 6 | - Updates English Thumb-Key Programmer Expanded to use default special keys; adds custom numeric layout by @Hate9 in [#1634](https://github.com/dessalines/thumb-key/pull/1634) 7 | - Standard japanese keyboard by @K0baU in [#1630](https://github.com/dessalines/thumb-key/pull/1630) 8 | - add Wurstfinger as related project by @cl445 in [#1632](https://github.com/dessalines/thumb-key/pull/1632) 9 | - Fixed incorrect swipetype in center key on KRThumbKey by @Hate9 in [#1621](https://github.com/dessalines/thumb-key/pull/1621) 10 | - Update RUHyper.kt by @bjarjfff in [#1616](https://github.com/dessalines/thumb-key/pull/1616) 11 | 12 | ## New Contributors 13 | 14 | - @DeBestTrap made their first contribution in [#1640](https://github.com/dessalines/thumb-key/pull/1640) 15 | - @cl445 made their first contribution in [#1632](https://github.com/dessalines/thumb-key/pull/1632) 16 | - @bjarjfff made their first contribution in [#1616](https://github.com/dessalines/thumb-key/pull/1616) 17 | 18 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/5.0.9...5.0.10 19 | 20 | 21 | -------------------------------------------------------------------------------- /.woodpecker.yml: -------------------------------------------------------------------------------- 1 | steps: 2 | prettier_markdown_check: 3 | image: jauderho/prettier:3.7.4-alpine 4 | commands: 5 | - prettier -c "**/*.md" "**/*.yml" 6 | when: 7 | - event: pull_request 8 | 9 | check_formatting: 10 | image: cimg/android:2025.12.1 11 | commands: 12 | - sudo chown -R circleci:circleci . 13 | - ./gradlew lintKotlin 14 | environment: 15 | GRADLE_USER_HOME: ".gradle" 16 | when: 17 | - event: pull_request 18 | 19 | check_android_lint: 20 | image: cimg/android:2025.12.1 21 | commands: 22 | - sudo chown -R circleci:circleci . 23 | - ./gradlew lint 24 | environment: 25 | GRADLE_USER_HOME: ".gradle" 26 | when: 27 | - event: pull_request 28 | 29 | build_project: 30 | image: cimg/android:2025.12.1 31 | commands: 32 | - sudo chown -R circleci:circleci . 33 | - ./gradlew assembleDebug 34 | environment: 35 | GRADLE_USER_HOME: ".gradle" 36 | when: 37 | - event: pull_request 38 | 39 | notify_success: 40 | image: alpine:3 41 | commands: 42 | - apk add curl 43 | - "curl -H'Title: ✔️ ${CI_REPO_NAME}/${CI_COMMIT_SOURCE_BRANCH}' -d'${CI_PIPELINE_URL}' ntfy.sh/thumbkey_ci" 44 | when: 45 | - event: pull_request 46 | status: [success] 47 | 48 | notify_failure: 49 | image: alpine:3 50 | commands: 51 | - apk add curl 52 | - "curl -H'Title: ❌ ${CI_REPO_NAME}/${CI_COMMIT_SOURCE_BRANCH}' -d'${CI_PIPELINE_URL}' ntfy.sh/thumbkey_ci" 53 | when: 54 | - event: pull_request 55 | status: [failure] 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/utils/AutoCapitalizers.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey.utils 2 | 3 | import com.dessalines.thumbkey.IMEService 4 | 5 | typealias AutoCapitalizers = Array<(IMEService) -> Unit> 6 | 7 | fun autoCapitalizeI(ime: IMEService) { 8 | // Capitalizes 'i' 9 | val textBefore = ime.currentInputConnection.getTextBeforeCursor(3, 0) 10 | if (!textBefore.isNullOrEmpty()) { 11 | if (textBefore == " i ") { 12 | ime.currentInputConnection.deleteSurroundingText(2, 0) 13 | ime.currentInputConnection.commitText( 14 | "I ", 15 | 1, 16 | ) 17 | } 18 | } 19 | } 20 | 21 | fun autoCapitalizeIApostrophe(ime: IMEService) { 22 | // Capitalizes "i'" 23 | val textBefore = ime.currentInputConnection.getTextBeforeCursor(3, 0) 24 | if (!textBefore.isNullOrEmpty()) { 25 | if (textBefore == " i\'") { 26 | ime.currentInputConnection.deleteSurroundingText(2, 0) 27 | ime.currentInputConnection.commitText( 28 | "I\'", 29 | 1, 30 | ) 31 | } 32 | } 33 | } 34 | 35 | fun autoCapitalizeIApostropheLL(ime: IMEService) { 36 | // Capitalizes "i'll" 37 | val textBefore = ime.currentInputConnection.getTextBeforeCursor(5, 0) 38 | if (!textBefore.isNullOrEmpty()) { 39 | if (textBefore == " i\'ll") { 40 | ime.currentInputConnection.deleteSurroundingText(4, 0) 41 | ime.currentInputConnection.commitText( 42 | "I\'ll", 43 | 1, 44 | ) 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/155.txt: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## What's Changed in 5.0.0 6 | 7 | - add hide keyboard action by @pohmelie in [#1456](https://github.com/dessalines/thumb-key/pull/1456) 8 | - Add option to automatically scale keyboard to screen width by @alerque in [#1424](https://github.com/dessalines/thumb-key/pull/1424) 9 | - Setup auto-with calculations for new 'Dual' layout position by @alerque 10 | - Add split keyboard layout to the position cycle by @jm355 in [#1443](https://github.com/dessalines/thumb-key/pull/1443) 11 | - feat: add anchors to keyboard modifications by @Toldry in [#1452](https://github.com/dessalines/thumb-key/pull/1452) 12 | - Address CoPilot review issues, improve function signatures by @alerque 13 | - Overhaul migrations to avoid SQLite & Room limitations by @alerque 14 | - Fix long press numeric key yaml by @jm355 in [#1453](https://github.com/dessalines/thumb-key/pull/1453) 15 | - Add FRENFrappeFluideV1 by @antoinepouille in [#1450](https://github.com/dessalines/thumb-key/pull/1450) 16 | - Deconflate size vs. width vs. height and save user input values by @alerque 17 | - Add option to calculate key size based on available screen width by @alerque 18 | 19 | ## New Contributors 20 | 21 | - @pohmelie made their first contribution in [#1456](https://github.com/dessalines/thumb-key/pull/1456) 22 | - @antoinepouille made their first contribution in [#1450](https://github.com/dessalines/thumb-key/pull/1450) 23 | 24 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.36...5.0.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /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=-Xmx2048m -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 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official 22 | # Enables namespacing of each library's R class so that its R class includes only the 23 | # resources declared in the library itself and none from the library's dependencies, 24 | # thereby reducing the size of the R class for that library 25 | android.nonTransitiveRClass=true 26 | org.gradle.unsafe.configuration-cache=true 27 | android.nonFinalResIds=false 28 | org.gradle.daemon=false 29 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 14 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 31 | 32 | 33 | 34 | 35 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/values-cs/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Nastavení 4 | Systém 5 | Světlý 6 | Tmavý 7 | Dynamické 8 | Zelené 9 | Růžové 10 | Modré 11 | Zatmění 12 | Kontrastní 13 | Kontrastní barevné 14 | Anarcho-komunistické barvy 15 | Uprostřed 16 | Vpravo 17 | Vlevo 18 | Zdvojené 19 | Novinky 20 | Verze %1$s 21 | Vydání 22 | Podpora 23 | Darujte projektu 24 | Sociální sítě 25 | Připojte se k c/thumbkey 26 | Sledujte mě na Mastodonu 27 | Zdrojový kód 28 | Thumb-Key je svobodný open-source software, licencovaný pod GNU Affero General Public License v3.0 29 | Vzhled a odezva 30 | Chování 31 | Rozložení 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/ui/components/common/TextFields.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey.ui.components.common 2 | 3 | import androidx.compose.foundation.layout.fillMaxWidth 4 | import androidx.compose.foundation.text.KeyboardOptions 5 | import androidx.compose.material3.Text 6 | import androidx.compose.material3.TextField 7 | import androidx.compose.material3.TextFieldDefaults 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.runtime.getValue 10 | import androidx.compose.runtime.mutableStateOf 11 | import androidx.compose.runtime.remember 12 | import androidx.compose.runtime.setValue 13 | import androidx.compose.ui.Modifier 14 | import androidx.compose.ui.graphics.Color 15 | import androidx.compose.ui.res.stringResource 16 | import androidx.compose.ui.text.input.KeyboardCapitalization 17 | import com.dessalines.thumbkey.R 18 | 19 | @Composable 20 | fun TestOutTextField() { 21 | var text by remember { mutableStateOf("") } 22 | TextField( 23 | modifier = 24 | Modifier 25 | .fillMaxWidth(), 26 | value = text, 27 | onValueChange = { text = it }, 28 | placeholder = { Text(stringResource(R.string.test_out_thumbkey)) }, 29 | colors = 30 | TextFieldDefaults.colors( 31 | focusedContainerColor = Color.Transparent, 32 | unfocusedContainerColor = Color.Transparent, 33 | disabledContainerColor = Color.Transparent, 34 | focusedIndicatorColor = Color.Transparent, 35 | unfocusedIndicatorColor = Color.Transparent, 36 | ), 37 | keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Sentences), 38 | ) 39 | } 40 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/145.txt: -------------------------------------------------------------------------------- 1 | ## What's Changed in 4.0.27 2 | 3 | - Update Hyper's symbol layer with small changes by @luminespire in [#1340](https://github.com/dessalines/thumb-key/pull/1340) 4 | - feat: add owl-layout by @owl-from-hogvarts in [#1337](https://github.com/dessalines/thumb-key/pull/1337) 5 | - Merge remote-tracking branch 'weblate/main' by @dessalines 6 | - Translated using Weblate (Arabic) by @weblate 7 | - Translated using Weblate (Polish) by @weblate 8 | - Translated using Weblate (Turkish) by @weblate 9 | - Translated using Weblate (Slovak) by @weblate 10 | - Translated using Weblate (Japanese) by @weblate 11 | - Translated using Weblate (Chinese (Simplified Han script)) by @weblate 12 | - Translated using Weblate (Ukrainian) by @weblate 13 | - Translated using Weblate (Russian) by @weblate 14 | - Translated using Weblate (Italian) by @weblate 15 | - Translated using Weblate (French) by @weblate 16 | - Translated using Weblate (Persian) by @weblate 17 | - Translated using Weblate (Spanish) by @weblate 18 | - Translated using Weblate (German) by @weblate 19 | - Translated using Weblate (Danish) by @weblate 20 | - Translated using Weblate (Breton) by @weblate 21 | - Translated using Weblate (Bulgarian) by @weblate 22 | - Added translation using Weblate (Arabic) by @williampiti 23 | - Translated using Weblate (Japanese) by @williampiti 24 | - Translated using Weblate (Japanese) by @williampiti 25 | - Translated using Weblate (Polish) 26 | - Translated using Weblate (Japanese) by @williampiti 27 | - Merge remote-tracking branch 'refs/remotes/origin/main' by @dessalines 28 | 29 | ## New Contributors 30 | 31 | - @owl-from-hogvarts made their first contribution in [#1337](https://github.com/dessalines/thumb-key/pull/1337) 32 | - @williampiti made their first contribution 33 | 34 | **Full Changelog**: https://github.com/dessalines/thumb-key/compare/4.0.26...4.0.27 35 | 36 | 37 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: 🌟 Feature request 2 | description: Suggest a feature to improve the app 3 | labels: [feature] 4 | body: 5 | - type: textarea 6 | id: feature-description 7 | attributes: 8 | label: Describe your suggested feature 9 | description: How can the app be improved? 10 | placeholder: | 11 | Example: 12 | "It should work like this..." 13 | validations: 14 | required: true 15 | 16 | - type: textarea 17 | id: other-details 18 | attributes: 19 | label: Other details 20 | placeholder: Additional details and attachments. 21 | 22 | - type: checkboxes 23 | id: acknowledgements 24 | attributes: 25 | label: Acknowledgements 26 | description: >- 27 | Read this carefully, we will close and ignore your issue if you skimmed through this. 28 | options: 29 | - label: I have written a short but informative title. 30 | required: true 31 | - label: I have updated the app to **[the latest version](https://github.com/dessalines/thumb-key/releases/latest)**. 32 | required: true 33 | - label: I have checked through the app settings for my feature. 34 | required: true 35 | - label: >- 36 | I have searched the existing issues and this is a new one, **NOT** a 37 | duplicate or related to another open issue. 38 | required: true 39 | - label: >- 40 | This is a **single** feature request, in case of multiple feature 41 | requests I will open a separate issue for each one 42 | (they can always link to each other if related) 43 | required: true 44 | - label: >- 45 | This is not a question or a discussion, in which case I should have 46 | gone to [lemmy.ml/c/thumbkey](https://lemmy.ml/c/thumbkey) 47 | required: true 48 | - label: I have admitted that I am a clown by having checked this box, as I have not read these acknowledgements. 🤡 49 | - label: I will fill out all of the requested information in this form. 50 | required: true 51 | -------------------------------------------------------------------------------- /app/src/main/res/values-ca/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Thumb-Key 4 | Arranjament 5 | Sistema 6 | Clar 7 | Fosc 8 | Dinàmic 9 | Verd 10 | Rosa 11 | Matricial-AMOLED 12 | Blau 13 | Dràcula 14 | Crepuscle 15 | Alt contrast 16 | Colors anarco-comunistes 17 | Centre 18 | Dreta 19 | Esquerra 20 | Dual 21 | Quant a 22 | Novetats 23 | Versió %1$s 24 | Llançaments 25 | Donar a Thumb-Key 26 | Xarxes socials 27 | Uniu-vos a c/thumbkey 28 | Segueix-nos a Mastodon 29 | Codi obert 30 | Codi font 31 | Thumb-Key és un programari de codi obert amb llicència GNU Affero General Public License v3.0 32 | Comportament 33 | Disposicions 34 | Tema 35 | Color del tema 36 | Posició 37 | Vibra en tocar 38 | Reprodueix un so en tocar 39 | Maximitzar per adaptar-se a l\'amplada de la pantalla 40 | Mida de la tecla: %1$s 41 | Utilitzar tecles no quadrades 42 | Alçada de la tecla: %1$s 43 | Amplada de la tecla: %1$s 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/ui/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey.ui.theme 2 | 3 | import android.os.Build 4 | import androidx.compose.foundation.isSystemInDarkTheme 5 | import androidx.compose.material3.MaterialTheme 6 | import androidx.compose.material3.dynamicDarkColorScheme 7 | import androidx.compose.material3.dynamicLightColorScheme 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.platform.LocalContext 10 | import com.dessalines.thumbkey.db.AppSettings 11 | import com.dessalines.thumbkey.utils.ThemeColor 12 | import com.dessalines.thumbkey.utils.ThemeMode 13 | 14 | @Composable 15 | fun ThumbkeyTheme( 16 | settings: AppSettings?, 17 | content: @Composable () -> Unit, 18 | ) { 19 | val themeMode = ThemeMode.entries[settings?.theme ?: 0] 20 | val themeColor = ThemeColor.entries[settings?.themeColor ?: 0] 21 | 22 | val ctx = LocalContext.current 23 | val android12OrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S 24 | 25 | // Dynamic schemes crash on lower than android 12 26 | val dynamicPair = 27 | if (android12OrLater) { 28 | Pair(dynamicLightColorScheme(ctx), dynamicDarkColorScheme(ctx)) 29 | } else { 30 | pink() 31 | } 32 | 33 | val colorPair = 34 | when (themeColor) { 35 | ThemeColor.Dynamic -> dynamicPair 36 | ThemeColor.Green -> green() 37 | ThemeColor.Pink -> pink() 38 | ThemeColor.Matrix -> matrix() 39 | ThemeColor.Srcery -> srcery() 40 | ThemeColor.Blue -> blue() 41 | ThemeColor.Dracula -> dracula() 42 | ThemeColor.Twilight -> twilight() 43 | ThemeColor.HighContrast -> highContrast() 44 | ThemeColor.HighContrastColorful -> highContrastColorful() 45 | ThemeColor.Ancom -> ancom() 46 | ThemeColor.Neon -> neon() 47 | } 48 | 49 | val systemTheme = 50 | if (!isSystemInDarkTheme()) { 51 | colorPair.first 52 | } else { 53 | colorPair.second 54 | } 55 | 56 | val colors = 57 | when (themeMode) { 58 | ThemeMode.System -> systemTheme 59 | ThemeMode.Light -> colorPair.first 60 | ThemeMode.Dark -> colorPair.second 61 | } 62 | 63 | MaterialTheme( 64 | colorScheme = colors, 65 | typography = Typography, 66 | shapes = Shapes, 67 | content = content, 68 | ) 69 | } 70 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/layout.yml: -------------------------------------------------------------------------------- 1 | name: ⌨️ Layout 2 | description: Request a new layout or changes to an existing one 3 | labels: ["layout"] 4 | body: 5 | - type: input 6 | id: language 7 | attributes: 8 | label: Language 9 | description: which language does the layout correspond to? 10 | placeholder: "example: English" 11 | validations: 12 | required: true 13 | - type: input 14 | id: variant 15 | attributes: 16 | label: Variant 17 | description: If this is a variant, name it here (MessagEase, with symbols, etc.) 18 | placeholder: "example: MessagEase" 19 | validations: 20 | required: false 21 | 22 | - type: dropdown 23 | id: kind 24 | attributes: 25 | label: "Kind of request" 26 | description: "Is this a new layout, or changes on an existing one?" 27 | options: 28 | - "New Layout" 29 | - "Changes on an existing layout" 30 | validations: 31 | required: true 32 | 33 | - type: textarea 34 | id: details 35 | attributes: 36 | label: More details 37 | description: If more details are required, write them here 38 | placeholder: | 39 | If requesting a new layout, information like how the layout should be 40 | made, what it can be based off, if it's a variant of an existing layout, etc. 41 | 42 | If requesting changes, details on what you're asking for 43 | validations: 44 | required: false 45 | 46 | - type: checkboxes 47 | id: acknowledgements 48 | attributes: 49 | label: Acknowledgements 50 | description: Read this carefully, I will close and ignore your issue if you skimmed through this. 51 | options: 52 | - label: I have written a short but informative title. 53 | required: true 54 | - label: >- 55 | I have searched the existing layouts and issues to confirm that this 56 | layout either does not exist or was not requested already 57 | required: true 58 | # - label: >- 59 | # This is not a question or a discussion, in which case I should have gone to 60 | # (discussion URL) 61 | # required: true 62 | # - label: >- 63 | # I am requesting a **single** layout. 64 | # In case of multiple layouts I will open a separate issue for each one 65 | # (they can always link to each other if related) 66 | # required: true 67 | # - label: I have updated the app **[the latest version](https://github.com/user/repo/releases/latest)**. 68 | # required: true 69 | - label: I have admitted that I am a clown by having checked this box, as I have not read these acknowledgements. 🤡 70 | - label: I have filled out all of the requested information in this form. 71 | required: true 72 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 56 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/thumb_key_icon.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 16 | 21 | 26 | 31 | 36 | 41 | 46 | 51 | 56 | 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/ENMessagEaseSymbolsTwoHands.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_EN_MESSAGEASE_SYMBOLS_TWO_HANDS_MAIN = 12 | KeyboardC( 13 | listOf( 14 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[0] + 15 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[0].subList(0, 3), 16 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[1] + 17 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[1].subList(0, 3), 18 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[2] + 19 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[2].subList(0, 3), 20 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[3] + 21 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[3].subList(0, 1), 22 | ), 23 | ) 24 | 25 | val KB_EN_MESSAGEASE_SYMBOLS_TWO_HANDS_SHIFTED = 26 | KeyboardC( 27 | listOf( 28 | KB_EN_MESSAGEASE_SYMBOLS_SHIFTED.arr[0] + 29 | KB_EN_MESSAGEASE_SYMBOLS_SHIFTED.arr[0].subList(0, 3), 30 | KB_EN_MESSAGEASE_SYMBOLS_SHIFTED.arr[1] + 31 | KB_EN_MESSAGEASE_SYMBOLS_SHIFTED.arr[1].subList(0, 3), 32 | KB_EN_MESSAGEASE_SYMBOLS_SHIFTED.arr[2] + 33 | KB_EN_MESSAGEASE_SYMBOLS_SHIFTED.arr[2].subList(0, 3), 34 | KB_EN_MESSAGEASE_SYMBOLS_SHIFTED.arr[3] + 35 | KB_EN_MESSAGEASE_SYMBOLS_SHIFTED.arr[3].subList(0, 1), 36 | ), 37 | ) 38 | 39 | val NUMERIC_KEYBOARD_MESSAGEASE_TWO_HANDS = 40 | KeyboardC( 41 | listOf( 42 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[0] + 43 | KB_EN_MESSAGEASE_NUMERIC.arr[0].subList(0, 3), 44 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[1].subList(0, 3) + 45 | listOf(ABC_KEY_ITEM) + 46 | KB_EN_MESSAGEASE_NUMERIC.arr[1].subList(0, 3), 47 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[2] + 48 | KB_EN_MESSAGEASE_NUMERIC.arr[2].subList(0, 3), 49 | KB_EN_MESSAGEASE_SYMBOLS_MAIN.arr[3] + 50 | KB_EN_MESSAGEASE_NUMERIC.arr[3].subList(0, 2), 51 | ), 52 | ) 53 | 54 | val KB_EN_MESSAGEASE_SYMBOLS_TWO_HANDS: KeyboardDefinition = 55 | KeyboardDefinition( 56 | title = "english messagease symbols two-hands", 57 | modes = 58 | KeyboardDefinitionModes( 59 | main = KB_EN_MESSAGEASE_SYMBOLS_TWO_HANDS_MAIN, 60 | shifted = KB_EN_MESSAGEASE_SYMBOLS_TWO_HANDS_SHIFTED, 61 | numeric = NUMERIC_KEYBOARD_MESSAGEASE_TWO_HANDS, 62 | ), 63 | settings = 64 | KeyboardDefinitionSettings( 65 | autoCapitalizers = arrayOf(::autoCapitalizeI, ::autoCapitalizeIApostrophe), 66 | ), 67 | ) 68 | -------------------------------------------------------------------------------- /cliff.toml: -------------------------------------------------------------------------------- 1 | # git-cliff ~ configuration file 2 | # https://git-cliff.org/docs/configuration 3 | 4 | [remote.github] 5 | owner = "dessalines" 6 | repo = "thumb-key" 7 | # token = "" 8 | 9 | [changelog] 10 | # template for the changelog body 11 | # https://keats.github.io/tera/docs/#introduction 12 | body = """ 13 | ## What's Changed 14 | 15 | {%- if version %} in {{ version }}{%- endif -%} 16 | {% for commit in commits %} 17 | {% if commit.remote.pr_title -%} 18 | {%- set commit_message = commit.remote.pr_title -%} 19 | {%- else -%} 20 | {%- set commit_message = commit.message -%} 21 | {%- endif -%} 22 | * {{ commit_message | split(pat="\n") | first | trim }}\ 23 | {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} 24 | {% if commit.remote.pr_number %} in \ 25 | [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}) \ 26 | {%- endif %} 27 | {%- endfor -%} 28 | 29 | {%- if github -%} 30 | {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} 31 | {% raw %}\n{% endraw -%} 32 | ## New Contributors 33 | {%- endif %}\ 34 | {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} 35 | * @{{ contributor.username }} made their first contribution 36 | {%- if contributor.pr_number %} in \ 37 | [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ 38 | {%- endif %} 39 | {%- endfor -%} 40 | {%- endif -%} 41 | 42 | {% if version %} 43 | {% if previous.version %} 44 | **Full Changelog**: {{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }} 45 | {% endif %} 46 | {% else -%} 47 | {% raw %}\n{% endraw %} 48 | {% endif %} 49 | 50 | {%- macro remote_url() -%} 51 | https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} 52 | {%- endmacro -%} 53 | """ 54 | # remove the leading and trailing whitespace from the template 55 | trim = true 56 | # template for the changelog footer 57 | footer = """ 58 | 59 | """ 60 | # postprocessors 61 | postprocessors = [] 62 | 63 | [git] 64 | # parse the commits based on https://www.conventionalcommits.org 65 | conventional_commits = false 66 | # filter out the commits that are not conventional 67 | filter_unconventional = true 68 | # process each line of a commit as an individual commit 69 | split_commits = false 70 | # regex for preprocessing the commit messages 71 | commit_preprocessors = [ 72 | # remove issue numbers from commits 73 | { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, 74 | ] 75 | commit_parsers = [ 76 | { field = "author.name", pattern = "renovate", skip = true }, 77 | { field = "author.name", pattern = "Weblate", skip = true }, 78 | { field = "message", pattern = "Upping version", skip = true }, 79 | { field = "message", pattern = "Merge remote-tracking", skip = true }, 80 | ] 81 | # filter out the commits that are not matched by commit parsers 82 | filter_commits = false 83 | # sort the tags topologically 84 | topo_order = false 85 | # sort the commits inside sections by oldest/newest order 86 | sort_commits = "newest" 87 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | @rem SPDX-License-Identifier: Apache-2.0 17 | @rem 18 | 19 | @if "%DEBUG%"=="" @echo off 20 | @rem ########################################################################## 21 | @rem 22 | @rem Gradle startup script for Windows 23 | @rem 24 | @rem ########################################################################## 25 | 26 | @rem Set local scope for the variables with windows NT shell 27 | if "%OS%"=="Windows_NT" setlocal 28 | 29 | set DIRNAME=%~dp0 30 | if "%DIRNAME%"=="" set DIRNAME=. 31 | @rem This is normally unused 32 | set APP_BASE_NAME=%~n0 33 | set APP_HOME=%DIRNAME% 34 | 35 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 36 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 37 | 38 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 39 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 40 | 41 | @rem Find java.exe 42 | if defined JAVA_HOME goto findJavaFromJavaHome 43 | 44 | set JAVA_EXE=java.exe 45 | %JAVA_EXE% -version >NUL 2>&1 46 | if %ERRORLEVEL% equ 0 goto execute 47 | 48 | echo. 1>&2 49 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 50 | echo. 1>&2 51 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 52 | echo location of your Java installation. 1>&2 53 | 54 | goto fail 55 | 56 | :findJavaFromJavaHome 57 | set JAVA_HOME=%JAVA_HOME:"=% 58 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 59 | 60 | if exist "%JAVA_EXE%" goto execute 61 | 62 | echo. 1>&2 63 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 64 | echo. 1>&2 65 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 66 | echo location of your Java installation. 1>&2 67 | 68 | goto fail 69 | 70 | :execute 71 | @rem Setup the command line 72 | 73 | 74 | 75 | @rem Execute Gradle 76 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* 77 | 78 | :end 79 | @rem End local scope for the variables with windows NT shell 80 | if %ERRORLEVEL% equ 0 goto mainEnd 81 | 82 | :fail 83 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 84 | rem the _cmd.exe /c_ return code! 85 | set EXIT_CODE=%ERRORLEVEL% 86 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 87 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 88 | exit /b %EXIT_CODE% 89 | 90 | :mainEnd 91 | if "%OS%"=="Windows_NT" endlocal 92 | 93 | :omega 94 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/ui/components/setup/SetupScreen.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey.ui.components.setup 2 | 3 | import android.content.Intent 4 | import android.provider.Settings 5 | import android.util.Log 6 | import androidx.compose.foundation.layout.Arrangement 7 | import androidx.compose.foundation.layout.Column 8 | import androidx.compose.foundation.layout.fillMaxWidth 9 | import androidx.compose.foundation.layout.padding 10 | import androidx.compose.material3.Button 11 | import androidx.compose.material3.ExperimentalMaterial3Api 12 | import androidx.compose.material3.Scaffold 13 | import androidx.compose.material3.SnackbarHost 14 | import androidx.compose.material3.SnackbarHostState 15 | import androidx.compose.material3.Text 16 | import androidx.compose.runtime.Composable 17 | import androidx.compose.runtime.remember 18 | import androidx.compose.ui.Modifier 19 | import androidx.compose.ui.platform.LocalContext 20 | import androidx.compose.ui.res.stringResource 21 | import androidx.compose.ui.unit.dp 22 | import androidx.navigation.NavController 23 | import com.dessalines.thumbkey.R 24 | import com.dessalines.thumbkey.utils.SimpleTopAppBar 25 | import com.dessalines.thumbkey.utils.TAG 26 | import splitties.systemservices.inputMethodManager 27 | 28 | @OptIn(ExperimentalMaterial3Api::class) 29 | @Composable 30 | fun SetupScreen( 31 | navController: NavController, 32 | thumbkeyEnabled: Boolean, 33 | thumbkeySelected: Boolean, 34 | ) { 35 | Log.d(TAG, "Got to setup activity") 36 | 37 | val snackbarHostState = remember { SnackbarHostState() } 38 | val ctx = LocalContext.current 39 | 40 | val spacing = 16.dp 41 | 42 | Scaffold( 43 | snackbarHost = { SnackbarHost(snackbarHostState) }, 44 | topBar = { 45 | SimpleTopAppBar( 46 | text = stringResource(R.string.setup_thumbkey), 47 | navController = navController, 48 | showBack = false, 49 | ) 50 | }, 51 | content = { padding -> 52 | Column( 53 | verticalArrangement = Arrangement.spacedBy(spacing), 54 | modifier = 55 | Modifier 56 | .padding(padding) 57 | .padding(horizontal = spacing), 58 | ) { 59 | if (!thumbkeyEnabled) { 60 | Button(modifier = Modifier.fillMaxWidth(), onClick = { 61 | ctx.startActivity(Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)) 62 | }) { 63 | Text(stringResource(R.string.enable_thumbkey)) 64 | } 65 | } 66 | if (!thumbkeySelected) { 67 | Button(modifier = Modifier.fillMaxWidth(), onClick = { 68 | inputMethodManager.showInputMethodPicker() 69 | }) { 70 | Text(stringResource(R.string.select_thumbkey)) 71 | } 72 | } 73 | Button(modifier = Modifier.fillMaxWidth(), onClick = { 74 | navController.navigate("settings") 75 | }) { 76 | Text(stringResource(R.string.finish_setup)) 77 | } 78 | } 79 | }, 80 | ) 81 | } 82 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/issue_report.yml: -------------------------------------------------------------------------------- 1 | name: 🐞 Issue report 2 | description: Report an issue or bug 3 | labels: [bug] 4 | body: 5 | - type: textarea 6 | id: reproduce-steps 7 | attributes: 8 | label: Steps to reproduce 9 | description: Provide an example of the issue. 10 | placeholder: | 11 | Example: 12 | 1. First step 13 | 2. Second step 14 | 3. Issue here 15 | validations: 16 | required: true 17 | 18 | - type: textarea 19 | id: expected-behavior 20 | attributes: 21 | label: Expected behavior 22 | description: Explain what you should expect to happen. 23 | placeholder: | 24 | Example: 25 | "This should happen..." 26 | validations: 27 | required: true 28 | 29 | - type: textarea 30 | id: actual-behavior 31 | attributes: 32 | label: Actual behavior 33 | description: Explain what actually happens. 34 | placeholder: | 35 | Example: 36 | "This happened instead..." 37 | validations: 38 | required: true 39 | 40 | - type: input 41 | id: version 42 | attributes: 43 | label: version of the program 44 | placeholder: >- 45 | Example: "2.6.14" 46 | validations: 47 | required: true 48 | 49 | - type: input 50 | id: android-version 51 | attributes: 52 | label: Android version 53 | description: You can find this somewhere in your Android settings. 54 | placeholder: | 55 | Example: "Android 14" 56 | validations: 57 | required: true 58 | 59 | - type: input 60 | id: device 61 | attributes: 62 | label: Device 63 | description: List your device and model. 64 | placeholder: | 65 | Example: "Google Pixel 8" 66 | validations: 67 | required: true 68 | 69 | - type: textarea 70 | id: other-details 71 | attributes: 72 | label: Other details 73 | placeholder: Additional details and attachments. 74 | 75 | - type: checkboxes 76 | id: acknowledgements 77 | attributes: 78 | label: Acknowledgements 79 | description: >- 80 | Read this carefully, I will close and ignore your issue if you skimmed through this. 81 | options: 82 | - label: I have written a short but informative title. 83 | required: true 84 | - label: I have updated the app to **[the latest version](https://github.com/dessalines/thumb-key/releases/latest)**. 85 | required: true 86 | - label: >- 87 | I have searched the existing issues and this is a new one, **NOT** a 88 | duplicate or related to another open issue. 89 | required: true 90 | - label: >- 91 | This is not a question or a discussion, in which case I should have 92 | gone to [lemmy.ml/c/thumbkey](https://lemmy.ml/c/thumbkey) 93 | required: true 94 | - label: >- 95 | This is a **single** bug report, in case of multiple bugs I will open 96 | a separate issue for each one 97 | (they can always link to each other if related) 98 | required: true 99 | - label: I have admitted that I am a clown by having checked this box, as I have not read these acknowledgements. 🤡 100 | - label: I have filled out all of the requested information in this form. 101 | required: true 102 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/HEMessagEase.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_HE_MESSAGEASE_MAIN = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("ר", size = LARGE), 17 | swipeType = FOUR_WAY_DIAGONAL, 18 | bottomRight = KeyC("ן", swipeReturnAction = CommitText("נ")), 19 | ), 20 | KeyItemC( 21 | center = KeyC("ב", size = LARGE), 22 | swipeType = TWO_WAY_VERTICAL, 23 | bottom = KeyC("ג"), 24 | ), 25 | KeyItemC( 26 | center = KeyC("א", size = LARGE), 27 | bottomLeft = KeyC("צ", swipeReturnAction = CommitText("ץ")), 28 | ), 29 | EMOJI_KEY_ITEM, 30 | ), 31 | listOf( 32 | KeyItemC( 33 | center = KeyC("מ", size = LARGE), 34 | right = KeyC("ם", swipeReturnAction = CommitText("מ")), 35 | ), 36 | KeyItemC( 37 | center = KeyC("י", size = LARGE), 38 | topLeft = KeyC("ק"), 39 | top = KeyC("ח"), 40 | topRight = KeyC("פ", swipeReturnAction = CommitText("ף")), 41 | right = KeyC("ד"), 42 | bottomRight = KeyC("ש"), 43 | bottom = KeyC("נ", swipeReturnAction = CommitText("ן")), 44 | bottomLeft = KeyC("כ", swipeReturnAction = CommitText("ך")), 45 | left = KeyC("ע"), 46 | ), 47 | KeyItemC( 48 | center = KeyC("ו", size = LARGE), 49 | swipeType = FOUR_WAY_DIAGONAL, 50 | ), 51 | NUMERIC_KEY_ITEM, 52 | ), 53 | listOf( 54 | KeyItemC( 55 | center = KeyC("ת", size = LARGE), 56 | swipeType = FOUR_WAY_DIAGONAL, 57 | topRight = KeyC("ז"), 58 | ), 59 | KeyItemC( 60 | center = KeyC("ה", size = LARGE), 61 | top = KeyC("ס"), 62 | topRight = KeyC("'", color = MUTED), 63 | bottomRight = KeyC("-", color = MUTED), 64 | bottom = KeyC(".", color = MUTED), 65 | bottomLeft = KeyC(",", color = MUTED), 66 | ), 67 | KeyItemC( 68 | center = KeyC("ל", size = LARGE), 69 | swipeType = FOUR_WAY_DIAGONAL, 70 | topLeft = KeyC("ט"), 71 | ), 72 | BACKSPACE_KEY_ITEM, 73 | ), 74 | listOf( 75 | SPACEBAR_KEY_ITEM, 76 | RETURN_KEY_ITEM, 77 | ), 78 | ), 79 | ) 80 | 81 | val KB_HE_MESSAGEASE: KeyboardDefinition = 82 | KeyboardDefinition( 83 | title = "עברית messagease", 84 | modes = 85 | KeyboardDefinitionModes( 86 | main = KB_HE_MESSAGEASE_MAIN, 87 | shifted = KB_HE_MESSAGEASE_MAIN, 88 | numeric = KB_EN_MESSAGEASE_NUMERIC, 89 | ), 90 | ) 91 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericENDENL.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val NUMERIC_ENDENL_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("1", size = LARGE), 17 | topLeft = KeyC("@"), 18 | topRight = KeyC("\$"), 19 | bottomRight = KeyC("£"), 20 | bottomLeft = KeyC("€"), 21 | ), 22 | KeyItemC( 23 | center = KeyC("2", size = LARGE), 24 | topLeft = KeyC("`"), 25 | top = KeyC("^"), 26 | topRight = KeyC("´"), 27 | bottomRight = KeyC("\\"), 28 | bottomLeft = KeyC("/"), 29 | ), 30 | KeyItemC( 31 | center = KeyC("3", size = LARGE), 32 | left = KeyC("+"), 33 | topRight = KeyC("&"), 34 | bottom = KeyC("="), 35 | ), 36 | EMOJI_KEY_ITEM, 37 | ), 38 | listOf( 39 | KeyItemC( 40 | center = KeyC("4", size = LARGE), 41 | topLeft = KeyC("{"), 42 | topRight = KeyC("%"), 43 | bottomLeft = KeyC("["), 44 | left = KeyC("("), 45 | ), 46 | KeyItemC( 47 | center = KeyC("5", size = LARGE), 48 | ), 49 | KeyItemC( 50 | center = KeyC("6", size = LARGE), 51 | topLeft = KeyC("|"), 52 | topRight = KeyC("}"), 53 | right = KeyC(")"), 54 | bottomRight = KeyC("]"), 55 | ), 56 | ABC_KEY_ITEM, 57 | ), 58 | listOf( 59 | KeyItemC( 60 | center = KeyC("7", size = LARGE), 61 | topLeft = KeyC("~"), 62 | bottomRight = KeyC(":"), 63 | bottom = KeyC(";"), 64 | bottomLeft = KeyC("<"), 65 | ), 66 | KeyItemC( 67 | center = KeyC("8", size = LARGE), 68 | topLeft = KeyC("\""), 69 | topRight = KeyC("'"), 70 | right = KeyC("_"), 71 | bottomRight = KeyC("-"), 72 | bottom = KeyC("."), 73 | bottomLeft = KeyC(","), 74 | left = KeyC("*"), 75 | ), 76 | KeyItemC( 77 | center = KeyC("9", size = LARGE), 78 | topRight = KeyC("°"), 79 | bottomRight = KeyC(">"), 80 | bottom = KeyC("!"), 81 | bottomLeft = KeyC("?"), 82 | left = KeyC("#"), 83 | ), 84 | BACKSPACE_KEY_ITEM, 85 | ), 86 | listOf( 87 | KeyItemC( 88 | center = KeyC("0", size = LARGE), 89 | widthMultiplier = 2, 90 | ), 91 | SPACEBAR_SKINNY_KEY_ITEM, 92 | RETURN_KEY_ITEM, 93 | ), 94 | ), 95 | ) 96 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/ARThumbKeyLevant.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | 9 | val KB_AR_THUMBKEY_LEVANT_MAIN = 10 | KeyboardC( 11 | listOf( 12 | listOf( 13 | KeyItemC( 14 | center = KeyC("ب", size = LARGE), 15 | bottomRight = KeyC("ش"), 16 | ), 17 | KeyItemC( 18 | center = KeyC("ر", size = LARGE), 19 | bottomRight = KeyC("ز"), 20 | bottom = KeyC("ق"), 21 | ), 22 | KeyItemC( 23 | center = KeyC("و", size = LARGE), 24 | top = KeyC("ؤ"), 25 | bottomLeft = KeyC("س"), 26 | ), 27 | EMOJI_KEY_ITEM, 28 | ), 29 | listOf( 30 | KeyItemC( 31 | center = KeyC("ن", size = LARGE), 32 | right = KeyC("ف"), 33 | bottomRight = KeyC("ذ"), 34 | left = KeyC(")", color = MUTED), 35 | ), 36 | KeyItemC( 37 | center = KeyC("ت", size = LARGE), 38 | topLeft = KeyC("ض"), 39 | top = KeyC("ث"), 40 | topRight = KeyC("خ"), 41 | right = KeyC("ح"), 42 | bottomRight = KeyC("ج"), 43 | bottom = KeyC("ة"), 44 | bottomLeft = KeyC("ص"), 45 | left = KeyC("ط"), 46 | ), 47 | KeyItemC( 48 | center = KeyC("ي", size = LARGE), 49 | top = KeyC("ئ"), 50 | right = KeyC("(", color = MUTED), 51 | bottom = KeyC("ى"), 52 | bottomLeft = KeyC("غ"), 53 | left = KeyC("ك"), 54 | ), 55 | NUMERIC_KEY_ITEM, 56 | ), 57 | listOf( 58 | KeyItemC( 59 | center = KeyC("ل", size = LARGE), 60 | topRight = KeyC("د"), 61 | bottomRight = KeyC(":", color = MUTED), 62 | bottomLeft = KeyC("!", color = MUTED), 63 | ), 64 | KeyItemC( 65 | center = KeyC("م", size = LARGE), 66 | top = KeyC("ه"), 67 | topRight = KeyC("ظ"), 68 | bottomRight = KeyC("،", color = MUTED), 69 | bottom = KeyC(".", color = MUTED), 70 | bottomLeft = KeyC("؟", color = MUTED), 71 | ), 72 | KeyItemC( 73 | center = KeyC("ا", size = LARGE), 74 | topLeft = KeyC("ع"), 75 | top = KeyC("أ"), 76 | topRight = KeyC("آ"), 77 | bottom = KeyC("إ"), 78 | left = KeyC("ء"), 79 | ), 80 | BACKSPACE_KEY_ITEM, 81 | ), 82 | listOf( 83 | SPACEBAR_KEY_ITEM, 84 | RETURN_KEY_ITEM, 85 | ), 86 | ), 87 | ) 88 | 89 | val KB_AR_THUMBKEY_LEVANT: KeyboardDefinition = 90 | KeyboardDefinition( 91 | title = "عربية شامية thumb-key", 92 | modes = 93 | KeyboardDefinitionModes( 94 | main = KB_AR_THUMBKEY_LEVANT_MAIN, 95 | shifted = KB_AR_THUMBKEY_LEVANT_MAIN, 96 | numeric = ARABIC_NUMERIC_KEYBOARD, 97 | ), 98 | ) 99 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericHyper.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val HYPER_NUMERIC_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | RETURN_KEY_ITEM, 16 | KeyItemC( 17 | center = KeyC("1", size = LARGE), 18 | top = KeyC(":(", size = SMALL), 19 | left = KeyC("["), 20 | bottomRight = KeyC("<"), 21 | right = KeyC("\\"), 22 | ), 23 | KeyItemC( 24 | center = KeyC("2", size = LARGE), 25 | bottom = KeyC("@"), 26 | ), 27 | KeyItemC( 28 | center = KeyC("3", size = LARGE), 29 | top = KeyC(":)", size = SMALL), 30 | left = KeyC("|"), 31 | right = KeyC("]"), 32 | bottomLeft = KeyC(">"), 33 | ), 34 | KeyItemC( 35 | center = KeyC(".", size = LARGE), 36 | bottom = KeyC(","), 37 | left = KeyC("!"), 38 | ), 39 | BACKSPACE_KEY_ITEM, 40 | ), 41 | listOf( 42 | SPACEBAR_SKINNY_KEY_ITEM, 43 | KeyItemC( 44 | center = KeyC("4", size = LARGE), 45 | top = KeyC("\""), 46 | bottom = KeyC(":"), 47 | left = KeyC("("), 48 | right = KeyC("_"), 49 | ), 50 | KeyItemC( 51 | center = KeyC("5", size = LARGE), 52 | left = KeyC("€"), 53 | right = KeyC("£"), 54 | top = KeyC("$"), 55 | bottom = KeyC("&"), 56 | ), 57 | KeyItemC( 58 | center = KeyC("6", size = LARGE), 59 | top = KeyC("'"), 60 | bottom = KeyC(";"), 61 | left = KeyC("^"), 62 | right = KeyC(")"), 63 | ), 64 | KeyItemC( 65 | center = KeyC("0", size = LARGE), 66 | left = KeyC("%"), 67 | ), 68 | SPACEBAR_SKINNY_KEY_ITEM, 69 | ), 70 | listOf( 71 | ABC_KEY_ITEM, 72 | KeyItemC( 73 | center = KeyC("7", size = LARGE), 74 | topRight = KeyC("?"), 75 | top = KeyC("~"), 76 | left = KeyC("{"), 77 | ), 78 | KeyItemC( 79 | center = KeyC("8", size = LARGE), 80 | topLeft = KeyC("`"), 81 | topRight = KeyC("´"), 82 | ), 83 | KeyItemC( 84 | center = KeyC("9", size = LARGE), 85 | right = KeyC("}"), 86 | top = KeyC("°"), 87 | topLeft = KeyC("#"), 88 | ), 89 | KeyItemC( 90 | center = KeyC("="), 91 | top = KeyC("+"), 92 | bottom = KeyC("-"), 93 | left = KeyC("*"), 94 | right = KeyC("/"), 95 | ), 96 | EMOJI_KEY_ITEM, 97 | ), 98 | ), 99 | ) 100 | -------------------------------------------------------------------------------- /app/src/main/res/values-pl/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wsparcie 4 | Wersja %1$s 5 | Thumb-Key 6 | Ustawienia 7 | System 8 | Jasny 9 | Ciemny 10 | Dynamiczny 11 | Różowy 12 | Matrix-AMOLED 13 | Niebieski 14 | Dracula 15 | Zmierzch 16 | Wysoki kontrast 17 | Kolorowy wysoki kontrast 18 | Kolory anarcho komunistyczne 19 | Środek 20 | Prawo 21 | Lewo 22 | O aplikacji 23 | Co nowego 24 | Wydania 25 | Przekaż darowiznę Thumb-Key 26 | Media społecznościowe 27 | Srcery 28 | Dołącz do c/thumbkey 29 | Obserwuj mnie na Mastodonie 30 | Kod źródłowy 31 | Thumb-Key to wolne otwarto źródłowe oprogramowanie, które używa licencji GNU Affero General Public License v3.0 32 | Wygląd 33 | Zachowanie 34 | Układy 35 | Motyw 36 | Kolor motywu 37 | Pozycja 38 | Wymaga by wibracje były włączone w ustawieniach systemu 39 | Wielkość klawiszy: %1$s 40 | Wysokość klawiszy: %1$s 41 | Szerokość klawiszy: %1$s 42 | Szybkość animacji: %1$s 43 | Tryb ruchu kursora 44 | Brak przyśpieszania / Stała prędkość 45 | Przywróć domyślne 46 | Czy na pewno chcesz przywrócić ustawienia do domyślnych? 47 | Przywróć 48 | Anuluj 49 | Zaczynaj wielką literą 50 | Zapisz kopię zapasową oraz przywróć 51 | Przewodnik dla użytkownika 52 | Wybierz Thumb-Key 53 | Skopiuj wybrany tekst 54 | Ukryj litery 55 | Ukryj symbole 56 | Przywróć kopię zapasową 57 | Uwaga: To wyczyści twoją obecną bazę danych 58 | Baza danych przywrócona. 59 | Kopia zapasowa bazy danych została wykonana. 60 | Zielony 61 | Przetestuj Thumb-Key 62 | Śledzenie zgłoszeń 63 | Konfiguracja 64 | Gotowe 65 | 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/KAThumbKey.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_KA_THUMBKEY_MAIN = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("მ", size = LARGE), 17 | right = KeyC("ხ"), 18 | bottomRight = KeyC("ვ"), 19 | bottom = KeyC("ც"), 20 | ), 21 | KeyItemC( 22 | center = KeyC("ბ", size = LARGE), 23 | swipeType = TWO_WAY_VERTICAL, 24 | bottom = KeyC("ლ"), 25 | ), 26 | KeyItemC( 27 | center = KeyC("ე", size = LARGE), 28 | swipeType = FOUR_WAY_DIAGONAL, 29 | bottomLeft = KeyC("გ"), 30 | bottomRight = KeyC("ჰ"), 31 | ), 32 | EMOJI_KEY_ITEM, 33 | ), 34 | listOf( 35 | KeyItemC( 36 | center = KeyC("ს", size = LARGE), 37 | swipeType = FOUR_WAY_CROSS, 38 | right = KeyC("თ"), 39 | bottom = KeyC("ნ"), 40 | ), 41 | KeyItemC( 42 | center = KeyC("დ", size = LARGE), 43 | topLeft = KeyC("ძ"), 44 | top = KeyC("ჩ"), 45 | topRight = KeyC("ღ"), 46 | right = KeyC("პ"), 47 | bottomRight = KeyC("ქ"), 48 | bottom = KeyC("ფ"), 49 | bottomLeft = KeyC("ყ"), 50 | left = KeyC("ზ"), 51 | ), 52 | KeyItemC( 53 | center = KeyC("ი", size = LARGE), 54 | swipeType = FOUR_WAY_CROSS, 55 | left = KeyC("კ"), 56 | ), 57 | NUMERIC_KEY_ITEM, 58 | ), 59 | listOf( 60 | KeyItemC( 61 | center = KeyC("რ", size = LARGE), 62 | topRight = KeyC("წ"), 63 | top = KeyC("შ"), 64 | right = KeyC("ჟ"), 65 | ), 66 | KeyItemC( 67 | center = KeyC("ო", size = LARGE), 68 | top = KeyC("ტ"), 69 | right = KeyC("ჯ"), 70 | topLeft = KeyC("\"", color = MUTED), 71 | topRight = KeyC("'", color = MUTED), 72 | bottomRight = KeyC("-", color = MUTED), 73 | bottom = KeyC(".", color = MUTED), 74 | bottomLeft = KeyC("*", color = MUTED), 75 | left = KeyC(",", color = MUTED), 76 | ), 77 | KeyItemC( 78 | center = KeyC("ა", size = LARGE), 79 | topLeft = KeyC("უ"), 80 | top = KeyC("ჭ"), 81 | ), 82 | BACKSPACE_KEY_ITEM, 83 | ), 84 | listOf( 85 | SPACEBAR_KEY_ITEM, 86 | RETURN_KEY_ITEM, 87 | ), 88 | ), 89 | ) 90 | 91 | val KB_KA_THUMBKEY: KeyboardDefinition = 92 | KeyboardDefinition( 93 | title = "kartuli ena thumb-key", 94 | modes = 95 | KeyboardDefinitionModes( 96 | main = KB_KA_THUMBKEY_MAIN, 97 | shifted = KB_KA_THUMBKEY_MAIN, 98 | numeric = NUMERIC_KEYBOARD, 99 | ), 100 | ) 101 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericFlipped.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 7 | 8 | val NUMERIC_KEYBOARD_FLIPPED = 9 | KeyboardC( 10 | listOf( 11 | listOf( 12 | KeyItemC( 13 | center = KeyC("7", size = LARGE), 14 | bottomLeft = KeyC("$"), 15 | bottomRight = 16 | getLocalCurrency()?.let { 17 | if (it !in setOf("$", "£", "€")) { 18 | KeyC(it) 19 | } else { 20 | null 21 | } 22 | }, 23 | ), 24 | KeyItemC( 25 | center = KeyC("8", size = LARGE), 26 | topLeft = KeyC("`"), 27 | top = KeyC("^"), 28 | topRight = KeyC("´"), 29 | right = KeyC("!"), 30 | bottomRight = KeyC("\\"), 31 | bottomLeft = KeyC("/"), 32 | left = KeyC("+"), 33 | ), 34 | KeyItemC( 35 | center = KeyC("9", size = LARGE), 36 | left = KeyC("?"), 37 | bottomRight = KeyC("€"), 38 | bottomLeft = KeyC("£"), 39 | bottom = KeyC("="), 40 | ), 41 | EMOJI_KEY_ITEM, 42 | ), 43 | listOf( 44 | KeyItemC( 45 | center = KeyC("4", size = LARGE), 46 | topLeft = KeyC("{"), 47 | topRight = KeyC("%"), 48 | bottomRight = KeyC("_"), 49 | bottomLeft = KeyC("["), 50 | left = KeyC("("), 51 | ), 52 | KeyItemC( 53 | center = KeyC("5", size = LARGE), 54 | ), 55 | KeyItemC( 56 | center = KeyC("6", size = LARGE), 57 | topLeft = KeyC("|"), 58 | topRight = KeyC("}"), 59 | right = KeyC(")"), 60 | bottomRight = KeyC("]"), 61 | bottomLeft = KeyC("@"), 62 | ), 63 | ABC_KEY_ITEM, 64 | ), 65 | listOf( 66 | KeyItemC( 67 | center = KeyC("1", size = LARGE), 68 | topLeft = KeyC("~"), 69 | bottomRight = KeyC(":"), 70 | bottomLeft = KeyC("<"), 71 | ), 72 | KeyItemC( 73 | center = KeyC("2", size = LARGE), 74 | topLeft = KeyC("\""), 75 | topRight = KeyC("'"), 76 | bottomRight = KeyC("-"), 77 | bottom = KeyC("."), 78 | bottomLeft = KeyC("*"), 79 | left = KeyC(","), 80 | ), 81 | KeyItemC( 82 | center = KeyC("3", size = LARGE), 83 | top = KeyC("&"), 84 | topRight = KeyC("°"), 85 | bottomRight = KeyC(">"), 86 | bottomLeft = KeyC(";"), 87 | left = KeyC("#"), 88 | ), 89 | BACKSPACE_KEY_ITEM, 90 | ), 91 | listOf( 92 | KeyItemC( 93 | center = KeyC("0", size = LARGE), 94 | widthMultiplier = 2, 95 | ), 96 | SPACEBAR_SKINNY_KEY_ITEM, 97 | RETURN_KEY_ITEM, 98 | ), 99 | ), 100 | ) 101 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericArabic.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 7 | 8 | val ARABIC_NUMERIC_KEYBOARD = 9 | KeyboardC( 10 | listOf( 11 | listOf( 12 | KeyItemC( 13 | center = KeyC("1", size = LARGE), 14 | bottomLeft = KeyC("$"), 15 | ), 16 | KeyItemC( 17 | center = KeyC("2", size = LARGE), 18 | topLeft = KeyC("`"), 19 | top = KeyC("^"), 20 | topRight = KeyC("´"), 21 | right = KeyC("!"), 22 | bottomRight = KeyC("\\"), 23 | bottomLeft = KeyC("/"), 24 | left = KeyC("+"), 25 | ), 26 | KeyItemC( 27 | center = KeyC("3", size = LARGE), 28 | bottomRight = KeyC("€"), 29 | bottomLeft = KeyC("£"), 30 | bottom = KeyC("="), 31 | ), 32 | EMOJI_KEY_ITEM, 33 | ), 34 | listOf( 35 | KeyItemC( 36 | center = KeyC("4", size = LARGE), 37 | topLeft = KeyC("{"), 38 | topRight = KeyC("%"), 39 | bottomRight = KeyC("_"), 40 | bottomLeft = KeyC("["), 41 | left = KeyC("("), 42 | ), 43 | KeyItemC( 44 | center = KeyC("5", size = LARGE), 45 | topLeft = KeyC("ً"), 46 | top = KeyC("ّ"), 47 | topRight = KeyC("َ"), 48 | right = KeyC("ُ"), 49 | bottomRight = KeyC("ِ"), 50 | bottom = KeyC("ْ"), 51 | bottomLeft = KeyC("ٍ"), 52 | left = KeyC("ٌ"), 53 | ), 54 | KeyItemC( 55 | center = KeyC("6", size = LARGE), 56 | topLeft = KeyC("|"), 57 | topRight = KeyC("}"), 58 | right = KeyC(")"), 59 | bottomRight = KeyC("]"), 60 | bottomLeft = KeyC("@"), 61 | ), 62 | ABC_KEY_ITEM, 63 | ), 64 | listOf( 65 | KeyItemC( 66 | center = KeyC("7", size = LARGE), 67 | topLeft = KeyC("~"), 68 | topRight = KeyC("-"), 69 | bottomRight = KeyC(":"), 70 | bottomLeft = KeyC("!"), 71 | left = KeyC("<"), 72 | ), 73 | KeyItemC( 74 | center = KeyC("8", size = LARGE), 75 | topLeft = KeyC("\""), 76 | top = KeyC("*"), 77 | topRight = KeyC("'"), 78 | right = KeyC("؛"), 79 | bottomRight = KeyC("،"), 80 | bottom = KeyC("."), 81 | bottomLeft = KeyC("؟"), 82 | left = KeyC(","), 83 | ), 84 | KeyItemC( 85 | center = KeyC("9", size = LARGE), 86 | top = KeyC("&"), 87 | topRight = KeyC("°"), 88 | right = KeyC(">"), 89 | bottomLeft = KeyC(";"), 90 | left = KeyC("#"), 91 | ), 92 | BACKSPACE_KEY_ITEM, 93 | ), 94 | listOf( 95 | KeyItemC( 96 | center = KeyC("0", size = LARGE), 97 | widthMultiplier = 2, 98 | ), 99 | SPACEBAR_SKINNY_KEY_ITEM, 100 | RETURN_KEY_ITEM, 101 | ), 102 | ), 103 | ) 104 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericTypeSplit.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val TYPESPLIT_NUMERIC_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | textEditKeyItem( 16 | center = KeyC(" "), 17 | ), 18 | KeyItemC( 19 | center = KeyC("1", size = LARGE), 20 | bottomRight = KeyC("!"), 21 | top = KeyC("¯\\_(ツ)_/¯", size = SMALLEST), 22 | bottom = KeyC("~"), 23 | left = KeyC("{"), 24 | ), 25 | KeyItemC( 26 | center = KeyC("2", size = LARGE), 27 | bottom = KeyC("@"), 28 | topLeft = KeyC("`"), 29 | topRight = KeyC("´"), 30 | ), 31 | KeyItemC( 32 | center = KeyC("3", size = LARGE), 33 | right = KeyC("}"), 34 | topRight = KeyC("°"), 35 | bottomLeft = KeyC("#"), 36 | ), 37 | KeyItemC( 38 | center = KeyC(".", size = LARGE), 39 | ), 40 | ), 41 | listOf( 42 | KeyItemC( 43 | center = KeyC(" "), 44 | top = KeyC("+"), 45 | bottom = KeyC("="), 46 | left = KeyC("-"), 47 | right = KeyC("_"), 48 | backgroundColor = SURFACE_VARIANT, 49 | ), 50 | KeyItemC( 51 | center = KeyC("4", size = LARGE), 52 | top = KeyC("\""), 53 | bottom = KeyC(":"), 54 | left = KeyC("("), 55 | right = KeyC("$"), 56 | ), 57 | KeyItemC( 58 | center = KeyC("5", size = LARGE), 59 | left = KeyC("€"), 60 | right = KeyC("£"), 61 | bottom = KeyC("%"), 62 | ), 63 | KeyItemC( 64 | center = KeyC("6", size = LARGE), 65 | top = KeyC("'"), 66 | bottom = KeyC(";"), 67 | left = KeyC("^"), 68 | right = KeyC(")"), 69 | ), 70 | KeyItemC( 71 | center = KeyC(",", size = LARGE), 72 | ), 73 | ), 74 | listOf( 75 | SPACEBAR_SKINNY_KEY_ITEM, 76 | KeyItemC( 77 | center = KeyC("7", size = LARGE), 78 | topLeft = KeyC("["), 79 | topRight = KeyC("&"), 80 | bottomLeft = KeyC("<"), 81 | ), 82 | KeyItemC( 83 | center = KeyC("8", size = LARGE), 84 | top = KeyC("*"), 85 | bottom = KeyC("?"), 86 | left = KeyC("/"), 87 | right = KeyC("\\"), 88 | ), 89 | KeyItemC( 90 | center = KeyC("9", size = LARGE), 91 | left = KeyC("|"), 92 | topRight = KeyC("]"), 93 | bottomRight = KeyC(">"), 94 | ), 95 | KeyItemC( 96 | center = KeyC("0", size = LARGE), 97 | ), 98 | ), 99 | listOf( 100 | ABC_KEY_ITEM_ALT, 101 | BACKSPACE_WIDE_KEY_ITEM, 102 | RETURN_KEY_ITEM, 103 | ), 104 | ), 105 | ) 106 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/Numeric.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val NUMERIC_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("1", size = LARGE), 17 | bottomLeft = KeyC("$"), 18 | bottomRight = 19 | getLocalCurrency()?.let { 20 | if (it !in setOf("$", "£", "€")) { 21 | KeyC(it) 22 | } else { 23 | null 24 | } 25 | }, 26 | ), 27 | KeyItemC( 28 | center = KeyC("2", size = LARGE), 29 | topLeft = KeyC("`"), 30 | top = KeyC("^"), 31 | topRight = KeyC("´"), 32 | right = KeyC("!"), 33 | bottomRight = KeyC("\\"), 34 | bottomLeft = KeyC("/"), 35 | left = KeyC("+"), 36 | ), 37 | KeyItemC( 38 | center = KeyC("3", size = LARGE), 39 | left = KeyC("?"), 40 | bottomRight = KeyC("€"), 41 | bottomLeft = KeyC("£"), 42 | bottom = KeyC("="), 43 | ), 44 | EMOJI_KEY_ITEM, 45 | ), 46 | listOf( 47 | KeyItemC( 48 | center = KeyC("4", size = LARGE), 49 | topLeft = KeyC("{"), 50 | topRight = KeyC("%"), 51 | bottomRight = KeyC("_"), 52 | bottomLeft = KeyC("["), 53 | left = KeyC("("), 54 | ), 55 | KeyItemC( 56 | center = KeyC("5", size = LARGE), 57 | ), 58 | KeyItemC( 59 | center = KeyC("6", size = LARGE), 60 | topLeft = KeyC("|"), 61 | topRight = KeyC("}"), 62 | right = KeyC(")"), 63 | bottomRight = KeyC("]"), 64 | bottomLeft = KeyC("@"), 65 | ), 66 | ABC_KEY_ITEM, 67 | ), 68 | listOf( 69 | KeyItemC( 70 | center = KeyC("7", size = LARGE), 71 | topLeft = KeyC("~"), 72 | bottomRight = KeyC(":"), 73 | bottomLeft = KeyC("<"), 74 | ), 75 | KeyItemC( 76 | center = KeyC("8", size = LARGE), 77 | topLeft = KeyC("\""), 78 | topRight = KeyC("'"), 79 | bottomRight = KeyC("-"), 80 | bottom = KeyC("."), 81 | bottomLeft = KeyC("*"), 82 | left = KeyC(","), 83 | ), 84 | KeyItemC( 85 | center = KeyC("9", size = LARGE), 86 | top = KeyC("&"), 87 | topRight = KeyC("°"), 88 | bottomRight = KeyC(">"), 89 | bottomLeft = KeyC(";"), 90 | left = KeyC("#"), 91 | ), 92 | BACKSPACE_KEY_ITEM, 93 | ), 94 | listOf( 95 | KeyItemC( 96 | center = KeyC("0", size = LARGE), 97 | widthMultiplier = 2, 98 | ), 99 | SPACEBAR_SKINNY_KEY_ITEM, 100 | RETURN_KEY_ITEM, 101 | ), 102 | ), 103 | ) 104 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericFrenchTypeSplit.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val FRENCH_TYPESPLIT_NUMERIC_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | textEditKeyItem( 16 | center = KeyC(" "), 17 | ), 18 | KeyItemC( 19 | center = KeyC("1", size = LARGE), 20 | bottomRight = KeyC("!"), 21 | top = KeyC("¯\\_(ツ)_/¯", size = SMALLEST), 22 | bottom = KeyC("~"), 23 | left = KeyC("{"), 24 | ), 25 | KeyItemC( 26 | center = KeyC("2", size = LARGE), 27 | bottom = KeyC("@"), 28 | topLeft = KeyC("`"), 29 | topRight = KeyC("´"), 30 | ), 31 | KeyItemC( 32 | center = KeyC("3", size = LARGE), 33 | right = KeyC("}"), 34 | topRight = KeyC("°"), 35 | bottomLeft = KeyC("#"), 36 | ), 37 | KeyItemC( 38 | center = KeyC(".", size = LARGE), 39 | ), 40 | ), 41 | listOf( 42 | KeyItemC( 43 | center = KeyC(" "), 44 | top = KeyC("+"), 45 | bottom = KeyC("="), 46 | left = KeyC("-"), 47 | right = KeyC("_"), 48 | backgroundColor = SURFACE_VARIANT, 49 | ), 50 | KeyItemC( 51 | center = KeyC("4", size = LARGE), 52 | top = KeyC("\""), 53 | bottom = KeyC(":"), 54 | left = KeyC("("), 55 | right = KeyC("$"), 56 | ), 57 | KeyItemC( 58 | center = KeyC("5", size = LARGE), 59 | left = KeyC("€"), 60 | right = KeyC("£"), 61 | bottom = KeyC("%"), 62 | ), 63 | KeyItemC( 64 | center = KeyC("6", size = LARGE), 65 | top = KeyC("'"), 66 | bottom = KeyC(";"), 67 | left = KeyC("^"), 68 | right = KeyC(")"), 69 | ), 70 | KeyItemC( 71 | center = KeyC(",", size = LARGE), 72 | ), 73 | ), 74 | listOf( 75 | SPACEBAR_FRENCH_SKINNY_KEY_ITEM, 76 | KeyItemC( 77 | center = KeyC("7", size = LARGE), 78 | topLeft = KeyC("["), 79 | topRight = KeyC("&"), 80 | bottomLeft = KeyC("<"), 81 | ), 82 | KeyItemC( 83 | center = KeyC("8", size = LARGE), 84 | top = KeyC("*"), 85 | bottom = KeyC("?"), 86 | left = KeyC("/"), 87 | right = KeyC("\\"), 88 | ), 89 | KeyItemC( 90 | center = KeyC("9", size = LARGE), 91 | left = KeyC("|"), 92 | topRight = KeyC("]"), 93 | bottomRight = KeyC(">"), 94 | ), 95 | KeyItemC( 96 | center = KeyC("0", size = LARGE), 97 | ), 98 | ), 99 | listOf( 100 | ABC_KEY_ITEM_ALT, 101 | BACKSPACE_WIDE_KEY_ITEM, 102 | RETURN_KEY_ITEM, 103 | ), 104 | ), 105 | ) 106 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericMyanmar.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val MYANMAR_NUMERIC_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("၁", size = LARGE), 17 | bottomLeft = KeyC("$"), 18 | bottomRight = 19 | getLocalCurrency()?.let { 20 | if (it !in setOf("$", "£", "€")) { 21 | KeyC(it) 22 | } else { 23 | null 24 | } 25 | }, 26 | ), 27 | KeyItemC( 28 | center = KeyC("၂", size = LARGE), 29 | topLeft = KeyC("`"), 30 | top = KeyC("^"), 31 | topRight = KeyC("´"), 32 | right = KeyC("!"), 33 | bottomRight = KeyC("\\"), 34 | bottomLeft = KeyC("/"), 35 | left = KeyC("+"), 36 | ), 37 | KeyItemC( 38 | center = KeyC("၃", size = LARGE), 39 | left = KeyC("?"), 40 | bottomRight = KeyC("€"), 41 | bottomLeft = KeyC("£"), 42 | bottom = KeyC("="), 43 | ), 44 | EMOJI_KEY_ITEM, 45 | ), 46 | listOf( 47 | KeyItemC( 48 | center = KeyC("၄", size = LARGE), 49 | topLeft = KeyC("{"), 50 | topRight = KeyC("%"), 51 | bottomRight = KeyC("_"), 52 | bottomLeft = KeyC("["), 53 | left = KeyC("("), 54 | ), 55 | KeyItemC( 56 | center = KeyC("၅", size = LARGE), 57 | ), 58 | KeyItemC( 59 | center = KeyC("၆", size = LARGE), 60 | topLeft = KeyC("|"), 61 | topRight = KeyC("}"), 62 | right = KeyC(")"), 63 | bottomRight = KeyC("]"), 64 | bottomLeft = KeyC("@"), 65 | ), 66 | ABC_KEY_ITEM, 67 | ), 68 | listOf( 69 | KeyItemC( 70 | center = KeyC("၇", size = LARGE), 71 | topLeft = KeyC("~"), 72 | bottomRight = KeyC(":"), 73 | bottomLeft = KeyC("<"), 74 | ), 75 | KeyItemC( 76 | center = KeyC("၈", size = LARGE), 77 | topLeft = KeyC("\""), 78 | topRight = KeyC("'"), 79 | bottomRight = KeyC("-"), 80 | bottom = KeyC("."), 81 | bottomLeft = KeyC("*"), 82 | left = KeyC(","), 83 | ), 84 | KeyItemC( 85 | center = KeyC("၉", size = LARGE), 86 | top = KeyC("&"), 87 | topRight = KeyC("°"), 88 | bottomRight = KeyC(">"), 89 | bottomLeft = KeyC(";"), 90 | left = KeyC("#"), 91 | ), 92 | BACKSPACE_KEY_ITEM, 93 | ), 94 | listOf( 95 | KeyItemC( 96 | center = KeyC("၀", size = LARGE), 97 | widthMultiplier = 2, 98 | ), 99 | SPACEBAR_SKINNY_KEY_ITEM, 100 | RETURN_KEY_ITEM, 101 | ), 102 | ), 103 | ) 104 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericFarsiSamsung.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val FARSI_NUMERIC_SAMSUNG_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("۱", size = LARGE), 17 | right = KeyC("ّ", displayText = "ـّ"), 18 | bottom = KeyC("٫"), 19 | bottomLeft = KeyC("﷼"), 20 | ), 21 | KeyItemC( 22 | center = KeyC("۲", size = LARGE), 23 | topLeft = KeyC("`"), 24 | top = KeyC("^"), 25 | topRight = KeyC("´"), 26 | right = KeyC("!"), 27 | bottomRight = KeyC("\\"), 28 | bottomLeft = KeyC("/"), 29 | left = KeyC("+"), 30 | ), 31 | KeyItemC( 32 | center = KeyC("۳", size = LARGE), 33 | left = KeyC("؟"), 34 | bottomRight = KeyC("$"), 35 | bottom = KeyC("="), 36 | ), 37 | EMOJI_KEY_ITEM, 38 | ), 39 | listOf( 40 | KeyItemC( 41 | center = KeyC("۴", size = LARGE), 42 | topLeft = KeyC("{"), 43 | topRight = KeyC("٪"), 44 | bottomRight = KeyC("_"), 45 | bottomLeft = KeyC("["), 46 | left = KeyC("("), 47 | ), 48 | KeyItemC( 49 | center = KeyC("۵", size = LARGE), 50 | topLeft = KeyC("ُ", displayText = "ـُ"), 51 | topRight = KeyC("َ", displayText = "ـَ"), 52 | bottom = KeyC("ِ", displayText = "ـِ"), 53 | ), 54 | KeyItemC( 55 | center = KeyC("۶", size = LARGE), 56 | topLeft = KeyC("|"), 57 | topRight = KeyC("}"), 58 | right = KeyC(")"), 59 | bottomRight = KeyC("]"), 60 | bottomLeft = KeyC("@"), 61 | ), 62 | ABC_KEY_ITEM, 63 | ), 64 | listOf( 65 | KeyItemC( 66 | center = KeyC("۷", size = LARGE), 67 | topLeft = KeyC("~"), 68 | topRight = KeyC("ً", displayText = "ـً"), 69 | bottomRight = KeyC(":"), 70 | bottomLeft = KeyC("<"), 71 | left = KeyC("«"), 72 | ), 73 | KeyItemC( 74 | center = KeyC("۸", size = LARGE), 75 | topLeft = KeyC("\""), 76 | topRight = KeyC("'"), 77 | bottomRight = KeyC("-"), 78 | bottom = KeyC("."), 79 | bottomLeft = KeyC("*"), 80 | left = KeyC("،"), 81 | ), 82 | KeyItemC( 83 | center = KeyC("۹", size = LARGE), 84 | top = KeyC("&"), 85 | topRight = KeyC("°"), 86 | right = KeyC("»"), 87 | bottomRight = KeyC(">"), 88 | bottomLeft = KeyC("؛"), 89 | left = KeyC("#"), 90 | ), 91 | BACKSPACE_KEY_ITEM, 92 | ), 93 | listOf( 94 | KeyItemC( 95 | center = KeyC("۰", size = LARGE), 96 | widthMultiplier = 2, 97 | ), 98 | SPACEBAR_FARSI_SKINNY_KEY_ITEM, 99 | RETURN_KEY_ITEM, 100 | ), 101 | ), 102 | ) 103 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/HEThumbKey.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_HE_THUMBKEY_MAIN = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("מ", size = LARGE), 17 | topLeft = KeyC("\u200E", displayText = "LRM", color = MUTED), 18 | bottomRight = KeyC("נ"), 19 | swipeType = FOUR_WAY_DIAGONAL, 20 | ), 21 | KeyItemC( 22 | center = KeyC("ב", size = LARGE), 23 | bottom = KeyC("ע"), 24 | swipeType = TWO_WAY_VERTICAL, 25 | ), 26 | KeyItemC( 27 | center = KeyC("א", size = LARGE), 28 | topRight = KeyC("\u200F", displayText = "RLM", color = MUTED), 29 | bottomLeft = KeyC("כ"), 30 | swipeType = FOUR_WAY_DIAGONAL, 31 | ), 32 | EMOJI_KEY_ITEM, 33 | ), 34 | listOf( 35 | KeyItemC( 36 | center = KeyC("ת", size = LARGE), 37 | right = KeyC("ם"), 38 | left = KeyC("ץ"), 39 | swipeType = TWO_WAY_HORIZONTAL, 40 | ), 41 | KeyItemC( 42 | center = KeyC("ל", size = LARGE), 43 | topLeft = KeyC("ט"), 44 | top = KeyC("ך"), 45 | topRight = KeyC("ק"), 46 | right = KeyC("צ"), 47 | bottomRight = KeyC("ס"), 48 | bottom = KeyC("ז"), 49 | bottomLeft = KeyC("ג"), 50 | left = KeyC("ן"), 51 | ), 52 | KeyItemC( 53 | center = KeyC("ו", size = LARGE), 54 | left = KeyC("פ"), 55 | right = KeyC("ף"), 56 | swipeType = TWO_WAY_HORIZONTAL, 57 | ), 58 | NUMERIC_KEY_ITEM, 59 | ), 60 | listOf( 61 | KeyItemC( 62 | center = KeyC("ר", size = LARGE), 63 | topRight = KeyC("ש"), 64 | bottomRight = KeyC("”", color = MUTED), 65 | swipeType = FOUR_WAY_DIAGONAL, 66 | ), 67 | KeyItemC( 68 | center = KeyC("ה", size = LARGE), 69 | topLeft = KeyC("״", color = MUTED), 70 | top = KeyC("ד"), 71 | topRight = KeyC("׳", color = MUTED), 72 | right = KeyC("–", color = MUTED), 73 | bottomRight = KeyC("…", color = MUTED), 74 | bottom = KeyC(".", color = MUTED), 75 | bottomLeft = KeyC(",", color = MUTED), 76 | left = KeyC("־", color = MUTED), 77 | ), 78 | KeyItemC( 79 | center = KeyC("י", size = LARGE), 80 | topLeft = KeyC("ח"), 81 | bottomLeft = KeyC("’", color = MUTED), 82 | swipeType = FOUR_WAY_DIAGONAL, 83 | ), 84 | BACKSPACE_KEY_ITEM, 85 | ), 86 | listOf( 87 | SPACEBAR_KEY_ITEM, 88 | RETURN_KEY_ITEM, 89 | ), 90 | ), 91 | ) 92 | 93 | val KB_HE_THUMBKEY: KeyboardDefinition = 94 | KeyboardDefinition( 95 | title = "עברית thumb-key", 96 | modes = 97 | KeyboardDefinitionModes( 98 | main = KB_HE_THUMBKEY_MAIN, 99 | shifted = KB_HE_THUMBKEY_MAIN, 100 | numeric = NUMERIC_KEYBOARD, 101 | ), 102 | ) 103 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericENMessagEase.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_EN_MESSAGEASE_NUMERIC = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("1", size = LARGE), 17 | bottomLeft = KeyC("$"), 18 | right = KeyC("-"), 19 | bottomRight = 20 | getLocalCurrency()?.let { 21 | if (it !in setOf("$", "£", "€")) { 22 | KeyC(it) 23 | } else { 24 | null 25 | } 26 | }, 27 | ), 28 | KeyItemC( 29 | center = KeyC("2", size = LARGE), 30 | topLeft = KeyC("`"), 31 | top = KeyC("^"), 32 | topRight = KeyC("´"), 33 | right = KeyC("!"), 34 | bottomRight = KeyC("\\"), 35 | bottomLeft = KeyC("/"), 36 | left = KeyC("+"), 37 | ), 38 | KeyItemC( 39 | center = KeyC("3", size = LARGE), 40 | left = KeyC("?"), 41 | bottomRight = KeyC("€"), 42 | bottomLeft = KeyC("£"), 43 | bottom = KeyC("="), 44 | ), 45 | EMOJI_KEY_ITEM, 46 | ), 47 | listOf( 48 | KeyItemC( 49 | center = KeyC("4", size = LARGE), 50 | topLeft = KeyC("{"), 51 | topRight = KeyC("%"), 52 | bottomRight = KeyC("_"), 53 | bottomLeft = KeyC("["), 54 | left = KeyC("("), 55 | ), 56 | KeyItemC( 57 | center = KeyC("5", size = LARGE), 58 | top = KeyC("¬"), 59 | ), 60 | KeyItemC( 61 | center = KeyC("6", size = LARGE), 62 | topLeft = KeyC("|"), 63 | topRight = KeyC("}"), 64 | right = KeyC(")"), 65 | bottomRight = KeyC("]"), 66 | bottomLeft = KeyC("@"), 67 | ), 68 | ABC_KEY_ITEM, 69 | ), 70 | listOf( 71 | KeyItemC( 72 | center = KeyC("7", size = LARGE), 73 | topLeft = KeyC("~"), 74 | left = KeyC("<"), 75 | right = KeyC("*"), 76 | bottomRight = KeyC("\t", displayText = "⇥"), 77 | ), 78 | KeyItemC( 79 | center = KeyC("8", size = LARGE), 80 | topLeft = KeyC("\""), 81 | topRight = KeyC("'"), 82 | bottomRight = KeyC(":"), 83 | bottom = KeyC("."), 84 | bottomLeft = KeyC(","), 85 | ), 86 | KeyItemC( 87 | center = KeyC("9", size = LARGE), 88 | top = KeyC("&"), 89 | topRight = KeyC("°"), 90 | right = KeyC(">"), 91 | bottomLeft = KeyC(";"), 92 | left = KeyC("#"), 93 | ), 94 | BACKSPACE_KEY_ITEM, 95 | ), 96 | listOf( 97 | KeyItemC( 98 | center = KeyC("0", size = LARGE), 99 | widthMultiplier = 2, 100 | ), 101 | SPACEBAR_SKINNY_KEY_ITEM, 102 | RETURN_KEY_ITEM, 103 | ), 104 | ), 105 | ) 106 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericESMessagEase.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | // this val is so we can can use mapOf in the key with currency symbol 12 | val KB_ES_MESSAGEASE_CURRENCY_SYMBOL: String = 13 | getLocalCurrency()?.let { 14 | if (it !in setOf("$", "£", "€")) { 15 | it 16 | } else { 17 | "$" 18 | } 19 | }!! 20 | 21 | val KB_ES_MESSAGEASE_NUMERIC = 22 | KeyboardC( 23 | listOf( 24 | listOf( 25 | KeyItemC( 26 | center = KeyC("1", size = LARGE), 27 | right = KeyC("-"), 28 | bottomLeft = KeyC(KB_ES_MESSAGEASE_CURRENCY_SYMBOL), 29 | ), 30 | KeyItemC( 31 | center = KeyC("2", size = LARGE), 32 | topLeft = KeyC("`"), 33 | top = KeyC("^"), 34 | topRight = KeyC("´"), 35 | right = KeyC("!"), 36 | bottomRight = KeyC("\\"), 37 | bottomLeft = KeyC("/"), 38 | left = KeyC("+"), 39 | ), 40 | KeyItemC( 41 | center = KeyC("3", size = LARGE), 42 | topRight = KeyC("¡"), 43 | left = KeyC("?"), 44 | right = KeyC("¿"), 45 | bottomRight = KeyC("€"), 46 | bottomLeft = KeyC("£"), 47 | bottom = KeyC("="), 48 | ), 49 | EMOJI_KEY_ITEM, 50 | ), 51 | listOf( 52 | KeyItemC( 53 | center = KeyC("4", size = LARGE), 54 | topLeft = KeyC("{"), 55 | topRight = KeyC("%"), 56 | bottomRight = KeyC("_"), 57 | bottomLeft = KeyC("["), 58 | left = KeyC("("), 59 | ), 60 | KeyItemC( 61 | center = KeyC("5", size = LARGE), 62 | top = KeyC("¬"), 63 | ), 64 | KeyItemC( 65 | center = KeyC("6", size = LARGE), 66 | topLeft = KeyC("|"), 67 | topRight = KeyC("}"), 68 | right = KeyC(")"), 69 | bottomRight = KeyC("]"), 70 | bottomLeft = KeyC("@"), 71 | ), 72 | ABC_KEY_ITEM, 73 | ), 74 | listOf( 75 | KeyItemC( 76 | center = KeyC("7", size = LARGE), 77 | topLeft = KeyC("~"), 78 | top = KeyC("¨"), 79 | left = KeyC("<"), 80 | right = KeyC("*"), 81 | ), 82 | KeyItemC( 83 | center = KeyC("8", size = LARGE), 84 | topLeft = KeyC("\""), 85 | topRight = KeyC("'"), 86 | bottomRight = KeyC(":"), 87 | bottom = KeyC("."), 88 | bottomLeft = KeyC(","), 89 | ), 90 | KeyItemC( 91 | center = KeyC("9", size = LARGE), 92 | top = KeyC("&"), 93 | topRight = KeyC("°"), 94 | right = KeyC(">"), 95 | bottomLeft = KeyC(";"), 96 | left = KeyC("#"), 97 | ), 98 | BACKSPACE_KEY_ITEM, 99 | ), 100 | listOf( 101 | KeyItemC( 102 | center = KeyC("0", size = LARGE), 103 | widthMultiplier = 2, 104 | ), 105 | SPACEBAR_SKINNY_KEY_ITEM, 106 | RETURN_KEY_ITEM, 107 | ), 108 | ), 109 | ) 110 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericDual.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val NUMERIC_KEYBOARD_DUAL = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | EMOJI_KEY_ITEM, 16 | KeyItemC( 17 | center = KeyC("1", size = LARGE), 18 | bottomLeft = KeyC("$"), 19 | bottomRight = 20 | getLocalCurrency()?.let { 21 | if (it !in setOf("$", "£", "€")) { 22 | KeyC(it) 23 | } else { 24 | null 25 | } 26 | }, 27 | ), 28 | KeyItemC( 29 | center = KeyC("2", size = LARGE), 30 | topLeft = KeyC("`"), 31 | top = KeyC("^"), 32 | topRight = KeyC("´"), 33 | right = KeyC("!"), 34 | bottomRight = KeyC("\\"), 35 | bottomLeft = KeyC("/"), 36 | left = KeyC("+"), 37 | ), 38 | KeyItemC( 39 | center = KeyC("3", size = LARGE), 40 | left = KeyC("?"), 41 | bottomRight = KeyC("€"), 42 | bottomLeft = KeyC("£"), 43 | bottom = KeyC("="), 44 | ), 45 | EMOJI_KEY_ITEM, 46 | ), 47 | listOf( 48 | ABC_KEY_ITEM, 49 | KeyItemC( 50 | center = KeyC("4", size = LARGE), 51 | topLeft = KeyC("{"), 52 | topRight = KeyC("%"), 53 | bottomRight = KeyC("_"), 54 | bottomLeft = KeyC("["), 55 | left = KeyC("("), 56 | ), 57 | KeyItemC( 58 | center = KeyC("5", size = LARGE), 59 | ), 60 | KeyItemC( 61 | center = KeyC("6", size = LARGE), 62 | topLeft = KeyC("|"), 63 | topRight = KeyC("}"), 64 | right = KeyC(")"), 65 | bottomRight = KeyC("]"), 66 | bottomLeft = KeyC("@"), 67 | ), 68 | ABC_KEY_ITEM, 69 | ), 70 | listOf( 71 | BACKSPACE_KEY_ITEM, 72 | KeyItemC( 73 | center = KeyC("7", size = LARGE), 74 | topLeft = KeyC("~"), 75 | bottomRight = KeyC(":"), 76 | bottomLeft = KeyC("<"), 77 | ), 78 | KeyItemC( 79 | center = KeyC("8", size = LARGE), 80 | topLeft = KeyC("\""), 81 | topRight = KeyC("'"), 82 | bottomRight = KeyC("-"), 83 | bottom = KeyC("."), 84 | bottomLeft = KeyC("*"), 85 | left = KeyC(","), 86 | ), 87 | KeyItemC( 88 | center = KeyC("9", size = LARGE), 89 | top = KeyC("&"), 90 | topRight = KeyC("°"), 91 | bottomRight = KeyC(">"), 92 | bottomLeft = KeyC(";"), 93 | left = KeyC("#"), 94 | ), 95 | BACKSPACE_KEY_ITEM, 96 | ), 97 | listOf( 98 | RETURN_KEY_ITEM, 99 | KeyItemC( 100 | center = KeyC("0", size = LARGE), 101 | widthMultiplier = 2, 102 | ), 103 | SPACEBAR_SKINNY_KEY_ITEM, 104 | RETURN_KEY_ITEM, 105 | ), 106 | ), 107 | ) 108 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericFrench.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val FRENCH_NUMERIC_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("1", size = LARGE), 17 | bottomLeft = KeyC("$"), 18 | bottomRight = 19 | getLocalCurrency()?.let { 20 | if (it !in setOf("$", "£", "€")) { 21 | KeyC(it) 22 | } else { 23 | null 24 | } 25 | }, 26 | ), 27 | KeyItemC( 28 | center = KeyC("2", size = LARGE), 29 | topLeft = KeyC("`"), 30 | top = KeyC("^"), 31 | topRight = KeyC("´"), 32 | right = KeyC("!"), 33 | bottomRight = KeyC("\\"), 34 | bottomLeft = KeyC("/", swipeReturnAction = CommitText("\\")), 35 | left = KeyC("+", swipeReturnAction = CommitText("±")), 36 | ), 37 | KeyItemC( 38 | center = KeyC("3", size = LARGE), 39 | left = KeyC("?", swipeReturnAction = CommitText("!")), 40 | bottomRight = KeyC("€"), 41 | bottomLeft = KeyC("£"), 42 | bottom = KeyC("="), 43 | ), 44 | EMOJI_KEY_ITEM, 45 | ), 46 | listOf( 47 | KeyItemC( 48 | center = KeyC("4", size = LARGE), 49 | topLeft = KeyC("{"), 50 | topRight = KeyC("%"), 51 | bottomRight = KeyC("_"), 52 | bottomLeft = KeyC("["), 53 | left = KeyC("("), 54 | ), 55 | KeyItemC( 56 | center = KeyC("5", size = LARGE), 57 | ), 58 | KeyItemC( 59 | center = KeyC("6", size = LARGE), 60 | topLeft = KeyC("|"), 61 | topRight = KeyC("}"), 62 | right = KeyC(")"), 63 | bottomRight = KeyC("]"), 64 | bottomLeft = KeyC("@"), 65 | ), 66 | ABC_KEY_ITEM, 67 | ), 68 | listOf( 69 | KeyItemC( 70 | center = KeyC("7", size = LARGE), 71 | topLeft = KeyC("~"), 72 | bottomRight = KeyC(":"), 73 | bottomLeft = KeyC("<"), 74 | ), 75 | KeyItemC( 76 | center = KeyC("8", size = LARGE), 77 | topLeft = KeyC("\""), 78 | topRight = KeyC("'", swipeReturnAction = CommitText("\"")), 79 | bottomRight = KeyC("-"), 80 | bottom = KeyC("."), 81 | bottomLeft = KeyC("*"), 82 | left = KeyC(","), 83 | ), 84 | KeyItemC( 85 | center = KeyC("9", size = LARGE), 86 | top = KeyC("&"), 87 | topRight = KeyC("°"), 88 | bottomRight = KeyC(">"), 89 | bottomLeft = KeyC(";"), 90 | left = KeyC("#"), 91 | ), 92 | BACKSPACE_KEY_ITEM, 93 | ), 94 | listOf( 95 | KeyItemC( 96 | center = KeyC("0", size = LARGE), 97 | widthMultiplier = 2, 98 | ), 99 | SPACEBAR_FRENCH_SKINNY_KEY_ITEM, 100 | RETURN_KEY_ITEM, 101 | ), 102 | ), 103 | ) 104 | -------------------------------------------------------------------------------- /app/src/main/res/values-zh-rCN/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Thumb-Key 4 | 设置 5 | 系统 6 | 亮色 7 | 暗色 8 | 动态(跟随系统) 9 | 绿 10 | 11 | AMOLED 12 | Srcery 13 | 蓝色 14 | Dracula 15 | Twilight 16 | 高对比度 17 | 带颜色的高对比度 18 | 安康色 19 | 居中 20 | 靠右 21 | 靠左 22 | 关于 23 | 更新内容 24 | 版本 %1$s 25 | 正式版 26 | 支持 27 | 问题聚焦 28 | 开发者Matrix聊天室 29 | 捐赠 30 | 社交媒体 31 | 加入 c/thumbkey 32 | 在Mastodon上关注我 33 | 开源 34 | 源码 35 | Thumb-Key是一个自由开源软件, 使用GNU Affero General Public License v3.0协议传播 36 | 外观和体验 37 | 行为 38 | 布局 39 | 主题 40 | 主题色 41 | 位置 42 | 按键震动 43 | 需要在系统设置中把触摸反馈打开 44 | 按键音 45 | 自动大写 46 | 按键大小: %1$s 47 | 非方正按键 48 | 按键高度: %1$s 49 | 按键宽度: %1$s 50 | 底部上移: %1$s 51 | 滑动判定长度: %1$s 52 | 动画速度: %1$s 53 | 提示动画速度: %1$s 54 | 滑动速度 55 | 光标移动模式 56 | 滑动灵敏度: %1$s 57 | 匀速 58 | 线性加速 59 | 成倍加速 60 | 阈值加速 61 | 空格键: 允许正常滑动与滑动手势配合使用 62 | 退格键: 允许正常滑动与滑动手势配合使用 63 | 重置为默认值 64 | 确认重置所有设置 65 | 重置 66 | 取消 67 | 点我测试键盘效果 68 | 设置 69 | 用户手册 70 | 设置Thumb-Key 71 | 启用输入法 72 | 选择输入法 73 | 完成设置 74 | 选中文本已复制 75 | 隐藏字符 76 | 隐藏标点 77 | 连击空格键 78 | 完成 79 | 键盘背景同步变色 80 | 按键填充: %1$s 81 | 按键边缘厚度: %1$s 82 | 按键圆角半径: %1$s 83 | 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericFarsi.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val FARSI_NUMERIC_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("۱", size = LARGE), 17 | right = KeyC("ّ", displayText = "ـّ"), 18 | bottom = KeyC("٫"), 19 | bottomLeft = KeyC("﷼"), 20 | ), 21 | KeyItemC( 22 | center = KeyC("۲", size = LARGE), 23 | topLeft = KeyC("`"), 24 | top = KeyC("^"), 25 | topRight = KeyC("´"), 26 | right = KeyC("!"), 27 | bottomRight = KeyC("\\"), 28 | bottomLeft = KeyC("/"), 29 | left = KeyC("+"), 30 | ), 31 | KeyItemC( 32 | center = KeyC("۳", size = LARGE), 33 | left = KeyC("؟"), 34 | bottomRight = KeyC("$"), 35 | bottom = KeyC("="), 36 | ), 37 | EMOJI_KEY_ITEM, 38 | ), 39 | listOf( 40 | KeyItemC( 41 | center = KeyC("۴", size = LARGE), 42 | topLeft = KeyC("}", displayText = "{"), 43 | topRight = KeyC("٪"), 44 | bottomRight = KeyC("_"), 45 | bottomLeft = KeyC("]", displayText = "["), 46 | left = KeyC(")", displayText = "("), 47 | ), 48 | KeyItemC( 49 | center = KeyC("۵", size = LARGE), 50 | topLeft = KeyC("ُ", displayText = "ـُ"), 51 | topRight = KeyC("َ", displayText = "ـَ"), 52 | bottom = KeyC("ِ", displayText = "ـِ"), 53 | ), 54 | KeyItemC( 55 | center = KeyC("۶", size = LARGE), 56 | topLeft = KeyC("|"), 57 | topRight = KeyC("{", displayText = "}"), 58 | right = KeyC("(", displayText = ")"), 59 | bottomRight = KeyC("[", displayText = "]"), 60 | bottomLeft = KeyC("@"), 61 | ), 62 | ABC_KEY_ITEM, 63 | ), 64 | listOf( 65 | KeyItemC( 66 | center = KeyC("۷", size = LARGE), 67 | topLeft = KeyC("~"), 68 | topRight = KeyC("ً", displayText = "ـً"), 69 | bottomRight = KeyC(":"), 70 | bottomLeft = KeyC(">", displayText = "<"), 71 | left = KeyC("»", displayText = "«"), 72 | ), 73 | KeyItemC( 74 | center = KeyC("۸", size = LARGE), 75 | topLeft = KeyC("\""), 76 | topRight = KeyC("'"), 77 | bottomRight = KeyC("-"), 78 | bottom = KeyC("."), 79 | bottomLeft = KeyC("*"), 80 | left = KeyC("،"), 81 | ), 82 | KeyItemC( 83 | center = KeyC("۹", size = LARGE), 84 | top = KeyC("&"), 85 | topRight = KeyC("°"), 86 | right = KeyC("«", displayText = "»"), 87 | bottomRight = KeyC("<", displayText = ">"), 88 | bottomLeft = KeyC("؛"), 89 | left = KeyC("#"), 90 | ), 91 | BACKSPACE_KEY_ITEM, 92 | ), 93 | listOf( 94 | KeyItemC( 95 | center = KeyC("۰", size = LARGE), 96 | widthMultiplier = 2, 97 | ), 98 | SPACEBAR_FARSI_SKINNY_KEY_ITEM, 99 | RETURN_KEY_ITEM, 100 | ), 101 | ), 102 | ) 103 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/FAThumbKey.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_FA_THUMBKEY_MAIN = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("د", size = LARGE), 17 | bottomRight = KeyC("ص"), 18 | bottom = KeyC("ض"), 19 | ), 20 | KeyItemC( 21 | center = KeyC("ر", size = LARGE), 22 | right = KeyC("ژ"), 23 | bottomRight = KeyC("ف"), 24 | bottom = KeyC("ز"), 25 | bottomLeft = KeyC("ق"), 26 | ), 27 | KeyItemC( 28 | center = KeyC("و", size = LARGE), 29 | topRight = 30 | KeyC( 31 | display = KeyDisplay.TextDisplay("‹"), 32 | action = CommitText("\u200F"), // Right-to-Left Mark (RLM) 33 | color = MUTED, 34 | ), 35 | bottom = KeyC("ء"), 36 | bottomLeft = KeyC("ع"), 37 | ), 38 | EMOJI_KEY_ITEM, 39 | ), 40 | listOf( 41 | KeyItemC( 42 | center = KeyC("ن", size = LARGE), 43 | right = KeyC("ج"), 44 | topRight = KeyC("ح"), 45 | bottomRight = KeyC("چ"), 46 | ), 47 | KeyItemC( 48 | center = KeyC("ا", size = LARGE), 49 | topLeft = KeyC("ذ"), 50 | top = KeyC("ب"), 51 | topRight = KeyC("پ"), 52 | right = KeyC("س"), 53 | bottomRight = KeyC("ش"), 54 | bottom = KeyC("ل"), 55 | bottomLeft = KeyC("آ"), 56 | left = KeyC("خ"), 57 | ), 58 | KeyItemC( 59 | center = KeyC("م", size = LARGE), 60 | bottomLeft = KeyC("گ"), 61 | left = KeyC("ک"), 62 | topLeft = KeyC("غ"), 63 | ), 64 | NUMERIC_KEY_ITEM, 65 | ), 66 | listOf( 67 | KeyItemC( 68 | center = KeyC("ت", size = LARGE), 69 | topRight = KeyC("ث"), 70 | ), 71 | KeyItemC( 72 | center = KeyC("ی", size = LARGE), 73 | top = 74 | KeyC( 75 | display = KeyDisplay.TextDisplay("‹›"), 76 | action = CommitText("\u200C"), // Zero Width Non-Joiner (ZWNJ) 77 | color = MUTED, 78 | ), 79 | right = KeyC("ئ"), 80 | bottomRight = KeyC("ـ", color = MUTED), 81 | bottom = KeyC(".", color = MUTED), 82 | left = KeyC("؟", color = MUTED), 83 | bottomLeft = KeyC("*", color = MUTED), 84 | ), 85 | KeyItemC( 86 | center = KeyC("ه", size = LARGE), 87 | topLeft = KeyC("ط"), 88 | top = KeyC("ظ"), 89 | left = KeyC("ۀ"), 90 | ), 91 | BACKSPACE_KEY_ITEM, 92 | ), 93 | listOf( 94 | SPACEBAR_FARSI_KEY_ITEM, 95 | RETURN_KEY_ITEM, 96 | ), 97 | ), 98 | ) 99 | 100 | val KB_FA_THUMBKEY: KeyboardDefinition = 101 | KeyboardDefinition( 102 | title = "فارسی thumb-key", 103 | modes = 104 | KeyboardDefinitionModes( 105 | main = KB_FA_THUMBKEY_MAIN, 106 | shifted = KB_FA_THUMBKEY_MAIN, 107 | numeric = FARSI_NUMERIC_KEYBOARD, 108 | ), 109 | ) 110 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericPTEN.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val NUMERIC_PT_EN_KEYBOARD = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("1", size = LARGE), 17 | bottomLeft = KeyC("$"), 18 | bottomRight = 19 | getLocalCurrency()?.let { 20 | if (it !in setOf("$", "£", "€")) { 21 | KeyC(it) 22 | } else { 23 | null 24 | } 25 | }, 26 | ), 27 | KeyItemC( 28 | center = KeyC("2", size = LARGE), 29 | topLeft = KeyC("`"), 30 | top = KeyC("^"), 31 | topRight = KeyC("´"), 32 | right = KeyC("!"), 33 | bottomRight = KeyC("\\"), 34 | bottomLeft = KeyC("/"), 35 | left = KeyC("+"), 36 | ), 37 | KeyItemC( 38 | center = KeyC("3", size = LARGE), 39 | topLeft = KeyC("ù", color = MUTED), 40 | top = KeyC("ü", color = MUTED), 41 | topRight = KeyC("ũ", color = MUTED), 42 | left = KeyC("?"), 43 | right = KeyC("ò", color = MUTED), 44 | bottomLeft = KeyC("£"), 45 | bottom = KeyC("="), 46 | bottomRight = KeyC("€"), 47 | ), 48 | EMOJI_KEY_ITEM, 49 | ), 50 | listOf( 51 | KeyItemC( 52 | center = KeyC("4", size = LARGE), 53 | topLeft = KeyC("{"), 54 | topRight = KeyC("%"), 55 | left = KeyC("("), 56 | bottomLeft = KeyC("["), 57 | bottom = KeyC("@", color = MUTED), 58 | bottomRight = KeyC("_"), 59 | ), 60 | KeyItemC( 61 | center = KeyC("5", size = LARGE), 62 | ), 63 | KeyItemC( 64 | center = KeyC("6", size = LARGE), 65 | topLeft = KeyC("|"), 66 | topRight = KeyC("}"), 67 | right = KeyC(")"), 68 | bottomLeft = KeyC("@"), 69 | bottomRight = KeyC("]"), 70 | ), 71 | ABC_KEY_ITEM, 72 | ), 73 | listOf( 74 | KeyItemC( 75 | center = KeyC("7", size = LARGE), 76 | topLeft = KeyC("~"), 77 | bottomRight = KeyC(":"), 78 | bottomLeft = KeyC("<"), 79 | ), 80 | KeyItemC( 81 | center = KeyC("8", size = LARGE), 82 | topLeft = KeyC("\""), 83 | top = KeyC("ì", color = MUTED), 84 | topRight = KeyC("'"), 85 | left = KeyC(","), 86 | right = KeyC("î", color = MUTED), 87 | bottomLeft = KeyC("*"), 88 | bottom = KeyC("."), 89 | bottomRight = KeyC("-"), 90 | ), 91 | KeyItemC( 92 | center = KeyC("9", size = LARGE), 93 | topLeft = KeyC("è", color = MUTED), 94 | top = KeyC("&"), 95 | topRight = KeyC("°"), 96 | bottomRight = KeyC(">"), 97 | bottomLeft = KeyC(";"), 98 | left = KeyC("#"), 99 | ), 100 | BACKSPACE_KEY_ITEM, 101 | ), 102 | listOf( 103 | KeyItemC( 104 | center = KeyC("0", size = LARGE), 105 | widthMultiplier = 2, 106 | ), 107 | SPACEBAR_SKINNY_KEY_ITEM, 108 | RETURN_KEY_ITEM, 109 | ), 110 | ), 111 | ) 112 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/ui/components/common/Dialogs.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey.ui.components.common 2 | 3 | import androidx.compose.foundation.layout.Column 4 | import androidx.compose.foundation.layout.fillMaxSize 5 | import androidx.compose.foundation.layout.fillMaxWidth 6 | import androidx.compose.foundation.rememberScrollState 7 | import androidx.compose.foundation.verticalScroll 8 | import androidx.compose.material3.AlertDialog 9 | import androidx.compose.material3.Button 10 | import androidx.compose.material3.MaterialTheme 11 | import androidx.compose.material3.Text 12 | import androidx.compose.runtime.Composable 13 | import androidx.compose.runtime.LaunchedEffect 14 | import androidx.compose.runtime.collectAsState 15 | import androidx.compose.runtime.getValue 16 | import androidx.compose.runtime.livedata.observeAsState 17 | import androidx.compose.runtime.mutableStateOf 18 | import androidx.compose.runtime.remember 19 | import androidx.compose.runtime.setValue 20 | import androidx.compose.ui.ExperimentalComposeUiApi 21 | import androidx.compose.ui.Modifier 22 | import androidx.compose.ui.platform.LocalContext 23 | import androidx.compose.ui.res.stringResource 24 | import androidx.compose.ui.semantics.semantics 25 | import androidx.compose.ui.semantics.testTagsAsResourceId 26 | import com.dessalines.thumbkey.R 27 | import com.dessalines.thumbkey.db.AppSettingsViewModel 28 | import com.dessalines.thumbkey.utils.getVersionCode 29 | import dev.jeziellago.compose.markdowntext.MarkdownText 30 | 31 | val DONATION_MARKDOWN = 32 | """ 33 | ### Support Thumb-Key 34 | [Thumb-Key](https://github.com/dessalines/thumb-key) is free, open-source software, meaning no spying, keylogging, or advertising, ever. 35 | 36 | No one likes recurring donations, but they've proven to be the only way open-source software like Thumb-Key can stay alive. If you find yourself using Thumb-Key every day, please consider donating: 37 | - [Support on Liberapay](https://liberapay.com/dessalines). 38 | - [Support on Patreon](https://www.patreon.com/dessalines). 39 | --- 40 | 41 | """.trimIndent() 42 | 43 | @OptIn(ExperimentalComposeUiApi::class) 44 | @Composable 45 | fun ShowChangelog(appSettingsViewModel: AppSettingsViewModel) { 46 | val ctx = LocalContext.current 47 | val lastVersionCodeViewed = 48 | appSettingsViewModel.appSettings 49 | .observeAsState() 50 | .value 51 | ?.lastVersionCodeViewed 52 | 53 | // Make sure its initialized 54 | lastVersionCodeViewed?.also { lastViewed -> 55 | val currentVersionCode = ctx.getVersionCode() 56 | val viewed = lastViewed == currentVersionCode 57 | 58 | var whatsChangedDialogOpen by remember { mutableStateOf(!viewed) } 59 | 60 | if (whatsChangedDialogOpen) { 61 | val scrollState = rememberScrollState() 62 | val markdown by appSettingsViewModel.changelog.collectAsState() 63 | LaunchedEffect(appSettingsViewModel) { 64 | appSettingsViewModel.updateChangelog(ctx) 65 | } 66 | 67 | AlertDialog( 68 | text = { 69 | Column( 70 | modifier = 71 | Modifier 72 | .fillMaxSize() 73 | .verticalScroll(scrollState), 74 | ) { 75 | val markdownText = DONATION_MARKDOWN + markdown 76 | MarkdownText( 77 | markdown = markdownText, 78 | linkColor = MaterialTheme.colorScheme.primary, 79 | ) 80 | } 81 | }, 82 | confirmButton = { 83 | Button( 84 | onClick = { 85 | whatsChangedDialogOpen = false 86 | appSettingsViewModel.updateLastVersionCodeViewed(currentVersionCode) 87 | }, 88 | modifier = Modifier.fillMaxWidth(), 89 | ) { 90 | Text(stringResource(R.string.done)) 91 | } 92 | }, 93 | onDismissRequest = { 94 | whatsChangedDialogOpen = false 95 | appSettingsViewModel.updateLastVersionCodeViewed(currentVersionCode) 96 | }, 97 | modifier = Modifier.semantics { testTagsAsResourceId = true }, 98 | ) 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/DEMessagEaseInvertedNumpad.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.FontSizeVariant.LARGE 6 | import com.dessalines.thumbkey.utils.KeyC 7 | import com.dessalines.thumbkey.utils.KeyItemC 8 | import com.dessalines.thumbkey.utils.KeyboardC 9 | import com.dessalines.thumbkey.utils.KeyboardDefinition 10 | import com.dessalines.thumbkey.utils.KeyboardDefinitionModes 11 | import com.dessalines.thumbkey.utils.getLocalCurrency 12 | 13 | val KB_DE_MESSAGEASE_INVERTED_NUMPAD_NUMERIC = 14 | KeyboardC( 15 | listOf( 16 | listOf( 17 | KeyItemC( 18 | center = KeyC("7", size = LARGE), 19 | bottomLeft = KeyC("$"), 20 | right = KeyC("-"), 21 | bottomRight = 22 | getLocalCurrency()?.let { 23 | if (it !in setOf("$", "£", "€")) { 24 | KeyC(it) 25 | } else { 26 | null 27 | } 28 | }, 29 | ), 30 | KeyItemC( 31 | center = KeyC("8", size = LARGE), 32 | topLeft = KeyC("`"), 33 | top = KeyC("^"), 34 | topRight = KeyC("´"), 35 | right = KeyC("!"), 36 | bottomRight = KeyC("\\"), 37 | bottomLeft = KeyC("/"), 38 | left = KeyC("+"), 39 | ), 40 | KeyItemC( 41 | center = KeyC("9", size = LARGE), 42 | left = KeyC("?"), 43 | bottomRight = KeyC("€"), 44 | bottomLeft = KeyC("£"), 45 | bottom = KeyC("="), 46 | ), 47 | EMOJI_KEY_ITEM, 48 | ), 49 | listOf( 50 | KeyItemC( 51 | center = KeyC("4", size = LARGE), 52 | topLeft = KeyC("{"), 53 | topRight = KeyC("%"), 54 | bottomRight = KeyC("_"), 55 | bottomLeft = KeyC("["), 56 | left = KeyC("("), 57 | ), 58 | KeyItemC( 59 | center = KeyC("5", size = LARGE), 60 | top = KeyC("¬"), 61 | ), 62 | KeyItemC( 63 | center = KeyC("6", size = LARGE), 64 | topLeft = KeyC("|"), 65 | topRight = KeyC("}"), 66 | right = KeyC(")"), 67 | bottomRight = KeyC("]"), 68 | bottomLeft = KeyC("@"), 69 | ), 70 | ABC_KEY_ITEM, 71 | ), 72 | listOf( 73 | KeyItemC( 74 | center = KeyC("1", size = LARGE), 75 | topLeft = KeyC("~"), 76 | left = KeyC("<"), 77 | right = KeyC("*"), 78 | bottomRight = KeyC("\t", displayText = "⇥"), 79 | ), 80 | KeyItemC( 81 | center = KeyC("2", size = LARGE), 82 | topLeft = KeyC("\""), 83 | topRight = KeyC("'"), 84 | bottomRight = KeyC(":"), 85 | bottom = KeyC("."), 86 | bottomLeft = KeyC(","), 87 | ), 88 | KeyItemC( 89 | center = KeyC("3", size = LARGE), 90 | top = KeyC("&"), 91 | topRight = KeyC("°"), 92 | right = KeyC(">"), 93 | bottomLeft = KeyC(";"), 94 | left = KeyC("#"), 95 | ), 96 | BACKSPACE_KEY_ITEM, 97 | ), 98 | listOf( 99 | KeyItemC( 100 | center = KeyC("0", size = LARGE), 101 | widthMultiplier = 2, 102 | ), 103 | SPACEBAR_SKINNY_KEY_ITEM, 104 | RETURN_KEY_ITEM, 105 | ), 106 | ), 107 | ) 108 | 109 | val KB_DE_MESSAGEASE_INVERTED_NUMPAD: KeyboardDefinition = 110 | KeyboardDefinition( 111 | title = "deutsch messagease, inverted numpad", 112 | modes = 113 | KeyboardDefinitionModes( 114 | main = KB_DE_MESSAGEASE_MAIN, 115 | shifted = KB_DE_MESSAGEASE_SHIFTED, 116 | numeric = KB_DE_MESSAGEASE_INVERTED_NUMPAD_NUMERIC, 117 | ), 118 | ) 119 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/NumericNordicMessagEase.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import androidx.compose.material.icons.Icons 6 | import androidx.compose.material.icons.automirrored.outlined.* 7 | import com.dessalines.thumbkey.utils.* 8 | import com.dessalines.thumbkey.utils.ColorVariant.* 9 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 10 | import com.dessalines.thumbkey.utils.KeyAction.* 11 | import com.dessalines.thumbkey.utils.SwipeNWay.* 12 | 13 | val KB_NORDIC_MESSAGEASE_NUMERIC = 14 | KeyboardC( 15 | listOf( 16 | listOf( 17 | KeyItemC( 18 | center = KeyC("1", size = LARGE), 19 | bottomLeft = KeyC("$", color = MUTED), 20 | right = KeyC("-", color = MUTED), 21 | bottomRight = 22 | getLocalCurrency()?.let { 23 | if (it !in setOf("$", "£", "€")) { 24 | KeyC(it, color = MUTED) 25 | } else { 26 | null 27 | } 28 | }, 29 | ), 30 | KeyItemC( 31 | center = KeyC("2", size = LARGE), 32 | topLeft = KeyC("`", color = MUTED), 33 | top = KeyC("^", color = MUTED), 34 | topRight = KeyC("´", color = MUTED), 35 | right = KeyC("!", color = MUTED), 36 | bottomRight = KeyC("\\", color = MUTED), 37 | bottomLeft = KeyC("/", color = MUTED), 38 | left = KeyC("+", color = MUTED), 39 | ), 40 | KeyItemC( 41 | center = KeyC("3", size = LARGE), 42 | left = KeyC("?", color = MUTED), 43 | bottomRight = KeyC("€", color = MUTED), 44 | bottomLeft = KeyC("£", color = MUTED), 45 | bottom = KeyC("=", color = MUTED), 46 | ), 47 | EMOJI_KEY_ITEM, 48 | ), 49 | listOf( 50 | KeyItemC( 51 | center = KeyC("4", size = LARGE), 52 | topLeft = KeyC("{", color = MUTED), 53 | topRight = KeyC("%", color = MUTED), 54 | bottomRight = KeyC("_", color = MUTED), 55 | bottomLeft = KeyC("[", color = MUTED), 56 | left = KeyC("(", color = MUTED), 57 | ), 58 | KeyItemC( 59 | center = KeyC("5", size = LARGE), 60 | ), 61 | KeyItemC( 62 | center = KeyC("6", size = LARGE), 63 | topLeft = KeyC("|", color = MUTED), 64 | topRight = KeyC("}", color = MUTED), 65 | right = KeyC(")", color = MUTED), 66 | bottomRight = KeyC("]", color = MUTED), 67 | bottomLeft = KeyC("@", color = MUTED), 68 | ), 69 | ABC_KEY_ITEM, 70 | ), 71 | listOf( 72 | KeyItemC( 73 | center = KeyC("7", size = LARGE), 74 | topLeft = KeyC("~", color = MUTED), 75 | bottomRight = 76 | KeyC( 77 | display = KeyDisplay.IconDisplay(Icons.AutoMirrored.Outlined.KeyboardTab), 78 | action = CommitText("\t"), 79 | color = MUTED, 80 | ), 81 | left = KeyC("<", color = MUTED), 82 | top = KeyC("\u0308", displayText = "¨", color = MUTED), 83 | right = KeyC("*", color = MUTED), 84 | ), 85 | KeyItemC( 86 | center = KeyC("8", size = LARGE), 87 | topLeft = KeyC("\"", color = MUTED), 88 | topRight = KeyC("'", color = SECONDARY), 89 | bottomRight = KeyC(":", color = SECONDARY), 90 | bottom = KeyC(".", color = SECONDARY), 91 | bottomLeft = KeyC(",", color = SECONDARY), 92 | ), 93 | KeyItemC( 94 | center = KeyC("9", size = LARGE), 95 | top = KeyC("&", color = MUTED), 96 | topRight = KeyC("°", color = MUTED), 97 | right = KeyC(">", color = MUTED), 98 | bottomLeft = KeyC(";", color = MUTED), 99 | left = KeyC("#", color = MUTED), 100 | ), 101 | BACKSPACE_KEY_ITEM, 102 | ), 103 | listOf( 104 | KeyItemC( 105 | center = KeyC("0", size = LARGE), 106 | widthMultiplier = 2, 107 | ), 108 | SPACEBAR_SKINNY_KEY_ITEM, 109 | RETURN_KEY_ITEM, 110 | ), 111 | ), 112 | ) 113 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/ComposeKeyboardView.kt: -------------------------------------------------------------------------------- 1 | package com.dessalines.thumbkey 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Context 5 | import android.widget.Toast 6 | import androidx.compose.runtime.Composable 7 | import androidx.compose.runtime.CompositionLocalProvider 8 | import androidx.compose.runtime.getValue 9 | import androidx.compose.runtime.livedata.observeAsState 10 | import androidx.compose.ui.platform.AbstractComposeView 11 | import androidx.compose.ui.platform.LocalLayoutDirection 12 | import androidx.compose.ui.unit.LayoutDirection 13 | import androidx.lifecycle.lifecycleScope 14 | import com.dessalines.thumbkey.db.AppSettingsRepository 15 | import com.dessalines.thumbkey.ui.components.keyboard.KeyboardScreen 16 | import com.dessalines.thumbkey.ui.theme.ThumbkeyTheme 17 | import com.dessalines.thumbkey.utils.KeyboardPosition 18 | import com.dessalines.thumbkey.utils.keyboardLayoutsSetFromDbIndexString 19 | import com.dessalines.thumbkey.utils.toBool 20 | import com.dessalines.thumbkey.utils.toInt 21 | import kotlinx.coroutines.launch 22 | 23 | @SuppressLint("ViewConstructor") 24 | class ComposeKeyboardView( 25 | context: Context, 26 | private val settingsRepo: AppSettingsRepository, 27 | ) : AbstractComposeView(context) { 28 | @Composable 29 | override fun Content() { 30 | val settingsState = settingsRepo.appSettings.observeAsState() 31 | val settings by settingsState 32 | val ctx = context as IMEService 33 | 34 | ThumbkeyTheme( 35 | settings = settings, 36 | ) { 37 | CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) { 38 | KeyboardScreen( 39 | settings = settings, 40 | onSwitchLanguage = { 41 | ctx.lifecycleScope.launch { 42 | // Cycle to the next keyboard 43 | val state = settingsState.value 44 | state?.let { s -> 45 | 46 | val layouts = 47 | keyboardLayoutsSetFromDbIndexString(s.keyboardLayouts).toList() 48 | val currentLayout = s.keyboardLayout 49 | val index = layouts.map { it.ordinal }.indexOf(currentLayout) 50 | val nextIndex = (index + 1).mod(layouts.size) 51 | val nextLayout = layouts.getOrNull(nextIndex) 52 | nextLayout?.let { layout -> 53 | val s2 = s.copy(keyboardLayout = layout.ordinal) 54 | settingsRepo.update(s2) 55 | 56 | ctx.currentKeyboardDefinition 57 | ?.settings 58 | ?.textProcessor 59 | ?.handleFinishInput(ctx) 60 | ctx.currentKeyboardDefinition = (layouts[nextIndex].keyboardDefinition) 61 | ctx.currentKeyboardDefinition 62 | ?.settings 63 | ?.textProcessor 64 | ?.updateCursorPosition(ctx) 65 | 66 | // Display the new layout's name on the screen 67 | if (s.showToastOnLayoutSwitch.toBool()) { 68 | val layoutName = layout.keyboardDefinition.title 69 | Toast 70 | .makeText(context, layoutName, Toast.LENGTH_SHORT) 71 | .show() 72 | } 73 | } 74 | } 75 | } 76 | }, 77 | onChangePosition = { f -> 78 | ctx.lifecycleScope.launch { 79 | val state = settingsState.value 80 | state?.let { s -> 81 | val nextPosition = f(KeyboardPosition.entries[s.position]).ordinal 82 | val s2 = s.copy(position = nextPosition) 83 | settingsRepo.update(s2) 84 | } 85 | } 86 | }, 87 | onToggleHideLetters = { 88 | ctx.lifecycleScope.launch { 89 | val state = settingsState.value 90 | state?.let { s -> 91 | val newHideLetters = (!s.hideLetters.toBool()).toInt() 92 | val s2 = s.copy(hideLetters = newHideLetters) 93 | settingsRepo.update(s2) 94 | } 95 | } 96 | }, 97 | ) 98 | } 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /app/src/main/java/com/dessalines/thumbkey/keyboards/HEMessagEaseSymbols.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("ktlint:standard:no-wildcard-imports") 2 | 3 | package com.dessalines.thumbkey.keyboards 4 | 5 | import com.dessalines.thumbkey.utils.* 6 | import com.dessalines.thumbkey.utils.ColorVariant.* 7 | import com.dessalines.thumbkey.utils.FontSizeVariant.* 8 | import com.dessalines.thumbkey.utils.KeyAction.* 9 | import com.dessalines.thumbkey.utils.SwipeNWay.* 10 | 11 | val KB_HE_MESSAGEASE_SYMBOLS_MAIN = 12 | KeyboardC( 13 | listOf( 14 | listOf( 15 | KeyItemC( 16 | center = KeyC("ר", size = LARGE), 17 | bottomRight = KeyC("ן", swipeReturnAction = CommitText("נ")), 18 | right = KeyC("-", color = MUTED), 19 | bottomLeft = KeyC("$", color = MUTED), 20 | ), 21 | KeyItemC( 22 | center = KeyC("ב", size = LARGE), 23 | bottom = KeyC("ג"), 24 | topLeft = KeyC("`", color = MUTED), 25 | top = KeyC("^", color = MUTED), 26 | topRight = KeyC("´", color = MUTED), 27 | right = KeyC("!", color = MUTED), 28 | bottomRight = KeyC("\\", color = MUTED), 29 | bottomLeft = KeyC("/", color = MUTED), 30 | left = KeyC("+", color = MUTED), 31 | ), 32 | KeyItemC( 33 | center = KeyC("א", size = LARGE), 34 | bottomLeft = KeyC("צ", swipeReturnAction = CommitText("ץ")), 35 | left = KeyC("?"), 36 | bottom = KeyC("=", color = MUTED), 37 | ), 38 | EMOJI_KEY_ITEM, 39 | ), 40 | listOf( 41 | KeyItemC( 42 | center = KeyC("מ", size = LARGE), 43 | right = KeyC("ם", swipeReturnAction = CommitText("מ")), 44 | topLeft = KeyC("}", displayText = "{", color = MUTED), 45 | topRight = KeyC("%", color = MUTED), 46 | bottomRight = KeyC("ך"), 47 | bottomLeft = KeyC("]", displayText = "[", color = MUTED), 48 | left = KeyC(")", displayText = "(", color = MUTED), 49 | ), 50 | KeyItemC( 51 | center = KeyC("י", size = LARGE), 52 | topLeft = KeyC("ק"), 53 | top = KeyC("ח"), 54 | topRight = KeyC("פ", swipeReturnAction = CommitText("ף")), 55 | right = KeyC("ד"), 56 | bottomRight = KeyC("ש"), 57 | bottom = KeyC("נ", swipeReturnAction = CommitText("ן")), 58 | bottomLeft = KeyC("כ", swipeReturnAction = CommitText("ך")), 59 | left = KeyC("ע"), 60 | ), 61 | KeyItemC( 62 | center = KeyC("ו", size = LARGE), 63 | topRight = KeyC("{", displayText = "}", color = MUTED), 64 | right = KeyC("(", displayText = ")", color = MUTED), 65 | bottomRight = KeyC("[", displayText = "]", color = MUTED), 66 | bottomLeft = KeyC("@", color = MUTED), 67 | ), 68 | NUMERIC_KEY_ITEM, 69 | ), 70 | listOf( 71 | KeyItemC( 72 | center = KeyC("ת", size = LARGE), 73 | topRight = KeyC("ז"), 74 | topLeft = KeyC("~", color = MUTED), 75 | right = KeyC("*", color = MUTED), 76 | bottomRight = KeyC("\t", displayText = "⇥", color = MUTED), 77 | left = KeyC("<", color = MUTED), 78 | ), 79 | KeyItemC( 80 | center = KeyC("ה", size = LARGE), 81 | topLeft = KeyC("\"", color = MUTED), 82 | top = KeyC("ס"), 83 | topRight = KeyC("'", color = MUTED), 84 | bottomRight = KeyC(":", color = MUTED), 85 | bottom = KeyC(".", color = MUTED), 86 | bottomLeft = KeyC(",", color = MUTED), 87 | ), 88 | KeyItemC( 89 | center = KeyC("ל", size = LARGE), 90 | topLeft = KeyC("ט"), 91 | top = KeyC("&", color = MUTED), 92 | topRight = KeyC("°", color = MUTED), 93 | right = KeyC(">", color = MUTED), 94 | bottomLeft = KeyC(";", color = MUTED), 95 | left = KeyC("#", color = MUTED), 96 | ), 97 | BACKSPACE_KEY_ITEM, 98 | ), 99 | listOf( 100 | SPACEBAR_KEY_ITEM, 101 | RETURN_KEY_ITEM, 102 | ), 103 | ), 104 | ) 105 | 106 | val KB_HE_MESSAGEASE_SYMBOLS: KeyboardDefinition = 107 | KeyboardDefinition( 108 | title = "עברית messagease symbols", 109 | modes = 110 | KeyboardDefinitionModes( 111 | main = KB_HE_MESSAGEASE_SYMBOLS_MAIN, 112 | shifted = KB_HE_MESSAGEASE_SYMBOLS_MAIN, 113 | numeric = KB_EN_MESSAGEASE_NUMERIC, 114 | ), 115 | ) 116 | --------------------------------------------------------------------------------