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" />
+
+