mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-25 11:05:25 +00:00
Fixed huawei push notification
This commit is contained in:
parent
0518134c88
commit
5b26912f42
@ -4,6 +4,7 @@ import dagger.Binds
|
|||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.hilt.InstallIn
|
import dagger.hilt.InstallIn
|
||||||
import dagger.hilt.components.SingletonComponent
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
import org.session.libsession.messaging.notifications.TokenFetcher
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@InstallIn(SingletonComponent::class)
|
@InstallIn(SingletonComponent::class)
|
||||||
|
@ -4,18 +4,16 @@ import android.os.Bundle
|
|||||||
import com.huawei.hms.push.HmsMessageService
|
import com.huawei.hms.push.HmsMessageService
|
||||||
import com.huawei.hms.push.RemoteMessage
|
import com.huawei.hms.push.RemoteMessage
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import org.json.JSONException
|
import org.session.libsession.messaging.notifications.TokenFetcher
|
||||||
import org.session.libsession.utilities.TextSecurePreferences
|
|
||||||
import org.session.libsignal.utilities.Base64
|
import org.session.libsignal.utilities.Base64
|
||||||
import org.session.libsignal.utilities.Log
|
import org.session.libsignal.utilities.Log
|
||||||
import java.lang.Exception
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
private val TAG = HuaweiPushService::class.java.simpleName
|
private val TAG = HuaweiPushService::class.java.simpleName
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class HuaweiPushService: HmsMessageService() {
|
class HuaweiPushService: HmsMessageService() {
|
||||||
@Inject lateinit var pushRegistry: PushRegistry
|
@Inject lateinit var tokenFetcher: TokenFetcher
|
||||||
@Inject lateinit var pushReceiver: PushReceiver
|
@Inject lateinit var pushReceiver: PushReceiver
|
||||||
|
|
||||||
override fun onMessageReceived(message: RemoteMessage?) {
|
override fun onMessageReceived(message: RemoteMessage?) {
|
||||||
@ -25,16 +23,15 @@ class HuaweiPushService: HmsMessageService() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onNewToken(token: String?) {
|
override fun onNewToken(token: String?) {
|
||||||
pushRegistry.register(token)
|
if (token != null) {
|
||||||
|
tokenFetcher.onNewToken(token)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onNewToken(token: String?, bundle: Bundle?) {
|
override fun onNewToken(token: String?, bundle: Bundle?) {
|
||||||
Log.d(TAG, "New HCM token: $token.")
|
Log.d(TAG, "New HCM token: $token.")
|
||||||
pushRegistry.register(token)
|
if (token != null) {
|
||||||
}
|
tokenFetcher.onNewToken(token)
|
||||||
|
}
|
||||||
override fun onDeletedMessages() {
|
|
||||||
Log.d(TAG, "onDeletedMessages")
|
|
||||||
pushRegistry.refresh(false)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,14 +2,13 @@ package org.thoughtcrime.securesms.notifications
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.huawei.hms.aaid.HmsInstanceId
|
import com.huawei.hms.aaid.HmsInstanceId
|
||||||
import dagger.Lazy
|
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.GlobalScope
|
||||||
import kotlinx.coroutines.MainScope
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.session.libsignal.utilities.Log
|
import org.session.libsession.messaging.notifications.TokenFetcher
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@ -19,13 +18,20 @@ private const val TOKEN_SCOPE = "HCM"
|
|||||||
@Singleton
|
@Singleton
|
||||||
class HuaweiTokenFetcher @Inject constructor(
|
class HuaweiTokenFetcher @Inject constructor(
|
||||||
@ApplicationContext private val context: Context,
|
@ApplicationContext private val context: Context,
|
||||||
private val pushRegistry: Lazy<PushRegistry>,
|
|
||||||
): TokenFetcher {
|
): TokenFetcher {
|
||||||
override suspend fun fetch(): String? = HmsInstanceId.getInstance(context).run {
|
override val token = MutableStateFlow<String?>(null)
|
||||||
// https://developer.huawei.com/consumer/en/doc/development/HMS-Guides/push-basic-capability#h2-1576218800370
|
|
||||||
// getToken may return an empty string, if so HuaweiPushService#onNewToken will be called.
|
override fun onNewToken(token: String) {
|
||||||
withContext(Dispatchers.IO) {
|
this.token.value = token
|
||||||
getToken(APP_ID, TOKEN_SCOPE)
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
GlobalScope.launch {
|
||||||
|
val instanceId = HmsInstanceId.getInstance(context)
|
||||||
|
withContext(Dispatchers.Default) {
|
||||||
|
instanceId.getToken(APP_ID, TOKEN_SCOPE)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,6 @@ import kotlinx.serialization.json.jsonObject
|
|||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
import org.session.libsession.messaging.notifications.TokenFetcher
|
|
||||||
import org.session.libsession.messaging.sending_receiving.notifications.Response
|
import org.session.libsession.messaging.sending_receiving.notifications.Response
|
||||||
import org.session.libsession.messaging.sending_receiving.notifications.Server
|
import org.session.libsession.messaging.sending_receiving.notifications.Server
|
||||||
import org.session.libsession.messaging.sending_receiving.notifications.SubscriptionRequest
|
import org.session.libsession.messaging.sending_receiving.notifications.SubscriptionRequest
|
||||||
@ -21,7 +20,7 @@ import org.session.libsession.messaging.sending_receiving.notifications.Subscrip
|
|||||||
import org.session.libsession.messaging.sending_receiving.notifications.UnsubscribeResponse
|
import org.session.libsession.messaging.sending_receiving.notifications.UnsubscribeResponse
|
||||||
import org.session.libsession.messaging.sending_receiving.notifications.UnsubscriptionRequest
|
import org.session.libsession.messaging.sending_receiving.notifications.UnsubscriptionRequest
|
||||||
import org.session.libsession.snode.OnionRequestAPI
|
import org.session.libsession.snode.OnionRequestAPI
|
||||||
import org.session.libsession.snode.SnodeAPI
|
import org.session.libsession.snode.SnodeClock
|
||||||
import org.session.libsession.snode.SwarmAuth
|
import org.session.libsession.snode.SwarmAuth
|
||||||
import org.session.libsession.snode.Version
|
import org.session.libsession.snode.Version
|
||||||
import org.session.libsession.snode.utilities.await
|
import org.session.libsession.snode.utilities.await
|
||||||
@ -36,6 +35,7 @@ private const val maxRetryCount = 4
|
|||||||
class PushRegistryV2 @Inject constructor(
|
class PushRegistryV2 @Inject constructor(
|
||||||
private val pushReceiver: PushReceiver,
|
private val pushReceiver: PushReceiver,
|
||||||
private val device: Device,
|
private val device: Device,
|
||||||
|
private val clock: SnodeClock,
|
||||||
) {
|
) {
|
||||||
suspend fun register(
|
suspend fun register(
|
||||||
token: String,
|
token: String,
|
||||||
@ -44,7 +44,7 @@ class PushRegistryV2 @Inject constructor(
|
|||||||
) {
|
) {
|
||||||
val pnKey = pushReceiver.getOrCreateNotificationKey()
|
val pnKey = pushReceiver.getOrCreateNotificationKey()
|
||||||
|
|
||||||
val timestamp = SnodeAPI.nowWithOffset / 1000 // get timestamp in ms -> s
|
val timestamp = clock.currentTimeMills() / 1000 // get timestamp in ms -> s
|
||||||
val publicKey = swarmAuth.accountId.hexString
|
val publicKey = swarmAuth.accountId.hexString
|
||||||
val signed = swarmAuth.sign(
|
val signed = swarmAuth.sign(
|
||||||
"MONITOR${publicKey}${timestamp}1${namespaces.joinToString(separator = ",")}".encodeToByteArray()
|
"MONITOR${publicKey}${timestamp}1${namespaces.joinToString(separator = ",")}".encodeToByteArray()
|
||||||
@ -75,7 +75,7 @@ class PushRegistryV2 @Inject constructor(
|
|||||||
swarmAuth: SwarmAuth
|
swarmAuth: SwarmAuth
|
||||||
) {
|
) {
|
||||||
val publicKey = swarmAuth.accountId.hexString
|
val publicKey = swarmAuth.accountId.hexString
|
||||||
val timestamp = SnodeAPI.nowWithOffset / 1000 // get timestamp in ms -> s
|
val timestamp = clock.currentTimeMills() / 1000 // get timestamp in ms -> s
|
||||||
// if we want to support passing namespace list, here is the place to do it
|
// if we want to support passing namespace list, here is the place to do it
|
||||||
val signature = swarmAuth.signForPushRegistry(
|
val signature = swarmAuth.signForPushRegistry(
|
||||||
"UNSUBSCRIBE${publicKey}${timestamp}".encodeToByteArray()
|
"UNSUBSCRIBE${publicKey}${timestamp}".encodeToByteArray()
|
||||||
|
Loading…
Reference in New Issue
Block a user