From f4a67d8866124a0ec92a561b8334cd378bfb2275 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Mon, 17 Aug 2026 15:33:30 -0500 Subject: [PATCH] fix(android): load KMP files from app-external sources 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 --- .../kMAPro/src/main/AndroidManifest.xml | 56 ------------------- .../tavultesoft/kmapro/CheckPermissions.java | 11 ++-- 2 files changed, 6 insertions(+), 61 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml index 563690c031..b376808ed7 100644 --- a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml +++ b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml @@ -113,62 +113,6 @@ android:scheme="content" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/CheckPermissions.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/CheckPermissions.java index 431d97e353..0689917e7c 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/CheckPermissions.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/CheckPermissions.java @@ -33,12 +33,13 @@ public class CheckPermissions { // API 30-32 permissionsOK = Environment.isExternalStorageManager() || checkPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE); - } else { + } + + else { // API 33+ - // We had to remove these MEDIA permissions from AndroidManifest.xml so these will end up failing - // https://support.google.com/googleplay/android-developer/answer/14115180?hl=en - permissionsOK = permissionsOK && checkPermission(activity, Manifest.permission.READ_MEDIA_IMAGES); - permissionsOK = permissionsOK && checkPermission(activity, Manifest.permission.READ_MEDIA_VIDEO); + // No special permissions are needed. + // - https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE + // - https://stackoverflow.com/a/73630987 } return permissionsOK;