Small tweaks for footer positioning.
This commit is contained in:
parent
dc37d1f029
commit
e1e3d7a85b
4 changed files with 33 additions and 24 deletions
|
@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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 -->
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue