commit c5def2e69db6aaa63903932340741af0ee9fa4fc parent e360011b7b14560da48f40d5e0a37e6197dd5858 Author: rhunk <101876869+rhunk@users.noreply.github.com> Date: Wed, 2 Aug 2023 09:35:02 +0200 merge GalleryMediaSendOverride Diffstat:
15 files changed, 122 insertions(+), 112 deletions(-)
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/Navigation.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/Navigation.kt @@ -60,7 +60,7 @@ class Navigation( NavigationBarItem( modifier = Modifier - .requiredWidth(120.dp) + .requiredWidth(75.dp) .fillMaxHeight(), icon = { val iconOffset by animateDpAsState( diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/EventDispatcher.kt b/core/src/main/kotlin/me/rhunk/snapenhance/EventDispatcher.kt @@ -1,7 +1,7 @@ package me.rhunk.snapenhance -import me.rhunk.snapenhance.core.event.impl.OnSnapInteractionEvent -import me.rhunk.snapenhance.core.event.impl.SendMessageWithContentEvent +import me.rhunk.snapenhance.core.eventbus.events.impl.OnSnapInteractionEvent +import me.rhunk.snapenhance.core.eventbus.events.impl.SendMessageWithContentEvent import me.rhunk.snapenhance.data.wrapper.impl.MessageContent import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID import me.rhunk.snapenhance.hook.HookStage @@ -14,7 +14,7 @@ class EventDispatcher( override fun init() { context.classCache.conversationManager.hook("sendMessageWithContent", HookStage.BEFORE) { param -> val messageContent = MessageContent(param.arg(1)) - context.event.post(SendMessageWithContentEvent(messageContent))?.let { + context.event.post(SendMessageWithContentEvent(messageContent).apply { adapter = param })?.let { if (it.canceled) { param.setResult(null) } @@ -24,10 +24,12 @@ class EventDispatcher( context.classCache.snapManager.hook("onSnapInteraction", HookStage.BEFORE) { param -> val conversationId = SnapUUID(param.arg(1)) val messageId = param.arg<Long>(2) - context.event.post(OnSnapInteractionEvent( + context.event.post( + OnSnapInteractionEvent( conversationId = conversationId, messageId = messageId - ))?.let { + ) + )?.let { if (it.canceled) { param.setResult(null) } diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/ModContext.kt b/core/src/main/kotlin/me/rhunk/snapenhance/ModContext.kt @@ -14,7 +14,7 @@ import kotlinx.coroutines.asCoroutineDispatcher import me.rhunk.snapenhance.bridge.BridgeClient import me.rhunk.snapenhance.bridge.wrapper.TranslationWrapper import me.rhunk.snapenhance.core.config.ModConfig -import me.rhunk.snapenhance.core.event.EventBus +import me.rhunk.snapenhance.core.eventbus.EventBus import me.rhunk.snapenhance.data.MessageSender import me.rhunk.snapenhance.database.DatabaseAccess import me.rhunk.snapenhance.features.Feature diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/config/impl/MessagingTweaks.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/config/impl/MessagingTweaks.kt @@ -19,7 +19,7 @@ class MessagingTweaks : ConfigContainer() { "STICKER" ) - val galleryMediaSendOverride = unique("gallery_media_send_override", "NOTE", "SNAP", "LIVE_SNAP") + val galleryMediaSendOverride = boolean("gallery_media_send_override") val messagePreviewLength = integer("message_preview_length", defaultValue = 20) } \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/event/EventBus.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/event/EventBus.kt @@ -1,66 +0,0 @@ -package me.rhunk.snapenhance.core.event - -import me.rhunk.snapenhance.Logger -import me.rhunk.snapenhance.ModContext -import kotlin.reflect.KClass - -abstract class Event { - lateinit var context: ModContext - var canceled = false -} - -interface IListener<T> { - fun handle(event: T) -} - -class EventBus( - private val context: ModContext -) { - private val subscribers = mutableMapOf<KClass<out Event>, MutableList<IListener<out Event>>>() - - fun <T : Event> subscribe(event: KClass<T>, listener: IListener<T>) { - if (!subscribers.containsKey(event)) { - subscribers[event] = mutableListOf() - } - subscribers[event]!!.add(listener) - } - - inline fun <T : Event> subscribe(event: KClass<T>, crossinline listener: (T) -> Unit): () -> Unit { - val obj = object : IListener<T> { - override fun handle(event: T) { - listener(event) - } - } - subscribe(event, obj) - return { unsubscribe(event, obj) } - } - - fun <T : Event> unsubscribe(event: KClass<T>, listener: IListener<T>) { - if (!subscribers.containsKey(event)) { - return - } - subscribers[event]!!.remove(listener) - } - - fun <T : Event> post(event: T): T? { - if (!subscribers.containsKey(event::class)) { - return null - } - - event.context = context - - subscribers[event::class]?.forEach { listener -> - @Suppress("UNCHECKED_CAST") - runCatching { - (listener as IListener<T>).handle(event) - }.onFailure { t -> - Logger.error("Error while handling event ${event::class.simpleName} by ${listener::class.simpleName}", t) - } - } - return event - } - - fun clear() { - subscribers.clear() - } -}- \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/event/impl/OnSnapInteractionEvent.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/event/impl/OnSnapInteractionEvent.kt @@ -1,9 +0,0 @@ -package me.rhunk.snapenhance.core.event.impl - -import me.rhunk.snapenhance.core.event.Event -import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID - -class OnSnapInteractionEvent( - val conversationId: SnapUUID, - val messageId: Long -) : Event()- \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/event/impl/SendMessageWithContentEvent.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/event/impl/SendMessageWithContentEvent.kt @@ -1,8 +0,0 @@ -package me.rhunk.snapenhance.core.event.impl - -import me.rhunk.snapenhance.core.event.Event -import me.rhunk.snapenhance.data.wrapper.impl.MessageContent - -class SendMessageWithContentEvent( - val messageContent: MessageContent -) : Event()- \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/EventBus.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/EventBus.kt @@ -0,0 +1,69 @@ +package me.rhunk.snapenhance.core.eventbus + +import me.rhunk.snapenhance.Logger +import me.rhunk.snapenhance.ModContext +import kotlin.reflect.KClass + +abstract class Event { + lateinit var context: ModContext + var canceled = false +} + +interface IListener<T> { + fun handle(event: T) +} + +class EventBus( + private val context: ModContext +) { + private val subscribers = mutableMapOf<KClass<out Event>, MutableList<IListener<out Event>>>() + + fun <T : Event> subscribe(event: KClass<T>, listener: IListener<T>) { + if (!subscribers.containsKey(event)) { + subscribers[event] = mutableListOf() + } + subscribers[event]!!.add(listener) + } + + inline fun <T : Event> subscribe(event: KClass<T>, crossinline listener: (T) -> Unit) = subscribe(event, { true }, listener) + + inline fun <T : Event> subscribe(event: KClass<T>, crossinline filter: (T) -> Boolean, crossinline listener: (T) -> Unit): () -> Unit { + val obj = object : IListener<T> { + override fun handle(event: T) { + if (!filter(event)) return + listener(event) + } + } + subscribe(event, obj) + return { unsubscribe(event, obj) } + } + + fun <T : Event> unsubscribe(event: KClass<T>, listener: IListener<T>) { + if (!subscribers.containsKey(event)) { + return + } + subscribers[event]!!.remove(listener) + } + + fun <T : Event> post(event: T): T? { + if (!subscribers.containsKey(event::class)) { + return null + } + + event.context = context + + subscribers[event::class]?.forEach { listener -> + @Suppress("UNCHECKED_CAST") + runCatching { + (listener as IListener<T>).handle(event) + }.onFailure { t -> + Logger.error("Error while handling event ${event::class.simpleName} by ${listener::class.simpleName}", t) + } + } + return event + } + + fun clear() { + subscribers.clear() + } +}+ \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/AbstractHookEvent.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/AbstractHookEvent.kt @@ -0,0 +1,8 @@ +package me.rhunk.snapenhance.core.eventbus.events + +import me.rhunk.snapenhance.core.eventbus.Event +import me.rhunk.snapenhance.hook.HookAdapter + +abstract class AbstractHookEvent : Event() { + lateinit var adapter: HookAdapter +}+ \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/impl/OnSnapInteractionEvent.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/impl/OnSnapInteractionEvent.kt @@ -0,0 +1,9 @@ +package me.rhunk.snapenhance.core.eventbus.events.impl + +import me.rhunk.snapenhance.core.eventbus.events.AbstractHookEvent +import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID + +class OnSnapInteractionEvent( + val conversationId: SnapUUID, + val messageId: Long +) : AbstractHookEvent()+ \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/impl/SendMessageWithContentEvent.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/impl/SendMessageWithContentEvent.kt @@ -0,0 +1,8 @@ +package me.rhunk.snapenhance.core.eventbus.events.impl + +import me.rhunk.snapenhance.core.eventbus.events.AbstractHookEvent +import me.rhunk.snapenhance.data.wrapper.impl.MessageContent + +class SendMessageWithContentEvent( + val messageContent: MessageContent +) : AbstractHookEvent()+ \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/Messaging.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/Messaging.kt @@ -1,6 +1,6 @@ package me.rhunk.snapenhance.features.impl -import me.rhunk.snapenhance.core.event.impl.OnSnapInteractionEvent +import me.rhunk.snapenhance.core.eventbus.events.impl.OnSnapInteractionEvent import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID import me.rhunk.snapenhance.features.Feature import me.rhunk.snapenhance.features.FeatureLoadParams diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/privacy/PreventMessageSending.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/privacy/PreventMessageSending.kt @@ -1,9 +1,8 @@ package me.rhunk.snapenhance.features.impl.privacy import me.rhunk.snapenhance.Logger -import me.rhunk.snapenhance.core.event.impl.SendMessageWithContentEvent +import me.rhunk.snapenhance.core.eventbus.events.impl.SendMessageWithContentEvent import me.rhunk.snapenhance.data.NotificationType -import me.rhunk.snapenhance.data.wrapper.impl.MessageContent import me.rhunk.snapenhance.features.Feature import me.rhunk.snapenhance.features.FeatureLoadParams import me.rhunk.snapenhance.hook.HookStage diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/spying/PreventReadReceipts.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/spying/PreventReadReceipts.kt @@ -1,6 +1,6 @@ package me.rhunk.snapenhance.features.impl.spying -import me.rhunk.snapenhance.core.event.impl.OnSnapInteractionEvent +import me.rhunk.snapenhance.core.eventbus.events.impl.OnSnapInteractionEvent import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID import me.rhunk.snapenhance.features.Feature import me.rhunk.snapenhance.features.FeatureLoadParams diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/GalleryMediaSendOverride.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/GalleryMediaSendOverride.kt @@ -1,14 +1,10 @@ package me.rhunk.snapenhance.features.impl.tweaks -import android.app.AlertDialog -import me.rhunk.snapenhance.config.ConfigProperty +import me.rhunk.snapenhance.core.eventbus.events.impl.SendMessageWithContentEvent import me.rhunk.snapenhance.data.ContentType import me.rhunk.snapenhance.data.MessageSender -import me.rhunk.snapenhance.data.wrapper.impl.MessageContent import me.rhunk.snapenhance.features.Feature import me.rhunk.snapenhance.features.FeatureLoadParams -import me.rhunk.snapenhance.hook.HookStage -import me.rhunk.snapenhance.hook.Hooker import me.rhunk.snapenhance.ui.ViewAppearanceHelper import me.rhunk.snapenhance.util.protobuf.ProtoReader @@ -20,20 +16,21 @@ class GalleryMediaSendOverride : Feature("Gallery Media Send Override", loadPara "LIVE_SNAP", "NOTE" ).associateWith { - context.translation[ConfigProperty.GALLERY_MEDIA_SEND_OVERRIDE.getOptionTranslationKey(it)] + it } - Hooker.hook(context.classCache.conversationManager, "sendMessageWithContent", HookStage.BEFORE, { - context.config.bool(ConfigProperty.GALLERY_MEDIA_SEND_OVERRIDE) - }) { param -> - val localMessageContent = MessageContent(param.arg(1)) - if (localMessageContent.contentType != ContentType.EXTERNAL_MEDIA) return@hook + context.event.subscribe(SendMessageWithContentEvent::class, { + context.config.messaging.galleryMediaSendOverride.get() + }) { event -> + + val localMessageContent = event.messageContent + if (localMessageContent.contentType != ContentType.EXTERNAL_MEDIA) return@subscribe //prevent story replies val messageProtoReader = ProtoReader(localMessageContent.content) - if (messageProtoReader.exists(7)) return@hook + if (messageProtoReader.exists(7)) return@subscribe - param.setResult(null) + event.canceled = true context.runOnUiThread { ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!) @@ -66,7 +63,7 @@ class GalleryMediaSendOverride : Feature("Gallery Media Send Override", loadPara } } - param.invokeOriginal() + event.adapter.invokeOriginal() } .setNegativeButton(context.translation["button.cancel"], null) .show()