This change updates the Android Target API to 36 to satisfy the upcoming
annual Play Store Aug 31 requirement. It updates Keyman for Android to
use API level 36 by changing the compileSdk and targetSdkVersion
properties to 36.
Also update `compileSdkVersion` and some reformatting in `README.md`.
Changes made by AI (Gemini 3 Flash Preview).
Fixes: #16279
Build-bot: release:android
chore(android): cleanup font variable names, remove obsolete code
This change renames the font variable names so that they match the two conceptual fonts we have. Also remove obsolete code that dealt with the `font` parameter being a JSON object instead of a string containing the font filename. Having the `font` parameter containing a JSON object was legacy code that won't happen with current Keyman versions.
Follow-up-of: #16188
chore(android): log legacy cloud keyboards
This adds a Sentry log if a user is still using legacy cloud keyboards. We do this so that we will learn if there are still users out there or if we can remove the code that deals with those keyboards.
Reverts part of commit d0e1649630 until we know
if there are still users out there that are using legacy cloud keyboards.
See #16237.
Build-bot: skip build:android
This adds a Sentry log if a user is still using legacy cloud keyboards.
We do this so that we will learn if there are still users out there
or if we can remove the code that deals with those keyboards.
Test-bot: skip
* Specify clearer filenames for Android samples and test KeyboardHarness
* Cleanup android/*/build.sh to match current patterns
* Remove obsolete jcenter dependency
* Export BUILDER_CONFIGURATION in builder.inc.sh
Fixes: #16137Fixes: #16181
Test-bot: skip
Build-bot: skip release:android
* Remove irrelevant context from toast and add more context for Sentry
report.
* Add a test keyboard with a script error that will trigger the toast on
first keystroke.
* Rearrange common/test/keyboards/invalid to make a good place for
compiled invalid keyboards.
Fixes: #16145
Test-bot: skip
Previously, the event handler was attached to body, but in the event of
the keyboard failing to render, the body element will typically be zero
pixels high. Instead, attach the handler to the document itself.
KeymanWeb, when running normally, will handle all touches on the
keyboard elements which take 100% of the real estate. So the document
tap will only be received in the case of an error condition.
Also, add a console error that will be reported to Sentry when user has
error reporting switched on.
Test-bot: skip
This change renames the font variable names so that they match the
two conceptual fonts we have. Also remove obsolete code that dealt with
the `font` parameter being a JSON object instead of a string containing
the font filename. Having the `font` parameter containing a JSON object
was legacy code that won't happen with current Keyman versions.
Follow-up-of: #16188
Build-bot: release:android
PR #16146 introduced a problem with selecting a different font as
display font so that we always ended up with not setting the font.
This was caused by the font filenames now being a URL (which is necessary
because they get processed by the web engine). However, the Android code
checks for the existence of the font in order to create the typeface,
which only works for local paths.
This PR modifies and simplifies `KMKeyboard.getFontFilename` to return the
full path, renames `KMKeyboard.txtFont` and `KMKeyboard.oskFont` to make
it clearer that they contain a path and not a URL.
Also initialize `KMKeyboard.oskFontPath` with empty string instead of
`null`. This makes it consistent with` txtFontPath` and with the
documented behavior of `KMManager.getKeyboardOskFontFilename()` (which
returns `KMKeyboard.oskFontPath`).
Follows: #16146Fixes: #16187
Build-bot: release:android
We use SIL EuroLatin as fallback keyboard. If that is not installed,
previously we output an error which showed up as a toast for the user.
This change now outputs a warning instead of the error for the default
keyboard.
Also changed the KeyboardHarness test app to set a different keyoard as
default.
The default fonts (DejaVueSans.ttf and keymanweb-osk.ttf) are located in
the root directory, not the package directory. This fixes the
KeyboardHarness test app.
Also some improvements with variable and function names to better match
what they do.
On Windows the tests failed because the AppData directory doesn't yet
exist under an allowed app internal storage path. This change creates
the directory first when running tests.
Also fix `assertEquals` in that test file - the parameter ordering is
`expected, actual` but we had it the other way round which gives a
confusing message if the test fails.
* Clean up `KMLog` -- simpler code paths, DRY out common validation,
remove redundant re-entrancy checks.
* Use Sentry `setTag` API and scopes instead of `setExtra`.
* Wrap all potential failure points in exception handlers for extra
resilience -- do our best to make sure errors are reported in as many
cases as possible.
Fixes: #16122
Test-bot: skip
This change moves to using `WebViewAssetLoader` for loading files from
the device instead of using file:// URLs. This fixes the blank keyboard
problem reported in #16096 for Android.
Also make `KMKeyboard.getKeyboardRoot()` private, and rename public
`Keyboard.getKeyboardPath()` to private `Keyboard.getKeyboardUrl()`.
Part-of: #16096
For Keyman for Android, add the new `keyman-version` parameter to the
api.keyman.com/package-version call so that updates to packages that are
not supported on the current version of Keyman will not be offered. This
supports the scenario where an updated keyboard or lexical model depends
on a newer version of Keyman. Note that an older version of the keyboard
or lexical model package will not be offered (the user can still
download and install an older version manually, but generally, the
recommended solution is to upgrade Keyman; there would be significant
cost to add support for querying and installation of older version
keyboards on the server side, for limited benefit).
Relates-to: keymanapp/api.keyman.com#325
- Also renamed `prefixed` and `withoutPrefix` functions to use the name
that was aliased on most cases: `toPrefixedKeyboardId` and
`toUnprefixedKeyboardId`.
- Renamed `ModelManager` class to `ModelCache` which was the name used
everywhere except in comments.
Part-of: #15292
Test-bot: skip
Addresses review feedback from Marc and Darcy:
- Add JavaDoc comments to getKeyboardHeightMin() and getKeyboardHeightMax()
explaining the purpose, parameters, and return values
- Implement separate pending height tracking per keyboard type (in-app/system)
and orientation (portrait/landscape) instead of a single flag
- Add four preference keys following KMKey_ naming convention:
KMKey_PendingHeightUpdate_InappPortrait, KMKey_PendingHeightUpdate_InappLandscape,
KMKey_PendingHeightUpdate_SystemPortrait, KMKey_PendingHeightUpdate_SystemLandscape
- Create helper function getPendingHeightKey() to determine the correct key
- Create setPendingHeightUpdate() and getAndClearPendingHeightUpdate() functions
- Fix applyKeyboardHeight() to use new helper functions and remove broken
heightApplied variable and duplicate pending height logic
- Update KMKeyboard.onResume() to use getAndClearPendingHeightUpdate()
- Add documentation links for getKeyboardHeightMin and getKeyboardHeightMax
in index.md
Handling invalid orientations
updating orientation logic
refresh webview height if ApplyKeyboardHeight() has been applied without KB active
I ran into a bug building this code into app-builders and fixed it downstream. This commit pushes it upstream.
While resize dialog is open:
- Keyboard WebView is NOT loaded (isKeyboardLoaded() == false)
- ACTION_UP saves to SharedPreferences: ✅ Works
-But skips WebView layout update: ❌ Because keyboard not loaded
- User exits dialog, keyboard appears:
- If the keyboard WebView loads and reads from SharedPreferences properly: ✅ Works
- But if there's a timing issue or the WebView had old layout params cached: ❌ Touch zone mismatch
sentry-manager is used by Keyman Engine for Android and Keyman Engine
for iOS, but not directly by KeymanWeb, nor does it have any
dependencies on /web. So it does not make sense to keep it under /web.
es-bundling is used by sentry-manager and potentially other /common/web
tools in the future, so moving it under /common/tools makes it more
consistent in the future.
This is part of simplifying the web source tree; these changes do not
make significant build performance differences at this time.
Test-bot: skip