Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 25 additions & 24 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -155,30 +155,31 @@ sentry {

dependencies {

implementation(libs.infomaniak.core)
implementation(libs.infomaniak.core.auth)
implementation(libs.infomaniak.core.avatar)
implementation(libs.infomaniak.core.coil)
implementation(libs.infomaniak.core.crossapplogin)
implementation(libs.infomaniak.core.fragmentnavigation)
implementation(libs.infomaniak.core.inappreview)
implementation(libs.infomaniak.core.inappupdate)
implementation(libs.infomaniak.core.ksuite)
implementation(libs.infomaniak.core.ksuite.pro)
implementation(libs.infomaniak.core.ksuite.myksuite)
implementation(libs.infomaniak.core.ktor)
implementation(libs.infomaniak.core.matomo)
implementation(libs.infomaniak.core.network)
implementation(libs.infomaniak.core.recyclerview)
implementation(libs.infomaniak.core.sentry)
implementation(libs.infomaniak.core.thumbnails)
implementation(libs.infomaniak.core.twofactorauth.back)
implementation(libs.infomaniak.core.twofactorauth.front)
implementation(libs.infomaniak.core.ui)
implementation(libs.infomaniak.core.ui.compose.basics)
implementation(libs.infomaniak.core.ui.compose.margin)
implementation(libs.infomaniak.core.ui.compose.materialthemefromxml)
implementation(libs.infomaniak.core.ui.view.edgetoedge)
implementation(core.infomaniak.core.auth)
implementation(core.infomaniak.core.avatar)
implementation(core.infomaniak.core.coil)
implementation(core.infomaniak.core.common)
implementation(core.infomaniak.core.crossapplogin)
implementation(core.infomaniak.core.fragmentnavigation)
implementation(core.infomaniak.core.inappreview)
implementation(core.infomaniak.core.inappupdate)
implementation(core.infomaniak.core.ksuite)
implementation(core.infomaniak.core.ksuite.myksuite)
implementation(core.infomaniak.core.ksuite.pro)
implementation(core.infomaniak.core.ktor)
implementation(core.infomaniak.core.matomo)
implementation(core.infomaniak.core.network)
implementation(core.infomaniak.core.notifications)
implementation(core.infomaniak.core.recyclerview)
implementation(core.infomaniak.core.sentry)
implementation(core.infomaniak.core.thumbnails)
implementation(core.infomaniak.core.twofactorauth.back)
implementation(core.infomaniak.core.twofactorauth.front)
implementation(core.infomaniak.core.ui)
implementation(core.infomaniak.core.ui.compose.basics)
implementation(core.infomaniak.core.ui.compose.margin)
implementation(core.infomaniak.core.ui.compose.materialthemefromxml)
implementation(core.infomaniak.core.ui.view.edgetoedge)

implementation(project(":Core:Legacy"))
implementation(project(":Core:Legacy:AppLock"))
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/infomaniak/drive/MainApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import com.infomaniak.core.legacy.utils.NotificationUtilsCore.Companion.PENDING_
import com.infomaniak.core.network.NetworkConfiguration
import com.infomaniak.core.network.api.ApiController
import com.infomaniak.core.network.networking.HttpClientConfig
import com.infomaniak.core.notifications.notifyCompat
import com.infomaniak.core.sentry.SentryConfig.configureSentry
import com.infomaniak.core.twofactorauth.back.TwoFactorAuthManager
import com.infomaniak.drive.GeniusScanUtils.initGeniusScanSdk
Expand All @@ -67,7 +68,6 @@ import com.infomaniak.drive.utils.AccountUtils
import com.infomaniak.drive.utils.MyKSuiteDataUtils
import com.infomaniak.drive.utils.NotificationUtils.buildGeneralNotification
import com.infomaniak.drive.utils.NotificationUtils.initNotificationChannel
import com.infomaniak.drive.utils.NotificationUtils.notifyCompat
import dagger.hilt.android.HiltAndroidApp
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
Expand Down Expand Up @@ -239,7 +239,7 @@ open class MainApplication : Application(), SingletonImageLoader.Factory, Defaul
val notificationManagerCompat = NotificationManagerCompat.from(this)
buildGeneralNotification(getString(R.string.refreshTokenError)).apply {
setContentIntent(pendingIntent)
notificationManagerCompat.notifyCompat(this@MainApplication, hashCode, build())
notificationManagerCompat.notifyCompat(hashCode, this)
}

applicationScope.launch {
Expand Down
36 changes: 15 additions & 21 deletions app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Infomaniak kDrive - Android
* Copyright (C) 2022-2025 Infomaniak Network SA
* Copyright (C) 2022-2026 Infomaniak Network SA
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -36,6 +36,7 @@ import com.infomaniak.core.network.models.ApiResponse
import com.infomaniak.core.network.networking.HttpUtils
import com.infomaniak.core.network.networking.ManualAuthorizationRequired
import com.infomaniak.core.network.utils.ApiErrorCode.Companion.translateError
import com.infomaniak.core.notifications.notifyCompat
import com.infomaniak.core.sentry.SentryLog
import com.infomaniak.drive.data.api.ApiRepository.uploadEmptyFile
import com.infomaniak.drive.data.api.ApiRoutes.uploadChunkUrl
Expand All @@ -47,8 +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.notifyCompat
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
Expand Down Expand Up @@ -93,6 +92,8 @@ class UploadTask(
private val context: Context,
private val uploadFile: UploadFile,
private val setProgress: KSuspendFunction1<Data, Unit>,
private val notificationManagerCompat: NotificationManagerCompat,
private val uploadNotificationBuilder: NotificationCompat.Builder,
) {

private val fileChunkSizeManager = FileChunkSizeManager()
Expand All @@ -104,18 +105,17 @@ 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(context, CURRENT_UPLOAD_ID, build())
setOngoing(true)
setContentText(null)
setProgress(0, 0, false)
setSmallIcon(android.R.drawable.stat_sys_upload)
notificationManagerCompat.notifyCompat(CURRENT_UPLOAD_ID, this)
}

try {
Expand Down Expand Up @@ -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) {
Expand All @@ -156,8 +155,6 @@ class UploadTask(
} catch (exception: Exception) {
exception.printStackTrace()
throw exception
} finally {
notificationManagerCompat.cancel(CURRENT_UPLOAD_ID)
}
return false
}
Expand Down Expand Up @@ -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(context, CURRENT_UPLOAD_ID, build())
notificationManagerCompat.notifyCompat(CURRENT_UPLOAD_ID, this)
}
shareProgress(100, true)
UploadFile.uploadFinished(uri)
notificationManagerCompat.cancel(CURRENT_UPLOAD_ID)
}

private suspend fun uploadChunk(
Expand Down Expand Up @@ -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) {
Expand All @@ -432,11 +426,11 @@ class UploadTask(
currentCoroutineContext().ensureActive()

if (uploadNotificationElapsedTime >= ELAPSED_TIME) {
uploadNotification.apply {
setContentIntent(uploadFile.progressPendingIntent(context))
uploadNotificationBuilder.apply {
setContentIntent(uploadFile.progressPendingIntent())
setContentText("${progress}%")
setProgress(100, progress, false)
notificationManagerCompat.notifyCompat(context, CURRENT_UPLOAD_ID, build())
notificationManagerCompat.notifyCompat(CURRENT_UPLOAD_ID, this)
uploadNotificationStartTime = System.currentTimeMillis()
uploadNotificationElapsedTime = 0L
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import com.infomaniak.core.common.cancellable
import com.infomaniak.core.legacy.utils.NotificationUtilsCore
import com.infomaniak.core.network.api.ApiController
import com.infomaniak.core.network.models.ApiResponse
import com.infomaniak.core.notifications.notifyCompat
import com.infomaniak.core.sentry.SentryLog
import com.infomaniak.drive.R
import com.infomaniak.drive.data.api.ApiRepository
Expand All @@ -57,7 +58,6 @@ import com.infomaniak.drive.utils.DownloadOfflineFileManager
import com.infomaniak.drive.utils.IOFile
import com.infomaniak.drive.utils.NotificationUtils.buildGeneralNotification
import com.infomaniak.drive.utils.NotificationUtils.cancelNotification
import com.infomaniak.drive.utils.NotificationUtils.notifyCompat
import com.infomaniak.drive.utils.SyncUtils.syncImmediately
import com.infomaniak.drive.utils.Utils
import com.infomaniak.drive.utils.copyToCancellable
Expand Down Expand Up @@ -722,7 +722,7 @@ class CloudStorageProvider : DocumentsProvider() {
NotificationUtilsCore.PENDING_INTENT_FLAGS,
),
)
NotificationManagerCompat.from(context).notifyCompat(context, syncPermissionNotifId, build())
NotificationManagerCompat.from(context).notifyCompat(syncPermissionNotifId, this)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Infomaniak kDrive - Android
* Copyright (C) 2022-2024 Infomaniak Network SA
* Copyright (C) 2022-2026 Infomaniak Network SA
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand All @@ -26,15 +26,15 @@ import androidx.concurrent.futures.CallbackToFutureAdapter
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.lifecycle.Observer
import androidx.work.ForegroundInfo
import androidx.work.ListenableWorker
import androidx.work.WorkerParameters
import com.google.common.util.concurrent.ListenableFuture
import com.infomaniak.core.legacy.utils.Utils.createRefreshTimer
import com.infomaniak.core.notifications.notifyCompat
import com.infomaniak.drive.data.models.ActionProgress
import com.infomaniak.drive.data.models.BulkOperationType
import com.infomaniak.drive.data.models.MqttNotification
import com.infomaniak.drive.utils.NotificationUtils.notifyCompat
import com.infomaniak.drive.utils.ForegroundInfoExt
import java.util.Date
import java.util.UUID

Expand Down Expand Up @@ -63,17 +63,16 @@ class BulkOperationWorker(context: Context, workerParams: WorkerParameters) : Li
setContentTitle(applicationContext.getString(bulkOperationType.title, 0, totalFiles))
}

if (SDK_INT >= 29) {
val notification = createNotificationBuilder().apply {
if (SDK_INT >= 31) {
foregroundServiceBehavior = Notification.FOREGROUND_SERVICE_IMMEDIATE
}
}.build()
setForegroundAsync(ForegroundInfo(notificationId, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC))
} else {
setForegroundAsync(ForegroundInfo(notificationId, createNotificationBuilder().build()))
}
val notification = createNotificationBuilder().apply {
if (SDK_INT >= 31) {
foregroundServiceBehavior = Notification.FOREGROUND_SERVICE_IMMEDIATE
}
}.build()

val foregroundInfo = ForegroundInfoExt.build(notificationId, notification) {
ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
}
setForegroundAsync(foregroundInfo)
lastReception = Date()

return CallbackToFutureAdapter.getFuture { completer ->
Expand All @@ -99,9 +98,8 @@ class BulkOperationWorker(context: Context, workerParams: WorkerParameters) : Li
onOperationFinished()
} else {
notificationManagerCompat.notifyCompat(
context = applicationContext,
notificationId = notificationId,
build = createNotificationBuilder(notification.progress).build()
builder = createNotificationBuilder(notification.progress)
)
}
}
Expand Down
Loading