From 8637a3e5d67bbf283601dff8e75287bb8908b56e Mon Sep 17 00:00:00 2001 From: vinceglb Date: Sun, 18 Jan 2026 01:40:20 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20tree=20URI=20detection=20o?= =?UTF-8?q?n=20API=2023?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vinceglb/filekit/PlatformFile.android.kt | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/filekit-core/src/androidMain/kotlin/io/github/vinceglb/filekit/PlatformFile.android.kt b/filekit-core/src/androidMain/kotlin/io/github/vinceglb/filekit/PlatformFile.android.kt index 4cccec1c..2fe374df 100644 --- a/filekit-core/src/androidMain/kotlin/io/github/vinceglb/filekit/PlatformFile.android.kt +++ b/filekit-core/src/androidMain/kotlin/io/github/vinceglb/filekit/PlatformFile.android.kt @@ -598,7 +598,7 @@ private fun getUriFileName(uri: Uri): String { } private fun Uri.toDocumentUriForMetadata(): Uri { - if (!DocumentsContract.isTreeUri(this)) return this + if (!isTreeUriCompat()) return this val documentId = try { DocumentsContract.getDocumentId(this) @@ -609,5 +609,29 @@ private fun Uri.toDocumentUriForMetadata(): Uri { return DocumentsContract.buildDocumentUriUsingTree(this, documentId) } -private fun getDocumentFile(uri: Uri): DocumentFile? = DocumentFile.fromSingleUri(FileKit.context, uri) - ?: DocumentFile.fromTreeUri(FileKit.context, uri) +private fun Uri.isTreeUriCompat(): Boolean { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + return DocumentsContract.isTreeUri(this) + } + + val segments = pathSegments ?: return false + return segments.isNotEmpty() && segments[0] == "tree" +} + +private fun getDocumentFile(uri: Uri): DocumentFile? { + val context = FileKit.context + return when { + DocumentsContract.isDocumentUri(context, uri) -> { + DocumentFile.fromSingleUri(context, uri) + } + + uri.isTreeUriCompat() -> { + DocumentFile.fromTreeUri(context, uri) + } + + else -> { + DocumentFile.fromSingleUri(context, uri) + ?: DocumentFile.fromTreeUri(context, uri) + } + } +}