Fix sticky end call notification #4019
This commit is contained in:
parent
d6b261ce4c
commit
bd9a187597
|
@ -0,0 +1 @@
|
|||
Fix sticky end call notification
|
|
@ -50,7 +50,7 @@ private val loggerTag = LoggerTag("CallService", LoggerTag.VOIP)
|
|||
class CallService : VectorService() {
|
||||
|
||||
private val connections = mutableMapOf<String, CallConnection>()
|
||||
private val knownCalls = mutableSetOf<CallInformation>()
|
||||
private val knownCalls = mutableMapOf<String, CallInformation>()
|
||||
private val connectedCallIds = mutableSetOf<String>()
|
||||
|
||||
private lateinit var notificationManager: NotificationManagerCompat
|
||||
|
@ -190,7 +190,7 @@ class CallService : VectorService() {
|
|||
} else {
|
||||
notificationManager.notify(callId.hashCode(), notification)
|
||||
}
|
||||
knownCalls.add(callInformation)
|
||||
knownCalls[callId] = callInformation
|
||||
}
|
||||
|
||||
private fun handleCallTerminated(intent: Intent) {
|
||||
|
@ -198,20 +198,22 @@ class CallService : VectorService() {
|
|||
val endCallReason = intent.getSerializableExtra(EXTRA_END_CALL_REASON) as EndCallReason
|
||||
val rejected = intent.getBooleanExtra(EXTRA_END_CALL_REJECTED, false)
|
||||
alertManager.cancelAlert(callId)
|
||||
val terminatedCall = knownCalls.firstOrNull { it.callId == callId }
|
||||
val terminatedCall = knownCalls.remove(callId)
|
||||
if (terminatedCall == null) {
|
||||
Timber.tag(loggerTag.value).v("Call terminated for unknown call $callId$")
|
||||
Timber.tag(loggerTag.value).v("Call terminated for unknown call $callId")
|
||||
handleUnexpectedState(callId)
|
||||
return
|
||||
}
|
||||
knownCalls.remove(terminatedCall)
|
||||
val notification = notificationUtils.buildCallEndedNotification(false)
|
||||
val notificationId = callId.hashCode()
|
||||
startForeground(notificationId, notification)
|
||||
if (knownCalls.isEmpty()) {
|
||||
Timber.tag(loggerTag.value).v("No more call, stop the service")
|
||||
stopForeground(true)
|
||||
mediaSession?.isActive = false
|
||||
myStopSelf()
|
||||
}
|
||||
val wasConnected = connectedCallIds.remove(callId)
|
||||
val notification = notificationUtils.buildCallEndedNotification(terminatedCall.isVideoCall)
|
||||
notificationManager.notify(callId.hashCode(), notification)
|
||||
if (!wasConnected && !terminatedCall.isOutgoing && !rejected && endCallReason != EndCallReason.ANSWERED_ELSEWHERE) {
|
||||
val missedCallNotification = notificationUtils.buildCallMissedNotification(terminatedCall)
|
||||
notificationManager.notify(MISSED_CALL_TAG, terminatedCall.nativeRoomId.hashCode(), missedCallNotification)
|
||||
|
@ -243,7 +245,7 @@ class CallService : VectorService() {
|
|||
} else {
|
||||
notificationManager.notify(callId.hashCode(), notification)
|
||||
}
|
||||
knownCalls.add(callInformation)
|
||||
knownCalls[callId] = callInformation
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -267,18 +269,19 @@ class CallService : VectorService() {
|
|||
} else {
|
||||
notificationManager.notify(callId.hashCode(), notification)
|
||||
}
|
||||
knownCalls.add(callInformation)
|
||||
knownCalls[callId] = callInformation
|
||||
}
|
||||
|
||||
private fun handleUnexpectedState(callId: String?) {
|
||||
Timber.tag(loggerTag.value).v("Fallback to clear everything")
|
||||
callRingPlayerIncoming?.stop()
|
||||
callRingPlayerOutgoing?.stop()
|
||||
if (callId != null) {
|
||||
notificationManager.cancel(callId.hashCode())
|
||||
}
|
||||
val notification = notificationUtils.buildCallEndedNotification(false)
|
||||
startForeground(DEFAULT_NOTIFICATION_ID, notification)
|
||||
if (callId != null) {
|
||||
startForeground(callId.hashCode(), notification)
|
||||
} else {
|
||||
startForeground(DEFAULT_NOTIFICATION_ID, notification)
|
||||
}
|
||||
if (knownCalls.isEmpty()) {
|
||||
mediaSession?.isActive = false
|
||||
myStopSelf()
|
||||
|
@ -371,7 +374,7 @@ class CallService : VectorService() {
|
|||
putExtra(EXTRA_END_CALL_REASON, endCallReason)
|
||||
putExtra(EXTRA_END_CALL_REJECTED, rejected)
|
||||
}
|
||||
ContextCompat.startForegroundService(context, intent)
|
||||
context.startService(intent)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -468,7 +468,6 @@ class NotificationUtils @Inject constructor(private val context: Context,
|
|||
setSmallIcon(R.drawable.ic_call_answer)
|
||||
}
|
||||
}
|
||||
// This is a trick to make the previous notification with same id disappear as cancel notification is not working with Foreground Service.
|
||||
.setTimeoutAfter(1)
|
||||
.setColor(ThemeUtils.getColor(context, android.R.attr.colorPrimary))
|
||||
.setCategory(NotificationCompat.CATEGORY_CALL)
|
||||
|
|
Loading…
Reference in New Issue