diff --git a/.changes/fix-dialog-android-filters.md b/.changes/fix-dialog-android-filters.md new file mode 100644 index 0000000000..9647d4e554 --- /dev/null +++ b/.changes/fix-dialog-android-filters.md @@ -0,0 +1,6 @@ +--- +dialog: patch +dialog-js: patch +--- + +Fixed an issue that caused the file picker not to open on Android when extension filters were set. diff --git a/plugins/dialog/android/src/main/java/DialogPlugin.kt b/plugins/dialog/android/src/main/java/DialogPlugin.kt index af0467d894..1d87a6e914 100644 --- a/plugins/dialog/android/src/main/java/DialogPlugin.kt +++ b/plugins/dialog/android/src/main/java/DialogPlugin.kt @@ -56,20 +56,18 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) { try { val args = invoke.parseArgs(FilePickerOptions::class.java) val parsedTypes = parseFiltersOption(args.filters) - - val intent = if (parsedTypes.isNotEmpty()) { - val intent = Intent(Intent.ACTION_PICK) - setIntentMimeTypes(intent, parsedTypes) - intent - } else { - val intent = Intent(Intent.ACTION_GET_CONTENT) - intent.addCategory(Intent.CATEGORY_OPENABLE) - intent.type = "*/*" - intent + + // TODO: ACTION_OPEN_DOCUMENT ?? + val intent = Intent(Intent.ACTION_GET_CONTENT) + intent.addCategory(Intent.CATEGORY_OPENABLE) + intent.type = "*/*" + + if (parsedTypes.isNotEmpty()) { + intent.putExtra(Intent.EXTRA_MIME_TYPES, parsedTypes) } intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, args.multiple ?: false) - + startActivityForResult(invoke, intent, "filePickerResult") } catch (ex: Exception) { val message = ex.message ?: "Failed to pick file" @@ -115,7 +113,7 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) { callResult.put("files", JSArray.from(uris.toTypedArray())) return callResult } - + private fun parseFiltersOption(filters: Array): Array { val mimeTypes = mutableListOf() for (filter in filters) { @@ -132,38 +130,10 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) { return mimeTypes.toTypedArray() } - private fun setIntentMimeTypes(intent: Intent, mimeTypes: Array) { - if (mimeTypes.isNotEmpty()) { - var uniqueMimeKind = true - var mimeKind: String? = null - for (mime in mimeTypes) { - val kind = mime.split("/")[0] - if (mimeKind == null) { - mimeKind = kind - } else if (mimeKind != kind) { - uniqueMimeKind = false - } - } - - if (uniqueMimeKind) { - if (mimeTypes.size > 1) { - intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) - intent.type = Intent.normalizeMimeType("$mimeKind/*") - } else { - intent.type = mimeTypes[0] - } - } else { - intent.type = "*/*" - } - } else { - intent.type = "*/*" - } - } - @Command fun showMessageDialog(invoke: Invoke) { val args = invoke.parseArgs(MessageOptions::class.java) - + if (activity.isFinishing) { invoke.reject("App is finishing") return @@ -179,7 +149,7 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) { Handler(Looper.getMainLooper()) .post { val builder = AlertDialog.Builder(activity) - + if (args.title != null) { builder.setTitle(args.title) } @@ -213,10 +183,14 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) { val parsedTypes = parseFiltersOption(args.filters) val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) - setIntentMimeTypes(intent, parsedTypes) - intent.addCategory(Intent.CATEGORY_OPENABLE) intent.putExtra(Intent.EXTRA_TITLE, args.fileName ?: "") + intent.type = "*/*" + + if (parsedTypes.isNotEmpty()) { + intent.putExtra(Intent.EXTRA_MIME_TYPES, parsedTypes) + } + startActivityForResult(invoke, intent, "saveFileDialogResult") } catch (ex: Exception) { val message = ex.message ?: "Failed to pick save file"