diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/EncryptedItemFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/EncryptedItemFactory.kt index 2a4a0c0f67..080565cd16 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/EncryptedItemFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/EncryptedItemFactory.kt @@ -68,6 +68,7 @@ class EncryptedItemFactory @Inject constructor(private val messageInformationDat return MessageTextItem_() .message(spannableStr) .avatarRenderer(avatarRenderer) + .colorProvider(colorProvider) .informationData(informationData) .highlighted(highlight) .avatarCallback(callback) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt index d8f1c602d5..02e3e43bbe 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -117,6 +117,7 @@ class MessageItemFactory @Inject constructor( callback: TimelineEventController.Callback?): MessageFileItem? { return MessageFileItem_() .avatarRenderer(avatarRenderer) + .colorProvider(colorProvider) .informationData(informationData) .highlighted(highlight) .avatarCallback(callback) @@ -144,6 +145,7 @@ class MessageItemFactory @Inject constructor( callback: TimelineEventController.Callback?): MessageFileItem? { return MessageFileItem_() .avatarRenderer(avatarRenderer) + .colorProvider(colorProvider) .informationData(informationData) .highlighted(highlight) .avatarCallback(callback) @@ -195,6 +197,7 @@ class MessageItemFactory @Inject constructor( ) return MessageImageVideoItem_() .avatarRenderer(avatarRenderer) + .colorProvider(colorProvider) .imageContentRenderer(imageContentRenderer) .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder) .playable(messageContent.info?.mimeType == "image/gif") @@ -246,6 +249,7 @@ class MessageItemFactory @Inject constructor( .imageContentRenderer(imageContentRenderer) .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder) .avatarRenderer(avatarRenderer) + .colorProvider(colorProvider) .playable(true) .informationData(informationData) .highlighted(highlight) @@ -288,6 +292,7 @@ class MessageItemFactory @Inject constructor( } .avatarRenderer(avatarRenderer) .informationData(informationData) + .colorProvider(colorProvider) .highlighted(highlight) .avatarCallback(callback) .urlClickCallback(callback) @@ -353,6 +358,7 @@ class MessageItemFactory @Inject constructor( return MessageTextItem_() .avatarRenderer(avatarRenderer) .message(message) + .colorProvider(colorProvider) .informationData(informationData) .highlighted(highlight) .avatarCallback(callback) @@ -393,6 +399,7 @@ class MessageItemFactory @Inject constructor( } } .avatarRenderer(avatarRenderer) + .colorProvider(colorProvider) .informationData(informationData) .highlighted(highlight) .avatarCallback(callback) @@ -414,6 +421,7 @@ class MessageItemFactory @Inject constructor( callback: TimelineEventController.Callback?): RedactedMessageItem? { return RedactedMessageItem_() .avatarRenderer(avatarRenderer) + .colorProvider(colorProvider) .informationData(informationData) .highlighted(highlight) .avatarCallback(callback) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt index 688cac3db9..ca79666747 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt @@ -23,12 +23,16 @@ import android.widget.ProgressBar import android.widget.TextView import androidx.core.view.isVisible import im.vector.matrix.android.api.session.content.ContentUploadStateTracker +import im.vector.matrix.android.api.session.room.send.SendState import im.vector.riotx.R import im.vector.riotx.core.di.ActiveSessionHolder +import im.vector.riotx.core.resources.ColorProvider import im.vector.riotx.features.media.ImageContentRenderer +import im.vector.riotx.features.ui.getMessageTextColor import javax.inject.Inject -class ContentUploadStateTrackerBinder @Inject constructor(private val activeSessionHolder: ActiveSessionHolder) { +class ContentUploadStateTrackerBinder @Inject constructor(private val activeSessionHolder: ActiveSessionHolder, + private val colorProvider: ColorProvider) { private val updateListeners = mutableMapOf() @@ -38,7 +42,7 @@ class ContentUploadStateTrackerBinder @Inject constructor(private val activeSess activeSessionHolder.getActiveSession().also { session -> val uploadStateTracker = session.contentUploadProgressTracker() - val updateListener = ContentMediaProgressUpdater(progressLayout, mediaData) + val updateListener = ContentMediaProgressUpdater(progressLayout, mediaData, colorProvider) updateListeners[eventId] = updateListener uploadStateTracker.track(eventId, updateListener) } @@ -56,7 +60,8 @@ class ContentUploadStateTrackerBinder @Inject constructor(private val activeSess } private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup, - private val mediaData: ImageContentRenderer.Data) : ContentUploadStateTracker.UpdateListener { + private val mediaData: ImageContentRenderer.Data, + private val colorProvider: ColorProvider) : ContentUploadStateTracker.UpdateListener { override fun onUpdate(state: ContentUploadStateTracker.State) { when (state) { @@ -79,6 +84,7 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup, progressBar?.isIndeterminate = true progressBar?.progress = 0 progressTextView?.text = progressLayout.context.getString(R.string.send_file_step_idle) + progressTextView?.setTextColor(colorProvider.getMessageTextColor(SendState.UNSENT)) } else { progressLayout.isVisible = false } @@ -106,6 +112,7 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup, val progressTextView = progressLayout.findViewById(R.id.mediaProgressTextView) progressBar?.isIndeterminate = true progressTextView?.text = progressLayout.context.getString(resId) + progressTextView?.setTextColor(colorProvider.getMessageTextColor(SendState.ENCRYPTING)) } private fun doHandleProgress(resId: Int, current: Long, total: Long) { @@ -119,6 +126,7 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup, progressTextView?.text = progressLayout.context.getString(resId, Formatter.formatShortFileSize(progressLayout.context, current), Formatter.formatShortFileSize(progressLayout.context, total)) + progressTextView?.setTextColor(colorProvider.getMessageTextColor(SendState.SENDING)) } private fun handleFailure(state: ContentUploadStateTracker.State.Failure) { @@ -126,8 +134,8 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup, val progressBar = progressLayout.findViewById(R.id.mediaProgressBar) val progressTextView = progressLayout.findViewById(R.id.mediaProgressTextView) progressBar?.isVisible = false - // TODO Red text progressTextView?.text = state.throwable.localizedMessage + progressTextView?.setTextColor(colorProvider.getMessageTextColor(SendState.UNDELIVERED)) } private fun handleSuccess(state: ContentUploadStateTracker.State.Success) { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt index 7a66c6adcf..f76601cd43 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt @@ -29,11 +29,13 @@ import androidx.core.view.isGone import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import im.vector.riotx.R +import im.vector.riotx.core.resources.ColorProvider import im.vector.riotx.core.utils.DebouncedClickListener import im.vector.riotx.core.utils.DimensionUtils.dpToPx import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController import im.vector.riotx.features.reactions.widget.ReactionButton +import im.vector.riotx.features.ui.getMessageTextColor abstract class AbsMessageItem : BaseEventItem() { @@ -42,6 +44,9 @@ abstract class AbsMessageItem : BaseEventItem() { abstract val avatarRenderer: AvatarRenderer + @EpoxyAttribute + lateinit var colorProvider: ColorProvider + @EpoxyAttribute var longClickListener: View.OnLongClickListener? = null @@ -153,9 +158,9 @@ abstract class AbsMessageItem : BaseEventItem() { return true } - protected fun View.renderSendState() { - isClickable = informationData.sendState.isSent() - alpha = if (informationData.sendState.isSent()) 1f else 0.5f + protected fun renderSendState(root: View, textView: TextView?) { + root.isClickable = informationData.sendState.isSent() + textView?.setTextColor(colorProvider.getMessageTextColor(informationData.sendState)) } abstract class Holder : BaseHolder() { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt index 66b368dfd8..3d5fb452d3 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt @@ -44,7 +44,7 @@ abstract class MessageFileItem : AbsMessageItem() { override fun bind(holder: Holder) { super.bind(holder) - holder.fileLayout.renderSendState() + renderSendState(holder.fileLayout, holder.filenameView) holder.filenameView.text = filename holder.fileImageView.setImageResource(iconRes) holder.filenameView.setOnClickListener(clickListener) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt index 67f0ed7bda..bc47be748c 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt @@ -52,7 +52,8 @@ abstract class MessageImageVideoItem : AbsMessageItem() { null) holder.messageView.setTextFuture(textFuture) - holder.messageView.renderSendState() + renderSendState(holder.messageView, holder.messageView) holder.messageView.setOnClickListener(cellClickListener) holder.messageView.setOnLongClickListener(longClickListener) findPillsAndProcess { it.bind(holder.messageView) } diff --git a/vector/src/main/java/im/vector/riotx/features/ui/ColorProviderExt.kt b/vector/src/main/java/im/vector/riotx/features/ui/ColorProviderExt.kt new file mode 100644 index 0000000000..a53ed921cb --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/ui/ColorProviderExt.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotx.features.ui + +import androidx.annotation.ColorInt +import im.vector.matrix.android.api.session.room.send.SendState +import im.vector.riotx.R +import im.vector.riotx.core.resources.ColorProvider + +@ColorInt +fun ColorProvider.getMessageTextColor(sendState: SendState): Int { + return when (sendState) { + // SendStates, in the classical order they will occur + SendState.UNKNOWN, + SendState.UNSENT -> getColorFromAttribute(R.attr.vctr_sending_message_text_color) + SendState.ENCRYPTING -> getColorFromAttribute(R.attr.vctr_encrypting_message_text_color) + SendState.SENDING -> getColorFromAttribute(R.attr.vctr_sending_message_text_color) + SendState.SENT, + SendState.SYNCED -> getColorFromAttribute(R.attr.vctr_message_text_color) + SendState.UNDELIVERED, + SendState.FAILED_UNKNOWN_DEVICES -> getColorFromAttribute(R.attr.vctr_unsent_message_text_color) + } +} diff --git a/vector/src/main/res/values/theme_dark.xml b/vector/src/main/res/values/theme_dark.xml index 76cd365e99..826ab5f107 100644 --- a/vector/src/main/res/values/theme_dark.xml +++ b/vector/src/main/res/values/theme_dark.xml @@ -93,7 +93,7 @@ @android:color/white @color/riot_primary_text_color_dark @color/accent_color_dark - ?android:textColorSecondary + @color/riotx_text_secondary_dark @color/vector_fuchsia_color @color/primary_color_light #CCC3C3C3 diff --git a/vector/src/main/res/values/theme_light.xml b/vector/src/main/res/values/theme_light.xml index f7f9a26051..d55148e71f 100644 --- a/vector/src/main/res/values/theme_light.xml +++ b/vector/src/main/res/values/theme_light.xml @@ -93,7 +93,7 @@ @color/riot_primary_text_color_light #FF61708b @color/accent_color_light - ?android:textColorSecondary + @color/riotx_text_secondary_light @color/vector_fuchsia_color @color/primary_color_light #333C3C3C