From f27f4ec94bd17c31d78fa0607575287e9fec8dfe Mon Sep 17 00:00:00 2001 From: Rodi Date: Fri, 20 May 2022 17:12:50 +0100 Subject: [PATCH] Add support for new chat context menu. --- app/libs/snapmod.jar | Bin 181643 -> 194276 bytes .../java/xyz/rodit/snapmod/DelegateProxy.kt | 22 +++ .../rodit/snapmod/features/FeatureManager.kt | 2 + .../features/callbacks/CallbackManager.kt | 14 ++ .../features/chatmenu/ChatMenuModifier.kt | 2 +- .../snapmod/features/chatmenu/ExportOption.kt | 44 +----- .../features/chatmenu/PreviewOption.kt | 83 +---------- .../features/chatmenu/new/MenuPlugin.kt | 12 ++ .../chatmenu/new/NewChatMenuModifier.kt | 72 +++++++++ .../features/chatmenu/new/PlainOption.kt | 24 +++ .../features/chatmenu/new/SwitchOption.kt | 32 ++++ .../features/chatmenu/shared/ExportChat.kt | 48 ++++++ .../features/chatmenu/shared/PreviewChat.kt | 78 ++++++++++ .../snapmod/features/saving/StoriesSaving.kt | 40 ++--- app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/root_preferences.xml | 7 + snap.ds | 141 ++++++++++++++++-- 17 files changed, 463 insertions(+), 161 deletions(-) create mode 100644 app/src/main/java/xyz/rodit/snapmod/DelegateProxy.kt create mode 100644 app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/MenuPlugin.kt create mode 100644 app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/NewChatMenuModifier.kt create mode 100644 app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/PlainOption.kt create mode 100644 app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/SwitchOption.kt create mode 100644 app/src/main/java/xyz/rodit/snapmod/features/chatmenu/shared/ExportChat.kt create mode 100644 app/src/main/java/xyz/rodit/snapmod/features/chatmenu/shared/PreviewChat.kt diff --git a/app/libs/snapmod.jar b/app/libs/snapmod.jar index 3bdce52f884675e2c851240cf3582c5c8ce475af..cc18dd84f0a2ef796baa1fe67681942b13d33568 100644 GIT binary patch delta 53346 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 z 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¨K0ImszCQPy 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 -> Any? + +class DelegateProxy(private val delegate: DelegateFunction) : InvocationHandler { + + override fun invoke(target: Any, method: Method, args: Array?): Any? { + return delegate(target, args ?: emptyArray()) + } +} + +fun Class<*>.createDelegate(classLoader: ClassLoader, delegate: DelegateFunction): Any { + return Proxy.newProxyInstance( + classLoader, + arrayOf(this), + DelegateProxy(delegate) + ) +} \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/FeatureManager.kt b/app/src/main/java/xyz/rodit/snapmod/features/FeatureManager.kt index 75b05be..f36accc 100644 --- a/app/src/main/java/xyz/rodit/snapmod/features/FeatureManager.kt +++ b/app/src/main/java/xyz/rodit/snapmod/features/FeatureManager.kt @@ -1,6 +1,7 @@ package xyz.rodit.snapmod.features import xyz.rodit.snapmod.features.chatmenu.ChatMenuModifier +import xyz.rodit.snapmod.features.chatmenu.new.NewChatMenuModifier import xyz.rodit.snapmod.features.conversations.* import xyz.rodit.snapmod.features.friendsfeed.FeedModifier import xyz.rodit.snapmod.features.info.AdditionalFriendInfo @@ -22,6 +23,7 @@ class FeatureManager(context: FeatureContext) : Contextual(context) { fun load() { // Chat context menu add(::ChatMenuModifier) + add(::NewChatMenuModifier) // Friends feed add(::FeedModifier) diff --git a/app/src/main/java/xyz/rodit/snapmod/features/callbacks/CallbackManager.kt b/app/src/main/java/xyz/rodit/snapmod/features/callbacks/CallbackManager.kt index 9d20843..096dee4 100644 --- a/app/src/main/java/xyz/rodit/snapmod/features/callbacks/CallbackManager.kt +++ b/app/src/main/java/xyz/rodit/snapmod/features/callbacks/CallbackManager.kt @@ -3,6 +3,8 @@ package xyz.rodit.snapmod.features.callbacks import de.robv.android.xposed.XC_MethodHook import xyz.rodit.dexsearch.client.xposed.MethodRef import xyz.rodit.snapmod.isDummyProxy +import xyz.rodit.snapmod.mappings.DefaultFetchConversationCallback +import xyz.rodit.snapmod.mappings.DefaultFetchMessageCallback import xyz.rodit.snapmod.util.before import kotlin.reflect.KClass @@ -28,4 +30,16 @@ class CallbackManager { fun on(type: KClass<*>, method: MethodRef, callback: HookedCallback) { callbacks.computeIfAbsent("${type.simpleName}:${method.name}") { mutableListOf() }.add(callback) } + + init { + hook( + DefaultFetchConversationCallback::class, + DefaultFetchConversationCallback.onFetchConversationWithMessagesComplete + ) { DefaultFetchConversationCallback.wrap(it).dummy } + + hook( + DefaultFetchMessageCallback::class, + DefaultFetchMessageCallback.onFetchMessageComplete + ) { DefaultFetchMessageCallback.wrap(it).dummy } + } } diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/ChatMenuModifier.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/ChatMenuModifier.kt index b984e53..81f2f86 100644 --- a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/ChatMenuModifier.kt +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/ChatMenuModifier.kt @@ -19,7 +19,7 @@ const val PIN_STRING_NAME = "action_menu_pin_conversation" class ChatMenuModifier(context: FeatureContext) : Feature(context) { - private val plugins: MutableMap = HashMap() + private val plugins = mutableMapOf() override fun init() { registerPlugin(PreviewOption(context)) diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/ExportOption.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/ExportOption.kt index 3be9a64..39d6585 100644 --- a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/ExportOption.kt +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/ExportOption.kt @@ -1,13 +1,8 @@ package xyz.rodit.snapmod.features.chatmenu -import android.content.Intent -import androidx.core.content.FileProvider import xyz.rodit.snapmod.CustomResources.string.menu_option_export import xyz.rodit.snapmod.features.FeatureContext -import xyz.rodit.snapmod.mappings.SelectFriendsByUserIds -import java.io.File -import java.text.SimpleDateFormat -import java.util.* +import xyz.rodit.snapmod.features.chatmenu.shared.export class ExportOption(context: FeatureContext): ButtonOption(context, "export_chat", menu_option_export) { @@ -17,41 +12,6 @@ class ExportOption(context: FeatureContext): override fun handleEvent(data: String?) { if (data == null) return - val (messages, senders) = context.arroyo.getAllMessages(data) - val friendData = - context.instances.friendsRepository.selectFriendsByUserIds(senders.toList()) - val senderMap = friendData.map(SelectFriendsByUserIds::wrap).associateBy { u -> u.userId } - - val dateFormat = SimpleDateFormat("dd/MM/yyyy, HH:mm:ss", Locale.getDefault()) - - val temp = File.createTempFile( - "Snapchat Export ", - ".txt", - File(context.appContext.filesDir, "file_manager/media") - ) - temp.deleteOnExit() - temp.bufferedWriter().use { - messages.forEach { m -> - val username = senderMap[m.senderId]?.displayName ?: "Unknown" - val dateTime = dateFormat.format(m.timestamp) - it.append(dateTime) - .append(" - ") - .append(username) - .append(": ") - .appendLine(m.content) - } - } - - val intent = Intent(Intent.ACTION_SEND) - .setType("text/plain") - .putExtra( - Intent.EXTRA_STREAM, - FileProvider.getUriForFile( - context.appContext, - "com.snapchat.android.media.fileprovider", - temp - ) - ) - context.activity?.startActivity(Intent.createChooser(intent, "Export Chat")) + export(context, data) } } \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/PreviewOption.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/PreviewOption.kt index b758fda..f8df45a 100644 --- a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/PreviewOption.kt +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/PreviewOption.kt @@ -1,14 +1,8 @@ package xyz.rodit.snapmod.features.chatmenu -import android.app.AlertDialog -import de.robv.android.xposed.XC_MethodHook import xyz.rodit.snapmod.CustomResources.string.menu_option_preview -import xyz.rodit.snapmod.createDummyProxy import xyz.rodit.snapmod.features.FeatureContext -import xyz.rodit.snapmod.mappings.* -import xyz.rodit.snapmod.util.toSnapUUID -import xyz.rodit.snapmod.util.toUUIDString -import java.lang.Integer.min +import xyz.rodit.snapmod.features.chatmenu.shared.previewChat class PreviewOption(context: FeatureContext) : ButtonOption(context, "preview", menu_option_preview) { @@ -18,79 +12,6 @@ class PreviewOption(context: FeatureContext) : override fun handleEvent(data: String?) { if (data == null) return - val uuid = data.toSnapUUID() - val proxy = - ConversationDummyInterface.wrap( - ConversationDummyInterface.getMappedClass().createDummyProxy(context.classLoader) - ) - - context.callbacks.on( - DefaultFetchConversationCallback::class, - DefaultFetchConversationCallback.onFetchConversationWithMessagesComplete, - this::displayPreview - ) - - context.instances.conversationManager.fetchConversationWithMessages( - uuid, - DefaultFetchConversationCallback(proxy, uuid, false) - ) - } - - override fun performHooks() { - context.callbacks.hook( - DefaultFetchConversationCallback::class, - DefaultFetchConversationCallback.onFetchConversationWithMessagesComplete - ) { DefaultFetchConversationCallback.wrap(it).dummy } - } - - private fun displayPreview(param: XC_MethodHook.MethodHookParam): Boolean { - val conversation = Conversation.wrap(param.args[0]) - - val userIds = conversation.participants.map(Participant::wrap) - .map { p -> (p.participantId.id as ByteArray).toUUIDString() } - val friendData = context.instances.friendsRepository.selectFriendsByUserIds(userIds) - val userMap = friendData.map(SelectFriendsByUserIds::wrap).associateBy { u -> u.userId } - - val messageList = param.args[1] as List<*> - val previewText = StringBuilder() - if (messageList.isEmpty()) previewText.append("No messages available.") - else { - val numMessages = - min(context.config.getInt("preview_messages_count", 5), messageList.size) - previewText.append("Last ").append(numMessages).append(" messages:") - messageList.takeLast(numMessages) - .map(Message::wrap).forEach { m -> - run { - val uuidString = m.senderId.toUUIDString() - val displayName = userMap[uuidString]?.displayName ?: "Unknown" - previewText.append('\n').append(displayName).append(": ") - if (m.messageContent.contentType.instance == ContentType.CHAT().instance) { - val chatMessage = - NanoMessageContent.parse(m.messageContent.content).chatMessageContent.content - previewText.append(chatMessage) - } else { - previewText.append(m.messageContent.contentType.instance) - } - } - } - } - - userMap.values.find { f -> f.streakExpiration ?: 0L > 0L }?.let { f -> - val hourDiff = - (f.streakExpiration - System.currentTimeMillis()).toDouble() / 3600000.0 - previewText.append("\n\nStreak Expires in ") - .append(String.format("%.1f", hourDiff)) - .append(" hours") - } - - context.activity?.runOnUiThread { - AlertDialog.Builder(context.activity) - .setTitle(if (conversation.title.isNullOrBlank()) "Chat Preview" else conversation.title) - .setMessage(previewText) - .setPositiveButton("Ok") { _, _ -> } - .show() - } - - return true + previewChat(context, data) } } \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/MenuPlugin.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/MenuPlugin.kt new file mode 100644 index 0000000..c02ddfa --- /dev/null +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/MenuPlugin.kt @@ -0,0 +1,12 @@ +package xyz.rodit.snapmod.features.chatmenu.new + +abstract class MenuPlugin { + + abstract fun shouldCreate(): Boolean + + abstract fun createModel(key: String): Any + + open fun performHooks() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/NewChatMenuModifier.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/NewChatMenuModifier.kt new file mode 100644 index 0000000..9c7e795 --- /dev/null +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/NewChatMenuModifier.kt @@ -0,0 +1,72 @@ +package xyz.rodit.snapmod.features.chatmenu.new + +import xyz.rodit.snapmod.createDelegate +import xyz.rodit.snapmod.features.Feature +import xyz.rodit.snapmod.features.FeatureContext +import xyz.rodit.snapmod.features.chatmenu.shared.export +import xyz.rodit.snapmod.features.chatmenu.shared.previewChat +import xyz.rodit.snapmod.mappings.* +import xyz.rodit.snapmod.util.before + +class NewChatMenuModifier(context: FeatureContext) : Feature(context) { + + private val plugins = mutableListOf() + + override fun init() { + registerPlain("Export") { export(context, it) } + registerPlain("Preview") { previewChat(context, it) } + + registerSwitch("pinning", "Pin Conversation") { it.pinned } + registerSwitch("stealth", "Stealth Mode") { it.stealth } + registerSwitch("auto_save", "Auto-Save Messages") { it.autoSave } + registerSwitch("auto_download", "Auto-Download Snaps") { it.autoDownload } + } + + private fun registerPlugin(plugin: MenuPlugin) { + plugins.add(plugin) + } + + private fun registerPlain(text: String, click: ClickHandler) { + registerPlugin(PlainOption(context, text, click)) + } + + private fun registerSwitch(name: String, text: String, manager: Manager) { + registerPlugin(SwitchOption(context, name, text, manager)) + } + + override fun performHooks() { + // Force new chat action menu + ProfileActionSheetChooser.choose.before { + it.args[0] = context.config.getBoolean("enable_new_chat_menu", true) + } + + // Add subsection + ProfileActionSheetCreator.apply.before { + if (it.args[0] !is List<*>) return@before + + val newItems = (it.args[0] as List<*>).toMutableList() + val creator = ProfileActionSheetCreator.wrap(it.thisObject) + val nestedContext = NestedActionMenuContext.wrap(creator.nestedContext) + val actionContext = ActionMenuContext.wrap(creator.actionMenuContext) + val key = actionContext.feedInfo.key + + val subOptions = plugins.filter(MenuPlugin::shouldCreate).map { p -> + p.createModel(key) + } + val clickProxy = + Func0.getMappedClass().createDelegate(context.classLoader) { _, _ -> + NestedActionMenuContext.display( + nestedContext, + "SnapMod", + subOptions + ) + null + } + val snapModSettings = + ActionClickableCaret("SnapMod Settings", null, Func0.wrap(clickProxy)).instance + newItems.add(snapModSettings) + + it.args[0] = newItems + } + } +} \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/PlainOption.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/PlainOption.kt new file mode 100644 index 0000000..8651593 --- /dev/null +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/PlainOption.kt @@ -0,0 +1,24 @@ +package xyz.rodit.snapmod.features.chatmenu.new + +import xyz.rodit.snapmod.createDelegate +import xyz.rodit.snapmod.features.FeatureContext +import xyz.rodit.snapmod.mappings.ActionPlain +import xyz.rodit.snapmod.mappings.Func0 + +typealias ClickHandler = (key: String) -> Unit + +class PlainOption( + private val context: FeatureContext, + private val text: String, + private val click: ClickHandler +) : MenuPlugin() { + + override fun shouldCreate() = true + + override fun createModel(key: String): Any = ActionPlain( + text, + Func0.wrap(Func0.getMappedClass().createDelegate(context.classLoader) { _, _ -> + click(key) + }) + ).instance +} \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/SwitchOption.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/SwitchOption.kt new file mode 100644 index 0000000..82e04af --- /dev/null +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/new/SwitchOption.kt @@ -0,0 +1,32 @@ +package xyz.rodit.snapmod.features.chatmenu.new + +import xyz.rodit.snapmod.createDelegate +import xyz.rodit.snapmod.features.FeatureContext +import xyz.rodit.snapmod.mappings.ActionSwitch +import xyz.rodit.snapmod.mappings.Func1 +import xyz.rodit.snapmod.util.ConversationManager +import xyz.rodit.snapmod.util.getList + +typealias Manager = (FeatureContext) -> ConversationManager + +class SwitchOption( + private val context: FeatureContext, + private val name: String, + private val text: String, + private val manager: Manager +) : MenuPlugin() { + + override fun shouldCreate() = !context.config.getList("hidden_chat_options").contains(name) + + override fun createModel(key: String): Any = ActionSwitch( + text, + manager(context).isEnabled(key), + Func1.wrap(Func1.getMappedClass().createDelegate(context.classLoader) { _, _ -> true }), + Func1.wrap(Func1.getMappedClass().createDelegate(context.classLoader) { _, _ -> + manager(context).toggle(key) + true + }), + null, + 0 + ).instance +} \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/shared/ExportChat.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/shared/ExportChat.kt new file mode 100644 index 0000000..7e28037 --- /dev/null +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/shared/ExportChat.kt @@ -0,0 +1,48 @@ +package xyz.rodit.snapmod.features.chatmenu.shared + +import android.content.Intent +import androidx.core.content.FileProvider +import xyz.rodit.snapmod.features.FeatureContext +import xyz.rodit.snapmod.mappings.SelectFriendsByUserIds +import java.io.File +import java.text.SimpleDateFormat +import java.util.* + +fun export(context: FeatureContext, key: String) { + val (messages, senders) = context.arroyo.getAllMessages(key) + val friendData = + context.instances.friendsRepository.selectFriendsByUserIds(senders.toList()) + val senderMap = friendData.map(SelectFriendsByUserIds::wrap).associateBy { u -> u.userId } + + val dateFormat = SimpleDateFormat("dd/MM/yyyy, HH:mm:ss", Locale.getDefault()) + + val temp = File.createTempFile( + "Snapchat Export ", + ".txt", + File(context.appContext.filesDir, "file_manager/media") + ) + temp.deleteOnExit() + temp.bufferedWriter().use { + messages.forEach { m -> + val username = senderMap[m.senderId]?.displayName ?: "Unknown" + val dateTime = dateFormat.format(m.timestamp) + it.append(dateTime) + .append(" - ") + .append(username) + .append(": ") + .appendLine(m.content) + } + } + + val intent = Intent(Intent.ACTION_SEND) + .setType("text/plain") + .putExtra( + Intent.EXTRA_STREAM, + FileProvider.getUriForFile( + context.appContext, + "com.snapchat.android.media.fileprovider", + temp + ) + ) + context.activity?.startActivity(Intent.createChooser(intent, "Export Chat")) +} \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/shared/PreviewChat.kt b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/shared/PreviewChat.kt new file mode 100644 index 0000000..46c11fd --- /dev/null +++ b/app/src/main/java/xyz/rodit/snapmod/features/chatmenu/shared/PreviewChat.kt @@ -0,0 +1,78 @@ +package xyz.rodit.snapmod.features.chatmenu.shared + +import android.app.AlertDialog +import de.robv.android.xposed.XC_MethodHook +import xyz.rodit.snapmod.createDummyProxy +import xyz.rodit.snapmod.features.FeatureContext +import xyz.rodit.snapmod.mappings.* +import xyz.rodit.snapmod.util.toSnapUUID +import xyz.rodit.snapmod.util.toUUIDString + +fun previewChat(context: FeatureContext, key: String) { + val uuid = key.toSnapUUID() + val proxy = + ConversationDummyInterface.wrap( + ConversationDummyInterface.getMappedClass().createDummyProxy(context.classLoader) + ) + + context.callbacks.on( + DefaultFetchConversationCallback::class, + DefaultFetchConversationCallback.onFetchConversationWithMessagesComplete + ) { displayPreview(context, it) } + + context.instances.conversationManager.fetchConversationWithMessages( + uuid, + DefaultFetchConversationCallback(proxy, uuid, false) + ) +} + +private fun displayPreview(context: FeatureContext, param: XC_MethodHook.MethodHookParam): Boolean { + val conversation = Conversation.wrap(param.args[0]) + + val userIds = conversation.participants.map(Participant::wrap) + .map { p -> (p.participantId.id as ByteArray).toUUIDString() } + val friendData = context.instances.friendsRepository.selectFriendsByUserIds(userIds) + val userMap = friendData.map(SelectFriendsByUserIds::wrap).associateBy { u -> u.userId } + + val messageList = param.args[1] as List<*> + val previewText = StringBuilder() + if (messageList.isEmpty()) previewText.append("No messages available.") + else { + val numMessages = + Integer.min(context.config.getInt("preview_messages_count", 5), messageList.size) + previewText.append("Last ").append(numMessages).append(" messages:") + messageList.takeLast(numMessages) + .map(Message::wrap).forEach { m -> + run { + val uuidString = m.senderId.toUUIDString() + val displayName = userMap[uuidString]?.displayName ?: "Unknown" + previewText.append('\n').append(displayName).append(": ") + if (m.messageContent.contentType.instance == ContentType.CHAT().instance) { + val chatMessage = + NanoMessageContent.parse(m.messageContent.content).chatMessageContent.content + previewText.append(chatMessage) + } else { + previewText.append(m.messageContent.contentType.instance) + } + } + } + } + + userMap.values.find { f -> f.streakExpiration ?: 0L > 0L }?.let { f -> + val hourDiff = + (f.streakExpiration - System.currentTimeMillis()).toDouble() / 3600000.0 + previewText.append("\n\nStreak Expires in ") + .append(String.format("%.1f", hourDiff)) + .append(" hours") + } + + context.activity?.runOnUiThread { + AlertDialog.Builder(context.activity) + .setTitle(if (conversation.title.isNullOrBlank()) "Chat Preview" else conversation.title) + .setMessage(previewText) + .setPositiveButton("Ok") { _, _ -> } + .show() + } + + return true +} \ No newline at end of file diff --git a/app/src/main/java/xyz/rodit/snapmod/features/saving/StoriesSaving.kt b/app/src/main/java/xyz/rodit/snapmod/features/saving/StoriesSaving.kt index bd1aee0..5139c8f 100644 --- a/app/src/main/java/xyz/rodit/snapmod/features/saving/StoriesSaving.kt +++ b/app/src/main/java/xyz/rodit/snapmod/features/saving/StoriesSaving.kt @@ -1,13 +1,14 @@ package xyz.rodit.snapmod.features.saving +import xyz.rodit.snapmod.createDelegate import xyz.rodit.snapmod.features.Feature import xyz.rodit.snapmod.features.FeatureContext -import xyz.rodit.snapmod.mappings.* +import xyz.rodit.snapmod.mappings.ContextActionMenuModel +import xyz.rodit.snapmod.mappings.Func1 +import xyz.rodit.snapmod.mappings.OperaContextAction +import xyz.rodit.snapmod.mappings.ParamsMap import xyz.rodit.snapmod.util.PathManager import xyz.rodit.snapmod.util.after -import java.lang.reflect.InvocationHandler -import java.lang.reflect.Method -import java.lang.reflect.Proxy class StoriesSaving(context: FeatureContext) : Feature(context) { @@ -17,31 +18,14 @@ class StoriesSaving(context: FeatureContext) : Feature(context) { val model = ContextActionMenuModel.wrap(it.thisObject) if (model.action.instance !== OperaContextAction.SAVE().instance) return@after - val clickProxy = Proxy.newProxyInstance( - context.classLoader, - arrayOf(ContextClickHandler.getMappedClass()), - StoryDownloadProxy(context) - ) - model.onClick = ContextClickHandler.wrap(clickProxy) - } - - context.callbacks.hook( - DefaultFetchMessageCallback::class, - DefaultFetchMessageCallback.onFetchMessageComplete - ) { DefaultFetchMessageCallback.wrap(it).dummy } - } - - private class StoryDownloadProxy(private val context: FeatureContext) : InvocationHandler { - - override fun invoke(thisObject: Any, method: Method, args: Array?): Any? { - if (method.name != ContextClickHandler.invoke.dexName) return null - - val map = ParamsMap.wrap(args!![0]) - getMediaInfo(context, map) { - downloadOperaMedia(context, PathManager.DOWNLOAD_STORY, it) + val clickProxy = Func1.getMappedClass().createDelegate(context.classLoader) { _, args -> + val map = ParamsMap.wrap(args[0]) + getMediaInfo(context, map) { + downloadOperaMedia(context, PathManager.DOWNLOAD_STORY, it) + } + null } - - return null + model.onClick = Func1.wrap(clickProxy) } } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7ea8a6c..c3691bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -152,4 +152,7 @@ Auto-Download Snaps Automatically downloads snaps when viewed. + + Enable New Chat Menu + Enables the new chat context menu (recommended). \ No newline at end of file diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index e3cf605..c0a84dc 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -164,6 +164,13 @@ app:summary="@string/enable_new_voice_notes_description" app:iconSpaceReserved="false" /> + + (...) { @@ -1840,4 +1840,127 @@ class CameraRollVideoLengthChecker { static boolean isOver60Seconds(!CameraRollMediaBase) { .const 60000; } +} + +[certain, obfuscated] +enum ProfileActionSheetDisplay { + + [late] static this .fields { ONLY_HEADER, NO_HEADER, DEFAULT } +} + +[certain, discard] +class ProfileActionSheetProvider { + + void $(...) { + .string "ProfileActionSheetProvider"; + } +} + +[certain] +class ProfileActionSheetCreator { + + Object nestedContext; + Object actionMenuContext; + + * apply(*) { + .type !ProfileActionSheetProvider; + .field !ProfileActionSheetDisplay->!ONLY_HEADER; + .field !ProfileActionSheetDisplay->!NO_HEADER; + } +} + +[certain, obfuscated] +enum ActionSheetType { + + [late] static this .fields { PROFILE, PROFILE_ACTION_MENU } +} + +[certain] +class ActionMenuContext { + + !ActionSheetType sheetType; + !FriendInfo friendInfo; + !BasicFeedInfo feedInfo; + !ProfileActionSheetDisplay display; +} + +[certain] +class ActionClickableCaret { + + String primaryText; + Drawable drawable; + #Func0 onClick; + + void $(...) + + String $toString() { + .string "ClickableCaret(primaryText="; + .string ", drawable="; + } +} + +[certain] +class ActionSwitch { + + String primaryText; + boolean isSwitchedOn; + !Func1 onToggleRequested; + !Func1 onToggle; + + void $(...) + + String $toString() { + .string "Switch(primaryText="; + .string ", isSwitchedOn="; + } +} + +[certain] +class ActionPlain { + + String primaryText; + !Func0 onClick; + + void $(...) + + String $toString() { + .string "Plain(primaryText="; + .string ", onClick="; + } +} + +[certain] +class NestedActionMenuContext { + + Context context; + !CompositeConfigurationProvider config; + + static void display(this, String, List) +} + +[certain] +class ProfileActionSheetChooser { + + * choose(*) { + .field !ProfileActionSheetDisplay->!ONLY_HEADER; + .field !ProfileActionSheetDisplay->!DEFAULT; + } +} + +[late] +interface Func0 { + + * invoke() +} + +[late] +interface Func1 { + + * invoke(*) +} + +[late] +interface Func2 { + + * invoke(*, *) } \ No newline at end of file