Skip to content

Commit f017b0f

Browse files
authored
feat: open ongoing call screen when answering an incoming call (WPB-15555) (#3875)
1 parent e942709 commit f017b0f

File tree

5 files changed

+50
-47
lines changed

5 files changed

+50
-47
lines changed

app/src/main/kotlin/com/wire/android/notification/CallNotificationManager.kt

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ import kotlinx.coroutines.flow.scan
5050
import kotlinx.coroutines.flow.update
5151
import kotlinx.coroutines.launch
5252
import org.jetbrains.annotations.VisibleForTesting
53-
import java.util.concurrent.TimeUnit
5453
import javax.inject.Inject
5554
import javax.inject.Singleton
5655

@@ -143,12 +142,6 @@ class CallNotificationManager @Inject constructor(
143142

144143
private fun StatusBarNotification.hideIncomingCallNotification() {
145144
appLogger.i("$TAG: hiding incoming call")
146-
147-
// This delay is just so when the user receives two calling signals one straight after the other [INCOMING -> CANCEL]
148-
// Due to the signals being one after the other we are creating a notification when we are trying to cancel it, it wasn't
149-
// properly cancelling vibration as probably when we were cancelling, the vibration object was still being created and started
150-
// and thus never stopped.
151-
TimeUnit.MILLISECONDS.sleep(CANCEL_CALL_NOTIFICATION_DELAY)
152145
notificationManager.cancel(tag, id)
153146
}
154147

@@ -167,7 +160,6 @@ class CallNotificationManager @Inject constructor(
167160

168161
companion object {
169162
private const val TAG = "CallNotificationManager"
170-
private const val CANCEL_CALL_NOTIFICATION_DELAY = 300L
171163

172164
@VisibleForTesting
173165
internal const val DEBOUNCE_TIME = 200L
@@ -278,7 +270,7 @@ class CallNotificationBuilder @Inject constructor(
278270
)
279271
)
280272
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
281-
.setContentIntent(openOngoingCallPendingIntent(context, conversationIdString))
273+
.setContentIntent(openOngoingCallPendingIntent(context, conversationIdString, userIdString))
282274
.build()
283275
}
284276

@@ -330,8 +322,6 @@ class CallNotificationBuilder @Inject constructor(
330322

331323
data class IncomingCallsForUser(val userId: UserId, val userName: String, val incomingCalls: List<Call>)
332324

333-
data class CallNotificationIds(val userIdString: String, val conversationIdString: String)
334-
335325
data class CallNotificationData(
336326
val userId: QualifiedID,
337327
val userName: String,

app/src/main/kotlin/com/wire/android/notification/PendingIntents.kt

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import com.wire.android.notification.broadcastreceivers.StopAudioMessageReceiver
3636
import com.wire.android.ui.WireActivity
3737
import com.wire.android.ui.calling.CallActivity.Companion.EXTRA_CONVERSATION_ID
3838
import com.wire.android.ui.calling.CallActivity.Companion.EXTRA_SCREEN_TYPE
39+
import com.wire.android.ui.calling.CallActivity.Companion.EXTRA_SHOULD_ANSWER_CALL
40+
import com.wire.android.ui.calling.CallActivity.Companion.EXTRA_USER_ID
3941
import com.wire.android.ui.calling.StartingCallActivity
4042
import com.wire.android.ui.calling.StartingCallScreenType
4143
import com.wire.android.ui.calling.getIncomingCallIntent
@@ -80,10 +82,6 @@ fun otherUserProfilePendingIntent(context: Context, destinationUserId: String, u
8082
)
8183
}
8284

83-
// TODO
84-
fun callMessagePendingIntent(context: Context, conversationId: String, userId: String?): PendingIntent =
85-
messagePendingIntent(context, conversationId, userId)
86-
8785
fun summaryMessagePendingIntent(context: Context): PendingIntent = openAppPendingIntent(context)
8886

8987
fun replyMessagePendingIntent(context: Context, conversationId: String, userId: String?): PendingIntent = PendingIntent.getBroadcast(
@@ -93,9 +91,13 @@ fun replyMessagePendingIntent(context: Context, conversationId: String, userId:
9391
PendingIntent.FLAG_MUTABLE
9492
)
9593

96-
fun openOngoingCallPendingIntent(context: Context, conversationId: String): PendingIntent {
97-
val intent = openOngoingCallIntent(context, conversationId)
98-
94+
fun openOngoingCallPendingIntent(
95+
context: Context,
96+
conversationId: String,
97+
userId: String,
98+
shouldAnswerCall: Boolean = false
99+
): PendingIntent {
100+
val intent = ongoingCallIntent(context, conversationId, userId, shouldAnswerCall)
99101
return PendingIntent.getActivity(
100102
context.applicationContext,
101103
OPEN_ONGOING_CALL_REQUEST_CODE,
@@ -140,21 +142,15 @@ fun answerCallPendingIntent(context: Context, conversationId: String, userId: St
140142
} != null
141143
val shouldAnswerCallFromNotificationButton = !isAlreadyHavingACall &&
142144
(ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED)
143-
if (shouldAnswerCallFromNotificationButton) {
144-
val intent = IncomingCallActionReceiver.newIntent(
145+
return if (shouldAnswerCallFromNotificationButton) {
146+
openOngoingCallPendingIntent(
145147
context = context,
146148
conversationId = conversationId,
147149
userId = userId,
148-
action = IncomingCallActionReceiver.ACTION_ANSWER_CALL
149-
)
150-
return PendingIntent.getBroadcast(
151-
context.applicationContext,
152-
getRequestCode(ANSWER_CALL_REQUEST_CODE, userId, conversationId),
153-
intent,
154-
PendingIntent.FLAG_IMMUTABLE
150+
shouldAnswerCall = true
155151
)
156152
} else {
157-
return fullScreenIncomingCallPendingIntent(context, conversationId, userId)
153+
fullScreenIncomingCallPendingIntent(context, conversationId, userId)
158154
}
159155
}
160156

@@ -186,10 +182,16 @@ private fun openOutgoingCallIntent(context: Context, conversationId: String) =
186182
putExtra(EXTRA_SCREEN_TYPE, StartingCallScreenType.Outgoing.name)
187183
}
188184

189-
private fun openOngoingCallIntent(context: Context, conversationId: String) =
190-
Intent(context.applicationContext, OngoingCallActivity::class.java).apply {
191-
putExtra(EXTRA_CONVERSATION_ID, conversationId)
192-
}
185+
private fun ongoingCallIntent(
186+
context: Context,
187+
conversationId: String,
188+
userId: String,
189+
shouldAnswerCall: Boolean
190+
) = Intent(context.applicationContext, OngoingCallActivity::class.java).apply {
191+
putExtra(EXTRA_CONVERSATION_ID, conversationId)
192+
putExtra(EXTRA_USER_ID, userId)
193+
putExtra(EXTRA_SHOULD_ANSWER_CALL, shouldAnswerCall)
194+
}
193195

194196
private fun openMigrationLoginIntent(context: Context, userHandle: String) =
195197
Intent(context.applicationContext, WireActivity::class.java).apply {
@@ -246,7 +248,6 @@ fun stopAudioPendingIntent(context: Context): PendingIntent {
246248

247249
private const val MESSAGE_NOTIFICATIONS_SUMMARY_REQUEST_CODE = 0
248250
private const val DECLINE_CALL_REQUEST_CODE = "decline_call_"
249-
private const val ANSWER_CALL_REQUEST_CODE = "answer_call_"
250251
private const val FULL_SCREEN_REQUEST_CODE = "incoming_call_"
251252
private const val OPEN_ONGOING_CALL_REQUEST_CODE = 4
252253
private const val OPEN_MIGRATION_LOGIN_REQUEST_CODE = 5

app/src/main/kotlin/com/wire/android/notification/broadcastreceivers/IncomingCallActionReceiver.kt

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import com.wire.android.di.ApplicationScope
2626
import com.wire.android.di.KaliumCoreLogic
2727
import com.wire.android.di.NoSession
2828
import com.wire.android.notification.CallNotificationManager
29-
import com.wire.android.services.ServicesManager
3029
import com.wire.android.util.dispatchers.DispatcherProvider
3130
import com.wire.kalium.logger.obfuscateId
3231
import com.wire.kalium.logic.CoreLogic
@@ -60,9 +59,6 @@ class IncomingCallActionReceiver : BroadcastReceiver() {
6059
@Inject
6160
lateinit var callNotificationManager: CallNotificationManager
6261

63-
@Inject
64-
lateinit var servicesManager: ServicesManager
65-
6662
@Suppress("ReturnCount")
6763
override fun onReceive(context: Context, intent: Intent) {
6864
val conversationIdString: String = intent.getStringExtra(EXTRA_CONVERSATION_ID) ?: run {
@@ -82,9 +78,8 @@ class IncomingCallActionReceiver : BroadcastReceiver() {
8278
coroutineScope.launch(Dispatchers.Default) {
8379
with(coreLogic.getSessionScope(userId)) {
8480
val conversationId = qualifiedIdMapper.fromStringToQualifiedID(conversationIdString)
85-
when (action) {
86-
ACTION_DECLINE_CALL -> calls.rejectCall(conversationId)
87-
ACTION_ANSWER_CALL -> servicesManager.startCallServiceToAnswer(userId, conversationId)
81+
if (action == ACTION_DECLINE_CALL) {
82+
calls.rejectCall(conversationId)
8883
}
8984
}
9085
callNotificationManager.hideIncomingCallNotification(userId.toString(), conversationIdString)
@@ -97,18 +92,16 @@ class IncomingCallActionReceiver : BroadcastReceiver() {
9792
private const val EXTRA_ACTION = "action_extra"
9893

9994
const val ACTION_DECLINE_CALL = "action_decline_call"
100-
const val ACTION_ANSWER_CALL = "action_answer_call"
10195

10296
fun newIntent(
10397
context: Context,
10498
conversationId: String,
10599
userId: String,
106100
action: String
107-
): Intent =
108-
Intent(context, IncomingCallActionReceiver::class.java).apply {
109-
putExtra(EXTRA_CONVERSATION_ID, conversationId)
110-
putExtra(EXTRA_RECEIVER_USER_ID, userId)
111-
putExtra(EXTRA_ACTION, action)
112-
}
101+
): Intent = Intent(context, IncomingCallActionReceiver::class.java).apply {
102+
putExtra(EXTRA_CONVERSATION_ID, conversationId)
103+
putExtra(EXTRA_RECEIVER_USER_ID, userId)
104+
putExtra(EXTRA_ACTION, action)
105+
}
113106
}
114107
}

app/src/main/kotlin/com/wire/android/ui/calling/CallActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ abstract class CallActivity : AppCompatActivity() {
4040
const val EXTRA_CONVERSATION_ID = "conversation_id"
4141
const val EXTRA_USER_ID = "user_id"
4242
const val EXTRA_SCREEN_TYPE = "screen_type"
43+
const val EXTRA_SHOULD_ANSWER_CALL = "should_answer_call"
4344
}
4445

4546
private val callActivityViewModel: CallActivityViewModel by viewModels()

app/src/main/kotlin/com/wire/android/ui/calling/ongoing/OngoingCallActivity.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ import androidx.compose.ui.semantics.testTagsAsResourceId
4242
import com.wire.android.R
4343
import com.wire.android.appLogger
4444
import com.wire.android.navigation.style.TransitionAnimationType
45+
import com.wire.android.notification.CallNotificationManager
4546
import com.wire.android.notification.endOngoingCallPendingIntent
47+
import com.wire.android.services.ServicesManager
4648
import com.wire.android.ui.LocalActivity
4749
import com.wire.android.ui.calling.CallActivity
4850
import com.wire.android.ui.calling.CallActivity.Companion.EXTRA_CONVERSATION_ID
@@ -69,12 +71,20 @@ class OngoingCallActivity : CallActivity() {
6971
@Inject
7072
lateinit var proximitySensorManager: ProximitySensorManager
7173

74+
@Inject
75+
lateinit var servicesManager: ServicesManager
76+
77+
@Inject
78+
lateinit var callNotificationManager: CallNotificationManager
79+
7280
var conversationId: String? by mutableStateOf(null)
7381
var userId: String? by mutableStateOf(null)
82+
private var shouldAnswerCall: Boolean by mutableStateOf(false)
7483

7584
private fun handleNewIntent(intent: Intent) {
7685
conversationId = intent.extras?.getString(EXTRA_CONVERSATION_ID)
7786
userId = intent.extras?.getString(EXTRA_USER_ID)
87+
shouldAnswerCall = intent.extras?.getBoolean(EXTRA_SHOULD_ANSWER_CALL) ?: false
7888
switchAccountIfNeeded(userId)
7989
}
8090

@@ -94,6 +104,14 @@ class OngoingCallActivity : CallActivity() {
94104

95105
handleNewIntent(intent)
96106

107+
if (shouldAnswerCall && userId != null && conversationId != null) {
108+
callNotificationManager.hideIncomingCallNotification(userId!!, conversationId!!)
109+
servicesManager.startCallServiceToAnswer(
110+
qualifiedIdMapper.fromStringToQualifiedID(userId!!),
111+
qualifiedIdMapper.fromStringToQualifiedID(conversationId!!),
112+
)
113+
}
114+
97115
appLogger.i("$TAG Initializing proximity sensor..")
98116
proximitySensorManager.initialize()
99117

0 commit comments

Comments
 (0)