From 2be1c3258d7d10dce5d2aca863033d532e79a7a0 Mon Sep 17 00:00:00 2001 From: DarkKnight2122 <145188583+DarkKnight2122@users.noreply.github.com> Date: Thu, 23 Apr 2026 22:21:13 +0530 Subject: [PATCH] Message indicator bug fix --- common/src/main/assets/lang/en_UK.json | 5 +++- common/src/main/assets/lang/en_US.json | 4 ++- common/src/main/assets/lang/hi_IN.json | 5 +++- .../common/config/impl/UserInterfaceTweaks.kt | 2 +- .../features/impl/ui/MessageIndicators.kt | 28 ++++++++++--------- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/common/src/main/assets/lang/en_UK.json b/common/src/main/assets/lang/en_UK.json index 8b199cb5..c57d1486 100644 --- a/common/src/main/assets/lang/en_UK.json +++ b/common/src/main/assets/lang/en_UK.json @@ -2667,7 +2667,10 @@ "platform_indicator": "Adds the platform icon from which a media was sent (e.g. Android, iOS, Web)", "location_indicator": "Adds a \ud83d\udccd icon to snaps when they have been sent with location enabled", "ovf_editor_indicator": "Indicates if a snap has been sent using OVF Editor", - "director_mode_indicator": "Adds a \u270f\ufe0f icon to snaps when they have been sent using Director Mode, which can be used to send gallery images as snaps" + "director_mode_indicator": "Adds a \u270f\ufe0f icon to snaps when they have been sent using Director Mode, which can be used to send gallery images as snaps", + "memories_indicator": "Adds a \ud83d\udcd6 icon to snaps that were re-sent from Memories instead of being captured with the live camera", + "skip_own_indicators": "Hides indicator icons on your own sent snaps (Self-Snaps) \ud83d\udc64", + "disable_indicators_in_groups": "Disables all indicator icons in group conversations to reduce UI clutter \ud83d\udc65" }, "auto_mark_as_read": { "conversation_read": "Mark conversation as read when sending a message", diff --git a/common/src/main/assets/lang/en_US.json b/common/src/main/assets/lang/en_US.json index 04b0a2c9..2b7149d3 100644 --- a/common/src/main/assets/lang/en_US.json +++ b/common/src/main/assets/lang/en_US.json @@ -3260,7 +3260,9 @@ "location_indicator": "Adds a \ud83d\udccd icon to snaps when they have been sent with location enabled", "ovf_editor_indicator": "Indicates if a snap has been sent using OVF Editor", "director_mode_indicator": "Adds a \u270f\ufe0f icon to snaps when they have been sent using Director Mode, which can be used to send gallery images as snaps", - "memories_indicator": "Adds a \ud83d\udcd6 icon to snaps that were re-sent from Memories instead of being captured with the live camera" + "memories_indicator": "Adds a \ud83d\udcd6 icon to snaps that were re-sent from Memories instead of being captured with the live camera", + "skip_own_indicators": "Hides indicator icons on your own sent snaps (Self-Snaps) \ud83d\udc64", + "disable_indicators_in_groups": "Disables all indicator icons in group conversations to reduce UI clutter \ud83d\udc65" }, "auto_mark_as_read": { "conversation_read": "Mark conversation as read when sending a message", diff --git a/common/src/main/assets/lang/hi_IN.json b/common/src/main/assets/lang/hi_IN.json index ac72530d..4e9f3886 100644 --- a/common/src/main/assets/lang/hi_IN.json +++ b/common/src/main/assets/lang/hi_IN.json @@ -2544,7 +2544,10 @@ "platform_indicator": "वह प्लेटफ़ॉर्म आइकन जोड़ता है जहाँ से मीडिया भेजा गया था (उदा. Android, iOS, Web)", "location_indicator": "Snaps में \ud83d\udccd आइकन जोड़ता है जब उन्हें लोकेशन सक्षम के साथ भेजा गया हो", "ovf_editor_indicator": "इंगित करता है कि क्या कोई Snap OVF एडिटर का उपयोग करके भेजा गया है", - "director_mode_indicator": "Snaps में \u270f\ufe0f आइकन जोड़ता है जब उन्हें डायरेक्टर मोड का उपयोग करके भेजा गया हो, जिसका उपयोग गैलरी छवियों को Snaps के रूप में भेजने के लिए किया जा सकता है" + "director_mode_indicator": "Snaps में \u270f\ufe0f आइकन जोड़ता है जब उन्हें डायरेक्टर मोड का उपयोग करके भेजा गया हो, जिसका उपयोग गैलरी छवियों को Snaps के रूप में भेजने के लिए किया जा सकता है", + "memories_indicator": "मेमोरीज़ से फिर से भेजे गए Snaps में \ud83d\udcd6 आइकन जोड़ता है", + "skip_own_indicators": "अपने स्वयं के भेजे गए Snaps पर संकेतक आइकन छुपाता है \ud83d\udc64", + "disable_indicators_in_groups": "UI अव्यवस्था को कम करने के लिए समूह वार्तालापों में सभी संकेतकों को अक्षम करता है \ud83d\udc65" }, "auto_mark_as_read": { "conversation_read": "संदेश भेजते समय वार्तालाप को पढ़े गए के रूप में चिह्नित करें", diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/UserInterfaceTweaks.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/UserInterfaceTweaks.kt index 550652b8..e5256be7 100644 --- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/UserInterfaceTweaks.kt +++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/UserInterfaceTweaks.kt @@ -57,7 +57,7 @@ class UserInterfaceTweaks : ConfigContainer() { val oldBitmojiSelfie = unique("old_bitmoji_selfie", "2d", "3d") { requireCleanCache() } val disableSpotlight = boolean("disable_spotlight") { requireRestart() } val verticalStoryViewer = boolean("vertical_story_viewer") { requireRestart() } - val messageIndicators = multiple("message_indicators", "encryption_indicator", "platform_indicator", "location_indicator", "ovf_editor_indicator", "director_mode_indicator", "memories_indicator") { requireRestart() } + val messageIndicators = multiple("message_indicators", "encryption_indicator", "platform_indicator", "location_indicator", "ovf_editor_indicator", "director_mode_indicator", "memories_indicator", "skip_own_indicators", "disable_indicators_in_groups") { requireRestart() } val stealthModeIndicator = boolean("stealth_mode_indicator") { requireRestart() } val editTextOverride = multiple("edit_text_override", "multi_line_chat_input", "bypass_text_input_limit") { requireRestart(); addNotices(FeatureNotice.BAN_RISK, FeatureNotice.INTERNAL_BEHAVIOR) diff --git a/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/ui/MessageIndicators.kt b/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/ui/MessageIndicators.kt index 3bb9911f..e5521879 100644 --- a/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/ui/MessageIndicators.kt +++ b/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/ui/MessageIndicators.kt @@ -9,6 +9,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -24,6 +25,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import me.eternal.purrfectsnap.common.data.ContentType import me.eternal.purrfectsnap.common.ui.createComposeView +import me.eternal.purrfectsnap.common.ui.rememberAsyncMutableState import me.eternal.purrfectsnap.common.util.protobuf.ProtoReader import me.eternal.purrfectsnap.core.event.events.impl.BindViewEvent import me.eternal.purrfectsnap.core.features.Feature @@ -87,9 +89,10 @@ class MessageIndicators : Feature("Message Indicators") { val message = event.databaseMessage ?: return@chatMessage if (message.contentType != ContentType.SNAP.id && message.contentType != ContentType.EXTERNAL_MEDIA.id) return@chatMessage - if (message.senderId == context.database.myUserId) return@chatMessage + if (message.senderId == context.database.myUserId && messageIndicatorsConfig.contains("skip_own_indicators")) return@chatMessage val reader = ProtoReader(message.messageContent ?: return@chatMessage) val isGroupConversation = (context.database.getConversationParticipants(conversationId)?.size ?: 0) > 2 + if (isGroupConversation && messageIndicatorsConfig.contains("disable_indicators_in_groups")) return@chatMessage createComposeView(event.view.context) { val lockBrush = Brush.linearGradient(listOf(Color(0xFF4CD471), Color(0xFF00B8D9))) @@ -105,38 +108,37 @@ class MessageIndicators : Feature("Message Indicators") { modifier = Modifier .fillMaxWidth() .height(50.dp) - .padding(top = 6.dp), - contentAlignment = Alignment.TopCenter + .padding(top = 6.dp, end = 6.dp), + contentAlignment = Alignment.TopEnd ) { - val hasEncryption = remember(reader, isGroupConversation) { + val hasEncryption by rememberAsyncMutableState(defaultValue = false) { if (reader.containsPath(4, 4, 1, 1) || reader.containsPath(4, 4, 1, 1, 1) || reader.getByteArray(4, 3, 3) != null || reader.containsPath(3, 99, 3)) { - return@remember true + return@rememberAsyncMutableState true } - if (isGroupConversation) return@remember false - if (reader.containsPath(4, 5, 1, 3, 1)) return@remember true + if (reader.containsPath(4, 5, 1, 3, 1)) return@rememberAsyncMutableState true reader.getVarInt(4, 5, 1, 3, 2, 9) in setOf(1L, 3L) } - val sentFromIosDevice = remember(reader) { + val sentFromIosDevice by rememberAsyncMutableState(defaultValue = false) { if (reader.containsPath(4, 4, 3)) !reader.containsPath(4, 4, 3, 3, 17) else reader.getVarInt(4, 4, 11, 17, 7) != null } - val sentFromWebApp = remember(reader) { + val sentFromWebApp by rememberAsyncMutableState(defaultValue = false) { reader.getVarInt(4, 4, *(if (reader.containsPath(4, 4, 3)) intArrayOf(3, 3, 22, 1) else intArrayOf(11, 22, 1))) == 7L } - val sentWithLocation = remember(reader) { + val sentWithLocation by rememberAsyncMutableState(defaultValue = false) { reader.getVarInt(4, 4, 11, 17, 5) != null } - val sentUsingOvfEditor = remember(reader) { + val sentUsingOvfEditor by rememberAsyncMutableState(defaultValue = false) { (reader.getString(4, 4, 11, 12, 1) ?: reader.getString(4, 4, 11, 13, 4, 1, 2, 12, 20, 1)) == "c13129f7-fe4a-44c4-9b9d-e0b26fee8f82" } - val sentUsingDirectorMode = remember(reader) { + val sentUsingDirectorMode by rememberAsyncMutableState(defaultValue = false) { reader.followPath(4, 4, 11, 28)?.let { (it.getVarInt(1) to it.getVarInt(2)) == (0L to 0L) } == true || reader.getByteArray(4, 4, 11, 13, 4, 1, 2, 12, 27, 1) != null } - val sentFromMemories = remember(reader) { + val sentFromMemories by rememberAsyncMutableState(defaultValue = false) { reader.getVarInt(4, 18) != null || reader.getString(4, 5, 1, 2)?.contains("/h/") == true }