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

Fixes the black dot of doom

parent 895a1fa9
Branches
Tags
No related merge requests found
Pipeline #
...@@ -39,6 +39,7 @@ import de.kuschku.quasseldroid.settings.AutoCompleteSettings ...@@ -39,6 +39,7 @@ import de.kuschku.quasseldroid.settings.AutoCompleteSettings
import de.kuschku.quasseldroid.settings.MessageSettings import de.kuschku.quasseldroid.settings.MessageSettings
import de.kuschku.quasseldroid.ui.chat.input.* import de.kuschku.quasseldroid.ui.chat.input.*
import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
import de.kuschku.quasseldroid.util.compatibility.AndroidCrashFixer
import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer
import de.kuschku.quasseldroid.viewmodel.EditorViewModel import de.kuschku.quasseldroid.viewmodel.EditorViewModel
...@@ -130,7 +131,7 @@ class AliasItemFragment : SettingsFragment(), SettingsFragment.Savable, ...@@ -130,7 +131,7 @@ class AliasItemFragment : SettingsFragment(), SettingsFragment.Savable,
} }
rule?.let { data -> rule?.let { data ->
name.setText(data.name) name.setText(AndroidCrashFixer.removeCrashableCharacters(data.name))
expansion.setText(formatDeserializer.formatString(data.expansion, true)) expansion.setText(formatDeserializer.formatString(data.expansion, true))
} }
......
/*
* Quasseldroid - Quassel client for Android
*
* Copyright (c) 2018 Janne Koschinski
* Copyright (c) 2018 The Quassel Project
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3 as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.kuschku.quasseldroid.util.compatibility
object AndroidCrashFixer {
fun removeCrashableCharacters(text: String): String {
var previousRtlModifier = 0.toChar()
return text.fold(StringBuilder()) { builder, char ->
previousRtlModifier = if (char != '\u200E' && char != '\u200F') {
if (!char.isWhitespace()) {
if (previousRtlModifier != 0.toChar()) {
builder.append(previousRtlModifier)
}
builder.append(char)
0.toChar()
} else {
builder.append(char)
previousRtlModifier
}
} else {
char
}
builder
}.toString()
}
}
...@@ -23,6 +23,7 @@ import android.content.Context ...@@ -23,6 +23,7 @@ import android.content.Context
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.text.Spanned import android.text.Spanned
import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.util.compatibility.AndroidCrashFixer
import de.kuschku.quasseldroid.util.helper.getColorCompat import de.kuschku.quasseldroid.util.helper.getColorCompat
import de.kuschku.quasseldroid.util.irc.format.spans.* import de.kuschku.quasseldroid.util.irc.format.spans.*
import javax.inject.Inject import javax.inject.Inject
...@@ -66,8 +67,10 @@ class IrcFormatDeserializer @Inject constructor(context: Context) { ...@@ -66,8 +67,10 @@ class IrcFormatDeserializer @Inject constructor(context: Context) {
* @param str mIRC formatted String * @param str mIRC formatted String
* @return a CharSequence with Android’s span format representing the input string * @return a CharSequence with Android’s span format representing the input string
*/ */
fun formatString(str: String?, colorize: Boolean): CharSequence { fun formatString(content: String?, colorize: Boolean): CharSequence {
if (str == null) return "" if (content == null) return ""
val str = AndroidCrashFixer.removeCrashableCharacters(content)
val plainText = SpannableStringBuilder() val plainText = SpannableStringBuilder()
var bold: FormatDescription<BoldIrcFormat>? = null var bold: FormatDescription<BoldIrcFormat>? = null
......
package de.kuschku.quasseldroid.util.compatibility
import org.junit.Assert.assertFalse
import org.junit.Test
class AndroidCrashFixerTest {
private val crashingText = "<⚫> \uD83D\uDC48\uD83C\uDFFB \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u2067\u202E"
@Test
fun removeCrashableCharacters() {
val result = AndroidCrashFixer.removeCrashableCharacters(crashingText)
assertFalse(Regex("\u200F\\s*\u200E").containsMatchIn(result))
assertFalse(Regex("\u200E\\s*\u200F").containsMatchIn(result))
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment