feat: Enhance WebSocket connection handling; prevent duplicate connections and improve reconnection logic

This commit is contained in:
k1ngsterr1
2026-01-17 02:14:16 +05:00
parent 7f681d627a
commit 1ea2d917dc
2 changed files with 104 additions and 28 deletions

View File

@@ -1,10 +1,12 @@
package com.rosetta.messenger
import android.content.Context
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.lifecycle.lifecycleScope
import androidx.compose.animation.*
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.FastOutLinearInEasing
@@ -72,17 +74,7 @@ class MainActivity : ComponentActivity() {
// 🔔 Инициализируем Firebase для push-уведомлений
initializeFirebase()
// <20> Логируем текущий FCM токен при запуске
val prefs = getSharedPreferences("rosetta_prefs", Context.MODE_PRIVATE)
val savedToken = prefs.getString("fcm_token", null)
if (savedToken != null) {
Log.d(TAG, "📱 Current FCM token on app start (short): ${savedToken.take(20)}...")
Log.d(TAG, "📱 Current FCM token on app start (FULL): $savedToken")
} else {
Log.d(TAG, "📱 No FCM token saved yet")
}
// <20>🚀 Предзагружаем эмодзи в фоне для мгновенного открытия пикера
// <20> Предзагружаем эмодзи в фоне для мгновенного открытия пикера
// Используем новый оптимизированный кэш
OptimizedEmojiCache.preload(this)
@@ -186,6 +178,10 @@ class MainActivity : ComponentActivity() {
hasExistingAccount = true
// Save as last logged account
account?.let { accountManager.setLastLoggedPublicKey(it.publicKey) }
// 📤 Отправляем FCM токен на сервер после успешной аутентификации
account?.let { sendFcmTokenToServer(it) }
// Reload accounts list
scope.launch {
val accounts = accountManager.getAllAccounts()
@@ -268,8 +264,8 @@ class MainActivity : ComponentActivity() {
// Сохраняем токен локально
token?.let { saveFcmToken(it) }
// TODO: Отправляем токен на сервер если аккаунт залогинен
// token?.let { sendFcmTokenToServer(it) }
// Токен будет отправлен на сервер после успешной аутентификации
// (см. вызов sendFcmTokenToServer в onAccountLogin)
}
Log.d(TAG, "✅ Firebase initialized successfully")
@@ -286,6 +282,40 @@ class MainActivity : ComponentActivity() {
prefs.edit().putString("fcm_token", token).apply()
Log.d(TAG, "💾 FCM token saved locally")
}
/**
* Отправить FCM токен на сервер
* Вызывается после успешной аутентификации, когда аккаунт уже расшифрован
*/
private fun sendFcmTokenToServer(account: DecryptedAccount) {
lifecycleScope.launch {
try {
val prefs = getSharedPreferences("rosetta_prefs", MODE_PRIVATE)
val token = prefs.getString("fcm_token", null)
if (token == null) {
Log.d(TAG, "⚠️ Cannot send FCM token: Token not found")
return@launch
}
Log.d(TAG, "📤 Sending FCM token to server...")
Log.d(TAG, " Token (short): ${token.take(20)}...")
Log.d(TAG, " PublicKey: ${account.publicKey.take(20)}...")
val packet = PacketPushToken().apply {
this.privateKey = account.privateKey
this.publicKey = account.publicKey
this.pushToken = token
this.platform = "android"
}
ProtocolManager.send(packet)
Log.d(TAG, "✅ FCM token sent to server")
} catch (e: Exception) {
Log.e(TAG, "❌ Error sending FCM token to server", e)
}
}
}
}
@Composable