Update group terminated banner.

This commit is contained in:
Cody Henthorne
2026-03-25 15:14:05 -04:00
parent 206f6d84e7
commit 2b9126d74b
11 changed files with 61 additions and 88 deletions

View File

@@ -73,7 +73,6 @@ import org.thoughtcrime.securesms.components.settings.conversation.preferences.L
import org.thoughtcrime.securesms.components.settings.conversation.preferences.LegacyGroupPreference
import org.thoughtcrime.securesms.components.settings.conversation.preferences.RecipientPreference
import org.thoughtcrime.securesms.components.settings.conversation.preferences.SharedMediaPreference
import org.thoughtcrime.securesms.components.settings.conversation.preferences.TerminatedBannerPreference
import org.thoughtcrime.securesms.components.settings.conversation.preferences.Utils.formatMutedUntil
import org.thoughtcrime.securesms.conversation.ConversationIntents
import org.thoughtcrime.securesms.conversation.colors.ColorizerV2
@@ -306,7 +305,6 @@ class ConversationSettingsFragment :
InternalPreference.register(adapter)
GroupDescriptionPreference.register(adapter)
LegacyGroupPreference.register(adapter)
TerminatedBannerPreference.register(adapter)
CallPreference.register(adapter)
val recipientId = args.recipientId
@@ -369,17 +367,10 @@ class ConversationSettingsFragment :
return@configure
}
state.withGroupSettingsState {
if (it.isTerminated) {
customPref(TerminatedBannerPreference.Model())
}
}
customPref(
AvatarPreference.Model(
recipient = state.recipient,
storyViewState = state.storyViewState,
reduceTopMargin = state.isTerminatedGroup,
onAvatarClick = { avatar ->
val viewAvatarIntent = AvatarPreviewActivity.intentFromRecipientId(requireContext(), state.recipient.id)
val viewAvatarTransitionBundle = AvatarPreviewActivity.createTransitionBundle(requireActivity(), avatar)
@@ -434,7 +425,8 @@ class ConversationSettingsFragment :
customPref(
BioTextPreference.GroupModel(
groupTitle = groupState.groupTitle,
groupMembershipDescription = groupMembershipDescription
groupMembershipDescription = groupMembershipDescription,
isTerminated = groupState.isTerminated
)
)

View File

@@ -1,9 +1,7 @@
package org.thoughtcrime.securesms.components.settings.conversation.preferences
import android.view.View
import android.view.ViewGroup
import androidx.core.view.ViewCompat
import org.signal.core.util.dp
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.avatar.view.AvatarView
import org.thoughtcrime.securesms.badges.BadgeImageView
@@ -27,7 +25,6 @@ object AvatarPreference {
class Model(
val recipient: Recipient,
val storyViewState: StoryViewState,
val reduceTopMargin: Boolean = false,
val onAvatarClick: (AvatarView) -> Unit,
val onBadgeClick: (Badge) -> Unit
) : PreferenceModel<Model>() {
@@ -38,8 +35,7 @@ object AvatarPreference {
override fun areContentsTheSame(newItem: Model): Boolean {
return super.areContentsTheSame(newItem) &&
recipient.hasSameContent(newItem.recipient) &&
storyViewState == newItem.storyViewState &&
reduceTopMargin == newItem.reduceTopMargin
storyViewState == newItem.storyViewState
}
}
@@ -53,10 +49,6 @@ object AvatarPreference {
}
override fun bind(model: Model) {
(itemView.layoutParams as? ViewGroup.MarginLayoutParams)?.let {
it.topMargin = if (model.reduceTopMargin) 0.dp else 40.dp
}
if (model.recipient.isSelf) {
badge.setBadge(null)
badge.setOnClickListener(null)

View File

@@ -2,11 +2,13 @@ package org.thoughtcrime.securesms.components.settings.conversation.preferences
import android.content.ClipData
import android.content.Context
import android.text.SpannableStringBuilder
import android.view.View
import android.widget.TextView
import android.widget.Toast
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.PreferenceModel
import org.thoughtcrime.securesms.fonts.SignalSymbols
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.ServiceUtil
import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory
@@ -61,7 +63,8 @@ object BioTextPreference {
class GroupModel(
val groupTitle: String,
val groupMembershipDescription: String?
val groupMembershipDescription: String?,
val isTerminated: Boolean = false
) : BioTextPreferenceModel<GroupModel>() {
override fun getHeadlineText(context: Context): CharSequence = groupTitle
@@ -72,7 +75,8 @@ object BioTextPreference {
override fun areContentsTheSame(newItem: GroupModel): Boolean {
return super.areContentsTheSame(newItem) &&
groupTitle == newItem.groupTitle &&
groupMembershipDescription == newItem.groupMembershipDescription
groupMembershipDescription == newItem.groupMembershipDescription &&
isTerminated == newItem.isTerminated
}
override fun areItemsTheSame(newItem: GroupModel): Boolean {
@@ -85,6 +89,7 @@ object BioTextPreference {
private val headline: TextView = itemView.findViewById(R.id.bio_preference_headline)
private val subhead1: TextView = itemView.findViewById(R.id.bio_preference_subhead_1)
protected val subhead2: TextView = itemView.findViewById(R.id.bio_preference_subhead_2)
private val terminatedPill: TextView = itemView.findViewById(R.id.bio_preference_terminated_pill)
override fun bind(model: T) {
headline.text = model.getHeadlineText(context)
@@ -94,6 +99,17 @@ object BioTextPreference {
headline.setOnClickListener { clickListener() }
}
if (model is GroupModel && model.isTerminated) {
val glyphSpan = SignalSymbols.getSpannedString(context, SignalSymbols.Weight.REGULAR, SignalSymbols.Glyph.GROUP_X)
terminatedPill.text = SpannableStringBuilder()
.append(glyphSpan)
.append(" ")
.append(context.getString(R.string.ConversationSettingsFragment__this_group_was_ended))
terminatedPill.visibility = View.VISIBLE
} else {
terminatedPill.visibility = View.GONE
}
model.getSubhead1Text(context).let {
subhead1.text = it
subhead1.visibility = if (it == null) View.GONE else View.VISIBLE

View File

@@ -1,29 +0,0 @@
/*
* Copyright 2025 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.components.settings.conversation.preferences
import android.view.View
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.PreferenceModel
import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder
object TerminatedBannerPreference {
fun register(adapter: MappingAdapter) {
adapter.registerFactory(Model::class.java, LayoutFactory(::ViewHolder, R.layout.conversation_settings_terminated_banner))
}
class Model : PreferenceModel<Model>() {
override fun areItemsTheSame(newItem: Model): Boolean = true
override fun areContentsTheSame(newItem: Model): Boolean = true
}
private class ViewHolder(itemView: View) : MappingViewHolder<Model>(itemView) {
override fun bind(model: Model) = Unit
}
}