Small tweaks for footer positioning.

This commit is contained in:
Alex Hart 2023-06-29 15:15:55 -03:00 committed by Greyson Parrelli
parent dc37d1f029
commit e1e3d7a85b
4 changed files with 33 additions and 24 deletions

View file

@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.conversation.v2.items
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Space
import android.widget.TextView import android.widget.TextView
import com.google.android.material.imageview.ShapeableImageView import com.google.android.material.imageview.ShapeableImageView
import org.thoughtcrime.securesms.badges.BadgeImageView import org.thoughtcrime.securesms.badges.BadgeImageView
@ -38,6 +39,7 @@ data class V2ConversationItemTextOnlyBindingBridge(
val conversationItemFooterDate: TextView, val conversationItemFooterDate: TextView,
val conversationItemFooterExpiry: ExpirationTimerView, val conversationItemFooterExpiry: ExpirationTimerView,
val conversationItemFooterBackground: View, val conversationItemFooterBackground: View,
val conversationItemFooterSpace: Space?,
val conversationItemAlert: AlertView?, val conversationItemAlert: AlertView?,
val isIncoming: Boolean val isIncoming: Boolean
) )
@ -60,6 +62,7 @@ fun V2ConversationItemTextOnlyIncomingBinding.bridge(): V2ConversationItemTextOn
conversationItemFooterExpiry = conversationItemExpirationTimer, conversationItemFooterExpiry = conversationItemExpirationTimer,
conversationItemFooterBackground = conversationItemFooterBackground, conversationItemFooterBackground = conversationItemFooterBackground,
conversationItemAlert = null, conversationItemAlert = null,
conversationItemFooterSpace = null,
isIncoming = false isIncoming = false
) )
} }
@ -82,6 +85,7 @@ fun V2ConversationItemTextOnlyOutgoingBinding.bridge(): V2ConversationItemTextOn
conversationItemFooterExpiry = conversationItemExpirationTimer, conversationItemFooterExpiry = conversationItemExpirationTimer,
conversationItemFooterBackground = conversationItemFooterBackground, conversationItemFooterBackground = conversationItemFooterBackground,
conversationItemAlert = conversationItemAlert, conversationItemAlert = conversationItemAlert,
conversationItemFooterSpace = footerEndPad,
isIncoming = false isIncoming = false
) )
} }

View file

@ -9,8 +9,10 @@ import android.view.View
import org.signal.core.util.dp import org.signal.core.util.dp
import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.emoji.EmojiTextView import org.thoughtcrime.securesms.components.emoji.EmojiTextView
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.padding import org.thoughtcrime.securesms.util.padding
import org.thoughtcrime.securesms.util.visible import org.thoughtcrime.securesms.util.visible
import kotlin.math.max
/** /**
* Logical delegate for determining the footer position for a particular conversation item. * Logical delegate for determining the footer position for a particular conversation item.
@ -26,7 +28,12 @@ class V2FooterPositionDelegate private constructor(
constructor(binding: V2ConversationItemTextOnlyBindingBridge) : this( constructor(binding: V2ConversationItemTextOnlyBindingBridge) : this(
binding.isIncoming, binding.isIncoming,
binding.root, binding.root,
listOfNotNull(binding.conversationItemFooterDate, binding.conversationItemDeliveryStatus, binding.conversationItemFooterExpiry), listOfNotNull(
binding.conversationItemFooterDate,
binding.conversationItemDeliveryStatus,
binding.conversationItemFooterExpiry,
binding.conversationItemFooterSpace
),
binding.conversationItemBodyWrapper, binding.conversationItemBodyWrapper,
binding.conversationItemBody binding.conversationItemBody
) )
@ -43,7 +50,7 @@ class V2FooterPositionDelegate private constructor(
override fun onPostMeasure(): Boolean { override fun onPostMeasure(): Boolean {
val maxWidth = root.measuredWidth - gutters val maxWidth = root.measuredWidth - gutters
val lastLineWidth = body.lastLineWidth val lastLineWidth = body.lastLineWidth
val footerWidth = footerViews.sumOf { it.measuredWidth } val footerWidth = getFooterWidth()
if (footerViews.all { !it.visible }) { if (footerViews.all { !it.visible }) {
return false return false
@ -74,10 +81,6 @@ class V2FooterPositionDelegate private constructor(
return return
} }
footerViews.forEach {
it.translationY = 0f
}
bodyContainer.padding(right = 0, left = 0, bottom = footerViews.first().measuredHeight) bodyContainer.padding(right = 0, left = 0, bottom = footerViews.first().measuredHeight)
displayState = DisplayState.UNDERNEATH displayState = DisplayState.UNDERNEATH
} }
@ -87,11 +90,8 @@ class V2FooterPositionDelegate private constructor(
return return
} }
footerViews.forEach { val targetWidth = body.measuredWidth + getFooterWidth()
it.translationY = 0f val end = max(0, targetWidth - bodyContainer.measuredWidth) - 8.dp
}
val end = footerViews.sumOf { it.measuredWidth } + if (isIncoming) 4.dp else 8.dp
val (left, right) = if (bodyContainer.layoutDirection == View.LAYOUT_DIRECTION_LTR) { val (left, right) = if (bodyContainer.layoutDirection == View.LAYOUT_DIRECTION_LTR) {
0 to end 0 to end
} else { } else {
@ -107,14 +107,14 @@ class V2FooterPositionDelegate private constructor(
return return
} }
footerViews.forEach {
it.translationY = 0f
}
bodyContainer.padding(right = 0, left = 0, bottom = 0) bodyContainer.padding(right = 0, left = 0, bottom = 0)
displayState = DisplayState.TUCKED displayState = DisplayState.TUCKED
} }
private fun getFooterWidth(): Int {
return footerViews.sumOf { it.measuredWidth + ViewUtil.getLeftMargin(it) + ViewUtil.getRightMargin(it) }
}
private enum class DisplayState { private enum class DisplayState {
NONE, NONE,
UNDERNEATH, UNDERNEATH,

View file

@ -126,8 +126,7 @@
style="@style/Signal.Text.Caption.MessageSent" style="@style/Signal.Text.Caption.MessageSent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginEnd="4dp"
android:layout_marginEnd="@dimen/message_bubble_horizontal_padding"
android:autoLink="none" android:autoLink="none"
android:ellipsize="end" android:ellipsize="end"
android:linksClickable="false" android:linksClickable="false"
@ -136,12 +135,14 @@
android:textColor="@color/signal_text_secondary" android:textColor="@color/signal_text_secondary"
app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper" app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper"
app:layout_constraintEnd_toStartOf="@id/conversation_item_expiration_timer" app:layout_constraintEnd_toStartOf="@id/conversation_item_expiration_timer"
app:layout_goneMarginEnd="@dimen/message_bubble_horizontal_padding"
tools:text="13:14pm" /> tools:text="13:14pm" />
<org.thoughtcrime.securesms.components.ExpirationTimerView <org.thoughtcrime.securesms.components.ExpirationTimerView
android:id="@+id/conversation_item_expiration_timer" android:id="@+id/conversation_item_expiration_timer"
android:layout_width="12dp" android:layout_width="12dp"
android:layout_height="12dp" android:layout_height="12dp"
android:layout_marginEnd="@dimen/message_bubble_horizontal_padding"
android:layout_marginBottom="@dimen/message_bubble_bottom_padding" android:layout_marginBottom="@dimen/message_bubble_bottom_padding"
app:layout_constraintBottom_toBottomOf="@id/conversation_item_footer_date" app:layout_constraintBottom_toBottomOf="@id/conversation_item_footer_date"
app:layout_constraintEnd_toEndOf="@id/conversation_item_body_wrapper" app:layout_constraintEnd_toEndOf="@id/conversation_item_body_wrapper"

View file

@ -114,8 +114,7 @@
android:paddingBottom="@dimen/message_bubble_bottom_padding" android:paddingBottom="@dimen/message_bubble_bottom_padding"
android:textColor="@color/signal_text_secondary" android:textColor="@color/signal_text_secondary"
app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper" app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper"
app:layout_constraintEnd_toStartOf="@id/conversation_item_delivery_status" app:layout_constraintEnd_toStartOf="@id/conversation_item_expiration_timer"
app:layout_goneMarginEnd="@dimen/message_bubble_horizontal_padding"
tools:text="13:14pm" /> tools:text="13:14pm" />
<org.thoughtcrime.securesms.components.ExpirationTimerView <org.thoughtcrime.securesms.components.ExpirationTimerView
@ -123,20 +122,25 @@
android:layout_width="12dp" android:layout_width="12dp"
android:layout_height="12dp" android:layout_height="12dp"
android:layout_marginBottom="@dimen/message_bubble_bottom_padding" android:layout_marginBottom="@dimen/message_bubble_bottom_padding"
android:layout_marginEnd="4dp"
app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper" app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper"
app:layout_constraintEnd_toStartOf="@id/conversation_item_delivery_status" app:layout_constraintEnd_toStartOf="@id/conversation_item_delivery_status" />
app:layout_constraintStart_toEndOf="@id/conversation_item_footer_date"
app:layout_goneMarginEnd="@dimen/message_bubble_horizontal_padding" />
<org.thoughtcrime.securesms.components.DeliveryStatusView <org.thoughtcrime.securesms.components.DeliveryStatusView
android:id="@+id/conversation_item_delivery_status" android:id="@+id/conversation_item_delivery_status"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/message_bubble_horizontal_padding"
android:paddingBottom="@dimen/message_bubble_bottom_padding" android:paddingBottom="@dimen/message_bubble_bottom_padding"
app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper" app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper"
app:layout_constraintEnd_toEndOf="@id/conversation_item_body_wrapper" /> app:layout_constraintEnd_toStartOf="@id/footer_end_pad" />
<Space
android:id="@+id/footer_end_pad"
app:layout_constraintBottom_toBottomOf="@id/conversation_item_body_wrapper"
app:layout_constraintEnd_toEndOf="@id/conversation_item_body_wrapper"
android:layout_width="@dimen/message_bubble_horizontal_padding"
android:layout_height="@dimen/message_bubble_horizontal_padding" />
<!-- End Footer --> <!-- End Footer -->