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/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/autoUpload/AutoUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt index d9f2df683af0..83ee1abd3b53 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt @@ -18,8 +18,7 @@ import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.database.entity.toOCUpload import com.nextcloud.client.database.entity.toUploadEntity import com.nextcloud.client.device.PowerManagementService -import com.nextcloud.client.jobs.BackgroundJobManager -import com.nextcloud.client.jobs.upload.FileUploadBroadcastManager +import com.nextcloud.client.jobs.upload.FileUploadEventBroadcaster import com.nextcloud.client.jobs.upload.FileUploadWorker import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager import com.nextcloud.client.network.ConnectivityService @@ -71,7 +70,7 @@ class AutoUploadWorker( } private val syncFolderHelper = SyncFolderHelper(context) - private val fileUploadBroadcastManager = FileUploadBroadcastManager(localBroadcastManager) + private val fileUploadEventBroadcaster = FileUploadEventBroadcaster(localBroadcastManager) private lateinit var syncedFolder: SyncedFolder private val notificationManager = AutoUploadNotificationManager(context, viewThemeUtils, NOTIFICATION_ID) @@ -287,12 +286,12 @@ class AutoUploadWorker( uploadEntity = uploadEntity.copy(id = generatedId.toInt()) upload.uploadId = generatedId - fileUploadBroadcastManager.sendAdded(context) + fileUploadEventBroadcaster.sendUploadEnqueued(context) val operation = createUploadFileOperation(upload, user) Log_OC.d(TAG, "🕒 uploading: $localPath, id: $generatedId") val result = operation.execute(client) - fileUploadBroadcastManager.sendStarted(operation, context) + fileUploadEventBroadcaster.sendUploadStarted(operation, context) UploadErrorNotificationManager.handleResult( context, @@ -427,7 +426,7 @@ class AutoUploadWorker( ) private fun sendUploadFinishEvent(operation: UploadFileOperation, result: RemoteOperationResult<*>) { - fileUploadBroadcastManager.sendFinished( + fileUploadEventBroadcaster.sendUploadCompleted( operation, result, operation.oldFile?.storagePath, diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadEventBroadcaster.kt b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadEventBroadcaster.kt new file mode 100644 index 000000000000..b1cbb09f5b24 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadEventBroadcaster.kt @@ -0,0 +1,103 @@ +/* + * 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 + +class FileDownloadEventBroadcaster(private val context: Context, private val broadcastManager: LocalBroadcastManager) { + companion object { + private const val TAG = "📣" + "FileDownloadBroadcastManager" + + private const val PREFIX = "com.nextcloud.client.download." + + const val ACTION_DOWNLOAD_ENQUEUED = PREFIX + "ACTION_DOWNLOAD_ENQUEUED" + const val ACTION_DOWNLOAD_COMPLETED = PREFIX + "ACTION_DOWNLOAD_COMPLETED" + + const val EXTRA_DOWNLOAD_RESULT = PREFIX + "EXTRA_DOWNLOAD_RESULT" + const val EXTRA_REMOTE_PATH = PREFIX + "EXTRA_REMOTE_PATH" + const val EXTRA_LINKED_TO_PATH = PREFIX + "EXTRA_LINKED_TO_PATH" + const val EXTRA_ACCOUNT_NAME = PREFIX + "EXTRA_ACCOUNT_NAME" + const val EXTRA_CURRENT_DOWNLOAD_ACCOUNT_NAME = PREFIX + "EXTRA_CURRENT_DOWNLOAD_ACCOUNT_NAME" + const val EXTRA_CURRENT_DOWNLOAD_FILE_ID = PREFIX + "EXTRA_CURRENT_DOWNLOAD_FILE_ID" + const val EXTRA_PACKAGE_NAME = PREFIX + "PACKAGE_NAME" + const val EXTRA_ACTIVITY_NAME = PREFIX + "ACTIVITY_NAME" + const val EXTRA_DOWNLOAD_BEHAVIOUR = PREFIX + "DOWNLOAD_BEHAVIOUR" + } + + fun sendDownloadEnqueued( + accountName: String, + remotePath: String, + packageName: String, + fileId: Long?, + linkedToRemotePath: String?, + currentDownloadAccountName: String? + ) { + Log_OC.d(TAG, "Download enqueued broadcast sent") + + val intent = Intent(ACTION_DOWNLOAD_ENQUEUED).apply { + putExtra(EXTRA_ACCOUNT_NAME, accountName) + putExtra(EXTRA_REMOTE_PATH, remotePath) + + fileId?.let { + putExtra(EXTRA_CURRENT_DOWNLOAD_FILE_ID, fileId) + } + + currentDownloadAccountName?.let { + putExtra(EXTRA_CURRENT_DOWNLOAD_ACCOUNT_NAME, currentDownloadAccountName) + } + + linkedToRemotePath?.let { + putExtra(EXTRA_LINKED_TO_PATH, linkedToRemotePath) + } + setPackage(packageName) + } + + broadcastManager.sendBroadcast(intent) + } + + fun sendDownloadCompleted( + download: DownloadFileOperation, + downloadResult: RemoteOperationResult<*>, + unlinkedFromRemotePath: String? + ) { + Log_OC.d(TAG, "Download completed broadcast sent") + + val intent = Intent(ACTION_DOWNLOAD_COMPLETED).apply { + putExtra(EXTRA_DOWNLOAD_RESULT, downloadResult.isSuccess) + putExtra(EXTRA_ACCOUNT_NAME, download.user.accountName) + putExtra(EXTRA_REMOTE_PATH, download.remotePath) + putExtra(EXTRA_DOWNLOAD_BEHAVIOUR, download.behaviour) + putExtra(EXTRA_ACTIVITY_NAME, download.activityName) + putExtra(EXTRA_PACKAGE_NAME, download.packageName) + if (unlinkedFromRemotePath != null) { + putExtra(EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath) + } + setPackage(context.packageName) + } + + broadcastManager.sendBroadcast(intent) + } + + fun sendDownloadCompleted(accountName: String, remotePath: String?, packageName: String, success: Boolean) { + Log_OC.d(TAG, "Download completed broadcast sent") + + val intent = Intent(ACTION_DOWNLOAD_COMPLETED).apply { + putExtra(EXTRA_ACCOUNT_NAME, accountName) + putExtra(EXTRA_REMOTE_PATH, remotePath) + putExtra(EXTRA_DOWNLOAD_RESULT, success) + setPackage(packageName) + } + + broadcastManager.sendBroadcast(intent) + } +} 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/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..5b4607522099 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 @@ -50,7 +48,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), @@ -79,14 +77,6 @@ class FileDownloadWorker( const val ACTIVITY_NAME = "ACTIVITY_NAME" const val PACKAGE_NAME = "PACKAGE_NAME" const val CONFLICT_UPLOAD_ID = "CONFLICT_UPLOAD_ID" - const val EXTRA_DOWNLOAD_RESULT = "EXTRA_DOWNLOAD_RESULT" - 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 +84,9 @@ class FileDownloadWorker( private var conflictUploadId: Long? = null private var lastPercent = 0 + private val fileDownloadEventBroadcaster = FileDownloadEventBroadcaster(context, localBroadcastManager) private val intents = FileDownloadIntents(context) + private var notificationManager = DownloadNotificationManager( Random.nextInt(), context, @@ -140,7 +132,6 @@ class FileDownloadWorker( } finally { Log_OC.d(TAG, "cleanup") notificationManager.dismissNotification() - setIdleWorkerState() } } @@ -168,14 +159,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) } @@ -216,9 +199,14 @@ class FileDownloadWorker( requestedDownloads.add(downloadKey) } - linkedToRemotePath?.let { - localBroadcastManager.sendBroadcast(intents.newDownloadIntent(operation, linkedToRemotePath)) - } + fileDownloadEventBroadcaster.sendDownloadEnqueued( + operation.user.accountName, + operation.remotePath, + context.packageName, + operation.file.fileId, + linkedToRemotePath, + operation.user.accountName + ) } requestedDownloads @@ -266,7 +254,6 @@ class FileDownloadWorker( return } - setWorkerState(user) Log_OC.d(TAG, "downloading: $downloadKey") val isAccountExist = accountManager.exists(currentDownload?.user?.toPlatformAccount()) @@ -342,13 +329,11 @@ class FileDownloadWorker( currentDownload?.run { notifyDownloadResult(this, downloadResult) - val downloadFinishedIntent = intents.downloadFinishedIntent( + fileDownloadEventBroadcaster.sendDownloadCompleted( this, downloadResult, removeResult.second ) - - localBroadcastManager.sendBroadcast(downloadFinishedIntent) } } diff --git a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadEventBroadcaster.kt b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadEventBroadcaster.kt new file mode 100644 index 000000000000..7bd36992902e --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadEventBroadcaster.kt @@ -0,0 +1,49 @@ +/* + * 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.owncloud.android.lib.common.utils.Log_OC + +class FolderDownloadEventBroadcaster( + private val context: Context, + private val broadcastManager: LocalBroadcastManager +) { + companion object { + private const val TAG = "📣" + "FolderDownloadBroadcastManager" + + private const val PREFIX = "com.nextcloud.client.folderDownload." + + const val ACTION_DOWNLOAD_ENQUEUED = PREFIX + "ACTION_DOWNLOAD_ENQUEUED" + const val ACTION_DOWNLOAD_COMPLETED = PREFIX + "ACTION_DOWNLOAD_COMPLETED" + + const val EXTRA_FILE_ID = PREFIX + "EXTRA_FILE_ID" + } + + fun sendDownloadEnqueued(id: Long) { + Log_OC.d(TAG, "Download enqueued broadcast sent") + + val intent = Intent(ACTION_DOWNLOAD_ENQUEUED).apply { + putExtra(EXTRA_FILE_ID, id) + } + + broadcastManager.sendBroadcast(intent) + } + + fun sendDownloadCompleted(id: Long) { + Log_OC.d(TAG, "Download completed broadcast sent") + + val intent = Intent(ACTION_DOWNLOAD_COMPLETED).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..cc0ec499b196 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 folderDownloadEventBroadcaster = FolderDownloadEventBroadcaster(context, localBroadcastManager) private lateinit var storageManager: FileDataStorageManager @Suppress("ReturnCount", "DEPRECATION") @@ -79,6 +80,7 @@ class FolderDownloadWorker( trySetForeground(folder) + folderDownloadEventBroadcaster.sendDownloadEnqueued(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)) + folderDownloadEventBroadcaster.sendDownloadCompleted(folder.fileId) pendingDownloads.remove(folder.fileId) notificationManager.dismiss() } diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadEventBroadcaster.kt similarity index 58% rename from app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt rename to app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadEventBroadcaster.kt index 148e869ee8fc..f7ee1a6a4bf8 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadEventBroadcaster.kt @@ -22,14 +22,23 @@ import com.owncloud.android.operations.UploadFileOperation * * All broadcasts are sent via [LocalBroadcastManager]. */ -class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastManager) { +class FileUploadEventBroadcaster(private val broadcastManager: LocalBroadcastManager) { companion object { private const val TAG = "📣" + "FileUploadBroadcastManager" - const val UPLOAD_ADDED = "UPLOAD_ADDED" - const val UPLOAD_STARTED = "UPLOAD_STARTED" - const val UPLOAD_FINISHED = "UPLOAD_FINISHED" + private const val PREFIX = "com.nextcloud.client.upload." + + const val ACTION_UPLOAD_ENQUEUED = PREFIX + "ACTION_UPLOAD_ENQUEUED" + const val ACTION_UPLOAD_STARTED = PREFIX + "ACTION_UPLOAD_STARTED" + const val ACTION_UPLOAD_COMPLETED = PREFIX + "UPLOAD_FINISHED" + + const val EXTRA_REMOTE_PATH = PREFIX + "EXTRA_REMOTE_PATH" + const val EXTRA_OLD_FILE_PATH = PREFIX + "EXTRA_OLD_FILE_PATH" + const val EXTRA_ACCOUNT_NAME = PREFIX + "EXTRA_ACCOUNT_NAME" + const val EXTRA_OLD_REMOTE_PATH = PREFIX + "EXTRA_OLD_REMOTE_PATH" + const val EXTRA_UPLOAD_RESULT = PREFIX + "EXTRA_UPLOAD_RESULT" + const val EXTRA_LINKED_TO_PATH = PREFIX + "EXTRA_LINKED_TO_PATH" } /** @@ -42,9 +51,10 @@ class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastMan * - [com.owncloud.android.ui.activity.UploadListActivity.UploadFinishReceiver] * */ - fun sendAdded(context: Context) { - Log_OC.d(TAG, "upload added broadcast sent") - val intent = Intent(UPLOAD_ADDED).apply { + fun sendUploadEnqueued(context: Context) { + Log_OC.d(TAG, "Upload enqueued broadcast sent") + + val intent = Intent(ACTION_UPLOAD_ENQUEUED).apply { setPackage(context.packageName) } broadcastManager.sendBroadcast(intent) @@ -60,12 +70,13 @@ class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastMan * - [com.owncloud.android.ui.activity.UploadListActivity.UploadFinishReceiver] * */ - fun sendStarted(upload: UploadFileOperation, context: Context) { - Log_OC.d(TAG, "upload started broadcast sent") - val intent = Intent(UPLOAD_STARTED).apply { - putExtra(FileUploadWorker.EXTRA_REMOTE_PATH, upload.remotePath) // real remote - putExtra(FileUploadWorker.EXTRA_OLD_FILE_PATH, upload.originalStoragePath) - putExtra(FileUploadWorker.ACCOUNT_NAME, upload.user.accountName) + fun sendUploadStarted(upload: UploadFileOperation, context: Context) { + Log_OC.d(TAG, "Upload started broadcast sent") + + val intent = Intent(ACTION_UPLOAD_STARTED).apply { + putExtra(EXTRA_REMOTE_PATH, upload.remotePath) // real remote + putExtra(EXTRA_OLD_FILE_PATH, upload.originalStoragePath) + putExtra(EXTRA_ACCOUNT_NAME, upload.user.accountName) setPackage(context.packageName) } broadcastManager.sendBroadcast(intent) @@ -79,31 +90,31 @@ class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastMan * - [UploadFileOperation] completes execution * * ### Observed by - * - [com.owncloud.android.ui.activity.FileDisplayActivity.UploadFinishReceiver] + * - [com.owncloud.android.ui.activity.FileDisplayActivity.FileUploadCompletedReceiver] * - [com.owncloud.android.ui.activity.UploadListActivity.UploadFinishReceiver] - * - [com.owncloud.android.ui.preview.PreviewImageActivity.UploadFinishReceiver] * */ - fun sendFinished( + fun sendUploadCompleted( upload: UploadFileOperation, uploadResult: RemoteOperationResult<*>, unlinkedFromRemotePath: String?, context: Context ) { - Log_OC.d(TAG, "upload finished broadcast sent") - val intent = Intent(UPLOAD_FINISHED).apply { + Log_OC.d(TAG, "Upload completed broadcast sent") + + val intent = Intent(ACTION_UPLOAD_COMPLETED).apply { // real remote path, after possible automatic renaming - putExtra(FileUploadWorker.EXTRA_REMOTE_PATH, upload.remotePath) + putExtra(EXTRA_REMOTE_PATH, upload.remotePath) if (upload.wasRenamed()) { upload.oldFile?.let { - putExtra(FileUploadWorker.EXTRA_OLD_REMOTE_PATH, it.remotePath) + putExtra(EXTRA_OLD_REMOTE_PATH, it.remotePath) } } - putExtra(FileUploadWorker.EXTRA_OLD_FILE_PATH, upload.originalStoragePath) - putExtra(FileUploadWorker.ACCOUNT_NAME, upload.user.accountName) - putExtra(FileUploadWorker.EXTRA_UPLOAD_RESULT, uploadResult.isSuccess) + putExtra(EXTRA_OLD_FILE_PATH, upload.originalStoragePath) + putExtra(EXTRA_ACCOUNT_NAME, upload.user.accountName) + putExtra(EXTRA_UPLOAD_RESULT, uploadResult.isSuccess) if (unlinkedFromRemotePath != null) { - putExtra(FileUploadWorker.EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath) + putExtra(EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath) } setPackage(context.packageName) } diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt index 5bb40b30969d..93a25c320b3f 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt @@ -513,8 +513,8 @@ class FileUploadHelper { class UploadNotificationActionReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { - val accountName = intent.getStringExtra(FileUploadWorker.EXTRA_ACCOUNT_NAME) - val remotePath = intent.getStringExtra(FileUploadWorker.EXTRA_REMOTE_PATH) + val accountName = intent.getStringExtra(FileUploadEventBroadcaster.EXTRA_ACCOUNT_NAME) + val remotePath = intent.getStringExtra(FileUploadEventBroadcaster.EXTRA_REMOTE_PATH) val action = intent.action if (FileUploadWorker.ACTION_CANCEL_BROADCAST == action) { 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 e64ca25ca296..0f0f595fc3fd 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 @@ -77,12 +77,6 @@ class FileUploadWorker( private const val BATCH_SIZE = 100 - const val EXTRA_UPLOAD_RESULT = "RESULT" - const val EXTRA_REMOTE_PATH = "REMOTE_PATH" - const val EXTRA_OLD_REMOTE_PATH = "OLD_REMOTE_PATH" - const val EXTRA_OLD_FILE_PATH = "OLD_FILE_PATH" - const val EXTRA_LINKED_TO_PATH = "LINKED_TO" - const val ACCOUNT_NAME = "ACCOUNT_NAME" const val EXTRA_ACCOUNT_NAME = "ACCOUNT_NAME" const val ACTION_CANCEL_BROADCAST = "CANCEL" const val LOCAL_BEHAVIOUR_COPY = 0 @@ -119,7 +113,7 @@ class FileUploadWorker( private val notificationId = Random.nextInt() private val notificationManager = UploadNotificationManager(context, viewThemeUtils, notificationId) private val intents = FileUploaderIntents(context) - private val fileUploadBroadcastManager = FileUploadBroadcastManager(localBroadcastManager) + private val fileUploadEventBroadcaster = FileUploadEventBroadcaster(localBroadcastManager) override suspend fun doWork(): Result = try { Log_OC.d(TAG, "FileUploadWorker started") @@ -242,7 +236,7 @@ class FileUploadWorker( return@withContext Result.failure() } - fileUploadBroadcastManager.sendAdded(context) + fileUploadEventBroadcaster.sendUploadEnqueued(context) val operation = createUploadFileOperation(upload, user) currentUploadFileOperation = operation @@ -285,7 +279,7 @@ class FileUploadWorker( isLastUpload if (shouldBroadcast) { - fileUploadBroadcastManager.sendFinished( + fileUploadEventBroadcaster.sendUploadCompleted( operation, result, operation.oldFile?.storagePath, @@ -342,7 +336,7 @@ class FileUploadWorker( val file = File(operation.originalStoragePath) val remoteId: String? = operation.file.remoteId task.execute(ThumbnailsCacheManager.ThumbnailGenerationTaskObject(file, remoteId)) - fileUploadBroadcastManager.sendStarted(operation, context) + fileUploadEventBroadcaster.sendUploadStarted(operation, context) } catch (e: Exception) { Log_OC.e(TAG, "Error uploading", e) uploadsStorageManager.run { 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/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 4c8d75bc7850..e29a1851a118 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.FileDownloadEventBroadcaster; 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 FileDownloadEventBroadcaster fileDownloadEventBroadcaster; 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); + fileDownloadEventBroadcaster = new FileDownloadEventBroadcaster(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()); + fileDownloadEventBroadcaster.sendDownloadCompleted(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)); - + fileDownloadEventBroadcaster.sendDownloadCompleted(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,12 @@ 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! + fileDownloadEventBroadcaster.sendDownloadEnqueued(account.name, + remotePath, + mService.getPackageName(), + syncFolderOperation.getFolderId(), + null, + syncFolderOperation.getAccountName()); } } @@ -151,33 +158,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/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 21a74acb64bf..8acc68a7d7a0 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,20 +63,17 @@ 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.FileDownloadEventBroadcaster 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.folderDownload.FolderDownloadEventBroadcaster +import com.nextcloud.client.jobs.upload.FileUploadEventBroadcaster import com.nextcloud.client.jobs.upload.FileUploadHelper import com.nextcloud.client.jobs.upload.FileUploadWorker 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.FileDownloadStarted import com.nextcloud.model.WorkerState.OfflineOperationsCompleted import com.nextcloud.ui.composeActivity.ComposeProcessTextAlias import com.nextcloud.utils.extensions.getParcelableArgument @@ -118,7 +115,6 @@ import com.owncloud.android.ui.asynctasks.CheckAvailableSpaceTask.CheckAvailable import com.owncloud.android.ui.asynctasks.FetchRemoteFileTask import com.owncloud.android.ui.asynctasks.GetRemoteFileTask import com.owncloud.android.ui.dialog.DeleteBatchTracker -import com.owncloud.android.ui.dialog.SendShareDialog import com.owncloud.android.ui.dialog.SendShareDialog.SendShareDialogDownloader import com.owncloud.android.ui.dialog.SortingOrderDialogFragment.OnSortingOrderListener import com.owncloud.android.ui.dialog.StoragePermissionDialogFragment @@ -193,9 +189,16 @@ 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 syncReceiver = SyncReceiver() + + private val fileUploadCompletedReceiver = FileUploadCompletedReceiver() + + private val fileDownloadStartedReceiver = FileDownloadStartedReceiver() + private val fileDownloadCompletedReceiver = FileDownloadCompletedReceiver() + + private val folderDownloadStartedReceiver = FolderDownloadStartedReceiver() + private val folderDownloadCompletedReceiver = FolderDownloadCompletedReceiver() + private var mLastSslUntrustedServerResult: RemoteOperationResult<*>? = null private var mWaitingToPreview: OCFile? = null @@ -797,7 +800,6 @@ class FileDisplayActivity : var leftFragment: Fragment? get() = supportFragmentManager.findFragmentByTag(TAG_LIST_OF_FILES) - // Replaces the first fragment managed by the activity with the received as a parameter. private set(fragment) { setLeftFragment(fragment, true) @@ -841,11 +843,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 == FileDownloadEventBroadcaster.ACTION_DOWNLOAD_ENQUEUED) { // grant that the details fragment updates the progress bar leftFragment.listenForTransferProgress() leftFragment.updateFileDetails(true, false) - } else if (downloadEvent == getDownloadFinishMessage()) { + } else if (downloadEvent == FileDownloadEventBroadcaster.ACTION_DOWNLOAD_COMPLETED) { // update the details panel var detailsFragmentChanged = false if (waitedPreview) { @@ -1417,59 +1419,44 @@ class FileDisplayActivity : private fun registerReceivers() { Log_OC.d(TAG, "registering receivers") - registerSyncBroadcastReceiver() - registerDownloadFinishReceiver() - registerUploadFinishReceiver() - } + localBroadcastManager.run { + val uploadFinishedIntent = IntentFilter(FileUploadEventBroadcaster.ACTION_UPLOAD_COMPLETED) + registerReceiver(fileUploadCompletedReceiver, uploadFinishedIntent) - private fun registerUploadFinishReceiver() { - val filter = IntentFilter(FileUploadBroadcastManager.UPLOAD_FINISHED) - mUploadFinishReceiver = UploadFinishReceiver() - mUploadFinishReceiver?.let { - localBroadcastManager.registerReceiver(it, filter) - } - } + val folderDownloadStartedIntentFilter = + IntentFilter(FolderDownloadEventBroadcaster.ACTION_DOWNLOAD_ENQUEUED) + registerReceiver(folderDownloadStartedReceiver, folderDownloadStartedIntentFilter) - private fun registerDownloadFinishReceiver() { - val filter = IntentFilter(getDownloadAddedMessage()).apply { - addAction(getDownloadFinishMessage()) - } - mDownloadFinishReceiver = DownloadFinishReceiver() - mDownloadFinishReceiver?.let { - localBroadcastManager.registerReceiver(it, filter) - } - } + val folderDownloadFinishedIntentFilter = + IntentFilter(FolderDownloadEventBroadcaster.ACTION_DOWNLOAD_COMPLETED) + registerReceiver(folderDownloadCompletedReceiver, folderDownloadFinishedIntentFilter) + + val fileDownloadStartedIntentFilter = IntentFilter(FileDownloadEventBroadcaster.ACTION_DOWNLOAD_ENQUEUED) + registerReceiver(fileDownloadStartedReceiver, fileDownloadStartedIntentFilter) - private fun registerSyncBroadcastReceiver() { - if (mSyncBroadcastReceiver == null) { - val filter = IntentFilter(FileSyncAdapter.EVENT_FULL_SYNC_START).apply { + val fileDownloadFinishedIntentFilter = IntentFilter(FileDownloadEventBroadcaster.ACTION_DOWNLOAD_COMPLETED) + registerReceiver(fileDownloadCompletedReceiver, fileDownloadFinishedIntentFilter) + + 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(syncReceiver, 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(syncReceiver) + unregisterReceiver(fileUploadCompletedReceiver) + unregisterReceiver(fileDownloadStartedReceiver) + unregisterReceiver(fileDownloadCompletedReceiver) + unregisterReceiver(folderDownloadStartedReceiver) + unregisterReceiver(folderDownloadCompletedReceiver) } } // endregion @@ -1492,7 +1479,7 @@ class FileDisplayActivity : } // region SyncBroadcastReceiver - private inner class SyncBroadcastReceiver : BroadcastReceiver() { + private inner class SyncReceiver : BroadcastReceiver() { @SuppressLint("VisibleForTests") override fun onReceive(context: Context?, intent: Intent) { try { @@ -1683,14 +1670,14 @@ class FileDisplayActivity : /** * Once the file upload has finished -> update view */ - private inner class UploadFinishReceiver : BroadcastReceiver() { + private inner class FileUploadCompletedReceiver : BroadcastReceiver() { private val tag = "UploadFinishReceiver" override fun onReceive(context: Context?, intent: Intent) { Log_OC.d(tag, "upload finish received broadcast") - val uploadedRemotePath = intent.getStringExtra(FileUploadWorker.EXTRA_REMOTE_PATH) - val accountName = intent.getStringExtra(FileUploadWorker.ACCOUNT_NAME) + val uploadedRemotePath = intent.getStringExtra(FileUploadEventBroadcaster.EXTRA_REMOTE_PATH) + val accountName = intent.getStringExtra(FileUploadEventBroadcaster.EXTRA_ACCOUNT_NAME) val account = getAccount() val sameAccount = accountName != null && account != null && accountName == account.name val currentDir = getCurrentDir() @@ -1698,19 +1685,19 @@ class FileDisplayActivity : currentDir != null && uploadedRemotePath != null && uploadedRemotePath.startsWith(currentDir.remotePath) if (sameAccount && isDescendant) { - val linkedToRemotePath = intent.getStringExtra(FileUploadWorker.EXTRA_LINKED_TO_PATH) + val linkedToRemotePath = intent.getStringExtra(FileUploadEventBroadcaster.EXTRA_LINKED_TO_PATH) if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) { updateListOfFilesFragment() } } - val uploadWasFine = intent.getBooleanExtra(FileUploadWorker.EXTRA_UPLOAD_RESULT, false) + val uploadWasFine = intent.getBooleanExtra(FileUploadEventBroadcaster.EXTRA_UPLOAD_RESULT, false) var renamedInUpload = false var sameFile = false if (file != null) { renamedInUpload = - file?.remotePath == intent.getStringExtra(FileUploadWorker.EXTRA_OLD_REMOTE_PATH) + file?.remotePath == intent.getStringExtra(FileUploadEventBroadcaster.EXTRA_OLD_REMOTE_PATH) sameFile = file?.remotePath == uploadedRemotePath || renamedInUpload } @@ -1757,21 +1744,80 @@ class FileDisplayActivity : } } + private inner class FileDownloadStartedReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "download worker started") + handleDownloadWorkerState() + } + } + + private inner class FolderDownloadStartedReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "download worker started") + } + } + + private inner class FolderDownloadCompletedReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "download worker finished") + + val id = intent.getLongExtra(FolderDownloadEventBroadcaster.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) + } + } + /** * 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 FileDownloadCompletedReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent) { + Log_OC.d(TAG, "file download completed received") + fileDownloadProgressListener = null + + if (fileIDForImmediatePreview == -1L) { + Log_OC.d(TAG, "updating ui for file download") + updateUIForFileDownload() + return + } + + Log_OC.d(TAG, "updating ui immediate file preview") + + val downloadedRemotePath = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_REMOTE_PATH) + val currentFile = storageManager.getFileByDecryptedRemotePath(downloadedRemotePath) ?: return + if (fileIDForImmediatePreview != currentFile.fileId || !currentFile.isDown) { + return + } + + fileIDForImmediatePreview = -1 + if (PreviewImageFragment.canBePreviewed(currentFile)) { + startImagePreview(currentFile, currentFile.isDown) + } else { + previewFile(currentFile, null) + } + } + + private fun updateUIForFileDownload() { val sameAccount = isSameAccount(intent) - val downloadedRemotePath = intent.getStringExtra(FileDownloadWorker.EXTRA_REMOTE_PATH) - val downloadBehaviour = intent.getStringExtra(OCFileListFragment.DOWNLOAD_BEHAVIOUR) + val downloadedRemotePath = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_REMOTE_PATH) + val downloadBehaviour = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_DOWNLOAD_BEHAVIOUR) val isDescendant = isDescendant(downloadedRemotePath) if (sameAccount && isDescendant) { - val linkedToRemotePath = intent.getStringExtra(FileDownloadWorker.EXTRA_LINKED_TO_PATH) + val linkedToRemotePath = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_LINKED_TO_PATH) if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) { updateListOfFilesFragment() } @@ -1781,7 +1827,7 @@ class FileDisplayActivity : refreshDetailsFragmentIfVisible( intentAction, downloadedRemotePath, - intent.getBooleanExtra(FileDownloadWorker.EXTRA_DOWNLOAD_RESULT, false) + intent.getBooleanExtra(FileDownloadEventBroadcaster.EXTRA_DOWNLOAD_RESULT, false) ) } } @@ -1793,8 +1839,8 @@ class FileDisplayActivity : mWaitingToSend?.isDown == true && OCFileListFragment.DOWNLOAD_SEND == downloadBehaviour ) { - val packageName = intent.getStringExtra(SendShareDialog.PACKAGE_NAME) ?: return - val activityName = intent.getStringExtra(SendShareDialog.ACTIVITY_NAME) ?: return + val packageName = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_PACKAGE_NAME) ?: return + val activityName = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_ACTIVITY_NAME) ?: return sendDownloadedFile(packageName, activityName) } } @@ -1825,7 +1871,7 @@ class FileDisplayActivity : } fun isSameAccount(intent: Intent): Boolean { - val accountName = intent.getStringExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME) + val accountName = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_ACCOUNT_NAME) return accountName != null && account != null && accountName == account.name } } @@ -1913,51 +1959,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) { @@ -1985,7 +1995,7 @@ class FileDisplayActivity : } else if (PreviewTextFileFragment.canBePreviewed(file)) { setFabVisible?.onComplete(false) startTextPreview(file, false) - } else if (PreviewMediaActivity.Companion.canBePreviewed(file)) { + } else if (PreviewMediaActivity.canBePreviewed(file)) { setFabVisible?.onComplete(false) startMediaPreview(file, 0, true, true, false, true) } else { 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 e54406aa0f1d..47de3ea71b76 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,7 +16,10 @@ 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.content.IntentFilter import android.os.Bundle import android.os.Handler import android.view.MenuItem @@ -25,17 +28,16 @@ import androidx.activity.OnBackPressedCallback import androidx.annotation.VisibleForTesting import androidx.appcompat.widget.PopupMenu import androidx.fragment.app.FragmentManager +import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.common.collect.Sets import com.nextcloud.client.account.User import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.client.jobs.download.FileDownloadEventBroadcaster import com.nextcloud.client.jobs.download.FileDownloadHelper 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 +47,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 @@ -54,6 +55,7 @@ import com.owncloud.android.ui.events.AccountRemovedEvent import com.owncloud.android.ui.helpers.FileOperationsHelper import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import javax.inject.Inject /** * An Activity that allows the user to manage accounts. @@ -73,9 +75,10 @@ class ManageAccountsActivity : private var originalCurrentUser: String? = null private var multipleAccountsSupported = false + private val fileDownloadStartedReceiver = FileDownloadStartedReceiver() - private var workerAccountName: String? = null - private var workerCurrentDownload: DownloadFileOperation? = null + @Inject + lateinit var localBroadcastManager: LocalBroadcastManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -126,7 +129,6 @@ class ManageAccountsActivity : recyclerView = findViewById(R.id.account_list) recyclerView?.setAdapter(userListAdapter) recyclerView?.setLayoutManager(LinearLayoutManager(this)) - observeWorkerState() } @Suppress("ReturnCount") @@ -303,7 +305,7 @@ class ManageAccountsActivity : if (!user.isPresent) { fileUploadHelper.cancel(it) - FileDownloadHelper.instance().cancelAllDownloadsForAccount(workerAccountName, workerCurrentDownload) + cancelAllDownloadsForAccount() } } @@ -364,7 +366,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 +399,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 +471,32 @@ 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 onStart() { + val downloadFileStartedIntentFilter = IntentFilter(FileDownloadEventBroadcaster.ACTION_DOWNLOAD_ENQUEUED) + localBroadcastManager.registerReceiver(fileDownloadStartedReceiver, downloadFileStartedIntentFilter) + super.onStart() + } + + override fun onStop() { + localBroadcastManager.unregisterReceiver(fileDownloadStartedReceiver) + super.onStop() } override fun onAccountClicked(user: User) { openAccount(user) } + private class FileDownloadStartedReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "download received") + + workerAccountName = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_ACCOUNT_NAME) + workerCurrentDownloadAccountName = + intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_CURRENT_DOWNLOAD_ACCOUNT_NAME) + workerFileId = intent.getLongExtra(FileDownloadEventBroadcaster.EXTRA_CURRENT_DOWNLOAD_FILE_ID, -1L) + } + } + companion object { private val TAG: String = ManageAccountsActivity::class.java.simpleName @@ -480,6 +508,10 @@ 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/activity/UploadListActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java index dbd70b68b0f9..2921623082b8 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java @@ -25,7 +25,7 @@ import com.nextcloud.client.core.Clock; import com.nextcloud.client.device.PowerManagementService; import com.nextcloud.client.jobs.BackgroundJobManager; -import com.nextcloud.client.jobs.upload.FileUploadBroadcastManager; +import com.nextcloud.client.jobs.upload.FileUploadEventBroadcaster; import com.nextcloud.client.jobs.upload.FileUploadHelper; import com.nextcloud.client.utils.Throttler; import com.owncloud.android.R; @@ -191,9 +191,9 @@ protected void onStart() { // Listen for upload messages uploadFinishReceiver = new UploadFinishReceiver(); IntentFilter uploadIntentFilter = new IntentFilter(); - uploadIntentFilter.addAction(FileUploadBroadcastManager.UPLOAD_ADDED); - uploadIntentFilter.addAction(FileUploadBroadcastManager.UPLOAD_STARTED); - uploadIntentFilter.addAction(FileUploadBroadcastManager.UPLOAD_FINISHED); + uploadIntentFilter.addAction(FileUploadEventBroadcaster.ACTION_UPLOAD_ENQUEUED); + uploadIntentFilter.addAction(FileUploadEventBroadcaster.ACTION_UPLOAD_STARTED); + uploadIntentFilter.addAction(FileUploadEventBroadcaster.ACTION_UPLOAD_COMPLETED); localBroadcastManager.registerReceiver(uploadFinishReceiver, uploadIntentFilter); Log_OC.v(TAG, "onStart() end"); diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.kt b/app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.kt index 067dac7e767d..eadb264370f8 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.kt @@ -246,8 +246,6 @@ class SendShareDialog : private const val KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD = "KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD" private const val KEY_HIDE_NCSHARING_OPTIONS = "KEY_HIDE_NCSHARING_OPTIONS" private val TAG = SendShareDialog::class.java.simpleName - const val PACKAGE_NAME = "PACKAGE_NAME" - const val ACTIVITY_NAME = "ACTIVITY_NAME" @JvmStatic fun newInstance(file: OCFile?, hideNcSharingOptions: Boolean, capability: OCCapability): SendShareDialog { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 698209fa1348..9639d56b287a 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -179,7 +179,6 @@ public class OCFileListFragment extends ExtendedListFragment implements public final static String ARG_SEARCH_ONLY_FOLDER = MY_PACKAGE + ".SEARCH_ONLY_FOLDER"; public final static String ARG_MIMETYPE = MY_PACKAGE + ".MIMETYPE"; - public static final String DOWNLOAD_BEHAVIOUR = "DOWNLOAD_BEHAVIOUR"; public static final String DOWNLOAD_SEND = "DOWNLOAD_SEND"; 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..4bf68f617a1b 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,10 +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.FileDownloadEventBroadcaster 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 import com.nextcloud.utils.extensions.getParcelableArgument @@ -49,7 +48,6 @@ import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.ui.activity.OnFilesRemovedListener 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 @@ -73,7 +71,10 @@ 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 var fullScreenAnchorView: View? = null private var isDownloadWorkStarted = false @@ -327,26 +328,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") isDownloadWorkStarted = false @@ -392,21 +373,24 @@ class PreviewImageActivity : } private fun registerReceivers() { - downloadFinishReceiver = DownloadFinishReceiver() - val downloadIntentFilter = IntentFilter(getDownloadFinishMessage()) - localBroadcastManager.registerReceiver(downloadFinishReceiver!!, downloadIntentFilter) + localBroadcastManager.run { + val downloadStartIntentFilter = IntentFilter(FileDownloadEventBroadcaster.ACTION_DOWNLOAD_ENQUEUED) + registerReceiver(downloadStartReceiver, downloadStartIntentFilter) - val uploadFinishReceiver = UploadFinishReceiver() - val uploadIntentFilter = IntentFilter(FileUploadBroadcastManager.UPLOAD_FINISHED) - localBroadcastManager.registerReceiver(uploadFinishReceiver, uploadIntentFilter) + val downloadFinishIntentFilter = IntentFilter(FileDownloadEventBroadcaster.ACTION_DOWNLOAD_COMPLETED) + registerReceiver(downloadFinishReceiver, downloadFinishIntentFilter) + } } - public override fun onStop() { - if (downloadFinishReceiver != null) { - localBroadcastManager.unregisterReceiver(downloadFinishReceiver!!) - downloadFinishReceiver = null + private fun unregisterReceivers() { + localBroadcastManager.run { + unregisterReceiver(downloadStartReceiver) + unregisterReceiver(downloadFinishReceiver) } + } + public override fun onStop() { + unregisterReceivers() super.onStop() } @@ -431,8 +415,7 @@ class PreviewImageActivity : showDetails(file) } - @JvmOverloads - fun requestForDownload(file: OCFile?, downloadBehaviour: String? = null) { + fun requestForDownload(file: OCFile?) { if (file == null) return val user = user.orElseThrow { RuntimeException() } FileDownloadHelper.instance().downloadFileIfNotStartedBefore(user, file) @@ -485,51 +468,30 @@ class PreviewImageActivity : */ private inner class DownloadFinishReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { - previewNewImage(intent) - } - } + Log_OC.d(TAG, "Download worker stopped") + isDownloadWorkStarted = false + val accountName = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_ACCOUNT_NAME) + val downloadedRemotePath = intent.getStringExtra(FileDownloadEventBroadcaster.EXTRA_REMOTE_PATH) + if (account.name != accountName || downloadedRemotePath == null) { + return + } + val file = storageManager.getFileByEncryptedRemotePath(downloadedRemotePath) - private inner class UploadFinishReceiver : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - previewNewImage(intent) + if (screenState == PreviewImageActivityState.Edit) { + onImageDownloadComplete(file) + } else { + setDownloadedItem() + } } } - @Suppress("NestedBlockDepth", "ReturnCount") - private fun previewNewImage(intent: Intent) { - val accountName = intent.getStringExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME) - val downloadedRemotePath = intent.getStringExtra(FileDownloadWorker.EXTRA_REMOTE_PATH) - val downloadBehaviour = intent.getStringExtra(OCFileListFragment.DOWNLOAD_BEHAVIOUR) - - if (account.name != accountName || downloadedRemotePath == null) { - return - } - - val file = storageManager.getFileByEncryptedRemotePath(downloadedRemotePath) - val downloadWasFine = intent.getBooleanExtra(FileDownloadWorker.EXTRA_DOWNLOAD_RESULT, false) - - if (EditImageActivity.OPEN_IMAGE_EDITOR == downloadBehaviour) { - startImageEditor(file) - } else { - val position = previewImagePagerAdapter?.getFilePosition(file) ?: return + private inner class DownloadStartReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "Download worker started") + isDownloadWorkStarted = true - if (position >= 0) { - if (downloadWasFine) { - previewImagePagerAdapter?.updateFile(position, file) - } else { - previewImagePagerAdapter?.updateWithDownloadError(position) - } - previewImagePagerAdapter?.notifyItemChanged(position) - } else if (downloadWasFine) { - val user = user - - if (user.isPresent) { - initViewPager(user.get()) - val newPosition = previewImagePagerAdapter?.getFilePosition(file) ?: return - if (newPosition >= 0) { - viewPager?.currentItem = newPosition - } - } + if (screenState == PreviewImageActivityState.WaitingForBinder) { + selectPageOnDownload() } } } @@ -554,7 +516,7 @@ class PreviewImageActivity : } else { showLoadingDialog(getString(R.string.preview_image_downloading_image_for_edit)) screenState = PreviewImageActivityState.Edit - requestForDownload(file, EditImageActivity.OPEN_IMAGE_EDITOR) + requestForDownload(file) } } @@ -570,13 +532,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) {