mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-13 05:37:48 +02:00
Merge branch 'main' into refactor_2_0_0
# Conflicts: # app/build.gradle.kts # app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt # core/.gitignore # core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/GalleryMediaSendOverride.kt
This commit is contained in:
17
core/.gitignore
vendored
17
core/.gitignore
vendored
@ -1,16 +1 @@
|
|||||||
*.iml
|
/build
|
||||||
.gradle
|
|
||||||
/local.properties
|
|
||||||
/.idea/caches
|
|
||||||
/.idea/libraries
|
|
||||||
/.idea/modules.xml
|
|
||||||
/.idea/workspace.xml
|
|
||||||
/.idea/navEditor.xml
|
|
||||||
/.idea/assetWizardSettings.xml
|
|
||||||
/.idea/
|
|
||||||
.DS_Store
|
|
||||||
/build
|
|
||||||
/captures
|
|
||||||
.externalNativeBuild
|
|
||||||
.cxx
|
|
||||||
local.properties
|
|
@ -16,7 +16,7 @@
|
|||||||
"check_for_updates": "Check for updates",
|
"check_for_updates": "Check for updates",
|
||||||
"export_chat_messages": "Export chat messages"
|
"export_chat_messages": "Export chat messages"
|
||||||
},
|
},
|
||||||
|
|
||||||
"property": {
|
"property": {
|
||||||
"message_logger": {
|
"message_logger": {
|
||||||
"name": "Message Logger",
|
"name": "Message Logger",
|
||||||
@ -294,7 +294,7 @@
|
|||||||
"abandon_video": "Missed Video Call"
|
"abandon_video": "Missed Video Call"
|
||||||
},
|
},
|
||||||
"gallery_media_send_override": {
|
"gallery_media_send_override": {
|
||||||
"OFF": "Off",
|
"ORIGINAL": "Original",
|
||||||
"NOTE": "Audio Note",
|
"NOTE": "Audio Note",
|
||||||
"SNAP": "Snap",
|
"SNAP": "Snap",
|
||||||
"LIVE_SNAP": "Snap with audio"
|
"LIVE_SNAP": "Snap with audio"
|
||||||
@ -363,6 +363,10 @@
|
|||||||
"close": "Close"
|
"close": "Close"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"gallery_media_send_override": {
|
||||||
|
"multiple_media_toast": "You can only send one media at a time"
|
||||||
|
},
|
||||||
|
|
||||||
"conversation_preview": {
|
"conversation_preview": {
|
||||||
"streak_expiration": "expires in {day} days {hour} hours {minute} minutes",
|
"streak_expiration": "expires in {day} days {hour} hours {minute} minutes",
|
||||||
"total_messages": "Total sent/received messages: {count}",
|
"total_messages": "Total sent/received messages: {count}",
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package me.rhunk.snapenhance.features.impl.tweaks
|
package me.rhunk.snapenhance.features.impl.tweaks
|
||||||
|
|
||||||
|
import android.app.AlertDialog
|
||||||
|
import me.rhunk.snapenhance.config.ConfigProperty
|
||||||
import me.rhunk.snapenhance.data.ContentType
|
import me.rhunk.snapenhance.data.ContentType
|
||||||
import me.rhunk.snapenhance.data.MessageSender
|
import me.rhunk.snapenhance.data.MessageSender
|
||||||
import me.rhunk.snapenhance.data.wrapper.impl.MessageContent
|
import me.rhunk.snapenhance.data.wrapper.impl.MessageContent
|
||||||
@ -12,36 +14,62 @@ import me.rhunk.snapenhance.util.protobuf.ProtoReader
|
|||||||
|
|
||||||
class GalleryMediaSendOverride : Feature("Gallery Media Send Override", loadParams = FeatureLoadParams.INIT_SYNC) {
|
class GalleryMediaSendOverride : Feature("Gallery Media Send Override", loadParams = FeatureLoadParams.INIT_SYNC) {
|
||||||
override fun init() {
|
override fun init() {
|
||||||
Hooker.hook(context.classCache.conversationManager, "sendMessageWithContent", HookStage.BEFORE) { param ->
|
val typeNames = listOf(
|
||||||
val overrideType = context.config.messaging.galleryMediaSendOverride.getNullable() ?: return@hook
|
"ORIGINAL",
|
||||||
|
"SNAP",
|
||||||
|
"LIVE_SNAP",
|
||||||
|
"NOTE"
|
||||||
|
).associateWith {
|
||||||
|
context.translation[ConfigProperty.GALLERY_MEDIA_SEND_OVERRIDE.getOptionTranslationKey(it)]
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooker.hook(context.classCache.conversationManager, "sendMessageWithContent", HookStage.BEFORE, {
|
||||||
|
context.config.bool(ConfigProperty.GALLERY_MEDIA_SEND_OVERRIDE)
|
||||||
|
}) { param ->
|
||||||
val localMessageContent = MessageContent(param.arg(1))
|
val localMessageContent = MessageContent(param.arg(1))
|
||||||
if (localMessageContent.contentType != ContentType.EXTERNAL_MEDIA) return@hook
|
if (localMessageContent.contentType != ContentType.EXTERNAL_MEDIA) return@hook
|
||||||
//story replies
|
|
||||||
|
//prevent story replies
|
||||||
val messageProtoReader = ProtoReader(localMessageContent.content)
|
val messageProtoReader = ProtoReader(localMessageContent.content)
|
||||||
if (messageProtoReader.exists(7)) return@hook
|
if (messageProtoReader.exists(7)) return@hook
|
||||||
|
|
||||||
if (messageProtoReader.readPath(3)?.getCount(3) != 1) {
|
param.setResult(null)
|
||||||
context.runOnUiThread {
|
|
||||||
ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!)
|
|
||||||
.setMessage("You can only send one media at a time")
|
|
||||||
.setPositiveButton("OK", null)
|
|
||||||
.show()
|
|
||||||
}
|
|
||||||
param.setResult(null)
|
|
||||||
return@hook
|
|
||||||
}
|
|
||||||
|
|
||||||
when (overrideType) {
|
context.runOnUiThread {
|
||||||
"SNAP", "LIVE_SNAP" -> {
|
ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!)
|
||||||
localMessageContent.contentType = ContentType.SNAP
|
.setItems(typeNames.values.toTypedArray()) { dialog, which ->
|
||||||
localMessageContent.content = MessageSender.redSnapProto(overrideType == "LIVE_SNAP")
|
dialog.dismiss()
|
||||||
}
|
val overrideType = typeNames.keys.toTypedArray()[which]
|
||||||
"NOTE" -> {
|
|
||||||
localMessageContent.contentType = ContentType.NOTE
|
if (overrideType != "ORIGINAL" && messageProtoReader.readPath(3)?.getCount(3) != 1) {
|
||||||
val mediaDuration = messageProtoReader.getLong(3, 3, 5, 1, 1, 15) ?: 0
|
context.runOnUiThread {
|
||||||
localMessageContent.content = MessageSender.audioNoteProto(mediaDuration)
|
ViewAppearanceHelper.newAlertDialogBuilder(context.mainActivity!!)
|
||||||
}
|
.setMessage(context.translation["gallery_media_send_override.multiple_media_toast"])
|
||||||
|
.setPositiveButton(context.translation["button.ok"], null)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
return@setItems
|
||||||
|
}
|
||||||
|
|
||||||
|
when (overrideType) {
|
||||||
|
"SNAP", "LIVE_SNAP" -> {
|
||||||
|
localMessageContent.contentType = ContentType.SNAP
|
||||||
|
localMessageContent.content = MessageSender.redSnapProto(overrideType == "LIVE_SNAP")
|
||||||
|
}
|
||||||
|
|
||||||
|
"NOTE" -> {
|
||||||
|
localMessageContent.contentType = ContentType.NOTE
|
||||||
|
val mediaDuration =
|
||||||
|
messageProtoReader.getLong(3, 3, 5, 1, 1, 15) ?: 0
|
||||||
|
localMessageContent.content =
|
||||||
|
MessageSender.audioNoteProto(mediaDuration)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
param.invokeOriginal()
|
||||||
|
}
|
||||||
|
.setNegativeButton(context.translation["button.cancel"], null)
|
||||||
|
.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user