diff --git a/android/src/main/kotlin/io/alexrintt/sharedstorage/deprecated/DocumentFileApi.kt b/android/src/main/kotlin/io/alexrintt/sharedstorage/deprecated/DocumentFileApi.kt index fd17f6f..8aa96dd 100644 --- a/android/src/main/kotlin/io/alexrintt/sharedstorage/deprecated/DocumentFileApi.kt +++ b/android/src/main/kotlin/io/alexrintt/sharedstorage/deprecated/DocumentFileApi.kt @@ -38,258 +38,262 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) : private var channel: MethodChannel? = null private var eventChannel: EventChannel? = null private var eventSink: EventChannel.EventSink? = null - + companion object { private const val CHANNEL = "documentfile" } - + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { - when (call.method) { - GET_DOCUMENT_CONTENT -> { - val uri = Uri.parse(call.argument("uri")!!) + CoroutineScope(Dispatchers.IO).launch { + when (call.method) { + GET_DOCUMENT_CONTENT -> { + val uri = Uri.parse(call.argument("uri")!!) - if (Build.VERSION.SDK_INT >= API_21) { - CoroutineScope(Dispatchers.IO).launch { - val content = readDocumentContent(uri) + if (Build.VERSION.SDK_INT >= API_21) { + CoroutineScope(Dispatchers.IO).launch { + val content = readDocumentContent(uri) - launch(Dispatchers.Main) { result.success(content) } + launch(Dispatchers.Main) { result.success(content) } + } + } else { + result.notSupported(call.method, API_21) } - } else { - result.notSupported(call.method, API_21) - } - } - OPEN_DOCUMENT -> - if (Build.VERSION.SDK_INT >= API_21) { - openDocument(call, result) } - OPEN_DOCUMENT_TREE -> - if (Build.VERSION.SDK_INT >= API_21) { - openDocumentTree(call, result) - } - CREATE_FILE -> - if (Build.VERSION.SDK_INT >= API_21) { - createFile( + OPEN_DOCUMENT -> + if (Build.VERSION.SDK_INT >= API_21) { + openDocument(call, result) + } + OPEN_DOCUMENT_TREE -> + if (Build.VERSION.SDK_INT >= API_21) { + openDocumentTree(call, result) + } + CREATE_FILE -> + if (Build.VERSION.SDK_INT >= API_21) { + createFile( + result, + call.argument("mimeType")!!, + call.argument("displayName")!!, + call.argument("directoryUri")!!, + call.argument("content")!! + ) + } + WRITE_TO_FILE -> + writeToFile( result, - call.argument("mimeType")!!, - call.argument("displayName")!!, - call.argument("directoryUri")!!, - call.argument("content")!! + call.argument("uri")!!, + call.argument("content")!!, + call.argument("mode")!! ) - } - WRITE_TO_FILE -> - writeToFile( - result, - call.argument("uri")!!, - call.argument("content")!!, - call.argument("mode")!! - ) - PERSISTED_URI_PERMISSIONS -> - persistedUriPermissions(result) - RELEASE_PERSISTABLE_URI_PERMISSION -> - releasePersistableUriPermission( - result, - call.argument("uri") as String - ) - FROM_TREE_URI -> - if (Build.VERSION.SDK_INT >= API_21) { - result.success( - createDocumentFileMap( + PERSISTED_URI_PERMISSIONS -> + persistedUriPermissions(result) + RELEASE_PERSISTABLE_URI_PERMISSION -> + releasePersistableUriPermission( + result, + call.argument("uri") as String + ) + FROM_TREE_URI -> + if (Build.VERSION.SDK_INT >= API_21) { + result.success( + createDocumentFileMap( + documentFromUri( + plugin.context, + call.argument("uri") as String + ) + ) + ) + } + CAN_WRITE -> + if (Build.VERSION.SDK_INT >= API_21) { + result.success( documentFromUri( plugin.context, call.argument("uri") as String - ) + )?.canWrite() ) - ) - } - CAN_WRITE -> - if (Build.VERSION.SDK_INT >= API_21) { - result.success( - documentFromUri( - plugin.context, - call.argument("uri") as String - )?.canWrite() - ) - } - CAN_READ -> - if (Build.VERSION.SDK_INT >= API_21) { - val uri = call.argument("uri") as String + } + CAN_READ -> + if (Build.VERSION.SDK_INT >= API_21) { + val uri = call.argument("uri") as String - result.success(documentFromUri(plugin.context, uri)?.canRead()) - } - LENGTH -> - if (Build.VERSION.SDK_INT >= API_21) { - result.success( - documentFromUri( - plugin.context, - call.argument("uri") as String - )?.length() - ) - } - EXISTS -> - if (Build.VERSION.SDK_INT >= API_21) { - result.success( - documentFromUri( - plugin.context, - call.argument("uri") as String - )?.exists() - ) - } - DELETE -> - if (Build.VERSION.SDK_INT >= API_21) { - try { + result.success(documentFromUri(plugin.context, uri)?.canRead()) + } + LENGTH -> + if (Build.VERSION.SDK_INT >= API_21) { result.success( documentFromUri( plugin.context, call.argument("uri") as String - )?.delete() + )?.length() ) - } catch (e: FileNotFoundException) { - // File is already deleted. - result.success(null) - } catch (e: IllegalStateException) { - // File is already deleted. - result.success(null) - } catch (e: IllegalArgumentException) { - // File is already deleted. - result.success(null) - } catch (e: IOException) { - // Unknown, can be anything. - result.success(null) - } catch (e: Throwable) { - Log.d( - "sharedstorage", - "Unknown error when calling [delete] method with [uri]." - ) - // Unknown, can be anything. - result.success(null) } - } - LAST_MODIFIED -> - if (Build.VERSION.SDK_INT >= API_21) { - val document = documentFromUri( - plugin.context, - call.argument("uri") as String - ) - - result.success(document?.lastModified()) - } - CREATE_DIRECTORY -> { - if (Build.VERSION.SDK_INT >= API_21) { - val uri = call.argument("uri") as String - val displayName = call.argument("displayName") as String - - val createdDirectory = - documentFromUri(plugin.context, uri)?.createDirectory(displayName) - ?: return - - result.success(createDocumentFileMap(createdDirectory)) - } else { - result.notSupported(call.method, API_21) - } - } - FIND_FILE -> { - if (Build.VERSION.SDK_INT >= API_21) { - val uri = call.argument("uri") as String - val displayName = call.argument("displayName") as String - - result.success( - createDocumentFileMap( + EXISTS -> + if (Build.VERSION.SDK_INT >= API_21) { + result.success( documentFromUri( plugin.context, - uri - )?.findFile(displayName) + call.argument("uri") as String + )?.exists() ) - ) - } - } - COPY -> { - val uri = Uri.parse(call.argument("uri")!!) - val destination = Uri.parse(call.argument("destination")!!) - - if (Build.VERSION.SDK_INT >= API_21) { - val isContentUri: Boolean = - uri.scheme == "content" && destination.scheme == "content" - - CoroutineScope(Dispatchers.IO).launch { - if (Build.VERSION.SDK_INT >= API_24 && isContentUri) { - DocumentsContract.copyDocument( - plugin.context.contentResolver, - uri, - destination + } + DELETE -> + if (Build.VERSION.SDK_INT >= API_21) { + try { + result.success( + documentFromUri( + plugin.context, + call.argument("uri") as String + )?.delete() ) - } else { - val inputStream = openInputStream(uri) - val outputStream = openOutputStream(destination) - - outputStream?.let { inputStream?.copyTo(it) } + } catch (e: FileNotFoundException) { + // File is already deleted. + result.success(null) + } catch (e: IllegalStateException) { + // File is already deleted. + result.success(null) + } catch (e: IllegalArgumentException) { + // File is already deleted. + result.success(null) + } catch (e: IOException) { + // Unknown, can be anything. + result.success(null) + } catch (e: Throwable) { + Log.d( + "sharedstorage", + "Unknown error when calling [delete] method with [uri]." + ) + // Unknown, can be anything. + result.success(null) } + } + LAST_MODIFIED -> + if (Build.VERSION.SDK_INT >= API_21) { + val document = documentFromUri( + plugin.context, + call.argument("uri") as String + ) - launch(Dispatchers.Main) { - result.success(null) + result.success(document?.lastModified()) + } + CREATE_DIRECTORY -> { + if (Build.VERSION.SDK_INT >= API_21) { + val uri = call.argument("uri") as String + val displayName = call.argument("displayName") as String + + val createdDirectory = + documentFromUri(plugin.context, uri)?.createDirectory(displayName) + if (createdDirectory == null) { + result.notSupported(call.method, API_21) + } else { + result.success(createDocumentFileMap(createdDirectory)) } + } else { + result.notSupported(call.method, API_21) } - } else { - result.notSupported( - RENAME_TO, - API_21, - mapOf("uri" to "$uri", "destination" to "$destination") - ) } - } - RENAME_TO -> { - val uri = call.argument("uri") as String - val displayName = call.argument("displayName") as String - - if (Build.VERSION.SDK_INT >= API_21) { - documentFromUri(plugin.context, uri)?.apply { - val success = renameTo(displayName) + FIND_FILE -> { + if (Build.VERSION.SDK_INT >= API_21) { + val uri = call.argument("uri") as String + val displayName = call.argument("displayName") as String result.success( - if (success) createDocumentFileMap( + createDocumentFileMap( documentFromUri( plugin.context, - this.uri - )!! + uri + )?.findFile(displayName) ) - else null ) } - } else { - result.notSupported( - RENAME_TO, - API_21, - mapOf("uri" to uri, "displayName" to displayName) - ) } - } - PARENT_FILE -> { - val uri = call.argument("uri")!! + COPY -> { + val uri = Uri.parse(call.argument("uri")!!) + val destination = Uri.parse(call.argument("destination")!!) + + if (Build.VERSION.SDK_INT >= API_21) { + val isContentUri: Boolean = + uri.scheme == "content" && destination.scheme == "content" + + CoroutineScope(Dispatchers.IO).launch { + if (Build.VERSION.SDK_INT >= API_24 && isContentUri) { + DocumentsContract.copyDocument( + plugin.context.contentResolver, + uri, + destination + ) + } else { + val inputStream = openInputStream(uri) + val outputStream = openOutputStream(destination) - if (Build.VERSION.SDK_INT >= API_21) { - val parent = documentFromUri(plugin.context, uri)?.parentFile + outputStream?.let { inputStream?.copyTo(it) } + } - result.success(if (parent != null) createDocumentFileMap(parent) else null) - } else { - result.notSupported(PARENT_FILE, API_21, mapOf("uri" to uri)) + launch(Dispatchers.Main) { + result.success(null) + } + } + } else { + result.notSupported( + RENAME_TO, + API_21, + mapOf("uri" to "$uri", "destination" to "$destination") + ) + } } - } - CHILD -> { - val uri = call.argument("uri")!! - val path = call.argument("path")!! - val requiresWriteAccess = - call.argument("requiresWriteAccess") ?: false - - if (Build.VERSION.SDK_INT >= API_21) { - val document = documentFromUri(plugin.context, uri) - val childDocument = - document?.child(plugin.context, path, requiresWriteAccess) - - result.success(createDocumentFileMap(childDocument)) - } else { - result.notSupported(CHILD, API_21, mapOf("uri" to uri)) + RENAME_TO -> { + val uri = call.argument("uri") as String + val displayName = call.argument("displayName") as String + + if (Build.VERSION.SDK_INT >= API_21) { + documentFromUri(plugin.context, uri)?.apply { + val success = renameTo(displayName) + + result.success( + if (success) createDocumentFileMap( + documentFromUri( + plugin.context, + this.uri + )!! + ) + else null + ) + } + } else { + result.notSupported( + RENAME_TO, + API_21, + mapOf("uri" to uri, "displayName" to displayName) + ) + } + } + PARENT_FILE -> { + val uri = call.argument("uri")!! + + if (Build.VERSION.SDK_INT >= API_21) { + val parent = documentFromUri(plugin.context, uri)?.parentFile + + result.success(if (parent != null) createDocumentFileMap(parent) else null) + } else { + result.notSupported(PARENT_FILE, API_21, mapOf("uri" to uri)) + } + } + CHILD -> { + val uri = call.argument("uri")!! + val path = call.argument("path")!! + val requiresWriteAccess = + call.argument("requiresWriteAccess") ?: false + + if (Build.VERSION.SDK_INT >= API_21) { + val document = documentFromUri(plugin.context, uri) + val childDocument = + document?.child(plugin.context, path, requiresWriteAccess) + + result.success(createDocumentFileMap(childDocument)) + } else { + result.notSupported(CHILD, API_21, mapOf("uri" to uri)) + } } + else -> result.notImplemented() } - else -> result.notImplemented() } }