@@ -36,22 +36,20 @@ import android.annotation.SuppressLint
3636import android.app.Notification
3737import android.content.Context
3838import android.os.Bundle
39- import androidx.core.app.NotificationManagerCompat
4039import androidx.core.content.ContextCompat
4140import androidx.core.net.toUri
4241import io.getstream.log.taggedLogger
4342import io.getstream.video.android.core.Call
4443import io.getstream.video.android.core.StreamVideo
4544import io.getstream.video.android.core.StreamVideoClient
46- import io.getstream.video.android.core.notifications.NotificationType
4745import io.getstream.video.android.core.notifications.internal.Throttler
4846import io.getstream.video.android.core.notifications.internal.VideoPushDelegate.Companion.DEFAULT_CALL_TEXT
49- import io.getstream.video.android.core.notifications.internal.service.CallService.Companion.TRIGGER_REMOVE_INCOMING_CALL
47+ import io.getstream.video.android.core.notifications.internal.service.incomingcallcoordinator.IncomingCallCoordinator
48+ import io.getstream.video.android.core.notifications.internal.service.incomingcallcoordinator.PreAndroid17IncomingCallCoordinator
5049import io.getstream.video.android.core.notifications.internal.telecom.TelecomHelper
5150import io.getstream.video.android.core.notifications.internal.telecom.TelecomPermissions
5251import io.getstream.video.android.core.notifications.internal.telecom.jetpack.TelecomCall
5352import io.getstream.video.android.core.notifications.internal.telecom.jetpack.TelecomCallAction
54- import io.getstream.video.android.core.utils.safeCallWithResult
5553import io.getstream.video.android.model.StreamCallId
5654import kotlinx.coroutines.Dispatchers
5755import kotlinx.coroutines.delay
@@ -66,6 +64,15 @@ internal class ServiceLauncher(val context: Context) {
6664 private val telecomPermissions = TelecomPermissions ()
6765 private val jetpackTelecomRepositoryProvider = JetpackTelecomRepositoryProvider (context)
6866 private val throttler = Throttler ()
67+ private val incomingCallCoordinator: IncomingCallCoordinator =
68+ PreAndroid17IncomingCallCoordinator (
69+ context = context,
70+ incomingCallPresenter = incomingCallPresenter,
71+ serviceIntentBuilder = serviceIntentBuilder,
72+ telecomPermissions = telecomPermissions,
73+ telecomHelper = telecomHelper,
74+ jetpackTelecomRepositoryProvider = jetpackTelecomRepositoryProvider,
75+ )
6976
7077 @SuppressLint(" MissingPermission" , " NewApi" )
7178 fun showIncomingCall (
@@ -78,43 +85,17 @@ internal class ServiceLauncher(val context: Context) {
7885 streamVideo : StreamVideo ,
7986 notification : Notification ? ,
8087 ) {
81- val result = incomingCallPresenter.showIncomingCall(
82- context,
83- callId,
84- callDisplayName,
85- callServiceConfiguration,
86- notification,
88+ incomingCallCoordinator.showIncomingCall(
89+ IncomingCallRequest (
90+ callId = callId,
91+ callDisplayName = callDisplayName,
92+ callServiceConfiguration = callServiceConfiguration,
93+ isVideo = isVideo,
94+ payload = payload,
95+ streamVideo = streamVideo,
96+ notification = notification,
97+ ),
8798 )
88- logger.d { " [showIncomingCall] service start result: $result " }
89- if (telecomPermissions.canUseTelecom(callServiceConfiguration, context)) {
90- if (telecomHelper.canUseJetpackTelecom()) {
91- when (result) {
92- ShowIncomingCallResult .FG_SERVICE -> {
93- updateIncomingCallNotification(notification, streamVideo, callId)
94-
95- val jetpackTelecomRepository = jetpackTelecomRepositoryProvider.get(callId)
96-
97- val appSchema = (streamVideo as StreamVideoClient ).telecomConfig?.schema
98- val addressUri = " $appSchema :${callId.id} " .toUri()
99- val formattedCallDisplayName = callDisplayName?.takeIf { it.isNotBlank() } ? : DEFAULT_CALL_TEXT
100-
101- val call = streamVideo.call(callId.type, callId.id)
102-
103- call.state.jetpackTelecomRepository = (jetpackTelecomRepository)
104-
105- call.scope.launch {
106- jetpackTelecomRepository.registerCall(
107- formattedCallDisplayName,
108- addressUri,
109- true ,
110- isVideo,
111- )
112- }
113- }
114- else -> {}
115- }
116- }
117- }
11899 }
119100
120101 fun showOnGoingCall (call : Call , trigger : String , streamVideo : StreamVideo ) {
@@ -193,47 +174,12 @@ internal class ServiceLauncher(val context: Context) {
193174 }
194175 }
195176
196- /* *
197- * Because we need to retrieve the notification
198- * in [io.getstream.video.android.core.notifications.internal.telecom.connection.SuccessIncomingTelecomConnection]
199- */
200- private fun updateIncomingCallNotification (
201- notification : Notification ? ,
202- streamVideo : StreamVideo ,
203- callId : StreamCallId ,
204- ) {
205- notification?.let {
206- val notificationId = callId.getNotificationId(NotificationType .Incoming )
207- streamVideo.call(callId.type, callId.id)
208- .state.updateNotification(notificationId, notification)
209- }
210- }
211-
212177 fun removeIncomingCall (
213178 context : Context ,
214179 callId : StreamCallId ,
215180 config : CallServiceConfig = DefaultCallConfigurations .default,
216181 ) {
217- safeCallWithResult {
218- context.startService(
219- serviceIntentBuilder.buildStartIntent(
220- context,
221- StartServiceParam (
222- callId,
223- TRIGGER_REMOVE_INCOMING_CALL ,
224- callServiceConfiguration = config,
225- ),
226- ),
227- )!!
228- }.onError {
229- logger.d {
230- " [removeIncomingCall] notificationId: ${callId.getNotificationId(
231- NotificationType .Incoming ,
232- )} "
233- }
234- NotificationManagerCompat .from(context)
235- .cancel(callId.getNotificationId(NotificationType .Incoming ))
236- }
182+ incomingCallCoordinator.dismissIncomingCall(callId, config)
237183 }
238184
239185 /* *
0 commit comments