1304 Commits
Author SHA1 Message Date
harley 0c3dd42354 Integrate FlorisBoard-derived gesture engine (MornsGestureEngine)
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Replaced libswipetype with MornsGestureEngine — ported from
  FlorisBoard's StatisticalGlideTypingClassifier (Apache 2.0)
- Uses combined shape + location Gaussian probability scoring
  (SHAPE_STD=22.08, LOCATION_STD=0.5109) with 200-point sampling
- Gesture activates instantly on key change with velocity-based detection
- Trail draws from initial touch through entire glide
- Added Kotlin plugin to build (v2.1.20)
- 2000 word dictionary from cracklib-small
- Removed libswipetype dependency from glide flow
  (libswipetype still present as submodule but unused)
2026-07-07 03:59:47 -04:00
harley 55a7bd2643 Point libswipetype submodule to our Gitea fork with absolute-coordinate DTW
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
submodule vendor/libswipetype now points to
http://10.0.1.49:3010/harley/libswipetype.git (commit e4aef2f)
instead of upstream github.com/libswipetype/libswipetype.

Key change: removed [0,1] bounding-box normalization from both
PathProcessor and IdealPathGenerator. Paths now stay in original dp
coordinates so DTW measures actual keyboard distance between keys.
2026-07-07 03:41:21 -04:00
harley 292788aafa Fix glide detection: track keys via getKeyAtPosition in view
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Moved gesture detection from Pointers (which didn't know key positions)
  to Keyboard2View.onTouch() which has getKeyAtPosition()
- Tracks finger movement across letter keys using actual key positions
- Ignores corner-swipe mechanism — uses raw x,y + hit-testing
- Threshold: 3+ different letter keys visited → triggers glide mode
2026-07-07 03:10:58 -04:00
harley afbc926cde Wire swipe engine into lifecycle + basic gesture detection
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Added SwipeTypeAdapter lifecycle in Keyboard2 (init, shutdown)
- Added swipe adapter to Pointers via Keyboard2View setter
- Gesture detection: tracks distinct letter keys visited (3+ triggers glide)
- On lift, processes gesture and commits top candidate via InputConnection
- Collects touch points during active glide gesture
- Engine loads en_us_sample.glide dictionary on startup
2026-07-07 03:07:51 -04:00
harley 23dc605bf0 Add UnexpectedKeyboardSwipeAdapter + sample dictionary
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Created UnexpectedKeyboardSwipeAdapter.java implementing SwipeTypeAdapter
- Stub getKeyboardLayout() with QWERTY key positions
- Copied en_us_sample.glide from libswipetype sample-app
- Builds and links: libswipetype native library loads via JNI
- Next: wire gesture detection in Pointers.java + Keyboard2 lifecycle
2026-07-07 03:03:48 -04:00
harley 149373226a Integrate libswipetype as submodule (swipe typing engine)
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Added vendor/libswipetype as git submodule
- Included swipetype-android as Gradle module in settings.gradle.kts
- Added implementation project dependency in build.gradle.kts
- Updated swipetype-android build.gradle to use NDK 27 / SDK 36
- Builds and links successfully via CMake + NDK

Next: wire gesture touch detection, trail rendering, and suggestion integration
2026-07-07 03:01:07 -04:00
harley 939e8da252 Save state before swipe engine work
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2026-07-07 02:59:52 -04:00
harley e2d5b47c7c Layout overhaul: symbol moves, bottom row reorg, Tux meta key
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- '!' moved to bottom-left of '1' (q sw), removed from e ne
- Dash on o sw, underscore on o se
- ':' on l sw (replaced backslash)
- Bottom row: Ctrl | Alt | Space | Fn | Enter
- Fn moved right of space bar, corner swipes cleaned up
- Voice typing moved from Enter to Fn bottom-left (key6)
- Clipboard on Ctrl bottom-left (key6)
- New 'tux' key: META modifier displayed as Tux penguin (0xE002)
  from special_font/002.svg, toggleable (latch+double-tap lock)
- Enter only has action corner (key2), no voice typing
- Config (settings) kept on Fn up-swipe (key1)
morns-keyboard-v1
2026-07-07 02:18:32 -04:00
harley 96966332ce Bump long-press timeout 600→700ms
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2026-07-07 02:08:47 -04:00
harley b034191a1c Move numbers to left side of top row, restore shift next to Z, add config to Fn
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Top row numbers moved from ne (top-right) to nw (top-left) per request
- Existing nw symbols (tilde, !) shifted to ne positions
- Shift restored in z-row (normal key width)
- Backspace now normal key width (no more 1.5x)
- Fn key now has corner swipes: config, change_method, emoji, switch_numeric
- Bottom row: Fn | Ctrl | Alt | Space | Enter
2026-07-07 02:02:35 -04:00
harley b86481461a Rewrite joypad as direction-lock + auto-repeat
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Joypad no longer uses displacement-accumulation (useless on space bar).
- After long-press space bar, determine direction from finger offset vs origin.
- Direction locks, fires one cursor event, then auto-repeats at
  longPressInterval rate via _longpress_handler.
- Changing finger direction updates the lock (fires in new dir immediately).
- Returning finger to dead zone stops auto-repeat.
- Removed SPEED_VERTICAL_MULT and startup threshold:space bar has no room.
- Space bar icon changed to 0xE001 (4-directional arrows).
2026-07-07 01:55:34 -04:00
harley 5fbd21c7d9 Move joypad to space bar long-press, remove separate joystick key
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Space bar long-press now activates Joypad cursor mode
  (long-press detected in handleLongPress before key-repeat)
- Removed separate cursor_joystick key from bottom row
- Widened space bar (4.2 → 6.0) to compensate
- Bottom row: Shift | Fn | Ctrl | Alt | Space (joypad on long-press) | Enter
2026-07-07 01:49:56 -04:00
harley b6618444a2 Fix: remove shift from z-row, rebuild special font with joystick icon
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
- Removed redundant shift key from latn_qwerty_us.xml third row
  (shift is now on the bottom row only)
- Rebuilt assets/special_font.ttf to include 001.svg (4-directional
  joystick icon at codepoint 0xE001)
2026-07-07 01:45:14 -04:00
harley 4a05bf54d5 Add 2D joypad cursor slider + custom bottom row layout
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2026-07-07 01:38:43 -04:00
Jules Aguillon 9c70f1113e Suggestion bar to the middle of split layouts (#1350)
Check generated files / Layout list (push) Has been cancelled
Check generated files / Layout warnings (push) Has been cancelled
Check generated files / Compose key data (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
When the layout is split, insert a middle column showing the
complete_first, complete_second, etc.. keys.
These keys are rendered without borders and background with a new role.

The suggestion bar is hidden for split layouts. The intention is to gain
much needed vertical space.
2026-07-05 00:59:21 +02:00
Jules Aguillon c0a4bca8e2 Fix compose-space sequences not working (#1352)
* Add tests

* Fix compose-space sequences not working

KeyModifier didn't pass editing keys to ComposeKey.

* Cleanup test code

* Show the nbsp symbol when typing compose-space-space
2026-07-04 23:04:34 +02:00
Jules Aguillon b6ba00a1f6 More informative "download failed" message (#1353)
Ask users to allow internet access, which will make sense to users of
grapheneOS and other systems that restrict internet access to apps.
2026-07-04 22:43:26 +02:00
Jules Aguillon 43550a3ad1 Fix the default layout for Hebrew (#1351)
The default layout for Hebrew was not specified correctly.
2026-07-03 03:01:53 +02:00
Jules Aguillon b73ac529e8 Small improvements to the complete keys (#1349)
* Make complete keys not repeatable

* Fix complete keys not updated when suggestions change

* Code cleanup
2026-07-03 02:50:21 +02:00
Jules Aguillon f192dfcb32 Add landscape variant for the number and pin layouts (#1341)
The number pane and the pin entry layouts are split in landscape
orientation. Instead of inserting empty space in the middle of the
layout, the numpad is duplicated. The other keys are not duplicated.
2026-07-01 01:09:36 +02:00
Jules Aguillon 4ab921f112 Add keys for entering the current suggestions (#1176)
This adds the new "Stateful" kind of keys, for which the symbol is
dynamically computed from the app's state. This is implemented with a
hook directly in KeyValue.

3 keys are added for accessing the 3 words on the candidates view.
2026-06-30 16:57:27 +02:00
Jules Aguillon 44dcf6e753 Split layout on tablets and foldables (#1339)
Split the layout on wide screens by default, not just in landscape
orientation.
2026-06-27 19:08:01 +02:00
Jules Aguillon ccd9568e3d CI: Set gradle version (#1340)
Since gradle release, the CI fails due to the android plugin.
2026-06-25 00:52:12 +02:00
Jules Aguillon 21633f22fd Split layout in landscape mode (#1334)
* Automatically split layouts in landscape

This inserts empty space in the center of layouts when in landscape
orientation. The keys are smaller and pushed to the edges of the screen.
This way, the fingers don't have to reach the center of the screen,
which is inconvenient in landscape orientation.

* Duplicate keys that are on the middle

Keys that are almost aligned on the middle of the screen are duplicated
on both sides. These keys are most probably hit with both thumbs.
This is especially useful for large keys like the space bar on the
bottom row.

* Split the bottom row

* Add an option to control layout splitting
2026-06-23 21:33:30 +02:00
Lokesh Kumar c6a568a74b add new item on top for history view as well (#1330)
* when pinning history item, keep it on top

* add new item on top of history as well
2026-06-20 17:50:47 +02:00
Jules Aguillon 241e034a3f Change the appareance of some keys (#896)
* Different color for action keys and space bar

Keys can be made darker or dimmer individually in layouts.
This is done by setting the new 'role' attributes. Roles are "normal",
"action" and "space_bar".

The "action" role is intended to be used for keys like shift, backspace
and other keys from the bottom row.

Themes and special layouts are updated.

* Set 'role="action"' for shift and backspace keys, the number row and numpad.

* check_layout.py: Check that some keys have a role
2026-06-20 14:49:46 +02:00
Lokesh Kumar 27329091af add hide_self key to hide keyboard (#1329) 2026-06-14 12:57:06 +02:00
Lokesh Kumar a7645c3934 when pinning history item, keep it on top (#1328) 2026-06-14 12:50:21 +02:00
Jules Aguillon 374c47af9d Fix exclusion rects overlapping with the navigation bar (#1326)
Since SDK 29, calling setSystemGestureExclusionRects is mandatory to
continue supporting the keyboard's gestures but since SDK 30, this is
done automatically.
2026-06-14 12:14:08 +02:00
Jules Aguillon 49627b63e3 Add option to control behavior with physical keyboard (#1324)
The option can be set to "Show everything" to show the keyboard even
when a physical keyboard is present.
This is a list preference to allow adding a "Show suggestions" option
later.
2026-06-13 15:34:42 +02:00
Jules Aguillon 2a14ec777c Release 2.0.4 (55) 2026-05-25 00:43:37 +02:00
Jules Aguillonandsolokot 6b6491c47a Integrate changes made in Weblate (#1307)
Co-authored-by: solokot <solokot@gmail.com>
2026-05-25 00:39:23 +02:00
Jules Aguillon dbe09902d4 Add missing dictionary for English (#1304)
* gen_method_xml.py: Add missing dictionary for English

* gen_method_xml.py: Propagate dictionary specified in default locales

For example, propagate the dictionary specified for 'en' to 'en-IN',
'en-NG', etc..

* Use the dictionary en_US for locale en_CA
2026-05-25 00:05:05 +02:00
+3 ff769489c3 Integrate changes made in Weblate (#1302)
Co-authored-by: Chasm Solacer <chasmsolacer@users.noreply.hosted.weblate.org>
Co-authored-by: E. Ta. <eta00823@gmail.com>
Co-authored-by: Edgars Andersons <Edgars+Weblate@gaitenis.id.lv>
Co-authored-by: Guzleon <guzleon@yahoo.es>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Janosch <janosch.walde@posteo.de>
Co-authored-by: Joppla <joppla@gmx.com>
Co-authored-by: Mehrdad Shaeri <mehrdad.shaeri@gmail.com>
Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Co-authored-by: Summer-Box1228 <tingrong1228@gmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
2026-05-23 20:41:16 +02:00
Jules Aguillon bfdb1a9604 Remove comments in translations files (#1301)
This helps reduce conflicts when merging changes made in Weblate.
2026-05-23 20:33:09 +02:00
Jules Aguillon 0eb0e6b76f Show the current locale when no dictionary is installed (#1300)
* Refactor: Move DeviceLocales instance to Config

Allows accesses from CandidatesView.

* Show the current locale when no dictionary is installed

This helps understand why installing a dictionary doesn't remove the
message asking to install a dictionary.

The "Install" button is removed and the message is more informative.

* Update translation files
2026-05-23 20:20:26 +02:00
Jules Aguillon 76ee5b2134 Add a background color under suggestions (#1299)
* Fix unwanted mutation of background drawable

* Add a background color under suggestions

Suggestions might be unreadable when the keyboard opacity is very low
(eg. black on black).

The new background is normally invisible, unless the opacity option is
not set to 100%. The corner are rounded like the keys on the keyboard.

* Add themes attributes for suggestion background

Future themes can use them.
2026-05-23 19:59:01 +02:00
Jules Aguillon b81f4acac9 Suggestions: Add digits and ' to word characters (#1298)
This adds support for English words (like "don't") and for correcting
typos containing digits (eg. "s9mething" → "something").
2026-05-23 15:30:48 +02:00
Jules Aguillon 7e19b1f68e Hide keyboard when physical keyboard is connected (#1295)
This is broken since 958900ca
2026-05-20 21:49:12 +02:00
Jules Aguillon e64da8eefe suggestions: Reduce text size and add padding (#1296) 2026-05-20 01:03:36 +02:00
AndreiD049 8532acf814 fix: inclusive check for word boundaries (#1281) 2026-05-20 01:01:34 +02:00
Jules Aguillon aa11bb25fd Avoid Github redirection when downloading dictionaries (#1291)
This removes a domain from connection logs and avoids an unecessary
redirection.
2026-05-17 13:01:39 +02:00
Jules Aguillon 779d438fa0 README: Mention keepandroidopen.org (#1292) 2026-05-14 13:49:27 +02:00
Jules Aguillon b807f217a0 Release 2.0.3 (54) 2026-05-06 23:29:15 +02:00
Jules Aguillon 9d0a849d34 Make building libcdict reproducible (#1282)
This is needed to release on F-Droid.
2026-05-06 23:25:37 +02:00
Jules Aguillon 267894b5ff Release 2.0.2 (53) 2026-05-06 01:29:04 +02:00
Jules Aguillon 56edba7b18 Remove mention of network access from store description (#1280)
This part of the store description is no longer true, as the application
makes a network request when downloading a dictionary.
2026-05-06 01:16:47 +02:00
alotbsol555 11b735bfe8 Update README (#1279)
Removed mention of network requests from the README, due to dictionary downloads.
2026-05-06 01:03:47 +02:00
7587c68d7f Merge weblate translations before 2.0.2 (#1277)
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Juan M Sevilla <jumase@disroot.org>
Co-authored-by: Jules <jules@j3s.fr>
Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Co-authored-by: Summer-Box1228 <tingrong1228@gmail.com>
2026-05-05 12:43:05 +02:00
Jules Aguillon e57cdc45f2 Revert to the 1.32.1 Russian layout (#1276)
Partly revert be0aa07.
2026-05-05 12:37:39 +02:00