From 21e0c82e65d579c13d882c5f538a6009d3844c74 Mon Sep 17 00:00:00 2001 From: Philipp Hasper Date: Sun, 14 Sep 2025 15:54:12 +0200 Subject: [PATCH 1/2] fix: deletion from slideshow works again The patch added in #14782 prevented that the callback onRemoteOperationFinish() was ever called. Secondly, the manual update of adapter and pager is only needed if user is not present. When user is present, the initViewPager() takes care of everything. Signed-off-by: Philipp Hasper --- .../android/ui/dialog/RemoveFilesDialogFragment.kt | 4 ---- .../android/ui/preview/PreviewImageActivity.kt | 10 +++++----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt index cde23d60fdfd..9c300b54083b 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt @@ -24,7 +24,6 @@ import com.owncloud.android.datamodel.OCFile import com.owncloud.android.ui.activity.FileActivity import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener -import com.owncloud.android.ui.preview.PreviewImageActivity import javax.inject.Inject /** @@ -125,14 +124,11 @@ class RemoveFilesDialogFragment : } finishActionMode() - finishPreviewImageActivity() } } override fun onNeutral(callerTag: String?) = Unit - private fun finishPreviewImageActivity() = getTypedActivity(PreviewImageActivity::class.java)?.finish() - private fun setActionMode(actionMode: ActionMode?) { this.actionMode = actionMode } diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt index 1d575dd32f5a..70aaaaae0afa 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt @@ -285,8 +285,6 @@ class PreviewImageActivity : super.onRemoteOperationFinish(operation, result) if (operation is RemoveFileOperation) { - val deletePosition = viewPager?.currentItem ?: return - val nextPosition = if (deletePosition > 0) deletePosition - 1 else 0 previewImagePagerAdapter?.let { if (it.itemCount <= 1) { @@ -297,10 +295,12 @@ class PreviewImageActivity : if (user.isPresent) { initViewPager(user.get()) + } else { + val deletePosition = viewPager?.currentItem ?: return + val nextPosition = if (deletePosition > 0) deletePosition - 1 else 0 + viewPager?.setCurrentItem(nextPosition, true) + previewImagePagerAdapter?.delete(deletePosition) } - - viewPager?.setCurrentItem(nextPosition, true) - previewImagePagerAdapter?.delete(deletePosition) } else if (operation is SynchronizeFileOperation) { onSynchronizeFileOperationFinish(result) } From 4453eaf5d344ca879c9468f4c233fb5827da7dfd Mon Sep 17 00:00:00 2001 From: Philipp Hasper Date: Sun, 21 Sep 2025 16:04:07 +0200 Subject: [PATCH 2/2] fix: deletion from slideshow for cases were user is not present In that case, deleting the currently viewed file had the following issues: 1. When deleting the first image, the UI just stayed with it. 2. When deleting another image, the UI switched to the previous image, instead of the next one, which is inconsistent to the behavior when user is available 3. When switching to the next image, the title shown at the top did not correctly update Signed-off-by: Philipp Hasper --- .../ui/preview/PreviewImageActivity.kt | 22 ++++++++++++------- .../ui/preview/PreviewImagePagerAdapter.kt | 7 ++++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt index 70aaaaae0afa..0ab320e7f09e 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt @@ -56,6 +56,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import java.io.Serializable import javax.inject.Inject import kotlin.math.max +import kotlin.math.min /** * Holds a swiping gallery where image files contained in an Nextcloud directory are shown. @@ -216,6 +217,17 @@ class PreviewImageActivity : } } + private fun updateViewPagerAfterDeletionAndAdvanceForward() { + val deletePosition = viewPager?.currentItem ?: return + previewImagePagerAdapter?.let { adapter -> + val nextPosition = min(deletePosition, adapter.itemCount - 1) + viewPager?.setCurrentItem(nextPosition, true) + adapter.delete(deletePosition) + // Page needs to be reselected after the adapter has been updated. Otherwise, wrong title is shown + selectPage(nextPosition) + } + } + private fun handleBackPress() { onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -285,7 +297,6 @@ class PreviewImageActivity : super.onRemoteOperationFinish(operation, result) if (operation is RemoveFileOperation) { - previewImagePagerAdapter?.let { if (it.itemCount <= 1) { backToDisplayActivity() @@ -293,13 +304,8 @@ class PreviewImageActivity : } } - if (user.isPresent) { - initViewPager(user.get()) - } else { - val deletePosition = viewPager?.currentItem ?: return - val nextPosition = if (deletePosition > 0) deletePosition - 1 else 0 - viewPager?.setCurrentItem(nextPosition, true) - previewImagePagerAdapter?.delete(deletePosition) + if (result.isSuccess) { + updateViewPagerAfterDeletionAndAdvanceForward() } } else if (operation is SynchronizeFileOperation) { onSynchronizeFileOperationFinish(result) diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.kt index 577f5c38c9d5..9f75a6972e05 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.kt @@ -205,4 +205,11 @@ class PreviewImagePagerAdapter : FragmentStateAdapter { override fun createFragment(position: Int): Fragment = getItem(position) override fun getItemCount(): Int = imageFiles.size + + override fun getItemId(position: Int): Long { + // The item ID function is needed to detect whether the deletion of the current item needs a UI update + return imageFiles.getOrNull(position)?.fileId ?: position.toLong() + } + + override fun containsItem(itemId: Long): Boolean = imageFiles.any { it.fileId == itemId } }