feat(c2dm): temp functioning notifications impl
Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
parent
0696f1a8de
commit
5497933589
|
|
@ -3,6 +3,7 @@ package chat.revolt.c2dm
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import android.util.Log
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
|
|
@ -11,14 +12,22 @@ import androidx.core.app.RemoteInput
|
||||||
import androidx.core.graphics.drawable.IconCompat
|
import androidx.core.graphics.drawable.IconCompat
|
||||||
import chat.revolt.R
|
import chat.revolt.R
|
||||||
import chat.revolt.activities.MainActivity
|
import chat.revolt.activities.MainActivity
|
||||||
import chat.revolt.api.internals.SpecialUsers
|
import chat.revolt.api.REVOLT_BASE
|
||||||
|
import chat.revolt.api.RevoltJson
|
||||||
import chat.revolt.api.internals.ULID
|
import chat.revolt.api.internals.ULID
|
||||||
import chat.revolt.api.routes.push.subscribePush
|
import chat.revolt.api.routes.push.subscribePush
|
||||||
|
import chat.revolt.api.schemas.Message
|
||||||
|
import chat.revolt.api.schemas.User
|
||||||
import chat.revolt.c2dm.ChannelRegistrator.Companion.CHANNEL_ID_GROUP_SOCIAL_FRIENDREQUESTS
|
import chat.revolt.c2dm.ChannelRegistrator.Companion.CHANNEL_ID_GROUP_SOCIAL_FRIENDREQUESTS
|
||||||
|
import chat.revolt.persistence.Database
|
||||||
|
import chat.revolt.persistence.SqlStorage
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.google.firebase.messaging.FirebaseMessagingService
|
import com.google.firebase.messaging.FirebaseMessagingService
|
||||||
import com.google.firebase.messaging.RemoteMessage
|
import com.google.firebase.messaging.RemoteMessage
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import kotlinx.serialization.json.contentOrNull
|
||||||
|
import kotlinx.serialization.json.jsonObject
|
||||||
|
import kotlinx.serialization.json.jsonPrimitive
|
||||||
|
|
||||||
class HandlerService : FirebaseMessagingService() {
|
class HandlerService : FirebaseMessagingService() {
|
||||||
override fun onNewToken(token: String) {
|
override fun onNewToken(token: String) {
|
||||||
|
|
@ -28,29 +37,102 @@ class HandlerService : FirebaseMessagingService() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMessageReceived(message: RemoteMessage) {
|
override fun onMessageReceived(fcmMessage: RemoteMessage) {
|
||||||
val integ = ULID.asInteger(ULID.makeNext())
|
/// TEMPORARY CODE, SCHEMA TO BE REPLACED
|
||||||
|
val payloadString = fcmMessage.data["payload"]
|
||||||
|
if (payloadString == null) {
|
||||||
|
Log.e("HandlerService", "No payload in message, abort")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d("HandlerService", payloadString)
|
||||||
|
|
||||||
|
val payload = RevoltJson.parseToJsonElement(payloadString).jsonObject
|
||||||
|
val keys = payload.keys.toList().toString()
|
||||||
|
Log.d("HandlerService", "following keys: $keys")
|
||||||
|
|
||||||
|
var authorIcon = payload["icon"]?.jsonPrimitive?.contentOrNull
|
||||||
|
val message = payload["message"]?.jsonObject?.let {
|
||||||
|
RevoltJson.decodeFromJsonElement(
|
||||||
|
Message.serializer(),
|
||||||
|
it
|
||||||
|
)
|
||||||
|
} ?: run {
|
||||||
|
Log.e("HandlerService", "No message in payload, abort")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val user = payload["message"]?.jsonObject?.get("user")?.jsonObject?.let {
|
||||||
|
RevoltJson.decodeFromJsonElement(
|
||||||
|
User.serializer(),
|
||||||
|
it
|
||||||
|
)
|
||||||
|
} ?: run {
|
||||||
|
Log.e("HandlerService", "No message->user in payload, abort")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val notificationId = message.channel?.let { ULID.asInteger(it) } ?: run {
|
||||||
|
Log.e("HandlerService", "No channel in message, abort")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (authorIcon == null) {
|
||||||
|
authorIcon =
|
||||||
|
"$REVOLT_BASE/users/${message.author?.ifBlank { "0".repeat(26) }}/default_avatar"
|
||||||
|
}
|
||||||
|
|
||||||
|
val db = Database(SqlStorage.driver)
|
||||||
|
val channelName = message.channel.let {
|
||||||
|
db.channelQueries.findById(it).executeAsOneOrNull()
|
||||||
|
}?.let {
|
||||||
|
when (it.channelType) {
|
||||||
|
"DirectMessage" -> {
|
||||||
|
user.displayName ?: user.username
|
||||||
|
}
|
||||||
|
|
||||||
|
"TextChannel" -> {
|
||||||
|
"#${it.name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
it.name ?: getString(R.string.unknown)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ?: getString(
|
||||||
|
R.string.unknown
|
||||||
|
)
|
||||||
|
|
||||||
|
val messageTimestamp = message.id?.let { ULID.asTimestamp(it) } ?: run {
|
||||||
|
Log.e("HandlerService", "No message id in message, abort")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
val bitmap = Glide.with(this)
|
val bitmap = Glide.with(this)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.load("https://autumn.revolt.chat/avatars/GJXjHUC1X7tGEgHFhYOvtCByuNRd72qFwlztjKZUHP/bfe0842b74ae716139138574e8a1b749751e2968~3.jpg")
|
.load(authorIcon)
|
||||||
.circleCrop()
|
.circleCrop()
|
||||||
.submit()
|
.submit()
|
||||||
.get()
|
.get()
|
||||||
val jen =
|
|
||||||
|
val author =
|
||||||
Person.Builder()
|
Person.Builder()
|
||||||
.setBot(true)
|
.setBot(user.bot != null)
|
||||||
.setKey(SpecialUsers.JENNIFER)
|
.setKey(message.author)
|
||||||
.setIcon(IconCompat.createWithBitmap(bitmap))
|
.setIcon(IconCompat.createWithBitmap(bitmap))
|
||||||
.setName("Jennifer")
|
.setName(user.displayName ?: user.username)
|
||||||
.build()
|
.build()
|
||||||
var remoteInput = RemoteInput.Builder("Reply").run {
|
|
||||||
setLabel("Reply")
|
val remoteInput = RemoteInput.Builder("content").run {
|
||||||
|
setLabel(getString(R.string.message_context_sheet_actions_reply))
|
||||||
build()
|
build()
|
||||||
}
|
}
|
||||||
var action: NotificationCompat.Action =
|
|
||||||
|
val action: NotificationCompat.Action =
|
||||||
NotificationCompat.Action.Builder(
|
NotificationCompat.Action.Builder(
|
||||||
R.drawable.ic_reply_24dp,
|
R.drawable.ic_reply_24dp,
|
||||||
"Reply", PendingIntent.getActivity(
|
getString(R.string.message_context_sheet_actions_reply),
|
||||||
|
PendingIntent.getActivity(
|
||||||
this,
|
this,
|
||||||
0,
|
0,
|
||||||
Intent(this, MainActivity::class.java),
|
Intent(this, MainActivity::class.java),
|
||||||
|
|
@ -59,15 +141,20 @@ class HandlerService : FirebaseMessagingService() {
|
||||||
)
|
)
|
||||||
.addRemoteInput(remoteInput)
|
.addRemoteInput(remoteInput)
|
||||||
.build()
|
.build()
|
||||||
var builder = NotificationCompat.Builder(this, CHANNEL_ID_GROUP_SOCIAL_FRIENDREQUESTS)
|
|
||||||
|
val builder = NotificationCompat.Builder(this, CHANNEL_ID_GROUP_SOCIAL_FRIENDREQUESTS)
|
||||||
.setSmallIcon(R.drawable.ic_message_text_24dp)
|
.setSmallIcon(R.drawable.ic_message_text_24dp)
|
||||||
.setContentTitle("Jennifer")
|
.setContentTitle(user.displayName ?: user.username)
|
||||||
.setContentText("Expand for details")
|
.setContentText(message.content)
|
||||||
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
|
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
|
||||||
.setStyle(
|
.setStyle(
|
||||||
NotificationCompat.MessagingStyle(jen)
|
NotificationCompat.MessagingStyle(author)
|
||||||
.setConversationTitle("#Genderal")
|
.setConversationTitle(channelName)
|
||||||
.addMessage("hiii 👋", System.currentTimeMillis(), jen)
|
.addMessage(
|
||||||
|
message.content ?: getString(R.string.reply_message_empty_has_attachments),
|
||||||
|
messageTimestamp,
|
||||||
|
author
|
||||||
|
)
|
||||||
)
|
)
|
||||||
.addAction(action)
|
.addAction(action)
|
||||||
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
||||||
|
|
@ -80,7 +167,8 @@ class HandlerService : FirebaseMessagingService() {
|
||||||
) {
|
) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
notify(integ, builder.build())
|
notify(notificationId, builder.build())
|
||||||
}
|
}
|
||||||
|
/// END TEMPORARY CODE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -51,4 +51,9 @@ AND dmPartner = ?;
|
||||||
findByServer:
|
findByServer:
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM Channel
|
FROM Channel
|
||||||
WHERE server = ?;
|
WHERE server = ?;
|
||||||
|
|
||||||
|
findById:
|
||||||
|
SELECT *
|
||||||
|
FROM Channel
|
||||||
|
WHERE id = ?;
|
||||||
Loading…
Reference in New Issue