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..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 @@ -93,6 +92,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,17 +105,16 @@ 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) + setOngoing(true) + setContentText(null) + setProgress(0, 0, false) + setSmallIcon(android.R.drawable.stat_sys_upload) notificationManagerCompat.notifyCompat(CURRENT_UPLOAD_ID, this) } @@ -146,7 +146,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 +155,6 @@ class UploadTask( } catch (exception: Exception) { exception.printStackTrace() throw exception - } finally { - notificationManagerCompat.cancel(CURRENT_UPLOAD_ID) } return false } @@ -286,16 +283,14 @@ class UploadTask( } private suspend fun finishUpload(uri: Uri) { - uploadNotification.apply { + uploadNotificationBuilder.apply { setOngoing(false) - setContentText("100%") setSmallIcon(android.R.drawable.stat_sys_upload_done) setProgress(0, 0, false) notificationManagerCompat.notifyCompat(CURRENT_UPLOAD_ID, this) } shareProgress(100, true) UploadFile.uploadFinished(uri) - notificationManagerCompat.cancel(CURRENT_UPLOAD_ID) } private suspend fun uploadChunk( @@ -409,7 +404,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 +426,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) { 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) }