Add support for Push notifications

This commit is contained in:
sim
2025-08-01 16:23:27 +02:00
parent 2317d976e2
commit 2f89739f76
6 changed files with 108 additions and 4 deletions
@@ -186,6 +186,13 @@
android:foregroundServiceType="mediaPlayback|microphone|camera|remoteMessaging"
/>
<service android:name=".PushService"
android:exported="false">
<intent-filter>
<action android:name="org.unifiedpush.android.connector.PUSH_EVENT"/>
</intent-filter>
</service>
<receiver
android:name=".CallService$CallActionReceiver"
android:enabled="true"
@@ -0,0 +1,82 @@
package chat.simplex.app
import chat.simplex.common.model.CC
import chat.simplex.common.platform.Log
import chat.simplex.common.platform.chatModel
import kotlinx.coroutines.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import org.unifiedpush.android.connector.FailedReason
import org.unifiedpush.android.connector.PushService
import org.unifiedpush.android.connector.data.PushEndpoint
import org.unifiedpush.android.connector.data.PushMessage
class PushService: PushService() {
private val json = Json {
ignoreUnknownKeys = true
}
@Serializable
data class PNMessage(
val verification: String? = null
)
private fun onVerification(code: String) {
CoroutineScope(Dispatchers.Default).launch {
chatModel.controller.sendCmd(
null,
CC.APIVerifySavedNtf(code),
log = true
)
}
}
override fun onMessage(message: PushMessage, instance: String) {
Log.d(TAG, "onMessage")
val pn: PNMessage = json.decodeFromString(String(message.content))
when {
pn.verification != null -> onVerification(pn.verification)
}
// TODO: Start same job than the periodic service ?
// Receiving the push notif is enough to wake the app and fetch msgs
// But it may not be enough when the phone is in doze, or with some
// vendors
}
override fun onNewEndpoint(endpoint: PushEndpoint, instance: String) {
Log.d(TAG, "onNewEndpoint")
endpoint.pubKeySet ?: run {
// Should not happen
Log.w(TAG, "Missing pubKeySet")
return
}
CoroutineScope(Dispatchers.Default).launch {
chatModel.controller.sendCmd(
null,
CC.APIRegisterWebPush(endpoint.url, endpoint.pubKeySet!!.auth, endpoint.pubKeySet!!.pubKey),
log = true
)
}
}
override fun onRegistrationFailed(reason: FailedReason, instance: String) {
Log.d(TAG, "onRegistrationFailed: $reason")
// TODO: notification to inform about failed registration
}
override fun onUnregistered(instance: String) {
Log.d(TAG, "onUnregistered")
// TODO: notification to inform about unregistration
CoroutineScope(Dispatchers.Default).launch {
chatModel.controller.sendCmd(
null,
CC.APIDeleteSavedNtf(),
log = true
)
}
}
companion object {
private const val TAG = "PushService"
}
}
@@ -55,7 +55,7 @@ object PushManager {
showSelectPushServiceDialog(context, distributors) {
UnifiedPush.saveDistributor(context, it)
register(context)
onSuccess
onSuccess()
}
}
}
@@ -202,4 +202,4 @@ object PushManager {
} as String
}
}
}