From 7eac3e66cc8835742b0db4504881d02698535b55 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 30 Jul 2024 14:43:43 +0200 Subject: [PATCH 1/6] Fix Signed-off-by: alperozturk --- .../jobs/download/FileDownloadWorker.kt | 2 +- .../client/jobs/upload/FileUploadWorker.kt | 2 +- .../java/com/nextcloud/model/WorkerState.kt | 7 +- .../ui/preview/PreviewImageActivity.kt | 94 ++++++++++++------- .../model/PreviewImageActivityState.kt | 12 +++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 81 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/owncloud/android/ui/preview/model/PreviewImageActivityState.kt diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadWorker.kt index 089a094c6dff..1e9a264fb300 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadWorker.kt @@ -159,7 +159,7 @@ class FileDownloadWorker( } private fun setIdleWorkerState() { - WorkerStateLiveData.instance().setWorkState(WorkerState.Idle) + WorkerStateLiveData.instance().setWorkState(WorkerState.Idle(getCurrentFile())) } private fun removePendingDownload(accountName: String?) { diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt index fb4fe4b7e0b8..ccafb20f50bb 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt @@ -124,7 +124,7 @@ class FileUploadWorker( } private fun setIdleWorkerState() { - WorkerStateLiveData.instance().setWorkState(WorkerState.Idle) + WorkerStateLiveData.instance().setWorkState(WorkerState.Idle(currentUploadFileOperation?.file)) } @Suppress("ReturnCount") diff --git a/app/src/main/java/com/nextcloud/model/WorkerState.kt b/app/src/main/java/com/nextcloud/model/WorkerState.kt index ebca644172a7..998f601f3f94 100644 --- a/app/src/main/java/com/nextcloud/model/WorkerState.kt +++ b/app/src/main/java/com/nextcloud/model/WorkerState.kt @@ -8,11 +8,12 @@ package com.nextcloud.model import com.nextcloud.client.account.User +import com.owncloud.android.datamodel.OCFile import com.owncloud.android.db.OCUpload import com.owncloud.android.operations.DownloadFileOperation sealed class WorkerState { - object Idle : WorkerState() - class Download(var user: User?, var currentDownload: DownloadFileOperation?) : WorkerState() - class Upload(var user: User?, var uploads: List) : WorkerState() + data class Idle(var currentFile: OCFile?) : WorkerState() + data class Download(var user: User?, var currentDownload: DownloadFileOperation?) : WorkerState() + data class Upload(var user: User?, var uploads: List) : WorkerState() } 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 e53551921382..5671b84ad12f 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 @@ -1,15 +1,8 @@ /* * Nextcloud - Android Client * - * SPDX-FileCopyrightText: 2020-2024 Andy Scherzinger - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2022 Álvaro Brey - * SPDX-FileCopyrightText: 2019 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2016 ownCloud Inc. - * SPDX-FileCopyrightText: 2015 María Asensio Valverde - * SPDX-FileCopyrightText: 2013 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only) + * SPDX-FileCopyrightText: 2024 Your Name + * SPDX-License-Identifier: AGPL-3.0-or-later */ package com.owncloud.android.ui.preview @@ -56,6 +49,7 @@ import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.ui.fragment.GalleryFragment import com.owncloud.android.ui.fragment.OCFileListFragment +import com.owncloud.android.ui.preview.model.PreviewImageActivityState import com.owncloud.android.utils.MimeTypeUtil import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import java.io.Serializable @@ -65,16 +59,18 @@ import kotlin.math.max /** * Holds a swiping gallery where image files contained in an Nextcloud directory are shown. */ +@Suppress("TooManyFunctions") class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnRemoteOperationListener, Injectable { private var livePhotoFile: OCFile? = null private var viewPager: ViewPager2? = null private var previewImagePagerAdapter: PreviewImagePagerAdapter? = null private var savedPosition = 0 private var hasSavedPosition = false - private var requestWaitingForBinder = false private var downloadFinishReceiver: DownloadFinishReceiver? = null private var fullScreenAnchorView: View? = null + private var isDownloadWorkStarted = false + private var screenState = PreviewImageActivityState.Idle @Inject lateinit var preferences: AppPreferences @@ -115,7 +111,10 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR // to keep our UI controls visibility in line with system bars visibility setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) - requestWaitingForBinder = savedInstanceState?.getBoolean(KEY_WAITING_FOR_BINDER) ?: false + val requestWaitingForBinder = savedInstanceState?.getBoolean(KEY_WAITING_FOR_BINDER) ?: false + if (requestWaitingForBinder) { + screenState = PreviewImageActivityState.WaitingForBinder + } observeWorkerState() } @@ -181,7 +180,7 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR if (position == 0 && !file.isDown) { // this is necessary because mViewPager.setCurrentItem(0) just after setting the // adapter does not result in a call to #onPageSelected(0) - requestWaitingForBinder = true + screenState = PreviewImageActivityState.WaitingForBinder } } @@ -241,7 +240,7 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putBoolean(KEY_WAITING_FOR_BINDER, requestWaitingForBinder) + outState.putBoolean(KEY_WAITING_FOR_BINDER, screenState == PreviewImageActivityState.WaitingForBinder) outState.putBoolean(KEY_SYSTEM_VISIBLE, isSystemUIVisible) } @@ -274,26 +273,50 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR private fun observeWorkerState() { WorkerStateLiveData.instance().observe(this) { state: WorkerState? -> - if (state is WorkerState.Download) { - Log_OC.d(TAG, "Download worker started") - isDownloadWorkStarted = true - - if (requestWaitingForBinder) { - requestWaitingForBinder = false - Log_OC.d( - TAG, - "Simulating reselection of current page after connection " + - "of download binder" - ) - selectPage(viewPager?.currentItem) + when(state) { + is WorkerState.Download -> { + Log_OC.d(TAG, "Download worker started") + isDownloadWorkStarted = true + + if (screenState == PreviewImageActivityState.WaitingForBinder) { + selectPageOnDownload() + } + } + + is WorkerState.Idle -> { + Log_OC.d(TAG, "Download worker stopped") + isDownloadWorkStarted = false + + if (screenState == PreviewImageActivityState.Edit) { + onImageDownloadComplete(state.currentFile) + } + } + + else -> { + Log_OC.d(TAG, "Download worker stopped") + isDownloadWorkStarted = false } - } else { - Log_OC.d(TAG, "Download worker stopped") - isDownloadWorkStarted = false } } } + private fun selectPageOnDownload() { + screenState = PreviewImageActivityState.Idle + Log_OC.d( + TAG, + "Simulating reselection of current page after connection " + + "of download binder" + ) + selectPage(viewPager?.currentItem) + } + + private fun onImageDownloadComplete(downloadedFile: OCFile?) { + dismissLoadingDialog() + screenState = PreviewImageActivityState.Idle + file = downloadedFile + startEditImageActivity() + } + override fun onResume() { super.onResume() @@ -356,7 +379,7 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR val currentFile = previewImagePagerAdapter?.getFileAt(position) if (!isDownloadWorkStarted) { - requestWaitingForBinder = true + screenState = PreviewImageActivityState.WaitingForBinder } else { if (currentFile != null) { if (currentFile.isEncrypted && !currentFile.isDown && @@ -457,14 +480,21 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR fun startImageEditor(file: OCFile) { if (file.isDown) { - val editImageIntent = Intent(this, EditImageActivity::class.java) - editImageIntent.putExtra(EditImageActivity.EXTRA_FILE, file) - startActivity(editImageIntent) + startEditImageActivity() } else { + showLoadingDialog(getString(R.string.preview_image_downloading_image_for_edit)) + screenState = PreviewImageActivityState.Edit requestForDownload(file, EditImageActivity.OPEN_IMAGE_EDITOR) } } + private fun startEditImageActivity() { + val intent = Intent(this, EditImageActivity::class.java).apply { + putExtra(EditImageActivity.EXTRA_FILE, file) + } + startActivity(intent) + } + override fun onBrowsedDownTo(folder: OCFile) { // TODO Auto-generated method stub } diff --git a/app/src/main/java/com/owncloud/android/ui/preview/model/PreviewImageActivityState.kt b/app/src/main/java/com/owncloud/android/ui/preview/model/PreviewImageActivityState.kt new file mode 100644 index 000000000000..6db7e83e6893 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/preview/model/PreviewImageActivityState.kt @@ -0,0 +1,12 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.owncloud.android.ui.preview.model + +enum class PreviewImageActivityState { + WaitingForBinder, Edit, Idle +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d601172bff58..5781babe236e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -419,6 +419,7 @@ File is currently locked by another user or process and therefore not deletable. Please try again later. Sorry + Downloading image to start the edit screen, please wait… Image preview Unable to show image There is no local file to preview From 7dfc56c7e217a3b7ce36da4d1538b0c41af2e055 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 30 Jul 2024 14:45:01 +0200 Subject: [PATCH 2/6] Fix code analytics Signed-off-by: alperozturk --- .../com/owncloud/android/ui/preview/PreviewImageActivity.kt | 2 +- .../android/ui/preview/model/PreviewImageActivityState.kt | 4 +++- 2 files changed, 4 insertions(+), 2 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 5671b84ad12f..8859d8a0ea01 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 @@ -273,7 +273,7 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR private fun observeWorkerState() { WorkerStateLiveData.instance().observe(this) { state: WorkerState? -> - when(state) { + when (state) { is WorkerState.Download -> { Log_OC.d(TAG, "Download worker started") isDownloadWorkStarted = true diff --git a/app/src/main/java/com/owncloud/android/ui/preview/model/PreviewImageActivityState.kt b/app/src/main/java/com/owncloud/android/ui/preview/model/PreviewImageActivityState.kt index 6db7e83e6893..cce5191d43df 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/model/PreviewImageActivityState.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/model/PreviewImageActivityState.kt @@ -8,5 +8,7 @@ package com.owncloud.android.ui.preview.model enum class PreviewImageActivityState { - WaitingForBinder, Edit, Idle + WaitingForBinder, + Edit, + Idle } From 60571635f4e04dbffbf86fc8c439213939c51c60 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 30 Jul 2024 16:08:42 +0200 Subject: [PATCH 3/6] Fix remove and adapter position Signed-off-by: alperozturk --- .../com/owncloud/android/ui/preview/PreviewImageActivity.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 8859d8a0ea01..6393bc95bb53 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 @@ -258,8 +258,12 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR } } - viewPager?.setCurrentItem(nextPosition, true) + if (user.isPresent) { + initViewPager(user.get()) + } + previewImagePagerAdapter?.delete(deletePosition) + viewPager?.setCurrentItem(nextPosition, true) } else if (operation is SynchronizeFileOperation) { onSynchronizeFileOperationFinish(result) } From f5011c31400297cab1eb1d01f26ae05187c9ce41 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 30 Jul 2024 16:23:13 +0200 Subject: [PATCH 4/6] When delete last image refresh previous screen Signed-off-by: alperozturk --- .../owncloud/android/ui/preview/PreviewImageActivity.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 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 6393bc95bb53..34f3297994c8 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 @@ -253,7 +253,7 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR previewImagePagerAdapter?.let { if (it.itemCount <= 1) { - finish() + backToDisplayActivity() return } } @@ -262,8 +262,8 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR initViewPager(user.get()) } - previewImagePagerAdapter?.delete(deletePosition) viewPager?.setCurrentItem(nextPosition, true) + previewImagePagerAdapter?.delete(deletePosition) } else if (operation is SynchronizeFileOperation) { onSynchronizeFileOperationFinish(result) } @@ -343,6 +343,7 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR } private fun backToDisplayActivity() { + sendRefreshSearchEventBroadcast() finish() } @@ -355,7 +356,7 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR } startActivity(intent) - finish() + backToDisplayActivity() } override fun showDetails(file: OCFile, activeTab: Int) { From 8a42462c0c32d41d422abe3b31692d7cd3062476 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 30 Jul 2024 16:33:25 +0200 Subject: [PATCH 5/6] Update license header Signed-off-by: alperozturk --- .../com/owncloud/android/ui/preview/PreviewImageActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 34f3297994c8..e4fefd7bf9a7 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 @@ -1,7 +1,7 @@ /* * Nextcloud - Android Client * - * SPDX-FileCopyrightText: 2024 Your Name + * SPDX-FileCopyrightText: 2024 Alper Ozturk * SPDX-License-Identifier: AGPL-3.0-or-later */ package com.owncloud.android.ui.preview From ed7d0aaa11fa841d575ef743d3b74ed44daa448c Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 30 Jul 2024 16:40:05 +0200 Subject: [PATCH 6/6] Give feedback to user for file existence and readiness Signed-off-by: alperozturk --- .../android/ui/preview/PreviewImageActivity.kt | 11 +++++++++++ app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 13 insertions(+) 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 e4fefd7bf9a7..7ebd4af61d3c 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 @@ -50,6 +50,7 @@ import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.ui.fragment.GalleryFragment import com.owncloud.android.ui.fragment.OCFileListFragment import com.owncloud.android.ui.preview.model.PreviewImageActivityState +import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.MimeTypeUtil import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import java.io.Serializable @@ -494,6 +495,16 @@ class PreviewImageActivity : FileActivity(), FileFragment.ContainerActivity, OnR } private fun startEditImageActivity() { + if (file == null) { + DisplayUtils.showSnackMessage(this, R.string.preview_image_file_is_not_exist) + return + } + + if (!file.isDown) { + DisplayUtils.showSnackMessage(this, R.string.preview_image_file_is_not_downloaded) + return + } + val intent = Intent(this, EditImageActivity::class.java).apply { putExtra(EditImageActivity.EXTRA_FILE, file) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5781babe236e..765d84262853 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -419,6 +419,8 @@ File is currently locked by another user or process and therefore not deletable. Please try again later. Sorry + File is not exist + File is not downloaded Downloading image to start the edit screen, please wait… Image preview Unable to show image