Skip to content

fix(android): load KMP files from app-external sources - #16392

Merged
jahorton merged 11 commits into
masterfrom
fix/android/load-external-kmp-file
Sep 11, 2026
Merged

fix(android): load KMP files from app-external sources#16392
jahorton merged 11 commits into
masterfrom
fix/android/load-external-kmp-file

Conversation

@jahorton

@jahorton jahorton commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

This PR provides two main services:

  • It allows on-device KMP file providers (such as Chrome downloads or the local Files app) to smoothly pass those KMP files into Keyman for Android for installation.
  • It also removes wildcard-host http / https deep-links from the app manifest, as these are invalid.

Relates-to: #14854

Upon my investigation into related documentation, I've determined that with current versions of Android, setting up a general, "anywhere on the web" deep link for KMP files is not supported and should not be attempted.

How, then, do we facilitate external apps passing off KMP links or files to Keyman for Android? Turns out... we've already done the work for downloaded files with file: and content: scheme deep-links. The issue is that some of our permissions-checking code logic was bad. With a little work to correct them - removing the bad checks that never should have existed anyway - the files load nicely!

Build-bot: skip release:android

Notes: upon reviewing #10133 and #14122, it sounds like there may be variance among devices. Samsung is likely to be trickier to handle, while Google devices using plain Chrome may be more straightforward. I may need to alter the user tests accordingly.

User Testing

GROUP_API_28: Perform these tests on devices with Android API 28 (Android 9).
GROUP_API_30: Perform these tests on devices with Android API 30 (Android 11).
GROUP_API_33: Perform these tests on devices with Android API 33+ (Android 13).

TEST_DOWNLOAD_AND_INSTALL: Using Keyman for Android, download a KMP from within the Chrome app, then install it from Chrome's download section.

  • Navigate to https://jahorton.github.io and click the english_punct_rota.kmp link in order to download the file.
  • Once downloaded, go to the download section (if not displayed) and tap on the downloaded file.
  • Verify that Keyman for Android launches and opens the package installer without displaying an error or alert.
  • Install the package and verify that no errors result.

TEST_INSTALL_VIA_FILES: Using Keyman for Android, download a KMP from within the Chrome app, then install it from the device's Files app.

  • Navigate to https://jahorton.github.io and click the gesture_prototyping.kmp link in order to download the file.
  • Once downloaded, exit Chrome and use the device's Files app to find and "open" the downloaded file.
  • Verify that Keyman for Android launches and opens the package installer without displaying an error or alert.
  • Install the package and verify that no errors result.

This PR provides two main services:
- It allows on-device KMP file providers (such as Chrome downloads or the local Files app) to smoothly pass those KMP files into Keyman for Android for installation.
- It also removes wildcard-host http / https deep-links from the app manifest, as these are invalid.

Fixes: #14854
Fixes: #10133

Upon my investigation into related documentation, I've determined that with current versions of Android, setting up a general, "anywhere on the web" deep link for KMP files is not supported and should not be attempted.

How, then, do we facilitate external apps passing off KMP links or files to Keyman for Android?  Turns out... we've already done the work for downloaded files with `file:` and `content:` scheme deep-links.  The issue is that some of our permissions-checking code logic was bad.   With a little work to correct them - removing the bad checks that never should have existed anyway - the files load nicely!

Build-bot: skip release:android
@keymanapp-test-bot

keymanapp-test-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown

User Test Results

Test specification and instructions

  • ✅ GROUP_API_28: Perform these tests on devices with Android API 28 (Android 9).

    2 tests PASSED
  • ✅ GROUP_API_30: Perform these tests on devices with Android API 30 (Android 11).

    2 tests PASSED
  • ✅ GROUP_API_33: Perform these tests on devices with Android API 33+ (Android 13).

    2 tests PASSED

Test Artifacts

@keymanapp-test-bot keymanapp-test-bot Bot added this to the A19S36 milestone Aug 17, 2026
@mcdurdin

Copy link
Copy Markdown
Member

Trying to install a .kmp on my phone from Samsung files gives an error

Screenshot_20260818_072051_My Files.jpg

@mcdurdin

Copy link
Copy Markdown
Member

I tested downloading a file from Chrome on my Samsung Galaxy A553 5G on Android 16 (One UI 8.0), Chrome version 151.0.7922.137 (11 Aug 2026). It worked fine -- Keyman appeared on the list of available apps to open the .kmp file, and no errors were encountered.

Samsung Files continues to fail with the error as shown above. 'Files by Google' works fine -- so suggest we recommend that as an alternative file manager on Samsung devices.

See also: #10967 (comment)

@mcdurdin

Copy link
Copy Markdown
Member

I think we should have a user test for:

  • installing a keyboard from keyman.com (in a browser, not within Keyman)

We should at some point also test, once we have a stable release build:

  • the normal keyboard + app install flow from keyman.com (via Play Store)

@jahorton

Copy link
Copy Markdown
Contributor Author

I think we should have a user test for:

* installing a keyboard from keyman.com (in a browser, not within Keyman) 

Would the test be for it to download, then install from download? Or would it be to instantly load into the Keyman app package-install process?

@mcdurdin

Copy link
Copy Markdown
Member

Or would it be to instantly load into the Keyman app package-install process?

I think this -- we want to verify that existing package install pathways have not been impacted (not that I think they have -- but for the avoidance of unpleasant surprises...)

@jahorton

jahorton commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

Or would it be to instantly load into the Keyman app package-install process?

I think this -- we want to verify that existing package install pathways have not been impacted (not that I think they have -- but for the avoidance of unpleasant surprises...)

They were, but by other changes - we internationalized keyman.com, which prefixes the language code onto all paths. I'm working on this now.

@mcdurdin

Copy link
Copy Markdown
Member

They were, but by other changes - we internationalized keyman.com, which prefixes the language code onto all paths. I'm working on this now.

Can you open an issue as a first step?

@mcdurdin mcdurdin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The AndroidManifest.xml still seems a bit chaotic. It would be good to review each intent-filter and ensure that the comments make sense, and group them appropriately.

Comment thread android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/CheckPermissions.java Outdated
Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="file" />
<data android:scheme="content" />

ghost Aug 19, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this do?

ghost Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Matches both file:/// and content:// URIs. Often times, what we get between apps appears to be the content:// one.

It's an OR, not an AND - allowing us to share the host and pathPattern entries for both protocols.

ghost Aug 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure what this is fixing though -- does this impact the underlying reported issue?

ghost Sep 5, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still wondering if there is a reported issue that this is addressing?

ghost Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This helps fix the issue of trying to "open" a KMP file with Keyman from outside of the app.

Often times, what we get between apps appears to be the content:// one.

The way this <intent-filter> is set up, both file:/// and content:// URLs will be handled appropriately.

ghost Sep 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understood the first time, but I just didn't find the "Often times..." explanation compelling -- just anecdotal, and I wanted to understand why. So I searched and found the reference documentation I was looking for, relevant snippet below:

This last rule, rule (d), reflects the expectation that components are able to get local data from a file or content provider. Therefore, their filters can list just a data type and don't need to explicitly name the content: and file: schemes.

https://developer.android.com/guide/components/intents-filters#DataTest (called "rule 4", not "rule (d)" in the linked content)

This means we should actually delete both the file and content scheme tests.

ghost Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense once we're certain our MIME-type has fully landed within all relevant Android APIs. Are we certain that this has sufficiently occurred, though? What if some of the older devices we support don't associate .kmps properly?

ghost Sep 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the point is that the file and content schemes are implicitly supported and we don't need to list them explicitly. The mime type will not change the situation here.

ghost Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a component is presumed to support content: and file: data if its filter lists only a MIME type.

Are you saying that because we list a MIME type there, whether or not it's actually supported by any given API of Android, this will apply?

Should we then have a version of it without a MIME-type entry to handle such potential cases?

ghost Sep 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This intent-filter already has two MIME type tests: one for the future, vnd.keyman.kmp+zip, and one for today, octet-stream. So the host and scheme tests should not be needed because the MIME type matches will get us a good enough match, along with the pathPattern test (except for Samsung Files which is buggy).

        <data android:pathPattern=".*\\.kmp" />

        <data android:mimeType="application/vnd.keyman.kmp+zip" />
        <!--
          Backup MIME intents
        -->
        <data android:mimeType="application/octet-stream" />

Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
@jahorton
jahorton requested a review from mcdurdin August 19, 2026 17:08
@Meng-Heng

ghost commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Test Results

GROUP_API_28:

Test Specs

  1. Pixel 3a XL, API 28 (Android 9)
  2. keyman-19.0.268-alpha-test-16392.apk
  • TEST_DOWNLOAD_AND_INSTALL (PASSED):
  1. Navigate to https://jahorton.github.io and download the english_punct_rota.kmp file
  2. Once downloaded -> Open the file location -> Tap on the downloaded file -> Allow "Full Access to Files"
  3. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  4. Follow through the installation dialogs of the keyboard package
  5. VERIFIED: No errors result. Dictionary installed alongside the keyboard.
  6. Typing and predictive text work as expected.
  • TEST_INSTALL_VIA_FILES (PASSED):
  1. Navigate to https://jahorton.github.io and download the gesture_prototyping.kmp file
  2. Once downloaded -> Open the File app -> Tap on the downloaded file
  3. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  4. Follow through the installation dialogs of the keyboard package
  5. VERIFIED: No errors result. Dictionary installed alongside the keyboard.
  6. Typing and predictive text work as expected.

GROUP_API_30:

Test Specs

  1. Pixel 5, API 30 (Android 11)
  2. keyman-19.0.268-alpha-test-16392.apk
  • TEST_DOWNLOAD_AND_INSTALL (PASSED):
  1. Navigate to https://jahorton.github.io and download the english_punct_rota.kmp file.
  2. Once downloaded -> Open the file location -> Tap on the downloaded file -> Receive an error about "Storage Permission"
  3. Go to Android Settings -> Permission Manager -> Files and media permission -> Allow files and media only for Keyman
  4. Tap on the downloaded file
  5. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  6. Follow through the installation dialogs of the keyboard package
  7. VERIFIED: No errors result. Dictionary installed alongside the keyboard.
  8. Typing and predictive text work as expected.
  • TEST_INSTALL_VIA_FILES (PASSED):
  1. Navigate to https://jahorton.github.io and download the gesture_prototyping.kmp file
  2. Once downloaded -> Open the File app -> Tap on the downloaded file
  3. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  4. Follow through the installation dialogs of the keyboard package
  5. VERIFIED: No errors result. Dictionary installed alongside the keyboard.
  6. Typing and predictive text work as expected.

GROUP_API_33:

Test Specs

  1. Pixel 6a, API 33 (Android 13.0)
  2. keyman-19.0.268-alpha-test-16392.apk
  • TEST_DOWNLOAD_AND_INSTALL (PASSED):
  1. Launch and Exit Keyman
  2. Navigate to https://jahorton.github.io and download the english_punct_rota.kmp file.
  3. Once downloaded -> Open the file location -> Tap on the downloaded file
  4. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  5. Follow through the installation dialogs of the keyboard package
  6. VERIFIED: No errors result. Dictionary installed alongside the keyboard.
  7. Predictive text and typing work as expected.
  • TEST_INSTALL_VIA_FILES (PASSED):
  1. Navigate to https://jahorton.github.io and download the english_punct_rota.kmp file.
  2. Once downloaded -> Open the "File" -> Tap on the downloaded file
  3. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  4. Follow through the installation dialogs of the keyboard package
  5. VERIFIED: No errors result. Dictionary installed alongside the keyboard
  6. Predictive text and typing work as expected.

@Meng-Heng

ghost commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Hello, @jahorton. Could you help confirm the steps for the TEST_INSTALL_VIA_FILES are the same as TEST_DOWNLOAD_AND_INSTALL?

@jahorton

ghost commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Hello, @jahorton. Could you help confirm the steps for the TEST_INSTALL_VIA_FILES are the same as TEST_DOWNLOAD_AND_INSTALL?

Sorry about that. I've updated the instructions for that test now.

@keymanapp-test-bot keymanapp-test-bot Bot removed the user-test-required User tests have not been completed label Aug 21, 2026
@mcdurdin mcdurdin linked an issue Aug 24, 2026 that may be closed by this pull request
@jahorton
jahorton force-pushed the fix/android/load-external-kmp-file branch from abb2b82 to af0a2b6 Compare September 3, 2026 14:19
@jahorton

ghost commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

Oops, merged the (approved) child PR into this one, rather than this into master, then that into master. Almost redid the split, but I managed to reverse the changes.

(Interesting that there's no second force-push entry shown here for when I put things back to abb2b82.)

ghost left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If all user tests pass, we can go ahead but I feel like there's still some ambiguity here

<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="file" />
<data android:scheme="content" />

ghost Sep 5, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still wondering if there is a reported issue that this is addressing?

Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml Outdated
Backup MIME intents
-->
<data
android:mimeType="application/octet-stream"

ghost Sep 5, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally we won't need this in the future? It seems a bit broad!

Comment on lines 118 to +119
<data android:scheme="file" />
<data android:scheme="content" />

ghost Sep 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<data android:scheme="file" />
<data android:scheme="content" />

Per https://developer.android.com/guide/components/intents-filters#DataTest

<data android:scheme="file" />
<data android:scheme="content" />

<data android:host="*" />

ghost Sep 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<data android:host="*" />

Per https://developer.android.com/guide/components/intents-filters#DataTest

Comment thread android/KMAPro/kMAPro/src/main/AndroidManifest.xml
@jahorton
jahorton requested a review from mcdurdin September 9, 2026 19:41
@jahorton

ghost commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

@keymanapp-test-bot retest all

There have been enough changes that it may be wise to verify that the new version of the fixes still work.

@keymanapp-test-bot keymanapp-test-bot Bot added the user-test-required User tests have not been completed label Sep 9, 2026
@Meng-Heng

ghost commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

@jahorton, the Android Test build has failed. I shouldn't proceed, right?

ghost left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more go on the merry go round

<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="file" />
<data android:scheme="content" />

ghost Sep 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This intent-filter already has two MIME type tests: one for the future, vnd.keyman.kmp+zip, and one for today, octet-stream. So the host and scheme tests should not be needed because the MIME type matches will get us a good enough match, along with the pathPattern test (except for Samsung Files which is buggy).

        <data android:pathPattern=".*\\.kmp" />

        <data android:mimeType="application/vnd.keyman.kmp+zip" />
        <!--
          Backup MIME intents
        -->
        <data android:mimeType="application/octet-stream" />

Comment on lines 101 to 107
<!-- needed for mangled email messages -->
<data
android:mimeType="application/keyman"
android:mimeType="application/vnd.keyman.kmp+zip"
android:scheme="content" />
<!-- needed for mangled email messages -->
<data
android:mimeType="application/octet-stream"
android:scheme="content" />

ghost Sep 10, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should only need android:scheme="content" once in the filter, if we specify it, and it's clearer to read if split out from the mimeType:

<data android:scheme="content" />
<data android:mimeType="application/vnd.keyman.kmp+zip" />
<data android:mimeType="application/octet-stream" />

Comment on lines +180 to +181
<data android:scheme="http" />
<data android:scheme="https" />

ghost Sep 10, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To match the order found in a URI, can we put these before the android:host lines?

android:pathPattern="/.*\\.kmp"
android:scheme="https" />
<data android:host="*" />
<data android:pathPattern=".*\\.kmp" />

ghost Sep 10, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<data android:pathPattern=".*\\.kmp" />
<data android:pathSuffix=".kmp" />

<data android:scheme="file" />
<data android:host="*" />
<data android:pathPattern="/.*\\.kmp" />
<data android:pathPattern=".*\\.kmp" />

ghost Sep 10, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So sorry. It turns out that after all this, we do need to specify scheme and host because otherwise path is ignored in the filter:

These attributes are meaningful only if the scheme and host attributes are also specified for the filter.

Sorry for the confusion... Also, pathSuffix is available which I think seems safer than pathPattern, which is fragile (read the docs for all the edge cases).

Suggested change
<data android:pathPattern=".*\\.kmp" />
<data android:scheme="content" />
<data android:scheme="file" />
<data android:host="*" />
<data android:pathSuffix=".kmp" />

ghost Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pathSuffix and pathAdvancedPattern were introduced in API level 31.

https://developer.android.com/guide/topics/manifest/data-element#path

As we support earlier API, I don't think it's safe to rely on pathSuffix.

@jahorton
jahorton requested a review from mcdurdin September 10, 2026 16:06
@Meng-Heng

ghost commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Test Results

GROUP_API_28:

Test Specs

  1. Pixel 3a XL, API 28 (Android 9)
  2. keyman-19.0.268-alpha-test-16392.apk
  • TEST_DOWNLOAD_AND_INSTALL (PASSED):
  1. Install Keyman
  2. Navigate to https://jahorton.github.io and download the english_punct_rota.kmp file.
  3. Once downloaded -> Tap on Open
  4. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  5. Follow through the installation dialogs of the keyboard package
  6. VERIFIED: No errors result. Dictionary installed alongside the keyboard
  7. Predictive text and typing work as expected. Gestures are working as expected.
  • TEST_INSTALL_VIA_FILES (PASSED):
  1. Navigate to https://jahorton.github.io and download the gesture_prototyping.kmp file
  2. Once downloaded -> Open the File app -> Tap on the downloaded file
  3. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  4. Follow through the installation dialogs of the keyboard package
  5. VERIFIED: No errors result. Dictionary installed alongside the keyboard.
  6. Typing and predictive text work as expected.

GROUP_API_30:

Test Specs

  1. Pixel 5, API 30 (Android 11)
  2. keyman-19.0.268-alpha-test-16392.apk
  • TEST_DOWNLOAD_AND_INSTALL (PASSED):
  1. Install Keyman
  2. Navigate to https://jahorton.github.io and download the english_punct_rota.kmp file.
  3. Once downloaded -> Tap on Open
  4. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  5. Follow through the installation dialogs of the keyboard package
  6. VERIFIED: No errors result. Dictionary installed alongside the keyboard
  7. Predictive text and typing work as expected. Gestures are working as expected.
  • TEST_INSTALL_VIA_FILES (PASSED):
  1. Navigate to https://jahorton.github.io and download the gesture_prototyping.kmp file
  2. Once downloaded -> Open the File app -> Tap on the downloaded file
  3. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  4. Follow through the installation dialogs of the keyboard package
  5. VERIFIED: No errors result. Dictionary installed alongside the keyboard
  6. Typing and predictive text work as expected.

GROUP_API_33:

Test Specs

  1. Pixel 6a, API 33 (Android 13.0)
  2. keyman-19.0.268-alpha-test-16392.apk
  • TEST_DOWNLOAD_AND_INSTALL (PASSED):
  1. Install Keyman
  2. Navigate to https://jahorton.github.io and download the english_punct_rota.kmp file.
  3. Once downloaded -> Tap on Open
  4. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  5. Follow through the installation dialogs of the keyboard package
  6. VERIFIED: No errors result. Dictionary installed alongside the keyboard
  7. Predictive text and typing work as expected. Gestures are working as expected.
  • TEST_INSTALL_VIA_FILES (PASSED):
  1. Navigate to https://jahorton.github.io and download the english_punct_rota.kmp file.
  2. Once downloaded -> Open the "File" -> Tap on the downloaded file
  3. VERIFIED: Keyman for Android launches and opens the package installer without displaying an error or alert
  4. Follow through the installation dialogs of the keyboard package
  5. VERIFIED: No errors result. Dictionary installed alongside the keyboard
  6. Predictive text and typing work as expected.

@keymanapp-test-bot keymanapp-test-bot Bot removed the user-test-required User tests have not been completed label Sep 11, 2026

ghost left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- so much clearer and makes much more sense than before

@jahorton
jahorton merged commit a117672 into master Sep 11, 2026
@jahorton
jahorton deleted the fix/android/load-external-kmp-file branch September 11, 2026 13:18
@github-project-automation github-project-automation Bot moved this from Todo to Done in Keyman Sep 11, 2026
@keyman-server

ghost commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

Changes in this pull request will be available for download in Keyman version 19.0.285-alpha

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

bug(android): *.kmp deeplink does not work

4 participants