Skip to content
Snippets Groups Projects
Verified Commit b4e3f68c authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Only expand messages which have spoilers

parent d9976ecf
No related branches found
No related tags found
No related merge requests found
......@@ -352,7 +352,7 @@ class QuasselNotificationBackend @Inject constructor(
selfColor = selfColor
))
}
val content = contentFormatter.formatContent(it.content, false, false, it.networkId)
val (content, _) = contentFormatter.formatContent(it.content, false, false, it.networkId)
NotificationMessage(
messageId = it.messageId,
......
......@@ -253,7 +253,7 @@ class MessageListFragment : ServiceBoundFragment() {
1 -> actionMode?.menu?.findItem(R.id.action_user_info)?.isVisible = true
else -> actionMode?.menu?.findItem(R.id.action_user_info)?.isVisible = false
}
} else {
} else if (msg.hasSpoilers) {
val value = viewModel.expandedMessages.value
viewModel.expandedMessages.onNext(
if (value.contains(msg.original.messageId)) value - msg.original.messageId
......
......@@ -257,7 +257,7 @@ class QuasselMessageRenderer @Inject constructor(
false
))
}
val content = contentFormatter.formatContent(message.content.content,
val (content, hasSpoilers) = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
......@@ -291,7 +291,8 @@ class QuasselMessageRenderer @Inject constructor(
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
}
Message_Type.Action -> {
......@@ -308,6 +309,11 @@ class QuasselMessageRenderer @Inject constructor(
}
val senderColor = if (useSelfColor) selfColor else senderColors[senderColorIndex]
val (content, hasSpoilers) = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
......@@ -316,20 +322,23 @@ class QuasselMessageRenderer @Inject constructor(
context.getString(R.string.message_format_action),
contentFormatter.formatPrefix(message.content.senderPrefixes),
contentFormatter.formatNick(message.content.sender, self, monochromeForeground, false),
contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
content
),
avatarUrls = AvatarHelper.avatar(messageSettings, message.content, avatarSize),
fallbackDrawable = colorContext.buildTextDrawable(initial, senderColor),
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
}
Message_Type.Notice -> FormattedMessage(
Message_Type.Notice -> {
val (content, hasSpoilers) = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
......@@ -337,16 +346,15 @@ class QuasselMessageRenderer @Inject constructor(
context.getString(R.string.message_format_notice),
contentFormatter.formatPrefix(message.content.senderPrefixes),
contentFormatter.formatNick(message.content.sender, self, monochromeForeground, false),
contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
content
),
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
}
Message_Type.Nick -> {
val nickSelf = message.content.sender == message.content.content || self
FormattedMessage(
......@@ -386,7 +394,8 @@ class QuasselMessageRenderer @Inject constructor(
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = false
)
}
Message_Type.Mode -> FormattedMessage(
......@@ -402,7 +411,8 @@ class QuasselMessageRenderer @Inject constructor(
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = false
)
Message_Type.Join -> FormattedMessage(
original = message.content,
......@@ -422,13 +432,12 @@ class QuasselMessageRenderer @Inject constructor(
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = false
)
Message_Type.Part -> FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = if (message.content.content.isBlank()) {
Message_Type.Part -> {
val (content, hasSpoilers) = if (message.content.content.isBlank()) {
Pair(
SpanFormatter.format(
context.getString(R.string.message_format_part_1),
contentFormatter.formatPrefix(message.content.senderPrefixes),
......@@ -438,8 +447,15 @@ class QuasselMessageRenderer @Inject constructor(
monochromeForeground,
messageSettings.showHostmaskActions
)
),
false
)
} else {
val (content, hasSpoilers) = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
Pair(
SpanFormatter.format(
context.getString(R.string.message_format_part_2),
contentFormatter.formatPrefix(message.content.senderPrefixes),
......@@ -449,22 +465,27 @@ class QuasselMessageRenderer @Inject constructor(
monochromeForeground,
messageSettings.showHostmaskActions
),
contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
content
),
hasSpoilers
)
},
}
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = content,
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
Message_Type.Quit -> FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = if (message.content.content.isBlank()) {
}
Message_Type.Quit -> {
val (content, hasSpoilers) = if (message.content.content.isBlank()) {
Pair(
SpanFormatter.format(
context.getString(R.string.message_format_quit_1),
contentFormatter.formatPrefix(message.content.senderPrefixes),
......@@ -474,8 +495,15 @@ class QuasselMessageRenderer @Inject constructor(
monochromeForeground,
messageSettings.showHostmaskActions
)
),
false
)
} else {
val (content, hasSpoilers) = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
Pair(
SpanFormatter.format(
context.getString(R.string.message_format_quit_2),
contentFormatter.formatPrefix(message.content.senderPrefixes),
......@@ -485,24 +513,28 @@ class QuasselMessageRenderer @Inject constructor(
monochromeForeground,
messageSettings.showHostmaskActions
),
contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
content
),
hasSpoilers
)
},
}
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = content,
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
}
Message_Type.Kick -> {
val (user, reason) = message.content.content.split(' ', limit = 2) + listOf("", "")
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = if (reason.isBlank()) {
val (content, hasSpoilers) = if (reason.isBlank()) {
Pair(
SpanFormatter.format(
context.getString(R.string.message_format_kick_1),
contentFormatter.formatNick(user, false, monochromeForeground, false),
......@@ -511,8 +543,15 @@ class QuasselMessageRenderer @Inject constructor(
self,
monochromeForeground,
false)
),
false
)
} else {
val (content, hasSpoilers) = contentFormatter.formatContent(reason,
monochromeForeground,
message.isExpanded,
message.content.networkId)
Pair(
SpanFormatter.format(
context.getString(R.string.message_format_kick_2),
contentFormatter.formatNick(user, false, monochromeForeground, false),
......@@ -521,25 +560,28 @@ class QuasselMessageRenderer @Inject constructor(
self,
monochromeForeground,
false),
contentFormatter.formatContent(reason,
monochromeForeground,
message.isExpanded,
message.content.networkId)
content
),
hasSpoilers
)
},
}
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = content,
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
}
Message_Type.Kill -> {
val (user, reason) = message.content.content.split(' ', limit = 2) + listOf("", "")
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = if (reason.isBlank()) {
val (content, hasSpoilers) = if (reason.isBlank()) {
Pair(
SpanFormatter.format(
context.getString(R.string.message_format_kill_1),
contentFormatter.formatNick(user, false, monochromeForeground, false),
......@@ -548,8 +590,15 @@ class QuasselMessageRenderer @Inject constructor(
self,
monochromeForeground,
false)
),
false
)
} else {
val (content, hasSpoilers) = contentFormatter.formatContent(reason,
monochromeForeground,
message.isExpanded,
message.content.networkId)
Pair(
SpanFormatter.format(
context.getString(R.string.message_format_kill_2),
contentFormatter.formatNick(user, false, monochromeForeground, false),
......@@ -558,16 +607,22 @@ class QuasselMessageRenderer @Inject constructor(
self,
monochromeForeground,
false),
contentFormatter.formatContent(reason,
monochromeForeground,
message.isExpanded,
message.content.networkId)
content
),
hasSpoilers
)
},
}
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = content,
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
}
Message_Type.NetsplitJoin -> {
......@@ -593,7 +648,8 @@ class QuasselMessageRenderer @Inject constructor(
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = false
)
}
Message_Type.NetsplitQuit -> {
......@@ -619,37 +675,46 @@ class QuasselMessageRenderer @Inject constructor(
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = false
)
}
Message_Type.Server,
Message_Type.Info,
Message_Type.Error -> FormattedMessage(
Message_Type.Error -> {
val (content, hasSpoilers) = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId),
combined = content,
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
Message_Type.Topic -> FormattedMessage(
}
Message_Type.Topic -> {
val (content, hasSpoilers) = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId),
combined = content,
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
}
Message_Type.DayChange -> FormattedMessage(
original = message.content,
time = "",
......@@ -658,21 +723,26 @@ class QuasselMessageRenderer @Inject constructor(
hasDayChange = message.hasDayChange,
isMarkerLine = false,
isExpanded = false,
isSelected = false
isSelected = false,
hasSpoilers = false
)
Message_Type.Invite -> FormattedMessage(
Message_Type.Invite -> {
val (content, hasSpoilers) = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId)
FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message),
combined = contentFormatter.formatContent(message.content.content,
monochromeForeground,
message.isExpanded,
message.content.networkId),
combined = content,
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = hasSpoilers
)
}
else -> FormattedMessage(
original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)),
......@@ -692,7 +762,8 @@ class QuasselMessageRenderer @Inject constructor(
hasDayChange = message.hasDayChange,
isMarkerLine = message.isMarkerLine,
isExpanded = message.isExpanded,
isSelected = message.isSelected
isSelected = message.isSelected,
hasSpoilers = false
)
}
}
......
......@@ -109,8 +109,11 @@ class ChannelInfoFragment : ServiceBoundFragment() {
}
}.toLiveData().observe(this, Observer { (info, channel) ->
name.text = channel.name()
topic.text = contentFormatter.formatContent(channel.topic(),
networkId = channel.network().networkId())
val (content, hasSpoilers) = contentFormatter.formatContent(
channel.topic(),
networkId = channel.network().networkId()
)
topic.text = content
currentBufferInfo = info
actionShortcut.visibleIf(info != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
......
......@@ -108,7 +108,11 @@ class ChannelListAdapter @Inject constructor(
fun bind(data: IrcListHelper.ChannelDescription) {
name.text = data.channelName
topic.text = contentFormatter.formatContent(data.topic, networkId = data.netId)
val (content, hasSpoilers) = contentFormatter.formatContent(
data.topic,
networkId = data.netId
)
topic.text = content
users.text = itemView.context.resources.getQuantityString(R.plurals.label_user_count,
data.userCount.toInt(),
data.userCount.toInt())
......
......@@ -225,8 +225,11 @@ class UserInfoFragment : ServiceBoundFragment() {
}
nick.text = user.nick
realName.text = contentFormatter.formatContent(user.realName ?: "",
networkId = user.networkId)
val (content, hasSpoilers) = contentFormatter.formatContent(
user.realName ?: "",
networkId = user.networkId
)
realName.text = content
realName.visibleIf(!user.realName.isNullOrBlank() && user.realName != user.nick)
awayMessage.text = user.awayMessage.nullIf { it.isNullOrBlank() } ?: SpannableString(
......
......@@ -79,8 +79,8 @@ class ContentFormatter @Inject constructor(
fun formatContent(content: String,
highlight: Boolean = false,
showSpoilers: Boolean = false,
networkId: NetworkId?): CharSequence {
unhideSpoilers: Boolean = false,
networkId: NetworkId?): Pair<CharSequence, Boolean> {
val spans = mutableListOf<FormatInfo>()
val formattedText = SpannableString(
ircFormatDeserializer.formatString(
......@@ -90,7 +90,7 @@ class ContentFormatter @Inject constructor(
)
)
if (showSpoilers) {
val hasSpoilers = if (unhideSpoilers) {
spans.removeAll {
when {
it.format is IrcFormat.Color ->
......@@ -101,6 +101,17 @@ class ContentFormatter @Inject constructor(
false
}
}
} else {
spans.any {
when {
it.format is IrcFormat.Color ->
it.format.foreground == it.format.background
it.format is IrcFormat.Hex ->
it.format.foreground == it.format.background
else ->
false
}
}
}
for (result in urlPattern.findAll(formattedText)) {
......@@ -131,7 +142,7 @@ class ContentFormatter @Inject constructor(
span.apply(formattedText)
}
return formattedText
return Pair(formattedText, hasSpoilers)
}
private fun formatNickNickImpl(nick: String, self: Boolean, colorize: Boolean,
......
......@@ -36,7 +36,8 @@ class FormattedMessage(
val hasDayChange: Boolean,
val isSelected: Boolean,
val isExpanded: Boolean,
val isMarkerLine: Boolean
val isMarkerLine: Boolean,
val hasSpoilers: Boolean
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment