From e18070d49135b9a1b822c2b9c2b4a88fe475ba6b Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Wed, 21 Feb 2018 23:09:55 +0100
Subject: [PATCH] Implement settings with theming

---
 app/build.gradle.kts                          |  2 +
 app/src/main/AndroidManifest.xml              |  6 ++
 .../kuschku/quasseldroid_ng/QuasseldroidNG.kt |  3 +
 .../quasseldroid_ng/ui/chat/ChatActivity.kt   |  6 ++
 .../ui/chat/NickListFragment.kt               | 11 +--
 .../ui/chat/ToolbarFragment.kt                |  9 +--
 .../chat/buffers/BufferViewConfigFragment.kt  | 11 +--
 .../ui/chat/messages/MessageAdapter.kt        |  8 +-
 .../ui/chat/messages/MessageListFragment.kt   |  6 +-
 .../chat/messages/QuasselMessageRenderer.kt   | 24 +++---
 .../quasseldroid_ng/ui/settings/Settings.kt   | 55 ++++++++++++-
 .../ui/settings/SettingsActivity.kt           | 22 +++++
 .../ui/settings/SettingsFragment.kt           | 57 +++++++++++++
 .../ui/settings/data/AppearanceSettings.kt    | 15 ++--
 .../ui/settings/data/BacklogSettings.kt       |  6 +-
 .../quasseldroid_ng/ui/setup/SetupActivity.kt |  1 +
 .../quasseldroid_ng/ui/setup/SlideFragment.kt |  4 +
 .../util/service/ServiceBoundActivity.kt      |  4 +
 app/src/main/res/layout/activity_main.xml     |  3 +-
 app/src/main/res/layout/activity_settings.xml | 38 +++++++++
 app/src/main/res/layout/activity_setup.xml    |  3 +-
 .../main/res/layout/fragment_chat_list.xml    |  4 +-
 app/src/main/res/layout/fragment_messages.xml |  3 +-
 app/src/main/res/layout/fragment_toolbar.xml  |  3 +-
 .../res/layout/setup_account_connection.xml   |  5 +-
 .../main/res/layout/setup_account_edit.xml    |  4 +-
 .../main/res/layout/setup_account_name.xml    |  5 +-
 .../main/res/layout/setup_account_user.xml    |  5 +-
 .../main/res/layout/setup_select_account.xml  |  5 +-
 app/src/main/res/layout/setup_slide.xml       |  4 +-
 app/src/main/res/layout/widget_buffer.xml     |  4 +-
 .../res/layout/widget_chatmessage_action.xml  |  4 +-
 .../res/layout/widget_chatmessage_error.xml   |  4 +-
 .../res/layout/widget_chatmessage_info.xml    |  4 +-
 .../res/layout/widget_chatmessage_notice.xml  |  4 +-
 .../layout/widget_chatmessage_placeholder.xml |  5 +-
 .../res/layout/widget_chatmessage_plain.xml   |  4 +-
 .../res/layout/widget_chatmessage_server.xml  |  4 +-
 .../main/res/layout/widget_core_account.xml   |  3 +-
 .../res/layout/widget_core_account_add.xml    |  3 +-
 app/src/main/res/layout/widget_network.xml    |  4 +-
 app/src/main/res/layout/widget_nick.xml       |  4 +-
 app/src/main/res/layout/widget_nick_away.xml  |  4 +-
 .../res/layout/widget_spinner_item_inline.xml |  4 +-
 .../layout/widget_spinner_item_toolbar.xml    |  3 +-
 app/src/main/res/values/preferences.xml       | 80 +++++++++++++++++++
 app/src/main/res/values/themes_amoled.xml     |  6 +-
 app/src/main/res/values/themes_base.xml       |  6 +-
 app/src/main/res/values/themes_quassel.xml    | 10 +--
 app/src/main/res/values/themes_solarized.xml  | 14 ++--
 app/src/main/res/xml/preferences.xml          | 57 +++++++++++++
 .../malheur/collectors/ReportCollector.kt     |  2 +-
 .../java/de/kuschku/malheur/data/Report.kt    | 12 +--
 53 files changed, 426 insertions(+), 151 deletions(-)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsFragment.kt
 create mode 100644 app/src/main/res/layout/activity_settings.xml
 create mode 100644 app/src/main/res/values/preferences.xml
 create mode 100644 app/src/main/res/xml/preferences.xml

diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a5a88f521..16103cc43 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -98,6 +98,8 @@ dependencies {
     implementation("com.android.support", "customtabs", version)
     implementation("com.android.support", "cardview-v7", version)
     implementation("com.android.support", "recyclerview-v7", version)
+    implementation("com.android.support", "preference-v7", version)
+    implementation("com.android.support", "preference-v14", version)
   }
   implementation("com.android.support.constraint", "constraint-layout", "1.0.2")
 
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4e3e33c81..b1135242e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -28,6 +28,12 @@
       android:label="@string/app_name"
       android:parentActivityName=".ui.setup.accounts.AccountSelectionActivity"
       android:windowSoftInputMode="adjustResize" />
+    <activity
+      android:name=".ui.settings.SettingsActivity"
+      android:exported="false"
+      android:label="@string/app_name"
+      android:parentActivityName=".ui.chat.ChatActivity"
+      android:windowSoftInputMode="adjustResize" />
     <activity
       android:name=".ui.setup.accounts.AccountSelectionActivity"
       android:exported="true"
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
index 16c3177cf..47dbac27c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
@@ -27,6 +27,9 @@ class QuasseldroidNG : Application() {
 
     AndroidThreeTenBackport.init(this)
 
+    // Initialize preferences unless already set
+    android.support.v7.preference.PreferenceManager.setDefaultValues(this, R.xml.preferences, false)
+
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
       systemService<ShortcutManager>().dynamicShortcuts = listOf(
         ShortcutInfo.Builder(this, "id1")
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
index 6d22c4ca9..0f7582815 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
@@ -4,6 +4,7 @@ import android.app.Activity
 import android.arch.lifecycle.Observer
 import android.arch.lifecycle.ViewModelProviders
 import android.content.Context
+import android.content.Intent
 import android.os.Bundle
 import android.support.design.widget.Snackbar
 import android.support.v4.widget.DrawerLayout
@@ -22,6 +23,7 @@ import de.kuschku.quasseldroid_ng.Keys
 import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.persistence.AccountDatabase
 import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
+import de.kuschku.quasseldroid_ng.ui.settings.SettingsActivity
 import de.kuschku.quasseldroid_ng.ui.settings.data.BacklogSettings
 import de.kuschku.quasseldroid_ng.ui.viewmodel.QuasselViewModel
 import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
@@ -195,6 +197,10 @@ class ChatActivity : ServiceBoundActivity() {
       }
       true
     }
+    R.id.settings     -> {
+      startActivity(Intent(applicationContext, SettingsActivity::class.java))
+      true
+    }
     R.id.disconnect   -> {
       handler.post {
         getSharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE).editApply {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListFragment.kt
index 4888f6857..9f1691318 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListFragment.kt
@@ -11,6 +11,7 @@ import android.view.ViewGroup
 import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.quasseldroid_ng.R
+import de.kuschku.quasseldroid_ng.ui.settings.Settings
 import de.kuschku.quasseldroid_ng.ui.settings.data.AppearanceSettings
 import de.kuschku.quasseldroid_ng.ui.viewmodel.QuasselViewModel
 import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
@@ -27,18 +28,14 @@ class NickListFragment : ServiceBoundFragment() {
   lateinit var nickList: RecyclerView
 
   private var ircFormatDeserializer: IrcFormatDeserializer? = null
-  private val renderingSettings = AppearanceSettings(
-    showPrefix = AppearanceSettings.ShowPrefixMode.FIRST,
-    colorizeNicknames = AppearanceSettings.ColorizeNicknamesMode.ALL_BUT_MINE,
-    colorizeMirc = true,
-    timeFormat = ""
-  )
+  private lateinit var appearanceSettings: AppearanceSettings
 
   override fun onCreate(savedInstanceState: Bundle?) {
     handlerThread.onCreate()
     super.onCreate(savedInstanceState)
 
     viewModel = ViewModelProviders.of(activity!!)[QuasselViewModel::class.java]
+    appearanceSettings = Settings.appearance(activity!!)
 
     if (ircFormatDeserializer == null) {
       ircFormatDeserializer = IrcFormatDeserializer(context!!)
@@ -56,7 +53,7 @@ class NickListFragment : ServiceBoundFragment() {
         it.map {
           it.copy(
             realname = ircFormatDeserializer?.formatString(
-              it.realname.toString(), renderingSettings.colorizeMirc
+              it.realname.toString(), appearanceSettings.colorizeMirc
             ) ?: it.realname
           )
         }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt
index 999c4121d..28725d2a3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt
@@ -14,6 +14,7 @@ import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.util.hasFlag
 import de.kuschku.quasseldroid_ng.R
+import de.kuschku.quasseldroid_ng.ui.settings.Settings
 import de.kuschku.quasseldroid_ng.ui.settings.data.AppearanceSettings
 import de.kuschku.quasseldroid_ng.ui.viewmodel.QuasselViewModel
 import de.kuschku.quasseldroid_ng.util.helper.visibleIf
@@ -32,12 +33,7 @@ class ToolbarFragment : ServiceBoundFragment() {
   private lateinit var viewModel: QuasselViewModel
 
   private var ircFormatDeserializer: IrcFormatDeserializer? = null
-  private val appearanceSettings = AppearanceSettings(
-    showPrefix = AppearanceSettings.ShowPrefixMode.FIRST,
-    colorizeNicknames = AppearanceSettings.ColorizeNicknamesMode.ALL_BUT_MINE,
-    colorizeMirc = true,
-    timeFormat = ""
-  )
+  private lateinit var appearanceSettings: AppearanceSettings
 
   var title: CharSequence?
     get() = toolbarTitle.text
@@ -59,6 +55,7 @@ class ToolbarFragment : ServiceBoundFragment() {
     super.onCreate(savedInstanceState)
 
     viewModel = ViewModelProviders.of(activity!!)[QuasselViewModel::class.java]
+    appearanceSettings = Settings.appearance(activity!!)
 
     if (ircFormatDeserializer == null) {
       ircFormatDeserializer = IrcFormatDeserializer(context!!)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/buffers/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/buffers/BufferViewConfigFragment.kt
index 5b2aa53e9..d2e8bfb0d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/buffers/BufferViewConfigFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/buffers/BufferViewConfigFragment.kt
@@ -11,6 +11,7 @@ import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.libquassel.protocol.BufferId
 import de.kuschku.quasseldroid_ng.R
+import de.kuschku.quasseldroid_ng.ui.settings.Settings
 import de.kuschku.quasseldroid_ng.ui.settings.data.AppearanceSettings
 import de.kuschku.quasseldroid_ng.ui.viewmodel.QuasselViewModel
 import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
@@ -33,18 +34,14 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
   private lateinit var viewModel: QuasselViewModel
 
   private var ircFormatDeserializer: IrcFormatDeserializer? = null
-  private val renderingSettings = AppearanceSettings(
-    showPrefix = AppearanceSettings.ShowPrefixMode.FIRST,
-    colorizeNicknames = AppearanceSettings.ColorizeNicknamesMode.ALL_BUT_MINE,
-    colorizeMirc = true,
-    timeFormat = ""
-  )
+  private lateinit var appearanceSettings: AppearanceSettings
 
   override fun onCreate(savedInstanceState: Bundle?) {
     handlerThread.onCreate()
     super.onCreate(savedInstanceState)
 
     viewModel = ViewModelProviders.of(activity!!)[QuasselViewModel::class.java]
+    appearanceSettings = Settings.appearance(activity!!)
 
     if (ircFormatDeserializer == null) {
       ircFormatDeserializer = IrcFormatDeserializer(context!!)
@@ -77,7 +74,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
         it.map {
           it.copy(
             description = ircFormatDeserializer?.formatString(
-              it.description.toString(), renderingSettings.colorizeMirc
+              it.description.toString(), appearanceSettings.colorizeMirc
             ) ?: it.description
           )
         }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageAdapter.kt
index 41d648d42..0d9ea45bb 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageAdapter.kt
@@ -15,6 +15,7 @@ import de.kuschku.quasseldroid_ng.util.helper.getOrPut
 
 class MessageAdapter(
   context: Context,
+  appearanceSettings: AppearanceSettings,
   var markerLinePosition: Pair<MsgId, MsgId>? = null
 ) : PagedListAdapter<QuasselDatabase.DatabaseMessage, QuasselMessageViewHolder>(
   object : DiffCallback<QuasselDatabase.DatabaseMessage>() {
@@ -31,12 +32,7 @@ class MessageAdapter(
 ) {
   private val messageRenderer: MessageRenderer = QuasselMessageRenderer(
     context,
-    AppearanceSettings(
-      showPrefix = AppearanceSettings.ShowPrefixMode.FIRST,
-      colorizeNicknames = AppearanceSettings.ColorizeNicknamesMode.ALL_BUT_MINE,
-      colorizeMirc = true,
-      timeFormat = ""
-    )
+    appearanceSettings
   )
 
   private val messageCache = LruCache<Int, FormattedMessage>(512)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt
index 3494f74de..1b5a92978 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt
@@ -18,6 +18,8 @@ import de.kuschku.libquassel.protocol.MsgId
 import de.kuschku.libquassel.quassel.syncables.BufferSyncer
 import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
+import de.kuschku.quasseldroid_ng.ui.settings.Settings
+import de.kuschku.quasseldroid_ng.ui.settings.data.AppearanceSettings
 import de.kuschku.quasseldroid_ng.ui.settings.data.BacklogSettings
 import de.kuschku.quasseldroid_ng.ui.viewmodel.QuasselViewModel
 import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
@@ -32,6 +34,7 @@ class MessageListFragment : ServiceBoundFragment() {
   lateinit var scrollDown: FloatingActionButton
 
   private lateinit var viewModel: QuasselViewModel
+  private lateinit var appearanceSettings: AppearanceSettings
 
   private val handler = AndroidHandlerThread("Chat")
 
@@ -48,6 +51,7 @@ class MessageListFragment : ServiceBoundFragment() {
     handler.onCreate()
     super.onCreate(savedInstanceState)
     viewModel = ViewModelProviders.of(activity!!)[QuasselViewModel::class.java]
+    appearanceSettings = Settings.appearance(activity!!)
     setHasOptionsMenu(true)
   }
 
@@ -65,7 +69,7 @@ class MessageListFragment : ServiceBoundFragment() {
     linearLayoutManager = LinearLayoutManager(context)
     linearLayoutManager.reverseLayout = true
 
-    adapter = MessageAdapter(context!!)
+    adapter = MessageAdapter(context!!, appearanceSettings)
     messageList.adapter = adapter
     messageList.layoutManager = linearLayoutManager
     messageList.itemAnimator = null
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/QuasselMessageRenderer.kt
index 3f250853e..c797b728a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/QuasselMessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/QuasselMessageRenderer.kt
@@ -4,7 +4,6 @@ import android.content.Context
 import android.graphics.Typeface
 import android.text.SpannableString
 import android.text.Spanned
-import android.text.format.DateFormat
 import android.text.style.ForegroundColorSpan
 import android.text.style.StyleSpan
 import android.text.style.URLSpan
@@ -26,19 +25,24 @@ import de.kuschku.quasseldroid_ng.util.ui.SpanFormatter
 import org.intellij.lang.annotations.Language
 import org.threeten.bp.ZoneId
 import org.threeten.bp.format.DateTimeFormatter
-import java.text.SimpleDateFormat
 
 class QuasselMessageRenderer(
   private val context: Context,
   private val appearanceSettings: AppearanceSettings
 ) : MessageRenderer {
   private val timeFormatter = DateTimeFormatter.ofPattern(
-    if (appearanceSettings.timeFormat.isNotBlank()) {
-      appearanceSettings.timeFormat
-    } else {
-      (DateFormat.getTimeFormat(context) as SimpleDateFormat).toLocalizedPattern()
-    }
+    timePattern(appearanceSettings.showSeconds, appearanceSettings.use24hClock)
   )
+
+  private fun timePattern(showSeconds: Boolean,
+                          use24hClock: Boolean) = when (use24hClock to showSeconds) {
+    false to true  -> "hh:mm:ss a"
+    false to false -> "hh:mm a"
+
+    true to true   -> "HH:mm:ss"
+    else           -> "HH:mm"
+  }
+
   private lateinit var senderColors: IntArray
 
   private val zoneId = ZoneId.systemDefault()
@@ -324,8 +328,8 @@ class QuasselMessageRenderer(
 
   private fun formatPrefix(prefix: String,
                            highlight: Boolean) = when (appearanceSettings.showPrefix) {
-    ShowPrefixMode.ALL   -> prefix
-    ShowPrefixMode.FIRST -> prefix.substring(0, Math.min(prefix.length, 1))
-    ShowPrefixMode.NONE  -> ""
+    ShowPrefixMode.ALL     -> prefix
+    ShowPrefixMode.HIGHEST -> prefix.substring(0, Math.min(prefix.length, 1))
+    ShowPrefixMode.NONE    -> ""
   }
 }
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.kt
index 91a4ab818..402daaf10 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.kt
@@ -1,10 +1,61 @@
 package de.kuschku.quasseldroid_ng.ui.settings
 
 import android.content.Context
+import android.content.SharedPreferences
+import android.preference.PreferenceManager
+import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.ui.settings.data.AppearanceSettings
+import de.kuschku.quasseldroid_ng.ui.settings.data.AppearanceSettings.*
 import de.kuschku.quasseldroid_ng.ui.settings.data.BacklogSettings
 
 object Settings {
-  fun appearance(context: Context) = AppearanceSettings()
-  fun backlog(context: Context) = BacklogSettings()
+  private fun <T> settings(context: Context,
+                           f: SharedPreferences.() -> T) = PreferenceManager.getDefaultSharedPreferences(
+    context
+  ).f()
+
+  fun appearance(context: Context) = settings(context) {
+    AppearanceSettings(
+      theme = Theme.valueOf(
+        getString(
+          context.getString(R.string.preference_theme_key),
+          AppearanceSettings.DEFAULT.theme.name
+        )
+      ),
+      showPrefix = ShowPrefixMode.valueOf(
+        getString(
+          context.getString(R.string.preference_show_prefix_key),
+          AppearanceSettings.DEFAULT.showPrefix.name
+        )
+      ),
+      colorizeNicknames = ColorizeNicknamesMode.valueOf(
+        getString(
+          context.getString(R.string.preference_colorize_nicknames_key),
+          AppearanceSettings.DEFAULT.colorizeNicknames.name
+        )
+      ),
+      colorizeMirc = getBoolean(
+        context.getString(R.string.preference_colorize_mirc_key),
+        AppearanceSettings.DEFAULT.colorizeMirc
+      ),
+      showSeconds = getBoolean(
+        context.getString(R.string.preference_show_seconds_key),
+        AppearanceSettings.DEFAULT.showSeconds
+      ),
+      use24hClock = getBoolean(
+        context.getString(R.string.preference_use_24h_clock_key),
+        AppearanceSettings.DEFAULT.use24hClock
+      ),
+      showLag = getBoolean(
+        context.getString(R.string.preference_show_lag_key),
+        AppearanceSettings.DEFAULT.showLag
+      )
+    )
+  }
+
+  fun backlog(context: Context) = settings(context) {
+    BacklogSettings(
+
+    )
+  }
 }
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.kt
new file mode 100644
index 000000000..c5515e710
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.kt
@@ -0,0 +1,22 @@
+package de.kuschku.quasseldroid_ng.ui.settings
+
+import android.os.Bundle
+import android.support.v7.widget.Toolbar
+import butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.quasseldroid_ng.R
+import de.kuschku.quasseldroid_ng.util.service.ServiceBoundActivity
+
+class SettingsActivity : ServiceBoundActivity() {
+  @BindView(R.id.toolbar)
+  lateinit var toolbar: Toolbar
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+    setContentView(R.layout.activity_settings)
+    ButterKnife.bind(this)
+
+    setSupportActionBar(toolbar)
+    supportActionBar?.setDisplayHomeAsUpEnabled(true)
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsFragment.kt
new file mode 100644
index 000000000..7c6442061
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsFragment.kt
@@ -0,0 +1,57 @@
+package de.kuschku.quasseldroid_ng.ui.settings
+
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.support.v7.preference.ListPreference
+import android.support.v7.preference.Preference
+import android.support.v7.preference.PreferenceFragmentCompat
+import android.support.v7.preference.PreferenceGroup
+import de.kuschku.quasseldroid_ng.R
+import de.kuschku.quasseldroid_ng.ui.settings.data.AppearanceSettings
+
+class SettingsFragment : PreferenceFragmentCompat(),
+                         SharedPreferences.OnSharedPreferenceChangeListener {
+  var appearanceSettings: AppearanceSettings? = null
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+    appearanceSettings = Settings.appearance(context!!)
+  }
+
+  override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+    setPreferencesFromResource(R.xml.preferences, rootKey)
+  }
+
+  override fun onStart() {
+    super.onStart()
+    preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
+    initSummary(preferenceScreen)
+  }
+
+  override fun onStop() {
+    preferenceScreen.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
+    super.onStop()
+  }
+
+  override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
+    updateSummary(findPreference(key))
+    if (appearanceSettings?.theme != null &&
+        appearanceSettings?.theme != Settings.appearance(context!!).theme) {
+      activity?.recreate()
+    }
+  }
+
+  fun updateSummary(preference: Preference) {
+    if (preference is ListPreference) {
+      preference.summary = preference.entry
+    }
+  }
+
+  fun initSummary(preference: Preference) {
+    if (preference is PreferenceGroup) {
+      (0 until preference.preferenceCount).map(preference::getPreference).forEach(::initSummary)
+    } else {
+      updateSummary(preference)
+    }
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/AppearanceSettings.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/AppearanceSettings.kt
index 0051ebaeb..fa9d8f49a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/AppearanceSettings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/AppearanceSettings.kt
@@ -4,10 +4,11 @@ import android.support.annotation.StyleRes
 import de.kuschku.quasseldroid_ng.R
 
 data class AppearanceSettings(
-  val showPrefix: ShowPrefixMode = ShowPrefixMode.FIRST,
+  val showPrefix: ShowPrefixMode = ShowPrefixMode.HIGHEST,
   val colorizeNicknames: ColorizeNicknamesMode = ColorizeNicknamesMode.ALL_BUT_MINE,
   val colorizeMirc: Boolean = true,
-  val timeFormat: String = "",
+  val showSeconds: Boolean = false,
+  val use24hClock: Boolean = true,
   val showLag: Boolean = true,
   val theme: Theme = Theme.QUASSEL_LIGHT
 ) {
@@ -19,15 +20,19 @@ data class AppearanceSettings(
 
   enum class ShowPrefixMode {
     ALL,
-    FIRST,
+    HIGHEST,
     NONE
   }
 
   enum class Theme(@StyleRes val style: Int) {
     QUASSEL_LIGHT(R.style.Theme_ChatTheme_Quassel_Light),
     QUASSEL_DARK(R.style.Theme_ChatTheme_Quassel_Dark),
+    AMOLED(R.style.Theme_ChatTheme_Amoled),
     SOLARIZED_LIGHT(R.style.Theme_ChatTheme_Solarized_Light),
-    SOLARIZED_DARK(R.style.Theme_ChatTheme_Solarized_Dark),
-    AMOLED(R.style.Theme_ChatTheme_Amoled)
+    SOLARIZED_DARK(R.style.Theme_ChatTheme_Solarized_Dark)
+  }
+
+  companion object {
+    val DEFAULT = AppearanceSettings()
   }
 }
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/BacklogSettings.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/BacklogSettings.kt
index f72172969..f432c9262 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/BacklogSettings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/data/BacklogSettings.kt
@@ -2,4 +2,8 @@ package de.kuschku.quasseldroid_ng.ui.settings.data
 
 data class BacklogSettings(
   val dynamicAmount: Int = 20
-)
\ No newline at end of file
+) {
+  companion object {
+    val DEFAULT = BacklogSettings()
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/SetupActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/SetupActivity.kt
index cbee7923d..8ff478213 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/SetupActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/SetupActivity.kt
@@ -60,6 +60,7 @@ abstract class SetupActivity : AppCompatActivity() {
     else
       R.drawable.ic_arrow_right
     button.setImageResource(drawable)
+    currentPage.value?.requestFocus()
   }
 
   fun updateRecentsHeader()
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/SlideFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/SlideFragment.kt
index b06899e1a..c12ea2297 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/SlideFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/SlideFragment.kt
@@ -69,6 +69,10 @@ abstract class SlideFragment : Fragment() {
   abstract fun getData(data: Bundle)
   var initData: Bundle? = null
 
+  fun requestFocus() {
+    this.view?.requestFocus()
+  }
+
   protected abstract fun onCreateContent(inflater: LayoutInflater, container: ViewGroup?,
                                          savedInstanceState: Bundle?): View
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/service/ServiceBoundActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/service/ServiceBoundActivity.kt
index b2367185d..a64921334 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/service/ServiceBoundActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/service/ServiceBoundActivity.kt
@@ -24,6 +24,7 @@ abstract class ServiceBoundActivity : AppCompatActivity() {
   protected lateinit var appearanceSettings: AppearanceSettings
 
   override fun onCreate(savedInstanceState: Bundle?) {
+
     connection.context = this
     appearanceSettings = Settings.appearance(this)
     setTheme(appearanceSettings.theme.style)
@@ -41,6 +42,9 @@ abstract class ServiceBoundActivity : AppCompatActivity() {
   }
 
   override fun onStart() {
+    if (Settings.appearance(this) != appearanceSettings) {
+      recreate()
+    }
     connection.bind()
     super.onStart()
   }
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 4361f9d80..076e9706c 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -4,8 +4,7 @@
   android:id="@+id/drawerLayout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
-  android:fitsSystemWindows="true"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:fitsSystemWindows="true">
 
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 000000000..f9a771bbe
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,38 @@
+<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:app="http://schemas.android.com/apk/res-auto"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:fitsSystemWindows="true">
+
+  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true"
+    android:orientation="vertical">
+
+    <android.support.design.widget.AppBarLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:theme="?attr/actionBarTheme">
+
+      <android.support.v7.widget.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        app:contentInsetStartWithNavigation="0dp"
+        app:popupTheme="@style/Widget.PopupOverlay" />
+
+    </android.support.design.widget.AppBarLayout>
+
+    <fragment
+      android:id="@+id/settingsFragment"
+      android:name="de.kuschku.quasseldroid_ng.ui.settings.SettingsFragment"
+      android:layout_width="fill_parent"
+      android:layout_height="fill_parent"
+      tools:layout="@xml/preferences" />
+  </LinearLayout>
+
+</android.support.v4.widget.DrawerLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_setup.xml b/app/src/main/res/layout/activity_setup.xml
index 81175f085..a0a74dc86 100644
--- a/app/src/main/res/layout/activity_setup.xml
+++ b/app/src/main/res/layout/activity_setup.xml
@@ -2,8 +2,7 @@
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
-  android:layout_height="match_parent"
-  tools:theme="@style/Theme.SetupTheme">
+  android:layout_height="match_parent">
 
   <android.support.v4.view.ViewPager
     android:id="@+id/view_pager"
diff --git a/app/src/main/res/layout/fragment_chat_list.xml b/app/src/main/res/layout/fragment_chat_list.xml
index 1dc6351ef..58460b41a 100644
--- a/app/src/main/res/layout/fragment_chat_list.xml
+++ b/app/src/main/res/layout/fragment_chat_list.xml
@@ -3,9 +3,7 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
-  android:orientation="vertical"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:orientation="vertical">
 
   <android.support.design.widget.AppBarLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/fragment_messages.xml b/app/src/main/res/layout/fragment_messages.xml
index e8323981d..86ae1bcc5 100644
--- a/app/src/main/res/layout/fragment_messages.xml
+++ b/app/src/main/res/layout/fragment_messages.xml
@@ -5,8 +5,7 @@
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="?attr/colorBackground"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  tools:showIn="@layout/activity_main">
 
   <android.support.v7.widget.RecyclerView
     android:id="@+id/messages"
diff --git a/app/src/main/res/layout/fragment_toolbar.xml b/app/src/main/res/layout/fragment_toolbar.xml
index 6a2d72413..ee13a2287 100644
--- a/app/src/main/res/layout/fragment_toolbar.xml
+++ b/app/src/main/res/layout/fragment_toolbar.xml
@@ -12,8 +12,7 @@
   android:minHeight="?attr/actionBarSize"
   android:orientation="vertical"
   android:theme="?attr/actionBarTheme"
-  tools:showIn="@layout/activity_main"
-  tools:theme="@style/Widget.AppBarOverlay">
+  tools:showIn="@layout/activity_main">
 
   <LinearLayout
     android:layout_width="wrap_content"
diff --git a/app/src/main/res/layout/setup_account_connection.xml b/app/src/main/res/layout/setup_account_connection.xml
index 162ac4321..499b64e16 100644
--- a/app/src/main/res/layout/setup_account_connection.xml
+++ b/app/src/main/res/layout/setup_account_connection.xml
@@ -2,13 +2,10 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
-  xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
-  android:padding="32dp"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.SetupTheme">
+  android:padding="32dp">
 
   <android.support.design.widget.TextInputLayout
     android:id="@+id/hostWrapper"
diff --git a/app/src/main/res/layout/setup_account_edit.xml b/app/src/main/res/layout/setup_account_edit.xml
index bfc7e62d9..715e30623 100644
--- a/app/src/main/res/layout/setup_account_edit.xml
+++ b/app/src/main/res/layout/setup_account_edit.xml
@@ -2,9 +2,7 @@
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
-  android:layout_height="match_parent"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.SetupTheme">
+  android:layout_height="match_parent">
 
   <LinearLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/setup_account_name.xml b/app/src/main/res/layout/setup_account_name.xml
index 0bf1ecfcd..591099361 100644
--- a/app/src/main/res/layout/setup_account_name.xml
+++ b/app/src/main/res/layout/setup_account_name.xml
@@ -1,12 +1,9 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
-  xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
-  android:padding="32dp"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.SetupTheme">
+  android:padding="32dp">
 
   <android.support.design.widget.TextInputLayout
     android:id="@+id/nameWrapper"
diff --git a/app/src/main/res/layout/setup_account_user.xml b/app/src/main/res/layout/setup_account_user.xml
index e75a654c6..4468f2c97 100644
--- a/app/src/main/res/layout/setup_account_user.xml
+++ b/app/src/main/res/layout/setup_account_user.xml
@@ -1,12 +1,9 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
-  xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
-  android:padding="32dp"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.SetupTheme">
+  android:padding="32dp">
 
   <android.support.design.widget.TextInputLayout
     android:id="@+id/userWrapper"
diff --git a/app/src/main/res/layout/setup_select_account.xml b/app/src/main/res/layout/setup_select_account.xml
index b2e81ee86..7961fd8dd 100644
--- a/app/src/main/res/layout/setup_select_account.xml
+++ b/app/src/main/res/layout/setup_select_account.xml
@@ -1,7 +1,4 @@
 <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
-  xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/account_list"
   android:layout_width="match_parent"
-  android:layout_height="match_parent"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.SetupTheme" />
+  android:layout_height="match_parent" />
diff --git a/app/src/main/res/layout/setup_slide.xml b/app/src/main/res/layout/setup_slide.xml
index 46f172494..54045a751 100644
--- a/app/src/main/res/layout/setup_slide.xml
+++ b/app/src/main/res/layout/setup_slide.xml
@@ -2,9 +2,7 @@
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
-  android:layout_height="match_parent"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.SetupTheme">
+  android:layout_height="match_parent">
 
   <android.support.design.widget.AppBarLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/widget_buffer.xml b/app/src/main/res/layout/widget_buffer.xml
index 12fdcea15..d181160f3 100644
--- a/app/src/main/res/layout/widget_buffer.xml
+++ b/app/src/main/res/layout/widget_buffer.xml
@@ -8,9 +8,7 @@
   android:paddingBottom="8dp"
   android:paddingLeft="16dp"
   android:paddingRight="16dp"
-  android:paddingTop="8dp"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:paddingTop="8dp">
 
   <ImageView
     android:id="@+id/status"
diff --git a/app/src/main/res/layout/widget_chatmessage_action.xml b/app/src/main/res/layout/widget_chatmessage_action.xml
index b23606b69..43dc3ce6c 100644
--- a/app/src/main/res/layout/widget_chatmessage_action.xml
+++ b/app/src/main/res/layout/widget_chatmessage_action.xml
@@ -26,9 +26,7 @@
   android:clickable="true"
   android:focusable="true"
   android:orientation="vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
   <LinearLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/widget_chatmessage_error.xml b/app/src/main/res/layout/widget_chatmessage_error.xml
index 1485a969a..9b8eac026 100644
--- a/app/src/main/res/layout/widget_chatmessage_error.xml
+++ b/app/src/main/res/layout/widget_chatmessage_error.xml
@@ -6,9 +6,7 @@
   android:clickable="true"
   android:focusable="true"
   android:orientation="vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
   <LinearLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/widget_chatmessage_info.xml b/app/src/main/res/layout/widget_chatmessage_info.xml
index b6d1f048c..0748dd14c 100644
--- a/app/src/main/res/layout/widget_chatmessage_info.xml
+++ b/app/src/main/res/layout/widget_chatmessage_info.xml
@@ -6,9 +6,7 @@
   android:clickable="true"
   android:focusable="true"
   android:orientation="vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
   <LinearLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/widget_chatmessage_notice.xml b/app/src/main/res/layout/widget_chatmessage_notice.xml
index 755a7d100..facbf98b2 100644
--- a/app/src/main/res/layout/widget_chatmessage_notice.xml
+++ b/app/src/main/res/layout/widget_chatmessage_notice.xml
@@ -6,9 +6,7 @@
   android:clickable="true"
   android:focusable="true"
   android:orientation="vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
   <LinearLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/widget_chatmessage_placeholder.xml b/app/src/main/res/layout/widget_chatmessage_placeholder.xml
index 5021308b2..bb9e5c8eb 100644
--- a/app/src/main/res/layout/widget_chatmessage_placeholder.xml
+++ b/app/src/main/res/layout/widget_chatmessage_placeholder.xml
@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
-  android:layout_height="48dp"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:layout_height="48dp">
 
   <TextView
     android:id="@+id/time"
diff --git a/app/src/main/res/layout/widget_chatmessage_plain.xml b/app/src/main/res/layout/widget_chatmessage_plain.xml
index 54b7db732..6828a4424 100644
--- a/app/src/main/res/layout/widget_chatmessage_plain.xml
+++ b/app/src/main/res/layout/widget_chatmessage_plain.xml
@@ -6,9 +6,7 @@
   android:clickable="true"
   android:focusable="true"
   android:orientation="vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
   <LinearLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/widget_chatmessage_server.xml b/app/src/main/res/layout/widget_chatmessage_server.xml
index b9ba45aec..7e5f7caf9 100644
--- a/app/src/main/res/layout/widget_chatmessage_server.xml
+++ b/app/src/main/res/layout/widget_chatmessage_server.xml
@@ -6,9 +6,7 @@
   android:clickable="true"
   android:focusable="true"
   android:orientation="vertical"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:textAppearance="?android:attr/textAppearanceListItemSmall">
 
   <LinearLayout
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/widget_core_account.xml b/app/src/main/res/layout/widget_core_account.xml
index 041147810..0a8e02ba0 100644
--- a/app/src/main/res/layout/widget_core_account.xml
+++ b/app/src/main/res/layout/widget_core_account.xml
@@ -9,8 +9,7 @@
   android:focusableInTouchMode="false"
   android:orientation="horizontal"
   android:paddingLeft="16dp"
-  android:paddingRight="16dp"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:paddingRight="16dp">
 
   <LinearLayout
     android:layout_width="48dp"
diff --git a/app/src/main/res/layout/widget_core_account_add.xml b/app/src/main/res/layout/widget_core_account_add.xml
index 464c45b4e..f6c839109 100644
--- a/app/src/main/res/layout/widget_core_account_add.xml
+++ b/app/src/main/res/layout/widget_core_account_add.xml
@@ -9,8 +9,7 @@
   android:focusableInTouchMode="false"
   android:orientation="horizontal"
   android:paddingLeft="16dp"
-  android:paddingRight="16dp"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:paddingRight="16dp">
 
   <ImageView
     android:layout_width="32dp"
diff --git a/app/src/main/res/layout/widget_network.xml b/app/src/main/res/layout/widget_network.xml
index 8d68d7c8e..89af4b1c5 100644
--- a/app/src/main/res/layout/widget_network.xml
+++ b/app/src/main/res/layout/widget_network.xml
@@ -5,9 +5,7 @@
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="?attr/selectableItemBackground"
-  android:orientation="vertical"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:orientation="vertical">
 
   <View
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/widget_nick.xml b/app/src/main/res/layout/widget_nick.xml
index 16673d31a..91a35f4a4 100644
--- a/app/src/main/res/layout/widget_nick.xml
+++ b/app/src/main/res/layout/widget_nick.xml
@@ -10,9 +10,7 @@
   android:paddingEnd="?listPreferredItemPaddingRight"
   android:paddingLeft="?listPreferredItemPaddingLeft"
   android:paddingRight="?listPreferredItemPaddingRight"
-  android:paddingStart="?listPreferredItemPaddingLeft"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:paddingStart="?listPreferredItemPaddingLeft">
 
   <FrameLayout
     android:id="@+id/modesContainer"
diff --git a/app/src/main/res/layout/widget_nick_away.xml b/app/src/main/res/layout/widget_nick_away.xml
index d97fe0069..29837a9bc 100644
--- a/app/src/main/res/layout/widget_nick_away.xml
+++ b/app/src/main/res/layout/widget_nick_away.xml
@@ -10,9 +10,7 @@
   android:paddingEnd="?listPreferredItemPaddingRight"
   android:paddingLeft="?listPreferredItemPaddingLeft"
   android:paddingRight="?listPreferredItemPaddingRight"
-  android:paddingStart="?listPreferredItemPaddingLeft"
-  tools:background="@android:color/background_light"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light">
+  android:paddingStart="?listPreferredItemPaddingLeft">
 
   <FrameLayout
     android:id="@+id/modesContainer"
diff --git a/app/src/main/res/layout/widget_spinner_item_inline.xml b/app/src/main/res/layout/widget_spinner_item_inline.xml
index bdbc09345..b21fc8158 100644
--- a/app/src/main/res/layout/widget_spinner_item_inline.xml
+++ b/app/src/main/res/layout/widget_spinner_item_inline.xml
@@ -1,9 +1,7 @@
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-  xmlns:tools="http://schemas.android.com/tools"
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:gravity="center_vertical"
   android:minHeight="48dp"
-  android:textAppearance="?android:attr/textAppearanceListItemSmall"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light" />
+  android:textAppearance="?android:attr/textAppearanceListItemSmall" />
diff --git a/app/src/main/res/layout/widget_spinner_item_toolbar.xml b/app/src/main/res/layout/widget_spinner_item_toolbar.xml
index 5c14c6cad..fa2ad16dc 100644
--- a/app/src/main/res/layout/widget_spinner_item_toolbar.xml
+++ b/app/src/main/res/layout/widget_spinner_item_toolbar.xml
@@ -8,5 +8,4 @@
   android:paddingLeft="16dp"
   android:paddingRight="16dp"
   android:textAppearance="?android:attr/textAppearanceListItemSmall"
-  tools:text="All Chats"
-  tools:theme="@style/Theme.ChatTheme.Quassel_Light" />
+  tools:text="All Chats" />
diff --git a/app/src/main/res/values/preferences.xml b/app/src/main/res/values/preferences.xml
new file mode 100644
index 000000000..6af1e9c18
--- /dev/null
+++ b/app/src/main/res/values/preferences.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+  <string name="preference_appearance_title">Appearance</string>
+
+  <string name="preference_theme_key" translatable="false">theme</string>
+  <string name="preference_theme_title">Theme</string>
+  <string name="preference_theme_entry_quassel_light">Quassel (Light)</string>
+  <string name="preference_theme_entry_quassel_dark">Quassel (Dark)</string>
+  <string name="preference_theme_entry_amoled">AMOLED</string>
+  <string name="preference_theme_entry_solarized_light">Solarized (Light)</string>
+  <string name="preference_theme_entry_solarized_dark">Solarized (Dark)</string>
+  <string-array name="preference_theme_entries">
+    <item>@string/preference_theme_entry_quassel_light</item>
+    <item>@string/preference_theme_entry_quassel_dark</item>
+    <item>@string/preference_theme_entry_amoled</item>
+    <item>@string/preference_theme_entry_solarized_light</item>
+    <item>@string/preference_theme_entry_solarized_dark</item>
+  </string-array>
+  <string-array name="preference_theme_entryvalues">
+    <item>QUASSEL_LIGHT</item>
+    <item>QUASSEL_DARK</item>
+    <item>AMOLED</item>
+    <item>SOLARIZED_LIGHT</item>
+    <item>SOLARIZED_DARK</item>
+  </string-array>
+
+  <string name="preference_colorize_mirc_key" translatable="false">colorize_mirc</string>
+  <string name="preference_colorize_mirc_title">Use mIRC Colors</string>
+  <string name="preference_colorize_mirc_summaryon">Show mIRC colors in messages</string>
+  <string name="preference_colorize_mirc_summaryoff">Strip mIRC colors from messages</string>
+
+  <string name="preference_colorize_nicknames_key" translatable="false">colorize_nicknames</string>
+  <string name="preference_colorize_nicknames_title">Colorize nicknames</string>
+  <string name="preference_colorize_nicknames_entry_all">All nicks</string>
+  <string name="preference_colorize_nicknames_entry_all_but_mine">All but own nick</string>
+  <string name="preference_colorize_nicknames_entry_none">No nicks</string>
+  <string-array name="preference_colorize_nicknames_entries">
+    <item>@string/preference_colorize_nicknames_entry_all</item>
+    <item>@string/preference_colorize_nicknames_entry_all_but_mine</item>
+    <item>@string/preference_colorize_nicknames_entry_none</item>
+  </string-array>
+  <string-array name="preference_colorize_nicknames_entryvalues">
+    <item>ALL</item>
+    <item>ALL_BUT_MINE</item>
+    <item>NONE</item>
+  </string-array>
+
+  <string name="preference_show_prefix_key" translatable="false">show_prefix</string>
+  <string name="preference_show_prefix_title">Show sendermodes</string>
+  <string name="preference_show_prefix_entry_all">Allv modes</string>
+  <string name="preference_show_prefix_entry_highest">Highest mode</string>
+  <string name="preference_show_prefix_entry_none">No modes</string>
+  <string-array name="preference_show_prefix_entries">
+    <item>@string/preference_show_prefix_entry_all</item>
+    <item>@string/preference_show_prefix_entry_highest</item>
+    <item>@string/preference_show_prefix_entry_none</item>
+  </string-array>
+  <string-array name="preference_show_prefix_entryvalues">
+    <item>ALL</item>
+    <item>HIGHEST</item>
+    <item>NONE</item>
+  </string-array>
+
+  <string name="preference_show_seconds_key" translatable="false">show_seconds</string>
+  <string name="preference_show_seconds_title">Show Seconds</string>
+
+  <string name="preference_use_24h_clock_key" translatable="false">use_24h_clock</string>
+  <string name="preference_use_24h_clock_title">Use 24h Clock</string>
+
+  <string name="preference_show_lag_key" translatable="false">show_lag</string>
+  <string name="preference_show_lag_title">Show lag</string>
+  <string name="preference_show_lag_summary">Displays the lag between client and core in the action bar</string>
+
+
+  <string name="preference_backlog_title">Backlog</string>
+
+  <string name="preference_dynamic_fetch_key" translatable="false">dynamic_fetch</string>
+  <string name="preference_dynamic_fetch_title">Dynamic Fetch Amount</string>
+  <string name="preference_dynamic_fetch_summary">The number of backlog messages to fetch each time</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/themes_amoled.xml b/app/src/main/res/values/themes_amoled.xml
index 342af0aa2..378dccbf5 100644
--- a/app/src/main/res/values/themes_amoled.xml
+++ b/app/src/main/res/values/themes_amoled.xml
@@ -1,9 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <resources>
-  <string name="themeAmoledkName">AMOLED (Black)</string>
-  <string name="themeAmoledId">AMOLED</string>
-
+  <color name="amoled_background">#000000</color>
   <style name="Theme.ChatTheme.Amoled" parent="Theme.ChatTheme">
     <item name="colorPrimary">#000</item>
     <item name="colorPrimaryDark">#000</item>
@@ -48,6 +46,4 @@
     <item name="colorTintMessage">#2277dd</item>
     <item name="colorTintHighlight">#ff8811</item>
   </style>
-
-  <color name="amoled_background">#000000</color>
 </resources>
diff --git a/app/src/main/res/values/themes_base.xml b/app/src/main/res/values/themes_base.xml
index 7557a2d36..a0d987b33 100644
--- a/app/src/main/res/values/themes_base.xml
+++ b/app/src/main/res/values/themes_base.xml
@@ -35,8 +35,7 @@
   <style name="Theme.ChatTheme" parent="Base.ChatTheme">
     <item name="actionBarTheme">@style/Widget.AppBarOverlay</item>
     <item name="formatBarTheme">@style/Widget.AppBarOverlay</item>
-
-    <item name="android:windowBackground">@null</item>
+    <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
 
     <item name="windowActionModeOverlay">true</item>
 
@@ -71,8 +70,7 @@
   <style name="Theme.ChatTheme.Light" parent="Base.ChatTheme.Light">
     <item name="actionBarTheme">@style/Widget.AppBarOverlay</item>
     <item name="formatBarTheme">@style/Widget.AppBarOverlay.Light</item>
-
-    <item name="android:windowBackground">@null</item>
+    <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
 
     <item name="windowActionModeOverlay">true</item>
 
diff --git a/app/src/main/res/values/themes_quassel.xml b/app/src/main/res/values/themes_quassel.xml
index 918278e90..aa5fab1c6 100644
--- a/app/src/main/res/values/themes_quassel.xml
+++ b/app/src/main/res/values/themes_quassel.xml
@@ -1,9 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <resources>
-  <string name="themeQuasselLightName">Quasselâ„¢ (Light)</string>
-  <string name="themeQuasselLightId">QUASSEL_LIGHT</string>
-
+  <color name="quassel_light_background">#fafafa</color>
   <style name="Theme.ChatTheme.Quassel_Light" parent="Theme.ChatTheme.Light">
     <item name="senderColor0">#cc0000</item>
     <item name="senderColor1">#006cad</item>
@@ -31,6 +29,7 @@
 
     <item name="colorForegroundMirc">0x1</item>
 
+    <item name="android:windowBackground">@color/quassel_light_background</item>
     <item name="colorBackground">#FAFAFA</item>
     <item name="colorBackgroundHighlight">#FFA726</item>
     <item name="colorBackgroundSecondary">@null</item>
@@ -44,9 +43,7 @@
     <item name="colorTintHighlight">#ff8811</item>
   </style>
 
-  <string name="themeQuasselDarkName">Quasselâ„¢ (Dark)</string>
-  <string name="themeQuasselDarkId">QUASSEL_DARK</string>
-
+  <color name="quassel_dark_background">#303030</color>
   <style name="Theme.ChatTheme.Quassel_Dark" parent="Theme.ChatTheme">
     <item name="senderColor0">#cc0000</item>
     <item name="senderColor1">#006cad</item>
@@ -74,6 +71,7 @@
 
     <item name="colorForegroundMirc">0x0</item>
 
+    <item name="android:windowBackground">@color/quassel_dark_background</item>
     <item name="colorBackground">#303030</item>
     <item name="colorBackgroundHighlight">#FFA726</item>
     <item name="colorBackgroundSecondary">@null</item>
diff --git a/app/src/main/res/values/themes_solarized.xml b/app/src/main/res/values/themes_solarized.xml
index 926604c42..38d84d9c7 100644
--- a/app/src/main/res/values/themes_solarized.xml
+++ b/app/src/main/res/values/themes_solarized.xml
@@ -1,9 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <resources>
-  <string name="themeSolarizedLightName">Solarized (Light)</string>
-  <string name="themeSolarizedLightId">SOLARIZED_LIGHT</string>
-
+  <color name="solarized_light_background">#FDF6E3</color>
   <style name="Theme.ChatTheme.Solarized_Light" parent="Theme.ChatTheme.Light">
     <item name="colorPrimary">?attr/colorBackgroundCard</item>
     <item name="colorPrimaryDark">#b0ac9e</item>
@@ -35,8 +33,9 @@
     <item name="colorForegroundNotice">#B58900</item>
     <item name="colorForegroundError">#B00000</item>
 
-    <item name="colorForegroundMirc">0xF</item>
+    <item name="colorForegroundMirc">0x1</item>
 
+    <item name="android:windowBackground">@color/solarized_light_background</item>
     <item name="colorBackground">#FDF6E3</item>
     <item name="colorBackgroundHighlight">#D5A920</item>
     <item name="colorBackgroundSecondary">@null</item>
@@ -50,9 +49,7 @@
     <item name="colorTintHighlight">#EB6B36</item>
   </style>
 
-  <string name="themeSolarizedDarkName">Solarized (Dark)</string>
-  <string name="themeSolarizedDarkId">SOLARIZED_DARK</string>
-
+  <color name="solarized_dark_background">#002B36</color>
   <style name="Theme.ChatTheme.Solarized_Dark" parent="Theme.ChatTheme">
     <item name="colorPrimary">?attr/colorBackgroundCard</item>
     <item name="colorPrimaryDark">?attr/colorBackground</item>
@@ -82,8 +79,9 @@
     <item name="colorForegroundNotice">#B58900</item>
     <item name="colorForegroundError">#B00000</item>
 
-    <item name="colorForegroundMirc">0xF</item>
+    <item name="colorForegroundMirc">0x0</item>
 
+    <item name="android:windowBackground">@color/solarized_dark_background</item>
     <item name="colorBackground">#002B36</item>
     <item name="colorBackgroundHighlight">#D5A920</item>
     <item name="colorBackgroundSecondary">@null</item>
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
new file mode 100644
index 000000000..d6438d601
--- /dev/null
+++ b/app/src/main/res/xml/preferences.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+  <PreferenceCategory android:title="@string/preference_appearance_title">
+    <ListPreference
+      android:defaultValue="QUASSEL_LIGHT"
+      android:entries="@array/preference_theme_entries"
+      android:entryValues="@array/preference_theme_entryvalues"
+      android:key="@string/preference_theme_key"
+      android:title="@string/preference_theme_title" />
+
+    <SwitchPreference
+      android:defaultValue="true"
+      android:key="@string/preference_colorize_mirc_key"
+      android:summaryOff="@string/preference_colorize_mirc_summaryoff"
+      android:summaryOn="@string/preference_colorize_mirc_summaryon"
+      android:title="@string/preference_colorize_mirc_title" />
+
+    <DropDownPreference
+      android:defaultValue="ALL_BUT_MINE"
+      android:entries="@array/preference_colorize_nicknames_entries"
+      android:entryValues="@array/preference_colorize_nicknames_entryvalues"
+      android:key="@string/preference_colorize_nicknames_key"
+      android:title="@string/preference_colorize_nicknames_title" />
+
+    <DropDownPreference
+      android:defaultValue="HIGHEST"
+      android:entries="@array/preference_show_prefix_entries"
+      android:entryValues="@array/preference_show_prefix_entryvalues"
+      android:key="@string/preference_show_prefix_key"
+      android:title="@string/preference_show_prefix_title" />
+
+    <SwitchPreference
+      android:defaultValue="false"
+      android:key="@string/preference_show_seconds_key"
+      android:title="@string/preference_show_seconds_title" />
+
+    <SwitchPreference
+      android:defaultValue="true"
+      android:key="@string/preference_use_24h_clock_key"
+      android:title="@string/preference_use_24h_clock_title" />
+
+    <SwitchPreference
+      android:defaultValue="false"
+      android:key="@string/preference_show_lag_key"
+      android:summary="@string/preference_show_lag_summary"
+      android:title="@string/preference_show_lag_title" />
+  </PreferenceCategory>
+
+  <PreferenceCategory android:title="@string/preference_backlog_title">
+    <EditTextPreference
+      android:defaultValue="20"
+      android:inputType="number"
+      android:key="@string/preference_dynamic_fetch_key"
+      android:summary="@string/preference_dynamic_fetch_summary"
+      android:title="@string/preference_dynamic_fetch_title" />
+  </PreferenceCategory>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt
index 7c0eb23e6..ef90a81de 100644
--- a/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt
@@ -16,7 +16,7 @@ class ReportCollector(application: Application) : Collector<Report, ReportConfig
   override fun collect(context: CrashContext, config: ReportConfig) = Report(
     crash = crashCollector.collectIf(context, config.crash),
     threads = threadCollector.collectIf(context, config.threads),
-    logcat = logcatCollector.collectIf(context, config.logcat),
+    /*logcat = logcatCollector.collectIf(context, config.logcat),*/
     application = applicationCollector.collectIf(context, config.application),
     device = deviceCollector.collectIf(context, config.device),
     environment = environmentCollector.collectIf(context, config.environment)
diff --git a/malheur/src/main/java/de/kuschku/malheur/data/Report.kt b/malheur/src/main/java/de/kuschku/malheur/data/Report.kt
index 8cb399f44..ad675f752 100644
--- a/malheur/src/main/java/de/kuschku/malheur/data/Report.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/data/Report.kt
@@ -1,10 +1,10 @@
 package de.kuschku.malheur.data
 
 data class Report(
-  val crash: CrashInfo?,
-  val threads: ThreadsInfo?,
-  val logcat: Map<String, List<String>?>?,
-  val application: AppInfo?,
-  val device: DeviceInfo?,
-  val environment: EnvInfo?
+  val crash: CrashInfo? = null,
+  val threads: ThreadsInfo? = null,
+  val logcat: Map<String, List<String>?>? = null,
+  val application: AppInfo? = null,
+  val device: DeviceInfo? = null,
+  val environment: EnvInfo? = null
 )
-- 
GitLab