From ce2a21c4386ce943c42f576652fb2e564b6749df Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 28 Jul 2023 13:26:58 -0400 Subject: [PATCH] Fix disabled input state for Release Notes Channel. --- .../conversation/v2/ConversationFragment.kt | 7 +++- .../conversation/v2/ConversationViewModel.kt | 2 +- .../conversation/v2/DisabledInputView.kt | 18 +++++++++++ .../conversation/v2/InputReadyState.kt | 32 ++++++++++++++++++- .../layout/conversation_activity_unmute.xml | 3 +- .../res/layout/v2_conversation_fragment.xml | 2 +- 6 files changed, 58 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 7cc3b33b20..c9a59871af 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -1047,7 +1047,8 @@ class ConversationFragment : inputReadyState.isActiveGroup == false -> disabledInputView.showAsNoLongerAMember() inputReadyState.isRequestingMember == true -> disabledInputView.showAsRequestingMember() inputReadyState.isAnnouncementGroup == true && inputReadyState.isAdmin == false -> disabledInputView.showAsAnnouncementGroupAdminsOnly() - !inputReadyState.conversationRecipient.isGroup && !inputReadyState.conversationRecipient.isRegistered -> disabledInputView.showAsInviteToSignal(requireContext(), inputReadyState.conversationRecipient) + inputReadyState.conversationRecipient.isReleaseNotes -> disabledInputView.showAsReleaseNotesChannel(inputReadyState.conversationRecipient) + inputReadyState.shouldShowInviteToSignal() -> disabledInputView.showAsInviteToSignal(requireContext(), inputReadyState.conversationRecipient) else -> inputDisabled = false } @@ -3497,6 +3498,10 @@ class ConversationFragment : ) } + override fun onUnmuteReleaseNotesChannel() { + viewModel.muteConversation(0L) + } + private fun Single>.subscribeWithShowProgress(logMessage: String): Disposable { return doOnSubscribe { binding.conversationDisabledInput.showBusy() } .doOnTerminate { binding.conversationDisabledInput.hideBusy() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index 19341cef3e..7b672bd45f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -417,7 +417,7 @@ class ConversationViewModel( fun getRequestReviewState(): Observable { return _inputReadyState - .flatMapSingle { (recipient, messageRequestState, group) -> repository.getRequestReviewState(recipient, group, messageRequestState) } + .flatMapSingle { state -> repository.getRequestReviewState(state.conversationRecipient, state.groupRecord, state.messageRequestState) } .distinctUntilChanged() .observeOn(AndroidSchedulers.mainThread()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt index a83c1f91b5..10251e47cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt @@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.messagerequests.MessageRequestViewModel import org.thoughtcrime.securesms.messagerequests.MessageRequestsBottomView import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.SpanUtil +import org.thoughtcrime.securesms.util.visible /** * A one-stop-view for all your conversation input disabled needs. @@ -45,6 +46,7 @@ class DisabledInputView @JvmOverloads constructor( private var requestingGroup: View? = null private var announcementGroupOnly: TextView? = null private var inviteToSignal: View? = null + private var releaseNoteChannel: View? = null private var currentView: View? = null @@ -140,6 +142,21 @@ class DisabledInputView @JvmOverloads constructor( ) } + fun showAsReleaseNotesChannel(recipient: Recipient) { + releaseNoteChannel = show( + existingView = releaseNoteChannel, + create = { inflater.inflate(R.layout.conversation_activity_unmute, this, false) }, + bind = { + if (recipient.isMuted) { + visible = true + findViewById(R.id.conversation_activity_unmute_button).setOnClickListener { listener?.onUnmuteReleaseNotesChannel() } + } else { + visible = false + } + } + ) + } + fun setWallpaperEnabled(wallpaperEnabled: Boolean) { color = ContextCompat.getColor(context, if (wallpaperEnabled) R.color.wallpaper_bubble_color else R.color.signal_colorBackground) setBackgroundColor(color) @@ -209,5 +226,6 @@ class DisabledInputView @JvmOverloads constructor( fun onUnblockClicked() fun onGroupV1MigrationClicked() fun onInviteToSignal(recipient: Recipient) + fun onUnmuteReleaseNotesChannel() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/InputReadyState.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/InputReadyState.kt index 6e481e6d43..0f6daf198a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/InputReadyState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/InputReadyState.kt @@ -13,7 +13,7 @@ import org.thoughtcrime.securesms.recipients.Recipient /** * Information necessary for rendering compose input. */ -data class InputReadyState( +class InputReadyState( val conversationRecipient: Recipient, val messageRequestState: MessageRequestState, val groupRecord: GroupRecord?, @@ -26,4 +26,34 @@ data class InputReadyState( val isActiveGroup: Boolean? = if (selfMemberLevel == null) null else selfMemberLevel != GroupTable.MemberLevel.NOT_A_MEMBER val isAdmin: Boolean? = selfMemberLevel?.equals(GroupTable.MemberLevel.ADMINISTRATOR) val isRequestingMember: Boolean? = selfMemberLevel?.equals(GroupTable.MemberLevel.REQUESTING_MEMBER) + + fun shouldShowInviteToSignal(): Boolean { + return !conversationRecipient.isGroup && + !conversationRecipient.isRegistered && + !conversationRecipient.isReleaseNotes + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as InputReadyState + + if (!conversationRecipient.hasSameContent(other.conversationRecipient)) return false + if (messageRequestState != other.messageRequestState) return false + if (groupRecord != other.groupRecord) return false + if (isClientExpired != other.isClientExpired) return false + if (isUnauthorized != other.isUnauthorized) return false + + return true + } + + override fun hashCode(): Int { + var result = conversationRecipient.hashCode() + result = 31 * result + messageRequestState.hashCode() + result = 31 * result + (groupRecord?.hashCode() ?: 0) + result = 31 * result + isClientExpired.hashCode() + result = 31 * result + isUnauthorized.hashCode() + return result + } } diff --git a/app/src/main/res/layout/conversation_activity_unmute.xml b/app/src/main/res/layout/conversation_activity_unmute.xml index f2dfd007ce..9ef8741b60 100644 --- a/app/src/main/res/layout/conversation_activity_unmute.xml +++ b/app/src/main/res/layout/conversation_activity_unmute.xml @@ -3,8 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" tools:viewBindingIgnore="true" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/signal_colorSurface2"> + android:layout_height="wrap_content">