From 698a67a9239b503f4e384c267d1a55492012e9c5 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Tue, 17 Mar 2026 16:10:28 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81:=20=D0=BF=D1=83=D1=88-?= =?UTF-8?q?=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=B5=20=D1=87=D0=B8=D1=82=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D1=81=D1=8C=20=D0=BF=D1=80=D0=B8=20=D0=BE=D1=82=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B8=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cancelAll() в onResume — сбрасывает все уведомления и бейдж при открытии приложения - showSimpleNotification принимает senderPublicKey и использует тот же ID что cancelNotificationForChat — теперь fallback-уведомления тоже удаляются при входе в чат Co-Authored-By: Claude Sonnet 4.6 --- .../java/com/rosetta/messenger/MainActivity.kt | 2 ++ .../push/RosettaFirebaseMessagingService.kt | 14 +++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/MainActivity.kt b/app/src/main/java/com/rosetta/messenger/MainActivity.kt index 07ff4cd..8e39a70 100644 --- a/app/src/main/java/com/rosetta/messenger/MainActivity.kt +++ b/app/src/main/java/com/rosetta/messenger/MainActivity.kt @@ -423,6 +423,8 @@ class MainActivity : FragmentActivity() { super.onResume() // 🔥 Приложение стало видимым - отключаем уведомления com.rosetta.messenger.push.RosettaFirebaseMessagingService.isAppInForeground = true + // 🔔 Сбрасываем все уведомления из шторки при открытии приложения + (getSystemService(NOTIFICATION_SERVICE) as android.app.NotificationManager).cancelAll() // ⚡ На возврате в приложение пробуем мгновенный reconnect без ожидания backoff. ProtocolManager.reconnectNowIfNeeded("activity_onResume") } diff --git a/app/src/main/java/com/rosetta/messenger/push/RosettaFirebaseMessagingService.kt b/app/src/main/java/com/rosetta/messenger/push/RosettaFirebaseMessagingService.kt index ae24d72..18bd950 100644 --- a/app/src/main/java/com/rosetta/messenger/push/RosettaFirebaseMessagingService.kt +++ b/app/src/main/java/com/rosetta/messenger/push/RosettaFirebaseMessagingService.kt @@ -142,7 +142,7 @@ class RosettaFirebaseMessagingService : FirebaseMessagingService() { lower.contains("body") } if (!handledMessageData && !isReadEvent && looksLikeMessagePayload) { - showSimpleNotification(senderName, messagePreview) + showSimpleNotification(senderName, messagePreview, senderPublicKey) handledMessageData = true } } @@ -218,13 +218,13 @@ class RosettaFirebaseMessagingService : FirebaseMessagingService() { } /** Показать простое уведомление */ - private fun showSimpleNotification(title: String, body: String) { + private fun showSimpleNotification(title: String, body: String, senderPublicKey: String? = null) { // 🔥 Не показываем уведомление если приложение открыто if (isAppInForeground || !areNotificationsEnabled()) { return } // Dedup: suppress duplicate pushes within DEDUP_WINDOW_MS - val dedupKey = "__simple__" + val dedupKey = senderPublicKey?.trim()?.ifEmpty { null } ?: "__simple__" val now = System.currentTimeMillis() val lastTs = lastNotifTimestamps[dedupKey] if (lastTs != null && now - lastTs < DEDUP_WINDOW_MS) { @@ -234,8 +234,12 @@ class RosettaFirebaseMessagingService : FirebaseMessagingService() { createNotificationChannel() - // Deterministic ID — duplicates replace each other instead of stacking - val notifId = (title + body).hashCode() and 0x7FFFFFFF + // Используем sender-based ID если известен ключ — чтобы cancelNotificationForChat мог убрать уведомление + val notifId = if (!senderPublicKey.isNullOrBlank()) { + getNotificationIdForChat(senderPublicKey.trim()) + } else { + (title + body).hashCode() and 0x7FFFFFFF + } val intent = Intent(this, MainActivity::class.java).apply {