diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index 105ccec039..4f7aabe9df 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -716,10 +716,10 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter ) switchPref( - title = DSLSettingsText.from("Disable Telecom integration"), - isChecked = state.callingDisableTelecom, + title = DSLSettingsText.from("Use Telecom integration"), + isChecked = state.callingUseTelecom, onClick = { - viewModel.setInternalCallingDisableTelecom(!state.callingDisableTelecom) + viewModel.setInternalCallingUseTelecom(!state.callingUseTelecom) } ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt index 4524170af6..d7a0dd2e1a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt @@ -12,7 +12,7 @@ data class InternalSettingsState( val allowCensorshipSetting: Boolean, val callingServer: String, val callingDataMode: CallManager.DataMode, - val callingDisableTelecom: Boolean, + val callingUseTelecom: Boolean, val callingSetAudioConfig: Boolean, val callingUseOboeAdm: Boolean, val callingUseSoftwareAec: Boolean, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt index f75af3c050..15d1da110d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt @@ -107,8 +107,8 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito refresh() } - fun setInternalCallingDisableTelecom(enabled: Boolean) { - preferenceDataStore.putBoolean(InternalValues.CALLING_DISABLE_TELECOM, enabled) + fun setInternalCallingUseTelecom(enabled: Boolean) { + preferenceDataStore.putBoolean(InternalValues.CALLING_USE_TELECOM, enabled) refresh() } @@ -246,7 +246,7 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito allowCensorshipSetting = SignalStore.internal.allowChangingCensorshipSetting, callingServer = SignalStore.internal.groupCallingServer, callingDataMode = SignalStore.internal.callingDataMode, - callingDisableTelecom = SignalStore.internal.callingDisableTelecom, + callingUseTelecom = SignalStore.internal.callingUseTelecom, callingSetAudioConfig = SignalStore.internal.callingSetAudioConfig, callingUseOboeAdm = SignalStore.internal.callingUseOboeAdm, callingUseSoftwareAec = SignalStore.internal.callingUseSoftwareAec, diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.kt index 416daf0a0a..3e2ed8c20a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.kt @@ -18,7 +18,7 @@ class InternalValues internal constructor(store: KeyValueStore) : SignalStoreVal const val DELAY_RESENDS: String = "internal.delay_resends" const val CALLING_SERVER: String = "internal.calling_server" const val CALLING_DATA_MODE: String = "internal.calling_bandwidth_mode" - const val CALLING_DISABLE_TELECOM: String = "internal.calling_disable_telecom" + const val CALLING_USE_TELECOM: String = "internal.calling_use_telecom" const val CALLING_SET_AUDIO_CONFIG: String = "internal.calling_set_audio_config" const val CALLING_USE_OBOE_ADM: String = "internal.calling_use_oboe_adm" const val CALLING_USE_SOFTWARE_AEC: String = "internal.calling_use_software_aec" @@ -152,9 +152,9 @@ class InternalValues internal constructor(store: KeyValueStore) : SignalStoreVal } /** - * Whether or not Telecom integration is manually disabled. + * Whether or not Telecom integration is enabled. */ - var callingDisableTelecom by booleanValue(CALLING_DISABLE_TELECOM, true).falseForExternalUsers() + var callingUseTelecom by booleanValue(CALLING_USE_TELECOM, true).falseForExternalUsers() /** * Whether or not to override the audio settings from the remote configuration. diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt index cdc3ca3803..ab96c8c7d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt @@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.webrtc.audio.SignalAudioManager object AndroidTelecomUtil { private val TAG = Log.tag(AndroidTelecomUtil::class.java) + private const val MIN_SDK_VERSION = 37 private val context = AppDependencies.application private var systemRejected = false private var registered = false @@ -34,7 +35,7 @@ object AndroidTelecomUtil { @JvmStatic val telecomSupported: Boolean get() { - if (Build.VERSION.SDK_INT >= 36 && !systemRejected && isTelecomAllowedForDevice()) { + if (Build.VERSION.SDK_INT >= MIN_SDK_VERSION && !systemRejected && isTelecomAllowedForDevice()) { if (!registered) { registerPhoneAccount() } @@ -48,12 +49,11 @@ object AndroidTelecomUtil { @JvmStatic fun registerPhoneAccount() { - if (Build.VERSION.SDK_INT >= 36 && !systemRejected) { + if (Build.VERSION.SDK_INT >= MIN_SDK_VERSION && !systemRejected) { Log.i(TAG, "Registering with CallsManager") try { callsManager.registerAppWithTelecom( - capabilities = CallsManager.CAPABILITY_BASELINE or CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING, - backwardsCompatSdkLevel = 37 + capabilities = CallsManager.CAPABILITY_BASELINE or CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING ) Log.i(TAG, "CallsManager registration successful") registered = true @@ -210,8 +210,9 @@ object AndroidTelecomUtil { private fun isTelecomAllowedForDevice(): Boolean { if (RemoteConfig.internalUser) { - return !SignalStore.internal.callingDisableTelecom + return SignalStore.internal.callingUseTelecom } + return RingRtcDynamicConfiguration.isTelecomAllowedForDevice() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/RingRtcDynamicConfiguration.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/RingRtcDynamicConfiguration.kt index 0335edafb1..2aebac50a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/RingRtcDynamicConfiguration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/RingRtcDynamicConfiguration.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.service.webrtc import android.os.Build -import org.signal.core.util.asListContains import org.signal.core.util.isNotNullOrBlank import org.signal.ringrtc.AudioConfig import org.signal.ringrtc.VideoConfig @@ -17,8 +16,7 @@ object RingRtcDynamicConfiguration { private var lastFetchTime: Long = 0 fun isTelecomAllowedForDevice(): Boolean { - return RemoteConfig.telecomManufacturerAllowList.lowercase().asListContains(Build.MANUFACTURER.lowercase()) && - !RemoteConfig.telecomModelBlocklist.lowercase().asListContains(Build.MODEL.lowercase()) + return RemoteConfig.useJetPackTelecom } @JvmStatic diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index 217cdda865..4e145be760 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -838,20 +838,6 @@ object RemoteConfig { hotSwappable = true ) - /** A comma-separated list of manufacturers that *should* use Telecom for calling. */ - val telecomManufacturerAllowList: String by remoteString( - key = "android.calling.telecomAllowList", - defaultValue = "", - hotSwappable = true - ) - - /** A comma-separated list of manufacturers that *should* use Telecom for calling. */ - val telecomModelBlocklist: String by remoteString( - key = "android.calling.telecomModelBlockList", - defaultValue = "", - hotSwappable = true - ) - /** A comma-separated list of manufacturers that should *not* use CameraX mixed mode. */ val cameraXMixedModelBlocklist: String by remoteString( key = "android.cameraXMixedModelBlockList.3", @@ -1436,5 +1422,14 @@ object RemoteConfig { hotSwappable = true ) + /** Whether to enable Jetpack telecom integration for 1:1 calls */ + @JvmStatic + @get:JvmName("useJetPackTelecom") + val useJetPackTelecom: Boolean by remoteBoolean( + key = "android.calling.useJetPackTelecom", + defaultValue = false, + hotSwappable = false + ) + // endregion } diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java index 754f4c2153..ebf6545cfb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java @@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.notifications.NotificationChannels; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.service.webrtc.ActiveCallManager; +import org.thoughtcrime.securesms.service.webrtc.AndroidTelecomUtil; import org.thoughtcrime.securesms.util.ConversationUtil; import org.signal.core.util.DeviceProperties; @@ -161,8 +162,9 @@ public class CallNotificationBuilder { } } + /** Telecom requires one notification id for the lifetime of a call, so the dedicated ringing id is only used when we manage the call ourselves. */ public static int getNotificationId(int type) { - if (deviceVersionSupportsIncomingCallStyle() && type == TYPE_INCOMING_RINGING) { + if (deviceVersionSupportsIncomingCallStyle() && type == TYPE_INCOMING_RINGING && !AndroidTelecomUtil.hasActiveController()) { return WEBRTC_NOTIFICATION_RINGING; } else { return WEBRTC_NOTIFICATION; @@ -222,7 +224,7 @@ public class CallNotificationBuilder { } private static @NonNull String getNotificationChannel(int type) { - if (type == TYPE_INCOMING_RINGING) { + if (type == TYPE_INCOMING_RINGING || AndroidTelecomUtil.hasActiveController()) { return NotificationChannels.getInstance().CALLS; } else { return NotificationChannels.getInstance().CALL_STATUS; diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b806c9eff1..5b81a141ab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,7 +24,7 @@ androidx-lifecycle-navigation3 = "2.10.0" androidx-media3 = "1.9.1" androidx-navigation = "2.9.8" androidx-navigation3-core = "1.1.4" -androidx-core-telecom = "1.1.0-alpha04" +androidx-core-telecom = "1.1.0-alpha06" androidx-window = "1.3.0" glide = "5.0.9" libsignal-client = "0.100.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 3afdddd416..ee802cf390 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -1650,6 +1650,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + +