diff --git a/vector/src/fdroid/java/im/vector/app/fdroid/service/FDroidGuardServiceStarter.kt b/vector/src/fdroid/java/im/vector/app/fdroid/service/FDroidGuardServiceStarter.kt index 61fd70adc1..f75ce4511b 100644 --- a/vector/src/fdroid/java/im/vector/app/fdroid/service/FDroidGuardServiceStarter.kt +++ b/vector/src/fdroid/java/im/vector/app/fdroid/service/FDroidGuardServiceStarter.kt @@ -42,6 +42,7 @@ class FDroidGuardServiceStarter @Inject constructor( } override fun stop() { + Timber.i("## Sync: stopping GuardService") val intent = Intent(appContext, GuardAndroidService::class.java) appContext.stopService(intent) } diff --git a/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt b/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt index 724d3c7aa6..91029b2c82 100644 --- a/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt +++ b/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt @@ -250,6 +250,10 @@ class UnifiedPushHelper @Inject constructor( return UnifiedPush.getDistributor(context) == context.packageName && !fcmHelper.isFirebaseAvailable() } + fun doesBackgroundSync(): Boolean { + return isBackgroundSync() || (vectorPreferences.forceAllowBackgroundSync() && vectorPreferences.isBackgroundSyncEnabled()) + } + fun getPrivacyFriendlyUpEndpoint(): String? { val endpoint = unifiedPushStore.getEndpointOrToken() if (endpoint.isNullOrEmpty()) return null diff --git a/vector/src/main/java/im/vector/app/core/pushers/VectorMessagingReceiver.kt b/vector/src/main/java/im/vector/app/core/pushers/VectorMessagingReceiver.kt index 8e88e44627..7996c96af9 100644 --- a/vector/src/main/java/im/vector/app/core/pushers/VectorMessagingReceiver.kt +++ b/vector/src/main/java/im/vector/app/core/pushers/VectorMessagingReceiver.kt @@ -140,9 +140,11 @@ class VectorMessagingReceiver : MessagingReceiver() { Timber.tag(loggerTag.value).i("onNewEndpoint: skipped") } } - val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_DISABLED - vectorPreferences.setFdroidSyncBackgroundMode(mode) - guardServiceStarter.stop() + if (!vectorPreferences.forceAllowBackgroundSync()) { + val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_DISABLED + vectorPreferences.setFdroidSyncBackgroundMode(mode) + guardServiceStarter.stop() + } } override fun onRegistrationFailed(context: Context, instance: String) { diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt index 074779c6cc..f229f30e7b 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt @@ -273,7 +273,7 @@ class WebRtcCallManager @Inject constructor( audioManager.setMode(CallAudioManager.Mode.DEFAULT) // did we start background sync? so we should stop it if (isInBackground) { - if (!unifiedPushHelper.isBackgroundSync()) { + if (!unifiedPushHelper.doesBackgroundSync()) { currentSession?.syncService()?.stopAnyBackgroundSync() } else { // for fdroid we should not stop, it should continue syncing @@ -379,7 +379,7 @@ class WebRtcCallManager @Inject constructor( // and thus won't be able to received events. For example if the call is // accepted on an other session this device will continue ringing if (isInBackground) { - if (!unifiedPushHelper.isBackgroundSync()) { + if (!unifiedPushHelper.doesBackgroundSync()) { // only for push version as fdroid version is already doing it? currentSession?.syncService()?.startAutomaticBackgroundSync(30, 0) } else { diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index eeda6fefa1..6b33cf536c 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -230,6 +230,7 @@ class VectorPreferences @Inject constructor( private const val SETTINGS_FLOATING_DATE = "SETTINGS_FLOATING_DATE" private const val SETTINGS_SPACE_BACK_NAVIGATION = "SETTINGS_SPACE_BACK_NAVIGATION" const val SETTINGS_FOLLOW_SYSTEM_LOCALE = "SETTINGS_FOLLOW_SYSTEM_LOCALE" + const val SETTINGS_FORCE_ALLOW_BACKGROUND_SYNC = "SETTINGS_FORCE_ALLOW_BACKGROUND_SYNC" private const val DID_ASK_TO_ENABLE_SESSION_PUSH = "DID_ASK_TO_ENABLE_SESSION_PUSH" @@ -1260,6 +1261,11 @@ class VectorPreferences @Inject constructor( return getFdroidSyncBackgroundMode() != BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_DISABLED } + // SC addition + fun forceAllowBackgroundSync(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_FORCE_ALLOW_BACKGROUND_SYNC, false) + } + fun setFdroidSyncBackgroundMode(mode: BackgroundSyncMode) { defaultPrefs .edit() diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsNotificationPreferenceFragment.kt index 62f5823b65..887d2ce5df 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsNotificationPreferenceFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsNotificationPreferenceFragment.kt @@ -22,6 +22,8 @@ import android.content.Intent import android.media.RingtoneManager import android.net.Uri import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.os.Parcelable import android.widget.Toast import androidx.lifecycle.LiveData @@ -51,6 +53,7 @@ import im.vector.app.features.settings.BackgroundSyncModeChooserDialog import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorSettingsBaseFragment import im.vector.app.features.settings.VectorSettingsFragmentInteractionListener +import im.vector.app.push.fcm.FcmHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.tryOrNull @@ -64,6 +67,7 @@ import javax.inject.Inject // Referenced in vector_settings_preferences_root.xml class VectorSettingsNotificationPreferenceFragment @Inject constructor( private val unifiedPushHelper: UnifiedPushHelper, + private val fcmHelper: FcmHelper, private val pushersManager: PushersManager, private val activeSessionHolder: ActiveSessionHolder, private val vectorPreferences: VectorPreferences, @@ -113,6 +117,22 @@ class VectorSettingsNotificationPreferenceFragment @Inject constructor( } } + // SC addition + findPreference(VectorPreferences.SETTINGS_FORCE_ALLOW_BACKGROUND_SYNC)?.let { + it.setTransactionalSwitchChangeListener(lifecycleScope) { isChecked -> + if (isChecked) { + if (!vectorPreferences.isBackgroundSyncEnabled()) { + vectorPreferences.setFdroidSyncBackgroundMode(BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_FOR_BATTERY) + } + } else { + if (!unifiedPushHelper.isBackgroundSync() && vectorPreferences.isBackgroundSyncEnabled()) { + vectorPreferences.setFdroidSyncBackgroundMode(BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_DISABLED) + } + } + Handler(Looper.getMainLooper()).postDelayed({ refreshBackgroundSyncPrefs() } , 500) + } + } + findPreference(VectorPreferences.SETTINGS_FDROID_BACKGROUND_SYNC_MODE)?.let { it.onPreferenceClickListener = Preference.OnPreferenceClickListener { val initialMode = vectorPreferences.getFdroidSyncBackgroundMode() @@ -241,9 +261,16 @@ class VectorSettingsNotificationPreferenceFragment @Inject constructor( } findPreference(VectorPreferences.SETTINGS_BACKGROUND_SYNC_PREFERENCE_KEY)?.let { - it.isVisible = unifiedPushHelper.isBackgroundSync() + it.isVisible = unifiedPushHelper.doesBackgroundSync() } + // SC addition + findPreference(VectorPreferences.SETTINGS_FORCE_ALLOW_BACKGROUND_SYNC)?.let { + // FCM variant doesn't have background sync code... + it.isVisible = !unifiedPushHelper.isBackgroundSync() && !fcmHelper.isFirebaseAvailable() + } + + val backgroundSyncEnabled = vectorPreferences.isBackgroundSyncEnabled() findPreference(VectorPreferences.SETTINGS_SET_SYNC_TIMEOUT_PREFERENCE_KEY)?.let { it.isEnabled = backgroundSyncEnabled @@ -350,7 +377,7 @@ class VectorSettingsNotificationPreferenceFragment @Inject constructor( private fun refreshPref() { // This pref may have change from troubleshoot pref fragment - if (unifiedPushHelper.isBackgroundSync()) { + if (unifiedPushHelper.doesBackgroundSync()) { findPreference(VectorPreferences.SETTINGS_START_ON_BOOT_PREFERENCE_KEY) ?.isChecked = vectorPreferences.autoStartOnBoot() } diff --git a/vector/src/main/res/xml/vector_settings_notifications.xml b/vector/src/main/res/xml/vector_settings_notifications.xml index ea00549cbb..074d927b4f 100644 --- a/vector/src/main/res/xml/vector_settings_notifications.xml +++ b/vector/src/main/res/xml/vector_settings_notifications.xml @@ -57,6 +57,12 @@ android:persistent="false" android:title="@string/settings_notification_method" /> + +