fix favorites

This commit is contained in:
callebtc
2025-07-12 16:55:50 +02:00
parent d54d470614
commit ea25b71d6f
6 changed files with 87 additions and 12 deletions
@@ -1,5 +1,6 @@
package com.bitchat.android.ui package com.bitchat.android.ui
import android.util.Log
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.BasicTextField
@@ -253,7 +254,10 @@ private fun PrivateChatHeader(
// Favorite button - positioned on the right // Favorite button - positioned on the right
IconButton( IconButton(
onClick = onToggleFavorite, onClick = {
Log.d("ChatHeader", "Header toggle favorite: peerID=$peerID, currentFavorite=$isFavorite")
onToggleFavorite()
},
modifier = Modifier.align(Alignment.CenterEnd) modifier = Modifier.align(Alignment.CenterEnd)
) { ) {
Icon( Icon(
@@ -1,5 +1,6 @@
package com.bitchat.android.ui package com.bitchat.android.ui
import android.util.Log
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
@@ -188,6 +189,7 @@ class ChatState {
} }
fun setFavoritePeers(favorites: Set<String>) { fun setFavoritePeers(favorites: Set<String>) {
Log.d("ChatState", "setFavoritePeers called with ${favorites.size} favorites: $favorites")
_favoritePeers.value = favorites _favoritePeers.value = favorites
} }
@@ -2,6 +2,7 @@ package com.bitchat.android.ui
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
import android.util.Log
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@@ -100,6 +101,10 @@ class ChatViewModel(
state.setFavoritePeers(dataManager.favoritePeers) state.setFavoritePeers(dataManager.favoritePeers)
dataManager.loadBlockedUsers() dataManager.loadBlockedUsers()
// Log all favorites at startup
dataManager.logAllFavorites()
logCurrentFavoriteState()
// Note: Mesh service is now started by MainActivity // Note: Mesh service is now started by MainActivity
// Show welcome message if no peers after delay // Show welcome message if no peers after delay
@@ -249,7 +254,19 @@ class ChatViewModel(
} }
fun toggleFavorite(peerID: String) { fun toggleFavorite(peerID: String) {
Log.d("ChatViewModel", "toggleFavorite called for peerID: $peerID")
privateChatManager.toggleFavorite(peerID) privateChatManager.toggleFavorite(peerID)
// Log current state after toggle
logCurrentFavoriteState()
}
private fun logCurrentFavoriteState() {
Log.i("ChatViewModel", "=== CURRENT FAVORITE STATE ===")
Log.i("ChatViewModel", "LiveData favorite peers: ${favoritePeers.value}")
Log.i("ChatViewModel", "DataManager favorite peers: ${dataManager.favoritePeers}")
Log.i("ChatViewModel", "Peer fingerprints: ${privateChatManager.getAllPeerFingerprints()}")
Log.i("ChatViewModel", "==============================")
} }
// MARK: - Debug and Troubleshooting // MARK: - Debug and Troubleshooting
@@ -2,6 +2,7 @@ package com.bitchat.android.ui
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.util.Log
import com.google.gson.Gson import com.google.gson.Gson
import kotlin.random.Random import kotlin.random.Random
@@ -10,6 +11,10 @@ import kotlin.random.Random
*/ */
class DataManager(private val context: Context) { class DataManager(private val context: Context) {
companion object {
private const val TAG = "DataManager"
}
private val prefs: SharedPreferences = context.getSharedPreferences("bitchat_prefs", Context.MODE_PRIVATE) private val prefs: SharedPreferences = context.getSharedPreferences("bitchat_prefs", Context.MODE_PRIVATE)
private val gson = Gson() private val gson = Gson()
@@ -126,24 +131,41 @@ class DataManager(private val context: Context) {
fun loadFavorites() { fun loadFavorites() {
val savedFavorites = prefs.getStringSet("favorites", emptySet()) ?: emptySet() val savedFavorites = prefs.getStringSet("favorites", emptySet()) ?: emptySet()
_favoritePeers.addAll(savedFavorites) _favoritePeers.addAll(savedFavorites)
Log.d(TAG, "Loaded ${savedFavorites.size} favorite users from storage: $savedFavorites")
} }
fun saveFavorites() { fun saveFavorites() {
prefs.edit().putStringSet("favorites", _favoritePeers).apply() prefs.edit().putStringSet("favorites", _favoritePeers).apply()
Log.d(TAG, "Saved ${_favoritePeers.size} favorite users to storage: $_favoritePeers")
} }
fun addFavorite(fingerprint: String) { fun addFavorite(fingerprint: String) {
_favoritePeers.add(fingerprint) val wasAdded = _favoritePeers.add(fingerprint)
Log.d(TAG, "addFavorite: fingerprint=$fingerprint, wasAdded=$wasAdded")
saveFavorites() saveFavorites()
logAllFavorites()
} }
fun removeFavorite(fingerprint: String) { fun removeFavorite(fingerprint: String) {
_favoritePeers.remove(fingerprint) val wasRemoved = _favoritePeers.remove(fingerprint)
Log.d(TAG, "removeFavorite: fingerprint=$fingerprint, wasRemoved=$wasRemoved")
saveFavorites() saveFavorites()
logAllFavorites()
} }
fun isFavorite(fingerprint: String): Boolean { fun isFavorite(fingerprint: String): Boolean {
return _favoritePeers.contains(fingerprint) val result = _favoritePeers.contains(fingerprint)
Log.d(TAG, "isFavorite check: fingerprint=$fingerprint, result=$result")
return result
}
fun logAllFavorites() {
Log.i(TAG, "=== ALL FAVORITE USERS ===")
Log.i(TAG, "Total favorites: ${_favoritePeers.size}")
_favoritePeers.forEach { fingerprint ->
Log.i(TAG, "Favorite fingerprint: $fingerprint")
}
Log.i(TAG, "========================")
} }
// MARK: - Blocked Users Management // MARK: - Blocked Users Management
@@ -3,6 +3,7 @@ package com.bitchat.android.ui
import com.bitchat.android.model.BitchatMessage import com.bitchat.android.model.BitchatMessage
import com.bitchat.android.model.DeliveryStatus import com.bitchat.android.model.DeliveryStatus
import java.util.* import java.util.*
import android.util.Log
/** /**
* Handles private chat functionality including peer management and blocking * Handles private chat functionality including peer management and blocking
@@ -13,6 +14,10 @@ class PrivateChatManager(
private val dataManager: DataManager private val dataManager: DataManager
) { ) {
companion object {
private const val TAG = "PrivateChatManager"
}
// Peer identification mapping // Peer identification mapping
private val peerIDToPublicKeyFingerprint = mutableMapOf<String, String>() private val peerIDToPublicKeyFingerprint = mutableMapOf<String, String>()
@@ -99,17 +104,39 @@ class PrivateChatManager(
fun toggleFavorite(peerID: String) { fun toggleFavorite(peerID: String) {
val fingerprint = peerIDToPublicKeyFingerprint[peerID] ?: return val fingerprint = peerIDToPublicKeyFingerprint[peerID] ?: return
if (dataManager.isFavorite(fingerprint)) { Log.d(TAG, "toggleFavorite called for peerID: $peerID, fingerprint: $fingerprint")
val wasFavorite = dataManager.isFavorite(fingerprint)
Log.d(TAG, "Current favorite status: $wasFavorite")
if (wasFavorite) {
dataManager.removeFavorite(fingerprint) dataManager.removeFavorite(fingerprint)
Log.d(TAG, "Removed from favorites: $fingerprint")
} else { } else {
dataManager.addFavorite(fingerprint) dataManager.addFavorite(fingerprint)
Log.d(TAG, "Added to favorites: $fingerprint")
} }
// Update state to trigger UI refresh
state.setFavoritePeers(dataManager.favoritePeers) state.setFavoritePeers(dataManager.favoritePeers)
Log.d(TAG, "Updated favorite peers state. New favorites: ${dataManager.favoritePeers}")
Log.d(TAG, "All peer fingerprints: $peerIDToPublicKeyFingerprint")
} }
fun isFavorite(peerID: String): Boolean { fun isFavorite(peerID: String): Boolean {
val fingerprint = peerIDToPublicKeyFingerprint[peerID] ?: return false val fingerprint = peerIDToPublicKeyFingerprint[peerID] ?: return false
return dataManager.isFavorite(fingerprint) val isFav = dataManager.isFavorite(fingerprint)
Log.d(TAG, "isFavorite check: peerID=$peerID, fingerprint=$fingerprint, result=$isFav")
return isFav
}
fun getPeerFingerprint(peerID: String): String? {
return peerIDToPublicKeyFingerprint[peerID]
}
fun getPeerFingerprints(): Map<String, String> {
return peerIDToPublicKeyFingerprint.toMap()
} }
// MARK: - Block/Unblock Operations // MARK: - Block/Unblock Operations
@@ -262,10 +289,6 @@ class PrivateChatManager(
// MARK: - Public Getters // MARK: - Public Getters
fun getPeerFingerprint(peerID: String): String? {
return peerIDToPublicKeyFingerprint[peerID]
}
fun getAllPeerFingerprints(): Map<String, String> { fun getAllPeerFingerprints(): Map<String, String> {
return peerIDToPublicKeyFingerprint.toMap() return peerIDToPublicKeyFingerprint.toMap()
} }
@@ -1,5 +1,6 @@
package com.bitchat.android.ui package com.bitchat.android.ui
import android.util.Log
import androidx.compose.animation.* import androidx.compose.animation.*
import androidx.compose.animation.core.* import androidx.compose.animation.core.*
import androidx.compose.foundation.* import androidx.compose.foundation.*
@@ -275,16 +276,22 @@ fun PeopleSection(
) )
sortedPeers.forEach { peerID -> sortedPeers.forEach { peerID ->
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(peerID)
val isFavorite = favoritePeers.contains(fingerprint)
PeerItem( PeerItem(
peerID = peerID, peerID = peerID,
displayName = if (peerID == nickname) "You" else (peerNicknames[peerID] ?: peerID), displayName = if (peerID == nickname) "You" else (peerNicknames[peerID] ?: peerID),
signalStrength = peerRSSI[peerID] ?: 0, signalStrength = peerRSSI[peerID] ?: 0,
isSelected = peerID == selectedPrivatePeer, isSelected = peerID == selectedPrivatePeer,
isFavorite = favoritePeers.contains(viewModel.privateChatManager.getPeerFingerprint(peerID)), isFavorite = isFavorite,
hasUnreadDM = hasUnreadPrivateMessages.contains(peerID), hasUnreadDM = hasUnreadPrivateMessages.contains(peerID),
colorScheme = colorScheme, colorScheme = colorScheme,
onItemClick = { onPrivateChatStart(peerID) }, onItemClick = { onPrivateChatStart(peerID) },
onToggleFavorite = { viewModel.toggleFavorite(peerID) } onToggleFavorite = {
Log.d("SidebarComponents", "Sidebar toggle favorite: peerID=$peerID, fingerprint=$fingerprint, currentFavorite=$isFavorite")
viewModel.toggleFavorite(peerID)
}
) )
} }
} }