diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge.kt index ee3e88a489..765c7ea0c8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge.kt @@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.conversation.v2.items import android.view.View import android.view.ViewGroup +import android.widget.Space import android.widget.TextView import com.google.android.material.imageview.ShapeableImageView import org.thoughtcrime.securesms.badges.BadgeImageView @@ -38,6 +39,7 @@ data class V2ConversationItemTextOnlyBindingBridge( val conversationItemFooterDate: TextView, val conversationItemFooterExpiry: ExpirationTimerView, val conversationItemFooterBackground: View, + val conversationItemFooterSpace: Space?, val conversationItemAlert: AlertView?, val isIncoming: Boolean ) @@ -60,6 +62,7 @@ fun V2ConversationItemTextOnlyIncomingBinding.bridge(): V2ConversationItemTextOn conversationItemFooterExpiry = conversationItemExpirationTimer, conversationItemFooterBackground = conversationItemFooterBackground, conversationItemAlert = null, + conversationItemFooterSpace = null, isIncoming = false ) } @@ -82,6 +85,7 @@ fun V2ConversationItemTextOnlyOutgoingBinding.bridge(): V2ConversationItemTextOn conversationItemFooterExpiry = conversationItemExpirationTimer, conversationItemFooterBackground = conversationItemFooterBackground, conversationItemAlert = conversationItemAlert, + conversationItemFooterSpace = footerEndPad, isIncoming = false ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate.kt index fbfeaa01b6..b971666edf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate.kt @@ -9,8 +9,10 @@ import android.view.View import org.signal.core.util.dp import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.emoji.EmojiTextView +import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.padding import org.thoughtcrime.securesms.util.visible +import kotlin.math.max /** * Logical delegate for determining the footer position for a particular conversation item. @@ -26,7 +28,12 @@ class V2FooterPositionDelegate private constructor( constructor(binding: V2ConversationItemTextOnlyBindingBridge) : this( binding.isIncoming, binding.root, - listOfNotNull(binding.conversationItemFooterDate, binding.conversationItemDeliveryStatus, binding.conversationItemFooterExpiry), + listOfNotNull( + binding.conversationItemFooterDate, + binding.conversationItemDeliveryStatus, + binding.conversationItemFooterExpiry, + binding.conversationItemFooterSpace + ), binding.conversationItemBodyWrapper, binding.conversationItemBody ) @@ -43,7 +50,7 @@ class V2FooterPositionDelegate private constructor( override fun onPostMeasure(): Boolean { val maxWidth = root.measuredWidth - gutters val lastLineWidth = body.lastLineWidth - val footerWidth = footerViews.sumOf { it.measuredWidth } + val footerWidth = getFooterWidth() if (footerViews.all { !it.visible }) { return false @@ -74,10 +81,6 @@ class V2FooterPositionDelegate private constructor( return } - footerViews.forEach { - it.translationY = 0f - } - bodyContainer.padding(right = 0, left = 0, bottom = footerViews.first().measuredHeight) displayState = DisplayState.UNDERNEATH } @@ -87,11 +90,8 @@ class V2FooterPositionDelegate private constructor( return } - footerViews.forEach { - it.translationY = 0f - } - - val end = footerViews.sumOf { it.measuredWidth } + if (isIncoming) 4.dp else 8.dp + val targetWidth = body.measuredWidth + getFooterWidth() + val end = max(0, targetWidth - bodyContainer.measuredWidth) - 8.dp val (left, right) = if (bodyContainer.layoutDirection == View.LAYOUT_DIRECTION_LTR) { 0 to end } else { @@ -107,14 +107,14 @@ class V2FooterPositionDelegate private constructor( return } - footerViews.forEach { - it.translationY = 0f - } - bodyContainer.padding(right = 0, left = 0, bottom = 0) displayState = DisplayState.TUCKED } + private fun getFooterWidth(): Int { + return footerViews.sumOf { it.measuredWidth + ViewUtil.getLeftMargin(it) + ViewUtil.getRightMargin(it) } + } + private enum class DisplayState { NONE, UNDERNEATH, diff --git a/app/src/main/res/layout/v2_conversation_item_text_only_incoming.xml b/app/src/main/res/layout/v2_conversation_item_text_only_incoming.xml index 35b0cfc9b1..2626a97ca3 100644 --- a/app/src/main/res/layout/v2_conversation_item_text_only_incoming.xml +++ b/app/src/main/res/layout/v2_conversation_item_text_only_incoming.xml @@ -126,8 +126,7 @@ style="@style/Signal.Text.Caption.MessageSent" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginEnd="@dimen/message_bubble_horizontal_padding" + android:layout_marginEnd="4dp" android:autoLink="none" android:ellipsize="end" android:linksClickable="false" @@ -136,12 +135,14 @@ android:textColor="@color/signal_text_secondary" app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper" app:layout_constraintEnd_toStartOf="@id/conversation_item_expiration_timer" + app:layout_goneMarginEnd="@dimen/message_bubble_horizontal_padding" tools:text="13:14pm" /> + app:layout_constraintEnd_toStartOf="@id/conversation_item_delivery_status" /> + app:layout_constraintEnd_toStartOf="@id/footer_end_pad" /> + +