Green text color during encrypting

This commit is contained in:
Benoit Marty 2019-07-12 10:16:43 +02:00
parent b77310fe92
commit 33252c3b65
10 changed files with 72 additions and 12 deletions

View File

@ -68,6 +68,7 @@ class EncryptedItemFactory @Inject constructor(private val messageInformationDat
return MessageTextItem_() return MessageTextItem_()
.message(spannableStr) .message(spannableStr)
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.colorProvider(colorProvider)
.informationData(informationData) .informationData(informationData)
.highlighted(highlight) .highlighted(highlight)
.avatarCallback(callback) .avatarCallback(callback)

View File

@ -117,6 +117,7 @@ class MessageItemFactory @Inject constructor(
callback: TimelineEventController.Callback?): MessageFileItem? { callback: TimelineEventController.Callback?): MessageFileItem? {
return MessageFileItem_() return MessageFileItem_()
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.colorProvider(colorProvider)
.informationData(informationData) .informationData(informationData)
.highlighted(highlight) .highlighted(highlight)
.avatarCallback(callback) .avatarCallback(callback)
@ -144,6 +145,7 @@ class MessageItemFactory @Inject constructor(
callback: TimelineEventController.Callback?): MessageFileItem? { callback: TimelineEventController.Callback?): MessageFileItem? {
return MessageFileItem_() return MessageFileItem_()
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.colorProvider(colorProvider)
.informationData(informationData) .informationData(informationData)
.highlighted(highlight) .highlighted(highlight)
.avatarCallback(callback) .avatarCallback(callback)
@ -195,6 +197,7 @@ class MessageItemFactory @Inject constructor(
) )
return MessageImageVideoItem_() return MessageImageVideoItem_()
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.colorProvider(colorProvider)
.imageContentRenderer(imageContentRenderer) .imageContentRenderer(imageContentRenderer)
.contentUploadStateTrackerBinder(contentUploadStateTrackerBinder) .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
.playable(messageContent.info?.mimeType == "image/gif") .playable(messageContent.info?.mimeType == "image/gif")
@ -246,6 +249,7 @@ class MessageItemFactory @Inject constructor(
.imageContentRenderer(imageContentRenderer) .imageContentRenderer(imageContentRenderer)
.contentUploadStateTrackerBinder(contentUploadStateTrackerBinder) .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.colorProvider(colorProvider)
.playable(true) .playable(true)
.informationData(informationData) .informationData(informationData)
.highlighted(highlight) .highlighted(highlight)
@ -288,6 +292,7 @@ class MessageItemFactory @Inject constructor(
} }
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.informationData(informationData) .informationData(informationData)
.colorProvider(colorProvider)
.highlighted(highlight) .highlighted(highlight)
.avatarCallback(callback) .avatarCallback(callback)
.urlClickCallback(callback) .urlClickCallback(callback)
@ -353,6 +358,7 @@ class MessageItemFactory @Inject constructor(
return MessageTextItem_() return MessageTextItem_()
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.message(message) .message(message)
.colorProvider(colorProvider)
.informationData(informationData) .informationData(informationData)
.highlighted(highlight) .highlighted(highlight)
.avatarCallback(callback) .avatarCallback(callback)
@ -393,6 +399,7 @@ class MessageItemFactory @Inject constructor(
} }
} }
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.colorProvider(colorProvider)
.informationData(informationData) .informationData(informationData)
.highlighted(highlight) .highlighted(highlight)
.avatarCallback(callback) .avatarCallback(callback)
@ -414,6 +421,7 @@ class MessageItemFactory @Inject constructor(
callback: TimelineEventController.Callback?): RedactedMessageItem? { callback: TimelineEventController.Callback?): RedactedMessageItem? {
return RedactedMessageItem_() return RedactedMessageItem_()
.avatarRenderer(avatarRenderer) .avatarRenderer(avatarRenderer)
.colorProvider(colorProvider)
.informationData(informationData) .informationData(informationData)
.highlighted(highlight) .highlighted(highlight)
.avatarCallback(callback) .avatarCallback(callback)

View File

@ -23,12 +23,16 @@ import android.widget.ProgressBar
import android.widget.TextView import android.widget.TextView
import androidx.core.view.isVisible import androidx.core.view.isVisible
import im.vector.matrix.android.api.session.content.ContentUploadStateTracker 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.R
import im.vector.riotx.core.di.ActiveSessionHolder 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.media.ImageContentRenderer
import im.vector.riotx.features.ui.getMessageTextColor
import javax.inject.Inject 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<String, ContentUploadStateTracker.UpdateListener>() private val updateListeners = mutableMapOf<String, ContentUploadStateTracker.UpdateListener>()
@ -38,7 +42,7 @@ class ContentUploadStateTrackerBinder @Inject constructor(private val activeSess
activeSessionHolder.getActiveSession().also { session -> activeSessionHolder.getActiveSession().also { session ->
val uploadStateTracker = session.contentUploadProgressTracker() val uploadStateTracker = session.contentUploadProgressTracker()
val updateListener = ContentMediaProgressUpdater(progressLayout, mediaData) val updateListener = ContentMediaProgressUpdater(progressLayout, mediaData, colorProvider)
updateListeners[eventId] = updateListener updateListeners[eventId] = updateListener
uploadStateTracker.track(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 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) { override fun onUpdate(state: ContentUploadStateTracker.State) {
when (state) { when (state) {
@ -79,6 +84,7 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup,
progressBar?.isIndeterminate = true progressBar?.isIndeterminate = true
progressBar?.progress = 0 progressBar?.progress = 0
progressTextView?.text = progressLayout.context.getString(R.string.send_file_step_idle) progressTextView?.text = progressLayout.context.getString(R.string.send_file_step_idle)
progressTextView?.setTextColor(colorProvider.getMessageTextColor(SendState.UNSENT))
} else { } else {
progressLayout.isVisible = false progressLayout.isVisible = false
} }
@ -106,6 +112,7 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup,
val progressTextView = progressLayout.findViewById<TextView>(R.id.mediaProgressTextView) val progressTextView = progressLayout.findViewById<TextView>(R.id.mediaProgressTextView)
progressBar?.isIndeterminate = true progressBar?.isIndeterminate = true
progressTextView?.text = progressLayout.context.getString(resId) progressTextView?.text = progressLayout.context.getString(resId)
progressTextView?.setTextColor(colorProvider.getMessageTextColor(SendState.ENCRYPTING))
} }
private fun doHandleProgress(resId: Int, current: Long, total: Long) { 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, progressTextView?.text = progressLayout.context.getString(resId,
Formatter.formatShortFileSize(progressLayout.context, current), Formatter.formatShortFileSize(progressLayout.context, current),
Formatter.formatShortFileSize(progressLayout.context, total)) Formatter.formatShortFileSize(progressLayout.context, total))
progressTextView?.setTextColor(colorProvider.getMessageTextColor(SendState.SENDING))
} }
private fun handleFailure(state: ContentUploadStateTracker.State.Failure) { private fun handleFailure(state: ContentUploadStateTracker.State.Failure) {
@ -126,8 +134,8 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup,
val progressBar = progressLayout.findViewById<ProgressBar>(R.id.mediaProgressBar) val progressBar = progressLayout.findViewById<ProgressBar>(R.id.mediaProgressBar)
val progressTextView = progressLayout.findViewById<TextView>(R.id.mediaProgressTextView) val progressTextView = progressLayout.findViewById<TextView>(R.id.mediaProgressTextView)
progressBar?.isVisible = false progressBar?.isVisible = false
// TODO Red text
progressTextView?.text = state.throwable.localizedMessage progressTextView?.text = state.throwable.localizedMessage
progressTextView?.setTextColor(colorProvider.getMessageTextColor(SendState.UNDELIVERED))
} }
private fun handleSuccess(state: ContentUploadStateTracker.State.Success) { private fun handleSuccess(state: ContentUploadStateTracker.State.Success) {

View File

@ -29,11 +29,13 @@ import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyAttribute
import im.vector.riotx.R 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.DebouncedClickListener
import im.vector.riotx.core.utils.DimensionUtils.dpToPx import im.vector.riotx.core.utils.DimensionUtils.dpToPx
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController
import im.vector.riotx.features.reactions.widget.ReactionButton import im.vector.riotx.features.reactions.widget.ReactionButton
import im.vector.riotx.features.ui.getMessageTextColor
abstract class AbsMessageItem<H : AbsMessageItem.Holder> : BaseEventItem<H>() { abstract class AbsMessageItem<H : AbsMessageItem.Holder> : BaseEventItem<H>() {
@ -42,6 +44,9 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : BaseEventItem<H>() {
abstract val avatarRenderer: AvatarRenderer abstract val avatarRenderer: AvatarRenderer
@EpoxyAttribute
lateinit var colorProvider: ColorProvider
@EpoxyAttribute @EpoxyAttribute
var longClickListener: View.OnLongClickListener? = null var longClickListener: View.OnLongClickListener? = null
@ -153,9 +158,9 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : BaseEventItem<H>() {
return true return true
} }
protected fun View.renderSendState() { protected fun renderSendState(root: View, textView: TextView?) {
isClickable = informationData.sendState.isSent() root.isClickable = informationData.sendState.isSent()
alpha = if (informationData.sendState.isSent()) 1f else 0.5f textView?.setTextColor(colorProvider.getMessageTextColor(informationData.sendState))
} }
abstract class Holder : BaseHolder() { abstract class Holder : BaseHolder() {

View File

@ -44,7 +44,7 @@ abstract class MessageFileItem : AbsMessageItem<MessageFileItem.Holder>() {
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
super.bind(holder) super.bind(holder)
holder.fileLayout.renderSendState() renderSendState(holder.fileLayout, holder.filenameView)
holder.filenameView.text = filename holder.filenameView.text = filename
holder.fileImageView.setImageResource(iconRes) holder.fileImageView.setImageResource(iconRes)
holder.filenameView.setOnClickListener(clickListener) holder.filenameView.setOnClickListener(clickListener)

View File

@ -52,7 +52,8 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
holder.imageView.setOnLongClickListener(longClickListener) holder.imageView.setOnLongClickListener(longClickListener)
holder.mediaContentView.setOnClickListener(cellClickListener) holder.mediaContentView.setOnClickListener(cellClickListener)
holder.mediaContentView.setOnLongClickListener(longClickListener) holder.mediaContentView.setOnLongClickListener(longClickListener)
holder.imageView.renderSendState() // The sending state color will be apply to the progress text
renderSendState(holder.imageView, null)
holder.playContentView.visibility = if (playable) View.VISIBLE else View.GONE holder.playContentView.visibility = if (playable) View.VISIBLE else View.GONE
} }

View File

@ -73,7 +73,7 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
null) null)
holder.messageView.setTextFuture(textFuture) holder.messageView.setTextFuture(textFuture)
holder.messageView.renderSendState() renderSendState(holder.messageView, holder.messageView)
holder.messageView.setOnClickListener(cellClickListener) holder.messageView.setOnClickListener(cellClickListener)
holder.messageView.setOnLongClickListener(longClickListener) holder.messageView.setOnLongClickListener(longClickListener)
findPillsAndProcess { it.bind(holder.messageView) } findPillsAndProcess { it.bind(holder.messageView) }

View File

@ -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)
}
}

View File

@ -93,7 +93,7 @@
<item name="vctr_message_text_color">@android:color/white</item> <item name="vctr_message_text_color">@android:color/white</item>
<item name="vctr_notice_text_color">@color/riot_primary_text_color_dark</item> <item name="vctr_notice_text_color">@color/riot_primary_text_color_dark</item>
<item name="vctr_encrypting_message_text_color">@color/accent_color_dark</item> <item name="vctr_encrypting_message_text_color">@color/accent_color_dark</item>
<item name="vctr_sending_message_text_color">?android:textColorSecondary</item> <item name="vctr_sending_message_text_color">@color/riotx_text_secondary_dark</item>
<item name="vctr_highlighted_message_text_color">@color/vector_fuchsia_color</item> <item name="vctr_highlighted_message_text_color">@color/vector_fuchsia_color</item>
<item name="vctr_highlighted_searched_message_text_color">@color/primary_color_light</item> <item name="vctr_highlighted_searched_message_text_color">@color/primary_color_light</item>
<item name="vctr_search_mode_room_name_text_color">#CCC3C3C3</item> <item name="vctr_search_mode_room_name_text_color">#CCC3C3C3</item>

View File

@ -93,7 +93,7 @@
<item name="vctr_message_text_color">@color/riot_primary_text_color_light</item> <item name="vctr_message_text_color">@color/riot_primary_text_color_light</item>
<item name="vctr_notice_text_color">#FF61708b</item> <item name="vctr_notice_text_color">#FF61708b</item>
<item name="vctr_encrypting_message_text_color">@color/accent_color_light</item> <item name="vctr_encrypting_message_text_color">@color/accent_color_light</item>
<item name="vctr_sending_message_text_color">?android:textColorSecondary</item> <item name="vctr_sending_message_text_color">@color/riotx_text_secondary_light</item>
<item name="vctr_highlighted_message_text_color">@color/vector_fuchsia_color</item> <item name="vctr_highlighted_message_text_color">@color/vector_fuchsia_color</item>
<item name="vctr_highlighted_searched_message_text_color">@color/primary_color_light</item> <item name="vctr_highlighted_searched_message_text_color">@color/primary_color_light</item>
<item name="vctr_search_mode_room_name_text_color">#333C3C3C</item> <item name="vctr_search_mode_room_name_text_color">#333C3C3C</item>