diff --git a/library/ui-styles/src/main/res/values/dimens.xml b/library/ui-styles/src/main/res/values/dimens.xml index 9a3929094a..c8f1ec5c86 100644 --- a/library/ui-styles/src/main/res/values/dimens.xml +++ b/library/ui-styles/src/main/res/values/dimens.xml @@ -61,7 +61,8 @@ 300dp 12dp - 30dp + 28dp + 40dp 0.05 diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt index 2bd2257cf7..59b39d17ef 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt @@ -50,7 +50,7 @@ import javax.inject.Inject class MessageInformationDataFactory @Inject constructor(private val session: Session, private val dateFormatter: VectorDateFormatter, private val messageLayoutFactory: TimelineMessageLayoutFactory, - private val reactionListFactory: ReactionsSummaryFactory) { + private val reactionsSummaryFactory: ReactionsSummaryFactory) { fun create(params: TimelineItemFactoryParams): MessageInformationData { val event = params.event @@ -93,7 +93,7 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses avatarUrl = event.senderInfo.avatarUrl, memberName = event.senderInfo.disambiguatedDisplayName, messageLayout = messageLayout, - reactionsSummary = reactionListFactory.create(event, params.callback), + reactionsSummary = reactionsSummaryFactory.create(event, params.callback), pollResponseAggregatedSummary = event.annotations?.pollResponseSummary?.let { PollResponseData( myVote = it.aggregatedContent?.myVote, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt index 6d0714e929..07fa4192c8 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt @@ -17,7 +17,6 @@ package im.vector.app.features.home.room.detail.timeline.item import android.annotation.SuppressLint -import android.content.Context import android.view.Gravity import android.view.View import android.view.ViewGroup @@ -30,6 +29,7 @@ import im.vector.app.R import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.onClick import im.vector.app.core.ui.views.ShieldImageView +import im.vector.app.core.utils.DimensionConverter import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.MessageColorProvider import im.vector.app.features.home.room.detail.timeline.TimelineEventController @@ -38,6 +38,9 @@ import im.vector.app.features.reactions.widget.ReactionButton import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel import org.matrix.android.sdk.api.session.room.send.SendState + +private const val MAX_REACTIONS_TO_SHOW = 8 + /** * Base timeline item with reactions and read receipts. * Manages associated click listeners and send status. @@ -99,7 +102,7 @@ abstract class AbsBaseMessageItem : BaseEventItem val reactionsToShow = if (reactionsSummary.showAll) { reactions } else { - reactions.take(8) + reactions.take(MAX_REACTIONS_TO_SHOW) } reactionsToShow.forEach { reaction -> val reactionButton = ReactionButton(holder.view.context) @@ -111,19 +114,19 @@ abstract class AbsBaseMessageItem : BaseEventItem reactionButton.isEnabled = reaction.synced holder.reactionsContainer.addView(reactionButton) } - if (reactions.count() > 8) { - val showReactionsTextView = createReactionTextView(holder.view.context) + if (reactions.count() > MAX_REACTIONS_TO_SHOW) { + val showReactionsTextView = createReactionTextView(holder, 6) if (reactionsSummary.showAll) { showReactionsTextView.setText(R.string.message_reaction_show_less) showReactionsTextView.onClick { reactionsSummary.onShowLessClicked() } } else { - val moreCount = reactions.count() - 8 + val moreCount = reactions.count() - MAX_REACTIONS_TO_SHOW showReactionsTextView.text = holder.view.resources.getString(R.string.message_reaction_show_more, moreCount) showReactionsTextView.onClick { reactionsSummary.onShowMoreClicked() } } holder.reactionsContainer.addView(showReactionsTextView) } - val addMoreReactionsTextView = createReactionTextView(holder.view.context) + val addMoreReactionsTextView = createReactionTextView(holder, 14) addMoreReactionsTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_add_reaction_small, 0, 0, 0) addMoreReactionsTextView.onClick { reactionsSummary.onAddMoreClicked() } holder.reactionsContainer.addView(addMoreReactionsTextView) @@ -131,13 +134,14 @@ abstract class AbsBaseMessageItem : BaseEventItem } } - private fun createReactionTextView(context: Context): TextView { - return TextView(context).apply { + private fun createReactionTextView(holder: H, horizontalPaddingDp: Int): TextView { + return TextView(holder.view.context).apply { textSize = 10f gravity = Gravity.CENTER minimumHeight = resources.getDimensionPixelSize(R.dimen.chat_reaction_min_height) + minimumWidth = resources.getDimensionPixelSize(R.dimen.chat_reaction_min_width) background = getDrawable(context, R.drawable.reaction_rounded_rect_shape_off) - val padding = resources.getDimensionPixelSize(R.dimen.layout_horizontal_margin) + val padding = holder.dimensionConverter.dpToPx(horizontalPaddingDp) setPadding(padding, 0, padding, 0) } } @@ -155,6 +159,9 @@ abstract class AbsBaseMessageItem : BaseEventItem } abstract class Holder(@IdRes stubId: Int) : BaseEventItem.BaseHolder(stubId) { + val dimensionConverter by lazy { + DimensionConverter(view.resources) + } val reactionsContainer by bind(R.id.reactionsContainer) val e2EDecorationView by bind(R.id.messageE2EDecoration) } diff --git a/vector/src/main/java/im/vector/app/features/reactions/widget/ReactionButton.kt b/vector/src/main/java/im/vector/app/features/reactions/widget/ReactionButton.kt index d307e1fd16..5553c1faab 100644 --- a/vector/src/main/java/im/vector/app/features/reactions/widget/ReactionButton.kt +++ b/vector/src/main/java/im/vector/app/features/reactions/widget/ReactionButton.kt @@ -69,6 +69,7 @@ class ReactionButton @JvmOverloads constructor(context: Context, inflate(context, R.layout.reaction_button, this) orientation = HORIZONTAL minimumHeight = resources.getDimensionPixelSize(R.dimen.chat_reaction_min_height) + minimumWidth = resources.getDimensionPixelSize(R.dimen.chat_reaction_min_width) gravity = Gravity.CENTER layoutDirection = View.LAYOUT_DIRECTION_LOCALE views = ReactionButtonBinding.bind(this) diff --git a/vector/src/main/res/drawable/reaction_divider.xml b/vector/src/main/res/drawable/reaction_divider.xml index d68b6a9094..1d7ee57084 100644 --- a/vector/src/main/res/drawable/reaction_divider.xml +++ b/vector/src/main/res/drawable/reaction_divider.xml @@ -2,7 +2,7 @@ + android:width="4dp" + android:height="4dp" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/reaction_button.xml b/vector/src/main/res/layout/reaction_button.xml index a6d84407ce..f0a8011220 100644 --- a/vector/src/main/res/layout/reaction_button.xml +++ b/vector/src/main/res/layout/reaction_button.xml @@ -3,11 +3,11 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" - android:layout_height="26dp" + android:layout_height="@dimen/chat_reaction_min_height" android:background="@drawable/reaction_rounded_rect_shape" android:clipChildren="false" android:gravity="center" - android:minWidth="44dp" + android:minWidth="@dimen/chat_reaction_min_width" tools:parentTag="android.widget.LinearLayout"> @@ -20,12 +20,11 @@ android:id="@+id/reactionText" style="@style/Widget.Vector.TextView.Caption" android:layout_width="wrap_content" - android:layout_height="20dp" + android:layout_height="wrap_content" android:layout_marginStart="6dp" android:ellipsize="middle" android:gravity="center" android:maxEms="10" - android:minWidth="20dp" android:singleLine="true" android:textColor="@color/emoji_color" tools:text="* Party Parrot Again * 👀" /> @@ -36,7 +35,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="2dp" - android:layout_marginEnd="8dp" + android:layout_marginEnd="6dp" android:gravity="center" android:maxLines="1" android:textColor="?vctr_content_secondary"