From b390b75f6814c9ffb6e2fa82c584e63999674168 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 14 Jan 2026 13:08:48 +0100 Subject: [PATCH 1/8] fix(receivers): upload Signed-off-by: alperozturk96 --- ...egate.kt => FileUploadBroadcastManager.kt} | 41 ++++--------------- .../client/jobs/upload/FileUploadWorker.kt | 13 ++---- .../ui/activity/UploadListActivity.java | 16 -------- 3 files changed, 13 insertions(+), 57 deletions(-) rename app/src/main/java/com/nextcloud/client/jobs/upload/{FileUploaderDelegate.kt => FileUploadBroadcastManager.kt} (58%) diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploaderDelegate.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt similarity index 58% rename from app/src/main/java/com/nextcloud/client/jobs/upload/FileUploaderDelegate.kt rename to app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt index 2cff0b44df4c..ea7f4c3671bc 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploaderDelegate.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt @@ -13,54 +13,31 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.operations.UploadFileOperation -class FileUploaderDelegate { - /** - * Sends a broadcast in order to the interested activities can update their view - * - * TODO - no more broadcasts, replace with a callback to subscribed listeners once we drop FileUploader - */ - fun sendBroadcastUploadsAdded(context: Context, localBroadcastManager: LocalBroadcastManager) { +class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastManager) { + + fun sendAdded(context: Context) { val start = Intent(FileUploadWorker.getUploadsAddedMessage()) - // nothing else needed right now start.setPackage(context.packageName) - localBroadcastManager.sendBroadcast(start) + broadcastManager.sendBroadcast(start) } - /** - * Sends a broadcast in order to the interested activities can update their view - * - * TODO - no more broadcasts, replace with a callback to subscribed listeners once we drop FileUploader - * - * @param upload Finished upload operation - */ - fun sendBroadcastUploadStarted( + fun sendStarted( upload: UploadFileOperation, context: Context, - localBroadcastManager: LocalBroadcastManager ) { val start = Intent(FileUploadWorker.getUploadStartMessage()) start.putExtra(FileUploadWorker.EXTRA_REMOTE_PATH, upload.remotePath) // real remote start.putExtra(FileUploadWorker.EXTRA_OLD_FILE_PATH, upload.originalStoragePath) start.putExtra(FileUploadWorker.ACCOUNT_NAME, upload.user.accountName) start.setPackage(context.packageName) - localBroadcastManager.sendBroadcast(start) + broadcastManager.sendBroadcast(start) } - /** - * Sends a broadcast in order to the interested activities can update their view - * - * TODO - no more broadcasts, replace with a callback to subscribed listeners once we drop FileUploader - * - * @param upload Finished upload operation - * @param uploadResult Result of the upload operation - * @param unlinkedFromRemotePath Path in the uploads tree where the upload was unlinked from - */ - fun sendBroadcastUploadFinished( + fun sendFinished( upload: UploadFileOperation, uploadResult: RemoteOperationResult<*>, unlinkedFromRemotePath: String?, - context: Context, - localBroadcastManager: LocalBroadcastManager + context: Context ) { val end = Intent(FileUploadWorker.getUploadFinishMessage()) // real remote path, after possible automatic renaming @@ -75,6 +52,6 @@ class FileUploaderDelegate { end.putExtra(FileUploadWorker.EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath) } end.setPackage(context.packageName) - localBroadcastManager.sendBroadcast(end) + broadcastManager.sendBroadcast(end) } } 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 275dce4b470c..c3831c859081 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 @@ -131,7 +131,7 @@ class FileUploadWorker( private val notificationId = Random.nextInt() private val notificationManager = UploadNotificationManager(context, viewThemeUtils, notificationId) private val intents = FileUploaderIntents(context) - private val fileUploaderDelegate = FileUploaderDelegate() + private val fileUploadBroadcastManager = FileUploadBroadcastManager(localBroadcastManager) override suspend fun doWork(): Result = try { Log_OC.d(TAG, "FileUploadWorker started") @@ -206,10 +206,6 @@ class FileUploadWorker( notificationManager.dismissNotification() } - private fun setWorkerState(user: User?) { - WorkerStateObserver.send(WorkerState.FileUploadStarted(user)) - } - private fun setIdleWorkerState() { WorkerStateObserver.send(WorkerState.FileUploadCompleted(currentUploadFileOperation?.file)) } @@ -269,9 +265,9 @@ class FileUploadWorker( return@withContext Result.failure() } - setWorkerState(user) val operation = createUploadFileOperation(upload, user) currentUploadFileOperation = operation + fileUploadBroadcastManager.sendStarted(operation, context) val currentIndex = (index + 1) val currentUploadIndex = (currentIndex + previouslyUploadedFileSize) @@ -312,12 +308,11 @@ class FileUploadWorker( if (shouldBroadcast) { // delay broadcast - fileUploaderDelegate.sendBroadcastUploadFinished( + fileUploadBroadcastManager.sendFinished( operation, result, operation.oldFile?.storagePath, - context, - localBroadcastManager + context ) } } 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 f66a279a44a2..18ad11840361 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 @@ -28,8 +28,6 @@ import com.nextcloud.client.jobs.upload.FileUploadHelper; import com.nextcloud.client.jobs.upload.FileUploadWorker; import com.nextcloud.client.utils.Throttler; -import com.nextcloud.model.WorkerState; -import com.nextcloud.utils.extensions.ActivityExtensionsKt; import com.owncloud.android.R; import com.owncloud.android.databinding.UploadListLayoutBinding; import com.owncloud.android.datamodel.OCFile; @@ -49,7 +47,6 @@ import androidx.recyclerview.widget.GridLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import kotlin.Unit; /** * Activity listing pending, active, and completed uploads. User can delete completed uploads from view. Content of this @@ -126,19 +123,6 @@ protected void onCreate(Bundle savedInstanceState) { setupDrawer(); setupContent(); - observeWorkerState(); - } - - private void observeWorkerState() { - ActivityExtensionsKt.observeWorker(this, state -> { - if (state instanceof WorkerState.FileUploadStarted) { - Log_OC.d(TAG, "Upload worker started"); - uploadListAdapter.loadUploadItemsFromDb(); - } else if (state instanceof WorkerState.FileUploadCompleted) { - uploadListAdapter.loadUploadItemsFromDb(() -> swipeListRefreshLayout.setRefreshing(false)); - } - return Unit.INSTANCE; - }); } private void setupContent() { From a021fd8dcc146b7381297b3b5307f7ae4234cece Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 19 Jan 2026 10:22:44 +0100 Subject: [PATCH 2/8] add documentation and simplify Signed-off-by: alperozturk96 --- .../jobs/upload/FileUploadBroadcastManager.kt | 82 ++++++++++++++----- .../client/jobs/upload/FileUploadWorker.kt | 22 +---- .../java/com/nextcloud/model/WorkerState.kt | 3 - .../ui/activity/FileDisplayActivity.kt | 21 ++--- .../ui/activity/UploadListActivity.java | 26 +++--- .../ui/fragment/FileDetailFragment.java | 16 ---- .../ui/preview/PreviewImageActivity.kt | 5 +- 7 files changed, 80 insertions(+), 95 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt index ea7f4c3671bc..e7d3233644ed 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt @@ -11,47 +11,85 @@ 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.UploadFileOperation +/** + * Manages local broadcasts related to file upload lifecycle events. + * + * This class is responsible for notifying interested components about + * upload queue changes and upload state transitions (added, started, finished). + * + * All broadcasts are sent via [LocalBroadcastManager]. + */ class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastManager) { + companion object { + private const val TAG = "📣" + "FileUploadBroadcastManager" + + const val UPLOAD_ADDED = "UPLOAD_ADDED" + const val UPLOAD_STARTED = "UPLOAD_START" + const val UPLOAD_FINISHED = "UPLOAD_FINISH" + } + fun sendAdded(context: Context) { - val start = Intent(FileUploadWorker.getUploadsAddedMessage()) - start.setPackage(context.packageName) - broadcastManager.sendBroadcast(start) + Log_OC.d(TAG, "upload added broadcast sent") + val intent = Intent(UPLOAD_ADDED).apply { + setPackage(context.packageName) + } + broadcastManager.sendBroadcast(intent) } fun sendStarted( upload: UploadFileOperation, context: Context, ) { - val start = Intent(FileUploadWorker.getUploadStartMessage()) - start.putExtra(FileUploadWorker.EXTRA_REMOTE_PATH, upload.remotePath) // real remote - start.putExtra(FileUploadWorker.EXTRA_OLD_FILE_PATH, upload.originalStoragePath) - start.putExtra(FileUploadWorker.ACCOUNT_NAME, upload.user.accountName) - start.setPackage(context.packageName) - broadcastManager.sendBroadcast(start) + 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) + setPackage(context.packageName) + } + broadcastManager.sendBroadcast(intent) } + /** + * Sends a broadcast indicating that an upload has finished, either + * successfully or with an error. + * + * ### Triggered when + * - [UploadFileOperation] completes execution + * + * ### Observed by + * - [com.owncloud.android.ui.activity.FileDisplayActivity.UploadFinishReceiver] + * - [com.owncloud.android.ui.activity.UploadListActivity.UploadFinishReceiver] + * - [com.owncloud.android.ui.preview.PreviewImageActivity.UploadFinishReceiver] + * + */ fun sendFinished( upload: UploadFileOperation, uploadResult: RemoteOperationResult<*>, unlinkedFromRemotePath: String?, context: Context ) { - val end = Intent(FileUploadWorker.getUploadFinishMessage()) - // real remote path, after possible automatic renaming - end.putExtra(FileUploadWorker.EXTRA_REMOTE_PATH, upload.remotePath) - if (upload.wasRenamed()) { - end.putExtra(FileUploadWorker.EXTRA_OLD_REMOTE_PATH, upload.oldFile!!.remotePath) - } - end.putExtra(FileUploadWorker.EXTRA_OLD_FILE_PATH, upload.originalStoragePath) - end.putExtra(FileUploadWorker.ACCOUNT_NAME, upload.user.accountName) - end.putExtra(FileUploadWorker.EXTRA_UPLOAD_RESULT, uploadResult.isSuccess) - if (unlinkedFromRemotePath != null) { - end.putExtra(FileUploadWorker.EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath) + Log_OC.d(TAG, "upload finished broadcast sent") + val intent = Intent(UPLOAD_FINISHED).apply { + // real remote path, after possible automatic renaming + putExtra(FileUploadWorker.EXTRA_REMOTE_PATH, upload.remotePath) + if (upload.wasRenamed()) { + upload.oldFile?.let { + putExtra(FileUploadWorker.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) + if (unlinkedFromRemotePath != null) { + putExtra(FileUploadWorker.EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath) + } + setPackage(context.packageName) } - end.setPackage(context.packageName) - broadcastManager.sendBroadcast(end) + broadcastManager.sendBroadcast(intent) } } 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 c3831c859081..8fde4a4c4e6d 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 @@ -22,8 +22,6 @@ import com.nextcloud.client.jobs.BackgroundJobManagerImpl import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager import com.nextcloud.client.network.ConnectivityService import com.nextcloud.client.preferences.AppPreferences -import com.nextcloud.model.WorkerState -import com.nextcloud.model.WorkerStateObserver import com.nextcloud.utils.ForegroundServiceHelper import com.nextcloud.utils.extensions.getPercent import com.nextcloud.utils.extensions.updateStatus @@ -77,10 +75,6 @@ class FileUploadWorker( var currentUploadFileOperation: UploadFileOperation? = null - private const val UPLOADS_ADDED_MESSAGE = "UPLOADS_ADDED" - private const val UPLOAD_START_MESSAGE = "UPLOAD_START" - private const val UPLOAD_FINISH_MESSAGE = "UPLOAD_FINISH" - private const val BATCH_SIZE = 100 const val EXTRA_UPLOAD_RESULT = "RESULT" @@ -96,12 +90,6 @@ class FileUploadWorker( const val LOCAL_BEHAVIOUR_FORGET = 2 const val LOCAL_BEHAVIOUR_DELETE = 3 - fun getUploadsAddedMessage(): String = FileUploadWorker::class.java.name + UPLOADS_ADDED_MESSAGE - - fun getUploadStartMessage(): String = FileUploadWorker::class.java.name + UPLOAD_START_MESSAGE - - fun getUploadFinishMessage(): String = FileUploadWorker::class.java.name + UPLOAD_FINISH_MESSAGE - fun cancelCurrentUpload(remotePath: String, accountName: String, onCompleted: () -> Unit) { currentUploadFileOperation?.let { if (it.remotePath == remotePath && it.user.accountName == accountName) { @@ -143,9 +131,6 @@ class FileUploadWorker( val result = uploadFiles() backgroundJobManager.logEndOfWorker(workerName, result) notificationManager.dismissNotification() - if (result == Result.success()) { - setIdleWorkerState() - } result } catch (t: Throwable) { Log_OC.e(TAG, "Error caught at FileUploadWorker $t") @@ -201,15 +186,10 @@ class FileUploadWorker( private fun cleanup() { Log_OC.e(TAG, "FileUploadWorker stopped") - setIdleWorkerState() currentUploadFileOperation?.cancel(null) notificationManager.dismissNotification() } - private fun setIdleWorkerState() { - WorkerStateObserver.send(WorkerState.FileUploadCompleted(currentUploadFileOperation?.file)) - } - @Suppress("ReturnCount", "LongMethod", "DEPRECATION") private suspend fun uploadFiles(): Result = withContext(Dispatchers.IO) { val accountName = inputData.getString(ACCOUNT) @@ -265,6 +245,7 @@ class FileUploadWorker( return@withContext Result.failure() } + fileUploadBroadcastManager.sendAdded(context) val operation = createUploadFileOperation(upload, user) currentUploadFileOperation = operation fileUploadBroadcastManager.sendStarted(operation, context) @@ -307,7 +288,6 @@ class FileUploadWorker( (totalUploadSize > BATCH_SIZE && currentUploadIndex > 0) && currentUploadIndex % BATCH_SIZE == 0 if (shouldBroadcast) { - // delay broadcast fileUploadBroadcastManager.sendFinished( operation, result, diff --git a/app/src/main/java/com/nextcloud/model/WorkerState.kt b/app/src/main/java/com/nextcloud/model/WorkerState.kt index 7ed07584ac2d..d299045f695e 100644 --- a/app/src/main/java/com/nextcloud/model/WorkerState.kt +++ b/app/src/main/java/com/nextcloud/model/WorkerState.kt @@ -17,8 +17,5 @@ sealed class WorkerState { data class FileDownloadStarted(var user: User?, var currentDownload: DownloadFileOperation?) : WorkerState() data class FileDownloadCompleted(var currentFile: OCFile?) : WorkerState() - data class FileUploadStarted(var user: User?) : WorkerState() - data class FileUploadCompleted(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 c599740c49fb..1f8ccd1bbfbf 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 @@ -65,9 +65,9 @@ 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 -import com.nextcloud.client.jobs.upload.FileUploadWorker.Companion.getUploadFinishMessage import com.nextcloud.client.media.PlayerServiceConnection import com.nextcloud.client.network.ClientFactory.CreationException import com.nextcloud.client.preferences.AppPreferences @@ -75,7 +75,6 @@ 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.FileUploadCompleted import com.nextcloud.model.WorkerState.OfflineOperationsCompleted import com.nextcloud.utils.extensions.getParcelableArgument import com.nextcloud.utils.extensions.isActive @@ -1412,7 +1411,7 @@ class FileDisplayActivity : } private fun registerUploadFinishReceiver() { - val filter = IntentFilter(getUploadFinishMessage()) + val filter = IntentFilter(FileUploadBroadcastManager.UPLOAD_FINISHED) mUploadFinishReceiver = UploadFinishReceiver() mUploadFinishReceiver?.let { localBroadcastManager.registerReceiver(it, filter) @@ -1671,13 +1670,11 @@ class FileDisplayActivity : * Once the file upload has finished -> update view */ private inner class UploadFinishReceiver : BroadcastReceiver() { - /** - * Once the file upload has finished -> update view - * - * - * [BroadcastReceiver] to enable upload feedback in UI - */ + 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 account = getAccount() @@ -1912,12 +1909,6 @@ class FileDisplayActivity : previewFile(state) } - is FileUploadCompleted -> { - state.currentFile?.let { - ocFileListFragment?.adapter?.insertFile(it) - } - } - is OfflineOperationsCompleted -> { refreshCurrentDirectory() } 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 18ad11840361..16e7f2d9fda6 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,8 +25,8 @@ 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.FileUploadHelper; -import com.nextcloud.client.jobs.upload.FileUploadWorker; import com.nextcloud.client.utils.Throttler; import com.owncloud.android.R; import com.owncloud.android.databinding.UploadListLayoutBinding; @@ -56,7 +56,7 @@ public class UploadListActivity extends FileActivity { private static final String TAG = UploadListActivity.class.getSimpleName(); - private UploadMessagesReceiver uploadMessagesReceiver; + private UploadFinishReceiver uploadFinishReceiver; private UploadListAdapter uploadListAdapter; @@ -182,12 +182,12 @@ protected void onResume() { super.onResume(); // Listen for upload messages - uploadMessagesReceiver = new UploadMessagesReceiver(); + uploadFinishReceiver = new UploadFinishReceiver(); IntentFilter uploadIntentFilter = new IntentFilter(); - uploadIntentFilter.addAction(FileUploadWorker.Companion.getUploadsAddedMessage()); - uploadIntentFilter.addAction(FileUploadWorker.Companion.getUploadStartMessage()); - uploadIntentFilter.addAction(FileUploadWorker.Companion.getUploadFinishMessage()); - localBroadcastManager.registerReceiver(uploadMessagesReceiver, uploadIntentFilter); + uploadIntentFilter.addAction(FileUploadBroadcastManager.UPLOAD_ADDED); + uploadIntentFilter.addAction(FileUploadBroadcastManager.UPLOAD_STARTED); + uploadIntentFilter.addAction(FileUploadBroadcastManager.UPLOAD_FINISHED); + localBroadcastManager.registerReceiver(uploadFinishReceiver, uploadIntentFilter); Log_OC.v(TAG, "onResume() end"); @@ -196,9 +196,9 @@ protected void onResume() { @Override protected void onPause() { Log_OC.v(TAG, "onPause() start"); - if (uploadMessagesReceiver != null) { - localBroadcastManager.unregisterReceiver(uploadMessagesReceiver); - uploadMessagesReceiver = null; + if (uploadFinishReceiver != null) { + localBroadcastManager.unregisterReceiver(uploadFinishReceiver); + uploadFinishReceiver = null; } super.onPause(); Log_OC.v(TAG, "onPause() end"); @@ -308,13 +308,9 @@ public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationRe /** * Once the file upload has changed its status -> update uploads list view */ - private class UploadMessagesReceiver extends BroadcastReceiver { - /** - * {@link BroadcastReceiver} to enable syncing feedback in UI - */ + private class UploadFinishReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - throttler.run("update_upload_list", () -> uploadListAdapter.loadUploadItemsFromDb()); } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 595ccacce1e1..0cbf1aa8c700 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -231,7 +231,6 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } binding = FileDetailsFragmentBinding.inflate(inflater, container, false); - observeWorkerState(); view = binding.getRoot(); if (getFile() == null || user == null) { @@ -625,21 +624,6 @@ public void onDownloadProgress(FileDownloadProgressEvent event) { binding.progressBar.invalidate(); } - private void observeWorkerState() { - ActivityExtensionsKt.observeWorker(requireActivity(), state -> { - if (binding == null) { - return Unit.INSTANCE; - } - - if (state instanceof WorkerState.FileUploadStarted) { - binding.progressText.setText(R.string.uploader_upload_in_progress_ticker); - } else { - binding.progressBlock.setVisibility(View.GONE); - } - return Unit.INSTANCE; - }); - } - private void setFileModificationTimestamp(OCFile file, boolean showDetailedTimestamp) { if (showDetailedTimestamp) { binding.lastModificationTimestamp.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())); 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 505951c20993..46f68b5c1631 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 @@ -10,7 +10,6 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter -import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.view.MenuItem import android.view.View @@ -27,7 +26,7 @@ import com.nextcloud.client.editimage.EditImageActivity 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.FileUploadWorker.Companion.getUploadFinishMessage +import com.nextcloud.client.jobs.upload.FileUploadBroadcastManager import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.model.WorkerState import com.nextcloud.utils.extensions.getParcelableArgument @@ -388,7 +387,7 @@ class PreviewImageActivity : localBroadcastManager.registerReceiver(downloadFinishReceiver!!, downloadIntentFilter) val uploadFinishReceiver = UploadFinishReceiver() - val uploadIntentFilter = IntentFilter(getUploadFinishMessage()) + val uploadIntentFilter = IntentFilter(FileUploadBroadcastManager.UPLOAD_FINISHED) localBroadcastManager.registerReceiver(uploadFinishReceiver, uploadIntentFilter) } From 3a89291da687af3ff14af1f35db7b0c990693aef Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 19 Jan 2026 10:40:52 +0100 Subject: [PATCH 3/8] add documentation and simplify Signed-off-by: alperozturk96 --- .../jobs/upload/FileUploadBroadcastManager.kt | 33 ++++++++++++++----- .../client/jobs/upload/FileUploadWorker.kt | 5 ++- .../ui/activity/FileDisplayActivity.kt | 2 +- .../ui/activity/UploadListActivity.java | 17 +++++----- .../ui/preview/PreviewImageActivity.kt | 9 +++-- 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt index e7d3233644ed..acd57bb607cc 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt @@ -1,7 +1,7 @@ /* * Nextcloud - Android Client * - * SPDX-FileCopyrightText: 2023 Alper Ozturk + * SPDX-FileCopyrightText: 2026 Alper Ozturk * SPDX-FileCopyrightText: 2023 Nextcloud GmbH * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only */ @@ -25,13 +25,23 @@ import com.owncloud.android.operations.UploadFileOperation class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastManager) { companion object { - private const val TAG = "📣" + "FileUploadBroadcastManager" + private const val TAG = "📣" + "FileUploadBroadcastManager" const val UPLOAD_ADDED = "UPLOAD_ADDED" - const val UPLOAD_STARTED = "UPLOAD_START" - const val UPLOAD_FINISHED = "UPLOAD_FINISH" + const val UPLOAD_STARTED = "UPLOAD_STARTED" + const val UPLOAD_FINISHED = "UPLOAD_FINISHED" } + /** + * Sends a broadcast indicating that an upload added + * + * ### Triggered when + * - [UploadFileOperation] added + * + * ### Observed by + * - [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 { @@ -40,10 +50,17 @@ class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastMan broadcastManager.sendBroadcast(intent) } - fun sendStarted( - upload: UploadFileOperation, - context: Context, - ) { + /** + * Sends a broadcast indicating that an upload started + * + * ### Triggered when + * - [UploadFileOperation] started + * + * ### Observed by + * - [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 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 8fde4a4c4e6d..8a16f51927e5 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 @@ -284,8 +284,11 @@ class FileUploadWorker( operation: UploadFileOperation, result: RemoteOperationResult<*> ) { + val isLastUpload = currentUploadIndex == totalUploadSize + val shouldBroadcast = - (totalUploadSize > BATCH_SIZE && currentUploadIndex > 0) && currentUploadIndex % BATCH_SIZE == 0 + (currentUploadIndex % BATCH_SIZE == 0 && totalUploadSize > BATCH_SIZE) || + isLastUpload if (shouldBroadcast) { fileUploadBroadcastManager.sendFinished( 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 1f8ccd1bbfbf..79925570bbac 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 @@ -1673,7 +1673,7 @@ class FileDisplayActivity : private val tag = "UploadFinishReceiver" override fun onReceive(context: Context?, intent: Intent) { - Log_OC.d(tag,"upload finish received broadcast") + Log_OC.d(tag, "upload finish received broadcast") val uploadedRemotePath = intent.getStringExtra(FileUploadWorker.EXTRA_REMOTE_PATH) val accountName = intent.getStringExtra(FileUploadWorker.ACCOUNT_NAME) 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 16e7f2d9fda6..7cd2b526c49b 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 @@ -177,9 +177,9 @@ private void refresh() { } @Override - protected void onResume() { - Log_OC.v(TAG, "onResume() start"); - super.onResume(); + protected void onStart() { + Log_OC.v(TAG, "onStart() start"); + super.onStart(); // Listen for upload messages uploadFinishReceiver = new UploadFinishReceiver(); @@ -189,19 +189,18 @@ protected void onResume() { uploadIntentFilter.addAction(FileUploadBroadcastManager.UPLOAD_FINISHED); localBroadcastManager.registerReceiver(uploadFinishReceiver, uploadIntentFilter); - Log_OC.v(TAG, "onResume() end"); - + Log_OC.v(TAG, "onStart() end"); } @Override - protected void onPause() { - Log_OC.v(TAG, "onPause() start"); + protected void onStop() { + Log_OC.v(TAG, "onStop() start"); if (uploadFinishReceiver != null) { localBroadcastManager.unregisterReceiver(uploadFinishReceiver); uploadFinishReceiver = null; } - super.onPause(); - Log_OC.v(TAG, "onPause() end"); + super.onStop(); + Log_OC.v(TAG, "onStop() end"); } @Override 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 46f68b5c1631..3ebde7fb9324 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 @@ -255,6 +255,7 @@ class PreviewImageActivity : public override fun onStart() { super.onStart() + registerReceivers() val optionalUser = user if (optionalUser.isPresent) { var file: OCFile? = file ?: throw IllegalStateException("Instanced with a NULL OCFile") @@ -379,9 +380,7 @@ class PreviewImageActivity : } } - override fun onResume() { - super.onResume() - + private fun registerReceivers() { downloadFinishReceiver = DownloadFinishReceiver() val downloadIntentFilter = IntentFilter(getDownloadFinishMessage()) localBroadcastManager.registerReceiver(downloadFinishReceiver!!, downloadIntentFilter) @@ -391,13 +390,13 @@ class PreviewImageActivity : localBroadcastManager.registerReceiver(uploadFinishReceiver, uploadIntentFilter) } - public override fun onPause() { + public override fun onStop() { if (downloadFinishReceiver != null) { localBroadcastManager.unregisterReceiver(downloadFinishReceiver!!) downloadFinishReceiver = null } - super.onPause() + super.onStop() } private fun backToDisplayActivity() { From d666764af2855ae6702a01d5b0131d868d98bb65 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 19 Jan 2026 10:44:18 +0100 Subject: [PATCH 4/8] delete unused functions Signed-off-by: alperozturk96 --- .../client/jobs/upload/FileUploadWorker.kt | 15 ++++++-------- .../android/ui/adapter/OCFileListAdapter.java | 20 ------------------- 2 files changed, 6 insertions(+), 29 deletions(-) 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 8a16f51927e5..a241a9b8ad53 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 @@ -133,9 +133,13 @@ class FileUploadWorker( notificationManager.dismissNotification() result } catch (t: Throwable) { - Log_OC.e(TAG, "Error caught at FileUploadWorker $t") - cleanup() + Log_OC.e(TAG, "exception $t") + currentUploadFileOperation?.cancel(null) Result.failure() + } finally { + // Ensure all database operations are complete before signaling completion + uploadsStorageManager.notifyObserversNow() + notificationManager.dismissNotification() } private suspend fun trySetForeground() { @@ -183,13 +187,6 @@ class FileUploadWorker( .setSilent(true) .build() - private fun cleanup() { - Log_OC.e(TAG, "FileUploadWorker stopped") - - currentUploadFileOperation?.cancel(null) - notificationManager.dismissNotification() - } - @Suppress("ReturnCount", "LongMethod", "DEPRECATION") private suspend fun uploadFiles(): Result = withContext(Dispatchers.IO) { val accountName = inputData.getString(ACCOUNT) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index 603a4f864ec0..db46f3dc607c 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -1050,24 +1050,4 @@ public void cleanup() { ocFileListDelegate.cleanup(); helper.cleanup(); } - - public void insertFile(@NonNull OCFile file) { - mFiles.add(file); - mFilesAll.add(file); - - // Re-sort to maintain order - if (sortOrder != null) { - boolean foldersBeforeFiles = preferences.isSortFoldersBeforeFiles(); - boolean favoritesFirst = preferences.isSortFavoritesFirst(); - mFiles = sortOrder.sortCloudFiles(mFiles, foldersBeforeFiles, favoritesFirst); - } - - // Find actual position and notify - int position = mFiles.indexOf(file); - if (shouldShowHeader()) { - position++; - } - - notifyItemInserted(position); - } } From 660fb8a2d38895820a8416bdb8ee8dfbeb0e2464 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 19 Jan 2026 11:09:27 +0100 Subject: [PATCH 5/8] add upload finish event for auto upload worker Signed-off-by: alperozturk96 --- .../client/jobs/BackgroundJobFactory.kt | 5 ++-- .../jobs/autoUpload/AutoUploadWorker.kt | 24 +++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) 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 3e67df51fa92..4b1dd1d659b2 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt @@ -25,9 +25,9 @@ import com.nextcloud.client.integrations.deck.DeckApi import com.nextcloud.client.jobs.autoUpload.AutoUploadWorker import com.nextcloud.client.jobs.autoUpload.FileSystemRepository import com.nextcloud.client.jobs.download.FileDownloadWorker +import com.nextcloud.client.jobs.folderDownload.FolderDownloadWorker import com.nextcloud.client.jobs.metadata.MetadataWorker import com.nextcloud.client.jobs.offlineOperations.OfflineOperationsWorker -import com.nextcloud.client.jobs.folderDownload.FolderDownloadWorker import com.nextcloud.client.jobs.upload.FileUploadWorker import com.nextcloud.client.logger.Logger import com.nextcloud.client.network.ConnectivityService @@ -180,7 +180,8 @@ class BackgroundJobFactory @Inject constructor( syncedFolderProvider = syncedFolderProvider, backgroundJobManager = backgroundJobManager.get(), repository = FileSystemRepository(dao = database.fileSystemDao(), context), - viewThemeUtils = viewThemeUtils.get() + viewThemeUtils = viewThemeUtils.get(), + localBroadcastManager = localBroadcastManager.get() ) private fun createOfflineSyncWork(context: Context, params: WorkerParameters): OfflineSyncWork = OfflineSyncWork( 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 77d9efc41695..9a86a9d1fbfe 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 @@ -11,6 +11,7 @@ import android.app.Notification import android.content.Context import android.content.res.Resources import androidx.exifinterface.media.ExifInterface +import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.work.CoroutineWorker import androidx.work.ForegroundInfo import androidx.work.WorkerParameters @@ -21,6 +22,7 @@ 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.FileUploadWorker import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager import com.nextcloud.client.network.ConnectivityService @@ -37,6 +39,7 @@ import com.owncloud.android.db.OCUpload import com.owncloud.android.db.UploadResult import com.owncloud.android.lib.common.OwnCloudAccount import com.owncloud.android.lib.common.OwnCloudClientManagerFactory +import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.operations.UploadFileOperation import com.owncloud.android.ui.activity.SettingsActivity @@ -62,7 +65,8 @@ class AutoUploadWorker( private val syncedFolderProvider: SyncedFolderProvider, private val backgroundJobManager: BackgroundJobManager, private val repository: FileSystemRepository, - val viewThemeUtils: ViewThemeUtils + val viewThemeUtils: ViewThemeUtils, + private val localBroadcastManager: LocalBroadcastManager ) : CoroutineWorker(context, params) { companion object { @@ -74,6 +78,7 @@ class AutoUploadWorker( } private val helper = AutoUploadHelper() + private val fileUploadBroadcastManager = FileUploadBroadcastManager(localBroadcastManager) private lateinit var syncedFolder: SyncedFolder private val notificationManager = AutoUploadNotificationManager(context, viewThemeUtils, NOTIFICATION_ID) @@ -281,6 +286,7 @@ class AutoUploadWorker( updateNotification() var lastId = 0 + while (true) { val filePathsWithIds = repository.getFilePathsWithIds(syncedFolder, lastId) @@ -290,7 +296,7 @@ class AutoUploadWorker( } Log_OC.d(TAG, "Processing batch: lastId=$lastId, count=${filePathsWithIds.size}") - filePathsWithIds.forEach { (path, id) -> + filePathsWithIds.forEachIndexed { batchIndex, (path, id) -> val file = File(path) val localPath = file.absolutePath val remotePath = getRemotePath( @@ -347,6 +353,11 @@ class AutoUploadWorker( "❌ upload failed $localPath (${upload.accountName}): ${result.logMessage}" ) } + + val isLastInBatch = (batchIndex == filePathsWithIds.size - 1) + if (isLastInBatch) { + sendUploadFinishEvent(operation, result) + } } catch (e: Exception) { uploadsStorageManager.updateStatus( uploadEntity, @@ -515,4 +526,13 @@ class AutoUploadWorker( } return lastModificationTime } + + private fun sendUploadFinishEvent(operation: UploadFileOperation, result: RemoteOperationResult<*>) { + fileUploadBroadcastManager.sendFinished( + operation, + result, + operation.oldFile?.storagePath, + context + ) + } } From d05030a73c6bfc60f41aad3d5438f1dc8f245067 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 19 Jan 2026 11:14:00 +0100 Subject: [PATCH 6/8] add upload finish event for auto upload worker Signed-off-by: alperozturk96 --- .../com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9a86a9d1fbfe..a6a016b966fe 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 @@ -66,7 +66,7 @@ class AutoUploadWorker( private val backgroundJobManager: BackgroundJobManager, private val repository: FileSystemRepository, val viewThemeUtils: ViewThemeUtils, - private val localBroadcastManager: LocalBroadcastManager + localBroadcastManager: LocalBroadcastManager ) : CoroutineWorker(context, params) { companion object { From ce4bcdaeebed55dca76ef1e24675f545a392ce87 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 19 Jan 2026 11:14:29 +0100 Subject: [PATCH 7/8] add upload finish event for auto upload worker Signed-off-by: alperozturk96 --- .../nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt index acd57bb607cc..85e533d2b9fd 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt @@ -2,7 +2,7 @@ * Nextcloud - Android Client * * SPDX-FileCopyrightText: 2026 Alper Ozturk - * SPDX-FileCopyrightText: 2023 Nextcloud GmbH + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only */ package com.nextcloud.client.jobs.upload From ee61c40933696689be4364ad26d92d35f903f128 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 19 Jan 2026 11:25:33 +0100 Subject: [PATCH 8/8] add upload started, added event Signed-off-by: alperozturk96 --- .../com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt | 2 ++ .../nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt | 2 +- .../java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) 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 a6a016b966fe..b6d655151bc7 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 @@ -331,10 +331,12 @@ class AutoUploadWorker( uploadEntity = uploadEntity.copy(id = generatedId.toInt()) upload.uploadId = generatedId + fileUploadBroadcastManager.sendAdded(context) val operation = createUploadFileOperation(upload, user) Log_OC.d(TAG, "🕒 uploading: $localPath, id: $generatedId") val result = operation.execute(client) + fileUploadBroadcastManager.sendStarted(operation, context) uploadsStorageManager.updateStatus(uploadEntity, result.isSuccess) UploadErrorNotificationManager.handleResult( diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt index 85e533d2b9fd..0164bcad2001 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadBroadcastManager.kt @@ -33,7 +33,7 @@ class FileUploadBroadcastManager(private val broadcastManager: LocalBroadcastMan } /** - * Sends a broadcast indicating that an upload added + * Sends a broadcast indicating that an upload added into database. * * ### Triggered when * - [UploadFileOperation] added 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 a241a9b8ad53..e50e4dfe08d1 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 @@ -245,7 +245,6 @@ class FileUploadWorker( fileUploadBroadcastManager.sendAdded(context) val operation = createUploadFileOperation(upload, user) currentUploadFileOperation = operation - fileUploadBroadcastManager.sendStarted(operation, context) val currentIndex = (index + 1) val currentUploadIndex = (currentIndex + previouslyUploadedFileSize) @@ -344,6 +343,7 @@ class FileUploadWorker( val file = File(operation.originalStoragePath) val remoteId: String? = operation.file.remoteId task.execute(ThumbnailsCacheManager.ThumbnailGenerationTaskObject(file, remoteId)) + fileUploadBroadcastManager.sendStarted(operation, context) } catch (e: Exception) { Log_OC.e(TAG, "Error uploading", e) result = RemoteOperationResult(e)