63 Commits
Author SHA1 Message Date
nyra 08c895aa12 Add live usage gauge key (GPT gradient + DeepSeek spend) beside L
- UsageGauge: WireGuard-only JSON fetch, cached, background thread, stale-aware
- Gauge key: gradient fill rises with the tightest Codex window, %.1f of today's
  DeepSeek spend, red below a $1.00 balance, flat grey when stale/offline
- Display-only: marker lives in the key indication field, no character, touch swallowed
- Settings entries; cleartext permitted only for 10.10.10.1
- ComposeKey: composing to U+00A0 keeps the named nbsp key, since adding a layout
  key perturbs the generated compose table and would otherwise emit the display glyph
- 5 new unit tests; all 21 tests pass
2026-09-27 17:38:18 +00:00
Jules Aguillon 77c4a27c4c Spell checking (#1137)
This adds dictionary-based spell checking to the keyboard. The keyboard looks at the word being typed and matches it against a dictionary to either complete the rest of the word or find alternative spellings.

The core of this feature is implemented in cdict, which is included as a
submodule in vendor/cidct.

Cdict is developped at https://github.com/Julow/cdict
The dictionaries are hosted at https://github.com/Julow/Unexpected-Keyboard-dictionaries/
The wordlists used to build the dictionaries are the same ones used by
HeliBoard from https://codeberg.org/Helium314/aosp-dictionaries

- Add an activity accessible from the launcher app that lists available
  dictionaries with a download button.
  The DictionaryListView view shows the list of available dictionaries and
  handles downloading and installing them.

- The Dictionaries class manages installed dictionaries. Dictionaries are
  installed as individual files into the app's private directory.

- Available dictionaries are listed in dictionaries.xml, which is generated
  when building Unexpected-Keyboard-dictionaries.
  method.xml mentions the dictionary name for each locales.
2026-02-02 00:20:00 +01:00
Jules Aguillon b40be68773 Fix various linting issues (#1146) 2025-12-22 01:27:07 +01:00
Jules Aguillon 70fb1e8fc1 strings: Shorter name for the settings activity 2025-04-14 22:39:42 +02:00
Jules Aguillon 370f921bc3 Proper support for Android 15 edge-to-edge (#848)
The keyboard background now extends under the system bars and display
cutout on Android 15 but the keys do not.

The back and IME switching buttons that appear in the navigation bar require
special care to not overlap with the keyboard.

The launcher and settings activity are also fixed.
2024-12-26 18:29:19 +01:00
Jules Aguillon f4d88cc087 Fix various linter warnings
Among others:
- Use `apply` instead of `commit` when saving shared preferences.
- Avoid inlined Api
- Remove unused resources
2024-02-10 18:10:49 +01:00
RetrogisusDEV a55506e607 Light and dark themes for the launcher and settings 2024-01-20 22:37:51 +01:00
abb128 b3dcd61c28 Add <queries> element for detecting IMEs (#526)
To detect voice IMEs, Unexpected Keyboard calls InputMethodManager.getEnabledInputMethodList

Internally, this method eventually calls a method that returns a filtered list of packages that may not include the installed voice IME, and thus Unexpected Keyboard unexpectedly claims no voice input is installed because it can't see it.

The fix is to explicitly state in the manifest that we want to query for other IMEs, based on https://developer.android.com/training/package-visibility/declaring

This is not an issue with Google's voice input or other preinstalled voice inputs because they usually have android:forceQueryable=true, but this is an issue with third-party voice inputs such as FUTO Voice Input. Launching the voice input app after activating the keyboard also usually makes the package visible, so a consistent way to replicate this issue on modern Android is to reboot the device and try triggering voice input from the keyboard
2024-01-18 23:42:29 +01:00
Jules Aguillon 8b2c7d9337 Release 1.25.0 (37)
Check layouts / check-layouts (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2024-01-03 01:07:22 +01:00
deftkHD 684d5c7b70 Use Gradle (#452) 2023-11-25 20:11:12 +01:00
RetrogisusDEV 73060bfc00 Adaptive launcher icon
Existing icons are kept for API < 26.
2023-11-06 20:52:35 +01:00
Jules Aguillon cd5ca56226 Release 1.24.0 (36)
Check layouts / check-layouts (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2023-08-18 12:29:17 +02:00
Jules Aguillon 82f347043a Release 1.23.0 (35)
Check layouts / check-layouts (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2023-07-01 17:27:08 +02:00
Jules Aguillon 73737e5148 Release 1.22.1
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2023-04-10 13:18:24 +02:00
Jules Aguillon 1aaf427883 Release 1.22.0
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2023-04-02 17:27:44 +02:00
Jules Aguillon a662934afc Bump targetSdkVersion to 33
No change needed.
2023-04-02 17:16:56 +02:00
Jules Aguillon 35b4e442ab Add a launchable explanatory activity
This activity points to the system settings page for enabling input
methods. This is purely a shortcut but is expected by many users.

It could be made more useful in the future or hidden whenever the
keyboard is enabled.
2023-03-28 11:22:17 +02:00
Jules Aguillon 2ca7b4427d Release 1.21.0 (32)
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2023-02-12 23:38:37 +01:00
Jules Aguillon de5571d428 Release 1.20.2 (31)
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2023-01-15 23:34:04 +01:00
Jules Aguillon a891a3a99b Release 1.20.1
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2022-12-14 15:36:04 +01:00
Jules Aguillon cb2ea83f8a Release 1.20.0
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2022-12-11 22:17:20 +01:00
Jules Aguillon fc68f2e07d Relase 1.19.1
Make Apk CI / Build-Apk (push) Has been cancelled
2022-11-11 15:51:51 +01:00
Jules Aguillon ef34303c7e Avoid crashing in direct-boot mode
The settings activity can't open in direct-boot mode. The emoji pane
opens without the "last used" data.
2022-11-11 15:39:28 +01:00
Jules Aguillon 29fbb27a8a Increase the targetSdkVersion to 31 2022-11-11 10:17:47 +01:00
Jules Aguillon fdebae929b Release 1.19.0
Make Apk CI / Build-Apk (push) Has been cancelled
2022-11-06 21:20:15 +01:00
Jules Aguillon 25cefc5890 Allow to type password on boot
The "android.permission.RECEIVE_BOOT_COMPLETED" permission doesn't seem
useful on Android 12 but is added just in case.
2022-11-06 21:06:04 +01:00
Jules Aguillon d2328d4b9a Automatic day night theme in settings activity
There seems to be no "DayNight" theme compatible with older version of
android outside of the androidx library.

Using 'Theme.DeviceDefault' which is a dark theme, even if it doesn't
sounds like. Detect if a light theme should be used at activity
creation.
2022-11-05 10:13:35 +01:00
Jules Aguillon 167c63ee25 Release 1.18.0
Make Apk CI / Build-Apk (push) Has been cancelled
2022-10-16 22:42:14 +02:00
Jules Aguillon 90b9b0e399 Release 1.17.0
Make Apk CI / Build-Apk (push) Has been cancelled
2022-09-24 23:07:02 +02:00
Jules Aguillon 1951448f9e Release 1.16.1
Make Apk CI / Build-Apk (push) Has been cancelled
2022-06-24 22:11:53 +02:00
Jules Aguillon fda53e3952 Release 1.16.0
Make Apk CI / Build-Apk (push) Has been cancelled
2022-06-06 20:23:09 +02:00
Jules Aguillon 3b1c652370 Release 1.15.0 (22)
Make Apk CI / Build-Apk (push) Has been cancelled
2022-05-01 23:06:18 +02:00
Jules Aguillon 65cc0c736e Release 1.14.2 (21)
Make Apk CI / Build-Apk (push) Has been cancelled
2022-04-16 23:43:25 +02:00
Jules Aguillon 8d8a58462c Release 1.14.1 (20)
Make Apk CI / Build-Apk (push) Has been cancelled
2022-04-06 09:50:33 +02:00
Jules Aguillon aaff8689e3 Release 1.14.0 (19)
Make Apk CI / Build-Apk (push) Has been cancelled
2022-04-03 20:59:42 +02:00
Jules Aguillon 39da035135 Release 1.13.1 (18)
Make Apk CI / Build-Apk (push) Has been cancelled
2022-02-27 18:41:03 +01:00
Jules Aguillon 4ee29f355e Use the Material theme for the settings activity
This is a dark theme. It's probably better than the default theme for
most users.
2022-02-27 18:31:17 +01:00
Jules Aguillon 44b1086be9 Release 1.13.0 (17)
Make Apk CI / Build-Apk (push) Has been cancelled
2022-02-22 20:06:31 +01:00
Jules Aguillon 93b4cc2e7b Release 1.12.0 (16) 2022-01-31 00:24:44 +01:00
Jules Aguillon aa12466767 Release 1.11.1 (15) 2022-01-20 21:34:35 +01:00
Jules Aguillon 96c4b165ac Release 1.11.0 (14) 2022-01-16 23:50:11 +01:00
Jules Aguillon 1cfecbdf48 Auto-format Java and XML files
Use xmllint.
Re-indent Java files using spaces.
2021-12-19 19:44:27 +01:00
Jules Aguillon e5fa23e1f7 Upgrade to Android SDK version 30 2021-12-12 23:48:05 +01:00
Jules Aguillon d787d982cf Release 1.10.0 (13) 2021-12-12 23:36:19 +01:00
Jules Aguillon ac1dd23144 Release 1.9.2 (12) 2021-10-18 22:45:17 +02:00
Jules Aguillon b772ebf237 Release 1.9.1 (11) 2021-05-09 12:23:45 +02:00
Jules Aguillon dd5fce6cae Release 1.9 (10) 2021-05-09 01:29:56 +02:00
Jules Aguillon 68945ff227 Restore support for Android < 12, set minimal version to 4
API level 12 is required for "subtype" code introduced in 1.7.
This adds a fallback for older version, "subtype" features are not
available but the keyboard is usable.

Changet he minimal version to 4 to be able to query the API level.

Using integer constant for versions because that's how it's presented in
the documentation. Build.VERSION_CODES is WTF.
2021-05-09 00:56:59 +02:00
Jules Aguillon a036ebc47b Release 1.8 (9) 2021-05-02 00:05:12 +02:00
Jules Aguillon f466b1c127 Release 1.7 (8) 2021-04-20 00:59:20 +02:00