Skip to content

Commit 7b54ee5

Browse files
author
Alex Rintt
authored
Merge pull request #110 from honjow/master
add openDocument
2 parents 11cb3cd + f10d922 commit 7b54ee5

3 files changed

Lines changed: 73 additions & 0 deletions

File tree

android/src/main/kotlin/io/alexrintt/sharedstorage/storageaccessframework/DocumentFileApi.kt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

android/src/main/kotlin/io/alexrintt/sharedstorage/storageaccessframework/lib/StorageAccessFrameworkConstant.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const val DOCUMENTS_CONTRACT_EXTRA_INITIAL_URI =
1919
/**
2020
* Available DocumentFile Method Channel APIs
2121
*/
22+
const val OPEN_DOCUMENT = "openDocument"
2223
const val OPEN_DOCUMENT_TREE = "openDocumentTree"
2324
const val PERSISTED_URI_PERMISSIONS = "persistedUriPermissions"
2425
const val RELEASE_PERSISTABLE_URI_PERMISSION = "releasePersistableUriPermission"
@@ -54,3 +55,4 @@ const val GET_DOCUMENT_CONTENT = "getDocumentContent"
5455
* Intent Request Codes
5556
*/
5657
const val OPEN_DOCUMENT_TREE_CODE = 10
58+
const val OPEN_DOCUMENT_CODE = 11

lib/src/saf/saf.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,26 @@ Future<Uri?> openDocumentTree({
3535
return selectedDirectoryUri?.apply((e) => Uri.parse(e));
3636
}
3737

38+
/// [Refer to details](https://developer.android.com/reference/android/content/Intent#ACTION_OPEN_DOCUMENT).
39+
Future<List<Uri>?> openDocument({
40+
Uri? initialUri,
41+
String mimeType = '*/*',
42+
bool multiple = false,
43+
}) async {
44+
const kOpenDocument = 'openDocument';
45+
46+
final args = <String, dynamic>{
47+
if (initialUri != null) 'initialUri': '$initialUri',
48+
'mimeType': mimeType,
49+
'multiple': multiple,
50+
};
51+
52+
final selectedUriList =
53+
await kDocumentFileChannel.invokeListMethod(kOpenDocument, args);
54+
55+
return selectedUriList?.apply((e) => e.map((e) => Uri.parse(e as String)).toList());
56+
}
57+
3858
/// {@template sharedstorage.saf.persistedUriPermissions}
3959
/// Returns an `List<Uri>` with all persisted [Uri]
4060
///

0 commit comments

Comments
 (0)