Skip to content

Commit 517defe

Browse files
author
lask
authored
Merge pull request #52 from lakscastro/bugfix/mark-column-id-as-intrinsic-for-queries
Make `COLUMN_DOCUMENT_ID` optional when using with `listFiles`
2 parents e168b00 + a3d426e commit 517defe

File tree

3 files changed

+16
-10
lines changed

3 files changed

+16
-10
lines changed

android/src/main/kotlin/io/lakscastro/sharedstorage/storageaccessframework/lib/DocumentCommon.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,12 @@ import android.os.Build
88
import android.provider.DocumentsContract
99
import android.util.Base64
1010
import androidx.annotation.RequiresApi
11-
import androidx.annotation.RestrictTo
1211
import androidx.documentfile.provider.DocumentFile
1312
import io.lakscastro.sharedstorage.plugin.API_19
1413
import io.lakscastro.sharedstorage.plugin.API_21
1514
import io.lakscastro.sharedstorage.plugin.API_24
1615
import java.io.ByteArrayOutputStream
1716
import java.io.Closeable
18-
import java.io.File
1917

2018
/**
2119
* Helper class to make more easy to handle callbacks using Kotlin syntax
@@ -174,12 +172,17 @@ fun traverseDirectoryEntries(
174172
while (dirNodes.isNotEmpty()) {
175173
val (parent, children) = dirNodes.removeAt(0)
176174

177-
val requiredColumns = if (rootOnly) emptyArray() else arrayOf(
178-
DocumentsContract.Document.COLUMN_MIME_TYPE,
179-
DocumentsContract.Document.COLUMN_DOCUMENT_ID
180-
)
175+
val requiredColumns =
176+
if (rootOnly) emptyArray() else arrayOf(DocumentsContract.Document.COLUMN_MIME_TYPE)
177+
178+
val intrinsicColumns =
179+
arrayOf(DocumentsContract.Document.COLUMN_DOCUMENT_ID)
181180

182-
val projection = arrayOf(*columns, *requiredColumns).toSet().toTypedArray()
181+
val projection = arrayOf(
182+
*columns,
183+
*requiredColumns,
184+
*intrinsicColumns
185+
).toSet().toTypedArray()
183186

184187
val cursor = contentResolver.query(
185188
children,
@@ -198,7 +201,7 @@ fun traverseDirectoryEntries(
198201
while (cursor.moveToNext()) {
199202
val data = mutableMapOf<String, Any>()
200203

201-
for (column in columns) {
204+
for (column in projection) {
202205
data[column] = cursorHandlerOf(typeOfColumn(column)!!)(
203206
cursor,
204207
cursor.getColumnIndexOrThrow(column)
@@ -220,7 +223,7 @@ fun traverseDirectoryEntries(
220223
)
221224
)
222225

223-
if (isDirectory != null && isDirectory && !rootOnly) {
226+
if (isDirectory == true && !rootOnly) {
224227
val nextChildren =
225228
DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, id)
226229

docs/Usage/Storage Access Framework.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ if (grantedUri != null) {
6868

6969
This method list files lazily **over a granted uri:**
7070

71+
> **Info** `DocumentFileColumn.id` is optional. It is required to fetch the file list from native API. So it is enabled regardless if you include this column or not. And this applies only to this API (`listFiles`).
72+
7173
```dart
7274
/// *Must* be a granted uri from `openDocumentTree`
7375
final Uri myGrantedUri = ...
@@ -83,7 +85,7 @@ const List<DocumentFileColumn> columns = <DocumentFileColumn>[
8385
DocumentFileColumn.displayName,
8486
DocumentFileColumn.size,
8587
DocumentFileColumn.lastModified,
86-
DocumentFileColumn.id,
88+
DocumentFileColumn.id, // Optional column, will be available/queried regardless if is or not included here
8789
DocumentFileColumn.mimeType,
8890
];
8991

example/lib/screens/folder_files/folder_file_list.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ class _FolderFileListState extends State<FolderFileList> {
159159
DocumentFileColumn.displayName,
160160
DocumentFileColumn.size,
161161
DocumentFileColumn.lastModified,
162+
// Optional column (this can't be removed because it's required to list files)
162163
DocumentFileColumn.id,
163164
DocumentFileColumn.mimeType,
164165
];

0 commit comments

Comments
 (0)