From e9f62c630f8baacbe0913c6a17ff5c24bcf54673 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 26 Apr 2018 03:10:30 +0200
Subject: [PATCH] Minor bugfixes and dependency graph fixes

- Context is passed in constructor
- Networks that changed connectivity did not properly show/hide in the
  buffer list before

Signed-off-by: Janne Koschinski <janne@kuschku.de>
---
 .../quasseldroid/dagger/ActivityModule.kt     | 86 +++++++++++------
 .../quasseldroid/dagger/ActivityScope.kt      | 29 ++++++
 .../quasseldroid/dagger/AppComponent.kt       |  4 +-
 .../kuschku/quasseldroid/dagger/AppModule.kt  |  5 +-
 .../service/QuasselServiceModule.kt           | 33 +++++++
 .../quasseldroid/ui/chat/ChatActivity.kt      |  2 +
 .../ui/chat/ChatFragmentProvider.kt           |  5 +
 .../quasseldroid/ui/chat/ToolbarFragment.kt   | 35 +------
 .../chat/buffers/BufferViewConfigFragment.kt  | 34 -------
 .../chat/info/channel/ChannelInfoFragment.kt  | 39 +-------
 .../channel/ChannelInfoFragmentProvider.kt    |  5 +
 .../ui/chat/info/user/UserInfoFragment.kt     | 34 +------
 .../info/user/UserInfoFragmentProvider.kt     |  5 +
 .../ui/chat/input/AutoCompleteHelper.kt       | 34 +------
 .../ui/chat/input/ChatlineFragment.kt         | 44 +--------
 .../ui/chat/messages/MessageAdapter.kt        |  5 -
 .../ui/chat/messages/MessageListFragment.kt   |  2 -
 .../ui/chat/messages/MessageRenderer.kt       |  2 -
 .../chat/messages/QuasselMessageRenderer.kt   | 85 +++++------------
 .../ui/chat/nicks/NickListFragment.kt         | 34 +------
 .../ui/chat/topic/TopicFragment.kt            | 51 +---------
 .../ui/chat/topic/TopicFragmentProvider.kt    |  5 +
 .../about/AboutFragmentProvider.kt            |  5 +
 .../client/ClientSettingsFragmentProvider.kt  |  5 +
 .../crash/CrashFragmentProvider.kt            |  5 +
 .../license/LicenseFragmentProvider.kt        |  5 +
 .../whitelist/WhitelistFragmentProvider.kt    |  5 +
 .../CoreSettingsFragmentProvider.kt           |  5 +
 .../aliasitem/AliasItemFragment.kt            | 49 +---------
 .../aliasitem/AliasItemFragmentProvider.kt    |  5 +
 .../aliaslist/AliasListAdapter.kt             | 42 +--------
 .../aliaslist/AliasListFragment.kt            |  1 -
 .../aliaslist/AliasListFragmentProvider.kt    |  5 +
 .../ChatlistCreateFragmentProvider.kt         |  5 +
 .../chatlist/ChatlistEditFragmentProvider.kt  |  5 +
 .../HighlightListFragmentProvider.kt          |  5 +
 .../HighlightRuleFragmentProvider.kt          |  5 +
 .../IdentityCreateFragmentProvider.kt         |  5 +
 .../identity/IdentityEditFragmentProvider.kt  |  5 +
 .../ignoreitem/IgnoreItemFragmentProvider.kt  |  5 +
 .../ignorelist/IgnoreListFragmentProvider.kt  |  5 +
 .../network/NetworkCreateFragmentProvider.kt  |  5 +
 .../network/NetworkEditFragmentProvider.kt    |  5 +
 .../NetworkConfigFragmentProvider.kt          |  5 +
 .../NetworkServerFragmentProvider.kt          |  5 +
 .../setup/accounts/edit/AccountEditModule.kt  | 33 +++++++
 .../AccountSelectionFragmentProvider.kt       |  5 +
 .../setup/AccountSetupFragmentProvider.kt     |  5 +
 .../util/irc/format/ContentFormatter.kt       |  6 +-
 .../util/irc/format/IrcFormatDeserializer.kt  | 41 ++++++++-
 .../util/irc/format/IrcFormatSerializer.kt    | 62 +++++++++++--
 .../libquassel/quassel/syncables/Network.kt   |  5 +-
 .../viewmodel/QuasselViewModel.kt             | 92 +++++++++----------
 .../viewmodel/data/BufferProps.kt             |  1 +
 54 files changed, 471 insertions(+), 549 deletions(-)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityScope.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/service/QuasselServiceModule.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditModule.kt

diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
index 7fd7e6b02..daef1c0e8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
@@ -25,6 +25,7 @@ package de.kuschku.quasseldroid.dagger
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 import de.kuschku.quasseldroid.service.QuasselService
+import de.kuschku.quasseldroid.service.QuasselServiceModule
 import de.kuschku.quasseldroid.ui.chat.ChatActivity
 import de.kuschku.quasseldroid.ui.chat.ChatActivityModule
 import de.kuschku.quasseldroid.ui.chat.ChatFragmentProvider
@@ -75,6 +76,7 @@ import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigFragme
 import de.kuschku.quasseldroid.ui.coresettings.networkserver.NetworkServerActivity
 import de.kuschku.quasseldroid.ui.coresettings.networkserver.NetworkServerFragmentProvider
 import de.kuschku.quasseldroid.ui.setup.accounts.edit.AccountEditActivity
+import de.kuschku.quasseldroid.ui.setup.accounts.edit.AccountEditModule
 import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionActivity
 import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionFragmentProvider
 import de.kuschku.quasseldroid.ui.setup.accounts.setup.AccountSetupActivity
@@ -82,87 +84,115 @@ import de.kuschku.quasseldroid.ui.setup.accounts.setup.AccountSetupFragmentProvi
 
 @Module
 abstract class ActivityModule {
-  @ContributesAndroidInjector(modules = [ChatActivityModule::class, ChatFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [ChatActivityModule::class, ChatFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindChatActivity(): ChatActivity
 
-  @ContributesAndroidInjector(modules = [UserInfoFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [UserInfoFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindUserInfoActivity(): UserInfoActivity
 
-  @ContributesAndroidInjector(modules = [ChannelInfoFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [ChannelInfoFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindChannelInfoActivity(): ChannelInfoActivity
 
-  @ContributesAndroidInjector(modules = [TopicFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [TopicFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindTopicActivity(): TopicActivity
 
-  @ContributesAndroidInjector(modules = [ClientSettingsFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [ClientSettingsFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindClientSettingsActivity(): ClientSettingsActivity
 
-  @ContributesAndroidInjector(modules = [WhitelistFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [WhitelistFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindWhitelistActivity(): WhitelistActivity
 
-  @ContributesAndroidInjector(modules = [CrashFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [CrashFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindCrashActivity(): CrashActivity
 
-  @ContributesAndroidInjector(modules = [AboutFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [AboutFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindAboutActivity(): AboutActivity
 
-  @ContributesAndroidInjector(modules = [LicenseFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [LicenseFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindLicenseActivity(): LicenseActivity
 
-  @ContributesAndroidInjector(modules = [CoreSettingsFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [CoreSettingsFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindCoreSettingsActivity(): CoreSettingsActivity
 
-  @ContributesAndroidInjector(modules = [NetworkCreateFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [NetworkCreateFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindNetworkCreateActivity(): NetworkCreateActivity
 
-  @ContributesAndroidInjector(modules = [NetworkEditFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [NetworkEditFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindNetworkEditActivity(): NetworkEditActivity
 
-  @ContributesAndroidInjector(modules = [NetworkServerFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [NetworkServerFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindNetworkServerActivity(): NetworkServerActivity
 
-  @ContributesAndroidInjector(modules = [IdentityCreateFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [IdentityCreateFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindIdentityCreateActivity(): IdentityCreateActivity
 
-  @ContributesAndroidInjector(modules = [IdentityEditFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [IdentityEditFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindIdentityEditActivity(): IdentityEditActivity
 
-  @ContributesAndroidInjector(modules = [ChatlistCreateFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [ChatlistCreateFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindChatListCreateActivity(): ChatlistCreateActivity
 
-  @ContributesAndroidInjector(modules = [ChatlistEditFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [ChatlistEditFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindChatListEditActivity(): ChatlistEditActivity
 
-  @ContributesAndroidInjector(modules = [IgnoreListFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [IgnoreListFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindIgnoreListActivity(): IgnoreListActivity
 
-  @ContributesAndroidInjector(modules = [IgnoreItemFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [IgnoreItemFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindIgnoreItemActivity(): IgnoreItemActivity
 
-  @ContributesAndroidInjector(modules = [HighlightListFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [HighlightListFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindHighlightListActivity(): HighlightListActivity
 
-  @ContributesAndroidInjector(modules = [HighlightRuleFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [HighlightRuleFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindHighlightRuleActivity(): HighlightRuleActivity
 
-  @ContributesAndroidInjector(modules = [AliasListFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [AliasListFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindAliasListActivity(): AliasListActivity
 
-  @ContributesAndroidInjector(modules = [AliasItemFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [AliasItemFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindAliasItemActivity(): AliasItemActivity
 
-  @ContributesAndroidInjector(modules = [NetworkConfigFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [NetworkConfigFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindNetworkConfigActivity(): NetworkConfigActivity
 
-  @ContributesAndroidInjector(modules = [AccountSetupFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [AccountSetupFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindAccountSetupActivity(): AccountSetupActivity
 
-  @ContributesAndroidInjector(modules = [AccountSelectionFragmentProvider::class])
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [AccountSelectionFragmentProvider::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindAccountSelectionActivity(): AccountSelectionActivity
 
-  @ContributesAndroidInjector
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [AccountEditModule::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindAccountEditActivity(): AccountEditActivity
 
-  @ContributesAndroidInjector
+  @ActivityScope
+  @ContributesAndroidInjector(modules = [QuasselServiceModule::class, SettingsModule::class, DatabaseModule::class])
   abstract fun bindQuasselService(): QuasselService
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityScope.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityScope.kt
new file mode 100644
index 000000000..24db7f326
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityScope.kt
@@ -0,0 +1,29 @@
+/*
+ * QuasselDroid - Quassel client for Android
+ *
+ * Copyright (c) 2018 Janne Koschinski
+ * Copyright (c) 2018 Ken Børge Viktil
+ * Copyright (c) 2018 Magnus Fjell
+ * Copyright (c) 2018 Martin Sandsmark
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * 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.dagger
+
+import javax.inject.Scope
+
+@Scope
+@Retention(AnnotationRetention.RUNTIME)
+annotation class ActivityScope
diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/AppComponent.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/AppComponent.kt
index 29499c682..7b50b8e2e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/AppComponent.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/AppComponent.kt
@@ -33,9 +33,7 @@ import javax.inject.Singleton
   modules = [
     AndroidSupportInjectionModule::class,
     AppModule::class,
-    ActivityModule::class,
-    DatabaseModule::class,
-    SettingsModule::class
+    ActivityModule::class
   ]
 )
 interface AppComponent : AndroidInjector<QuasselDroid> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/AppModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/AppModule.kt
index 02c54f175..b5f184299 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/AppModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/AppModule.kt
@@ -22,13 +22,12 @@
 
 package de.kuschku.quasseldroid.dagger
 
-import android.content.Context
-import dagger.Binds
 import dagger.Module
-import de.kuschku.quasseldroid.QuasselDroid
 
 @Module
 abstract class AppModule {
+  /*
   @Binds
   abstract fun provideContext(application: QuasselDroid): Context
+  */
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselServiceModule.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselServiceModule.kt
new file mode 100644
index 000000000..8b1b81515
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselServiceModule.kt
@@ -0,0 +1,33 @@
+/*
+ * QuasselDroid - Quassel client for Android
+ *
+ * Copyright (c) 2018 Janne Koschinski
+ * Copyright (c) 2018 Ken Børge Viktil
+ * Copyright (c) 2018 Magnus Fjell
+ * Copyright (c) 2018 Martin Sandsmark
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * 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.service
+
+import android.content.Context
+import dagger.Binds
+import dagger.Module
+
+@Module
+abstract class QuasselServiceModule {
+  @Binds
+  abstract fun bindContext(service: QuasselService): Context
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index b650b3fba..0bff8c758 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -76,6 +76,7 @@ import org.threeten.bp.format.FormatStyle
 import java.security.cert.CertificateExpiredException
 import java.security.cert.CertificateNotYetValidException
 import javax.inject.Inject
+import javax.inject.Named
 
 class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
   @BindView(R.id.drawer_layout)
@@ -106,6 +107,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
   lateinit var ircFormatDeserializer: IrcFormatDeserializer
 
   @Inject
+  @Named("ui")
   lateinit var autoCompleteAdapter: AutoCompleteAdapter
 
   private val dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatFragmentProvider.kt
index 04ee6fdc0..35d091d90 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatFragmentProvider.kt
@@ -22,6 +22,8 @@
 
 package de.kuschku.quasseldroid.ui.chat
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 import de.kuschku.quasseldroid.ui.chat.buffers.BufferViewConfigFragment
@@ -31,6 +33,9 @@ import de.kuschku.quasseldroid.ui.chat.nicks.NickListFragment
 
 @Module
 abstract class ChatFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: ChatActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindBufferViewConfigFragment(): BufferViewConfigFragment
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt
index c4e99371d..6988383a1 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt
@@ -40,7 +40,6 @@ import de.kuschku.quasseldroid.settings.MessageSettings
 import de.kuschku.quasseldroid.ui.chat.info.channel.ChannelInfoActivity
 import de.kuschku.quasseldroid.ui.chat.info.user.UserInfoActivity
 import de.kuschku.quasseldroid.util.helper.combineLatest
-import de.kuschku.quasseldroid.util.helper.styledAttributes
 import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.helper.visibleIf
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
@@ -91,40 +90,8 @@ class ToolbarFragment : ServiceBoundFragment() {
     val view = inflater.inflate(R.layout.fragment_toolbar, container, false)
     ButterKnife.bind(this, view)
 
-    val mircColors = requireContext().theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
     fun colorizeDescription(description: String?) = ircFormatDeserializer.formatString(
-      mircColors, description, messageSettings.colorizeMirc
+      description, messageSettings.colorizeMirc
     )
 
     combineLatest(viewModel.bufferData, viewModel.isSecure, viewModel.lag).toLiveData()
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
index 2d6c7dadf..4de5b6e3a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
@@ -46,7 +46,6 @@ import de.kuschku.quasseldroid.settings.AppearanceSettings
 import de.kuschku.quasseldroid.settings.MessageSettings
 import de.kuschku.quasseldroid.ui.coresettings.network.NetworkEditActivity
 import de.kuschku.quasseldroid.util.helper.combineLatest
-import de.kuschku.quasseldroid.util.helper.styledAttributes
 import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.helper.zip
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
@@ -208,38 +207,6 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
     val view = inflater.inflate(R.layout.fragment_chat_list, container, false)
     ButterKnife.bind(this, view)
 
-    val mircColors = requireContext().theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
     val adapter = BufferViewConfigAdapter()
     viewModel.bufferViewConfigs.switchMap {
       combineLatest(it.map(BufferViewConfig::liveUpdates))
@@ -283,7 +250,6 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
                 props.copy(
                   activity = activity,
                   description = ircFormatDeserializer.formatString(
-                    mircColors,
                     props.description.toString(),
                     colorize = messageSettings.colorizeMirc
                   ),
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoFragment.kt
index b1e4799a7..29dec8555 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoFragment.kt
@@ -36,7 +36,10 @@ import de.kuschku.libquassel.quassel.syncables.IrcChannel
 import de.kuschku.libquassel.util.helpers.value
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.ui.chat.topic.TopicActivity
-import de.kuschku.quasseldroid.util.helper.*
+import de.kuschku.quasseldroid.util.helper.combineLatest
+import de.kuschku.quasseldroid.util.helper.retint
+import de.kuschku.quasseldroid.util.helper.setTooltip
+import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.irc.format.ContentFormatter
 import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
 import de.kuschku.quasseldroid.util.ui.LinkLongClickMenuHelper
@@ -71,38 +74,6 @@ class ChannelInfoFragment : ServiceBoundFragment() {
     val view = inflater.inflate(R.layout.fragment_info_channel, container, false)
     ButterKnife.bind(this, view)
 
-    val mircColors = requireContext().theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
     val openBuffer = arguments?.getBoolean("openBuffer")
 
     combineLatest(viewModel.session, viewModel.networks).map { (sessionOptional, networks) ->
@@ -121,7 +92,7 @@ class ChannelInfoFragment : ServiceBoundFragment() {
     }.switchMap(IrcChannel::updates).toLiveData().observe(this, Observer { channel ->
       if (channel != null) {
         name.text = channel.name()
-        topic.text = contentFormatter.format(mircColors, channel.topic())
+        topic.text = contentFormatter.format(channel.topic())
 
         actionEditTopic.setOnClickListener {
           TopicActivity.launch(requireContext(), buffer = arguments?.getInt("bufferId") ?: -1)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoFragmentProvider.kt
index 9d05e31a2..ee329dbb9 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.chat.info.channel
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class ChannelInfoFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: ChannelInfoActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindChannelInfoFragment(): ChannelInfoFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragment.kt
index 2001445a0..320b8051e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragment.kt
@@ -126,38 +126,6 @@ class UserInfoFragment : ServiceBoundFragment() {
       }
     }
 
-    val mircColors = requireContext().theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
     val networkId = arguments?.getInt("networkId")
     val nickName = arguments?.getString("nick")
     combineLatest(viewModel.session, viewModel.networks).switchMap { (sessionOptional, networks) ->
@@ -188,7 +156,7 @@ class UserInfoFragment : ServiceBoundFragment() {
         )
 
         nick.text = user.nick()
-        realName.text = contentFormatter.format(mircColors, user.realName())
+        realName.text = contentFormatter.format(user.realName())
         realName.visibleIf(user.realName().isNotBlank() && user.realName() != user.nick())
 
         awayMessage.text = user.awayMessage()
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragmentProvider.kt
index 3f620203d..06167bc89 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.chat.info.user
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class UserInfoFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: UserInfoActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindUserInfoFragment(): UserInfoFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteHelper.kt
index 25427d013..2f5a0957c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteHelper.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteHelper.kt
@@ -66,38 +66,6 @@ class AutoCompleteHelper(
     IntArray(length()) { getColor(it, 0) }
   }
 
-  val mircColors = activity.theme.styledAttributes(
-    R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-    R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-    R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-    R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-    R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-    R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-    R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-    R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-    R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-    R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-    R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-    R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-    R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-    R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-    R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-    R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-    R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-    R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-    R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-    R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-    R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-    R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-    R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-    R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-    R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-  ) {
-    IntArray(99) {
-      getColor(it, 0)
-    }
-  }
-
   private val avatarSize = activity.resources.getDimensionPixelSize(R.dimen.avatar_size)
 
   init {
@@ -143,7 +111,7 @@ class AutoCompleteHelper(
                 it.modes.substring(0, Math.min(it.modes.length, 1))
             },
             realname = ircFormatDeserializer.formatString(
-              mircColors, it.realname.toString(), messageSettings.colorizeMirc
+              it.realname.toString(), messageSettings.colorizeMirc
             )
           )
         } else {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
index 2a52c5938..b9f56f829 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
@@ -107,46 +107,6 @@ class ChatlineFragment : ServiceBoundFragment() {
     val view = inflater.inflate(R.layout.fragment_chatline, container, false)
     ButterKnife.bind(this, view)
 
-    val mircColors = requireContext().theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
-    val mircColorMap = mircColors.take(16).mapIndexed { index: Int, color: Int ->
-      color to index
-    }.toMap()
-
-    val colorForegroundMirc = requireContext().theme.styledAttributes(R.attr.colorForegroundMirc) {
-      getColor(0, 0)
-    }
-
     val editorViewModel = ViewModelProviders.of(this).get(EditorViewModel::class.java)
     editorViewModel.quasselViewModel.onNext(viewModel)
 
@@ -193,9 +153,7 @@ class ChatlineFragment : ServiceBoundFragment() {
     fun send() {
       if (chatline.text.isNotBlank()) {
         val lines = chatline.text.lineSequence().map {
-          it.toString() to ircFormatSerializer.toEscapeCodes(colorForegroundMirc,
-                                                             mircColorMap,
-                                                             SpannableString(it))
+          it.toString() to ircFormatSerializer.toEscapeCodes(SpannableString(it))
         }
 
         viewModel.session { sessionOptional ->
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
index 54202f68a..a1f822d33 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt
@@ -23,7 +23,6 @@
 package de.kuschku.quasseldroid.ui.chat.messages
 
 import android.arch.paging.PagedListAdapter
-import android.content.Context
 import android.support.v7.util.DiffUtil
 import android.support.v7.widget.RecyclerView
 import android.util.LruCache
@@ -164,10 +163,6 @@ class MessageAdapter @Inject constructor(
     null
   }
 
-  fun updateColors(context: Context) {
-    messageRenderer.updateColors(context)
-  }
-
   class QuasselMessageViewHolder(
     itemView: View,
     clickListener: ((FormattedMessage) -> Unit)? = null,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
index 8d2cd38f0..caf7109c3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
@@ -231,8 +231,6 @@ class MessageListFragment : ServiceBoundFragment() {
     messageList.layoutManager = linearLayoutManager
     messageList.itemAnimator = null
 
-    adapter.updateColors(requireContext())
-
     val senderColors = requireContext().theme.styledAttributes(
       R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
       R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
index 020532d7e..c82c5d0d2 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageRenderer.kt
@@ -29,8 +29,6 @@ import de.kuschku.quasseldroid.persistence.QuasselDatabase
 import de.kuschku.quasseldroid.viewmodel.data.FormattedMessage
 
 interface MessageRenderer {
-  fun updateColors(context: Context)
-
   @LayoutRes
   fun layout(type: Message_Type?, hasHighlight: Boolean, isFollowUp: Boolean, isEmoji: Boolean): Int
 
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 2ea4cf3d1..4d0bfe598 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
@@ -60,6 +60,7 @@ import javax.inject.Inject
 import kotlin.math.roundToInt
 
 class QuasselMessageRenderer @Inject constructor(
+  context: Context,
   private val messageSettings: MessageSettings,
   private val contentFormatter: ContentFormatter
 ) : MessageRenderer {
@@ -80,9 +81,20 @@ class QuasselMessageRenderer @Inject constructor(
     else           -> "HH:mm"
   }
 
-  private lateinit var mircColors: IntArray
-  private lateinit var senderColors: IntArray
-  private var selfColor: Int = 0
+  private val senderColors: IntArray = context.theme.styledAttributes(
+    R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
+    R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
+    R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
+    R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF
+  ) {
+    IntArray(16) {
+      getColor(it, 0)
+    }
+  }
+
+  private val selfColor: Int = context.theme.styledAttributes(R.attr.colorForegroundSecondary) {
+    getColor(0, 0)
+  }
 
   private val zoneId = ZoneId.systemDefault()
 
@@ -183,53 +195,6 @@ class QuasselMessageRenderer @Inject constructor(
       holder.bind(message, original, !isDayChange, !isDayChange)
     }
 
-  override fun updateColors(context: Context) {
-    mircColors = context.theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
-    context.theme.styledAttributes(
-      R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
-      R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
-      R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
-      R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF,
-      R.attr.colorForegroundSecondary
-    ) {
-      senderColors = IntArray(16) {
-        getColor(it, 0)
-      }
-      selfColor = getColor(16, 0)
-    }
-  }
-
   override fun render(context: Context, message: DisplayMessage): FormattedMessage {
     val avatarSize = TypedValue.applyDimension(
       TypedValue.COMPLEX_UNIT_SP,
@@ -241,7 +206,7 @@ class QuasselMessageRenderer @Inject constructor(
     val highlight = Message_Flag.of(message.content.flag).hasFlag(Message_Flag.Highlight)
     return when (Message_Type.of(message.content.type).enabledValues().firstOrNull()) {
       Message_Type.Plain        -> {
-        val realName = contentFormatter.format(mircColors, message.content.realName, highlight)
+        val realName = contentFormatter.format(message.content.realName, highlight)
         val nick = SpannableStringBuilder().apply {
           append(formatPrefix(message.content.senderPrefixes, highlight))
           append(formatNick(
@@ -251,7 +216,7 @@ class QuasselMessageRenderer @Inject constructor(
             messageSettings.showHostmaskPlain && messageSettings.nicksOnNewLine
           ))
         }
-        val content = contentFormatter.format(mircColors, message.content.content, highlight)
+        val content = contentFormatter.format(message.content.content, highlight)
         val nickName = HostmaskHelper.nick(message.content.sender)
         val senderColorIndex = IrcUserUtils.senderColor(nickName)
         val rawInitial = nickName.trimStart('-', '_', '[', ']', '{', '}', '|', '`', '^', '.', '\\')
@@ -287,7 +252,7 @@ class QuasselMessageRenderer @Inject constructor(
           context.getString(R.string.message_format_action),
           formatPrefix(message.content.senderPrefixes, highlight),
           formatNick(message.content.sender, self, highlight, false),
-          contentFormatter.format(mircColors, message.content.content, highlight)
+          contentFormatter.format(message.content.content, highlight)
         ),
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
@@ -300,7 +265,7 @@ class QuasselMessageRenderer @Inject constructor(
           context.getString(R.string.message_format_notice),
           formatPrefix(message.content.senderPrefixes, highlight),
           formatNick(message.content.sender, self, highlight, false),
-          contentFormatter.format(mircColors, message.content.content, highlight)
+          contentFormatter.format(message.content.content, highlight)
         ),
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
@@ -374,7 +339,7 @@ class QuasselMessageRenderer @Inject constructor(
                        self,
                        highlight,
                        messageSettings.showHostmaskActions),
-            contentFormatter.format(mircColors, message.content.content, highlight)
+            contentFormatter.format(message.content.content, highlight)
           )
         },
         isMarkerLine = message.isMarkerLine,
@@ -398,7 +363,7 @@ class QuasselMessageRenderer @Inject constructor(
                        self,
                        highlight,
                        messageSettings.showHostmaskActions),
-            contentFormatter.format(mircColors, message.content.content, highlight)
+            contentFormatter.format(message.content.content, highlight)
           )
         },
         isMarkerLine = message.isMarkerLine,
@@ -429,7 +394,7 @@ class QuasselMessageRenderer @Inject constructor(
                          self,
                          highlight,
                          messageSettings.showHostmaskActions),
-              contentFormatter.format(mircColors, reason, highlight)
+              contentFormatter.format(reason, highlight)
             )
           },
           isMarkerLine = message.isMarkerLine,
@@ -461,7 +426,7 @@ class QuasselMessageRenderer @Inject constructor(
                          self,
                          highlight,
                          messageSettings.showHostmaskActions),
-              contentFormatter.format(mircColors, reason, highlight)
+              contentFormatter.format(reason, highlight)
             )
           },
           isMarkerLine = message.isMarkerLine,
@@ -506,7 +471,7 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Error        -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
-        combined = contentFormatter.format(mircColors, message.content.content, highlight),
+        combined = contentFormatter.format(message.content.content, highlight),
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
@@ -514,7 +479,7 @@ class QuasselMessageRenderer @Inject constructor(
       Message_Type.Topic        -> FormattedMessage(
         id = message.content.messageId,
         time = timeFormatter.format(message.content.time.atZone(zoneId)),
-        combined = contentFormatter.format(mircColors, message.content.content, highlight),
+        combined = contentFormatter.format(message.content.content, highlight),
         isMarkerLine = message.isMarkerLine,
         isExpanded = message.isExpanded,
         isSelected = message.isSelected
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
index dc55cadbc..1fdbbf454 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
@@ -96,38 +96,6 @@ class NickListFragment : ServiceBoundFragment() {
       }
     }
 
-    val mircColors = requireContext().theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
     val avatarSize = resources.getDimensionPixelSize(R.dimen.avatar_size)
     viewModel.nickData.toLiveData().observe(this, Observer {
       runInBackground {
@@ -174,7 +142,7 @@ class NickListFragment : ServiceBoundFragment() {
                 it.modes.substring(0, Math.min(it.modes.length, 1))
             },
             realname = ircFormatDeserializer.formatString(
-              mircColors, it.realname.toString(), messageSettings.colorizeMirc
+              it.realname.toString(), messageSettings.colorizeMirc
             ),
             avatarUrls = AvatarHelper.avatar(messageSettings, it, avatarSize)
           )
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt
index b3031923e..4ae8faaa7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt
@@ -40,7 +40,6 @@ import de.kuschku.quasseldroid.settings.MessageSettings
 import de.kuschku.quasseldroid.ui.chat.input.*
 import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
 import de.kuschku.quasseldroid.util.helper.invoke
-import de.kuschku.quasseldroid.util.helper.styledAttributes
 import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer
@@ -77,55 +76,11 @@ class TopicFragment : SettingsFragment(), SettingsFragment.Savable {
 
   private lateinit var editorHelper: EditorHelper
 
-  private lateinit var mircColorMap: Map<Int, Int>
-
-  private var colorForegroundMirc: Int = 0
-
   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                             savedInstanceState: Bundle?): View? {
     val view = inflater.inflate(R.layout.fragment_topic, container, false)
     ButterKnife.bind(this, view)
 
-    val mircColors = requireContext().theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
-    mircColorMap = mircColors.take(16).mapIndexed { index: Int, color: Int ->
-      color to index
-    }.toMap()
-
-    colorForegroundMirc = requireContext().theme.styledAttributes(R.attr.colorForegroundMirc) {
-      getColor(0, 0)
-    }
-
     val editorViewModel = ViewModelProviders.of(this).get(EditorViewModel::class.java)
     editorViewModel.quasselViewModel.onNext(viewModel)
 
@@ -163,7 +118,7 @@ class TopicFragment : SettingsFragment(), SettingsFragment.Savable {
     viewModel.bufferData.filter {
       it.info != null
     }.firstElement().toLiveData().observe(this, Observer {
-      chatline.setText(formatDeserializer.formatString(mircColors, it?.description, true))
+      chatline.setText(formatDeserializer.formatString(it?.description, true))
     })
 
     return view
@@ -174,9 +129,7 @@ class TopicFragment : SettingsFragment(), SettingsFragment.Savable {
       val session = sessionOptional.orNull()
       viewModel.buffer { bufferId ->
         session?.bufferSyncer?.bufferInfo(bufferId)?.also { bufferInfo ->
-          val topic = formatSerializer.toEscapeCodes(colorForegroundMirc,
-                                                     mircColorMap,
-                                                     chatline.text)
+          val topic = formatSerializer.toEscapeCodes(chatline.text)
           session.rpcHandler?.sendInput(bufferInfo, "/topic $topic")
           return true
         }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt
index cb1f8e8e4..aaa5c157c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.chat.topic
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class TopicFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: TopicActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindTopicFragment(): TopicFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutFragmentProvider.kt
index 274b36248..68f43c681 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.clientsettings.about
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class AboutFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: AboutActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindAboutFragment(): AboutFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/client/ClientSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/client/ClientSettingsFragmentProvider.kt
index 5fbfdb81b..674c9d720 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/client/ClientSettingsFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/client/ClientSettingsFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.clientsettings.client
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class ClientSettingsFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: ClientSettingsActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindClientSettingsFragment(): ClientSettingsFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashFragmentProvider.kt
index d5e39b0fc..db045a545 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.clientsettings.crash
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class CrashFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: CrashActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindClientSettingsFragment(): CrashFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseFragmentProvider.kt
index ebc7cccad..f8107fb53 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.clientsettings.license
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class LicenseFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: LicenseActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindLicenseFragment(): LicenseFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/whitelist/WhitelistFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/whitelist/WhitelistFragmentProvider.kt
index 8ec24f52a..0f6f181bd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/whitelist/WhitelistFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/whitelist/WhitelistFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.clientsettings.whitelist
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class WhitelistFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: WhitelistActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindWhitelistFragment(): WhitelistFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragmentProvider.kt
index 11a7534ea..000ac271c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class CoreSettingsFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: CoreSettingsActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindCoreSettingsFragment(): CoreSettingsFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragment.kt
index 310cfd681..253d2dc7a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragment.kt
@@ -42,7 +42,6 @@ import de.kuschku.quasseldroid.settings.AutoCompleteSettings
 import de.kuschku.quasseldroid.settings.MessageSettings
 import de.kuschku.quasseldroid.ui.chat.input.*
 import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
-import de.kuschku.quasseldroid.util.helper.styledAttributes
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer
 import de.kuschku.quasseldroid.viewmodel.EditorViewModel
@@ -83,10 +82,6 @@ class AliasItemFragment : SettingsFragment(), SettingsFragment.Savable,
 
   private lateinit var editorHelper: EditorHelper
 
-  private lateinit var mircColorMap: Map<Int, Int>
-
-  private var colorForegroundMirc: Int = 0
-
   private var rule: IAliasManager.Alias? = null
 
   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
@@ -99,46 +94,6 @@ class AliasItemFragment : SettingsFragment(), SettingsFragment.Savable,
       rule = it
     }
 
-    val mircColors = requireContext().theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-
-    mircColorMap = mircColors.take(16).mapIndexed { index: Int, color: Int ->
-      color to index
-    }.toMap()
-
-    colorForegroundMirc = requireContext().theme.styledAttributes(R.attr.colorForegroundMirc) {
-      getColor(0, 0)
-    }
-
     val editorViewModel = ViewModelProviders.of(this).get(EditorViewModel::class.java)
     editorViewModel.quasselViewModel.onNext(viewModel)
 
@@ -173,7 +128,7 @@ class AliasItemFragment : SettingsFragment(), SettingsFragment.Savable,
 
     rule?.let { data ->
       name.setText(data.name)
-      expansion.setText(formatDeserializer.formatString(mircColors, data.expansion, true))
+      expansion.setText(formatDeserializer.formatString(data.expansion, true))
     }
 
     return view
@@ -181,7 +136,7 @@ class AliasItemFragment : SettingsFragment(), SettingsFragment.Savable,
 
   private fun applyChanges() = IAliasManager.Alias(
     name = name.text.toString(),
-    expansion = formatSerializer.toEscapeCodes(colorForegroundMirc, mircColorMap, expansion.text)
+    expansion = formatSerializer.toEscapeCodes(expansion.text)
   )
 
   override fun onSave() = rule.let { data ->
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragmentProvider.kt
index c6a3eb448..bfbeb0368 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.aliasitem
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class AliasItemFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: AliasItemActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindAliasItemFragment(): AliasItemFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListAdapter.kt
index cb2a02818..9b9f7b509 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListAdapter.kt
@@ -22,7 +22,6 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.aliaslist
 
-import android.content.Context
 import android.support.v7.widget.RecyclerView
 import android.view.LayoutInflater
 import android.view.MotionEvent
@@ -33,7 +32,6 @@ import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.libquassel.quassel.syncables.interfaces.IAliasManager
 import de.kuschku.quasseldroid.R
-import de.kuschku.quasseldroid.util.helper.styledAttributes
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
 import java.util.*
 import javax.inject.Inject
@@ -86,48 +84,11 @@ class AliasListAdapter @Inject constructor(
     notifyItemMoved(from, to)
   }
 
-  private lateinit var mircColors: IntArray
-
-  fun updateColors(context: Context) {
-    mircColors = context.theme.styledAttributes(
-      R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
-      R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
-      R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
-      R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
-      R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
-      R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
-      R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
-      R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
-      R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
-      R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
-      R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
-      R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
-      R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
-      R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
-      R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
-      R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
-      R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
-      R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
-      R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
-      R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
-      R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
-      R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
-      R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
-      R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
-      R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
-    ) {
-      IntArray(99) {
-        getColor(it, 0)
-      }
-    }
-  }
-
   override fun getItemCount() = data.size
 
   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = AliasItemViewHolder(
     LayoutInflater.from(parent.context).inflate(R.layout.settings_aliaslist_item, parent, false),
     formatDeserializer,
-    mircColors,
     clickListener,
     dragListener
   )
@@ -139,7 +100,6 @@ class AliasListAdapter @Inject constructor(
   class AliasItemViewHolder(
     itemView: View,
     private val formatDeserializer: IrcFormatDeserializer,
-    private val mircColors: IntArray,
     clickListener: ((IAliasManager.Alias) -> Unit)?,
     dragListener: ((AliasItemViewHolder) -> Unit)?
   ) : RecyclerView.ViewHolder(itemView) {
@@ -172,7 +132,7 @@ class AliasListAdapter @Inject constructor(
     fun bind(item: IAliasManager.Alias) {
       this.item = item
       name.text = item.name
-      expansion.text = formatDeserializer.formatString(mircColors, item.expansion, true)
+      expansion.text = formatDeserializer.formatString(item.expansion, true)
     }
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListFragment.kt
index 7c6443c7c..0dfb46626 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListFragment.kt
@@ -66,7 +66,6 @@ class AliasListFragment : SettingsFragment(), SettingsFragment.Savable,
     val view = inflater.inflate(R.layout.settings_ignorelist, container, false)
     ButterKnife.bind(this, view)
 
-    adapter.updateColors(requireContext())
     adapter.setOnClickListener(::itemClick)
     adapter.setOnDragListener(::startDrag)
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListFragmentProvider.kt
index f2e19a91d..129e7bdea 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.aliaslist
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class AliasListFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: AliasListActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindAliasListFragment(): AliasListFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateFragmentProvider.kt
index 65ce6cc5c..a17d733b7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.chatlist
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class ChatlistCreateFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: ChatlistCreateActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindChatListCreateFragment(): ChatListCreateFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditFragmentProvider.kt
index e1ef7b653..c3c578ccb 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.chatlist
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class ChatlistEditFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: ChatlistEditActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindChatListEditFragment(): ChatListEditFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragmentProvider.kt
index 04d22dc64..9aeeec1e9 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.highlightlist
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class HighlightListFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: HighlightListActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindHighlightListFragment(): HighlightListFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleFragmentProvider.kt
index d4cfd5d89..f051118dd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.highlightrule
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class HighlightRuleFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: HighlightRuleActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindHighlightRuleFragment(): HighlightRuleFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragmentProvider.kt
index d41d07905..a42c6ebd6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.identity
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class IdentityCreateFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: IdentityCreateActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindIdentityCreateFragment(): IdentityCreateFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragmentProvider.kt
index f7408f1d2..767a69982 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.identity
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class IdentityEditFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: IdentityEditActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindIdentityEditFragment(): IdentityEditFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragmentProvider.kt
index f455091fc..abc12c455 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.ignoreitem
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class IgnoreItemFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: IgnoreItemActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindIgnoreItemFragment(): IgnoreItemFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragmentProvider.kt
index a3e65f3b5..00d0d4c2d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.ignorelist
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class IgnoreListFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: IgnoreListActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindIgnoreFragment(): IgnoreListFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkCreateFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkCreateFragmentProvider.kt
index 633ae15ce..012bd1f9f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkCreateFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkCreateFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.network
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class NetworkCreateFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: NetworkCreateActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindNetworkCreateFragment(): NetworkCreateFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkEditFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkEditFragmentProvider.kt
index e9e674b54..b79250c5a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkEditFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkEditFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.network
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class NetworkEditFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: NetworkEditActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindNetworkEditFragment(): NetworkEditFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragmentProvider.kt
index 555630b0b..20b85552d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.networkconfig
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class NetworkConfigFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: NetworkConfigActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindNetworkConfigFragment(): NetworkConfigFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkserver/NetworkServerFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkserver/NetworkServerFragmentProvider.kt
index 8b8bac238..38191184e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkserver/NetworkServerFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkserver/NetworkServerFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.coresettings.networkserver
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class NetworkServerFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: NetworkServerActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindNetworkServerFragment(): NetworkServerFragment
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditModule.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditModule.kt
new file mode 100644
index 000000000..8e7e688c0
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditModule.kt
@@ -0,0 +1,33 @@
+/*
+ * QuasselDroid - Quassel client for Android
+ *
+ * Copyright (c) 2018 Janne Koschinski
+ * Copyright (c) 2018 Ken Børge Viktil
+ * Copyright (c) 2018 Magnus Fjell
+ * Copyright (c) 2018 Martin Sandsmark
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * 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.ui.setup.accounts.edit
+
+import android.content.Context
+import dagger.Binds
+import dagger.Module
+
+@Module
+abstract class AccountEditModule {
+  @Binds
+  abstract fun bindContext(activity: AccountEditActivity): Context
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountSelectionFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountSelectionFragmentProvider.kt
index a3239a77f..f85903e62 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountSelectionFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountSelectionFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.setup.accounts.selection
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class AccountSelectionFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: AccountSelectionActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindAccountSelectionSlide(): AccountSelectionSlide
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupFragmentProvider.kt
index 2e1de4139..21c910409 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupFragmentProvider.kt
@@ -22,11 +22,16 @@
 
 package de.kuschku.quasseldroid.ui.setup.accounts.setup
 
+import android.content.Context
+import dagger.Binds
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
 
 @Module
 abstract class AccountSetupFragmentProvider {
+  @Binds
+  abstract fun bindContext(activity: AccountSetupActivity): Context
+
   @ContributesAndroidInjector
   abstract fun bindAccountSetupConnectionSlide(): AccountSetupConnectionSlide
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/ContentFormatter.kt b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/ContentFormatter.kt
index c4339d609..8c35e4167 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/ContentFormatter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/ContentFormatter.kt
@@ -63,10 +63,8 @@ class ContentFormatter @Inject constructor(
     }
   }
 
-  fun format(mircColors: IntArray, content: String, highlight: Boolean = false): CharSequence {
-    val formattedText = ircFormatDeserializer.formatString(
-      mircColors, content, messageSettings.colorizeMirc
-    )
+  fun format(content: String, highlight: Boolean = false): CharSequence {
+    val formattedText = ircFormatDeserializer.formatString(content, messageSettings.colorizeMirc)
     val text = SpannableString(formattedText)
 
     for (result in urlPattern.findAll(formattedText)) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt
index ae8984d08..a876712e1 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt
@@ -22,8 +22,11 @@
 
 package de.kuschku.quasseldroid.util.irc.format
 
+import android.content.Context
 import android.text.SpannableStringBuilder
 import android.text.Spanned
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.util.helper.styledAttributes
 import de.kuschku.quasseldroid.util.irc.format.spans.*
 import javax.inject.Inject
 
@@ -31,14 +34,46 @@ import javax.inject.Inject
  * A helper class to turn mIRC formatted Strings into Android’s SpannableStrings with the same
  * color and format codes
  */
-class IrcFormatDeserializer @Inject constructor() {
+class IrcFormatDeserializer @Inject constructor(context: Context) {
+  val mircColors = context.theme.styledAttributes(
+    R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
+    R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
+    R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
+    R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
+    R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
+    R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
+    R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
+    R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
+    R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
+    R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
+    R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
+    R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
+    R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
+    R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
+    R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
+    R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
+    R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
+    R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
+    R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
+    R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
+    R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
+    R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
+    R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
+    R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
+    R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
+  ) {
+    IntArray(99) {
+      getColor(it, 0)
+    }
+  }
+
   /**
    * Function to handle mIRC formatted strings
    *
    * @param str mIRC formatted String
    * @return a CharSequence with Android’s span format representing the input string
    */
-  fun formatString(mircColors: IntArray, str: String?, colorize: Boolean): CharSequence {
+  fun formatString(str: String?, colorize: Boolean): CharSequence {
     if (str == null) return ""
 
     val plainText = SpannableStringBuilder()
@@ -148,7 +183,7 @@ class IrcFormatDeserializer @Inject constructor() {
             }
             // Add new format
             color = FormatDescription(
-              plainText.length, ColorIrcFormat(foreground, background, mircColors)
+              plainText.length, ColorIrcFormat(foreground, background, this.mircColors)
             )
 
             // i points in front of the next character
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatSerializer.kt
index 115bff398..10a0ae5fd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatSerializer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatSerializer.kt
@@ -22,21 +22,63 @@
 
 package de.kuschku.quasseldroid.util.irc.format
 
+import android.content.Context
 import android.graphics.Typeface
 import android.text.Spanned
 import android.text.style.*
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.util.helper.styledAttributes
 import java.util.*
 import javax.inject.Inject
 
-class IrcFormatSerializer @Inject constructor() {
-  fun toEscapeCodes(colorForegroundMirc: Int, mircColorMap: Map<Int, Int>, text: Spanned): String {
+class IrcFormatSerializer @Inject constructor(context: Context) {
+  private val mircColors = context.theme.styledAttributes(
+    R.attr.mircColor00, R.attr.mircColor01, R.attr.mircColor02, R.attr.mircColor03,
+    R.attr.mircColor04, R.attr.mircColor05, R.attr.mircColor06, R.attr.mircColor07,
+    R.attr.mircColor08, R.attr.mircColor09, R.attr.mircColor10, R.attr.mircColor11,
+    R.attr.mircColor12, R.attr.mircColor13, R.attr.mircColor14, R.attr.mircColor15,
+    R.attr.mircColor16, R.attr.mircColor17, R.attr.mircColor18, R.attr.mircColor19,
+    R.attr.mircColor20, R.attr.mircColor21, R.attr.mircColor22, R.attr.mircColor23,
+    R.attr.mircColor24, R.attr.mircColor25, R.attr.mircColor26, R.attr.mircColor27,
+    R.attr.mircColor28, R.attr.mircColor29, R.attr.mircColor30, R.attr.mircColor31,
+    R.attr.mircColor32, R.attr.mircColor33, R.attr.mircColor34, R.attr.mircColor35,
+    R.attr.mircColor36, R.attr.mircColor37, R.attr.mircColor38, R.attr.mircColor39,
+    R.attr.mircColor40, R.attr.mircColor41, R.attr.mircColor42, R.attr.mircColor43,
+    R.attr.mircColor44, R.attr.mircColor45, R.attr.mircColor46, R.attr.mircColor47,
+    R.attr.mircColor48, R.attr.mircColor49, R.attr.mircColor50, R.attr.mircColor51,
+    R.attr.mircColor52, R.attr.mircColor53, R.attr.mircColor54, R.attr.mircColor55,
+    R.attr.mircColor56, R.attr.mircColor57, R.attr.mircColor58, R.attr.mircColor59,
+    R.attr.mircColor60, R.attr.mircColor61, R.attr.mircColor62, R.attr.mircColor63,
+    R.attr.mircColor64, R.attr.mircColor65, R.attr.mircColor66, R.attr.mircColor67,
+    R.attr.mircColor68, R.attr.mircColor69, R.attr.mircColor70, R.attr.mircColor71,
+    R.attr.mircColor72, R.attr.mircColor73, R.attr.mircColor74, R.attr.mircColor75,
+    R.attr.mircColor76, R.attr.mircColor77, R.attr.mircColor78, R.attr.mircColor79,
+    R.attr.mircColor80, R.attr.mircColor81, R.attr.mircColor82, R.attr.mircColor83,
+    R.attr.mircColor84, R.attr.mircColor85, R.attr.mircColor86, R.attr.mircColor87,
+    R.attr.mircColor88, R.attr.mircColor89, R.attr.mircColor90, R.attr.mircColor91,
+    R.attr.mircColor92, R.attr.mircColor93, R.attr.mircColor94, R.attr.mircColor95,
+    R.attr.mircColor96, R.attr.mircColor97, R.attr.mircColor98
+  ) {
+    IntArray(99) {
+      getColor(it, 0)
+    }
+  }
+
+  private val mircColorMap = mircColors.take(16).mapIndexed { index: Int, color: Int ->
+    color to index
+  }.toMap()
+
+  private val colorForegroundMirc = context.theme.styledAttributes(R.attr.colorForegroundMirc) {
+    getColor(0, 0)
+  }
+
+  fun toEscapeCodes(text: Spanned): String {
     val out = StringBuilder()
-    withinParagraph(colorForegroundMirc, mircColorMap, out, text, 0, text.length)
+    withinParagraph(out, text, 0, text.length)
     return out.toString()
   }
 
-  private fun withinParagraph(colorForegroundMirc: Int, mircColorMap: Map<Int, Int>,
-                              out: StringBuilder, text: Spanned, start: Int, end: Int) {
+  private fun withinParagraph(out: StringBuilder, text: Spanned, start: Int, end: Int) {
     fun writeBold() {
       out.append(CODE_BOLD)
     }
@@ -61,7 +103,7 @@ class IrcFormatSerializer @Inject constructor() {
       out.append(CODE_COLOR)
       if (foreground == null && background != null) {
         out.append(
-          String.format(Locale.US, "%02d,%02d", colorForegroundMirc, background)
+          String.format(Locale.US, "%02d,%02d", this.colorForegroundMirc, background)
         )
       } else if (background == null && foreground != null) {
         out.append(String.format(Locale.US, "%02d", foreground))
@@ -154,10 +196,10 @@ class IrcFormatSerializer @Inject constructor() {
       }
 
       if (afterForeground != foreground || afterBackground != background) {
-        val foregroundCode = mircColorMap[foreground]
-        val backgroundCode = mircColorMap[background]
-        val afterForegroundCode = mircColorMap[afterForeground]
-        val afterBackgroundCode = mircColorMap[afterBackground]
+        val foregroundCode = this.mircColorMap[foreground]
+        val backgroundCode = this.mircColorMap[background]
+        val afterForegroundCode = this.mircColorMap[afterForeground]
+        val afterBackgroundCode = this.mircColorMap[afterBackground]
 
         val hasForegroundBefore = foreground != null
         val hasBackgroundBefore = background != null
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
index 33ea3b18c..ffba8e3ec 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
@@ -32,6 +32,7 @@ import de.kuschku.libquassel.util.helpers.getOr
 import de.kuschku.libquassel.util.helpers.serializeString
 import de.kuschku.libquassel.util.irc.HostmaskHelper
 import de.kuschku.libquassel.util.irc.IrcCaseMappers
+import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
 import java.nio.ByteBuffer
 import java.nio.charset.Charset
@@ -91,6 +92,8 @@ class Network constructor(
 
   fun isConnected() = _connected
   fun connectionState() = _connectionState
+  fun liveConnectionState(): Observable<ConnectionState> = live_connectionState
+
   fun prefixToMode(prefix: Char): Char? = prefixModes().elementAtOrNull(prefixes().indexOf(prefix))
 
   fun prefixesToModes(prefixes: String): String = prefixes.mapNotNull {
@@ -903,7 +906,7 @@ class Network constructor(
   private var _currentServer: String? = null
   private var _connected: Boolean = false
   private var _connectionState: ConnectionState = ConnectionState.Disconnected
-  val live_connectionState = BehaviorSubject.createDefault(ConnectionState.Disconnected)
+  private val live_connectionState = BehaviorSubject.createDefault(ConnectionState.Disconnected)
   private var _prefixes: List<Char>? = null
   private var _prefixModes: List<Char>? = null
   private var _channelModes: Map<ChannelModeType, Set<Char>>? = null
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
index 9eb841ea9..31b20d994 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
 import de.kuschku.libquassel.quassel.syncables.IrcChannel
 import de.kuschku.libquassel.quassel.syncables.IrcUser
 import de.kuschku.libquassel.quassel.syncables.Network
+import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.session.Backend
 import de.kuschku.libquassel.session.ISession
 import de.kuschku.libquassel.session.SessionManager
@@ -174,7 +175,7 @@ class QuasselViewModel : ViewModel() {
                 }
               }
               BufferInfo.Type.StatusBuffer.toInt()  -> {
-                network.live_connectionState.map {
+                network.liveConnectionState().map {
                   BufferData(
                     info = info,
                     network = network
@@ -286,7 +287,7 @@ class QuasselViewModel : ViewModel() {
             val network = networks[info.networkId]
             when (info.type.enabledValues().firstOrNull()) {
               Buffer_Type.StatusBuffer  -> {
-                network?.live_connectionState?.map {
+                network?.liveConnectionState()?.map {
                   SelectedBufferItem(
                     info,
                     connectionState = it,
@@ -349,8 +350,6 @@ class QuasselViewModel : ViewModel() {
                       } else {
                         it to network
                       }
-                    }.filter {
-                      !config.hideInactiveNetworks() || it.second.isConnected()
                     }.map<Pair<BufferInfo, Network>, Observable<BufferProps>?> { (info, network) ->
                       bufferSyncer.liveActivity(info.bufferId).switchMap { activity ->
                         bufferSyncer.liveHighlightCount(info.bufferId).map { highlights ->
@@ -360,51 +359,58 @@ class QuasselViewModel : ViewModel() {
                         when (info.type.toInt()) {
                           BufferInfo.Type.QueryBuffer.toInt()   -> {
                             network.liveNetworkInfo().switchMap { networkInfo ->
-                              network.liveIrcUser(info.bufferName).switchMap {
-                                it.updates().map { user ->
-                                  BufferProps(
-                                    info = info,
-                                    network = networkInfo,
-                                    bufferStatus = when {
-                                      user == IrcUser.NULL -> BufferStatus.OFFLINE
-                                      user.isAway()        -> BufferStatus.AWAY
-                                      else                 -> BufferStatus.ONLINE
-                                    },
-                                    description = user.realName(),
-                                    activity = activity,
-                                    highlights = highlights,
-                                    hiddenState = state
-                                  )
+                              network.liveConnectionState().switchMap { connectionState ->
+                                network.liveIrcUser(info.bufferName).switchMap {
+                                  it.updates().map { user ->
+                                    BufferProps(
+                                      info = info,
+                                      network = networkInfo,
+                                      networkConnectionState = connectionState,
+                                      bufferStatus = when {
+                                        user == IrcUser.NULL -> BufferStatus.OFFLINE
+                                        user.isAway()        -> BufferStatus.AWAY
+                                        else                 -> BufferStatus.ONLINE
+                                      },
+                                      description = user.realName(),
+                                      activity = activity,
+                                      highlights = highlights,
+                                      hiddenState = state
+                                    )
+                                  }
                                 }
                               }
                             }
                           }
                           BufferInfo.Type.ChannelBuffer.toInt() -> {
                             network.liveNetworkInfo().switchMap { networkInfo ->
-                              network.liveIrcChannel(info.bufferName).switchMap { channel ->
-                                channel.updates().map {
-                                  BufferProps(
-                                    info = info,
-                                    network = networkInfo,
-                                    bufferStatus = when (it) {
-                                      IrcChannel.NULL -> BufferStatus.OFFLINE
-                                      else            -> BufferStatus.ONLINE
-                                    },
-                                    description = it.topic(),
-                                    activity = activity,
-                                    highlights = highlights,
-                                    hiddenState = state
-                                  )
+                              network.liveConnectionState().switchMap { connectionState ->
+                                network.liveIrcChannel(info.bufferName).switchMap { channel ->
+                                  channel.updates().map {
+                                    BufferProps(
+                                      info = info,
+                                      network = networkInfo,
+                                      networkConnectionState = connectionState,
+                                      bufferStatus = when (it) {
+                                        IrcChannel.NULL -> BufferStatus.OFFLINE
+                                        else            -> BufferStatus.ONLINE
+                                      },
+                                      description = it.topic(),
+                                      activity = activity,
+                                      highlights = highlights,
+                                      hiddenState = state
+                                    )
+                                  }
                                 }
                               }
                             }
                           }
                           BufferInfo.Type.StatusBuffer.toInt()  -> {
                             network.liveNetworkInfo().switchMap { networkInfo ->
-                              network.live_connectionState.map {
+                              network.liveConnectionState().map { connectionState ->
                                 BufferProps(
                                   info = info,
                                   network = networkInfo,
+                                  networkConnectionState = connectionState,
                                   bufferStatus = BufferStatus.OFFLINE,
                                   description = "",
                                   activity = activity,
@@ -414,17 +420,7 @@ class QuasselViewModel : ViewModel() {
                               }
                             }
                           }
-                          else                                  -> Observable.just(
-                            BufferProps(
-                              info = info,
-                              network = network.networkInfo(),
-                              bufferStatus = BufferStatus.OFFLINE,
-                              description = "",
-                              activity = activity,
-                              highlights = highlights,
-                              hiddenState = state
-                            )
-                          )
+                          else                                  -> Observable.empty()
                         }
                       }
                     }
@@ -455,7 +451,7 @@ class QuasselViewModel : ViewModel() {
                       !config.hideInactiveNetworks() || it.isConnected()
                     }.map<Network, Observable<BufferProps>?> { network ->
                       network.liveNetworkInfo().switchMap { networkInfo ->
-                        network.live_connectionState.map {
+                        network.liveConnectionState().map { connectionState ->
                           BufferProps(
                             info = BufferInfo(
                               bufferId = -networkInfo.networkId,
@@ -465,6 +461,7 @@ class QuasselViewModel : ViewModel() {
                               type = Buffer_Type.of(Buffer_Type.StatusBuffer)
                             ),
                             network = networkInfo,
+                            networkConnectionState = connectionState,
                             bufferStatus = BufferStatus.OFFLINE,
                             description = "",
                             activity = Message_Type.of(),
@@ -491,6 +488,9 @@ class QuasselViewModel : ViewModel() {
                       Pair<BufferViewConfig?, List<BufferProps>>(
                         config,
                         list.asSequence().filter {
+                          !config.hideInactiveNetworks() ||
+                          it.networkConnectionState == INetwork.ConnectionState.Initialized
+                        }.filter {
                           (!config.hideInactiveBuffers()) ||
                           it.bufferStatus != BufferStatus.OFFLINE ||
                           it.info.type.hasFlag(Buffer_Type.StatusBuffer)
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferProps.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferProps.kt
index 556edacd6..794ea6995 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferProps.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferProps.kt
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 data class BufferProps(
   val info: BufferInfo,
   val network: INetwork.NetworkInfo,
+  val networkConnectionState: INetwork.ConnectionState,
   val bufferStatus: BufferStatus,
   val description: CharSequence,
   val activity: Message_Types,
-- 
GitLab