From fc914f266748e193bfcf77d80882485ec4b0d33d Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Fri, 7 Feb 2025 07:00:55 +0200 Subject: [PATCH] Showing the admin crown for legacy groups (#923) --- .../securesms/contacts/UserView.kt | 4 +++ .../v2/messages/VisibleMessageView.kt | 12 ++++++- .../groups/EditLegacyGroupActivity.kt | 14 +++++--- .../groups/EditLegacyGroupMembersAdapter.kt | 3 ++ app/src/main/res/layout/view_user.xml | 34 +++++++++++++++---- 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/UserView.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/UserView.kt index 8cfd58f097..ff0fbc65c9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/UserView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/UserView.kt @@ -85,6 +85,10 @@ class UserView : LinearLayout { } } + fun handleAdminStatus(isAdmin: Boolean){ + binding.adminIcon.visibility = if (isAdmin) View.VISIBLE else View.GONE + } + fun unbind() { binding.profilePictureView.recycle() } // endregion } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index 2c1662656b..7bac203265 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -61,8 +61,10 @@ import org.thoughtcrime.securesms.home.UserDetailsBottomSheet import com.bumptech.glide.Glide import com.bumptech.glide.RequestManager import network.loki.messenger.libsession_util.getOrNull +import org.session.libsession.utilities.Address.Companion.fromSerialized import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsignal.utilities.AccountId +import org.thoughtcrime.securesms.database.GroupDatabase import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.dependencies.ConfigFactory import org.thoughtcrime.securesms.util.DateUtils @@ -77,6 +79,7 @@ class VisibleMessageView : FrameLayout { private var replyDisabled: Boolean = false @Inject lateinit var threadDb: ThreadDatabase @Inject lateinit var lokiThreadDb: LokiThreadDatabase + @Inject lateinit var groupDb: GroupDatabase // for legacy groups only @Inject lateinit var lokiApiDb: LokiAPIDatabase @Inject lateinit var mmsSmsDb: MmsSmsDatabase @Inject lateinit var smsDb: SmsDatabase @@ -211,7 +214,14 @@ class VisibleMessageView : FrameLayout { } val isModerator = OpenGroupManager.isUserModerator(context, openGroup.groupId, standardPublicKey, blindedPublicKey) binding.moderatorIconImageView.isVisible = isModerator - } else if (thread.isGroupV2Recipient) { + } + else if (thread.isLegacyGroupRecipient) { // legacy groups + val groupRecord = groupDb.getGroup(thread.address.toGroupString()).orNull() + val isAdmin: Boolean = groupRecord?.admins?.contains(fromSerialized(senderAccountID)) ?: false + + binding.moderatorIconImageView.isVisible = isAdmin + } + else if (thread.isGroupV2Recipient) { // groups v2 val isAdmin = configFactory.withGroupConfigs(AccountId(thread.address.serialize())) { it.groupMembers.getOrNull(senderAccountID)?.admin == true } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/EditLegacyGroupActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/EditLegacyGroupActivity.kt index d50d0692ae..88762c9185 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/EditLegacyGroupActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/EditLegacyGroupActivity.kt @@ -66,6 +66,8 @@ class EditLegacyGroupActivity : PassphraseRequiredActionBarActivity() { private var isLoading = false set(newValue) { field = newValue; invalidateOptionsMenu() } + private val groupInfo by lazy { DatabaseComponent.get(this).groupDatabase().getGroup(groupID).get() } + private lateinit var groupID: String private lateinit var originalName: String private lateinit var name: String @@ -79,9 +81,9 @@ class EditLegacyGroupActivity : PassphraseRequiredActionBarActivity() { private val memberListAdapter by lazy { if (isSelfAdmin) - EditLegacyGroupMembersAdapter(this, Glide.with(this), isSelfAdmin, this::onMemberClick) + EditLegacyGroupMembersAdapter(this, Glide.with(this), isSelfAdmin, ::checkUserIsAdmin , this::onMemberClick) else - EditLegacyGroupMembersAdapter(this, Glide.with(this), isSelfAdmin) + EditLegacyGroupMembersAdapter(this, Glide.with(this), isSelfAdmin, ::checkUserIsAdmin) } private lateinit var mainContentContainer: LinearLayout @@ -108,9 +110,9 @@ class EditLegacyGroupActivity : PassphraseRequiredActionBarActivity() { ThemeUtil.getThemedDrawableResId(this, R.attr.actionModeCloseDrawable)) groupID = intent.getStringExtra(groupIDKey)!! - val groupInfo = DatabaseComponent.get(this).groupDatabase().getGroup(groupID).get() + originalName = groupInfo.title - isSelfAdmin = groupInfo.admins.any { it.serialize() == TextSecurePreferences.getLocalNumber(this) } + isSelfAdmin = checkUserIsAdmin(TextSecurePreferences.getLocalNumber(this)) name = originalName @@ -205,6 +207,10 @@ class EditLegacyGroupActivity : PassphraseRequiredActionBarActivity() { } } + private fun checkUserIsAdmin(userId: String?): Boolean{ + return groupInfo.admins.any { it.serialize() == userId } + } + private fun handleIsEditingNameChanged() { cntGroupNameEdit.visibility = if (isEditingName) View.VISIBLE else View.INVISIBLE cntGroupNameDisplay.visibility = if (isEditingName) View.INVISIBLE else View.VISIBLE diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/EditLegacyGroupMembersAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/EditLegacyGroupMembersAdapter.kt index 248b858376..7f55e1dd46 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/EditLegacyGroupMembersAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/EditLegacyGroupMembersAdapter.kt @@ -13,6 +13,7 @@ class EditLegacyGroupMembersAdapter( private val context: Context, private val glide: RequestManager, private val admin: Boolean, + private val checkIsAdmin: (String) -> Boolean, private val memberClickListener: ((String) -> Unit)? = null ) : RecyclerView.Adapter() { @@ -59,6 +60,8 @@ class EditLegacyGroupMembersAdapter( } else { viewHolder.view.setOnClickListener(null) } + + viewHolder.view.handleAdminStatus(checkIsAdmin(member)) } class ViewHolder(val view: UserView) : RecyclerView.ViewHolder(view) diff --git a/app/src/main/res/layout/view_user.xml b/app/src/main/res/layout/view_user.xml index 965efe7780..5ad9e503d7 100644 --- a/app/src/main/res/layout/view_user.xml +++ b/app/src/main/res/layout/view_user.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="64dp" + xmlns:app="http://schemas.android.com/apk/res-auto" android:background="?attr/selectableItemBackground" android:contentDescription="@string/AccessibilityId_contact" android:orientation="vertical"> @@ -15,12 +16,33 @@ android:gravity="center_vertical" android:paddingHorizontal="@dimen/medium_spacing"> - + + + + + + +