From 9480cd1b7bcfcc116c23f0a110854dc0be082e72 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 12 Oct 2022 16:11:58 -0300 Subject: [PATCH] Add ability to hide sms tag in contact search config. --- .../contacts/paged/ContactSearchItems.kt | 35 ++++++++++++++++--- .../contacts/paged/ContactSearchMediator.kt | 2 ++ .../forward/MultiselectForwardFragment.kt | 3 +- .../v2/stories/ChooseGroupStoryBottomSheet.kt | 2 ++ .../thoughtcrime/securesms/stories/Stories.kt | 4 +-- .../ViewAllSignalConnectionsFragment.kt | 2 ++ 6 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchItems.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchItems.kt index c575d72d82..de919a15c1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchItems.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchItems.kt @@ -29,7 +29,6 @@ private typealias RecipientClickListener = (View, ContactSearchData.KnownRecipie * Mapping Models and View Holders for ContactSearchData */ object ContactSearchItems { - fun registerStoryItems( mappingAdapter: MappingAdapter, displayCheckBox: Boolean = false, @@ -52,6 +51,7 @@ object ContactSearchItems { fun register( mappingAdapter: MappingAdapter, displayCheckBox: Boolean, + displaySmsTag: DisplaySmsTag, recipientListener: RecipientClickListener, storyListener: StoryClickListener, storyContextMenuCallbacks: StoryContextMenuCallbacks, @@ -60,7 +60,7 @@ object ContactSearchItems { registerStoryItems(mappingAdapter, displayCheckBox, storyListener, storyContextMenuCallbacks) mappingAdapter.registerFactory( RecipientModel::class.java, - LayoutFactory({ KnownRecipientViewHolder(it, displayCheckBox, recipientListener) }, R.layout.contact_search_item) + LayoutFactory({ KnownRecipientViewHolder(it, displayCheckBox, displaySmsTag, recipientListener) }, R.layout.contact_search_item) ) registerHeaders(mappingAdapter) mappingAdapter.registerFactory( @@ -115,7 +115,7 @@ object ContactSearchItems { displayCheckBox: Boolean, onClick: StoryClickListener, private val storyContextMenuCallbacks: StoryContextMenuCallbacks? - ) : BaseRecipientViewHolder(itemView, displayCheckBox, onClick) { + ) : BaseRecipientViewHolder(itemView, displayCheckBox, DisplaySmsTag.NEVER, onClick) { override fun isSelected(model: StoryModel): Boolean = model.isSelected override fun getData(model: StoryModel): ContactSearchData.Story = model.story override fun getRecipient(model: StoryModel): Recipient = model.story.recipient @@ -227,7 +227,12 @@ object ContactSearchItems { } } - private class KnownRecipientViewHolder(itemView: View, displayCheckBox: Boolean, onClick: RecipientClickListener) : BaseRecipientViewHolder(itemView, displayCheckBox, onClick), LetterHeaderDecoration.LetterHeaderItem { + private class KnownRecipientViewHolder( + itemView: View, + displayCheckBox: Boolean, + displaySmsTag: DisplaySmsTag, + onClick: RecipientClickListener + ) : BaseRecipientViewHolder(itemView, displayCheckBox, displaySmsTag, onClick), LetterHeaderDecoration.LetterHeaderItem { private var headerLetter: String? = null @@ -255,7 +260,12 @@ object ContactSearchItems { /** * Base Recipient View Holder */ - private abstract class BaseRecipientViewHolder, D : ContactSearchData>(itemView: View, private val displayCheckBox: Boolean, val onClick: (View, D, Boolean) -> Unit) : MappingViewHolder(itemView) { + private abstract class BaseRecipientViewHolder, D : ContactSearchData>( + itemView: View, + private val displayCheckBox: Boolean, + private val displaySmsTag: DisplaySmsTag, + val onClick: (View, D, Boolean) -> Unit + ) : MappingViewHolder(itemView) { protected val avatar: AvatarImageView = itemView.findViewById(R.id.contact_photo_image) protected val badge: BadgeImageView = itemView.findViewById(R.id.contact_badge) @@ -309,6 +319,11 @@ object ContactSearchItems { } protected open fun bindSmsTagField(model: T) { + smsTag.visible = when (displaySmsTag) { + DisplaySmsTag.DEFAULT -> isSmsContact(model) + DisplaySmsTag.IF_NOT_REGISTERED -> isNotRegistered(model) + DisplaySmsTag.NEVER -> false + } smsTag.visible = isSmsContact(model) } @@ -318,6 +333,10 @@ object ContactSearchItems { return (getRecipient(model).isForceSmsSelection || getRecipient(model).isUnregistered) && !getRecipient(model).isDistributionList } + private fun isNotRegistered(model: T): Boolean { + return getRecipient(model).isUnregistered && !getRecipient(model).isDistributionList + } + abstract fun isSelected(model: T): Boolean abstract fun getData(model: T): D abstract fun getRecipient(model: T): Recipient @@ -403,4 +422,10 @@ object ContactSearchItems { fun onRemoveGroupStory(story: ContactSearchData.Story, isSelected: Boolean) fun onDeletePrivateStory(story: ContactSearchData.Story, isSelected: Boolean) } + + enum class DisplaySmsTag { + DEFAULT, + IF_NOT_REGISTERED, + NEVER + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchMediator.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchMediator.kt index b9cdfe960a..aeadbd8d5b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchMediator.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchMediator.kt @@ -25,6 +25,7 @@ class ContactSearchMediator( recyclerView: RecyclerView, selectionLimits: SelectionLimits, displayCheckBox: Boolean, + displaySmsTag: ContactSearchItems.DisplaySmsTag, mapStateToConfiguration: (ContactSearchState) -> ContactSearchConfiguration, private val contactSelectionPreFilter: (View?, Set) -> Set = { _, s -> s }, performSafetyNumberChecks: Boolean = true @@ -40,6 +41,7 @@ class ContactSearchMediator( ContactSearchItems.register( mappingAdapter = adapter, displayCheckBox = displayCheckBox, + displaySmsTag = displaySmsTag, recipientListener = this::toggleSelection, storyListener = this::toggleStorySelection, storyContextMenuCallbacks = StoryContextMenuCallbacks(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt index 0ce2139e55..711e019700 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt @@ -36,6 +36,7 @@ import org.thoughtcrime.securesms.components.TooltipPopup import org.thoughtcrime.securesms.components.WrapperDialogFragment import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration import org.thoughtcrime.securesms.contacts.paged.ContactSearchError +import org.thoughtcrime.securesms.contacts.paged.ContactSearchItems import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.contacts.paged.ContactSearchMediator import org.thoughtcrime.securesms.contacts.paged.ContactSearchState @@ -115,7 +116,7 @@ class MultiselectForwardFragment : view.minimumHeight = resources.displayMetrics.heightPixels contactSearchRecycler = view.findViewById(R.id.contact_selection_list) - contactSearchMediator = ContactSearchMediator(this, contactSearchRecycler, FeatureFlags.shareSelectionLimit(), !args.selectSingleRecipient, this::getConfiguration, this::filterContacts) + contactSearchMediator = ContactSearchMediator(this, contactSearchRecycler, FeatureFlags.shareSelectionLimit(), !args.selectSingleRecipient, ContactSearchItems.DisplaySmsTag.DEFAULT, this::getConfiguration, this::filterContacts) callback = findListener()!! disposables.bindTo(viewLifecycleOwner.lifecycle) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt index e2e7c72ea3..04645b4824 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt @@ -16,6 +16,7 @@ import org.signal.core.util.DimensionUnit import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration +import org.thoughtcrime.securesms.contacts.paged.ContactSearchItems import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.contacts.paged.ContactSearchMediator import org.thoughtcrime.securesms.contacts.paged.ContactSearchSortOrder @@ -66,6 +67,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment( recyclerView = contactRecycler, selectionLimits = FeatureFlags.shareSelectionLimit(), displayCheckBox = true, + displaySmsTag = ContactSearchItems.DisplaySmsTag.DEFAULT, mapStateToConfiguration = { state -> ContactSearchConfiguration.build { query = state.query diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt index c268bb38f8..3146334b82 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt @@ -4,10 +4,10 @@ import android.content.Context import android.net.Uri import androidx.annotation.WorkerThread import androidx.fragment.app.FragmentManager +import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.PlaybackException import com.google.android.exoplayer2.Player -import com.google.android.exoplayer2.SimpleExoPlayer import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.ThreadUtil @@ -299,7 +299,7 @@ object Stories { @WorkerThread fun getVideoDuration(uri: Uri): Long { var duration = 0L - var player: SimpleExoPlayer? = null + var player: ExoPlayer? = null val countDownLatch = CountDownLatch(1) ThreadUtil.runOnMainSync { val mainThreadPlayer = ApplicationDependencies.getExoPlayerPool().get("stories_duration_check") diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/connections/ViewAllSignalConnectionsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/connections/ViewAllSignalConnectionsFragment.kt index e8979c68a5..26f855e7a7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/connections/ViewAllSignalConnectionsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/connections/ViewAllSignalConnectionsFragment.kt @@ -9,6 +9,7 @@ import org.thoughtcrime.securesms.components.ViewBinderDelegate import org.thoughtcrime.securesms.components.WrapperDialogFragment import org.thoughtcrime.securesms.contacts.LetterHeaderDecoration import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration +import org.thoughtcrime.securesms.contacts.paged.ContactSearchItems import org.thoughtcrime.securesms.contacts.paged.ContactSearchMediator import org.thoughtcrime.securesms.databinding.ViewAllSignalConnectionsFragmentBinding import org.thoughtcrime.securesms.groups.SelectionLimits @@ -28,6 +29,7 @@ class ViewAllSignalConnectionsFragment : Fragment(R.layout.view_all_signal_conne recyclerView = binding.recycler, selectionLimits = SelectionLimits(0, 0), displayCheckBox = false, + displaySmsTag = ContactSearchItems.DisplaySmsTag.IF_NOT_REGISTERED, mapStateToConfiguration = { getConfiguration() }, performSafetyNumberChecks = false )