mirror of
https://github.com/permissionlesstech/bitchat-android.git
synced 2026-07-25 19:05:21 +00:00
fix favorites
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user