Skip to content

Commit 8241e6f

Browse files
Merge pull request #15996 from nextcloud/perf/gallery-adapter-full-refresh-after-delete
fix(gallery): prevent multiple onRefresh calls during multi-image delete to avoid flicker
2 parents 9333fee + 9676f0f commit 8241e6f

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ import com.owncloud.android.ui.asynctasks.CheckAvailableSpaceTask
117117
import com.owncloud.android.ui.asynctasks.CheckAvailableSpaceTask.CheckAvailableSpaceListener
118118
import com.owncloud.android.ui.asynctasks.FetchRemoteFileTask
119119
import com.owncloud.android.ui.asynctasks.GetRemoteFileTask
120+
import com.owncloud.android.ui.dialog.DeleteBatchTracker
120121
import com.owncloud.android.ui.dialog.SendShareDialog
121122
import com.owncloud.android.ui.dialog.SendShareDialog.SendShareDialogDownloader
122123
import com.owncloud.android.ui.dialog.SortingOrderDialogFragment.OnSortingOrderListener
@@ -2083,13 +2084,22 @@ class FileDisplayActivity :
20832084
}
20842085
}
20852086

2087+
val deleteBatchTracker = DeleteBatchTracker(onAllDeletesFinished = {
2088+
if (leftFragment is GalleryFragment) {
2089+
val galleryFragment = leftFragment as GalleryFragment
2090+
galleryFragment.onRefresh()
2091+
}
2092+
})
2093+
20862094
/**
20872095
* Updates the view associated to the activity after the finish of an operation trying to remove a file.
20882096
*
20892097
* @param operation Removal operation performed.
20902098
* @param result Result of the removal.
20912099
*/
20922100
private fun onRemoveFileOperationFinish(operation: RemoveFileOperation, result: RemoteOperationResult<*>) {
2101+
deleteBatchTracker.onSingleDeleteFinished()
2102+
20932103
if (!operation.isInBackground) {
20942104
DisplayUtils.showSnackMessage(
20952105
this,
@@ -2111,9 +2121,6 @@ class FileDisplayActivity :
21112121
val parentFile = storageManager.getFileById(removedFile.parentId)
21122122
if (parentFile != null && parentFile == getCurrentDir()) {
21132123
updateListOfFilesFragment(false)
2114-
} else if (this.leftFragment is GalleryFragment) {
2115-
val galleryFragment = leftFragment as GalleryFragment
2116-
galleryFragment.onRefresh()
21172124
} else if (leftFragment is OCFileListFragment &&
21182125
SearchRemoteOperation.SearchType.FAVORITE_SEARCH == leftFragment.searchEvent?.searchType
21192126
) {
@@ -2127,7 +2134,6 @@ class FileDisplayActivity :
21272134
}
21282135
}
21292136
supportInvalidateOptionsMenu()
2130-
refreshGalleryFragmentIfNeeded()
21312137
fetchRecommendedFilesIfNeeded(ignoreETag = true, currentDir)
21322138
} else {
21332139
if (result.isSslRecoverableException) {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2025 Alper Ozturk <[email protected]>
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
package com.owncloud.android.ui.dialog
9+
10+
class DeleteBatchTracker(private val onAllDeletesFinished: () -> Unit) {
11+
private var expectedDeletes: Int = -1
12+
private var completedDeletes: Int = 0
13+
14+
fun startBatchDelete(fileCount: Int) {
15+
expectedDeletes = fileCount
16+
completedDeletes = 0
17+
}
18+
19+
fun onSingleDeleteFinished() {
20+
if (expectedDeletes < 0) return // batch not active
21+
22+
completedDeletes++
23+
24+
if (completedDeletes == expectedDeletes) {
25+
// Reset so it can handle the next batch
26+
expectedDeletes = -1
27+
completedDeletes = 0
28+
29+
onAllDeletesFinished()
30+
}
31+
}
32+
}

app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ class RemoveFilesDialogFragment :
100100
if (result) {
101101
fileActivity.showLoadingDialog(fileActivity.getString(R.string.wait_a_moment))
102102

103+
fda?.deleteBatchTracker?.startBatchDelete(files.size)
104+
103105
if (files.isNotEmpty()) {
104106
// Display the snackbar message only when a single file is deleted.
105107
val inBackground = (files.size != 1)

0 commit comments

Comments
 (0)