diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index eefdb80a7..8decbce44 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -236,7 +236,13 @@ class User(val pubkeyHex: String) { } fun isFollowing(user: User): Boolean { - return (latestContactList)?.unverifiedFollowKeySet()?.toSet()?.let { + return latestContactList?.unverifiedFollowKeySet()?.toSet()?.let { + return user.pubkeyHex in it + } ?: false + } + + fun isFollowingCached(user: User): Boolean { + return latestContactList?.verifiedFollowKeySet?.let { return user.pubkeyHex in it } ?: false } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index ee19c865a..d34238a4b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -277,7 +277,7 @@ fun ChatroomMessageCompose( val eventContent = accountViewModel.decrypt(note) val canPreview = note.author == accountUser || - (note.author?.let { accountUser.isFollowing(it) } ?: true) || + (note.author?.let { accountUser.isFollowingCached(it) } ?: true) || !noteForReports.hasAnyReports() if (eventContent != null) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 8c228a767..5cc5d91e0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -299,7 +299,7 @@ fun NoteCompose( val sortedMentions = noteEvent.mentions() .map { LocalCache.getOrCreateUser(it) } .toSet() - .sortedBy { account.userProfile().isFollowing(it) } + .sortedBy { account.userProfile().isFollowingCached(it) } val replyingDirectlyTo = note.replyTo?.lastOrNull() if (replyingDirectlyTo != null && unPackReply) { @@ -328,7 +328,7 @@ fun NoteCompose( val sortedMentions = noteEvent.mentions() .map { LocalCache.getOrCreateUser(it) } .toSet() - .sortedBy { account.userProfile().isFollowing(it) } + .sortedBy { account.userProfile().isFollowingCached(it) } note.channel()?.let { ReplyInformationChannel(note.replyTo, sortedMentions, it, navController) @@ -453,7 +453,7 @@ fun NoteCompose( val eventContent = accountViewModel.decrypt(note) val canPreview = note.author == account.userProfile() || - (note.author?.let { account.userProfile().isFollowing(it) } ?: true) || + (note.author?.let { account.userProfile().isFollowingCached(it) } ?: true) || !noteForReports.hasAnyReports() if (eventContent != null) { @@ -747,7 +747,7 @@ fun UserPicture( val accountState by baseUserAccount.live().follows.observeAsState() val accountUser = accountState?.user ?: return - if (accountUser.isFollowing(user) || user == accountUser) { + if (accountUser.isFollowingCached(user) || user == accountUser) { Box( Modifier .width(size.div(3.5f)) @@ -786,7 +786,7 @@ fun NoteDropDownMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Unit, expanded = popupExpanded, onDismissRequest = onDismiss ) { - if (note.author != accountViewModel.accountLiveData.value?.account?.userProfile() && !accountViewModel.accountLiveData.value?.account?.userProfile()!!.isFollowing(note.author!!)) { + if (!accountViewModel.isFollowing(note.author!!)) { DropdownMenuItem(onClick = { accountViewModel.follow( note.author ?: return@DropdownMenuItem diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt index f4735e04d..4a817cbed 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt @@ -30,7 +30,7 @@ fun ReplyInformation(replyTo: List?, mentions: List?, account: Accou @Composable fun ReplyInformation(replyTo: List?, dupMentions: List?, account: Account, prefix: String = "", onUserTagClick: (User) -> Unit) { - val mentions = dupMentions?.toSet()?.sortedBy { !account.userProfile().isFollowing(it) } + val mentions = dupMentions?.toSet()?.sortedBy { !account.userProfile().isFollowingCached(it) } var expanded by remember { mutableStateOf((mentions?.size ?: 0) <= 2) } FlowRow() { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserCompose.kt index 46f154fe1..51bd3d392 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserCompose.kt @@ -72,7 +72,7 @@ fun UserCompose(baseUser: User, accountViewModel: AccountViewModel, navControlle ShowUserButton { account.showUser(baseUser.pubkeyHex) } - } else if (userFollows.isFollowing(baseUser)) { + } else if (userFollows.isFollowingCached(baseUser)) { UnfollowButton { coroutineScope.launch(Dispatchers.IO) { account.unfollow(baseUser) } } } else { FollowButton { coroutineScope.launch(Dispatchers.IO) { account.follow(baseUser) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapNoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapNoteCompose.kt index e8e2ccf61..dde2a8698 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapNoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapNoteCompose.kt @@ -117,7 +117,7 @@ fun ZapNoteCompose(baseNote: Pair, accountViewModel: AccountViewMode ShowUserButton { account.showUser(baseAuthor.pubkeyHex) } - } else if (userFollows.isFollowing(baseAuthor)) { + } else if (userFollows.isFollowingCached(baseAuthor)) { UnfollowButton { coroutineScope.launch(Dispatchers.IO) { account.unfollow(baseAuthor) } } } else { FollowButton { coroutineScope.launch(Dispatchers.IO) { account.follow(baseAuthor) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt index d9a5a667b..d7173f819 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt @@ -328,7 +328,7 @@ fun NoteMaster( val eventContent = note.event?.content() val canPreview = note.author == account.userProfile() || - (note.author?.let { account.userProfile().isFollowing(it) } ?: true) || + (note.author?.let { account.userProfile().isFollowingCached(it) } ?: true) || !noteForReports.hasAnyReports() if (eventContent != null) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index 3f94694d7..dc1778e5a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -125,8 +125,12 @@ class AccountViewModel(private val account: Account) : ViewModel() { account.unfollow(user) } + fun isLoggedUser(user: User): Boolean { + return account.userProfile() == user + } + fun isFollowing(user: User): Boolean { - return account.userProfile().isFollowing(user) + return account.userProfile().isFollowingCached(user) } val hideDeleteRequestDialog: Boolean diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 041780219..6ca9db93e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -373,7 +373,7 @@ private fun ProfileHeader( ShowUserButton { account.showUser(baseUser.pubkeyHex) } - } else if (accountUser.isFollowing(baseUser)) { + } else if (accountUser.isFollowingCached(baseUser)) { UnfollowButton { coroutineScope.launch(Dispatchers.IO) { account.unfollow(baseUser) } } } else { FollowButton { coroutineScope.launch(Dispatchers.IO) { account.follow(baseUser) } }