From 77604918b1b08abfa9fc469918bde5ad27b18e4d Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 6 May 2026 16:03:19 +0200 Subject: [PATCH 1/3] fix(oc-search-task): data consistency Signed-off-by: alperozturk96 --- .../android/ui/adapter/OCFileListAdapter.java | 2 +- .../android/ui/adapter/OCFileListDelegate.kt | 23 ++++++++----- .../ui/fragment/OCFileListSearchTask.kt | 33 ++++++++++++++++++- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index a2c7616dda3c..ab79b5298b8f 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -495,7 +495,7 @@ public void bindRecommendedFilesHolder(OCFileListRecommendedItemViewHolder holde } private void bindHolder(@NonNull RecyclerView.ViewHolder holder, ListViewHolder viewHolder, OCFile file) { - ocFileListDelegate.bindViewHolder(viewHolder, file, currentDirectory, searchType, overlayManager); + ocFileListDelegate.bindViewHolder(viewHolder, file, currentDirectory, overlayManager); if (holder instanceof ListItemViewHolder itemViewHolder) { bindListItemViewHolder(itemViewHolder, file); 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 65bc90380aaf..c509f2881b36 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 @@ -32,7 +32,6 @@ import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.ui.activity.ComponentsGetter import com.owncloud.android.ui.activity.FolderPickerActivity import com.owncloud.android.ui.fragment.GalleryFragment -import com.owncloud.android.ui.fragment.SearchType import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.EncryptionUtils @@ -207,7 +206,6 @@ class OCFileListDelegate( viewHolder: ListViewHolder, file: OCFile, currentDirectory: OCFile?, - searchType: SearchType?, overlayManager: OverlayManager ) { // thumbnail @@ -243,13 +241,12 @@ class OCFileListDelegate( file.isEncrypted && !EncryptionUtils.supportsSecureFiledrop(file, user) ) || - (searchType == SearchType.FAVORITE_SEARCH) || ( file.isFolder && (currentDirectory?.isEncrypted ?: false) ) ) - ) // sharing an encrypted subfolder is not possible + ) if (shouldHideShare) { viewHolder.shared.visibility = View.GONE } else { @@ -405,18 +402,28 @@ class OCFileListDelegate( return null } - if (file.isOfflineOperation) return null + if (file.isOfflineOperation) { + return null + } - if (holder !is OCFileListItemViewHolder && file.unreadCommentsCount != 0) return null + if (holder !is OCFileListItemViewHolder && file.unreadCommentsCount != 0) { + return null + } return when { file.isSharedWithSharee || file.isSharedWithMe -> { - if (showShareAvatar) null else R.drawable.shared_via_users to R.string.shared_icon_shared + if (showShareAvatar) { + null + } else { + R.drawable.shared_via_users to R.string.shared_icon_shared + } } file.isSharedViaLink -> R.drawable.shared_via_link to R.string.shared_icon_shared_via_link - else -> R.drawable.ic_unshared to R.string.shared_icon_share + else -> { + R.drawable.ic_unshared to R.string.shared_icon_share + } } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt index 26a8943b311d..78fa5199956f 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt @@ -209,7 +209,14 @@ class OCFileListSearchTask( for (obj in data) { try { val remoteFile = obj as? RemoteFile ?: continue - var ocFile = FileStorageUtils.fillOCFile(remoteFile) + val newFile = FileStorageUtils.fillOCFile(remoteFile) + + val existingFile = storageManager.getFileByPath(newFile.remotePath) + if (existingFile != null) { + preserveLocalFieldsOverEmptyRemoteFile(newFile, existingFile) + } + + var ocFile = newFile FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, currentUser.accountName) ocFile = storageManager.saveFileWithParent(ocFile, activity) ocFile = handleEncryptionIfNeeded(ocFile, storageManager, activity) @@ -248,6 +255,30 @@ class OCFileListSearchTask( storageManager.saveVirtuals(contentValuesList) } + /** + * Needed to prevent overwriting the valid local fields. + */ + private fun preserveLocalFieldsOverEmptyRemoteFile(newFile: OCFile, existingFile: OCFile) { + if (newFile.sharees.isNullOrEmpty()) { + newFile.sharees = existingFile.sharees + } + if (!newFile.isSharedViaLink) { + newFile.isSharedViaLink = existingFile.isSharedViaLink + } + if (!newFile.isSharedWithSharee) { + newFile.isSharedWithSharee = existingFile.isSharedWithSharee + } + if (newFile.firstShareTimestamp == 0L) { + newFile.firstShareTimestamp = existingFile.firstShareTimestamp + } + if (newFile.tags.isNullOrEmpty()) { + newFile.tags = existingFile.tags + } + if (newFile.imageDimension == null) { + newFile.imageDimension = existingFile.imageDimension + } + } + @Suppress("DEPRECATION") private fun handleEncryptionIfNeeded( ocFile: OCFile, From 247e0e168d409ae4e55ef1331e76d07e86873ba4 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 6 May 2026 16:04:15 +0200 Subject: [PATCH 2/3] fix(oc-search-task): data consistency Signed-off-by: alperozturk96 --- .../android/ui/adapter/OCFileListAdapter.java | 2 +- .../android/ui/adapter/OCFileListDelegate.kt | 23 +++++++------------ 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index ab79b5298b8f..a2c7616dda3c 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -495,7 +495,7 @@ public void bindRecommendedFilesHolder(OCFileListRecommendedItemViewHolder holde } private void bindHolder(@NonNull RecyclerView.ViewHolder holder, ListViewHolder viewHolder, OCFile file) { - ocFileListDelegate.bindViewHolder(viewHolder, file, currentDirectory, overlayManager); + ocFileListDelegate.bindViewHolder(viewHolder, file, currentDirectory, searchType, overlayManager); if (holder instanceof ListItemViewHolder itemViewHolder) { bindListItemViewHolder(itemViewHolder, file); 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 c509f2881b36..65bc90380aaf 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 @@ -32,6 +32,7 @@ import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.ui.activity.ComponentsGetter import com.owncloud.android.ui.activity.FolderPickerActivity import com.owncloud.android.ui.fragment.GalleryFragment +import com.owncloud.android.ui.fragment.SearchType import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.EncryptionUtils @@ -206,6 +207,7 @@ class OCFileListDelegate( viewHolder: ListViewHolder, file: OCFile, currentDirectory: OCFile?, + searchType: SearchType?, overlayManager: OverlayManager ) { // thumbnail @@ -241,12 +243,13 @@ class OCFileListDelegate( file.isEncrypted && !EncryptionUtils.supportsSecureFiledrop(file, user) ) || + (searchType == SearchType.FAVORITE_SEARCH) || ( file.isFolder && (currentDirectory?.isEncrypted ?: false) ) ) - ) + ) // sharing an encrypted subfolder is not possible if (shouldHideShare) { viewHolder.shared.visibility = View.GONE } else { @@ -402,28 +405,18 @@ class OCFileListDelegate( return null } - if (file.isOfflineOperation) { - return null - } + if (file.isOfflineOperation) return null - if (holder !is OCFileListItemViewHolder && file.unreadCommentsCount != 0) { - return null - } + if (holder !is OCFileListItemViewHolder && file.unreadCommentsCount != 0) return null return when { file.isSharedWithSharee || file.isSharedWithMe -> { - if (showShareAvatar) { - null - } else { - R.drawable.shared_via_users to R.string.shared_icon_shared - } + if (showShareAvatar) null else R.drawable.shared_via_users to R.string.shared_icon_shared } file.isSharedViaLink -> R.drawable.shared_via_link to R.string.shared_icon_shared_via_link - else -> { - R.drawable.ic_unshared to R.string.shared_icon_share - } + else -> R.drawable.ic_unshared to R.string.shared_icon_share } } From 9f5ac7bedac0f96ee037be304096ddea47031663 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 8 May 2026 11:47:20 +0200 Subject: [PATCH 3/3] fetch result from search directly Signed-off-by: alperozturk96 --- .../android/ui/adapter/OCFileListDelegate.kt | 2 +- .../ui/asynctasks/GallerySearchTask.kt | 7 ++-- .../ui/fragment/OCFileListSearchTask.kt | 35 ++----------------- 3 files changed, 7 insertions(+), 37 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 65bc90380aaf..3f607b3e6b0b 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 @@ -414,7 +414,7 @@ class OCFileListDelegate( if (showShareAvatar) null else R.drawable.shared_via_users to R.string.shared_icon_shared } - file.isSharedViaLink -> R.drawable.shared_via_link to R.string.shared_icon_shared_via_link + file.isShared || file.isSharedViaLink -> R.drawable.shared_via_link to R.string.shared_icon_shared_via_link else -> R.drawable.ic_unshared to R.string.shared_icon_share } diff --git a/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt b/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt index d3d4a0660875..138bbf8c8814 100644 --- a/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt @@ -70,10 +70,11 @@ class GallerySearchTask( ocCapability: com.owncloud.android.lib.resources.status.OCCapability ): SearchRemoteOperation = SearchRemoteOperation("", SearchRemoteOperation.SearchType.GALLERY_SEARCH, false, ocCapability).apply { - setLimit(limit) - setEndDate(endDate) + limit = this@GallerySearchTask.limit + endDate = this@GallerySearchTask.endDate + // workaround to keep SearchRemoteOperation functioning correctly even if we don't actively use startDate - setStartDate(0L) + startDate = 0L } private fun logSearchStart() { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt index 78fa5199956f..d0e72abf2afa 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt @@ -208,15 +208,8 @@ class OCFileListSearchTask( for (obj in data) { try { - val remoteFile = obj as? RemoteFile ?: continue - val newFile = FileStorageUtils.fillOCFile(remoteFile) - - val existingFile = storageManager.getFileByPath(newFile.remotePath) - if (existingFile != null) { - preserveLocalFieldsOverEmptyRemoteFile(newFile, existingFile) - } - - var ocFile = newFile + val remoteFile = (obj as? RemoteFile) ?: continue + var ocFile = FileStorageUtils.fillOCFile(remoteFile) FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, currentUser.accountName) ocFile = storageManager.saveFileWithParent(ocFile, activity) ocFile = handleEncryptionIfNeeded(ocFile, storageManager, activity) @@ -255,30 +248,6 @@ class OCFileListSearchTask( storageManager.saveVirtuals(contentValuesList) } - /** - * Needed to prevent overwriting the valid local fields. - */ - private fun preserveLocalFieldsOverEmptyRemoteFile(newFile: OCFile, existingFile: OCFile) { - if (newFile.sharees.isNullOrEmpty()) { - newFile.sharees = existingFile.sharees - } - if (!newFile.isSharedViaLink) { - newFile.isSharedViaLink = existingFile.isSharedViaLink - } - if (!newFile.isSharedWithSharee) { - newFile.isSharedWithSharee = existingFile.isSharedWithSharee - } - if (newFile.firstShareTimestamp == 0L) { - newFile.firstShareTimestamp = existingFile.firstShareTimestamp - } - if (newFile.tags.isNullOrEmpty()) { - newFile.tags = existingFile.tags - } - if (newFile.imageDimension == null) { - newFile.imageDimension = existingFile.imageDimension - } - } - @Suppress("DEPRECATION") private fun handleEncryptionIfNeeded( ocFile: OCFile,