mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-05-26 14:05:52 +00:00
Add support for Push notifications
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+9
@@ -3717,6 +3717,9 @@ sealed class CC {
|
||||
class ResetAgentServersStats(): CC()
|
||||
class GetAgentSubsTotal(val userId: Long): CC()
|
||||
class GetAgentServersSummary(val userId: Long): CC()
|
||||
class APIRegisterWebPush(val endpoint: String, val auth: String, val p256dh: String): CC()
|
||||
class APIVerifySavedNtf(val code: String): CC()
|
||||
class APIDeleteSavedNtf(): CC()
|
||||
|
||||
val cmdString: String get() = when (this) {
|
||||
is Console -> cmd
|
||||
@@ -3919,6 +3922,9 @@ sealed class CC {
|
||||
is ResetAgentServersStats -> "/reset servers stats"
|
||||
is GetAgentSubsTotal -> "/get subs total $userId"
|
||||
is GetAgentServersSummary -> "/get servers summary $userId"
|
||||
is APIRegisterWebPush -> "/_ntf register webpush $endpoint $auth $p256dh INSTANT"
|
||||
is APIDeleteSavedNtf -> "/_ntf delete saved"
|
||||
is APIVerifySavedNtf -> "/_ntf verify $code"
|
||||
}
|
||||
|
||||
val cmdType: String get() = when (this) {
|
||||
@@ -4087,6 +4093,9 @@ sealed class CC {
|
||||
is ResetAgentServersStats -> "resetAgentServersStats"
|
||||
is GetAgentSubsTotal -> "getAgentSubsTotal"
|
||||
is GetAgentServersSummary -> "getAgentServersSummary"
|
||||
is APIRegisterWebPush -> "apiRegisterWebPush"
|
||||
is APIDeleteSavedNtf -> "apiDeleteSavedNtf"
|
||||
is APIVerifySavedNtf -> "apiVerifySavedNtf"
|
||||
}
|
||||
|
||||
data class ItemRange(val from: Long, val to: Long)
|
||||
|
||||
+7
-2
@@ -11,8 +11,13 @@ constraints: zip +disable-bzip2 +disable-zstd
|
||||
|
||||
source-repository-package
|
||||
type: git
|
||||
location: https://github.com/simplex-chat/simplexmq.git
|
||||
tag: 54a2a6c9051f610b8c7533369d9e9cce81af06ad
|
||||
location: https://github.com/p1gp1g/simplexmq.git
|
||||
tag: 15154ef75168f115e54220c8f906c30bab071eae
|
||||
|
||||
-- source-repository-package
|
||||
-- type: git
|
||||
-- location: https://github.com/simplex-chat/simplexmq.git
|
||||
-- tag: 54a2a6c9051f610b8c7533369d9e9cce81af06ad
|
||||
|
||||
source-repository-package
|
||||
type: git
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"https://github.com/p1gp1g/simplexmq.git"."15154ef75168f115e54220c8f906c30bab071eae" = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
|
||||
"https://github.com/simplex-chat/simplexmq.git"."54a2a6c9051f610b8c7533369d9e9cce81af06ad" = "02c6hh5vffm23gz2gkn6rq2ifcyj5c9s6kz0kyk055i78gsfhp43";
|
||||
"https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38";
|
||||
"https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d";
|
||||
|
||||
Reference in New Issue
Block a user