From 1357a4816b23423d88c8ceddb71c85284d53bc21 Mon Sep 17 00:00:00 2001 From: Clark Date: Tue, 27 Jun 2023 13:28:10 -0400 Subject: [PATCH] Update edit history dialog to new style. --- .../components/ConversationItemFooter.java | 10 +++++-- .../conversation/ConversationAdapter.java | 4 +++ .../conversation/ConversationItem.java | 8 +++--- .../ConversationItemDisplayMode.kt | 2 +- .../ui/edit/EditMessageHistoryDialog.kt | 26 ++++++++++++++----- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java index e644cf1dd7..8897c87b30 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java @@ -320,8 +320,14 @@ public class ConversationItemFooter extends ConstraintLayout { } else if (MessageRecordUtil.isScheduled(messageRecord)) { dateView.setText(DateUtils.getOnlyTimeString(getContext(), locale, ((MediaMmsMessageRecord) messageRecord).getScheduledDate())); } else { - String date = DateUtils.getSimpleRelativeTimeSpanString(getContext(), locale, messageRecord.getTimestamp()); - if (displayMode != ConversationItemDisplayMode.DETAILED && messageRecord instanceof MediaMmsMessageRecord && ((MediaMmsMessageRecord) messageRecord).isEditMessage()) { + long timestamp = messageRecord.getTimestamp(); + if (messageRecord.isEditMessage()) { + if (displayMode == ConversationItemDisplayMode.EDIT_HISTORY) { + timestamp = messageRecord.getDateSent(); + } + } + String date = DateUtils.getSimpleRelativeTimeSpanString(getContext(), locale, timestamp); + if (displayMode != ConversationItemDisplayMode.DETAILED && messageRecord.isEditMessage()) { date = getContext().getString(R.string.ConversationItem_edited_timestamp_footer, date); } dateView.setText(date); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java index f5d92e025a..7e92092d99 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java @@ -337,6 +337,8 @@ public class ConversationAdapter if (scheduledMessagesMode) { calendar.setTimeInMillis(((MediaMmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate()); + } else if (condensedMode == ConversationItemDisplayMode.EDIT_HISTORY) { + calendar.setTimeInMillis(conversationMessage.getMessageRecord().getDateSent()); } else { calendar.setTimeInMillis(conversationMessage.getConversationTimestamp()); } @@ -355,6 +357,8 @@ public class ConversationAdapter if (scheduledMessagesMode) { viewHolder.setText(DateUtils.getScheduledMessagesDateHeaderString(viewHolder.itemView.getContext(), locale, ((MediaMmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate())); + } else if (condensedMode == ConversationItemDisplayMode.EDIT_HISTORY) { + viewHolder.setText(DateUtils.getConversationDateHeaderString(viewHolder.itemView.getContext(), locale, conversationMessage.getMessageRecord().getDateSent())); } else { viewHolder.setText(DateUtils.getConversationDateHeaderString(viewHolder.itemView.getContext(), locale, conversationMessage.getConversationTimestamp())); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 815f7b1dd8..666f10580b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -1756,7 +1756,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo } private void setHasBeenQuoted(@NonNull ConversationMessage message) { - if (message.hasBeenQuoted() && !isCondensedMode() && quotedIndicator != null && batchSelected.isEmpty() && displayMode != ConversationItemDisplayMode.EXTRA_CONDENSED) { + if (message.hasBeenQuoted() && !isCondensedMode() && quotedIndicator != null && batchSelected.isEmpty() && displayMode != ConversationItemDisplayMode.EDIT_HISTORY) { quotedIndicator.setVisibility(VISIBLE); quotedIndicator.setOnClickListener(quotedIndicatorClickListener); } else if (quotedIndicator != null) { @@ -1883,7 +1883,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo int background; - if (isSingularMessage(current, previous, next, isGroupThread) || displayMode == ConversationItemDisplayMode.EXTRA_CONDENSED) { + if (isSingularMessage(current, previous, next, isGroupThread) || displayMode == ConversationItemDisplayMode.EDIT_HISTORY) { if (current.isOutgoing()) { background = R.drawable.message_bubble_background_sent_alone; outliner.setRadius(bigRadius); @@ -1979,11 +1979,11 @@ public final class ConversationItem extends RelativeLayout implements BindableCo int spacingTop = readDimen(context, R.dimen.conversation_vertical_message_spacing_collapse); int spacingBottom = spacingTop; - if (isStartOfMessageCluster(current, previous, isGroupThread) && (displayMode != ConversationItemDisplayMode.EXTRA_CONDENSED || next.isEmpty())) { + if (isStartOfMessageCluster(current, previous, isGroupThread) && (displayMode != ConversationItemDisplayMode.EDIT_HISTORY || next.isEmpty())) { spacingTop = readDimen(context, R.dimen.conversation_vertical_message_spacing_default); } - if (isEndOfMessageCluster(current, next, isGroupThread) || displayMode == ConversationItemDisplayMode.EXTRA_CONDENSED) { + if (isEndOfMessageCluster(current, next, isGroupThread) || displayMode == ConversationItemDisplayMode.EDIT_HISTORY) { spacingBottom = readDimen(context, R.dimen.conversation_vertical_message_spacing_default); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemDisplayMode.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemDisplayMode.kt index a4de38c704..5a8852f173 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemDisplayMode.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemDisplayMode.kt @@ -8,7 +8,7 @@ enum class ConversationItemDisplayMode { CONDENSED, /** Smaller bubbles, always singular bubbles, with a footer. Used for edit message history. */ - EXTRA_CONDENSED, + EDIT_HISTORY, /** Less length restrictions. Used to show more info in message details. */ DETAILED; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt index 891df9dafb..cea4e8cac6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt @@ -1,13 +1,17 @@ package org.thoughtcrime.securesms.conversation.ui.edit +import android.app.Dialog import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.os.bundleOf +import androidx.core.view.doOnNextLayout import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.core.util.concurrent.LifecycleDisposable import org.thoughtcrime.securesms.R @@ -35,6 +39,7 @@ import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.BottomSheetUtil +import org.thoughtcrime.securesms.util.StickyHeaderDecoration import org.thoughtcrime.securesms.util.ViewModelFactory import org.thoughtcrime.securesms.util.fragments.requireListener import java.util.Locale @@ -44,8 +49,6 @@ import java.util.Locale */ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { - override val peekHeightPercentage: Float = 0.4f - private val binding: MessageEditHistoryBottomSheetBinding by ViewBinderDelegate(MessageEditHistoryBottomSheetBinding::bind) private val originalMessageId: Long by lazy { requireArguments().getLong(ARGUMENT_ORIGINAL_MESSAGE_ID) } private val conversationRecipient: Recipient by lazy { Recipient.resolved(requireArguments().getParcelable(ARGUMENT_CONVERSATION_RECIPIENT_ID)!!) } @@ -53,10 +56,17 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { private val disposables: LifecycleDisposable = LifecycleDisposable() + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.skipCollapsed = true + dialog.setOnShowListener { + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + } + return dialog + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - val view = MessageEditHistoryBottomSheetBinding.inflate(inflater, container, false).root - view.minimumHeight = (resources.displayMetrics.heightPixels * peekHeightPercentage).toInt() - return view + return MessageEditHistoryBottomSheetBinding.inflate(inflater, container, false).root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -74,7 +84,7 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { conversationRecipient.hasWallpaper(), colorizer ).apply { - setCondensedMode(ConversationItemDisplayMode.EXTRA_CONDENSED) + setCondensedMode(ConversationItemDisplayMode.EDIT_HISTORY) } binding.editHistoryList.apply { @@ -82,6 +92,10 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { adapter = messageAdapter itemAnimator = null addItemDecoration(OriginalMessageSeparatorDecoration(context, R.string.EditMessageHistoryDialog_title)) + doOnNextLayout { + // Adding this without waiting for a layout pass would result in an indeterminate amount of padding added to the top of the view + addItemDecoration(StickyHeaderDecoration(messageAdapter, false, false, ConversationAdapter.HEADER_TYPE_INLINE_DATE)) + } } val recyclerViewColorizer = RecyclerViewColorizer(binding.editHistoryList)