From f9746cf30c89333b6bee8e024d72650d34bd6c9b Mon Sep 17 00:00:00 2001 From: Roman Tsisyk Date: Sat, 10 Feb 2024 19:25:43 +0200 Subject: [PATCH] [android] Support ACTION_SEND_MULTIPLE Tested with Google Drive. GPS Logger and Samsung Files are not supported because they don't set mime-type. Changing mimtType to "*/*" fixes the issue, but makes the app default handler for any files, which is annoying. ``` `` Closes #5402 Signed-off-by: Roman Tsisyk --- android/app/src/main/AndroidManifest.xml | 1 + .../bookmarks/data/BookmarkManager.java | 7 +++++++ .../java/app/organicmaps/intent/Factory.java | 16 ++++++++++------ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ca1e241fbf..26262110c9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -155,6 +155,7 @@ + diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java index 3966e1f36d..c8c57e0533 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java @@ -494,6 +494,13 @@ public enum BookmarkManager return true; } + @WorkerThread + public void importBookmarksFiles(@NonNull ContentResolver resolver, @NonNull List uris, @NonNull File tempDir) + { + for (Uri uri: uris) + importBookmarksFile(resolver, uri, tempDir); + } + public boolean isAsyncBookmarksLoadingInProgress() { return nativeIsAsyncBookmarksLoadingInProgress(); diff --git a/android/app/src/main/java/app/organicmaps/intent/Factory.java b/android/app/src/main/java/app/organicmaps/intent/Factory.java index cc650a9e00..6f89d64ae9 100644 --- a/android/app/src/main/java/app/organicmaps/intent/Factory.java +++ b/android/app/src/main/java/app/organicmaps/intent/Factory.java @@ -25,6 +25,8 @@ import app.organicmaps.util.StorageUtils; import app.organicmaps.util.concurrency.ThreadPool; import java.io.File; +import java.util.Collections; +import java.util.List; public class Factory { @@ -39,20 +41,22 @@ public class Factory public boolean process(@NonNull Intent intent, @NonNull MwmActivity activity) { // See KML/KMZ/KMB intent filters in manifest. - final Uri uri; + final List uris; if (Intent.ACTION_VIEW.equals(intent.getAction())) - uri = intent.getData(); + uris = Collections.singletonList(intent.getData()); else if (Intent.ACTION_SEND.equals(intent.getAction())) - uri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri.class); + uris = Collections.singletonList(IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri.class)); + else if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) + uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); else - uri = null; - if (uri == null) + uris = null; + if (uris == null) return false; MwmApplication app = MwmApplication.from(activity); final File tempDir = new File(StorageUtils.getTempPath(app)); final ContentResolver resolver = activity.getContentResolver(); - ThreadPool.getStorage().execute(() -> BookmarkManager.INSTANCE.importBookmarksFile(resolver, uri, tempDir)); + ThreadPool.getStorage().execute(() -> BookmarkManager.INSTANCE.importBookmarksFiles(resolver, uris, tempDir)); return false; } }