From 549793358935d7682cfac67afb3a93bf57d2eda5 Mon Sep 17 00:00:00 2001 From: Infi Date: Sun, 1 Sep 2024 17:02:21 +0200 Subject: [PATCH] feat(c2dm): temp functioning notifications impl Signed-off-by: Infi --- .../java/chat/revolt/c2dm/HandlerService.kt | 126 +++++++++++++++--- .../chat/revolt/persistence/cache/Channel.sq | 7 +- 2 files changed, 113 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/chat/revolt/c2dm/HandlerService.kt b/app/src/main/java/chat/revolt/c2dm/HandlerService.kt index 8f21e026..e84fe876 100644 --- a/app/src/main/java/chat/revolt/c2dm/HandlerService.kt +++ b/app/src/main/java/chat/revolt/c2dm/HandlerService.kt @@ -3,6 +3,7 @@ package chat.revolt.c2dm import android.app.PendingIntent import android.content.Intent import android.content.pm.PackageManager +import android.util.Log import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -11,14 +12,22 @@ import androidx.core.app.RemoteInput import androidx.core.graphics.drawable.IconCompat import chat.revolt.R 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.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.persistence.Database +import chat.revolt.persistence.SqlStorage import com.bumptech.glide.Glide import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage import kotlinx.coroutines.runBlocking +import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive class HandlerService : FirebaseMessagingService() { override fun onNewToken(token: String) { @@ -28,29 +37,102 @@ class HandlerService : FirebaseMessagingService() { } } - override fun onMessageReceived(message: RemoteMessage) { - val integ = ULID.asInteger(ULID.makeNext()) + override fun onMessageReceived(fcmMessage: RemoteMessage) { + /// 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) .asBitmap() - .load("https://autumn.revolt.chat/avatars/GJXjHUC1X7tGEgHFhYOvtCByuNRd72qFwlztjKZUHP/bfe0842b74ae716139138574e8a1b749751e2968~3.jpg") + .load(authorIcon) .circleCrop() .submit() .get() - val jen = + + val author = Person.Builder() - .setBot(true) - .setKey(SpecialUsers.JENNIFER) + .setBot(user.bot != null) + .setKey(message.author) .setIcon(IconCompat.createWithBitmap(bitmap)) - .setName("Jennifer") + .setName(user.displayName ?: user.username) .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() } - var action: NotificationCompat.Action = + + val action: NotificationCompat.Action = NotificationCompat.Action.Builder( R.drawable.ic_reply_24dp, - "Reply", PendingIntent.getActivity( + getString(R.string.message_context_sheet_actions_reply), + PendingIntent.getActivity( this, 0, Intent(this, MainActivity::class.java), @@ -59,15 +141,20 @@ class HandlerService : FirebaseMessagingService() { ) .addRemoteInput(remoteInput) .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) - .setContentTitle("Jennifer") - .setContentText("Expand for details") + .setContentTitle(user.displayName ?: user.username) + .setContentText(message.content) .setCategory(NotificationCompat.CATEGORY_MESSAGE) .setStyle( - NotificationCompat.MessagingStyle(jen) - .setConversationTitle("#Genderal") - .addMessage("hiii 👋", System.currentTimeMillis(), jen) + NotificationCompat.MessagingStyle(author) + .setConversationTitle(channelName) + .addMessage( + message.content ?: getString(R.string.reply_message_empty_has_attachments), + messageTimestamp, + author + ) ) .addAction(action) .setPriority(NotificationCompat.PRIORITY_DEFAULT) @@ -80,7 +167,8 @@ class HandlerService : FirebaseMessagingService() { ) { return } - notify(integ, builder.build()) + notify(notificationId, builder.build()) } + /// END TEMPORARY CODE } } \ No newline at end of file diff --git a/app/src/main/sqldelight/chat/revolt/persistence/cache/Channel.sq b/app/src/main/sqldelight/chat/revolt/persistence/cache/Channel.sq index 4baea202..89afd512 100644 --- a/app/src/main/sqldelight/chat/revolt/persistence/cache/Channel.sq +++ b/app/src/main/sqldelight/chat/revolt/persistence/cache/Channel.sq @@ -51,4 +51,9 @@ AND dmPartner = ?; findByServer: SELECT * FROM Channel -WHERE server = ?; \ No newline at end of file +WHERE server = ?; + +findById: +SELECT * +FROM Channel +WHERE id = ?; \ No newline at end of file