From 7eb6b03f204b794e295d6f90db101e792616fd74 Mon Sep 17 00:00:00 2001 From: Benjamin Vadon Date: Thu, 12 Feb 2026 09:52:30 +0100 Subject: [PATCH 1/2] feat: Share notification builder between all uploaded file --- .../infomaniak/drive/data/api/UploadTask.kt | 18 +++++------------- .../drive/data/services/UploadWorker.kt | 14 +++++++++++--- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt b/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt index 9ba586e262..9fe81052ba 100644 --- a/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt +++ b/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt @@ -93,6 +93,8 @@ class UploadTask( private val context: Context, private val uploadFile: UploadFile, private val setProgress: KSuspendFunction1, + private val notificationManagerCompat: NotificationManagerCompat, + private val uploadNotificationBuilder: NotificationCompat.Builder, ) { private val fileChunkSizeManager = FileChunkSizeManager() @@ -104,16 +106,11 @@ class UploadTask( it.tryEmit(Unit) } - private lateinit var notificationManagerCompat: NotificationManagerCompat - private lateinit var uploadNotification: NotificationCompat.Builder private var uploadNotificationElapsedTime = ELAPSED_TIME private var uploadNotificationStartTime = 0L suspend fun start(): Boolean { - notificationManagerCompat = NotificationManagerCompat.from(context) - - uploadNotification = context.uploadProgressNotification() - uploadNotification.apply { + uploadNotificationBuilder.apply { setContentTitle(uploadFile.fileName) notificationManagerCompat.notifyCompat(CURRENT_UPLOAD_ID, this) } @@ -146,7 +143,6 @@ class UploadTask( Sentry.captureException(exception) { scope -> scope.level = SentryLevel.WARNING } } catch (exception: UploadNotTerminated) { SentryLog.w(TAG, "upload not terminated", exception) - notificationManagerCompat.cancel(CURRENT_UPLOAD_ID) Sentry.captureException(exception) { scope -> scope.level = SentryLevel.WARNING } } catch (exception: QuotaExceededException) { if (UploadFile.getAppSyncSettings()?.driveId == uploadFile.driveId) { @@ -156,8 +152,6 @@ class UploadTask( } catch (exception: Exception) { exception.printStackTrace() throw exception - } finally { - notificationManagerCompat.cancel(CURRENT_UPLOAD_ID) } return false } @@ -286,7 +280,7 @@ class UploadTask( } private suspend fun finishUpload(uri: Uri) { - uploadNotification.apply { + uploadNotificationBuilder.apply { setOngoing(false) setContentText("100%") setSmallIcon(android.R.drawable.stat_sys_upload_done) @@ -295,7 +289,6 @@ class UploadTask( } shareProgress(100, true) UploadFile.uploadFinished(uri) - notificationManagerCompat.cancel(CURRENT_UPLOAD_ID) } private suspend fun uploadChunk( @@ -409,7 +402,6 @@ class UploadTask( } } val bodyResponse = String(bytes) - notificationManagerCompat.cancel(CURRENT_UPLOAD_ID) val apiResponse = try { gson.fromJson(bodyResponse, ApiResponse::class.java)!! // Might be empty when http 502 Bad gateway happens } catch (_: Exception) { @@ -432,7 +424,7 @@ class UploadTask( currentCoroutineContext().ensureActive() if (uploadNotificationElapsedTime >= ELAPSED_TIME) { - uploadNotification.apply { + uploadNotificationBuilder.apply { setContentIntent(uploadFile.progressPendingIntent()) setContentText("${progress}%") setProgress(100, progress, false) diff --git a/app/src/main/java/com/infomaniak/drive/data/services/UploadWorker.kt b/app/src/main/java/com/infomaniak/drive/data/services/UploadWorker.kt index 6cbaf31ae8..05021b37dc 100644 --- a/app/src/main/java/com/infomaniak/drive/data/services/UploadWorker.kt +++ b/app/src/main/java/com/infomaniak/drive/data/services/UploadWorker.kt @@ -41,6 +41,7 @@ import com.infomaniak.core.legacy.utils.getFileName import com.infomaniak.core.legacy.utils.getFileSize import com.infomaniak.core.legacy.utils.hasPermissions import com.infomaniak.core.network.api.ApiController.gson +import com.infomaniak.core.notifications.cancelNotification import com.infomaniak.core.notifications.notifyCompat import com.infomaniak.core.sentry.SentryLog import com.infomaniak.drive.R @@ -61,7 +62,7 @@ import com.infomaniak.drive.utils.MediaFoldersProvider.IMAGES_BUCKET_ID import com.infomaniak.drive.utils.MediaFoldersProvider.VIDEO_BUCKET_ID import com.infomaniak.drive.utils.NotificationUtils import com.infomaniak.drive.utils.NotificationUtils.buildGeneralNotification -import com.infomaniak.drive.utils.NotificationUtils.cancelNotification +import com.infomaniak.drive.utils.NotificationUtils.uploadProgressNotification import com.infomaniak.drive.utils.SyncUtils import com.infomaniak.drive.utils.getAvailableMemory import com.infomaniak.drive.utils.uri @@ -94,6 +95,8 @@ class UploadWorker(appContext: Context, params: WorkerParameters) : CoroutineWor private var pendingCount = 0 private val readMediaPermissions = DrivePermissions.permissionsFor(DrivePermissions.Type.ReadingMediaForSync).toTypedArray() + private val notificationManagerCompat by lazy { NotificationManagerCompat.from(applicationContext) } + private val uploadNotificationBuilder by lazy { applicationContext.uploadProgressNotification() } override suspend fun doWork(): Result { @@ -282,7 +285,6 @@ class UploadWorker(appContext: Context, params: WorkerParameters) : CoroutineWor val uri = getUriObject() currentUploadFile = this@upload - applicationContext.cancelNotification(NotificationUtils.CURRENT_UPLOAD_ID) updateUploadCountNotification() try { @@ -347,7 +349,13 @@ class UploadWorker(appContext: Context, params: WorkerParameters) : CoroutineWor SentryLog.d(TAG, "startUploadFile (size: $fileSize)") - return UploadTask(context = applicationContext, uploadFile = this, setProgress = ::setProgress).run { + return UploadTask( + context = applicationContext, + uploadFile = this, + setProgress = ::setProgress, + notificationManagerCompat = notificationManagerCompat, + uploadNotificationBuilder = uploadNotificationBuilder + ).run { currentUploadTask = this start().also { isUploaded -> if (isUploaded) { From ad67cd60d9688b1906bde80a4411e2ff60151409 Mon Sep 17 00:00:00 2001 From: Benjamin Vadon Date: Thu, 12 Feb 2026 10:20:22 +0100 Subject: [PATCH 2/2] feat: Clean shared notification builder for each file --- .../main/java/com/infomaniak/drive/data/api/UploadTask.kt | 6 ++++-- .../java/com/infomaniak/drive/utils/NotificationUtils.kt | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt b/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt index 9fe81052ba..2871d83950 100644 --- a/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt +++ b/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt @@ -48,7 +48,6 @@ import com.infomaniak.drive.data.services.UploadWorker import com.infomaniak.drive.data.sync.UploadNotifications.progressPendingIntent import com.infomaniak.drive.utils.NotificationUtils.CURRENT_UPLOAD_ID import com.infomaniak.drive.utils.NotificationUtils.ELAPSED_TIME -import com.infomaniak.drive.utils.NotificationUtils.uploadProgressNotification import io.ktor.client.HttpClient import io.ktor.client.engine.okhttp.OkHttp import io.ktor.client.plugins.onUpload @@ -112,6 +111,10 @@ class UploadTask( suspend fun start(): Boolean { uploadNotificationBuilder.apply { setContentTitle(uploadFile.fileName) + setOngoing(true) + setContentText(null) + setProgress(0, 0, false) + setSmallIcon(android.R.drawable.stat_sys_upload) notificationManagerCompat.notifyCompat(CURRENT_UPLOAD_ID, this) } @@ -282,7 +285,6 @@ class UploadTask( private suspend fun finishUpload(uri: Uri) { uploadNotificationBuilder.apply { setOngoing(false) - setContentText("100%") setSmallIcon(android.R.drawable.stat_sys_upload_done) setProgress(0, 0, false) notificationManagerCompat.notifyCompat(CURRENT_UPLOAD_ID, this) diff --git a/app/src/main/java/com/infomaniak/drive/utils/NotificationUtils.kt b/app/src/main/java/com/infomaniak/drive/utils/NotificationUtils.kt index 30d6f10cbc..38d71c77eb 100644 --- a/app/src/main/java/com/infomaniak/drive/utils/NotificationUtils.kt +++ b/app/src/main/java/com/infomaniak/drive/utils/NotificationUtils.kt @@ -64,7 +64,6 @@ object NotificationUtils : NotificationUtilsCore() { setTicker(ticker) setSmallIcon(icon) setAutoCancel(true) - setContentText("0%") setOnlyAlertOnce(true) setProgress(100, 0, true) }