mirror of
https://github.com/nextcloud/talk-android
synced 2025-03-06 14:27:24 +00:00
WIP: theme chat controller and message viewholders
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
parent
3283e5b4f6
commit
e5bf5ec261
@ -25,7 +25,6 @@ package com.nextcloud.talk.adapters.messages
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.PorterDuff
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.text.Spannable
|
import android.text.Spannable
|
||||||
import android.text.SpannableString
|
import android.text.SpannableString
|
||||||
@ -33,6 +32,7 @@ import android.util.TypedValue
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.content.res.ResourcesCompat
|
import androidx.core.content.res.ResourcesCompat
|
||||||
|
import androidx.core.graphics.ColorUtils
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import autodagger.AutoInjector
|
import autodagger.AutoInjector
|
||||||
import coil.load
|
import coil.load
|
||||||
@ -44,22 +44,29 @@ import com.nextcloud.talk.databinding.ItemCustomOutcomingTextMessageBinding
|
|||||||
import com.nextcloud.talk.models.json.chat.ChatMessage
|
import com.nextcloud.talk.models.json.chat.ChatMessage
|
||||||
import com.nextcloud.talk.models.json.chat.ReadStatus
|
import com.nextcloud.talk.models.json.chat.ReadStatus
|
||||||
import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback
|
import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback
|
||||||
|
import com.nextcloud.talk.ui.theme.ServerTheme
|
||||||
|
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
||||||
import com.nextcloud.talk.utils.ApiUtils
|
import com.nextcloud.talk.utils.ApiUtils
|
||||||
import com.nextcloud.talk.utils.DisplayUtils.getMessageSelector
|
import com.nextcloud.talk.utils.DisplayUtils.getMessageSelector
|
||||||
import com.nextcloud.talk.utils.DisplayUtils.searchAndReplaceWithMentionSpan
|
import com.nextcloud.talk.utils.DisplayUtils.searchAndReplaceWithMentionSpan
|
||||||
import com.nextcloud.talk.utils.TextMatchers
|
import com.nextcloud.talk.utils.TextMatchers
|
||||||
import com.stfalcon.chatkit.messages.MessageHolders.OutcomingTextMessageViewHolder
|
import com.stfalcon.chatkit.messages.MessageHolders.OutcomingTextMessageViewHolder
|
||||||
import java.util.HashMap
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@AutoInjector(NextcloudTalkApplication::class)
|
@AutoInjector(NextcloudTalkApplication::class)
|
||||||
class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewHolder<ChatMessage>(itemView) {
|
class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewHolder<ChatMessage>(itemView) {
|
||||||
private val binding: ItemCustomOutcomingTextMessageBinding = ItemCustomOutcomingTextMessageBinding.bind(itemView)
|
private val binding: ItemCustomOutcomingTextMessageBinding = ItemCustomOutcomingTextMessageBinding.bind(itemView)
|
||||||
private val realView: View = itemView
|
private val realView: View = itemView
|
||||||
|
|
||||||
@JvmField
|
|
||||||
@Inject
|
@Inject
|
||||||
var context: Context? = null
|
lateinit var context: Context
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var viewThemeUtils: ViewThemeUtils
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var serverTheme: ServerTheme
|
||||||
|
|
||||||
lateinit var reactionsInterface: ReactionsInterface
|
lateinit var reactionsInterface: ReactionsInterface
|
||||||
|
|
||||||
@ -69,7 +76,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage
|
|||||||
val messageParameters: HashMap<String?, HashMap<String?, String?>>? = message.messageParameters
|
val messageParameters: HashMap<String?, HashMap<String?, String?>>? = message.messageParameters
|
||||||
var messageString: Spannable = SpannableString(message.text)
|
var messageString: Spannable = SpannableString(message.text)
|
||||||
realView.isSelected = false
|
realView.isSelected = false
|
||||||
binding.messageTime.setTextColor(context!!.resources.getColor(R.color.white60))
|
binding.messageTime.setTextColor(ColorUtils.setAlphaComponent(serverTheme.colorText, ALPHA_60_INT))
|
||||||
val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams
|
val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams
|
||||||
layoutParams.isWrapBefore = false
|
layoutParams.isWrapBefore = false
|
||||||
var textSize = context!!.resources.getDimension(R.dimen.chat_text_size)
|
var textSize = context!!.resources.getDimension(R.dimen.chat_text_size)
|
||||||
@ -89,6 +96,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage
|
|||||||
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
||||||
binding.messageTime.layoutParams = layoutParams
|
binding.messageTime.layoutParams = layoutParams
|
||||||
binding.messageText.text = messageString
|
binding.messageText.text = messageString
|
||||||
|
binding.messageText.setTextColor(serverTheme.colorText)
|
||||||
|
|
||||||
// parent message handling
|
// parent message handling
|
||||||
if (!message.isDeleted && message.parentMessage != null) {
|
if (!message.isDeleted && message.parentMessage != null) {
|
||||||
@ -112,8 +120,8 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage
|
|||||||
|
|
||||||
readStatusDrawableInt?.let { drawableInt ->
|
readStatusDrawableInt?.let { drawableInt ->
|
||||||
ResourcesCompat.getDrawable(context!!.resources, drawableInt, null)?.let {
|
ResourcesCompat.getDrawable(context!!.resources, drawableInt, null)?.let {
|
||||||
it.setColorFilter(ContextCompat.getColor(context!!, R.color.white60), PorterDuff.Mode.SRC_ATOP)
|
|
||||||
binding.checkMark.setImageDrawable(it)
|
binding.checkMark.setImageDrawable(it)
|
||||||
|
viewThemeUtils.colorImageViewText(binding.checkMark)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,20 +156,19 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage
|
|||||||
binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName
|
binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName
|
||||||
?: context!!.getText(R.string.nc_nick_guest)
|
?: context!!.getText(R.string.nc_nick_guest)
|
||||||
binding.messageQuote.quotedMessage.text = parentChatMessage.text
|
binding.messageQuote.quotedMessage.text = parentChatMessage.text
|
||||||
binding.messageQuote.quotedMessage.setTextColor(
|
binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText)
|
||||||
ContextCompat.getColor(context!!, R.color.nc_outcoming_text_default)
|
binding.messageQuote.quotedMessageAuthor.setTextColor(ContextCompat.getColor(context, R.color.nc_grey))
|
||||||
)
|
|
||||||
binding.messageQuote.quotedMessageAuthor.setTextColor(ContextCompat.getColor(context!!, R.color.nc_grey))
|
|
||||||
|
|
||||||
binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.white)
|
binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.white)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setBubbleOnChatMessage(message: ChatMessage) {
|
private fun setBubbleOnChatMessage(message: ChatMessage) {
|
||||||
val resources = sharedApplication!!.resources
|
val resources = sharedApplication!!.resources
|
||||||
|
val elementColor = viewThemeUtils.getElementColor(binding.root.context)
|
||||||
val bgBubbleColor = if (message.isDeleted) {
|
val bgBubbleColor = if (message.isDeleted) {
|
||||||
ResourcesCompat.getColor(resources, R.color.bg_message_list_outcoming_bubble_deleted, null)
|
ColorUtils.setAlphaComponent(elementColor, HALF_ALPHA_INT)
|
||||||
} else {
|
} else {
|
||||||
ResourcesCompat.getColor(resources, R.color.bg_message_list_outcoming_bubble, null)
|
elementColor
|
||||||
}
|
}
|
||||||
if (message.isGrouped) {
|
if (message.isGrouped) {
|
||||||
val bubbleDrawable = getMessageSelector(
|
val bubbleDrawable = getMessageSelector(
|
||||||
@ -221,5 +228,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val TEXT_SIZE_MULTIPLIER = 2.5
|
const val TEXT_SIZE_MULTIPLIER = 2.5
|
||||||
|
private const val HALF_ALPHA_INT: Int = 255 / 2
|
||||||
|
private val ALPHA_60_INT: Int = (255 * 0.6).roundToInt()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,6 +154,7 @@ import com.nextcloud.talk.ui.dialog.MessageActionsDialog
|
|||||||
import com.nextcloud.talk.ui.dialog.ShowReactionsDialog
|
import com.nextcloud.talk.ui.dialog.ShowReactionsDialog
|
||||||
import com.nextcloud.talk.ui.recyclerview.MessageSwipeActions
|
import com.nextcloud.talk.ui.recyclerview.MessageSwipeActions
|
||||||
import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback
|
import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback
|
||||||
|
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
||||||
import com.nextcloud.talk.utils.ApiUtils
|
import com.nextcloud.talk.utils.ApiUtils
|
||||||
import com.nextcloud.talk.utils.AttendeePermissionsUtil
|
import com.nextcloud.talk.utils.AttendeePermissionsUtil
|
||||||
import com.nextcloud.talk.utils.ConductorRemapping
|
import com.nextcloud.talk.utils.ConductorRemapping
|
||||||
@ -235,6 +236,9 @@ class ChatController(args: Bundle) :
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var permissionUtil: PlatformPermissionUtil
|
lateinit var permissionUtil: PlatformPermissionUtil
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var viewThemeUtils: ViewThemeUtils
|
||||||
|
|
||||||
val disposables = DisposableSet()
|
val disposables = DisposableSet()
|
||||||
|
|
||||||
var roomToken: String? = null
|
var roomToken: String? = null
|
||||||
@ -872,6 +876,8 @@ class ChatController(args: Bundle) :
|
|||||||
.nc_description_send_message_button
|
.nc_description_send_message_button
|
||||||
)
|
)
|
||||||
|
|
||||||
|
viewThemeUtils.colorImageView(binding.messageInputView.button)
|
||||||
|
|
||||||
if (currentConversation != null && currentConversation?.roomId != null) {
|
if (currentConversation != null && currentConversation?.roomId != null) {
|
||||||
loadAvatarForStatusBar()
|
loadAvatarForStatusBar()
|
||||||
setTitle()
|
setTitle()
|
||||||
|
@ -46,6 +46,7 @@ import com.nextcloud.talk.controllers.base.NewBaseController
|
|||||||
import com.nextcloud.talk.controllers.util.viewBinding
|
import com.nextcloud.talk.controllers.util.viewBinding
|
||||||
import com.nextcloud.talk.databinding.ControllerEntryMenuBinding
|
import com.nextcloud.talk.databinding.ControllerEntryMenuBinding
|
||||||
import com.nextcloud.talk.models.json.conversations.Conversation
|
import com.nextcloud.talk.models.json.conversations.Conversation
|
||||||
|
import com.nextcloud.talk.ui.theme.ServerTheme
|
||||||
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
||||||
import com.nextcloud.talk.users.UserManager
|
import com.nextcloud.talk.users.UserManager
|
||||||
import com.nextcloud.talk.utils.ShareUtils
|
import com.nextcloud.talk.utils.ShareUtils
|
||||||
@ -76,6 +77,9 @@ class EntryMenuController(args: Bundle) :
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var viewThemeUtils: ViewThemeUtils
|
lateinit var viewThemeUtils: ViewThemeUtils
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var serverTheme: ServerTheme
|
||||||
|
|
||||||
private val operation: ConversationOperationEnum
|
private val operation: ConversationOperationEnum
|
||||||
private var conversation: Conversation? = null
|
private var conversation: Conversation? = null
|
||||||
private var shareIntent: Intent? = null
|
private var shareIntent: Intent? = null
|
||||||
@ -171,7 +175,7 @@ class EntryMenuController(args: Bundle) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
viewThemeUtils.colorTextInputLayout(binding.textInputLayout)
|
viewThemeUtils.colorTextInputLayout(binding.textInputLayout)
|
||||||
binding.textEdit.setTextColor(viewThemeUtils.theme.colorText)
|
binding.textEdit.setTextColor(serverTheme.colorText)
|
||||||
viewThemeUtils.colorMaterialButtonText(binding.okButton)
|
viewThemeUtils.colorMaterialButtonText(binding.okButton)
|
||||||
|
|
||||||
binding.textInputLayout.hint = labelText
|
binding.textInputLayout.hint = labelText
|
||||||
|
@ -47,7 +47,7 @@ import com.yarolegovich.mp.MaterialPreferenceCategory
|
|||||||
import com.yarolegovich.mp.MaterialSwitchPreference
|
import com.yarolegovich.mp.MaterialSwitchPreference
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class ViewThemeUtils @Inject constructor(val theme: ServerTheme) {
|
class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
|
||||||
|
|
||||||
private fun isDarkMode(context: Context): Boolean = when (
|
private fun isDarkMode(context: Context): Boolean = when (
|
||||||
context.resources.configuration.uiMode and
|
context.resources.configuration.uiMode and
|
||||||
|
Loading…
Reference in New Issue
Block a user