@@ -60,6 +60,10 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
6060 result.notSupported(call.method, API_21 )
6161 }
6262 }
63+ OPEN_DOCUMENT ->
64+ if (Build .VERSION .SDK_INT >= API_21 ) {
65+ openDocument(call, result)
66+ }
6367 OPEN_DOCUMENT_TREE ->
6468 if (Build .VERSION .SDK_INT >= API_21 ) {
6569 openDocumentTree(call, result)
@@ -250,6 +254,33 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
250254 }
251255 }
252256
257+ @RequiresApi(API_21 )
258+ private fun openDocument (call : MethodCall , result : MethodChannel .Result ) {
259+
260+ val initialUri = call.argument<String >(" initialUri" )
261+
262+ val intent =
263+ Intent (Intent .ACTION_OPEN_DOCUMENT ).apply {
264+ addCategory(Intent .CATEGORY_OPENABLE )
265+
266+ if (initialUri != null ) {
267+ val tree = DocumentFile .fromTreeUri(plugin.context, Uri .parse(initialUri))
268+ if (Build .VERSION .SDK_INT >= API_26 ) {
269+ putExtra(DocumentsContract .EXTRA_INITIAL_URI , tree?.uri)
270+ }
271+ }
272+
273+ type = call.argument<String >(" mimeType" ) ? : " */*"
274+ putExtra(Intent .EXTRA_ALLOW_MULTIPLE , call.argument<Boolean >(" multiple" ) ? : false )
275+ }
276+
277+ if (pendingResults[OPEN_DOCUMENT_CODE ] != null ) return
278+
279+ pendingResults[OPEN_DOCUMENT_CODE ] = Pair (call, result)
280+
281+ plugin.binding?.activity?.startActivityForResult(intent, OPEN_DOCUMENT_CODE )
282+ }
283+
253284 @RequiresApi(API_21 )
254285 private fun openDocumentTree (call : MethodCall , result : MethodChannel .Result ) {
255286 val grantWritePermission = call.argument<Boolean >(" grantWritePermission" )!!
@@ -394,6 +425,26 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
394425 pendingResults.remove(OPEN_DOCUMENT_TREE_CODE )
395426 }
396427 }
428+ OPEN_DOCUMENT_CODE -> {
429+ val pendingResult = pendingResults[OPEN_DOCUMENT_CODE ] ? : return false
430+
431+ try {
432+ // if data.clipData not null, uriList from data.clipData, else uriList is data.data
433+ val uriList = data?.clipData?.let {
434+ (0 until it.itemCount).map { i -> it.getItemAt(i).uri }
435+ } ? : data?.data?.let { listOf (it) }
436+
437+ if (uriList != null ) {
438+ pendingResult.second.success(uriList.map { " $it " })
439+
440+ return true
441+ }
442+
443+ pendingResult.second.success(null )
444+ } finally {
445+ pendingResults.remove(OPEN_DOCUMENT_CODE )
446+ }
447+ }
397448 }
398449
399450 return false
0 commit comments