From 2a104d68c381b3a074adefbc7e8c665e8295a941 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 20 Jan 2026 09:08:47 +0100 Subject: [PATCH 1/3] fix(receivers): download Signed-off-by: alperozturk96 # Conflicts: # app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt # app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt --- .../download/FileDownloadBroadcastManager.kt | 86 +++++++++++++++++++ .../jobs/download/FileDownloadIntents.kt | 34 +------- .../jobs/download/FileDownloadWorker.kt | 22 +++-- .../android/services/SyncFolderHandler.java | 46 +++------- .../ui/activity/ManageAccountsActivity.kt | 2 +- 5 files changed, 110 insertions(+), 80 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadBroadcastManager.kt diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadBroadcastManager.kt b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadBroadcastManager.kt new file mode 100644 index 000000000000..bb7ee4cdc70b --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadBroadcastManager.kt @@ -0,0 +1,86 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +package com.nextcloud.client.jobs.download + +import android.content.Context +import android.content.Intent +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.operations.DownloadFileOperation +import com.owncloud.android.ui.dialog.SendShareDialog +import com.owncloud.android.ui.fragment.OCFileListFragment + +class FileDownloadBroadcastManager( + private val context: Context, + private val broadcastManager: LocalBroadcastManager +) { + companion object { + private const val TAG = "📣" + "FileDownloadBroadcastManager" + + const val DOWNLOAD_ADDED = "DOWNLOAD_ADDED" + const val DOWNLOAD_FINISHED = "DOWNLOAD_FINISHED" + } + + fun sendAdded(accountName: String, remotePath: String, packageName: String, linkedToRemotePath: String?) { + Log_OC.d(TAG, "download added broadcast sent") + + val intent = Intent(DOWNLOAD_ADDED).apply { + putExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME, accountName) + putExtra(FileDownloadWorker.EXTRA_REMOTE_PATH, remotePath) + + linkedToRemotePath?.let { + putExtra(FileDownloadWorker.EXTRA_LINKED_TO_PATH, linkedToRemotePath) + } + setPackage(packageName) + } + + broadcastManager.sendBroadcast(intent) + } + + fun sendFinished( + download: DownloadFileOperation, + downloadResult: RemoteOperationResult<*>, + unlinkedFromRemotePath: String? + ) { + Log_OC.d(TAG, "download finish broadcast sent") + + val intent = Intent(DOWNLOAD_FINISHED).apply { + putExtra(FileDownloadWorker.EXTRA_DOWNLOAD_RESULT, downloadResult.isSuccess) + putExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME, download.user.accountName) + putExtra(FileDownloadWorker.EXTRA_REMOTE_PATH, download.remotePath) + putExtra(OCFileListFragment.DOWNLOAD_BEHAVIOUR, download.behaviour) + putExtra(SendShareDialog.ACTIVITY_NAME, download.activityName) + putExtra(SendShareDialog.PACKAGE_NAME, download.packageName) + if (unlinkedFromRemotePath != null) { + putExtra(FileDownloadWorker.EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath) + } + setPackage(context.packageName) + } + + broadcastManager.sendBroadcast(intent) + } + + fun sendFinished( + accountName: String, + remotePath: String?, + packageName: String, + success: Boolean + ) { + Log_OC.d(TAG, "download finish broadcast sent") + + val intent = Intent(DOWNLOAD_FINISHED).apply { + putExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME, accountName) + putExtra(FileDownloadWorker.EXTRA_REMOTE_PATH, remotePath) + putExtra(FileDownloadWorker.EXTRA_DOWNLOAD_RESULT, success) + setPackage(packageName) + } + + broadcastManager.sendBroadcast(intent) + } +} diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadIntents.kt b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadIntents.kt index 5077122c728f..f54a685b807c 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadIntents.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadIntents.kt @@ -1,52 +1,24 @@ /* * Nextcloud - Android Client * - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2023 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later */ + package com.nextcloud.client.jobs.download import android.content.Context import android.content.Intent import com.nextcloud.client.account.User import com.owncloud.android.authentication.AuthenticatorActivity -import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.operations.DownloadFileOperation import com.owncloud.android.ui.activity.FileActivity import com.owncloud.android.ui.activity.FileDisplayActivity -import com.owncloud.android.ui.dialog.SendShareDialog -import com.owncloud.android.ui.fragment.OCFileListFragment import com.owncloud.android.ui.preview.PreviewImageActivity import com.owncloud.android.ui.preview.PreviewImageFragment class FileDownloadIntents(private val context: Context) { - fun newDownloadIntent(download: DownloadFileOperation, linkedToRemotePath: String): Intent = - Intent(FileDownloadWorker.getDownloadAddedMessage()).apply { - putExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME, download.user.accountName) - putExtra(FileDownloadWorker.EXTRA_REMOTE_PATH, download.remotePath) - putExtra(FileDownloadWorker.EXTRA_LINKED_TO_PATH, linkedToRemotePath) - setPackage(context.packageName) - } - - fun downloadFinishedIntent( - download: DownloadFileOperation, - downloadResult: RemoteOperationResult<*>, - unlinkedFromRemotePath: String? - ): Intent = Intent(FileDownloadWorker.getDownloadFinishMessage()).apply { - putExtra(FileDownloadWorker.EXTRA_DOWNLOAD_RESULT, downloadResult.isSuccess) - putExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME, download.user.accountName) - putExtra(FileDownloadWorker.EXTRA_REMOTE_PATH, download.remotePath) - putExtra(OCFileListFragment.DOWNLOAD_BEHAVIOUR, download.behaviour) - putExtra(SendShareDialog.ACTIVITY_NAME, download.activityName) - putExtra(SendShareDialog.PACKAGE_NAME, download.packageName) - if (unlinkedFromRemotePath != null) { - putExtra(FileDownloadWorker.EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath) - } - setPackage(context.packageName) - } - fun credentialContentIntent(user: User): Intent = Intent(context, AuthenticatorActivity::class.java).apply { putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, user.toPlatformAccount()) putExtra( 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 dfa4c12524ae..47d86585cd30 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 @@ -50,7 +50,7 @@ import kotlin.random.Random class FileDownloadWorker( viewThemeUtils: ViewThemeUtils, private val accountManager: UserAccountManager, - private var localBroadcastManager: LocalBroadcastManager, + localBroadcastManager: LocalBroadcastManager, private val context: Context, params: WorkerParameters ) : CoroutineWorker(context, params), @@ -83,10 +83,6 @@ class FileDownloadWorker( const val EXTRA_REMOTE_PATH = "EXTRA_REMOTE_PATH" const val EXTRA_LINKED_TO_PATH = "EXTRA_LINKED_TO_PATH" const val EXTRA_ACCOUNT_NAME = "EXTRA_ACCOUNT_NAME" - - fun getDownloadAddedMessage(): String = FileDownloadWorker::class.java.name + "DOWNLOAD_ADDED" - - fun getDownloadFinishMessage(): String = FileDownloadWorker::class.java.name + "DOWNLOAD_FINISH" } private var currentDownload: DownloadFileOperation? = null @@ -94,7 +90,9 @@ class FileDownloadWorker( private var conflictUploadId: Long? = null private var lastPercent = 0 + private val fileDownloadBroadcastManager = FileDownloadBroadcastManager(context, localBroadcastManager) private val intents = FileDownloadIntents(context) + private var notificationManager = DownloadNotificationManager( Random.nextInt(), context, @@ -216,9 +214,12 @@ class FileDownloadWorker( requestedDownloads.add(downloadKey) } - linkedToRemotePath?.let { - localBroadcastManager.sendBroadcast(intents.newDownloadIntent(operation, linkedToRemotePath)) - } + fileDownloadBroadcastManager.sendAdded( + operation.user.accountName, + operation.remotePath, + context.packageName, + linkedToRemotePath + ) } requestedDownloads @@ -266,7 +267,6 @@ class FileDownloadWorker( return } - setWorkerState(user) Log_OC.d(TAG, "downloading: $downloadKey") val isAccountExist = accountManager.exists(currentDownload?.user?.toPlatformAccount()) @@ -342,13 +342,11 @@ class FileDownloadWorker( currentDownload?.run { notifyDownloadResult(this, downloadResult) - val downloadFinishedIntent = intents.downloadFinishedIntent( + fileDownloadBroadcastManager.sendFinished( this, downloadResult, removeResult.second ) - - localBroadcastManager.sendBroadcast(downloadFinishedIntent) } } diff --git a/app/src/main/java/com/owncloud/android/services/SyncFolderHandler.java b/app/src/main/java/com/owncloud/android/services/SyncFolderHandler.java index 4c8d75bc7850..ef033626fc3a 100644 --- a/app/src/main/java/com/owncloud/android/services/SyncFolderHandler.java +++ b/app/src/main/java/com/owncloud/android/services/SyncFolderHandler.java @@ -13,14 +13,13 @@ import android.accounts.Account; import android.accounts.AccountsException; -import android.content.Intent; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Pair; import com.nextcloud.client.account.User; -import com.nextcloud.client.jobs.download.FileDownloadWorker; +import com.nextcloud.client.jobs.download.FileDownloadBroadcastManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.IndexedForest; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -49,6 +48,7 @@ class SyncFolderHandler extends Handler { private Account mCurrentAccount; private SynchronizeFolderOperation mCurrentSyncOperation; + private FileDownloadBroadcastManager fileDownloadBroadcastManager; public SyncFolderHandler(Looper looper, OperationsService service) { @@ -57,6 +57,10 @@ public SyncFolderHandler(Looper looper, OperationsService service) { throw new IllegalArgumentException("Received invalid NULL in parameter 'service'"); } mService = service; + + final var context = mService.getApplicationContext(); + final var broadcastManager = LocalBroadcastManager.getInstance(context); + fileDownloadBroadcastManager = new FileDownloadBroadcastManager(context, broadcastManager); } /** @@ -104,13 +108,11 @@ private void doOperation(Account account, String remotePath) { getClientFor(ocAccount, mService); result = mCurrentSyncOperation.execute(mOwnCloudClient); - sendBroadcastFinishedSyncFolder(account, remotePath, result.isSuccess()); + fileDownloadBroadcastManager.sendFinished(account.name, remotePath, mService.getPackageName(), result.isSuccess()); mService.dispatchResultToOperationListeners(mCurrentSyncOperation, result); - } catch (AccountsException | IOException e) { - sendBroadcastFinishedSyncFolder(account, remotePath, false); - mService.dispatchResultToOperationListeners(mCurrentSyncOperation, new RemoteOperationResult(e)); - + fileDownloadBroadcastManager.sendFinished(account.name, remotePath, mService.getPackageName(), false); + mService.dispatchResultToOperationListeners(mCurrentSyncOperation, new RemoteOperationResult<>(e)); Log_OC.e(TAG, "Error while trying to get authorization", e); } finally { mPendingOperations.removePayload(account.name, remotePath); @@ -122,7 +124,7 @@ public void add(Account account, String remotePath, SynchronizeFolderOperation syncFolderOperation){ Pair putResult = mPendingOperations.putIfAbsent(account.name, remotePath, syncFolderOperation); if (putResult != null) { - sendBroadcastNewSyncFolder(account, remotePath); // TODO upgrade! + fileDownloadBroadcastManager.sendAdded(account.name, remotePath, mService.getPackageName(), null); } } @@ -151,33 +153,5 @@ public void cancel(Account account, OCFile file){ mCurrentSyncOperation.cancel(); } } - - //sendBroadcastFinishedSyncFolder(account, file.getRemotePath()); - } - - /** - * TODO review this method when "folder synchronization" replaces "folder download"; - * this is a fast and ugly patch. - */ - private void sendBroadcastNewSyncFolder(Account account, String remotePath) { - Intent added = new Intent(FileDownloadWorker.Companion.getDownloadAddedMessage()); - added.putExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME, account.name); - added.putExtra(FileDownloadWorker.EXTRA_REMOTE_PATH, remotePath); - added.setPackage(mService.getPackageName()); - LocalBroadcastManager.getInstance(mService.getApplicationContext()).sendBroadcast(added); - } - - /** - * TODO review this method when "folder synchronization" replaces "folder download"; - * this is a fast and ugly patch. - */ - private void sendBroadcastFinishedSyncFolder(Account account, String remotePath, - boolean success) { - Intent finished = new Intent(FileDownloadWorker.Companion.getDownloadFinishMessage()); - finished.putExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME, account.name); - finished.putExtra(FileDownloadWorker.EXTRA_REMOTE_PATH, remotePath); - finished.putExtra(FileDownloadWorker.EXTRA_DOWNLOAD_RESULT, success); - finished.setPackage(mService.getPackageName()); - LocalBroadcastManager.getInstance(mService.getApplicationContext()).sendBroadcast(finished); } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt index e54406aa0f1d..a0afd5dc762e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt @@ -126,7 +126,7 @@ class ManageAccountsActivity : recyclerView = findViewById(R.id.account_list) recyclerView?.setAdapter(userListAdapter) recyclerView?.setLayoutManager(LinearLayoutManager(this)) - observeWorkerState() + //observeWorkerState() } @Suppress("ReturnCount") From bd5809f8681027b3ce4eab181fa39f96873c23b9 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 4 Mar 2026 13:12:29 +0100 Subject: [PATCH 2/3] wip Signed-off-by: alperozturk96 --- .../client/jobs/BackgroundJobManager.kt | 2 +- .../client/jobs/BackgroundJobManagerImpl.kt | 11 ++-- .../download/FileDownloadBroadcastManager.kt | 17 +++++- .../jobs/download/FileDownloadHelper.kt | 16 ++---- .../jobs/download/FileDownloadWorker.kt | 6 ++- .../SynchronizeFolderOperation.java | 12 +++++ .../android/services/SyncFolderHandler.java | 7 ++- .../ui/activity/FileDisplayActivity.kt | 17 +++--- .../ui/activity/InternalTwoWaySyncActivity.kt | 2 +- .../ui/activity/ManageAccountsActivity.kt | 53 ++++++++++++------- .../ui/preview/PreviewImageActivity.kt | 4 +- 11 files changed, 98 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt index d3299eb4aaa9..e7111715764d 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt @@ -136,7 +136,7 @@ interface BackgroundJobManager { fun cancelFilesUploadJob(user: User) fun isStartFileUploadJobScheduled(accountName: String): Boolean - fun cancelFilesDownloadJob(user: User, fileId: Long) + fun cancelFilesDownloadJob(accountName: String, fileId: Long) @Suppress("LongParameterList") fun startFileDownloadJob( diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt index d3b00cc25c5b..b465446e3f82 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt @@ -35,7 +35,6 @@ import com.nextcloud.client.jobs.offlineOperations.OfflineOperationsWorker import com.nextcloud.client.jobs.upload.FileUploadHelper import com.nextcloud.client.jobs.upload.FileUploadWorker import com.nextcloud.client.preferences.AppPreferences -import com.nextcloud.utils.extensions.isWorkRunning import com.nextcloud.utils.extensions.isWorkScheduled import com.owncloud.android.datamodel.OCFile import com.owncloud.android.datamodel.SyncedFolder @@ -662,8 +661,8 @@ internal class BackgroundJobManagerImpl( } } - private fun startFileDownloadJobTag(user: User, fileId: Long): String = - JOB_FOLDER_DOWNLOAD + user.accountName + fileId + private fun startFileDownloadJobTag(accountName: String, fileId: Long): String = + JOB_FOLDER_DOWNLOAD + accountName + fileId override fun startFileDownloadJob( user: User, @@ -674,7 +673,7 @@ internal class BackgroundJobManagerImpl( packageName: String, conflictUploadId: Long? ) { - val tag = startFileDownloadJobTag(user, file.fileId) + val tag = startFileDownloadJobTag(user.accountName, file.fileId) val data = workDataOf( FileDownloadWorker.ACCOUNT_NAME to user.accountName, @@ -706,8 +705,8 @@ internal class BackgroundJobManagerImpl( workManager.cancelJob(JOB_FILES_UPLOAD, user) } - override fun cancelFilesDownloadJob(user: User, fileId: Long) { - workManager.cancelAllWorkByTag(startFileDownloadJobTag(user, fileId)) + override fun cancelFilesDownloadJob(accountName: String, fileId: Long) { + workManager.cancelAllWorkByTag(startFileDownloadJobTag(accountName, fileId)) } override fun startPdfGenerateAndUploadWork( diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadBroadcastManager.kt b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadBroadcastManager.kt index bb7ee4cdc70b..37b757c6d3b6 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadBroadcastManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadBroadcastManager.kt @@ -27,13 +27,28 @@ class FileDownloadBroadcastManager( const val DOWNLOAD_FINISHED = "DOWNLOAD_FINISHED" } - fun sendAdded(accountName: String, remotePath: String, packageName: String, linkedToRemotePath: String?) { + fun sendAdded( + accountName: String, + remotePath: String, + packageName: String, + fileId: Long?, + linkedToRemotePath: String?, + currentDownloadAccountName: String? + ) { Log_OC.d(TAG, "download added broadcast sent") val intent = Intent(DOWNLOAD_ADDED).apply { putExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME, accountName) putExtra(FileDownloadWorker.EXTRA_REMOTE_PATH, remotePath) + fileId?.let { + putExtra(FileDownloadWorker.EXTRA_CURRENT_DOWNLOAD_FILE_ID, fileId) + } + + currentDownloadAccountName?.let { + putExtra(FileDownloadWorker.EXTRA_CURRENT_DOWNLOAD_ACCOUNT_NAME, currentDownloadAccountName) + } + linkedToRemotePath?.let { putExtra(FileDownloadWorker.EXTRA_LINKED_TO_PATH, linkedToRemotePath) } diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadHelper.kt b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadHelper.kt index 76f4b99ae7b3..240fda49ef75 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadHelper.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadHelper.kt @@ -59,23 +59,17 @@ class FileDownloadHelper { files.forEach { file -> FileDownloadWorker.cancelOperation(user.accountName, file.fileId) - backgroundJobManager.cancelFilesDownloadJob(user, file.fileId) + backgroundJobManager.cancelFilesDownloadJob(user.accountName, file.fileId) } } - fun cancelAllDownloadsForAccount(accountName: String?, currentDownload: DownloadFileOperation?) { - if (accountName == null || currentDownload == null) return - - val currentUser = currentDownload.user - val currentFile = currentDownload.file - - if (!currentUser.nameEquals(accountName)) { + fun cancelAllDownloadsForAccount(accountName: String, currentDownloadAccountName: String, fileId: Long) { + if (!accountName.equals(currentDownloadAccountName, true)) { return } - currentDownload.cancel() - FileDownloadWorker.cancelOperation(currentUser.accountName, currentFile.fileId) - backgroundJobManager.cancelFilesDownloadJob(currentUser, currentFile.fileId) + FileDownloadWorker.cancelOperation(currentDownloadAccountName, fileId) + backgroundJobManager.cancelFilesDownloadJob(currentDownloadAccountName, fileId) } fun saveFile(file: OCFile, currentDownload: DownloadFileOperation?, storageManager: FileDataStorageManager?) { 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 47d86585cd30..d0428ee0ec09 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 @@ -83,6 +83,8 @@ class FileDownloadWorker( const val EXTRA_REMOTE_PATH = "EXTRA_REMOTE_PATH" const val EXTRA_LINKED_TO_PATH = "EXTRA_LINKED_TO_PATH" const val EXTRA_ACCOUNT_NAME = "EXTRA_ACCOUNT_NAME" + const val EXTRA_CURRENT_DOWNLOAD_ACCOUNT_NAME = "EXTRA_CURRENT_DOWNLOAD_ACCOUNT_NAME" + const val EXTRA_CURRENT_DOWNLOAD_FILE_ID = "EXTRA_CURRENT_DOWNLOAD_FILE_ID" } private var currentDownload: DownloadFileOperation? = null @@ -218,7 +220,9 @@ class FileDownloadWorker( operation.user.accountName, operation.remotePath, context.packageName, - linkedToRemotePath + operation.file.fileId, + linkedToRemotePath, + operation.user.accountName ) } diff --git a/app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java b/app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java index ee77d865ea70..9ffde49006c7 100644 --- a/app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -580,4 +580,16 @@ private void startSyncFolderOperation(String path){ public String getRemotePath() { return mRemotePath; } + + public String getAccountName() { + return user.getAccountName(); + } + + public Long getFolderId() { + if (mLocalFolder == null) { + return null; + } + + return mLocalFolder.getFileId(); + } } diff --git a/app/src/main/java/com/owncloud/android/services/SyncFolderHandler.java b/app/src/main/java/com/owncloud/android/services/SyncFolderHandler.java index ef033626fc3a..364f71e0e831 100644 --- a/app/src/main/java/com/owncloud/android/services/SyncFolderHandler.java +++ b/app/src/main/java/com/owncloud/android/services/SyncFolderHandler.java @@ -124,7 +124,12 @@ public void add(Account account, String remotePath, SynchronizeFolderOperation syncFolderOperation){ Pair putResult = mPendingOperations.putIfAbsent(account.name, remotePath, syncFolderOperation); if (putResult != null) { - fileDownloadBroadcastManager.sendAdded(account.name, remotePath, mService.getPackageName(), null); + fileDownloadBroadcastManager.sendAdded(account.name, + remotePath, + mService.getPackageName(), + syncFolderOperation.getFolderId(), + null, + syncFolderOperation.getAccountName()); } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 21a74acb64bf..ffed48dcda82 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -63,10 +63,9 @@ import com.nextcloud.client.core.Clock import com.nextcloud.client.di.Injectable import com.nextcloud.client.editimage.EditImageActivity import com.nextcloud.client.files.DeepLinkHandler +import com.nextcloud.client.jobs.download.FileDownloadBroadcastManager import com.nextcloud.client.jobs.download.FileDownloadHelper import com.nextcloud.client.jobs.download.FileDownloadWorker -import com.nextcloud.client.jobs.download.FileDownloadWorker.Companion.getDownloadAddedMessage -import com.nextcloud.client.jobs.download.FileDownloadWorker.Companion.getDownloadFinishMessage import com.nextcloud.client.jobs.upload.FileUploadBroadcastManager import com.nextcloud.client.jobs.upload.FileUploadHelper import com.nextcloud.client.jobs.upload.FileUploadWorker @@ -76,7 +75,6 @@ import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.client.utils.IntentUtil import com.nextcloud.model.WorkerState import com.nextcloud.model.WorkerState.FileDownloadCompleted -import com.nextcloud.model.WorkerState.FileDownloadStarted import com.nextcloud.model.WorkerState.OfflineOperationsCompleted import com.nextcloud.ui.composeActivity.ComposeProcessTextAlias import com.nextcloud.utils.extensions.getParcelableArgument @@ -841,11 +839,11 @@ class FileDisplayActivity : if (fileInFragment != null && downloadedRemotePath != fileInFragment.remotePath) { // the user browsed to other file ; forget the automatic preview mWaitingToPreview = null - } else if (downloadEvent == getDownloadAddedMessage()) { + } else if (downloadEvent == FileDownloadBroadcastManager.DOWNLOAD_ADDED) { // grant that the details fragment updates the progress bar leftFragment.listenForTransferProgress() leftFragment.updateFileDetails(true, false) - } else if (downloadEvent == getDownloadFinishMessage()) { + } else if (downloadEvent == FileDownloadBroadcastManager.DOWNLOAD_FINISHED) { // update the details panel var detailsFragmentChanged = false if (waitedPreview) { @@ -1431,8 +1429,8 @@ class FileDisplayActivity : } private fun registerDownloadFinishReceiver() { - val filter = IntentFilter(getDownloadAddedMessage()).apply { - addAction(getDownloadFinishMessage()) + val filter = IntentFilter(FileDownloadBroadcastManager.DOWNLOAD_ADDED).apply { + addAction(FileDownloadBroadcastManager.DOWNLOAD_FINISHED) } mDownloadFinishReceiver = DownloadFinishReceiver() mDownloadFinishReceiver?.let { @@ -1765,6 +1763,8 @@ class FileDisplayActivity : */ private inner class DownloadFinishReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent) { + Log_OC.d(TAG, "DownloadFinishReceiver: download finish received broadcast") + val sameAccount = isSameAccount(intent) val downloadedRemotePath = intent.getStringExtra(FileDownloadWorker.EXTRA_REMOTE_PATH) val downloadBehaviour = intent.getStringExtra(OCFileListFragment.DOWNLOAD_BEHAVIOUR) @@ -1913,6 +1913,7 @@ class FileDisplayActivity : private fun observeWorkerState() { observeWorker { state -> when (state) { + /* is FileDownloadStarted -> { Log_OC.d(TAG, "Download worker started") handleDownloadWorkerState() @@ -1922,6 +1923,8 @@ class FileDisplayActivity : fileDownloadProgressListener = null previewFile(state) } + */ + is OfflineOperationsCompleted -> { refreshCurrentDirectory() diff --git a/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt index 3727d3885de6..a563378545c4 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt @@ -120,7 +120,7 @@ class InternalTwoWaySyncActivity : val folders = fileDataStorageManager.getInternalTwoWaySyncFolders(currentUser) folders.forEach { folder -> FileDownloadWorker.cancelOperation(currentUser.accountName, folder.fileId) - backgroundJobManager.cancelFilesDownloadJob(currentUser, folder.fileId) + backgroundJobManager.cancelFilesDownloadJob(currentUser.accountName, folder.fileId) folder.internalFolderSyncTimestamp = -1L fileDataStorageManager.saveFile(folder) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt index a0afd5dc762e..dd77d53be731 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt @@ -16,6 +16,8 @@ import android.accounts.AccountManagerCallback import android.accounts.AccountManagerFuture import android.accounts.OperationCanceledException import android.annotation.SuppressLint +import android.content.BroadcastReceiver +import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Handler @@ -31,11 +33,9 @@ import com.google.common.collect.Sets import com.nextcloud.client.account.User import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.jobs.download.FileDownloadHelper +import com.nextcloud.client.jobs.download.FileDownloadWorker import com.nextcloud.client.onboarding.FirstRunActivity -import com.nextcloud.model.WorkerState -import com.nextcloud.model.WorkerState.FileDownloadStarted import com.nextcloud.utils.extensions.getParcelableArgument -import com.nextcloud.utils.extensions.observeWorker import com.nextcloud.utils.mdm.MDMConfig.multiAccountSupport import com.owncloud.android.MainApp import com.owncloud.android.R @@ -45,7 +45,6 @@ import com.owncloud.android.datamodel.ArbitraryDataProviderImpl import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.lib.common.UserInfo import com.owncloud.android.lib.common.utils.Log_OC -import com.owncloud.android.operations.DownloadFileOperation import com.owncloud.android.services.OperationsService.OperationsServiceBinder import com.owncloud.android.ui.adapter.UserListAdapter import com.owncloud.android.ui.adapter.UserListItem @@ -74,8 +73,6 @@ class ManageAccountsActivity : private var multipleAccountsSupported = false - private var workerAccountName: String? = null - private var workerCurrentDownload: DownloadFileOperation? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -303,7 +300,7 @@ class ManageAccountsActivity : if (!user.isPresent) { fileUploadHelper.cancel(it) - FileDownloadHelper.instance().cancelAllDownloadsForAccount(workerAccountName, workerCurrentDownload) + cancelAllDownloadsForAccount() } } @@ -364,7 +361,7 @@ class ManageAccountsActivity : val arbitraryDataProvider: ArbitraryDataProvider = ArbitraryDataProviderImpl(this) arbitraryDataProvider.storeOrUpdateKeyValue(user.accountName, PENDING_FOR_REMOVAL, true.toString()) - FileDownloadHelper.instance().cancelAllDownloadsForAccount(workerAccountName, workerCurrentDownload) + cancelAllDownloadsForAccount() fileUploadHelper.cancel(user.accountName) backgroundJobManager.startAccountRemovalJob(user.accountName, false) @@ -397,6 +394,20 @@ class ManageAccountsActivity : } } + private fun cancelAllDownloadsForAccount() { + workerAccountName?.let { accountName -> + workerCurrentDownloadAccountName?.let { currentDownloadAccountName -> + if (workerFileId != -1L) { + FileDownloadHelper.instance().cancelAllDownloadsForAccount( + accountName, + currentDownloadAccountName, + workerFileId + ) + } + } + } + } + @Suppress("DEPRECATION") private fun openAccount(user: User) { val intent = Intent(this, UserInfoActivity::class.java).apply { @@ -455,20 +466,21 @@ class ManageAccountsActivity : } } - private fun observeWorkerState() { - observeWorker { state: WorkerState? -> - if (state is FileDownloadStarted) { - Log_OC.d(TAG, "Download worker started") - workerAccountName = state.user?.accountName - workerCurrentDownload = state.currentDownload - } - } - } - override fun onAccountClicked(user: User) { openAccount(user) } + private class DownloadReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "download received") + + workerAccountName = intent.getStringExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME) + workerCurrentDownloadAccountName = + intent.getStringExtra(FileDownloadWorker.EXTRA_CURRENT_DOWNLOAD_ACCOUNT_NAME) + workerFileId = intent.getLongExtra(FileDownloadWorker.EXTRA_CURRENT_DOWNLOAD_FILE_ID, -1L) + } + } + companion object { private val TAG: String = ManageAccountsActivity::class.java.simpleName @@ -480,6 +492,11 @@ class ManageAccountsActivity : private const val SINGLE_ACCOUNT = 1 private const val MIN_MULTI_ACCOUNT_SIZE = 2 + private var workerAccountName: String? = null + private var workerCurrentDownloadAccountName: String? = null + private var workerFileId: Long = -1L + + private fun toAccountNames(users: Collection): Set { val accountNames: MutableSet = Sets.newHashSetWithExpectedSize(users.size) for (user in users) { 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 c30e731e1a59..3543123697ce 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 @@ -24,9 +24,9 @@ import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.nextcloud.client.account.User import com.nextcloud.client.di.Injectable import com.nextcloud.client.editimage.EditImageActivity +import com.nextcloud.client.jobs.download.FileDownloadBroadcastManager import com.nextcloud.client.jobs.download.FileDownloadHelper import com.nextcloud.client.jobs.download.FileDownloadWorker -import com.nextcloud.client.jobs.download.FileDownloadWorker.Companion.getDownloadFinishMessage import com.nextcloud.client.jobs.upload.FileUploadBroadcastManager import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.model.WorkerState @@ -393,7 +393,7 @@ class PreviewImageActivity : private fun registerReceivers() { downloadFinishReceiver = DownloadFinishReceiver() - val downloadIntentFilter = IntentFilter(getDownloadFinishMessage()) + val downloadIntentFilter = IntentFilter(FileDownloadBroadcastManager.DOWNLOAD_FINISHED) localBroadcastManager.registerReceiver(downloadFinishReceiver!!, downloadIntentFilter) val uploadFinishReceiver = UploadFinishReceiver() From 29c284be6a828fd59f802d3c682b0bab6fc73d2f Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 4 Mar 2026 13:47:41 +0100 Subject: [PATCH 3/3] add missing receivers Signed-off-by: alperozturk96 --- .../client/jobs/BackgroundJobFactory.kt | 1 + .../jobs/download/FileDownloadWorker.kt | 11 -- .../FolderDownloadBroadcastManager.kt | 48 +++++ .../folderDownload/FolderDownloadWorker.kt | 8 +- .../java/com/nextcloud/model/WorkerState.kt | 9 - .../ui/activity/FileDisplayActivity.kt | 178 +++++++++--------- .../ui/preview/PreviewImageActivity.kt | 84 +++++---- 7 files changed, 195 insertions(+), 144 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadBroadcastManager.kt diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt index 87bec10cfe61..8ca9ac512cdd 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt @@ -300,6 +300,7 @@ class BackgroundJobFactory @Inject constructor( accountManager, context, viewThemeUtils.get(), + localBroadcastManager.get(), params ) } 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 d0428ee0ec09..348813e3fdc6 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 @@ -21,8 +21,6 @@ import androidx.work.ForegroundInfo import androidx.work.WorkerParameters import com.nextcloud.client.account.User import com.nextcloud.client.account.UserAccountManager -import com.nextcloud.model.WorkerState -import com.nextcloud.model.WorkerStateObserver import com.nextcloud.utils.ForegroundServiceHelper import com.nextcloud.utils.extensions.getPercent import com.owncloud.android.R @@ -140,7 +138,6 @@ class FileDownloadWorker( } finally { Log_OC.d(TAG, "cleanup") notificationManager.dismissNotification() - setIdleWorkerState() } } @@ -168,14 +165,6 @@ class FileDownloadWorker( ForegroundServiceType.DataSync ) - private fun setWorkerState(user: User?) { - WorkerStateObserver.send(WorkerState.FileDownloadStarted(user, currentDownload)) - } - - private fun setIdleWorkerState() { - WorkerStateObserver.send(WorkerState.FileDownloadCompleted(getCurrentFile())) - } - private fun removePendingDownload(accountName: String?) { pendingDownloads.remove(accountName) } diff --git a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadBroadcastManager.kt b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadBroadcastManager.kt new file mode 100644 index 000000000000..1da486b69117 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadBroadcastManager.kt @@ -0,0 +1,48 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.client.jobs.folderDownload + +import android.content.Context +import android.content.Intent +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.nextcloud.client.jobs.download.FileDownloadWorker +import com.owncloud.android.lib.common.utils.Log_OC + +class FolderDownloadBroadcastManager( + private val context: Context, + private val broadcastManager: LocalBroadcastManager +) { + companion object { + private const val TAG = "📣" + "FolderDownloadBroadcastManager" + + const val DOWNLOAD_ADDED = "DOWNLOAD_ADDED" + const val DOWNLOAD_FINISHED = "DOWNLOAD_FINISHED" + + const val EXTRA_FILE_ID = "EXTRA_FILE_ID" + } + + fun sendAdded(id: Long) { + Log_OC.d(TAG, "download added broadcast sent") + + val intent = Intent(DOWNLOAD_ADDED).apply { + putExtra(EXTRA_FILE_ID, id) + } + + broadcastManager.sendBroadcast(intent) + } + + fun sendFinished(id: Long) { + Log_OC.d(TAG, "download finished broadcast sent") + + val intent = Intent(DOWNLOAD_FINISHED).apply { + putExtra(EXTRA_FILE_ID, id) + } + + broadcastManager.sendBroadcast(intent) + } +} diff --git a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorker.kt index 337ff1bf6ee7..1b2ac54262a3 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorker.kt @@ -8,13 +8,12 @@ package com.nextcloud.client.jobs.folderDownload import android.content.Context +import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.work.CoroutineWorker import androidx.work.ForegroundInfo import androidx.work.WorkerParameters import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.jobs.download.FileDownloadHelper -import com.nextcloud.model.WorkerState -import com.nextcloud.model.WorkerStateObserver import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.datamodel.OCFile import com.owncloud.android.lib.common.OwnCloudClientManagerFactory @@ -32,6 +31,7 @@ class FolderDownloadWorker( private val accountManager: UserAccountManager, private val context: Context, viewThemeUtils: ViewThemeUtils, + localBroadcastManager: LocalBroadcastManager, params: WorkerParameters ) : CoroutineWorker(context, params) { @@ -46,6 +46,7 @@ class FolderDownloadWorker( } private val notificationManager = FolderDownloadWorkerNotificationManager(context, viewThemeUtils) + private val folderDownloadBroadcastManager = FolderDownloadBroadcastManager(context, localBroadcastManager) private lateinit var storageManager: FileDataStorageManager @Suppress("ReturnCount", "DEPRECATION") @@ -79,6 +80,7 @@ class FolderDownloadWorker( trySetForeground(folder) + folderDownloadBroadcastManager.sendAdded(folder.fileId) pendingDownloads.add(folder.fileId) val downloadHelper = FileDownloadHelper.instance() @@ -136,7 +138,7 @@ class FolderDownloadWorker( Log_OC.d(TAG, "❌ failed reason: $e") Result.failure() } finally { - WorkerStateObserver.send(WorkerState.FolderDownloadCompleted(folder)) + folderDownloadBroadcastManager.sendFinished(folder.fileId) pendingDownloads.remove(folder.fileId) notificationManager.dismiss() } diff --git a/app/src/main/java/com/nextcloud/model/WorkerState.kt b/app/src/main/java/com/nextcloud/model/WorkerState.kt index d299045f695e..58cbc8fdb5d6 100644 --- a/app/src/main/java/com/nextcloud/model/WorkerState.kt +++ b/app/src/main/java/com/nextcloud/model/WorkerState.kt @@ -7,15 +7,6 @@ */ package com.nextcloud.model -import com.nextcloud.client.account.User -import com.owncloud.android.datamodel.OCFile -import com.owncloud.android.operations.DownloadFileOperation - sealed class WorkerState { - data class FolderDownloadCompleted(var folder: OCFile) : WorkerState() - - data class FileDownloadStarted(var user: User?, var currentDownload: DownloadFileOperation?) : WorkerState() - data class FileDownloadCompleted(var currentFile: OCFile?) : WorkerState() - data object OfflineOperationsCompleted : WorkerState() } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index ffed48dcda82..0d8967cffa29 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -66,6 +66,7 @@ import com.nextcloud.client.files.DeepLinkHandler import com.nextcloud.client.jobs.download.FileDownloadBroadcastManager import com.nextcloud.client.jobs.download.FileDownloadHelper import com.nextcloud.client.jobs.download.FileDownloadWorker +import com.nextcloud.client.jobs.folderDownload.FolderDownloadBroadcastManager import com.nextcloud.client.jobs.upload.FileUploadBroadcastManager import com.nextcloud.client.jobs.upload.FileUploadHelper import com.nextcloud.client.jobs.upload.FileUploadWorker @@ -73,8 +74,6 @@ import com.nextcloud.client.media.PlayerServiceConnection import com.nextcloud.client.network.ClientFactory.CreationException import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.client.utils.IntentUtil -import com.nextcloud.model.WorkerState -import com.nextcloud.model.WorkerState.FileDownloadCompleted import com.nextcloud.model.WorkerState.OfflineOperationsCompleted import com.nextcloud.ui.composeActivity.ComposeProcessTextAlias import com.nextcloud.utils.extensions.getParcelableArgument @@ -191,9 +190,15 @@ class FileDisplayActivity : Injectable { private lateinit var binding: FilesBinding - private var mSyncBroadcastReceiver: SyncBroadcastReceiver? = null - private var mUploadFinishReceiver: UploadFinishReceiver? = null - private var mDownloadFinishReceiver: DownloadFinishReceiver? = null + private val syncBroadcastReceiver = SyncBroadcastReceiver() + private val uploadFinishReceiver = UploadFinishReceiver() + + private val fileDownloadStartReceiver = FileDownloadStartReceiver() + private val fileDownloadFinishReceiver = FileDownloadFinishReceiver() + + private val folderDownloadStartReceiver = FolderDownloadStartReceiver() + private val folderDownloadFinishReceiver = FolderDownloadFinishReceiver() + private var mLastSslUntrustedServerResult: RemoteOperationResult<*>? = null private var mWaitingToPreview: OCFile? = null @@ -1415,59 +1420,42 @@ class FileDisplayActivity : private fun registerReceivers() { Log_OC.d(TAG, "registering receivers") - registerSyncBroadcastReceiver() - registerDownloadFinishReceiver() - registerUploadFinishReceiver() - } + localBroadcastManager.run { + val uploadFinishedIntent = IntentFilter(FileUploadBroadcastManager.UPLOAD_FINISHED) + registerReceiver(uploadFinishReceiver, uploadFinishedIntent) - private fun registerUploadFinishReceiver() { - val filter = IntentFilter(FileUploadBroadcastManager.UPLOAD_FINISHED) - mUploadFinishReceiver = UploadFinishReceiver() - mUploadFinishReceiver?.let { - localBroadcastManager.registerReceiver(it, filter) - } - } + val folderDownloadStartIntentFilter = IntentFilter(FolderDownloadBroadcastManager.DOWNLOAD_ADDED) + registerReceiver(folderDownloadStartReceiver, folderDownloadStartIntentFilter) - private fun registerDownloadFinishReceiver() { - val filter = IntentFilter(FileDownloadBroadcastManager.DOWNLOAD_ADDED).apply { - addAction(FileDownloadBroadcastManager.DOWNLOAD_FINISHED) - } - mDownloadFinishReceiver = DownloadFinishReceiver() - mDownloadFinishReceiver?.let { - localBroadcastManager.registerReceiver(it, filter) - } - } + val folderDownloadFinishIntentFilter = IntentFilter(FolderDownloadBroadcastManager.DOWNLOAD_FINISHED) + registerReceiver(folderDownloadFinishReceiver, folderDownloadFinishIntentFilter) + + val fileDownloadStartIntentFilter = IntentFilter(FileDownloadBroadcastManager.DOWNLOAD_ADDED) + registerReceiver(fileDownloadStartReceiver, fileDownloadStartIntentFilter) - private fun registerSyncBroadcastReceiver() { - if (mSyncBroadcastReceiver == null) { - val filter = IntentFilter(FileSyncAdapter.EVENT_FULL_SYNC_START).apply { + val fileDownloadFinishIntentFilter = IntentFilter(FileDownloadBroadcastManager.DOWNLOAD_FINISHED) + registerReceiver(fileDownloadFinishReceiver, fileDownloadFinishIntentFilter) + + val syncBroadcastIntentFilter = IntentFilter(FileSyncAdapter.EVENT_FULL_SYNC_START).apply { addAction(FileSyncAdapter.EVENT_FULL_SYNC_END) addAction(FileSyncAdapter.EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED) addAction(RefreshFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED) addAction(RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED) } - - mSyncBroadcastReceiver = SyncBroadcastReceiver() - mSyncBroadcastReceiver?.let { - localBroadcastManager.registerReceiver(it, filter) - } + registerReceiver(syncBroadcastReceiver, syncBroadcastIntentFilter) } } private fun unregisterReceivers() { Log_OC.d(TAG, "unregistering receivers") - if (mSyncBroadcastReceiver != null) { - localBroadcastManager.unregisterReceiver(mSyncBroadcastReceiver!!) - mSyncBroadcastReceiver = null - } - if (mUploadFinishReceiver != null) { - localBroadcastManager.unregisterReceiver(mUploadFinishReceiver!!) - mUploadFinishReceiver = null - } - if (mDownloadFinishReceiver != null) { - localBroadcastManager.unregisterReceiver(mDownloadFinishReceiver!!) - mDownloadFinishReceiver = null + localBroadcastManager.run { + unregisterReceiver(syncBroadcastReceiver) + unregisterReceiver(uploadFinishReceiver) + unregisterReceiver(fileDownloadStartReceiver) + unregisterReceiver(fileDownloadFinishReceiver) + unregisterReceiver(folderDownloadStartReceiver) + unregisterReceiver(folderDownloadFinishReceiver) } } // endregion @@ -1755,14 +1743,75 @@ class FileDisplayActivity : } } + private inner class FileDownloadStartReceiver: BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "download worker started") + handleDownloadWorkerState() + } + } + + private inner class FolderDownloadStartReceiver: BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "download worker started") + } + } + + private inner class FolderDownloadFinishReceiver: BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "download worker finished") + + val id = intent.getLongExtra(FolderDownloadBroadcastManager.EXTRA_FILE_ID, -1L) + if (id == -1L) { + Log_OC.e(TAG, "invalid id received") + return + } + + val folder = storageManager.getFileById(id) + if (folder == null) { + Log_OC.e(TAG, "folder not exists") + return + } + + ocFileListFragment?.adapter?.notifyItemChanged(folder) + } + } + + /* + + private fun previewFile(finishedState: FileDownloadCompleted) { + if (fileIDForImmediatePreview == -1L) { + return + } + + val currentFile = finishedState.currentFile ?: return + + if (fileIDForImmediatePreview != currentFile.fileId || !currentFile.isDown) { + return + } + + fileIDForImmediatePreview = -1 + if (PreviewImageFragment.canBePreviewed(currentFile)) { + startImagePreview(currentFile, currentFile.isDown) + } else { + previewFile(currentFile, null) + } + } + */ + + /** * Class waiting for broadcast events from the [FileDownloadWorker] service. * * * Updates the UI when a download is started or finished, provided that it is relevant for the current folder. */ - private inner class DownloadFinishReceiver : BroadcastReceiver() { + private inner class FileDownloadFinishReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent) { + /* + fileDownloadProgressListener = null + previewFile(state) + */ + Log_OC.d(TAG, "DownloadFinishReceiver: download finish received broadcast") val sameAccount = isSameAccount(intent) @@ -1913,54 +1962,15 @@ class FileDisplayActivity : private fun observeWorkerState() { observeWorker { state -> when (state) { - /* - is FileDownloadStarted -> { - Log_OC.d(TAG, "Download worker started") - handleDownloadWorkerState() - } - - is FileDownloadCompleted -> { - fileDownloadProgressListener = null - previewFile(state) - } - */ - - is OfflineOperationsCompleted -> { refreshCurrentDirectory() } - is WorkerState.FolderDownloadCompleted -> { - ocFileListFragment?.adapter?.notifyItemChanged(state.folder) - } - else -> Unit } } } - private fun previewFile(finishedState: FileDownloadCompleted) { - if (fileIDForImmediatePreview == -1L) { - return - } - - val currentFile = finishedState.currentFile - if (currentFile == null) { - return - } - - if (fileIDForImmediatePreview != currentFile.fileId || !currentFile.isDown) { - return - } - - fileIDForImmediatePreview = -1 - if (PreviewImageFragment.canBePreviewed(currentFile)) { - startImagePreview(currentFile, currentFile.isDown) - } else { - previewFile(currentFile, null) - } - } - fun previewImageWithSearchContext(file: OCFile, searchFragment: Boolean, currentSearchType: SearchType?) { val type = if (searchFragment) { when (currentSearchType) { 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 3543123697ce..3557fcc4bfc1 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 @@ -73,7 +73,11 @@ class PreviewImageActivity : private var viewPager: ViewPager2? = null private var previewImagePagerAdapter: PreviewImagePagerAdapter? = null private var savedPosition: Int? = null - private var downloadFinishReceiver: DownloadFinishReceiver? = null + + private val downloadStartReceiver = DownloadStartReceiver() + private val downloadFinishReceiver = DownloadFinishReceiver() + + private val uploadFinishReceiver = UploadFinishReceiver() private var fullScreenAnchorView: View? = null private var isDownloadWorkStarted = false @@ -327,25 +331,6 @@ class PreviewImageActivity : private fun observeWorkerState() { observeWorker { state: WorkerState? -> when (state) { - is WorkerState.FileDownloadStarted -> { - Log_OC.d(TAG, "Download worker started") - isDownloadWorkStarted = true - - if (screenState == PreviewImageActivityState.WaitingForBinder) { - selectPageOnDownload() - } - } - - is WorkerState.FileDownloadCompleted -> { - Log_OC.d(TAG, "Download worker stopped") - isDownloadWorkStarted = false - - if (screenState == PreviewImageActivityState.Edit) { - onImageDownloadComplete(state.currentFile) - } else { - setDownloadedItem() - } - } else -> { Log_OC.d(TAG, "Worker stopped") @@ -392,21 +377,28 @@ class PreviewImageActivity : } private fun registerReceivers() { - downloadFinishReceiver = DownloadFinishReceiver() - val downloadIntentFilter = IntentFilter(FileDownloadBroadcastManager.DOWNLOAD_FINISHED) - localBroadcastManager.registerReceiver(downloadFinishReceiver!!, downloadIntentFilter) + localBroadcastManager.run { + val downloadStartIntentFilter = IntentFilter(FileDownloadBroadcastManager.DOWNLOAD_ADDED) + registerReceiver(downloadStartReceiver, downloadStartIntentFilter) - val uploadFinishReceiver = UploadFinishReceiver() - val uploadIntentFilter = IntentFilter(FileUploadBroadcastManager.UPLOAD_FINISHED) - localBroadcastManager.registerReceiver(uploadFinishReceiver, uploadIntentFilter) + val downloadFinishIntentFilter = IntentFilter(FileDownloadBroadcastManager.DOWNLOAD_FINISHED) + registerReceiver(downloadFinishReceiver, downloadFinishIntentFilter) + + val uploadFinishIntentFilter = IntentFilter(FileUploadBroadcastManager.UPLOAD_FINISHED) + registerReceiver(uploadFinishReceiver, uploadFinishIntentFilter) + } } - public override fun onStop() { - if (downloadFinishReceiver != null) { - localBroadcastManager.unregisterReceiver(downloadFinishReceiver!!) - downloadFinishReceiver = null + private fun unregisterReceivers() { + localBroadcastManager.run { + unregisterReceiver(downloadStartReceiver) + unregisterReceiver(downloadFinishReceiver) + unregisterReceiver(uploadFinishReceiver) } + } + public override fun onStop() { + unregisterReceivers() super.onStop() } @@ -485,10 +477,33 @@ class PreviewImageActivity : */ private inner class DownloadFinishReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { + + /* + Log_OC.d(TAG, "Download worker stopped") + isDownloadWorkStarted = false + + if (screenState == PreviewImageActivityState.Edit) { + onImageDownloadComplete(state.currentFile) + } else { + setDownloadedItem() + } + */ + previewNewImage(intent) } } + private inner class DownloadStartReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "Download worker started") + isDownloadWorkStarted = true + + if (screenState == PreviewImageActivityState.WaitingForBinder) { + selectPageOnDownload() + } + } + } + private inner class UploadFinishReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { previewNewImage(intent) @@ -570,13 +585,8 @@ class PreviewImageActivity : startActivity(intent) } - override fun onBrowsedDownTo(folder: OCFile) { - // TODO Auto-generated method stub - } - - override fun onTransferStateChanged(file: OCFile, downloading: Boolean, uploading: Boolean) { - // TODO Auto-generated method stub - } + override fun onBrowsedDownTo(folder: OCFile) = Unit + override fun onTransferStateChanged(file: OCFile, downloading: Boolean, uploading: Boolean) = Unit @Suppress("DEPRECATION") private fun hideSystemUI(anchorView: View) {