diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java b/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java index 05152ee4ba..d71805803c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java @@ -208,6 +208,10 @@ public final class LiveGroup { return Transformations.map(getFullMembers(), fullMembers -> getMembershipDescription(resources, 0, fullMembers.size())); } + public LiveData getMemberLevel(@NonNull Recipient recipient) { + return Transformations.map(groupRecord, g -> g.memberLevel(recipient)); + } + private static String getMembershipDescription(@NonNull Resources resources, int invitedCount, int fullMemberCount) { return invitedCount > 0 ? resources.getQuantityString(R.plurals.MessageRequestProfileView_members_and_invited, fullMemberCount, fullMemberCount, invitedCount) diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java index b3783a6e43..f872bfea18 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java @@ -11,12 +11,14 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Transformations; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import org.thoughtcrime.securesms.BlockUnblockDialog; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.VerifyIdentityActivity; +import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.IdentityDatabase; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.groups.LiveGroup; @@ -53,23 +55,27 @@ final class RecipientDialogViewModel extends ViewModel { boolean recipientIsSelf = recipientDialogRepository.getRecipientId().equals(Recipient.self().getId()); + recipient = Recipient.live(recipientDialogRepository.getRecipientId()).getLiveData(); + if (recipientDialogRepository.getGroupId() != null && recipientDialogRepository.getGroupId().isV2() && !recipientIsSelf) { LiveGroup source = new LiveGroup(recipientDialogRepository.getGroupId()); - LiveData localIsAdmin = source.isSelfAdmin(); - LiveData recipientIsAdmin = source.getRecipientIsAdmin(recipientDialogRepository.getRecipientId()); + LiveData localIsAdmin = source.isSelfAdmin(); + LiveData recipientMemberLevel = Transformations.switchMap(recipient, source::getMemberLevel); - adminActionStatus = LiveDataUtil.combineLatest(localIsAdmin, recipientIsAdmin, - (localAdmin, recipientAdmin) -> - new AdminActionStatus(localAdmin, - localAdmin && !recipientAdmin, - localAdmin && recipientAdmin)); + adminActionStatus = LiveDataUtil.combineLatest(localIsAdmin, recipientMemberLevel, + (localAdmin, memberLevel) -> { + boolean inGroup = memberLevel.isInGroup(); + boolean recipientAdmin = memberLevel == GroupDatabase.MemberLevel.ADMINISTRATOR; + + return new AdminActionStatus(inGroup && localAdmin, + inGroup && localAdmin && !recipientAdmin, + inGroup && localAdmin && recipientAdmin); + }); } else { adminActionStatus = new MutableLiveData<>(new AdminActionStatus(false, false, false)); } - recipient = Recipient.live(recipientDialogRepository.getRecipientId()).getLiveData(); - boolean isSelf = recipientDialogRepository.getRecipientId().equals(Recipient.self().getId()); if (!isSelf) { recipientDialogRepository.getIdentity(identity::postValue);