mirror of
https://github.com/nextcloud/talk-android
synced 2025-03-08 23:19:55 +00:00
create deck card xml layout
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
parent
417535da63
commit
66d2db20aa
@ -0,0 +1,242 @@
|
|||||||
|
/*
|
||||||
|
* Nextcloud Talk - Android Client
|
||||||
|
*
|
||||||
|
* SPDX-FileCopyrightText: 2024 Sowjanya Kota <sowjanya.kch@gmail.com>
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.adapters.messages
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.text.TextUtils
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.View
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import autodagger.AutoInjector
|
||||||
|
import coil.load
|
||||||
|
import com.nextcloud.android.common.ui.theme.utils.ColorRole
|
||||||
|
import com.nextcloud.talk.R
|
||||||
|
import com.nextcloud.talk.api.NcApi
|
||||||
|
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||||
|
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
|
||||||
|
import com.nextcloud.talk.chat.ChatActivity
|
||||||
|
import com.nextcloud.talk.chat.data.model.ChatMessage
|
||||||
|
import com.nextcloud.talk.databinding.ItemCustomIncomingLinkPreviewMessageBinding
|
||||||
|
import com.nextcloud.talk.extensions.loadBotsAvatar
|
||||||
|
import com.nextcloud.talk.extensions.loadChangelogBotAvatar
|
||||||
|
import com.nextcloud.talk.extensions.loadFederatedUserAvatar
|
||||||
|
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
||||||
|
import com.nextcloud.talk.utils.ApiUtils
|
||||||
|
import com.nextcloud.talk.utils.DateUtils
|
||||||
|
import com.nextcloud.talk.utils.message.MessageUtils
|
||||||
|
import com.nextcloud.talk.utils.preferences.AppPreferences
|
||||||
|
import com.stfalcon.chatkit.messages.MessageHolders
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.flow.first
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@AutoInjector(NextcloudTalkApplication::class)
|
||||||
|
class IncomingDeckCardViewHolder(incomingView: View, payload: Any) : MessageHolders
|
||||||
|
.IncomingTextMessageViewHolder<ChatMessage>(incomingView, payload) {
|
||||||
|
|
||||||
|
private val binding: ItemCustomIncomingLinkPreviewMessageBinding =
|
||||||
|
ItemCustomIncomingLinkPreviewMessageBinding.bind(itemView)
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var context: Context
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var appPreferences: AppPreferences
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var viewThemeUtils: ViewThemeUtils
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var messageUtils: MessageUtils
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var dateUtils: DateUtils
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var ncApi: NcApi
|
||||||
|
|
||||||
|
lateinit var message: ChatMessage
|
||||||
|
|
||||||
|
lateinit var commonMessageInterface: CommonMessageInterface
|
||||||
|
|
||||||
|
var stackName: String? = null
|
||||||
|
var cardName: String? = null
|
||||||
|
var boardName: String? = null
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
override fun onBind(message: ChatMessage) {
|
||||||
|
super.onBind(message)
|
||||||
|
this.message = message
|
||||||
|
sharedApplication!!.componentApplication.inject(this)
|
||||||
|
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
|
||||||
|
|
||||||
|
setAvatarAndAuthorOnMessageItem(message)
|
||||||
|
|
||||||
|
colorizeMessageBubble(message)
|
||||||
|
|
||||||
|
itemView.isSelected = false
|
||||||
|
|
||||||
|
// parent message handling
|
||||||
|
setParentMessageDataOnMessageItem(message)
|
||||||
|
|
||||||
|
showDeckCard(message)
|
||||||
|
|
||||||
|
binding.referenceInclude.referenceWrapper.setOnLongClickListener { l: View? ->
|
||||||
|
commonMessageInterface.onOpenMessageActionsDialog(message)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
itemView.setTag(R.string.replyable_message_view_tag, message.replyable)
|
||||||
|
|
||||||
|
Reaction().showReactions(
|
||||||
|
message,
|
||||||
|
::clickOnReaction,
|
||||||
|
::longClickOnReaction,
|
||||||
|
binding.reactions,
|
||||||
|
binding.messageTime.context,
|
||||||
|
false,
|
||||||
|
viewThemeUtils
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showDeckCard(message: ChatMessage) {
|
||||||
|
if (message.messageParameters != null && message.messageParameters!!.size > 0) {
|
||||||
|
for (key in message.messageParameters!!.keys) {
|
||||||
|
val individualHashMap: Map<String?, String?> = message.messageParameters!![key]!!
|
||||||
|
if (individualHashMap["type"] == "deck-card") {
|
||||||
|
cardName = individualHashMap["name"]
|
||||||
|
stackName = individualHashMap["stackname"]
|
||||||
|
boardName = individualHashMap["boardname"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun longClickOnReaction(chatMessage: ChatMessage) {
|
||||||
|
commonMessageInterface.onLongClickReactions(chatMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun clickOnReaction(chatMessage: ChatMessage, emoji: String) {
|
||||||
|
commonMessageInterface.onClickReaction(chatMessage, emoji)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setAvatarAndAuthorOnMessageItem(message: ChatMessage) {
|
||||||
|
val author: String = message.actorDisplayName!!
|
||||||
|
if (!TextUtils.isEmpty(author)) {
|
||||||
|
binding.messageAuthor.visibility = View.VISIBLE
|
||||||
|
binding.messageAuthor.text = author
|
||||||
|
binding.messageUserAvatar.setOnClickListener {
|
||||||
|
(payload as? MessagePayload)?.profileBottomSheet?.showFor(message, itemView.context)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
binding.messageAuthor.setText(R.string.nc_nick_guest)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!message.isGrouped && !message.isOneToOneConversation && !message.isFormerOneToOneConversation) {
|
||||||
|
setAvatarOnMessage(message)
|
||||||
|
} else {
|
||||||
|
if (message.isOneToOneConversation || message.isFormerOneToOneConversation) {
|
||||||
|
binding.messageUserAvatar.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
binding.messageUserAvatar.visibility = View.INVISIBLE
|
||||||
|
}
|
||||||
|
binding.messageAuthor.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setAvatarOnMessage(message: ChatMessage) {
|
||||||
|
binding.messageUserAvatar.visibility = View.VISIBLE
|
||||||
|
if (message.actorType == "guests") {
|
||||||
|
// do nothing, avatar is set
|
||||||
|
} else if (message.actorType == "bots" && message.actorId == "changelog") {
|
||||||
|
binding.messageUserAvatar.loadChangelogBotAvatar()
|
||||||
|
} else if (message.actorType == "bots") {
|
||||||
|
binding.messageUserAvatar.loadBotsAvatar()
|
||||||
|
} else if (message.actorType == "federated_users") {
|
||||||
|
binding.messageUserAvatar.loadFederatedUserAvatar(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun colorizeMessageBubble(message: ChatMessage) {
|
||||||
|
viewThemeUtils.talk.themeIncomingMessageBubble(bubble, message.isGrouped, message.isDeleted)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setParentMessageDataOnMessageItem(message: ChatMessage) {
|
||||||
|
if (message.parentMessageId != null && !message.isDeleted) {
|
||||||
|
CoroutineScope(Dispatchers.Main).launch {
|
||||||
|
try {
|
||||||
|
val chatActivity = commonMessageInterface as ChatActivity
|
||||||
|
val urlForChatting = ApiUtils.getUrlForChat(
|
||||||
|
chatActivity.chatApiVersion,
|
||||||
|
chatActivity.conversationUser?.baseUrl,
|
||||||
|
chatActivity.roomToken
|
||||||
|
)
|
||||||
|
|
||||||
|
val parentChatMessage = withContext(Dispatchers.IO) {
|
||||||
|
chatActivity.chatViewModel.getMessageById(
|
||||||
|
urlForChatting,
|
||||||
|
chatActivity.currentConversation!!,
|
||||||
|
message.parentMessageId!!
|
||||||
|
).first()
|
||||||
|
}
|
||||||
|
parentChatMessage.activeUser = message.activeUser
|
||||||
|
parentChatMessage.imageUrl?.let {
|
||||||
|
binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE
|
||||||
|
binding.messageQuote.quotedMessageImage.load(it) {
|
||||||
|
addHeader(
|
||||||
|
"Authorization",
|
||||||
|
ApiUtils.getCredentials(message.activeUser!!.username, message.activeUser!!.token)!!
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} ?: run {
|
||||||
|
binding.messageQuote.quotedMessageImage.visibility = View.GONE
|
||||||
|
}
|
||||||
|
binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName
|
||||||
|
?: context.getText(R.string.nc_nick_guest)
|
||||||
|
binding.messageQuote.quotedMessage.text = messageUtils
|
||||||
|
.enrichChatReplyMessageText(
|
||||||
|
binding.messageQuote.quotedMessage.context,
|
||||||
|
parentChatMessage,
|
||||||
|
true,
|
||||||
|
viewThemeUtils
|
||||||
|
)
|
||||||
|
|
||||||
|
binding.messageQuote.quotedMessageAuthor
|
||||||
|
.setTextColor(ContextCompat.getColor(context, R.color.textColorMaxContrast))
|
||||||
|
|
||||||
|
if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) {
|
||||||
|
viewThemeUtils.platform.colorViewBackground(
|
||||||
|
binding.messageQuote.quoteColoredView,
|
||||||
|
ColorRole.PRIMARY
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.textColorMaxContrast)
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.messageQuote.quotedChatMessageView.visibility = View.VISIBLE
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.d(TAG, "Error when processing parent message in view holder", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
binding.messageQuote.quotedChatMessageView.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assignCommonMessageInterface(commonMessageInterface: CommonMessageInterface) {
|
||||||
|
this.commonMessageInterface = commonMessageInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val TAG = IncomingDeckCardViewHolder::class.java.simpleName
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Nextcloud Talk - Android Client
|
||||||
|
*
|
||||||
|
* SPDX-FileCopyrightText: 2024 Sowjanya Kota<sowjanya.kch@gmail.com>
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.adapters.messages
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import autodagger.AutoInjector
|
||||||
|
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||||
|
import com.nextcloud.talk.chat.data.model.ChatMessage
|
||||||
|
import com.stfalcon.chatkit.messages.MessageHolders
|
||||||
|
|
||||||
|
@AutoInjector(NextcloudTalkApplication::class)
|
||||||
|
class OutgoingDeckCardViewHolder(
|
||||||
|
outcomingView: View
|
||||||
|
) : MessageHolders.OutcomingTextMessageViewHolder<ChatMessage>(outcomingView) {
|
||||||
|
}
|
@ -67,6 +67,10 @@ public class TalkMessagesListAdapter<M extends IMessage> extends MessagesListAda
|
|||||||
((CallStartedViewHolder) holder).assignCallStartedMessageInterface(chatActivity);
|
((CallStartedViewHolder) holder).assignCallStartedMessageInterface(chatActivity);
|
||||||
} else if (holder instanceof TemporaryMessageViewHolder) {
|
} else if (holder instanceof TemporaryMessageViewHolder) {
|
||||||
((TemporaryMessageViewHolder) holder).assignTemporaryMessageInterface(chatActivity);
|
((TemporaryMessageViewHolder) holder).assignTemporaryMessageInterface(chatActivity);
|
||||||
|
}else if (holder instanceof IncomingDeckCardViewHolder){
|
||||||
|
((IncomingDeckCardViewHolder) holder).assignCommonMessageInterface(chatActivity);
|
||||||
|
} else if(holder instanceof OutgoingDeckCardViewHolder){
|
||||||
|
((OutgoingDeckCardViewHolder) holder).assignCommonMessageInterface(chatActivity);
|
||||||
}
|
}
|
||||||
|
|
||||||
super.onBindViewHolder(holder, position);
|
super.onBindViewHolder(holder, position);
|
||||||
|
@ -3517,6 +3517,7 @@ class ChatActivity :
|
|||||||
CONTENT_TYPE_UNREAD_NOTICE_MESSAGE -> message.id == "-1"
|
CONTENT_TYPE_UNREAD_NOTICE_MESSAGE -> message.id == "-1"
|
||||||
CONTENT_TYPE_CALL_STARTED -> message.id == "-2"
|
CONTENT_TYPE_CALL_STARTED -> message.id == "-2"
|
||||||
CONTENT_TYPE_TEMP -> message.id == "-3"
|
CONTENT_TYPE_TEMP -> message.id == "-3"
|
||||||
|
CONTENT_TYPE_DECK_CARD -> message.isDeckCard()
|
||||||
|
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
@ -3721,7 +3722,8 @@ class ChatActivity :
|
|||||||
private const val CONTENT_TYPE_VOICE_MESSAGE: Byte = 5
|
private const val CONTENT_TYPE_VOICE_MESSAGE: Byte = 5
|
||||||
private const val CONTENT_TYPE_POLL: Byte = 6
|
private const val CONTENT_TYPE_POLL: Byte = 6
|
||||||
private const val CONTENT_TYPE_LINK_PREVIEW: Byte = 7
|
private const val CONTENT_TYPE_LINK_PREVIEW: Byte = 7
|
||||||
private const val CONTENT_TYPE_TEMP: Byte = 8
|
private const val CONTENT_TYPE_DECK_CARD: Byte = 8
|
||||||
|
private const val CONTENT_TYPE_TEMP: Byte = 9
|
||||||
private const val NEW_MESSAGES_POPUP_BUBBLE_DELAY: Long = 200
|
private const val NEW_MESSAGES_POPUP_BUBBLE_DELAY: Long = 200
|
||||||
private const val GET_ROOM_INFO_DELAY_NORMAL: Long = 30000
|
private const val GET_ROOM_INFO_DELAY_NORMAL: Long = 30000
|
||||||
private const val GET_ROOM_INFO_DELAY_LOBBY: Long = 5000
|
private const val GET_ROOM_INFO_DELAY_LOBBY: Long = 5000
|
||||||
|
@ -131,9 +131,21 @@ data class ChatMessage(
|
|||||||
MessageType.SINGLE_LINK_MESSAGE,
|
MessageType.SINGLE_LINK_MESSAGE,
|
||||||
MessageType.SINGLE_NC_GEOLOCATION_MESSAGE,
|
MessageType.SINGLE_NC_GEOLOCATION_MESSAGE,
|
||||||
MessageType.VOICE_MESSAGE,
|
MessageType.VOICE_MESSAGE,
|
||||||
MessageType.POLL_MESSAGE
|
MessageType.POLL_MESSAGE,
|
||||||
|
MessageType.DECK_CARD
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fun isDeckCard(): Boolean {
|
||||||
|
if (messageParameters != null && messageParameters!!.size > 0) {
|
||||||
|
for ((_, individualHashMap) in messageParameters!!) {
|
||||||
|
if (isHashMapEntryEqualTo(individualHashMap, "type", "deck-card")) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
fun hasFileAttachment(): Boolean {
|
fun hasFileAttachment(): Boolean {
|
||||||
if (messageParameters != null && messageParameters!!.size > 0) {
|
if (messageParameters != null && messageParameters!!.size > 0) {
|
||||||
for ((_, individualHashMap) in messageParameters!!) {
|
for ((_, individualHashMap) in messageParameters!!) {
|
||||||
@ -237,6 +249,8 @@ data class ChatMessage(
|
|||||||
MessageType.SINGLE_NC_GEOLOCATION_MESSAGE
|
MessageType.SINGLE_NC_GEOLOCATION_MESSAGE
|
||||||
} else if (isPoll()) {
|
} else if (isPoll()) {
|
||||||
MessageType.POLL_MESSAGE
|
MessageType.POLL_MESSAGE
|
||||||
|
} else if (isDeckCard()) {
|
||||||
|
MessageType.DECK_CARD
|
||||||
} else {
|
} else {
|
||||||
MessageType.REGULAR_TEXT_MESSAGE
|
MessageType.REGULAR_TEXT_MESSAGE
|
||||||
}
|
}
|
||||||
@ -345,7 +359,8 @@ data class ChatMessage(
|
|||||||
SINGLE_NC_ATTACHMENT_MESSAGE,
|
SINGLE_NC_ATTACHMENT_MESSAGE,
|
||||||
SINGLE_NC_GEOLOCATION_MESSAGE,
|
SINGLE_NC_GEOLOCATION_MESSAGE,
|
||||||
POLL_MESSAGE,
|
POLL_MESSAGE,
|
||||||
VOICE_MESSAGE
|
VOICE_MESSAGE,
|
||||||
|
DECK_CARD
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
13
app/src/main/res/drawable/baseline_assignment_24.xml
Normal file
13
app/src/main/res/drawable/baseline_assignment_24.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
<!--
|
||||||
|
~ Nextcloud Talk - Android Client
|
||||||
|
~
|
||||||
|
~ SPDX-FileCopyrightText: 2024 Sowjanya Kota <sowjanya.kch@gmail.com>
|
||||||
|
~ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
-->
|
||||||
|
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
|
||||||
|
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM14,17L7,17v-2h7v2zM17,13L7,13v-2h10v2zM17,9L7,9L7,7h10v2z"/>
|
||||||
|
|
||||||
|
</vector>
|
@ -0,0 +1,113 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Nextcloud Talk - Android Client
|
||||||
|
~
|
||||||
|
~ SPDX-FileCopyrightText: 2024 Sowjanya Kota <sowjanya.kch@gmail.com>
|
||||||
|
~ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
-->
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginBottom="2dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@id/messageUserAvatar"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:contentDescription="@string/avatar" />
|
||||||
|
|
||||||
|
<com.google.android.flexbox.FlexboxLayout
|
||||||
|
android:id="@id/bubble"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="@dimen/message_incoming_bubble_margin_right"
|
||||||
|
android:layout_toEndOf="@id/messageUserAvatar"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:alignContent="stretch"
|
||||||
|
app:alignItems="stretch"
|
||||||
|
app:flexWrap="wrap">
|
||||||
|
|
||||||
|
<include
|
||||||
|
android:id="@+id/message_quote"
|
||||||
|
layout="@layout/item_message_quote"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<androidx.emoji2.widget.EmojiTextView
|
||||||
|
android:id="@+id/messageAuthor"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="4dp"
|
||||||
|
android:alpha="0.6"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textColor="@color/no_emphasis_text"
|
||||||
|
android:textIsSelectable="false"
|
||||||
|
android:textSize="12sp"
|
||||||
|
tools:text="Jane Doe" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/referenceImage"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@drawable/baseline_assignment_24" />
|
||||||
|
|
||||||
|
<androidx.emoji2.widget.EmojiTextView
|
||||||
|
android:id="@+id/referenceName"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lineSpacingMultiplier="1.2"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textIsSelectable="false"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:text="Name of Website"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.emoji2.widget.EmojiTextView
|
||||||
|
android:id="@+id/referenceDescription"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lineSpacingMultiplier="1.2"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textIsSelectable="false"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:text="Description of Website"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@id/messageTime"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:alpha="0.6"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:textColor="@color/no_emphasis_text"
|
||||||
|
android:textIsSelectable="false"
|
||||||
|
tools:text="12:38" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</com.google.android.flexbox.FlexboxLayout>
|
||||||
|
</RelativeLayout>
|
@ -0,0 +1,122 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
~ Nextcloud Talk - Android Client
|
||||||
|
~
|
||||||
|
~ SPDX-FileCopyrightText: 2024 Sowjanya Kota<sowjanya.kch@gmail.com>
|
||||||
|
~ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
-->
|
||||||
|
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginBottom="2dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@id/messageUserAvatar"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:contentDescription="@string/avatar" />
|
||||||
|
|
||||||
|
<com.google.android.flexbox.FlexboxLayout
|
||||||
|
android:id="@id/bubble"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="@dimen/message_incoming_bubble_margin_right"
|
||||||
|
android:layout_toEndOf="@id/messageUserAvatar"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:alignContent="stretch"
|
||||||
|
app:alignItems="stretch"
|
||||||
|
app:flexWrap="wrap">
|
||||||
|
|
||||||
|
<include
|
||||||
|
android:id="@+id/message_quote"
|
||||||
|
layout="@layout/item_message_quote"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<androidx.emoji2.widget.EmojiTextView
|
||||||
|
android:id="@+id/messageAuthor"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="4dp"
|
||||||
|
android:alpha="0.6"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textColor="@color/no_emphasis_text"
|
||||||
|
android:textIsSelectable="false"
|
||||||
|
android:textSize="12sp"
|
||||||
|
tools:text="Jane Doe" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/referenceImage"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@drawable/baseline_assignment_24" />
|
||||||
|
|
||||||
|
<androidx.emoji2.widget.EmojiTextView
|
||||||
|
android:id="@+id/referenceName"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lineSpacingMultiplier="1.2"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textIsSelectable="false"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:text="Name of Website"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.emoji2.widget.EmojiTextView
|
||||||
|
android:id="@+id/referenceDescription"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lineSpacingMultiplier="1.2"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textIsSelectable="false"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:text="Description of Website"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@id/messageTime"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:alpha="0.6"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:textColor="@color/no_emphasis_text"
|
||||||
|
android:textIsSelectable="false"
|
||||||
|
tools:text="12:38" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/checkMark"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="@dimen/message_bubble_checkmark_height"
|
||||||
|
android:layout_below="@id/messageTime"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
app:layout_alignSelf="center"
|
||||||
|
app:tint="@color/high_emphasis_text" />
|
||||||
|
|
||||||
|
</com.google.android.flexbox.FlexboxLayout>
|
||||||
|
</RelativeLayout>
|
Loading…
Reference in New Issue
Block a user