From c4eea09777fcd1620920c917dbe4f29213b214cc Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 18 Mar 2026 14:11:54 +0100 Subject: [PATCH 1/2] fix(oc-file-list): local file indicator edge cases Signed-off-by: alperozturk96 --- .../nextcloud/client/database/dao/FileDao.kt | 30 +++++++------------ .../utils/extensions/FileExtensions.kt | 2 +- .../android/ui/adapter/OCFileListDelegate.kt | 6 +++- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt b/app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt index a94b0c9c669c..7f15f5ec3252 100644 --- a/app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt +++ b/app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt @@ -91,27 +91,19 @@ interface FileDao { @Query( """ - SELECT - EXISTS ( - SELECT 1 - FROM filelist - WHERE parent = :parentId - AND file_owner = :accountName - AND content_type != '${MimeType.DIRECTORY}' - AND content_type != '${MimeType.WEBDAV_FOLDER}' - ) - AND NOT EXISTS ( - SELECT 1 - FROM filelist - WHERE parent = :parentId - AND file_owner = :accountName - AND content_type != '${MimeType.DIRECTORY}' - AND content_type != '${MimeType.WEBDAV_FOLDER}' - AND media_path IS NULL - ) + SELECT NOT EXISTS ( + SELECT 1 + FROM filelist + WHERE parent = :parentId + AND file_owner = :accountName + AND content_type IS NOT NULL + AND content_type != '${MimeType.DIRECTORY}' + AND content_type != '${MimeType.WEBDAV_FOLDER}' + AND (media_path IS NULL OR TRIM(media_path) = '') + ) """ ) - fun isFolderFullyDownloaded(parentId: Long, accountName: String): Boolean + fun areAllFilesHaveMediaPath(parentId: Long, accountName: String): Boolean @Query( """ diff --git a/app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt index a55345d79e2c..5bae77a44d61 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt @@ -38,7 +38,7 @@ fun Path.toLocalPath(): String = toAbsolutePath().toString() @Suppress("ReturnCount") fun String.toFile(): File? { if (isNullOrEmpty()) { - Log_OC.e(TAG, "given path is null or empty") + Log_OC.w(TAG, "given path is null or empty: $this") return null } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt index e61928757861..d8c11b792f53 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt @@ -345,7 +345,11 @@ class OCFileListDelegate( } private fun showLocalFileIndicator(file: OCFile, holder: ListViewHolder) { - val isFullyDownloaded = storageManager.fileDao.isFolderFullyDownloaded(file.fileId, user.accountName) + var isFullyDownloaded = false + if (file.isFolder && !file.isEncrypted && file.fileLength != 0L) { + isFullyDownloaded = storageManager.fileDao.areAllFilesHaveMediaPath(file.fileId, user.accountName) + } + val isSyncing = isSynchronizing(file) val hasConflict = (file.etagInConflict != null) val isDown = file.isDown From c13386da027254fc79862b60345384279e5b9aaf Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 18 Mar 2026 14:13:15 +0100 Subject: [PATCH 2/2] fix(oc-file-list): local file indicator edge cases Signed-off-by: alperozturk96 --- .../com/owncloud/android/ui/adapter/OCFileListDelegate.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt index d8c11b792f53..35c50edea2bb 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt @@ -345,9 +345,9 @@ class OCFileListDelegate( } private fun showLocalFileIndicator(file: OCFile, holder: ListViewHolder) { - var isFullyDownloaded = false + var isFolderDown = false if (file.isFolder && !file.isEncrypted && file.fileLength != 0L) { - isFullyDownloaded = storageManager.fileDao.areAllFilesHaveMediaPath(file.fileId, user.accountName) + isFolderDown = storageManager.fileDao.areAllFilesHaveMediaPath(file.fileId, user.accountName) } val isSyncing = isSynchronizing(file) @@ -357,7 +357,7 @@ class OCFileListDelegate( val icon = when { isSyncing -> R.drawable.ic_synchronizing hasConflict -> R.drawable.ic_synchronizing_error - isDown || isFullyDownloaded -> R.drawable.ic_synced + isDown || isFolderDown -> R.drawable.ic_synced else -> null }