Loading app/src/main/java/foundation/e/drive/synchronization/SyncProxy.kt +27 −1 Original line number Original line Diff line number Diff line Loading @@ -7,12 +7,16 @@ */ */ package foundation.e.drive.synchronization package foundation.e.drive.synchronization import android.accounts.AccountManager import android.app.Application import android.app.Application import android.content.Context import android.content.Context import foundation.e.drive.EdriveApplication import foundation.e.drive.EdriveApplication import foundation.e.drive.R import foundation.e.drive.database.FailedSyncPrefsManager import foundation.e.drive.database.FailedSyncPrefsManager import foundation.e.drive.models.SyncRequest import foundation.e.drive.models.SyncRequest import foundation.e.drive.models.SyncWrapper 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 foundation.e.drive.work.WorkLauncher import timber.log.Timber import timber.log.Timber import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap Loading Loading @@ -53,6 +57,8 @@ interface SyncManager { * @author Vincent Bourgmayer * @author Vincent Bourgmayer */ */ object SyncProxy: SyncRequestCollector, SyncManager { object SyncProxy: SyncRequestCollector, SyncManager { private const val MAX_RELATIVE_QUOTA = 99.0 private val syncRequestQueue: ConcurrentLinkedQueue<SyncRequest> = ConcurrentLinkedQueue() //could we use channel instead ? private val syncRequestQueue: ConcurrentLinkedQueue<SyncRequest> = ConcurrentLinkedQueue() //could we use channel instead ? private val startedRequests: ConcurrentHashMap<String, SyncWrapper> = ConcurrentHashMap() private val startedRequests: ConcurrentHashMap<String, SyncWrapper> = ConcurrentHashMap() Loading @@ -71,6 +77,8 @@ object SyncProxy: SyncRequestCollector, SyncManager { return false return false } } if (skipUploadIfQuotaReached(request, context)) return false if (skipBecauseOfPreviousFail(request, context)) return false if (skipBecauseOfPreviousFail(request, context)) return false syncRequestQueue.remove(request) syncRequestQueue.remove(request) Loading @@ -95,7 +103,8 @@ object SyncProxy: SyncRequestCollector, SyncManager { } } requests.removeIf { request: SyncRequest? -> requests.removeIf { request: SyncRequest? -> skipBecauseOfPreviousFail(request!!, context) skipUploadIfQuotaReached(request!!, context) || skipBecauseOfPreviousFail(request, context) } } syncRequestQueue.removeAll(requests.toSet()) syncRequestQueue.removeAll(requests.toSet()) Loading Loading @@ -207,6 +216,23 @@ object SyncProxy: SyncRequestCollector, SyncManager { return timeStamp < failedSyncPref.getLastFailureTimeForFile(fileStateId) + delay 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? { override fun pollSyncRequest(): SyncRequest? { return syncRequestQueue.poll() return syncRequestQueue.poll() } } Loading Loading
app/src/main/java/foundation/e/drive/synchronization/SyncProxy.kt +27 −1 Original line number Original line Diff line number Diff line Loading @@ -7,12 +7,16 @@ */ */ package foundation.e.drive.synchronization package foundation.e.drive.synchronization import android.accounts.AccountManager import android.app.Application import android.app.Application import android.content.Context import android.content.Context import foundation.e.drive.EdriveApplication import foundation.e.drive.EdriveApplication import foundation.e.drive.R import foundation.e.drive.database.FailedSyncPrefsManager import foundation.e.drive.database.FailedSyncPrefsManager import foundation.e.drive.models.SyncRequest import foundation.e.drive.models.SyncRequest import foundation.e.drive.models.SyncWrapper 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 foundation.e.drive.work.WorkLauncher import timber.log.Timber import timber.log.Timber import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap Loading Loading @@ -53,6 +57,8 @@ interface SyncManager { * @author Vincent Bourgmayer * @author Vincent Bourgmayer */ */ object SyncProxy: SyncRequestCollector, SyncManager { object SyncProxy: SyncRequestCollector, SyncManager { private const val MAX_RELATIVE_QUOTA = 99.0 private val syncRequestQueue: ConcurrentLinkedQueue<SyncRequest> = ConcurrentLinkedQueue() //could we use channel instead ? private val syncRequestQueue: ConcurrentLinkedQueue<SyncRequest> = ConcurrentLinkedQueue() //could we use channel instead ? private val startedRequests: ConcurrentHashMap<String, SyncWrapper> = ConcurrentHashMap() private val startedRequests: ConcurrentHashMap<String, SyncWrapper> = ConcurrentHashMap() Loading @@ -71,6 +77,8 @@ object SyncProxy: SyncRequestCollector, SyncManager { return false return false } } if (skipUploadIfQuotaReached(request, context)) return false if (skipBecauseOfPreviousFail(request, context)) return false if (skipBecauseOfPreviousFail(request, context)) return false syncRequestQueue.remove(request) syncRequestQueue.remove(request) Loading @@ -95,7 +103,8 @@ object SyncProxy: SyncRequestCollector, SyncManager { } } requests.removeIf { request: SyncRequest? -> requests.removeIf { request: SyncRequest? -> skipBecauseOfPreviousFail(request!!, context) skipUploadIfQuotaReached(request!!, context) || skipBecauseOfPreviousFail(request, context) } } syncRequestQueue.removeAll(requests.toSet()) syncRequestQueue.removeAll(requests.toSet()) Loading Loading @@ -207,6 +216,23 @@ object SyncProxy: SyncRequestCollector, SyncManager { return timeStamp < failedSyncPref.getLastFailureTimeForFile(fileStateId) + delay 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? { override fun pollSyncRequest(): SyncRequest? { return syncRequestQueue.poll() return syncRequestQueue.poll() } } Loading