diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/job/SyncService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/job/SyncService.kt index 724b0e1360..df050d7f30 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/job/SyncService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/job/SyncService.kt @@ -18,6 +18,7 @@ package im.vector.matrix.android.internal.session.sync.job import android.app.Service import android.content.Intent import android.os.IBinder +import im.vector.matrix.android.BuildConfig import im.vector.matrix.android.api.Matrix import im.vector.matrix.android.api.failure.isTokenError import im.vector.matrix.android.api.session.Session @@ -56,29 +57,15 @@ abstract class SyncService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { Timber.i("onStartCommand $intent") - intent?.let { - val matrix = Matrix.getInstance(applicationContext) - val safeSessionId = it.getStringExtra(EXTRA_SESSION_ID) ?: return@let - val sessionComponent = matrix.sessionManager.getSessionComponent(safeSessionId) - ?: return@let - session = sessionComponent.session() - sessionId = safeSessionId - syncTask = sessionComponent.syncTask() - isInitialSync = !session.hasAlreadySynced() - networkConnectivityChecker = sessionComponent.networkConnectivityChecker() - taskExecutor = sessionComponent.taskExecutor() - coroutineDispatchers = sessionComponent.coroutineDispatchers() - backgroundDetectionObserver = matrix.backgroundDetectionObserver - if (isRunning.get()) { - Timber.i("Received a start while was already syncing... ignore") - } else { - isRunning.set(true) - serviceScope.launch(coroutineDispatchers.io) { - doSync() - } - } + val isInit = initialize(intent) + if (isInit) { + onStart(isInitialSync) + doSyncIfNotAlreadyRunning() + } else { + // We should start and stop as we have to ensure to call Service.startForeground() + onStart(isInitialSync) + stopMe() } - onStart(isInitialSync) // No intent just start the service, an alarm will should call with intent return START_STICKY } @@ -98,6 +85,17 @@ abstract class SyncService : Service() { stopSelf() } + private fun doSyncIfNotAlreadyRunning() { + if (isRunning.get()) { + Timber.i("Received a start while was already syncing... ignore") + } else { + isRunning.set(true) + serviceScope.launch(coroutineDispatchers.io) { + doSync() + } + } + } + private suspend fun doSync() { if (!networkConnectivityChecker.hasInternetAccess()) { Timber.v("No network reschedule to avoid wasting resources") @@ -129,6 +127,33 @@ abstract class SyncService : Service() { } } + private fun initialize(intent: Intent?): Boolean { + if (intent == null) { + return false + } + val matrix = Matrix.getInstance(applicationContext) + val safeSessionId = intent.getStringExtra(EXTRA_SESSION_ID) ?: return false + try { + val sessionComponent = matrix.sessionManager.getSessionComponent(safeSessionId) + ?: throw IllegalStateException("You should have a session to make it work") + session = sessionComponent.session() + sessionId = safeSessionId + syncTask = sessionComponent.syncTask() + isInitialSync = !session.hasAlreadySynced() + networkConnectivityChecker = sessionComponent.networkConnectivityChecker() + taskExecutor = sessionComponent.taskExecutor() + coroutineDispatchers = sessionComponent.coroutineDispatchers() + backgroundDetectionObserver = matrix.backgroundDetectionObserver + return true + } catch (exception: Exception) { + if (BuildConfig.DEBUG) { + throw exception + } + Timber.e(exception, "An exception occurred during initialisation") + return false + } + } + abstract fun onStart(isInitialSync: Boolean) abstract fun onRescheduleAsked(sessionId: String, isInitialSync: Boolean, delay: Long) diff --git a/vector/src/fdroid/java/im/vector/riotx/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt b/vector/src/fdroid/java/im/vector/riotx/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt index 207776b530..031c2bc5e7 100644 --- a/vector/src/fdroid/java/im/vector/riotx/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt +++ b/vector/src/fdroid/java/im/vector/riotx/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt @@ -31,7 +31,7 @@ class OnApplicationUpgradeOrRebootReceiver : BroadcastReceiver() { if (appContext is HasVectorInjector) { val activeSession = appContext.injector().activeSessionHolder().getSafeActiveSession() if (activeSession != null) { - AlarmSyncBroadcastReceiver.scheduleAlarm(context, activeSession.myUserId, 10) + AlarmSyncBroadcastReceiver.scheduleAlarm(context, activeSession.sessionId, 10) } } } diff --git a/vector/src/fdroid/java/im/vector/riotx/push/fcm/FcmHelper.kt b/vector/src/fdroid/java/im/vector/riotx/push/fcm/FcmHelper.kt index bfd8850d00..9b32c8be98 100755 --- a/vector/src/fdroid/java/im/vector/riotx/push/fcm/FcmHelper.kt +++ b/vector/src/fdroid/java/im/vector/riotx/push/fcm/FcmHelper.kt @@ -69,7 +69,7 @@ object FcmHelper { // We need to use alarm in this mode if (vectorPreferences.areNotificationEnabledForDevice() && activeSessionHolder.hasActiveSession()) { val currentSession = activeSessionHolder.getActiveSession() - AlarmSyncBroadcastReceiver.scheduleAlarm(context, currentSession.myUserId, 4_000L) + AlarmSyncBroadcastReceiver.scheduleAlarm(context, currentSession.sessionId, 4_000L) Timber.i("Alarm scheduled to restart service") } }