Skip to content

Commit 508aef9

Browse files
committed
Use the new RtcNotification instead of deprecated CallNotify
1 parent 0d7d33c commit 508aef9

File tree

27 files changed

+69
-38
lines changed

27 files changed

+69
-38
lines changed

features/call/api/src/main/kotlin/io/element/android/features/call/api/ElementCallEntryPoint.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ interface ElementCallEntryPoint {
2929
* @param senderName The name of the sender of the event that started the call.
3030
* @param avatarUrl The avatar url of the room or DM.
3131
* @param timestamp The timestamp of the event that started the call.
32+
* @param expirationTimestamp The timestamp at which the call should stop ringing.
3233
* @param notificationChannelId The id of the notification channel to use for the call notification.
3334
* @param textContent The text content of the notification. If null the default content from the system will be used.
3435
*/
@@ -40,6 +41,7 @@ interface ElementCallEntryPoint {
4041
senderName: String?,
4142
avatarUrl: String?,
4243
timestamp: Long,
44+
expirationTimestamp: Long,
4345
notificationChannelId: String,
4446
textContent: String?,
4547
)

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/DefaultElementCallEntryPoint.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class DefaultElementCallEntryPoint(
4343
senderName: String?,
4444
avatarUrl: String?,
4545
timestamp: Long,
46+
expirationTimestamp: Long,
4647
notificationChannelId: String,
4748
textContent: String?,
4849
) {
@@ -55,6 +56,7 @@ class DefaultElementCallEntryPoint(
5556
senderName = senderName,
5657
avatarUrl = avatarUrl,
5758
timestamp = timestamp,
59+
expirationTimestamp = expirationTimestamp,
5860
notificationChannelId = notificationChannelId,
5961
textContent = textContent,
6062
)

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/CallNotificationData.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ data class CallNotificationData(
2626
val notificationChannelId: String,
2727
val timestamp: Long,
2828
val textContent: String?,
29+
val expirationTimestamp: Long,
2930
) : Parcelable

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class RingingCallNotificationCreator(
6464
roomAvatarUrl: String?,
6565
notificationChannelId: String,
6666
timestamp: Long,
67+
expirationTimestamp: Long,
6768
textContent: String?,
6869
): Notification? {
6970
val matrixClient = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return null
@@ -88,6 +89,7 @@ class RingingCallNotificationCreator(
8889
notificationChannelId = notificationChannelId,
8990
timestamp = timestamp,
9091
textContent = textContent,
92+
expirationTimestamp = expirationTimestamp,
9193
)
9294

9395
val declineIntent = PendingIntentCompat.getBroadcast(

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ internal fun IncomingCallScreenPreview() = ElementPreview {
176176
notificationChannelId = "incoming_call",
177177
timestamp = 0L,
178178
textContent = null,
179+
expirationTimestamp = 1000L,
179180
),
180181
onAnswer = {},
181182
onCancel = {},

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import kotlinx.coroutines.launch
5353
import kotlinx.coroutines.sync.Mutex
5454
import kotlinx.coroutines.sync.withLock
5555
import timber.log.Timber
56-
import kotlin.time.Duration.Companion.seconds
56+
import kotlin.math.min
5757

5858
/**
5959
* Manages the active call state.
@@ -118,8 +118,20 @@ class DefaultActiveCallManager(
118118

119119
override suspend fun registerIncomingCall(notificationData: CallNotificationData) {
120120
mutex.withLock {
121+
val ringDuration =
122+
min(
123+
notificationData.expirationTimestamp - System.currentTimeMillis(),
124+
ElementCallConfig.RINGING_CALL_DURATION_SECONDS * 1000L
125+
)
126+
127+
if (ringDuration < 0) {
128+
// Should already have stopped ringing, ignore.
129+
Timber.tag(tag).d("Received timed-out incoming ringing call for room id: ${notificationData.roomId}, cancel ringing")
130+
return
131+
}
132+
121133
appForegroundStateService.updateHasRingingCall(true)
122-
Timber.tag(tag).d("Received incoming call for room id: ${notificationData.roomId}")
134+
Timber.tag(tag).d("Received incoming call for room id: ${notificationData.roomId}, ringDuration: $ringDuration")
123135
if (activeCall.value != null) {
124136
displayMissedCallNotification(notificationData)
125137
Timber.tag(tag).w("Already have an active call, ignoring incoming call: $notificationData")
@@ -138,14 +150,14 @@ class DefaultActiveCallManager(
138150
showIncomingCallNotification(notificationData)
139151

140152
// Wait for the ringing call to time out
141-
delay(ElementCallConfig.RINGING_CALL_DURATION_SECONDS.seconds)
153+
delay(timeMillis = ringDuration)
142154
incomingCallTimedOut(displayMissedCallNotification = true)
143155
}
144156

145157
// Acquire a wake lock to keep the device awake during the incoming call, so we can process the room info data
146158
if (activeWakeLock?.isHeld == false) {
147159
Timber.tag(tag).d("Acquiring partial wakelock")
148-
activeWakeLock.acquire(ElementCallConfig.RINGING_CALL_DURATION_SECONDS * 1000L)
160+
activeWakeLock.acquire(ringDuration)
149161
}
150162
}
151163
}
@@ -236,6 +248,7 @@ class DefaultActiveCallManager(
236248
notificationChannelId = notificationData.notificationChannelId,
237249
timestamp = notificationData.timestamp,
238250
textContent = notificationData.textContent,
251+
expirationTimestamp = notificationData.expirationTimestamp,
239252
) ?: return
240253
runCatchingExceptions {
241254
notificationManagerCompat.notify(

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ import io.element.android.features.messages.impl.actionlist.model.TimelineItemAc
2525
import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure
2626
import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailureFactory
2727
import io.element.android.features.messages.impl.timeline.model.TimelineItem
28-
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent
2928
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContent
3029
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContentWithAttachment
3130
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLegacyCallInviteContent
3231
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent
3332
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRedactedContent
33+
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRtcNotificationContent
3434
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateContent
3535
import io.element.android.features.messages.impl.timeline.model.event.canBeCopied
3636
import io.element.android.features.messages.impl.timeline.model.event.canBeForwarded
@@ -242,7 +242,7 @@ class DefaultActionListPresenter(
242242
private fun Iterable<TimelineItemAction>.postFilter(content: TimelineItemEventContent): Iterable<TimelineItemAction> {
243243
return filter { action ->
244244
when (content) {
245-
is TimelineItemCallNotifyContent,
245+
is TimelineItemRtcNotificationContent,
246246
is TimelineItemLegacyCallInviteContent,
247247
is TimelineItemStateContent -> action == TimelineItemAction.ViewSource
248248
is TimelineItemRedactedContent -> {

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,14 @@ import io.element.android.features.messages.impl.timeline.a11y.a11yReactionActio
5656
import io.element.android.features.messages.impl.timeline.components.MessageShieldView
5757
import io.element.android.features.messages.impl.timeline.model.TimelineItem
5858
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent
59-
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent
6059
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContent
6160
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContent
6261
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContent
6362
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLegacyCallInviteContent
6463
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContent
6564
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent
6665
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRedactedContent
66+
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRtcNotificationContent
6767
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateContent
6868
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStickerContent
6969
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextBasedContent
@@ -306,7 +306,7 @@ private fun MessageSummary(
306306
is TimelineItemLegacyCallInviteContent -> {
307307
content = { ContentForBody(textContent) }
308308
}
309-
is TimelineItemCallNotifyContent -> {
309+
is TimelineItemRtcNotificationContent -> {
310310
content = { ContentForBody(stringResource(CommonStrings.common_call_started)) }
311311
}
312312
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import io.element.android.compound.theme.ElementTheme
2929
import io.element.android.compound.tokens.generated.CompoundIcons
3030
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
3131
import io.element.android.features.messages.impl.timeline.model.TimelineItem
32-
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent
32+
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRtcNotificationContent
3333
import io.element.android.features.roomcall.api.RoomCallState
3434
import io.element.android.features.roomcall.api.RoomCallStateProvider
3535
import io.element.android.libraries.designsystem.components.avatar.Avatar
@@ -119,7 +119,7 @@ internal fun TimelineItemCallNotifyViewPreview() = ElementPreview {
119119
.filter { it !is RoomCallState.Unavailable }
120120
.forEach { roomCallState ->
121121
TimelineItemCallNotifyView(
122-
event = aTimelineItemEvent(content = TimelineItemCallNotifyContent()),
122+
event = aTimelineItemEvent(content = TimelineItemRtcNotificationContent()),
123123
roomCallState = roomCallState,
124124
onLongClick = {},
125125
onJoinCallClick = {},

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ import io.element.android.features.messages.impl.timeline.TimelineRoomInfo
3030
import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView
3131
import io.element.android.features.messages.impl.timeline.components.layout.ContentAvoidingLayoutData
3232
import io.element.android.features.messages.impl.timeline.model.TimelineItem
33-
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent
3433
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLegacyCallInviteContent
3534
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent
35+
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRtcNotificationContent
3636
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateContent
3737
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVoiceContent
3838
import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionEvent
@@ -123,7 +123,7 @@ internal fun TimelineItemRow(
123123
eventSink = eventSink,
124124
)
125125
}
126-
is TimelineItemCallNotifyContent -> {
126+
is TimelineItemRtcNotificationContent -> {
127127
TimelineItemCallNotifyView(
128128
modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp),
129129
event = timelineItem,

0 commit comments

Comments
 (0)