From 08b12d8624f53363edc33c4153999d40ea91c8a3 Mon Sep 17 00:00:00 2001 From: Jonathan Klee Date: Fri, 28 Feb 2025 08:38:35 +0100 Subject: [PATCH] fix: Prevent from adding upload tasks if quota reached --- .../e/drive/synchronization/SyncProxy.kt | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/drive/synchronization/SyncProxy.kt b/app/src/main/java/foundation/e/drive/synchronization/SyncProxy.kt index 903d5223..579a48d9 100644 --- a/app/src/main/java/foundation/e/drive/synchronization/SyncProxy.kt +++ b/app/src/main/java/foundation/e/drive/synchronization/SyncProxy.kt @@ -7,12 +7,16 @@ */ package foundation.e.drive.synchronization +import android.accounts.AccountManager import android.app.Application import android.content.Context import foundation.e.drive.EdriveApplication +import foundation.e.drive.R import foundation.e.drive.database.FailedSyncPrefsManager import foundation.e.drive.models.SyncRequest import foundation.e.drive.models.SyncWrapper +import foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_RELATIVE_QUOTA_KEY +import foundation.e.drive.utils.CommonUtils import foundation.e.drive.work.WorkLauncher import timber.log.Timber import java.util.concurrent.ConcurrentHashMap @@ -53,6 +57,8 @@ interface SyncManager { * @author Vincent Bourgmayer */ object SyncProxy: SyncRequestCollector, SyncManager { + private const val MAX_RELATIVE_QUOTA = 99.0 + private val syncRequestQueue: ConcurrentLinkedQueue = ConcurrentLinkedQueue() //could we use channel instead ? private val startedRequests: ConcurrentHashMap = ConcurrentHashMap() @@ -71,6 +77,8 @@ object SyncProxy: SyncRequestCollector, SyncManager { return false } + if (skipUploadIfQuotaReached(request, context)) return false + if (skipBecauseOfPreviousFail(request, context)) return false syncRequestQueue.remove(request) @@ -95,7 +103,8 @@ object SyncProxy: SyncRequestCollector, SyncManager { } requests.removeIf { request: SyncRequest? -> - skipBecauseOfPreviousFail(request!!, context) + skipUploadIfQuotaReached(request!!, context) || + skipBecauseOfPreviousFail(request, context) } syncRequestQueue.removeAll(requests.toSet()) @@ -207,6 +216,23 @@ object SyncProxy: SyncRequestCollector, SyncManager { return timeStamp < failedSyncPref.getLastFailureTimeForFile(fileStateId) + delay } + private fun skipUploadIfQuotaReached(request: SyncRequest, context: Context): Boolean { + if (request.operationType != SyncRequest.Type.UPLOAD) { + return false + } + + val accountManager = AccountManager.get(context) + val account = CommonUtils.getAccount( + context.getString(R.string.eelo_account_type), + accountManager + ) ?: return true + + val relativeQuota = accountManager.getUserData(account, ACCOUNT_DATA_RELATIVE_QUOTA_KEY) + ?: "$MAX_RELATIVE_QUOTA" + + return relativeQuota.toFloat() >= MAX_RELATIVE_QUOTA + } + override fun pollSyncRequest(): SyncRequest? { return syncRequestQueue.poll() } -- GitLab