diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt index 3b5254bce009e6b2130d323ef86bc51e6a1a7577..7b5a0cce591600bd70fd7fdd6827bef451458745 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt @@ -42,6 +42,7 @@ import de.kuschku.quasseldroid.util.avatars.AvatarHelper import de.kuschku.quasseldroid.util.helper.styledAttributes import de.kuschku.quasseldroid.util.helper.visibleIf import de.kuschku.quasseldroid.util.irc.format.ContentFormatter +import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer import de.kuschku.quasseldroid.util.ui.SpanFormatter import de.kuschku.quasseldroid.util.ui.TextDrawable import de.kuschku.quasseldroid.viewmodel.data.FormattedMessage @@ -55,7 +56,8 @@ import kotlin.math.roundToInt class QuasselMessageRenderer @Inject constructor( context: Context, private val messageSettings: MessageSettings, - private val contentFormatter: ContentFormatter + private val contentFormatter: ContentFormatter, + private val ircFormatDeserializer: IrcFormatDeserializer ) : MessageRenderer { private val timeFormatter = DateTimeFormatter.ofPattern( timePattern(messageSettings.showSeconds, messageSettings.use24hClock) @@ -85,6 +87,12 @@ class QuasselMessageRenderer @Inject constructor( } } + private val monochromeHighlights = context.theme.styledAttributes( + R.attr.colorForegroundHighlightMonochrome + ) { + getBoolean(0, false) + } + private val selfColor: Int = context.theme.styledAttributes(R.attr.colorForegroundSecondary) { getColor(0, 0) } @@ -111,19 +119,19 @@ class QuasselMessageRenderer @Inject constructor( isEmoji: Boolean) { if (hasHighlight) { viewHolder.itemView.context.theme.styledAttributes( - R.attr.colorForegroundHighlight, R.attr.colorBackgroundHighlight, - R.attr.backgroundMenuItem + R.attr.colorForegroundHighlight, R.attr.colorForegroundHighlightSecondary, + R.attr.colorBackgroundHighlight, R.attr.backgroundMenuItem ) { - viewHolder.timeLeft?.setTextColor(getColor(0, 0)) - viewHolder.timeRight?.setTextColor(getColor(0, 0)) - viewHolder.name?.setTextColor(getColor(0, 0)) - viewHolder.realname?.setTextColor(getColor(0, 0)) + viewHolder.timeLeft?.setTextColor(getColor(1, 0)) + viewHolder.timeRight?.setTextColor(getColor(1, 0)) + viewHolder.name?.setTextColor(getColor(1, 0)) + viewHolder.realname?.setTextColor(getColor(1, 0)) viewHolder.combined?.setTextColor(getColor(0, 0)) viewHolder.content?.setTextColor(getColor(0, 0)) viewHolder.itemView.background = LayerDrawable( arrayOf( - ColorDrawable(getColor(1, 0)), - getDrawable(2) + ColorDrawable(getColor(2, 0)), + getDrawable(3) ) ) } @@ -197,20 +205,22 @@ class QuasselMessageRenderer @Inject constructor( ).roundToInt() val self = message.content.flag.hasFlag(Message_Flag.Self) - val highlight = message.content.flag.hasFlag(Message_Flag.Highlight) + val highlight__ = message.content.flag.hasFlag(Message_Flag.Highlight) + val monochromeForeground = highlight__ && monochromeHighlights return when (message.content.type.enabledValues().firstOrNull()) { Message_Type.Plain -> { - val realName = contentFormatter.formatContent(message.content.realName, highlight) + val realName = ircFormatDeserializer.formatString(message.content.realName, + !monochromeForeground) val nick = SpannableStringBuilder().apply { append(contentFormatter.formatPrefix(message.content.senderPrefixes)) append(contentFormatter.formatNick( message.content.sender, self, - highlight, + monochromeForeground, false )) } - val content = contentFormatter.formatContent(message.content.content, highlight) + val content = contentFormatter.formatContent(message.content.content, monochromeForeground) val nickName = HostmaskHelper.nick(message.content.sender) val senderColorIndex = SenderColorUtil.senderColor(nickName) val rawInitial = nickName.trimStart('-', '_', '[', ']', '{', '}', '|', '`', '^', '.', '\\') @@ -254,8 +264,8 @@ class QuasselMessageRenderer @Inject constructor( combined = SpanFormatter.format( context.getString(R.string.message_format_action), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, self, highlight, false), - contentFormatter.formatContent(message.content.content, highlight) + contentFormatter.formatNick(message.content.sender, self, monochromeForeground, false), + contentFormatter.formatContent(message.content.content, monochromeForeground) ), hasDayChange = message.hasDayChange, isMarkerLine = message.isMarkerLine, @@ -269,8 +279,8 @@ class QuasselMessageRenderer @Inject constructor( combined = SpanFormatter.format( context.getString(R.string.message_format_notice), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, self, highlight, false), - contentFormatter.formatContent(message.content.content, highlight) + contentFormatter.formatNick(message.content.sender, self, monochromeForeground, false), + contentFormatter.formatContent(message.content.content, monochromeForeground) ), hasDayChange = message.hasDayChange, isMarkerLine = message.isMarkerLine, @@ -287,15 +297,30 @@ class QuasselMessageRenderer @Inject constructor( SpanFormatter.format( context.getString(R.string.message_format_nick_self), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, nickSelf, highlight, false) + contentFormatter.formatNick( + message.content.sender, + nickSelf, + monochromeForeground, + false + ) ) } else { SpanFormatter.format( context.getString(R.string.message_format_nick), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, nickSelf, highlight, false), + contentFormatter.formatNick( + message.content.sender, + nickSelf, + monochromeForeground, + false + ), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.content, nickSelf, highlight, false) + contentFormatter.formatNick( + message.content.content, + nickSelf, + monochromeForeground, + false + ) ) }, hasDayChange = message.hasDayChange, @@ -312,7 +337,7 @@ class QuasselMessageRenderer @Inject constructor( context.getString(R.string.message_format_mode), message.content.content, contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, self, highlight, false) + contentFormatter.formatNick(message.content.sender, self, monochromeForeground, false) ), hasDayChange = message.hasDayChange, isMarkerLine = message.isMarkerLine, @@ -326,10 +351,12 @@ class QuasselMessageRenderer @Inject constructor( combined = SpanFormatter.format( context.getString(R.string.message_format_join), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions), + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ), message.content.content ), hasDayChange = message.hasDayChange, @@ -345,20 +372,24 @@ class QuasselMessageRenderer @Inject constructor( SpanFormatter.format( context.getString(R.string.message_format_part_1), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions) + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ) ) } else { SpanFormatter.format( context.getString(R.string.message_format_part_2), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions), - contentFormatter.formatContent(message.content.content, highlight) + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ), + contentFormatter.formatContent(message.content.content, monochromeForeground) ) }, hasDayChange = message.hasDayChange, @@ -374,20 +405,24 @@ class QuasselMessageRenderer @Inject constructor( SpanFormatter.format( context.getString(R.string.message_format_quit_1), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions) + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ) ) } else { SpanFormatter.format( context.getString(R.string.message_format_quit_2), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions), - contentFormatter.formatContent(message.content.content, highlight) + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ), + contentFormatter.formatContent(message.content.content, monochromeForeground) ) }, hasDayChange = message.hasDayChange, @@ -404,23 +439,27 @@ class QuasselMessageRenderer @Inject constructor( combined = if (reason.isBlank()) { SpanFormatter.format( context.getString(R.string.message_format_kick_1), - contentFormatter.formatNick(user, false, highlight, false), + contentFormatter.formatNick(user, false, monochromeForeground, false), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions) + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ) ) } else { SpanFormatter.format( context.getString(R.string.message_format_kick_2), - contentFormatter.formatNick(user, false, highlight, false), + contentFormatter.formatNick(user, false, monochromeForeground, false), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions), - contentFormatter.formatContent(reason, highlight) + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ), + contentFormatter.formatContent(reason, monochromeForeground) ) }, hasDayChange = message.hasDayChange, @@ -438,23 +477,27 @@ class QuasselMessageRenderer @Inject constructor( combined = if (reason.isBlank()) { SpanFormatter.format( context.getString(R.string.message_format_kill_1), - contentFormatter.formatNick(user, false, highlight, false), + contentFormatter.formatNick(user, false, monochromeForeground, false), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions) + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ) ) } else { SpanFormatter.format( context.getString(R.string.message_format_kill_2), - contentFormatter.formatNick(user, false, highlight, false), + contentFormatter.formatNick(user, false, monochromeForeground, false), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions), - contentFormatter.formatContent(reason, highlight) + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ), + contentFormatter.formatContent(reason, monochromeForeground) ) }, hasDayChange = message.hasDayChange, @@ -503,7 +546,7 @@ class QuasselMessageRenderer @Inject constructor( id = message.content.messageId, time = timeFormatter.format(message.content.time.atZone(zoneId)), dayChange = formatDayChange(message), - combined = contentFormatter.formatContent(message.content.content, highlight), + combined = contentFormatter.formatContent(message.content.content, monochromeForeground), hasDayChange = message.hasDayChange, isMarkerLine = message.isMarkerLine, isExpanded = message.isExpanded, @@ -513,7 +556,7 @@ class QuasselMessageRenderer @Inject constructor( id = message.content.messageId, time = timeFormatter.format(message.content.time.atZone(zoneId)), dayChange = formatDayChange(message), - combined = contentFormatter.formatContent(message.content.content, highlight), + combined = contentFormatter.formatContent(message.content.content, monochromeForeground), hasDayChange = message.hasDayChange, isMarkerLine = message.isMarkerLine, isExpanded = message.isExpanded, @@ -538,10 +581,12 @@ class QuasselMessageRenderer @Inject constructor( "[%d] %s%s: %s", message.content.type.toInt(), contentFormatter.formatPrefix(message.content.senderPrefixes), - contentFormatter.formatNick(message.content.sender, - self, - highlight, - messageSettings.showHostmaskActions), + contentFormatter.formatNick( + message.content.sender, + self, + monochromeForeground, + messageSettings.showHostmaskActions + ), message.content.content ), hasDayChange = message.hasDayChange, diff --git a/app/src/main/res/layout/widget_chatmessage_plain.xml b/app/src/main/res/layout/widget_chatmessage_plain.xml index 41e70526a9804595e3699d2e549a87c6a4047df7..798547197df2c1501427ebf491ca9d8081c70ddd 100644 --- a/app/src/main/res/layout/widget_chatmessage_plain.xml +++ b/app/src/main/res/layout/widget_chatmessage_plain.xml @@ -87,7 +87,7 @@ android:layout_gravity="center_vertical" android:ellipsize="marquee" android:singleLine="true" - android:textColor="?attr/colorForeground" + android:textColor="?attr/colorForegroundSecondary" android:visibility="gone" tools:text="@sample/messages.json/data/sender" tools:visibility="visible" /> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 7ac8230abd418a420902d63e1a11869581eb4bd7..6efa6e004d543c800e3c6737b23867844c219221 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -39,11 +39,14 @@ <!-- Background and foreground colors for UI --> <attr name="colorForeground" format="color" /> <attr name="colorForegroundHighlight" format="color" /> + <attr name="colorForegroundHighlightSecondary" format="color" /> <attr name="colorForegroundSecondary" format="color" /> <attr name="colorForegroundNotice" format="color" /> <attr name="colorForegroundAction" format="color" /> <attr name="colorForegroundError" format="color" /> + <attr name="colorForegroundHighlightMonochrome" format="boolean" /> + <attr name="colorForegroundMirc" format="integer" /> <attr name="colorTextPrimary" format="color" /> diff --git a/app/src/main/res/values/themes_amoled.xml b/app/src/main/res/values/themes_amoled.xml index e2db709aeeda68537fb359455a855535e77f1cd9..ec3b486dc23a7e90ffe09bf5acaf01e1bdc3dd46 100644 --- a/app/src/main/res/values/themes_amoled.xml +++ b/app/src/main/res/values/themes_amoled.xml @@ -52,6 +52,7 @@ <item name="colorForeground">#FFFFFF</item> <item name="colorForegroundHighlight">#FFFFFF</item> + <item name="colorForegroundHighlightSecondary">#B3FFFFFF</item> <item name="colorForegroundSecondary">#B3FFFFFF</item> <item name="colorForegroundAction">#7986cb</item> <item name="colorForegroundNotice">#916409</item> diff --git a/app/src/main/res/values/themes_base.xml b/app/src/main/res/values/themes_base.xml index c796a2468105c74ecb635e34d9395771c5034826..db4dabe84d6e82f959f0d5b0b287e8da9bf16e6d 100644 --- a/app/src/main/res/values/themes_base.xml +++ b/app/src/main/res/values/themes_base.xml @@ -101,6 +101,8 @@ <item name="colorDivider">#1FFFFFFF</item> <item name="android:textColorHint">?colorTextSecondary</item> + <item name="colorForegroundHighlightMonochrome">false</item> + <item name="colorFill">@color/colorFillDark</item> <item name="colorOffline">@color/colorOfflineDark</item> <item name="colorAway">@color/colorAwayDark</item> @@ -137,6 +139,8 @@ <item name="colorDivider">#1F000000</item> <item name="android:textColorHint">?colorTextSecondary</item> + <item name="colorForegroundHighlightMonochrome">false</item> + <item name="colorFill">@color/colorFillLight</item> <item name="colorOffline">@color/colorOfflineLight</item> <item name="colorAway">@color/colorAwayLight</item> diff --git a/app/src/main/res/values/themes_dracula.xml b/app/src/main/res/values/themes_dracula.xml index efa5ed0ceed1331bd56c7a2c159b5db25c1de4d1..39ca255b64514c3998ec16997dbb70917c03eb2e 100644 --- a/app/src/main/res/values/themes_dracula.xml +++ b/app/src/main/res/values/themes_dracula.xml @@ -46,6 +46,7 @@ <item name="colorForeground">#f8f8f2</item> <item name="colorForegroundHighlight">#f8f8f2</item> + <item name="colorForegroundHighlightSecondary">#6272a4</item> <item name="colorForegroundSecondary">#6272a4</item> <item name="colorForegroundAction">#50fa7b</item> <item name="colorForegroundNotice">#44475a</item> diff --git a/app/src/main/res/values/themes_gruvbox.xml b/app/src/main/res/values/themes_gruvbox.xml index d3ddcc126fe68f25e6a172c9a37050a2b808c839..237c1694f7aa71324ea5fcb34a1a0b878e6e6b1c 100644 --- a/app/src/main/res/values/themes_gruvbox.xml +++ b/app/src/main/res/values/themes_gruvbox.xml @@ -46,6 +46,7 @@ <item name="colorForeground">#3c3836</item> <item name="colorForegroundHighlight">#3c3836</item> + <item name="colorForegroundHighlightSecondary">#665c54</item> <item name="colorForegroundSecondary">#665c54</item> <item name="colorForegroundAction">#076678</item> <item name="colorForegroundNotice">#b57614</item> @@ -106,6 +107,7 @@ <item name="colorForeground">#dbdbb2</item> <item name="colorForegroundHighlight">#dbdbb2</item> + <item name="colorForegroundHighlightSecondary">#bdae93</item> <item name="colorForegroundSecondary">#bdae93</item> <item name="colorForegroundAction">#458588</item> <item name="colorForegroundNotice">#d79921</item> diff --git a/app/src/main/res/values/themes_material.xml b/app/src/main/res/values/themes_material.xml index 9d4bb747e9af235afd5e2723669793eb1baa4a5c..68ec5e4729bd3c3cf39dccd3b1c4dd54ffecbbe8 100644 --- a/app/src/main/res/values/themes_material.xml +++ b/app/src/main/res/values/themes_material.xml @@ -48,6 +48,7 @@ <item name="colorForeground">#DE000000</item> <item name="colorForegroundHighlight">#DE000000</item> + <item name="colorForegroundHighlightSecondary">#8A000000</item> <item name="colorForegroundSecondary">#8A000000</item> <item name="colorForegroundAction">#01579B</item> <item name="colorForegroundNotice">#B56A00</item> @@ -101,6 +102,7 @@ <item name="colorForeground">#FFFFFF</item> <item name="colorForegroundHighlight">#FFFFFF</item> + <item name="colorForegroundHighlightSecondary">#B3FFFFFF</item> <item name="colorForegroundSecondary">#B3FFFFFF</item> <item name="colorForegroundAction">#448AFF</item> <item name="colorForegroundNotice">#FFD740</item> diff --git a/app/src/main/res/values/themes_quassel.xml b/app/src/main/res/values/themes_quassel.xml index 3676233a893ef77259fab241784b1aba7335858a..41dfcff63fdb401641f5144ea6f7a7441c2dee8c 100644 --- a/app/src/main/res/values/themes_quassel.xml +++ b/app/src/main/res/values/themes_quassel.xml @@ -48,11 +48,14 @@ <item name="colorForeground">#DE000000</item> <item name="colorForegroundHighlight">#DE000000</item> + <item name="colorForegroundHighlightSecondary">#8A000000</item> <item name="colorForegroundSecondary">#8A000000</item> <item name="colorForegroundAction">#1a237e</item> <item name="colorForegroundNotice">#916409</item> <item name="colorForegroundError">#800000</item> + <item name="colorForegroundHighlightMonochrome">true</item> + <item name="colorForegroundMirc">0x1</item> <item name="android:windowBackground">@color/quassel_light_background</item> @@ -101,11 +104,14 @@ <item name="colorForeground">#FFFFFF</item> <item name="colorForegroundHighlight">#DE000000</item> + <item name="colorForegroundHighlightSecondary">#8A000000</item> <item name="colorForegroundSecondary">#B3FFFFFF</item> <item name="colorForegroundAction">#7986cb</item> <item name="colorForegroundNotice">#916409</item> <item name="colorForegroundError">#800000</item> + <item name="colorForegroundHighlightMonochrome">true</item> + <item name="colorForegroundMirc">0x0</item> <item name="android:windowBackground">@color/quassel_dark_background</item> diff --git a/app/src/main/res/values/themes_solarized.xml b/app/src/main/res/values/themes_solarized.xml index c1adef81ac06f462a246fd807a69e402b9f4da35..9d5319b21b856e1e2c0057e2c24134be32a8ccd4 100644 --- a/app/src/main/res/values/themes_solarized.xml +++ b/app/src/main/res/values/themes_solarized.xml @@ -46,6 +46,7 @@ <item name="colorForeground">#586e75</item> <item name="colorForegroundHighlight">#586e75</item> + <item name="colorForegroundHighlightSecondary">#657b83</item> <item name="colorForegroundSecondary">#657b83</item> <item name="colorForegroundAction">#268BD2</item> <item name="colorForegroundNotice">#B58900</item> @@ -106,6 +107,7 @@ <item name="colorForeground">#93a1a1</item> <item name="colorForegroundHighlight">#93a1a1</item> + <item name="colorForegroundHighlightSecondary">#839496</item> <item name="colorForegroundSecondary">#839496</item> <item name="colorForegroundAction">#268BD2</item> <item name="colorForegroundNotice">#B58900</item>