Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
159 commits
Select commit Hold shift + click to select a range
12b0f8f
fix(settings): fix and optimize gboard import
LeanBitLab Jun 1, 2026
7b626f1
chore: bump version to 3.8.4
LeanBitLab Jun 1, 2026
935f93b
feat(settings): improve text expander ui/ux
LeanBitLab Jun 1, 2026
b1b95f9
feat(settings): polish text expander guide and list
LeanBitLab Jun 1, 2026
fcf830e
feat(settings): clean up text expander guide
LeanBitLab Jun 1, 2026
26ad741
feat(settings): add more expander placeholders
LeanBitLab Jun 1, 2026
980ecf5
feat(settings): add system template placeholders
LeanBitLab Jun 1, 2026
443cea2
feat(settings): add language placeholder
LeanBitLab Jun 1, 2026
48b6978
fix(perf): prevent OOM on background image decode
LeanBitLab Jun 1, 2026
f115d55
fix(stability): replace force-unwrap !! in hot paths
LeanBitLab Jun 1, 2026
3dbf4c7
fix(stability): unregister SharedPreferences listener in spell-checker
LeanBitLab Jun 1, 2026
f9c7e23
fix(stability): don't call Looper.prepare() on background thread
LeanBitLab Jun 1, 2026
6d81417
fix(stability): make score-limit cache update atomic in Suggest
LeanBitLab Jun 1, 2026
8b73400
fix(stability): use named lock for dictionary blacklist
LeanBitLab Jun 1, 2026
c3b1003
perf(perf): add key= to Lazy* list items for stable identity
LeanBitLab Jun 1, 2026
a6fa290
perf(perf): remember() expensive computations in Composables
LeanBitLab Jun 1, 2026
ead818c
perf(perf): avoid Paint allocation per recomposition in ColorPickerDi…
LeanBitLab Jun 1, 2026
b7b17a7
perf(perf): stream logcat to file instead of buffering in memory
LeanBitLab Jun 1, 2026
1c9d550
perf(perf): make ReorderSwitchPreference data class stable
LeanBitLab Jun 1, 2026
8438ac0
fix(perf): remove top-level MutableStateFlow in AIIntegrationScreen
LeanBitLab Jun 1, 2026
dedd3cb
fix(perf): scope errorJob to the LayoutEditDialog composable
LeanBitLab Jun 1, 2026
3a5fd14
fix(perf): replace GlobalScope in toolbar preference listener
LeanBitLab Jun 1, 2026
90e972e
fix(perf): make SettingsNavHost navigateTo scope supervised
LeanBitLab Jun 1, 2026
c1d4de1
fix(stability): replace !! in colorFilter() helper
LeanBitLab Jun 1, 2026
a63b7da
perf(perf): cache main-thread Handler in ClipboardHistoryManager
LeanBitLab Jun 1, 2026
1a84e7a
fix(stability): use SupervisorJob in RichInputMethodManager scope
LeanBitLab Jun 1, 2026
67044de
fix(stability): use ContextCompat.registerReceiver with NOT_EXPORTED …
LeanBitLab Jun 1, 2026
ce755f4
fix(settings): update ai provider fields dynamically
LeanBitLab Jun 4, 2026
82bde3d
feat: add standardOptimised flavor and disable r8
LeanBitLab Jun 4, 2026
ed13c9a
perf: add baseline profile for standardOptimised
LeanBitLab Jun 4, 2026
9a26c73
feat: remove standardOptimised package suffix
LeanBitLab Jun 4, 2026
50f184b
fix: dismiss emoji dialog and update wizard status
LeanBitLab Jun 4, 2026
b559cab
Update ar.txt
iBasim Jun 5, 2026
7c310bf
Update build-debug-apk.yml
iBasim Jun 5, 2026
063d168
arabic-popup-and-harakat-tweak
iBasim Jun 5, 2026
4ed977f
arabic-popup-and-harakat-tweak V2
iBasim Jun 5, 2026
5cc7598
ci: add badge update workflow
LeanBitLab Jun 5, 2026
2e580e8
chore: update README badges [skip ci]
github-actions[bot] Jun 5, 2026
40b79e4
fix: strip leading v from version tag
LeanBitLab Jun 5, 2026
66af68e
chore: update README badges [skip ci]
github-actions[bot] Jun 5, 2026
eb19ef9
fix(badges): adjust width and add viewBox attributes to prevent clipping
LeanBitLab Jun 5, 2026
d27f63a
chore: update README badges [skip ci]
github-actions[bot] Jun 5, 2026
d3d0fa2
chore(badges): rename download badge label to version
LeanBitLab Jun 5, 2026
85a5c6e
chore: update README badges [skip ci]
github-actions[bot] Jun 5, 2026
2f0f956
fix: prevent duplicate screenshots in clipboard
LeanBitLab Jun 5, 2026
1473796
feat: add toggle for screenshot compression
LeanBitLab Jun 5, 2026
fbb8de7
feat: improve text expander, gestures, and emoji scale fit
LeanBitLab Jun 5, 2026
d4a6884
chore: update README badges [skip ci]
github-actions[bot] Jun 6, 2026
5d41769
fix: persist toolbar customizer key toggles
LeanBitLab Jun 6, 2026
f87e6b1
build: bump version to v3.8.5
LeanBitLab Jun 6, 2026
d742cb9
feat: toggle dictionaries individually
LeanBitLab Jun 6, 2026
c6264c5
chore: add changelog for v3.8.5
LeanBitLab Jun 6, 2026
1f782ea
fix: split emoji search keyboard layout
LeanBitLab Jun 6, 2026
5a96d99
chore: update changelog for emoji search fix
LeanBitLab Jun 6, 2026
b6f31b3
added auto detect feature
rohanlodhi Jun 6, 2026
7131d62
changed registration flag
rohanlodhi Jun 6, 2026
03f8efd
chore: update README badges [skip ci]
github-actions[bot] Jun 7, 2026
6095b77
Update ar.txt
iBasim Jun 7, 2026
caf533b
Merge branch 'LeanBitLab:main' into main
iBasim Jun 7, 2026
13b6404
refactor: replace onnxruntime with llamacpp
LeanBitLab Jun 7, 2026
5405844
suggestion delete blacklist always. reload blacklist interface add.
LeanBitLab Jun 7, 2026
736ea03
blocked words screen add. dictionary screen integration done. setting…
LeanBitLab Jun 7, 2026
bae3869
blacklist check case-insensitive. lowercase canonicalization added. u…
LeanBitLab Jun 7, 2026
27f003f
blacklist regex support added. compiled patterns cached. compile-time…
LeanBitLab Jun 7, 2026
c53c8ea
SearchScreen remember key fix. filteredItems lambda dependency added.…
LeanBitLab Jun 7, 2026
2b17f04
Merge pull request #165 from rohanlodhi/auto-read-otp
LeanBitLab Jun 7, 2026
e4038b1
Merge pull request #168 from iBasim/main
LeanBitLab Jun 7, 2026
f91617d
fix(layout): align Arabic diacritics spacing
LeanBitLab Jun 7, 2026
74aef03
chore: update README badges [skip ci]
github-actions[bot] Jun 8, 2026
33b98cf
chore: update README badges [skip ci]
github-actions[bot] Jun 9, 2026
f646b93
chore: update README badges [skip ci]
github-actions[bot] Jun 10, 2026
ef14ac3
chore: update README badges [skip ci]
github-actions[bot] Jun 11, 2026
a4cc084
chore: update README badges [skip ci]
github-actions[bot] Jun 12, 2026
e6f1caa
Allow for reasoning models; handle structured content arrays in API r…
DXCanas Jun 12, 2026
dfaf16b
feat: add regex expander & fix dictionary crash
LeanBitLab Jun 8, 2026
da4d87f
feat(touchpad): double tap to select word & fix emoji popup preview
LeanBitLab Jun 9, 2026
28c20cb
feat(offline): add settings for custom sampling & prompt
LeanBitLab Jun 9, 2026
92b8a46
chore: update gitignore - add .env, .pi/ and remove duplicate
LeanBitLab Jun 12, 2026
007afc6
docs: add F-Droid reproducibility delay notice
LeanBitLab Jun 12, 2026
6073ba0
chore: bump version to v3.8.6 and add changelog
LeanBitLab Jun 12, 2026
4753385
fix(touchpad): always select word on double tap and update docs
LeanBitLab Jun 12, 2026
8aa21f5
feat(touchpad): implement multi-finger gestures and update docs
LeanBitLab Jun 12, 2026
45f44da
feat(touchpad): reorganize gestures for intuitive rich text editing l…
LeanBitLab Jun 12, 2026
cbf50c5
feat(touchpad): migrate gestures to 1 and 2 fingers
LeanBitLab Jun 12, 2026
4a9672a
docs: update features for llama.cpp migration
LeanBitLab Jun 12, 2026
ac80271
docs: note model-dependent accuracy in features
LeanBitLab Jun 12, 2026
36e5204
fix(touchpad): exit touchpad mode when opening clipboard or emoji
LeanBitLab Jun 12, 2026
88be2c9
perf(offline): optimize proofreading latency and load times
LeanBitLab Jun 12, 2026
ef19784
fix(offline): improve GGUF prompt formatting and output cleaning
LeanBitLab Jun 12, 2026
05fb5b9
fix(offline): truncate model output at template markers and add nativ…
LeanBitLab Jun 12, 2026
7877afb
fix(offline): implement dynamic target-language-specific few-shot exa…
LeanBitLab Jun 12, 2026
ba7ad8f
feat(expander): immediate expand & fix revert
LeanBitLab Jun 12, 2026
bd0da6a
feat: hold toolbar arrow keys to auto-repeat
LeanBitLab Jun 12, 2026
08187e7
chore: update README badges [skip ci]
github-actions[bot] Jun 13, 2026
454494b
chore: update README badges [skip ci]
github-actions[bot] Jun 14, 2026
0767b46
chore: update README badges [skip ci]
github-actions[bot] Jun 15, 2026
bb4bf8f
feat: add toggle for insecure AI connections
LeanBitLab Jun 15, 2026
3f7a4c4
Merge pull request #174 from DXCanas/allow-reasoning-models
LeanBitLab Jun 15, 2026
9b7cb2e
feat: add selective backup and restore
LeanBitLab Jun 15, 2026
7cf14c6
fix: allow same word with different shortcuts
LeanBitLab Jun 15, 2026
97802ea
feat: strip spaces before punctuation marks
LeanBitLab Jun 15, 2026
a2a6f28
chore: update README badges [skip ci]
github-actions[bot] Jun 16, 2026
95372e4
chore: update README badges [skip ci]
github-actions[bot] Jun 17, 2026
1e5a8ac
chore: update README badges [skip ci]
github-actions[bot] Jun 18, 2026
26fe524
chore: update README badges [skip ci]
github-actions[bot] Jun 19, 2026
17f541d
Change default popup key on letter ا in Persian language
nugraha-abd Jun 19, 2026
3def612
chore: update README badges [skip ci]
github-actions[bot] Jun 20, 2026
f4dce88
Merge pull request #182 from nugraha-abd/persian-default-popup
LeanBitLab Jun 20, 2026
15c903c
feat: add handwriting input support
LeanBitLab Jun 15, 2026
abd247e
docs: update 3.8.6 changelog
LeanBitLab Jun 15, 2026
dafb659
fix: use wildcard mime type for file picker to avoid waydroid crash
LeanBitLab Jun 15, 2026
66a1fdd
fix: clear code cache directory on plugin import/remove
LeanBitLab Jun 15, 2026
096a7a5
chore: add MD5 hash and size logging for loaded plugin
LeanBitLab Jun 15, 2026
751b0c6
feat(handwriting): fix crash and dynamic model downloading
LeanBitLab Jun 16, 2026
c41288a
feat: fix handwriting layout, theming and logic
LeanBitLab Jun 16, 2026
714d679
style: change handwriting toolbar icon color to white
LeanBitLab Jun 16, 2026
57f47cb
feat: show shortcut overlay on handwriting canvas when plugin missing
LeanBitLab Jun 16, 2026
7b04398
fix(ai): resolve offline custom key token loss
LeanBitLab Jun 20, 2026
d14cb17
feat(handwriting): add plugin downloader and refine blacklist
LeanBitLab Jun 20, 2026
5835d63
build: limit abi filters to arm64-v8a
LeanBitLab Jun 20, 2026
3fc71c9
docs: document handwriting and gguf features
LeanBitLab Jun 20, 2026
f86a07c
chore: update README badges [skip ci]
github-actions[bot] Jun 21, 2026
bb93b6c
chore: update README badges [skip ci]
github-actions[bot] Jun 22, 2026
28b1c37
fix(handwriting): avoid cancelling active keys when hidden
AsafMah Jun 22, 2026
d5d10ac
build: update config, proguard rules, and blacklist parsing
LeanBitLab Jun 22, 2026
82033c7
Merge pull request #194 from AsafMah/fix/upstream-handwriting-shift-r…
LeanBitLab Jun 22, 2026
ec1de5f
feat: tune double-tap shift timing and keep llamacpp proguard
LeanBitLab Jun 22, 2026
c8b9d7b
build: remove standardOptimised flavor
LeanBitLab Jun 22, 2026
d645a2a
fix: prevent handwriting suggestions from hiding
LeanBitLab Jun 22, 2026
f2b770f
chore: update README badges [skip ci]
github-actions[bot] Jun 23, 2026
6a60092
fix(toolbar): restore close/search on clipboard
LeanBitLab Jun 23, 2026
c059da4
fix(settings): add label for clipboard_search key
LeanBitLab Jun 23, 2026
264956e
feat(settings): allow deleting handwriting model
LeanBitLab Jun 23, 2026
776156e
feat(dict): add dynamic dictionary downloader
LeanBitLab Jun 23, 2026
ec8839b
feat(dict): allow uninstalling downloaded dicts
LeanBitLab Jun 23, 2026
fc02d43
feat(dict): improve dynamic downloading flow
LeanBitLab Jun 23, 2026
422a705
fix: keep number row digits when keyboard is shifted
mvanhorn Jun 23, 2026
6a04287
feat(dict): exclude non-en-US dictionaries from standard flavor assets
LeanBitLab Jun 23, 2026
b31077a
feat(dict): show download button on toolbar if layout dictionary is n…
LeanBitLab Jun 23, 2026
62f4deb
fix: do not show disabled additional subtypes in dict settings list
LeanBitLab Jun 23, 2026
216d150
chore: add v3.8.7 and v3.8.8 changelogs
LeanBitLab Jun 23, 2026
a84f4ae
fix: prevent WindowManager$BadTokenException in IME overlay dialog
LeanBitLab Jun 23, 2026
b49f677
Merge pull request #199 from mvanhorn/fix/180-number-row-shift-symbols
LeanBitLab Jun 23, 2026
a0eda87
fix: only update split toolbar emoji recents when view is visible
LeanBitLab Jun 23, 2026
233066f
feat(emoji): close search on dictionary download
LeanBitLab Jun 23, 2026
37c0bb5
feat(emoji): show download button in split toolbar
LeanBitLab Jun 23, 2026
6c427e5
chore: update changelog for 3.8.8
LeanBitLab Jun 23, 2026
8531a2f
chore: bump version to 3.8.8
LeanBitLab Jun 23, 2026
f19b0e4
feat(handwriting): add download button to plugin required overlay
LeanBitLab Jun 23, 2026
26b7cf5
chore: add handwriting plugin downloader to 3.8.8 changelog
LeanBitLab Jun 23, 2026
07005cb
docs: temporarily hide F-Droid badge from README
LeanBitLab Jun 23, 2026
1dd8a98
docs: remove F-Droid column from table to fix spacing
LeanBitLab Jun 23, 2026
9929d9d
docs: move download section above screenshots in README
LeanBitLab Jun 23, 2026
44987c1
docs: remove fork AI feature description line from README
LeanBitLab Jun 23, 2026
3d0f510
docs: add Dynamic Downloader to README features
LeanBitLab Jun 23, 2026
f88c12c
docs: add Selective Backup, Blacklist, and OTP features to README
LeanBitLab Jun 23, 2026
1c66c91
docs: sort features by significance in README
LeanBitLab Jun 23, 2026
e2763bf
chore: update README badges [skip ci]
github-actions[bot] Jun 24, 2026
b8b0131
Merge upstream LeanType v3.8.8
AsafMah Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 0 additions & 78 deletions .github/workflows/update-badges.yml

This file was deleted.

16 changes: 13 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
- **Auto-read OTP from SMS** — a one-time code from an incoming SMS is offered in the suggestion
strip while the keyboard is open; tap to insert. Uses a runtime, opt-in SMS permission.
- **Regex shortcuts in Text Expander** — expansion triggers can be matched by regular expression.
- **Dynamic dictionary/plugin downloader** — Standard builds can fetch layout dictionaries, emoji dictionaries, and handwriting plugins on demand.
- **Selective backup and restore** — backup/restore settings, dictionaries, and AI prompt configuration more granularly.

### Changed
- **Offline AI backend switched from ONNX Runtime to llama.cpp (GGUF).** The Offline build now
Expand All @@ -31,11 +33,19 @@ and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
navigation, space, copy/paste, cut/select-all, undo/redo, hold-to-backspace). Single-finger
double-tap now **selects the word** (previously deleted the selection).
- Release builds now target the **arm64-v8a** ABI only.
- Standard builds now exclude non-en-US dictionary assets and download optional dictionaries dynamically.

### Fixed
- **Sticky Shift from upstream handwriting cleanup** — upstream v3.8.6 stopped the hidden handwriting
bottom row on every keyboard-frame switch, which globally cancelled the active Shift pointer before
release. We keep the upstream handwriting feature but only stop handwriting when it is actually
shown. (Upstream bug LeanBitLab/LeanType#186; upstream PR #194.)

### Upstream
- Merged **LeanBitLab/LeanType v3.8.6** (from v3.8.3) — the source of the handwriting,
llama.cpp/GGUF, touchpad-gesture, and SMS-OTP changes above. Fork identity (LeanTypeDual, distinct
`applicationId`, two-thumb typing, the Gemini standard-AI layer, and the privacy tiers) is
- Merged **LeanBitLab/LeanType v3.8.8** (from v3.8.3, including v3.8.7 and two post-tag docs/badge
commits) — the source of the handwriting, llama.cpp/GGUF, dynamic downloader, touchpad-gesture,
SMS-OTP, selective-backup, and dictionary-downloader changes above. Fork identity (LeanTypeDual,
distinct `applicationId`, two-thumb typing, the Gemini standard-AI layer, and the privacy tiers) is
preserved.

## [3.9.1] - 2026-06-11
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,16 @@ Type with **both thumbs gliding at the same time**: LeanTypeDual aggregates mult
- **🧠 Smarter learned words** - *graduated trust* keeps a just-learned word below real-dictionary suggestions until you've used it a few times (no premature autocorrect to half-typed words); flag unknown words to **Add** or **Block** them via a Blocklist screen.
- **↩️ Undo word** - a toolbar key that reverts the last committed word back to its suggestion alternatives.
- **🗂️ Per-dictionary control** - enable or disable individual built-in and custom dictionaries.
- **📥 Dynamic Downloader** - Standard builds can download layout dictionaries, emoji dictionaries, and handwriting plugins on demand, keeping the initial app smaller.
- **🪟 Floating Keyboard** - Detach the keyboard into a draggable, resizable window (true OS-level overlay), with an optional persistent mode.
- **⌨️ Dual Toolbar / Split Suggestions** - Split the suggestion strip and toolbar for easier reach.
- **🖱️ Touchpad Mode** - Swipe the spacebar up for a cursor touchpad with sensitivity controls and edge-scroll acceleration, including a full-screen laptop-style mode.
- **🎨 Modern UI** - "Squircle" key backgrounds, refined icons, and polished aesthetics.
- **🔄 Google Dictionary Import** - Import your personal dictionary words.
- **🔍 Clipboard Search & Undo** - Search clipboard history from the toolbar, undo accidental deletions, and fold pinned items by default.
- **📸 Screenshot Suggestion & Clipboard** - Recently-taken screenshots are offered in the suggestion strip and saved to clipboard history.
- **✉️ Auto-Read OTP** - Incoming one-time codes can appear in the suggestion strip for quick insertion.
- **💾 Selective Backup & Restore** - Backup and restore settings, dictionaries, and AI prompt configuration selectively.
- **🔎 Emoji Search** - Search emojis by name. *Requires loading an Emoji Dictionary.*
- **⚙️ Enhanced Customization** - Force auto-capitalization, fine-grained haptics, distinct incognito icon, reorganized settings, and more.
- **🔒 Privacy Choices** - Choose **Standard** (opt-in AI, handwriting), **Offline** (network hard-disabled, offline GGUF model), or **Offline Lite** (no AI, ~20 MB).
Expand Down
39 changes: 19 additions & 20 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@ android {
productFlavors {
create("standard") {
dimension = "privacy"
}
create("standardOptimised") {
dimension = "privacy"
minSdk = 23
}
create("offline") {
dimension = "privacy"
Expand Down Expand Up @@ -106,7 +104,6 @@ android {
"standard" -> "1"
"offline" -> "2"
"offlinelite" -> "3"
"standardOptimised" -> "4"
else -> ""
}
if (number.isNotEmpty()) {
Expand All @@ -119,13 +116,28 @@ android {
}
// got a little too big for GitHub after some dependency upgrades, so we remove the largest dictionary
androidComponents.onVariants { variant: ApplicationVariant ->
val patterns = mutableListOf<String>()
if (variant.buildType == "debug") {
variant.androidResources.ignoreAssetsPatterns = listOf("main_ro.dict")
patterns.add("main_ro.dict")
variant.proguardFiles = emptyList()
//noinspection ProguardAndroidTxtUsage we intentionally use the "normal" file here
variant.proguardFiles.add(project.layout.buildDirectory.file(getDefaultProguardFile("proguard-android.txt").absolutePath))
variant.proguardFiles.add(project.layout.buildDirectory.file(project.buildFile.parent + "/proguard-rules.pro"))
}
if (variant.flavorName == "standard") {
// ponytail: dynamically find all dict files to ignore in standard flavor except main_en-US.dict
val dictsDir = project.file("src/main/assets/dicts")
if (dictsDir.exists() && dictsDir.isDirectory) {
dictsDir.listFiles()?.forEach { file ->
if (file.name.endsWith(".dict") && file.name != "main_en-US.dict") {
patterns.add(file.name)
}
}
}
}
if (patterns.isNotEmpty()) {
variant.androidResources.ignoreAssetsPatterns = patterns
}
}
}

Expand Down Expand Up @@ -194,14 +206,6 @@ android {
// these orphaned strings are harmlessly stripped by R8 during minification.
disable += "ExtraTranslation"
}

sourceSets {
getByName("standardOptimised") {
java.srcDirs("src/standard/java")
res.srcDirs("src/standard/res")
manifest.srcFile("src/standard/AndroidManifest.xml")
}
}
}

dependencies {
Expand Down Expand Up @@ -230,8 +234,6 @@ dependencies {
// gemini ai proofreading
"standardImplementation"("com.google.ai.client.generativeai:generativeai:0.9.0")
"standardImplementation"("androidx.security:security-crypto:1.1.0-alpha06") // for encrypted API key storage
"standardOptimisedImplementation"("com.google.ai.client.generativeai:generativeai:0.9.0")
"standardOptimisedImplementation"("androidx.security:security-crypto:1.1.0-alpha06")

// local llm proofreading (offline)
"offlineImplementation"("io.github.ljcamargo:llamacpp-kotlin:0.4.0")
Expand All @@ -248,7 +250,6 @@ dependencies {
// ML Kit's internal asset manager and native library loader use the host app context,
// so the host app must compile and include the client library resources/libraries.
"standardImplementation"("com.google.mlkit:digital-ink-recognition:19.0.0")
"standardOptimisedImplementation"("com.google.mlkit:digital-ink-recognition:19.0.0")

// test
testImplementation(kotlin("test"))
Expand All @@ -267,11 +268,9 @@ dependencies {
"runTestsImplementation"("androidx.compose.ui:ui-test-manifest")
}

// Disable baseline/ART profile tasks to guarantee deterministic reproducible builds (except for standardOptimised)
// Disable baseline/ART profile tasks to guarantee deterministic reproducible builds
tasks.configureEach {
if (name.contains("ArtProfile", ignoreCase = true)) {
if (!name.contains("StandardOptimised", ignoreCase = true)) {
enabled = false
}
enabled = false
}
}
19 changes: 19 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@

# Keep java-llama.cpp classes
-keep class de.kherud.llama.** { *; }
-keep class org.nehuatl.llamacpp.** { *; }



# Fix correct service name
Expand All @@ -36,3 +38,20 @@
-dontwarn com.google.api.client.**
-dontwarn java.lang.management.**
-dontwarn org.joda.time.**

# Keep handwriting plugin interface and listener to prevent parameter removal/signature optimization
-keep interface helium314.keyboard.latin.handwriting.HandwritingRecognizer {
<methods>;
}
-keep interface helium314.keyboard.latin.handwriting.ModelDownloadListener {
<methods>;
}

# Keep ML Kit, GMS Tasks, and Firebase components for handwriting plugin dynamic linkage
-keep class com.google.mlkit.** { *; }
-keep class com.google.android.gms.tasks.** { *; }
-keep class com.google.firebase.components.** { *; }

# Keep Kotlin standard library for dynamically loaded plugins
# ponytail: keep kotlin stdlib classes to prevent NoSuchMethodError in plugin loading
-keep class kotlin.** { *; }
58 changes: 14 additions & 44 deletions app/src/main/assets/layouts/number_row/number_row.json
Original file line number Diff line number Diff line change
@@ -1,44 +1,14 @@
[
[
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "!" },
"default": { "label": "1", "popup": { "relevant": [{ "label": "¹" }, { "label": "½" }, { "label": "⅓" }, { "label": "¼" }, { "label": "⅛" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "@" },
"default": { "label": "2", "popup": { "relevant": [{ "label": "²" }, { "label": "⅔" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "#" },
"default": { "label": "3", "popup": { "relevant": [{ "label": "³" }, { "label": "¾" }, { "label": "⅜" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "$" },
"default": { "label": "4", "popup": { "relevant": [{ "label": "⁴" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "%" },
"default": { "label": "5", "popup": { "relevant": [{ "label": "⁵" }, { "label": "⅝" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "^" },
"default": { "label": "6", "popup": { "relevant": [{ "label": "⁶" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "&" },
"default": { "label": "7", "popup": { "relevant": [{ "label": "⁷" }, { "label": "⅞" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "*" },
"default": { "label": "8", "popup": { "relevant": [{ "label": "⁸" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": "(" },
"default": { "label": "9", "popup": { "relevant": [{ "label": "⁹" }] } }
},
{ "$": "shift_state_selector",
"manualOrLocked": { "label": ")" },
"default": { "label": "0", "popup": { "relevant": [{ "label": "⁰" }, { "label": "ⁿ" }, { "label": "∅" }] } }
}
]
]
[
[
{ "label": "1", "popup": { "relevant": [{ "label": "!" }, { "label": "¹" }, { "label": "½" }, { "label": "⅓" }, { "label": "¼" }, { "label": "⅛" }] } },
{ "label": "2", "popup": { "relevant": [{ "label": "@" }, { "label": "²" }, { "label": "⅔" }] } },
{ "label": "3", "popup": { "relevant": [{ "label": "#" }, { "label": "³" }, { "label": "¾" }, { "label": "⅜" }] } },
{ "label": "4", "popup": { "relevant": [{ "label": "$" }, { "label": "⁴" }] } },
{ "label": "5", "popup": { "relevant": [{ "label": "%" }, { "label": "⁵" }, { "label": "⅝" }] } },
{ "label": "6", "popup": { "relevant": [{ "label": "^" }, { "label": "⁶" }] } },
{ "label": "7", "popup": { "relevant": [{ "label": "&" }, { "label": "⁷" }, { "label": "⅞" }] } },
{ "label": "8", "popup": { "relevant": [{ "label": "*" }, { "label": "⁸" }] } },
{ "label": "9", "popup": { "relevant": [{ "label": "(" }, { "label": "⁹" }] } },
{ "label": "0", "popup": { "relevant": [{ "label": ")" }, { "label": "⁰" }, { "label": "ⁿ" }, { "label": "∅" }] } }
]
]
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,8 @@ private void setupTouchSurface() {
mIsTwoFingerTap = false;
removeCallbacks(mTwoFingerLongPressRunnable);
mIsTwoFingerLongPress = false;
mTwoFingerTapCount = 0;
removeCallbacks(mTwoFingerTapRunnable);
if (mSelectionMode) {
mSelectionMode = false;
applySurfaceColor();
Expand All @@ -385,6 +387,7 @@ private void setupTouchSurface() {
case MotionEvent.ACTION_CANCEL:
android.util.Log.i("TouchpadView", "ACTION_CANCEL");
mIsDragging = false;
stopEdgeScrolling();
mIsTwoFingerScroll = false;
mIsTwoFingerTap = false;
removeCallbacks(mTwoFingerLongPressRunnable);
Expand Down
Loading
Loading