feat: Enhance FCM token management by adding unsubscribe logic to prevent duplicate registrations

This commit is contained in:
2026-02-26 14:56:21 +05:00
parent 48861633ee
commit f526a442b0
11 changed files with 1007 additions and 309 deletions

View File

@@ -14,8 +14,9 @@ import com.rosetta.messenger.network.ProtocolManager
object MessageLogger {
private const val TAG = "RosettaMsg"
// Включить/выключить логирование (только в DEBUG)
private val isEnabled: Boolean = android.os.Build.TYPE != "user"
// Всегда включён — вывод идёт только в ProtocolManager.addLog() (in-memory UI),
// не в logcat, безопасно для release
private val isEnabled: Boolean = true
/**
* Добавить лог в UI (Debug Logs в чате)
@@ -252,6 +253,120 @@ object MessageLogger {
addToUI(msg)
}
/**
* Логирование расшифровки фото (inline blob)
*/
fun logPhotoDecryptStart(
messageId: String,
attachmentId: String,
blobSize: Int
) {
if (!isEnabled) return
val shortMsgId = messageId.take(8)
val shortAttId = attachmentId.take(8)
val msg = "🖼️ PHOTO DECRYPT | msg:$shortMsgId att:$shortAttId blob:${blobSize}b"
Log.d(TAG, msg)
addToUI(msg)
}
/**
* Логирование успешной расшифровки фото
*/
fun logPhotoDecryptSuccess(
messageId: String,
attachmentId: String,
saved: Boolean
) {
if (!isEnabled) return
val shortMsgId = messageId.take(8)
val shortAttId = attachmentId.take(8)
val msg = "✅ PHOTO OK | msg:$shortMsgId att:$shortAttId saved:$saved"
Log.d(TAG, msg)
addToUI(msg)
}
/**
* Логирование ошибки расшифровки фото (blob null)
*/
fun logPhotoDecryptFailed(
messageId: String,
attachmentId: String
) {
if (!isEnabled) return
val shortMsgId = messageId.take(8)
val shortAttId = attachmentId.take(8)
val msg = "❌ PHOTO DECRYPT FAIL | msg:$shortMsgId att:$shortAttId (decryptedBlob=null)"
Log.e(TAG, msg)
addToUI(msg)
}
/**
* Логирование ошибки сохранения фото
*/
fun logPhotoSaveFailed(
messageId: String,
attachmentId: String
) {
if (!isEnabled) return
val shortMsgId = messageId.take(8)
val shortAttId = attachmentId.take(8)
val msg = "⚠️ PHOTO SAVE FAIL | msg:$shortMsgId att:$shortAttId"
Log.e(TAG, msg)
addToUI(msg)
}
/**
* Логирование исключения при расшифровке фото
*/
fun logPhotoDecryptError(
messageId: String,
attachmentId: String,
error: Throwable
) {
if (!isEnabled) return
val shortMsgId = messageId.take(8)
val shortAttId = attachmentId.take(8)
val errMsg = error.message?.take(80) ?: "unknown"
val msg = "❌ PHOTO ERR | msg:$shortMsgId att:$shortAttId err:$errMsg"
Log.e(TAG, msg, error)
addToUI(msg)
}
/**
* Логирование CDN загрузки фото
*/
fun logPhotoCdnDownload(message: String) {
if (!isEnabled) return
val msg = "🖼️ $message"
Log.d(TAG, msg)
addToUI(msg)
}
/**
* Логирование успешной отправки read receipt
*/
fun logReadReceiptSent(opponentKey: String, retry: Boolean = false) {
if (!isEnabled) return
val shortKey = opponentKey.take(12)
val retryStr = if (retry) " (retry)" else ""
val msg = "👁 READ RECEIPT SENT$retryStr | to:$shortKey"
Log.d(TAG, msg)
addToUI(msg)
}
/**
* Логирование ошибки отправки read receipt
*/
fun logReadReceiptFailed(opponentKey: String, error: Throwable, retry: Boolean = false) {
if (!isEnabled) return
val shortKey = opponentKey.take(12)
val errMsg = error.message?.take(50) ?: "unknown"
val retryStr = if (retry) " (retry)" else ""
val msg = "❌ READ RECEIPT FAIL$retryStr | to:$shortKey err:$errMsg"
Log.e(TAG, msg, error)
addToUI(msg)
}
/**
* Общий debug лог
*/