diff --git a/library/ui-strings/src/main/res/values/strings_sc.xml b/library/ui-strings/src/main/res/values/strings_sc.xml index e6ef61aa06..d9062e5215 100644 --- a/library/ui-strings/src/main/res/values/strings_sc.xml +++ b/library/ui-strings/src/main/res/values/strings_sc.xml @@ -247,4 +247,9 @@ Failed to start foreground service You may need to exempt SchildiChat from battery restrictions in your system settings. + Background sync is enabled + You\'re using the background sync service to receive notifications. This approach does not work reliably and causes crashes on recent Android versions. Please consider setting up UnifiedPush instead. + UnifiedPush recommended + Background sync service does not work reliably and causes crashes on recent Android versions. Please use UnifiedPush or install a SchildiChat variant that supports FCM if you have Google Play Services installed. + diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 1659ad88e8..406df13b8c 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -11,6 +11,7 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Parcelable import android.view.Menu @@ -38,10 +39,8 @@ import im.vector.app.core.extensions.validateBackPressed import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.platform.VectorMenuProvider import im.vector.app.core.pushers.UnifiedPushHelper -import im.vector.app.core.resources.ColorProvider import im.vector.app.core.utils.registerForPermissionsResult import im.vector.app.core.utils.startSharePlainTextIntent -import im.vector.app.core.utils.toast import im.vector.app.databinding.ActivityHomeBinding import im.vector.app.features.MainActivity import im.vector.app.features.MainActivityArgs @@ -62,6 +61,9 @@ import im.vector.app.features.permalink.NavigationInterceptor import im.vector.app.features.permalink.PermalinkHandler import im.vector.app.features.permalink.PermalinkHandler.Companion.MATRIX_TO_CUSTOM_SCHEME_URL_BASE import im.vector.app.features.permalink.PermalinkHandler.Companion.ROOM_LINK_PREFIX +import im.vector.app.features.permalink.PermalinkHandler.Companion.SC_MATRIX_TO_CUSTOM_SCHEME_URL_BASE +import im.vector.app.features.permalink.PermalinkHandler.Companion.SC_ROOM_LINK_PREFIX +import im.vector.app.features.permalink.PermalinkHandler.Companion.SC_USER_LINK_PREFIX import im.vector.app.features.permalink.PermalinkHandler.Companion.USER_LINK_PREFIX import im.vector.app.features.popup.DefaultVectorAlert import im.vector.app.features.popup.PopupAlertManager @@ -78,9 +80,6 @@ import im.vector.app.features.spaces.share.ShareSpaceBottomSheet import im.vector.app.features.themes.ThemeUtils import im.vector.app.features.usercode.UserCodeActivity import im.vector.app.features.workers.signout.ServerBackupStatusViewModel -import im.vector.app.features.permalink.PermalinkHandler.Companion.SC_MATRIX_TO_CUSTOM_SCHEME_URL_BASE -import im.vector.app.features.permalink.PermalinkHandler.Companion.SC_ROOM_LINK_PREFIX -import im.vector.app.features.permalink.PermalinkHandler.Companion.SC_USER_LINK_PREFIX import im.vector.lib.core.utils.compat.getParcelableExtraCompat import im.vector.lib.strings.CommonStrings import kotlinx.coroutines.Dispatchers @@ -139,6 +138,7 @@ class HomeActivity : @Inject lateinit var notificationPermissionManager: NotificationPermissionManager private var isNewAppLayoutEnabled: Boolean = false // delete once old app layout is removed + private var hasComplainedAboutBackgroundSync = false private val createSpaceResultLauncher = registerStartForActivityResult { activityResult -> if (activityResult.resultCode == Activity.RESULT_OK) { @@ -442,6 +442,15 @@ class HomeActivity : else -> { // Idle or Incremental sync status views.waitingView.root.isVisible = false + + // Android 15 is very strict with background sync service usage and likes to shoot us when we take too long, making the app crash. + // Complain first time when starting the app after initial sync is done + if (status !is SyncRequestState.InitialSyncRequestState) { + if (!hasComplainedAboutBackgroundSync && Build.VERSION.SDK_INT > 35 && buildMeta.flavorDescription == "FDroid" && vectorPreferences.isBackgroundSyncEnabled()) { + hasComplainedAboutBackgroundSync = true + promptNeedsPushEvent() + } + } } } } @@ -575,6 +584,25 @@ class HomeActivity : ) } + private fun promptNeedsPushEvent() { + popupAlertManager.postVectorAlert( + DefaultVectorAlert( + uid = PopupAlertManager.SC_REQUIRES_PUSH_UID, + title = getString(im.vector.lib.strings.R.string.prompt_unified_push_title), + description = getString(im.vector.lib.strings.R.string.prompt_unified_push_description), + iconId = null, + ).apply { + colorInt = ThemeUtils.getColor(this@HomeActivity, com.google.android.material.R.attr.colorPrimary) + contentAction = Runnable { + (weakCurrentActivity?.get() as? VectorBaseActivity<*>)?.let { + it.navigator.openSettings(it, VectorSettingsActivity.EXTRA_DIRECT_ACCESS_NOTIFICATIONS) + } + } + dismissedAction = Runnable {} + } + ) + } + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) val parcelableExtra = intent.getParcelableExtraCompat(Mavericks.KEY_ARG) diff --git a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt index c0968d0241..58e2eb8f3c 100644 --- a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt +++ b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt @@ -52,6 +52,7 @@ class PopupAlertManager @Inject constructor( const val UPGRADE_SECURITY_UID = "upgrade_security" const val VERIFY_SESSION_UID = "verify_session" const val ENABLE_PUSH_UID = "enable_push" + const val SC_REQUIRES_PUSH_UID = "sc_requires_push" } private var weakCurrentActivity: WeakReference? = null diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsNotificationFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsNotificationFragment.kt index 183aa34791..f1206ce8db 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsNotificationFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsNotificationFragment.kt @@ -12,11 +12,13 @@ import android.content.Context import android.content.Intent import android.media.RingtoneManager import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper import android.view.View import android.widget.Toast +import androidx.core.net.toUri import androidx.lifecycle.LiveData import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.lifecycleScope @@ -36,6 +38,7 @@ import im.vector.app.core.pushers.EnsureFcmTokenIsRetrievedUseCase import im.vector.app.core.pushers.FcmHelper import im.vector.app.core.pushers.PushersManager import im.vector.app.core.pushers.UnifiedPushHelper +import im.vector.app.core.resources.BuildMeta import im.vector.app.core.services.GuardServiceStarter import im.vector.app.core.utils.combineLatest import im.vector.app.core.utils.isIgnoringBatteryOptimizations @@ -79,6 +82,7 @@ class VectorSettingsNotificationFragment : @Inject lateinit var vectorFeatures: VectorFeatures @Inject lateinit var notificationPermissionManager: NotificationPermissionManager @Inject lateinit var ensureFcmTokenIsRetrievedUseCase: EnsureFcmTokenIsRetrievedUseCase + @Inject lateinit var buildMeta: BuildMeta override var titleRes: Int = CommonStrings.settings_notifications override val preferenceXmlRes = R.xml.vector_settings_notifications @@ -148,6 +152,14 @@ class VectorSettingsNotificationFragment : } // SC addition + findPreference("SC_SETTINGS_PROMPT_UNIFIED_PUSH_TITLE")?.let { + it.isVisible = Build.VERSION.SDK_INT > 35 && buildMeta.flavorDescription == "FDroid" + it.onPreferenceClickListener = Preference.OnPreferenceClickListener { + startActivity(Intent(Intent.ACTION_VIEW, "https://unifiedpush.org/".toUri())) + true + + } + } findPreference(VectorPreferences.SETTINGS_FORCE_ALLOW_BACKGROUND_SYNC)?.let { it.setTransactionalSwitchChangeListener(lifecycleScope) { isChecked -> if (isChecked) { diff --git a/vector/src/main/res/xml/vector_settings_notifications.xml b/vector/src/main/res/xml/vector_settings_notifications.xml index e487cf539d..52151375d1 100644 --- a/vector/src/main/res/xml/vector_settings_notifications.xml +++ b/vector/src/main/res/xml/vector_settings_notifications.xml @@ -2,6 +2,11 @@ + +