Skip to content

Commit

Permalink
Update bind layout
Browse files Browse the repository at this point in the history
  • Loading branch information
SeniorZhai committed Aug 9, 2024
1 parent 13ab03f commit bdd1e60
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 117 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,24 +44,7 @@ open class ShareAppActionsCardRenderer(val context: Context, containerWidth: Int
actionCard: AppCardData,
isNightMode: Boolean,
) {
// binding.chatContentLayout.setContent {
// AppCard(
// actionCard,
// contentClick = {
// },
// contentLongClick = {
// },
// urlClick = { _ ->
// },
// urlLongClick = { _ ->
// },
// width = width, createdAt = nowInUtc(), isLast = true, isMe = true,
// status = MessageStatus.DELIVERED.name,
// isPin = false,
// isRepresentative = false,
// isSecret = false,
// )
// }
binding.chatContentLayout.setData(actionCard, true, isMe = true, createdAt = nowInUtc(),status = MessageStatus.DELIVERED.name, isPin = false, isRepresentative = false, isSecret = false, onItemListener = null, textGestureListener = null)
if (!actionCard.actions.isNullOrEmpty()) {
binding.chatGroupLayout.isVisible = true
for (b in actionCard.actions) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@ package one.mixin.android.ui.conversation.chathistory

import android.graphics.Color
import android.graphics.Typeface
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup.MarginLayoutParams
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import one.mixin.android.R
import one.mixin.android.databinding.ItemChatActionsCardBinding
import one.mixin.android.extension.doubleClickVibrate
import one.mixin.android.extension.dp
import one.mixin.android.extension.heavyClickVibrate
import one.mixin.android.extension.maxCardWidth
Expand All @@ -18,6 +21,7 @@ import one.mixin.android.util.GsonHelper
import one.mixin.android.vo.AppCardData
import one.mixin.android.vo.ChatHistoryMessageItem
import one.mixin.android.vo.MessageStatus
import one.mixin.android.vo.isSecret
import one.mixin.android.widget.ActionButton

class ActionsCardHolder(val binding: ItemChatActionsCardBinding) :
Expand Down Expand Up @@ -53,31 +57,9 @@ class ActionsCardHolder(val binding: ItemChatActionsCardBinding) :
} else {
binding.chatName.visibility = View.GONE
}
val actionCard =
GsonHelper.customGson.fromJson(messageItem.content, AppCardData::class.java)
// binding.chatContentLayout.setContent {
// AppCard(
// actionCard,
// contentClick = {
//
// },
// contentLongClick = {
// itemView.context.heavyClickVibrate()
// onItemListener.onMenu(binding.chatJump, messageItem)
// },
// urlClick = { url ->
// onItemListener.onUrlClick(url)
// },
// urlLongClick = { url ->
// onItemListener.onUrlLongClick(url)
// },
// width = null, createdAt = messageItem.createdAt, isLast, isMe,
// MessageStatus.DELIVERED.name,
// false,
// isRepresentative = false,
// isSecret = false,
// )
// }
val actionCard = messageItem.appCardData?:return
binding.chatContentLayout.setData(actionCard, isLast, isMe, messageItem.createdAt, MessageStatus.DELIVERED.name, isPin = false, isRepresentative = false, isSecret = false, onItemListener = onItemListener, textGestureListener = textGestureListener)

binding.chatGroupLayout.removeAllViews()
if (!actionCard.actions.isNullOrEmpty()) {
binding.chatGroupLayout.isVisible = true
Expand Down Expand Up @@ -138,8 +120,8 @@ class ActionsCardHolder(val binding: ItemChatActionsCardBinding) :
)
}
(binding.chatLayout.layoutParams as ConstraintLayout.LayoutParams).horizontalBias = 1f
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginStart = 8.dp
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginEnd = 12.dp
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginStart = 6.dp
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginEnd = 8.dp
} else {
(binding.chatLayout.layoutParams as ConstraintLayout.LayoutParams).horizontalBias = 0f
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginStart = 12.dp
Expand All @@ -159,4 +141,32 @@ class ActionsCardHolder(val binding: ItemChatActionsCardBinding) :
}
}
}

private var textGestureListener: TextGestureListener? = null

class TextGestureListener(
var view: View,
var messageItem: ChatHistoryMessageItem,
var onItemListener: ChatHistoryAdapter.OnItemListener,
var absoluteAdapterPosition: Int = 0,
) : GestureDetector.SimpleOnGestureListener() {
var longPressed = false

override fun onDoubleTap(e: MotionEvent): Boolean {
view.context.doubleClickVibrate()
onItemListener.onTextDoubleClick(messageItem)
return true
}

override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
return true
}

override fun onLongPress(e: MotionEvent) {
if (longPressed) {
longPressed = false
return
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,36 +84,8 @@ class ActionsCardHolder(val binding: ItemChatActionsCardBinding) :
binding.chatName.visibility = View.GONE
}
val actionCard = messageItem.appCardData?:return
val contentClick = {
if (hasSelect) {
onItemListener.onSelect(!isSelect, messageItem, absoluteAdapterPosition)
}
}
binding.chatContentLayout.setData(actionCard, isMe, isLast,onItemListener, textGestureListener)
// AppCard(
// actionCard,
// contentClick = contentClick,
// contentLongClick = {
// if (!hasSelect) {
// itemView.context.heavyClickVibrate()
// onItemListener.onLongClick(messageItem, absoluteAdapterPosition)
// } else {
// onItemListener.onSelect(!isSelect, messageItem, absoluteAdapterPosition)
// }
// },
// urlClick = { url ->
// onItemListener.onUrlClick(url)
// },
// urlLongClick = { url ->
// onItemListener.onUrlLongClick(url)
// },
// width = null, createdAt = messageItem.createdAt, isLast, isMe,
// messageItem.status,
// messageItem.isPin ?: false,
// isRepresentative = isRepresentative,
// isSecret = messageItem.isSecret(),
// )
// }
binding.chatContentLayout.setData(actionCard, isLast, isMe, messageItem.createdAt, messageItem.status, messageItem.isPin ?: false, isRepresentative, messageItem.isSecret(), onItemListener, textGestureListener)

binding.chatGroupLayout.removeAllViews()
if (!actionCard.actions.isNullOrEmpty()) {
binding.chatGroupLayout.isVisible = true
Expand Down Expand Up @@ -187,7 +159,7 @@ class ActionsCardHolder(val binding: ItemChatActionsCardBinding) :
}
(binding.chatLayout.layoutParams as ConstraintLayout.LayoutParams).horizontalBias = 1f
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginStart = 6.dp
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginEnd = 14.dp
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginEnd = 8.dp
} else {
(binding.chatLayout.layoutParams as ConstraintLayout.LayoutParams).horizontalBias = 0f
(binding.chatGroupLayout.layoutParams as MarginLayoutParams).marginStart = 12.dp
Expand Down
107 changes: 93 additions & 14 deletions app/src/main/java/one/mixin/android/widget/AppCardLayout.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import androidx.core.view.marginEnd
import androidx.core.view.updateLayoutParams
import one.mixin.android.Constants
import one.mixin.android.Constants.Colors.LINK_COLOR
Expand All @@ -23,8 +25,10 @@ import one.mixin.android.extension.dp
import one.mixin.android.extension.loadImage
import one.mixin.android.extension.roundTopOrBottom
import one.mixin.android.ui.conversation.adapter.MessageAdapter
import one.mixin.android.ui.conversation.chathistory.ChatHistoryAdapter
import one.mixin.android.ui.conversation.holder.ActionsCardHolder
import one.mixin.android.vo.MessageItem
import one.mixin.android.vo.isSecret
import one.mixin.android.widget.linktext.AutoLinkMode
import timber.log.Timber
import kotlin.math.max
Expand All @@ -50,7 +54,89 @@ class AppCardLayout(context: Context, attrs: AttributeSet) : ConstraintLayout(co
}
}

fun setData(appCardData: AppCardData, isMe:Boolean, isLast:Boolean,onItemListener:MessageAdapter.OnItemListener, textGestureListener: ActionsCardHolder.TextGestureListener?) {
fun setData(
appCardData: AppCardData, isLast: Boolean, isMe: Boolean, createdAt: String, status: String, isPin: Boolean,
isRepresentative: Boolean, isSecret: Boolean, onItemListener: MessageAdapter.OnItemListener?, textGestureListener: ActionsCardHolder.TextGestureListener?
) {
bind(appCardData, isLast, isMe, createdAt, status, isPin, isRepresentative, isSecret)
if (onItemListener == null){
(binding.chatTime.layoutParams as MarginLayoutParams).apply {
marginEnd = 4.dp
}
}
binding.content.setAutoLinkOnClickListener { autoLinkMode, matchedText ->
when (autoLinkMode) {
AutoLinkMode.MODE_URL -> {
onItemListener?.onUrlClick(matchedText)
}
AutoLinkMode.MODE_MENTION, AutoLinkMode.MODE_BOT -> {
onItemListener?.onMentionClick(matchedText)
}
AutoLinkMode.MODE_PHONE -> {
onItemListener?.onPhoneClick(matchedText)
}
AutoLinkMode.MODE_EMAIL -> {
onItemListener?.onEmailClick(matchedText)
}
else -> {
}
}
}
binding.content.setAutoLinkOnLongClickListener { autoLinkMode, matchedText ->
textGestureListener?.longPressed = true

when (autoLinkMode) {
AutoLinkMode.MODE_URL -> {
onItemListener?.onUrlLongClick(matchedText)
}

else -> {
}
}
}
}

fun setData(
appCardData: AppCardData, isLast: Boolean, isMe: Boolean, createdAt: String, status: String, isPin: Boolean,
isRepresentative: Boolean, isSecret: Boolean, onItemListener: ChatHistoryAdapter.OnItemListener, textGestureListener: one.mixin.android.ui.conversation.chathistory.ActionsCardHolder.TextGestureListener?
) {
bind(appCardData, isLast, isMe, createdAt, status, isPin, isRepresentative, isSecret)
binding.content.setAutoLinkOnClickListener { autoLinkMode, matchedText ->
when (autoLinkMode) {
AutoLinkMode.MODE_URL -> {
onItemListener.onUrlClick(matchedText)
}
AutoLinkMode.MODE_MENTION, AutoLinkMode.MODE_BOT -> {
onItemListener.onMentionClick(matchedText)
}
AutoLinkMode.MODE_PHONE -> {
onItemListener.onPhoneClick(matchedText)
}
AutoLinkMode.MODE_EMAIL -> {
onItemListener.onEmailClick(matchedText)
}
else -> {
}
}
}
binding.content.setAutoLinkOnLongClickListener { autoLinkMode, matchedText ->
textGestureListener?.longPressed = true

when (autoLinkMode) {
AutoLinkMode.MODE_URL -> {
onItemListener.onUrlLongClick(matchedText)
}

else -> {
}
}
}
}

private fun bind(
appCardData: AppCardData, isLast: Boolean, isMe: Boolean, createdAt: String, status: String, isPin: Boolean,
isRepresentative: Boolean, isSecret: Boolean
) {
if (!appCardData.coverUrl.isNullOrEmpty()) {
binding.cover.updateLayoutParams {
val lp = (this as LayoutParams)
Expand All @@ -64,26 +150,19 @@ class AppCardLayout(context: Context, attrs: AttributeSet) : ConstraintLayout(co
lp.dimensionRatio = "${appCardData.cover.radio}:1"
}
binding.cover.loadImage(appCardData.cover.url, base64Holder = appCardData.cover.thumbnail)
} else {
binding.cover.isVisible = false
}
binding.title.isVisible = !appCardData.title.isNullOrEmpty()
binding.content.isVisible = !appCardData.description.isNullOrEmpty()
val startPadding = if (isMe) 0 else 7.dp
val endPadding = if (isMe) {
if (isLast) 6.dp else 7.dp
if (isLast) 4.dp else 7.dp
} else 0

binding.root.setPadding(startPadding, binding.root.paddingTop, endPadding, binding.root.paddingBottom)

binding.title.text = appCardData.title
binding.content.text = appCardData.description
binding.content.setAutoLinkOnLongClickListener { autoLinkMode, matchedText ->
textGestureListener?.longPressed = true

when (autoLinkMode) {
AutoLinkMode.MODE_URL -> {
onItemListener.onUrlLongClick(matchedText)
}
else -> {
}
}
}
binding.chatTime.load(isMe, createdAt, status, isPin, isRepresentative, isSecret)
}
}
62 changes: 35 additions & 27 deletions app/src/main/res/layout/view_app_card.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,41 +6,49 @@

<ImageView
android:id="@+id/cover"
android:contentDescription="@null"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="0dp"
android:layout_height="0dp" />
app:layout_constraintTop_toTopOf="parent"/>

<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:gravity="start"
<LinearLayout
android:id="@+id/content_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="8dp"
android:textColor="?attr/text_primary"
android:textFontWeight="500"
android:layout_marginBottom="4dp"
android:paddingStart="6dp"
android:paddingEnd="6dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/cover" />
app:layout_constraintTop_toBottomOf="@id/cover">

<one.mixin.android.widget.linktext.AutoLinkTextView
android:id="@+id/content"
android:gravity="start"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:textColor="?attr/text_primary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/title" />
<TextView
android:id="@+id/title"
android:gravity="start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/text_primary"
android:textSize="16sp"
android:textFontWeight="500"
android:layout_marginBottom="4dp" />

<one.mixin.android.widget.bubble.TimeBubble
android:id="@+id/chat_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/content" />
<one.mixin.android.widget.linktext.AutoLinkTextView
android:id="@+id/content"
android:gravity="start"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="?attr/text_primary" />

<one.mixin.android.widget.bubble.TimeBubble
android:id="@+id/chat_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:layout_gravity="end" />
</LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

0 comments on commit bdd1e60

Please sign in to comment.