fix(core/notifications): reply

This commit is contained in:
rhunk
2023-10-14 21:43:48 +02:00
parent 3e9c97c18c
commit a38e96906d
6 changed files with 7 additions and 150 deletions

View File

@ -26,8 +26,10 @@ class BridgeService : Service() {
var messagingBridge: MessagingBridge? = null
override fun onDestroy() {
if (::remoteSideContext.isInitialized) {
remoteSideContext.bridgeService = null
}
}
override fun onBind(intent: Intent): IBinder? {
remoteSideContext = SharedContextHolder.remote(this).apply {

View File

@ -21,7 +21,6 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr
DefaultMediaItemMapper::class,
MediaQualityLevelProviderMapper::class,
OperaPageViewControllerMapper::class,
PlatformAnalyticsCreatorMapper::class,
PlusSubscriptionMapper::class,
ScCameraSettingsMapper::class,
StoryBoostStateMapper::class,

View File

@ -90,66 +90,6 @@ enum class PlayableSnapState {
NOTDOWNLOADED, DOWNLOADING, DOWNLOADFAILED, PLAYABLE, VIEWEDREPLAYABLE, PLAYING, VIEWEDNOTREPLAYABLE
}
enum class MetricsMessageMediaType {
NO_MEDIA,
IMAGE,
VIDEO,
VIDEO_NO_SOUND,
GIF,
DERIVED_FROM_MESSAGE_TYPE,
REACTION
}
enum class MetricsMessageType {
TEXT,
STICKER,
CUSTOM_STICKER,
SNAP,
AUDIO_NOTE,
MEDIA,
BATCHED_MEDIA,
MISSED_AUDIO_CALL,
MISSED_VIDEO_CALL,
JOINED_CALL,
LEFT_CALL,
SNAPCHATTER,
LOCATION_SHARE,
LOCATION_REQUEST,
SCREENSHOT,
SCREEN_RECORDING,
GAME_CLOSED,
STORY_SHARE,
MAP_DROP_SHARE,
MAP_STORY_SHARE,
MAP_STORY_SNAP_SHARE,
MAP_HEAT_SNAP_SHARE,
MAP_SCREENSHOT_SHARE,
MEMORIES_STORY,
SEARCH_STORY_SHARE,
SEARCH_STORY_SNAP_SHARE,
DISCOVER_SHARE,
SHAZAM_SHARE,
SAVE_TO_CAMERA_ROLL,
GAME_SCORE_SHARE,
SNAP_PRO_PROFILE_SHARE,
SNAP_PRO_SNAP_SHARE,
CANVAS_APP_SHARE,
AD_SHARE,
STORY_REPLY,
SPOTLIGHT_STORY_SHARE,
CAMEO,
MEMOJI,
BITMOJI_OUTFIT_SHARE,
LIVE_LOCATION_SHARE,
CREATIVE_TOOL_ITEM,
SNAP_KIT_INVITE_SHARE,
QUOTE_REPLY_SHARE,
BLOOPS_STORY_SHARE,
SNAP_PRO_SAVED_STORY_SHARE,
PLACE_PROFILE_SHARE,
PLACE_STORY_SHARE,
SAVED_STORY_SHARE
}
enum class MediaReferenceType {
UNASSIGNED, OVERLAY, IMAGE, VIDEO, ASSET_BUNDLE, AUDIO, ANIMATED_IMAGE, FONT, WEB_VIEW_CONTENT, VIDEO_NO_AUDIO
}

View File

@ -1,8 +1,6 @@
package me.rhunk.snapenhance.core.messaging
import me.rhunk.snapenhance.common.data.ContentType
import me.rhunk.snapenhance.common.data.MetricsMessageMediaType
import me.rhunk.snapenhance.common.data.MetricsMessageType
import me.rhunk.snapenhance.common.util.protobuf.ProtoWriter
import me.rhunk.snapenhance.core.ModContext
import me.rhunk.snapenhance.core.features.impl.messaging.Messaging
@ -59,34 +57,10 @@ class MessageSender(
private val sendMessageCallback by lazy { context.mappings.getMappedClass("callbacks", "SendMessageCallback") }
private val platformAnalyticsCreatorClass by lazy {
context.mappings.getMappedClass("PlatformAnalyticsCreator")
}
private fun defaultPlatformAnalytics(): ByteArray {
val analyticsSource = platformAnalyticsCreatorClass.constructors[0].parameterTypes[0]
val chatAnalyticsSource = analyticsSource.enumConstants.first { it.toString() == "CHAT" }
val platformAnalyticsDefaultArgs = arrayOf(chatAnalyticsSource, null, null, null, null, null, null, null, null, null, 0L, 0L,
null, null, false, null, null, 0L, null, null, false, null, null,
null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, false, null, null, false, 0L, -2, 8191)
val platformAnalyticsInstance = platformAnalyticsCreatorClass.constructors[0].newInstance(
*platformAnalyticsDefaultArgs
) ?: throw Exception("Failed to create platform analytics instance")
return platformAnalyticsInstance.javaClass.declaredMethods.first { it.returnType == ByteArray::class.java }
.invoke(platformAnalyticsInstance) as ByteArray?
?: throw Exception("Failed to get platform analytics content")
}
private fun createLocalMessageContentTemplate(
contentType: ContentType,
messageContent: ByteArray,
localMediaReference: ByteArray? = null,
metricMessageMediaType: MetricsMessageMediaType = MetricsMessageMediaType.DERIVED_FROM_MESSAGE_TYPE,
metricsMediaType: MetricsMessageType = MetricsMessageType.TEXT,
savePolicy: String = "PROHIBITED",
): String {
return """
@ -104,12 +78,10 @@ class MessageSender(
}
}],
"mPlatformAnalytics": {
"mAttemptId": {
"mId": [${(1..16).map { (-127 ..127).random() }.joinToString(",")}]
},
"mContent": [${defaultPlatformAnalytics().joinToString(",")}],
"mMetricsMessageMediaType": "${metricMessageMediaType.name}",
"mMetricsMessageType": "${metricsMediaType.name}",
"mAttemptId": null,
"mContent": [],
"mMetricsMessageMediaType": "NO_MEDIA",
"mMetricsMessageType": "TEXT",
"mReactionSource": "NONE"
},
"mSavePolicy": "$savePolicy"
@ -130,35 +102,6 @@ class MessageSender(
sendMessageWithContentMethod.invoke(context.feature(Messaging::class).conversationManager, messageDestinations.instanceNonNull(), localMessageContent, callback)
}
//TODO: implement sendSnapMessage
/*
fun sendSnapMessage(conversations: List<SnapUUID>, chatMediaType: ChatMediaType, uri: Uri, onError: (Any) -> Unit = {}, onSuccess: () -> Unit = {}) {
val mediaReferenceBuffer = FlatBufferBuilder(0).apply {
val uriOffset = createString(uri.toString())
forceDefaults(true)
startTable(2)
addOffset(1, uriOffset, 0)
addInt(0, chatMediaType.value, 0)
finish(endTable())
finished()
}.sizedByteArray()
internalSendMessage(conversations, createLocalMessageContentTemplate(
contentType = ContentType.SNAP,
messageContent = redSnapProto(chatMediaType == ChatMediaType.AUDIO || chatMediaType == ChatMediaType.VIDEO),
localMediaReference = mediaReferenceBuffer,
metricMessageMediaType = MetricsMessageMediaType.IMAGE,
metricsMediaType = MetricsMessageType.SNAP
), CallbackBuilder(sendMessageCallback)
.override("onSuccess") {
onSuccess()
}
.override("onError") {
onError(it.arg(0))
}
.build())
}*/
fun sendChatMessage(conversations: List<SnapUUID>, message: String, onError: (Any) -> Unit = {}, onSuccess: () -> Unit = {}) {
internalSendMessage(conversations, createLocalMessageContentTemplate(ContentType.CHAT, ProtoWriter().apply {
from(2) {

View File

@ -1,26 +0,0 @@
package me.rhunk.snapenhance.mapper.impl
import me.rhunk.snapenhance.mapper.AbstractClassMapper
import me.rhunk.snapenhance.mapper.ext.findConstString
import me.rhunk.snapenhance.mapper.ext.getClassName
import me.rhunk.snapenhance.mapper.ext.getStaticConstructor
import me.rhunk.snapenhance.mapper.ext.isEnum
class PlatformAnalyticsCreatorMapper : AbstractClassMapper() {
init {
mapper {
for (clazz in classes) {
val firstConstructor = clazz.directMethods.firstOrNull { it.name == "<init>" } ?: continue
// 47 is the number of parameters of the constructor
// it may change in future versions
if (firstConstructor.parameters.size != 47) continue
val firstParameterClass = getClass(firstConstructor.parameterTypes[0]) ?: continue
if (!firstParameterClass.isEnum()) continue
if (firstParameterClass.getStaticConstructor()?.implementation?.findConstString("IN_APP_NOTIFICATION") != true) continue
addMapping("PlatformAnalyticsCreator", clazz.getClassName())
return@mapper
}
}
}
}

View File

@ -16,7 +16,6 @@ class TestMappings {
DefaultMediaItemMapper::class,
MediaQualityLevelProviderMapper::class,
OperaPageViewControllerMapper::class,
PlatformAnalyticsCreatorMapper::class,
PlusSubscriptionMapper::class,
ScCameraSettingsMapper::class,
StoryBoostStateMapper::class,