commit 5a47e04093d05b2f811a10475421a067220b46d8
parent 904d9175b69b20156d6f083a4d389149655ab908
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Fri, 15 Sep 2023 00:53:42 +0200
feat(notification): new message attachment decoder
Diffstat:
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/Notifications.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/Notifications.kt
@@ -30,9 +30,12 @@ import me.rhunk.snapenhance.features.Feature
import me.rhunk.snapenhance.features.FeatureLoadParams
import me.rhunk.snapenhance.features.impl.Messaging
import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader
+import me.rhunk.snapenhance.features.impl.downloader.decoder.MessageDecoder
import me.rhunk.snapenhance.hook.HookStage
import me.rhunk.snapenhance.hook.Hooker
import me.rhunk.snapenhance.hook.hook
+import kotlin.io.encoding.Base64
+import kotlin.io.encoding.ExperimentalEncodingApi
class Notifications : Feature("Notifications", loadParams = FeatureLoadParams.INIT_SYNC) {
companion object{
@@ -183,6 +186,7 @@ class Notifications : Feature("Notifications", loadParams = FeatureLoadParams.IN
}
}
+ @OptIn(ExperimentalEncodingApi::class)
private fun fetchMessagesResult(conversationId: String, messages: List<Message>) {
val sendNotificationData = { notificationData: NotificationData, forceCreate: Boolean ->
val notificationId = if (forceCreate) System.nanoTime().toInt() else notificationData.id
@@ -241,20 +245,25 @@ class Notifications : Feature("Notifications", loadParams = FeatureLoadParams.IN
}
appendNotifications()
}
- ContentType.SNAP, ContentType.EXTERNAL_MEDIA-> {
- //serialize the message content into a json object
+ ContentType.SNAP, ContentType.EXTERNAL_MEDIA -> {
val serializedMessageContent = context.gson.toJsonTree(snapMessage.messageContent.instanceNonNull()).asJsonObject
- val mediaReferences = serializedMessageContent["mRemoteMediaReferences"]
- .asJsonArray.map { it.asJsonObject["mMediaReferences"].asJsonArray }
+ val mediaReferences = serializedMessageContent
+ .getAsJsonArray("mRemoteMediaReferences")
+ .map { it.asJsonObject.getAsJsonArray("mMediaReferences") }
.flatten()
- mediaReferences.forEach { media ->
- val protoMediaReference = media.asJsonObject["mContentObject"].asJsonArray.map { it.asByte }.toByteArray()
- val mediaType = MediaReferenceType.valueOf(media.asJsonObject["mMediaType"].asString)
+ val mediaReferenceUrls = mediaReferences.map { reference ->
+ reference.asJsonObject.getAsJsonArray("mContentObject").map { it.asByte }.toByteArray()
+ }
+
+ MessageDecoder.decode(
+ ProtoReader(contentData),
+ customMediaReferences = mediaReferenceUrls.map { Base64.UrlSafe.encode(it) }
+ ).forEachIndexed { index, media ->
+ val mediaType = MediaReferenceType.valueOf(mediaReferences[index].asJsonObject["mMediaType"].asString)
runCatching {
- val messageReader = ProtoReader(contentData)
- val downloadedMediaList = MediaDownloaderHelper.downloadMediaFromReference(protoMediaReference) {
- EncryptionHelper.decryptInputStream(it, contentType, messageReader, isArroyo = false)
+ val downloadedMediaList = MediaDownloaderHelper.downloadMediaFromReference(mediaReferenceUrls[index]) { inputStream ->
+ media.attachmentInfo?.encryption?.let { EncryptionHelper.decryptInputStream(inputStream, it) } ?: inputStream
}
var bitmapPreview = PreviewUtils.createPreview(downloadedMediaList[SplitMediaAssetType.ORIGINAL]!!, mediaType.name.contains("VIDEO"))!!
@@ -279,7 +288,8 @@ class Notifications : Feature("Notifications", loadParams = FeatureLoadParams.IN
}
}
else -> {
- notificationCache.add(formatUsername("sent $contentType"))
+ notificationCache.add(formatUsername("sent ${contentType.name.lowercase()}"))
+ appendNotifications()
}
}