forked from eatvio/eatvio_app
feat(video_calls): call ended push, recall button for message
This commit is contained in:
@@ -15,6 +15,11 @@ class EatvioFcmMessagingService : FirebaseMessagingService() {
|
||||
override fun onMessageReceived(message: RemoteMessage) {
|
||||
Log.i(TAG, "onMessageReceived: ${message.data}")
|
||||
|
||||
if (VideoCallPushBridge.isEndedVideoCall(message.data)) {
|
||||
VideoCallPushBridge.dismissAllIncomingCalls(this)
|
||||
return
|
||||
}
|
||||
|
||||
if (!VideoCallPushBridge.isIncomingVideoCall(message.data)) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -20,6 +20,11 @@ class HmsPushService : HmsMessageService() {
|
||||
|
||||
if (message == null) return
|
||||
|
||||
if (VideoCallPushBridge.isEndedVideoCall(message.dataOfMap)) {
|
||||
VideoCallPushBridge.dismissAllIncomingCalls(this)
|
||||
return
|
||||
}
|
||||
|
||||
if (VideoCallPushBridge.isIncomingVideoCall(message.dataOfMap)) {
|
||||
VideoCallPushBridge.showIncomingCall(this, message.dataOfMap)
|
||||
return
|
||||
|
||||
@@ -4,10 +4,13 @@ import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import com.hiennv.flutter_callkit_incoming.CallkitConstants
|
||||
import com.hiennv.flutter_callkit_incoming.CallkitIncomingBroadcastReceiver
|
||||
import com.hiennv.flutter_callkit_incoming.CallkitNotificationManager
|
||||
import com.hiennv.flutter_callkit_incoming.CallkitSoundPlayerManager
|
||||
import com.hiennv.flutter_callkit_incoming.Data
|
||||
import com.hiennv.flutter_callkit_incoming.addCall
|
||||
import com.hiennv.flutter_callkit_incoming.getDataActiveCalls
|
||||
import com.hiennv.flutter_callkit_incoming.removeAllCalls
|
||||
import java.util.HashMap
|
||||
|
||||
object VideoCallPushBridge {
|
||||
@@ -52,6 +55,29 @@ object VideoCallPushBridge {
|
||||
return false
|
||||
}
|
||||
|
||||
fun isEndedVideoCall(data: Map<String, String>): Boolean {
|
||||
val rawType = data["type"]
|
||||
?: data["notification_type"]
|
||||
?: data["event"]
|
||||
?: data["action"]
|
||||
?: data["push_type"]
|
||||
?: data["call_type"]
|
||||
|
||||
if (rawType != null) {
|
||||
val normalized = rawType.lowercase().replace("-", "_")
|
||||
if (normalized == "video_call_ended" || normalized == "video_call_end") {
|
||||
return true
|
||||
}
|
||||
if (normalized.contains("video_call") &&
|
||||
(normalized.contains("ended") || normalized.endsWith("_end"))
|
||||
) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
fun showIncomingCall(context: Context, data: Map<String, String>) {
|
||||
val appContext = context.applicationContext
|
||||
val callData = buildCallDataBundle(data)
|
||||
@@ -74,6 +100,35 @@ object VideoCallPushBridge {
|
||||
}
|
||||
}
|
||||
|
||||
fun dismissAllIncomingCalls(context: Context) {
|
||||
val appContext = context.applicationContext
|
||||
val calls = getDataActiveCalls(appContext)
|
||||
Log.i(TAG, "dismissAllIncomingCalls: active calls=${calls.size}")
|
||||
|
||||
val soundManager = CallkitSoundPlayerManager(appContext)
|
||||
val notificationManager = CallkitNotificationManager(appContext, soundManager)
|
||||
|
||||
for (call in calls) {
|
||||
val bundle = call.toBundle()
|
||||
try {
|
||||
notificationManager.clearIncomingNotification(bundle, isAccepted = false)
|
||||
appContext.sendBroadcast(
|
||||
CallkitIncomingBroadcastReceiver.getIntentEnded(appContext, bundle),
|
||||
)
|
||||
} catch (error: Exception) {
|
||||
Log.w(TAG, "dismissAllIncomingCalls: failed for call ${call.id}", error)
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
removeAllCalls(appContext)
|
||||
} catch (error: Exception) {
|
||||
Log.w(TAG, "dismissAllIncomingCalls: failed to remove persisted calls", error)
|
||||
}
|
||||
|
||||
soundManager.stop()
|
||||
}
|
||||
|
||||
private fun buildCallDataBundle(data: Map<String, String>): Bundle? {
|
||||
val conversationUuid = conversationUuid(data) ?: return null
|
||||
val callerName = data["counterpartName"]
|
||||
|
||||
Reference in New Issue
Block a user