Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@ import android.os.Build
import android.provider.DocumentsContract
import android.util.Base64
import androidx.annotation.RequiresApi
import androidx.annotation.RestrictTo
import androidx.documentfile.provider.DocumentFile
import io.lakscastro.sharedstorage.plugin.API_19
import io.lakscastro.sharedstorage.plugin.API_21
import io.lakscastro.sharedstorage.plugin.API_24
import java.io.ByteArrayOutputStream
import java.io.Closeable
import java.io.File

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

val requiredColumns = if (rootOnly) emptyArray() else arrayOf(
DocumentsContract.Document.COLUMN_MIME_TYPE,
DocumentsContract.Document.COLUMN_DOCUMENT_ID
)
val requiredColumns =
if (rootOnly) emptyArray() else arrayOf(DocumentsContract.Document.COLUMN_MIME_TYPE)

val intrinsicColumns =
arrayOf(DocumentsContract.Document.COLUMN_DOCUMENT_ID)

val projection = arrayOf(*columns, *requiredColumns).toSet().toTypedArray()
val projection = arrayOf(
*columns,
*requiredColumns,
*intrinsicColumns
).toSet().toTypedArray()

val cursor = contentResolver.query(
children,
Expand All @@ -198,7 +201,7 @@ fun traverseDirectoryEntries(
while (cursor.moveToNext()) {
val data = mutableMapOf<String, Any>()

for (column in columns) {
for (column in projection) {
data[column] = cursorHandlerOf(typeOfColumn(column)!!)(
cursor,
cursor.getColumnIndexOrThrow(column)
Expand All @@ -220,7 +223,7 @@ fun traverseDirectoryEntries(
)
)

if (isDirectory != null && isDirectory && !rootOnly) {
if (isDirectory == true && !rootOnly) {
val nextChildren =
DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, id)

Expand Down
4 changes: 3 additions & 1 deletion docs/Usage/Storage Access Framework.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ if (grantedUri != null) {

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

> **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`).

```dart
/// *Must* be a granted uri from `openDocumentTree`
final Uri myGrantedUri = ...
Expand All @@ -83,7 +85,7 @@ const List<DocumentFileColumn> columns = <DocumentFileColumn>[
DocumentFileColumn.displayName,
DocumentFileColumn.size,
DocumentFileColumn.lastModified,
DocumentFileColumn.id,
DocumentFileColumn.id, // Optional column, will be available/queried regardless if is or not included here
DocumentFileColumn.mimeType,
];

Expand Down
1 change: 1 addition & 0 deletions example/lib/screens/folder_files/folder_file_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ class _FolderFileListState extends State<FolderFileList> {
DocumentFileColumn.displayName,
DocumentFileColumn.size,
DocumentFileColumn.lastModified,
// Optional column (this can't be removed because it's required to list files)
DocumentFileColumn.id,
DocumentFileColumn.mimeType,
];
Expand Down