@@ -17,7 +17,6 @@ import kotlinx.coroutines.CoroutineScope
17
17
import kotlinx.coroutines.Dispatchers
18
18
import kotlinx.coroutines.launch
19
19
import java.io.BufferedReader
20
- import java.io.FileInputStream
21
20
import java.io.InputStreamReader
22
21
23
22
internal class DocumentFileApi (private val plugin : SharedStoragePlugin ) :
@@ -67,7 +66,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
67
66
if (Build .VERSION .SDK_INT >= API_21 ) {
68
67
result.success(
69
68
createDocumentFileMap(
70
- documentFromTreeUri (
69
+ documentFromUri (
71
70
plugin.context,
72
71
call.argument<String ?>(" uri" ) as String
73
72
)
@@ -77,7 +76,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
77
76
CAN_WRITE ->
78
77
if (Build .VERSION .SDK_INT >= API_21 ) {
79
78
result.success(
80
- documentFromTreeUri (
79
+ documentFromUri (
81
80
plugin.context,
82
81
call.argument<String ?>(" uri" ) as String
83
82
)?.canWrite()
@@ -86,7 +85,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
86
85
CAN_READ ->
87
86
if (Build .VERSION .SDK_INT >= API_21 ) {
88
87
result.success(
89
- documentFromTreeUri (
88
+ documentFromUri (
90
89
plugin.context,
91
90
call.argument<String ?>(" uri" ) as String
92
91
)?.canRead()
@@ -95,7 +94,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
95
94
LENGTH ->
96
95
if (Build .VERSION .SDK_INT >= API_21 ) {
97
96
result.success(
98
- documentFromTreeUri (
97
+ documentFromUri (
99
98
plugin.context,
100
99
call.argument<String ?>(" uri" ) as String
101
100
)?.length()
@@ -104,7 +103,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
104
103
EXISTS ->
105
104
if (Build .VERSION .SDK_INT >= API_21 ) {
106
105
result.success(
107
- documentFromTreeUri (
106
+ documentFromUri (
108
107
plugin.context,
109
108
call.argument<String ?>(" uri" ) as String
110
109
)?.exists()
@@ -113,7 +112,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
113
112
DELETE ->
114
113
if (Build .VERSION .SDK_INT >= API_21 ) {
115
114
result.success(
116
- documentFromTreeUri (
115
+ documentFromUri (
117
116
plugin.context,
118
117
call.argument<String ?>(" uri" ) as String
119
118
)?.delete()
@@ -122,7 +121,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
122
121
LAST_MODIFIED ->
123
122
if (Build .VERSION .SDK_INT >= API_21 ) {
124
123
result.success(
125
- documentFromTreeUri (
124
+ documentFromUri (
126
125
plugin.context,
127
126
call.argument<String ?>(" uri" ) as String
128
127
)?.lastModified()
@@ -135,7 +134,8 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
135
134
call.argument<String ?>(" displayName" ) as String
136
135
137
136
val createdDirectory =
138
- documentFromTreeUri(plugin.context, uri)?.createDirectory(displayName) ? : return
137
+ documentFromUri(plugin.context, uri)?.createDirectory(displayName)
138
+ ? : return
139
139
140
140
result.success(createDocumentFileMap(createdDirectory))
141
141
}
@@ -148,30 +148,39 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
148
148
149
149
result.success(
150
150
createDocumentFileMap(
151
- documentFromTreeUri (plugin.context, uri)?.findFile(displayName)
151
+ documentFromUri (plugin.context, uri)?.findFile(displayName)
152
152
)
153
153
)
154
154
}
155
155
}
156
156
COPY -> {
157
157
if (Build .VERSION .SDK_INT >= API_21 ) {
158
- val content = StringBuilder ()
159
- val destinationTree = call.argument<String >(" destination" )!!
160
- val document = documentFromTreeUri(
161
- plugin.context,
162
- Uri .parse(call.argument<String >(" uri" )!! )
163
- ) ? : return
164
-
165
- readDocumentContent(document.uri) {
166
- onSuccess = { content.append(this ) }
167
- onEnd = {
168
- createFile(
169
- result,
170
- document.type!! ,
171
- document.name!! ,
172
- destinationTree,
173
- " $content " .toByteArray()
174
- )
158
+ val destination = Uri .parse(call.argument<String >(" destination" )!! )
159
+ val uri = Uri .parse(call.argument<String >(" uri" )!! )
160
+
161
+ if (Build .VERSION .SDK_INT >= API_24 ) {
162
+ DocumentsContract .copyDocument(
163
+ plugin.context.contentResolver,
164
+ uri,
165
+ destination
166
+ )
167
+ } else {
168
+ val content = StringBuilder ()
169
+
170
+ readDocumentContent(uri) {
171
+ onEnd = {
172
+ val uriDocument = documentFromUri(plugin.context, uri)!!
173
+
174
+ createFile(
175
+ destination,
176
+ uriDocument.type!! ,
177
+ uriDocument.name!! ,
178
+ content.toString().toByteArray()
179
+ ) {
180
+ result.success(createDocumentFileMap(this ))
181
+ }
182
+ }
183
+ onSuccess = { content.append(this ) }
175
184
}
176
185
}
177
186
}
@@ -182,13 +191,13 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
182
191
val displayName =
183
192
call.argument<String ?>(" displayName" ) as String
184
193
185
- documentFromTreeUri (plugin.context, uri)?.apply {
194
+ documentFromUri (plugin.context, uri)?.apply {
186
195
val success = renameTo(displayName)
187
196
188
197
result.success(
189
198
if (success)
190
199
createDocumentFileMap(
191
- documentFromTreeUri (plugin.context, this .uri)!!
200
+ documentFromUri (plugin.context, this .uri)!!
192
201
)
193
202
else null
194
203
)
@@ -198,7 +207,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
198
207
PARENT_FILE -> {
199
208
if (Build .VERSION .SDK_INT >= API_21 ) {
200
209
val uri = call.argument<String >(" uri" )!!
201
- val parent = documentFromTreeUri (plugin.context, uri)?.parentFile
210
+ val parent = documentFromUri (plugin.context, uri)?.parentFile
202
211
203
212
result.success(if (parent != null ) createDocumentFileMap(parent) else null )
204
213
}
@@ -241,29 +250,39 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
241
250
directory : String ,
242
251
content : ByteArray
243
252
) {
244
- val documentFile =
245
- documentFromTreeUri(plugin.context, directory)
246
- ? : return result.error(
247
- EXCEPTION_PARENT_DOCUMENT_MUST_BE_DIRECTORY ,
248
- " You can't create a file inside another file! You can call `createFile` method only on directory documents" ,
249
- mapOf (
250
- " invalidParentDirectory" to directory,
251
- " displayName" to displayName,
252
- " mimeType" to mimeType
253
- )
254
- )
253
+ createFile(
254
+ Uri .parse(directory),
255
+ mimeType,
256
+ displayName,
257
+ content
258
+ ) {
259
+ result.success(createDocumentFileMap(this ))
260
+ }
261
+ }
255
262
256
- val createdFile = documentFile.createFile(mimeType, displayName)
263
+ @RequiresApi(Build .VERSION_CODES .LOLLIPOP )
264
+ private fun createFile (
265
+ treeUri : Uri ,
266
+ mimeType : String ,
267
+ displayName : String ,
268
+ content : ByteArray ,
269
+ block : DocumentFile ?.() -> Unit
270
+ ) {
271
+
272
+ val createdFile = documentFromUri(plugin.context, treeUri)!! .createFile(
273
+ mimeType,
274
+ displayName
275
+ )
257
276
258
277
createdFile?.uri?.apply {
259
278
plugin.context.contentResolver.openOutputStream(this )?.apply {
260
279
write(content)
261
280
flush()
262
281
263
282
val createdFileDocument =
264
- documentFromTreeUri (plugin.context, createdFile.uri)
283
+ documentFromUri (plugin.context, createdFile.uri)
265
284
266
- result.success(createDocumentFileMap( createdFileDocument) )
285
+ block( createdFileDocument)
267
286
}
268
287
}
269
288
}
@@ -374,7 +393,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
374
393
if (eventSink == null ) return
375
394
376
395
val document = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .N ) {
377
- documentFromTreeUri (plugin.context, args[" uri" ] as String ) ? : return
396
+ documentFromUri (plugin.context, args[" uri" ] as String ) ? : return
378
397
} else {
379
398
null
380
399
}
@@ -443,11 +462,7 @@ internal class DocumentFileApi(private val plugin: SharedStoragePlugin) :
443
462
) {
444
463
val callbacks = CallbackHandler <String >().apply { handler(this ) }
445
464
446
- val document = documentFromTreeUri(plugin.context, uri)!!
447
-
448
- val file = document?.createFile(" text/plain" , " File created by Shared Storage Sample App" ) ? : return
449
-
450
- plugin.context.contentResolver.openInputStream(file.uri)
465
+ plugin.context.contentResolver.openInputStream(uri)
451
466
?.use { inputStream ->
452
467
BufferedReader (InputStreamReader (inputStream)).use { reader ->
453
468
var line = reader.readLine()
0 commit comments