From f0eb83fc12a646dec3eb30ffc8ca1602d6068f4a Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 19 Apr 2018 00:15:27 +0200
Subject: [PATCH] Access client settings, crashes and about from setup screen

---
 .../chat/info/channel/ChannelInfoActivity.kt  |  4 +-
 .../ui/chat/info/user/UserInfoActivity.kt     |  4 +-
 .../ui/chat/topic/TopicActivity.kt            |  4 +-
 .../clientsettings/app/AppSettingsActivity.kt | 22 ------
 .../clientsettings/app/AppSettingsFragment.kt | 27 +++++++
 .../crash/CrashSettingsFragment.kt            |  6 +-
 .../ui/coresettings/CoreSettingsActivity.kt   |  4 +-
 .../aliasitem/AliasItemActivity.kt            |  4 +-
 .../aliaslist/AliasListActivity.kt            |  4 +-
 .../chatlist/ChatlistCreateActivity.kt        |  4 +-
 .../chatlist/ChatlistEditActivity.kt          |  4 +-
 .../highlightlist/HighlightListActivity.kt    |  4 +-
 .../highlightrule/HighlightRuleActivity.kt    |  4 +-
 .../identity/IdentityCreateActivity.kt        |  4 +-
 .../identity/IdentityEditActivity.kt          |  4 +-
 .../ignoreitem/IgnoreItemActivity.kt          |  4 +-
 .../ignorelist/IgnoreListActivity.kt          |  4 +-
 .../network/NetworkCreateActivity.kt          |  4 +-
 .../network/NetworkEditActivity.kt            |  4 +-
 .../networkconfig/NetworkConfigActivity.kt    |  4 +-
 .../networkserver/NetworkServerActivity.kt    |  4 +-
 .../quasseldroid/ui/setup/SetupActivity.kt    | 27 +++++++
 .../util/service/ServiceBoundActivity.kt      | 34 +-------
 .../util/ui/ServiceBoundSettingsActivity.kt   | 79 +++++++++++++++++++
 .../quasseldroid/util/ui/SettingsActivity.kt  |  3 +-
 .../quasseldroid/util/ui/ThemedActivity.kt    | 38 +++++++++
 .../layout-sw600dp-land/activity_setup.xml    |  7 ++
 .../res/layout-sw600dp/activity_setup.xml     |  7 ++
 app/src/main/res/layout/activity_setup.xml    |  7 ++
 app/src/main/res/menu/activity_setup.xml      | 12 +++
 app/src/main/res/values/themes_base.xml       |  5 +-
 31 files changed, 251 insertions(+), 95 deletions(-)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/ui/ServiceBoundSettingsActivity.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/ui/ThemedActivity.kt
 create mode 100644 app/src/main/res/menu/activity_setup.xml

diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoActivity.kt
index e61e55817..2b5bedf11 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/channel/ChannelInfoActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.chat.info.channel
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class ChannelInfoActivity : SettingsActivity(ChannelInfoFragment()) {
+class ChannelInfoActivity : ServiceBoundSettingsActivity(ChannelInfoFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoActivity.kt
index d26e2b3c9..af902b81c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoActivity.kt
@@ -4,9 +4,9 @@ import android.content.Context
 import android.content.Intent
 import de.kuschku.libquassel.protocol.BufferId
 import de.kuschku.libquassel.protocol.NetworkId
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class UserInfoActivity : SettingsActivity(UserInfoFragment()) {
+class UserInfoActivity : ServiceBoundSettingsActivity(UserInfoFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt
index bf935c2e6..6df8ee88a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.chat.topic
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class TopicActivity : SettingsActivity(TopicFragment()) {
+class TopicActivity : ServiceBoundSettingsActivity(TopicFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsActivity.kt
index 36831b076..b42b38709 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsActivity.kt
@@ -2,31 +2,9 @@ package de.kuschku.quasseldroid.ui.clientsettings.app
 
 import android.content.Context
 import android.content.Intent
-import android.view.Menu
-import android.view.MenuItem
-import de.kuschku.quasseldroid.R
-import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsActivity
-import de.kuschku.quasseldroid.ui.clientsettings.crash.CrashSettingsActivity
 import de.kuschku.quasseldroid.util.ui.SettingsActivity
 
 class AppSettingsActivity : SettingsActivity(AppSettingsFragment()) {
-  override fun onCreateOptionsMenu(menu: Menu?): Boolean {
-    menuInflater.inflate(R.menu.activity_settings, menu)
-    return super.onCreateOptionsMenu(menu)
-  }
-
-  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
-    R.id.action_about   -> {
-      AboutSettingsActivity.launch(this)
-      true
-    }
-    R.id.action_crashes -> {
-      CrashSettingsActivity.launch(this)
-      true
-    }
-    else                -> super.onOptionsItemSelected(item)
-  }
-
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, AppSettingsActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragment.kt
index e734b759a..db3ce7a5a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragment.kt
@@ -5,9 +5,14 @@ import android.os.Bundle
 import android.support.v7.preference.ListPreference
 import android.support.v7.preference.Preference
 import android.support.v7.preference.PreferenceGroup
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.settings.AppearanceSettings
 import de.kuschku.quasseldroid.settings.Settings
+import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.crash.CrashSettingsActivity
 import de.kuschku.quasseldroid.util.backport.DaggerPreferenceFragmentCompat
 import javax.inject.Inject
 
@@ -16,6 +21,11 @@ class AppSettingsFragment : DaggerPreferenceFragmentCompat(),
   @Inject
   lateinit var appearanceSettings: AppearanceSettings
 
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+    setHasOptionsMenu(true)
+  }
+
   override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
     setPreferencesFromResource(R.xml.preferences, rootKey)
   }
@@ -51,4 +61,21 @@ class AppSettingsFragment : DaggerPreferenceFragmentCompat(),
       updateSummary(preference)
     }
   }
+
+  override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
+    inflater?.inflate(R.menu.activity_settings, menu)
+    super.onCreateOptionsMenu(menu, inflater)
+  }
+
+  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
+    R.id.action_about   -> {
+      AboutSettingsActivity.launch(requireContext())
+      true
+    }
+    R.id.action_crashes -> {
+      CrashSettingsActivity.launch(requireContext())
+      true
+    }
+    else                -> super.onOptionsItemSelected(item)
+  }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragment.kt
index b3e3fff99..6d8c9a90b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragment.kt
@@ -13,13 +13,13 @@ import butterknife.BindView
 import butterknife.ButterKnife
 import com.google.gson.Gson
 import com.google.gson.GsonBuilder
+import dagger.android.support.DaggerFragment
 import de.kuschku.malheur.data.Report
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.util.helper.fromJson
-import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
 import java.io.File
 
-class CrashSettingsFragment : ServiceBoundFragment() {
+class CrashSettingsFragment : DaggerFragment() {
   @BindView(R.id.list)
   lateinit var list: RecyclerView
 
@@ -85,7 +85,7 @@ class CrashSettingsFragment : ServiceBoundFragment() {
 
   override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
     R.id.action_delete_all -> {
-      runInBackground {
+      handler.post {
         crashDir?.mkdirs()
         crashDir?.listFiles()?.forEach {
           it.delete()
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsActivity.kt
index e45c52096..604b7ccd9 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class CoreSettingsActivity : SettingsActivity(CoreSettingsFragment()) {
+class CoreSettingsActivity : ServiceBoundSettingsActivity(CoreSettingsFragment()) {
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, CoreSettingsActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemActivity.kt
index 58311483b..afcb96641 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemActivity.kt
@@ -3,9 +3,9 @@ package de.kuschku.quasseldroid.ui.coresettings.aliasitem
 import android.content.Context
 import android.content.Intent
 import de.kuschku.libquassel.quassel.syncables.interfaces.IAliasManager
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class AliasItemActivity : SettingsActivity(AliasItemFragment()) {
+class AliasItemActivity : ServiceBoundSettingsActivity(AliasItemFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListActivity.kt
index c55e49397..7c2cfd135 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliaslist/AliasListActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings.aliaslist
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class AliasListActivity : SettingsActivity(AliasListFragment()) {
+class AliasListActivity : ServiceBoundSettingsActivity(AliasListFragment()) {
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, AliasListActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateActivity.kt
index 9f5c304df..af707989f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings.chatlist
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class ChatlistCreateActivity : SettingsActivity(ChatListCreateFragment()) {
+class ChatlistCreateActivity : ServiceBoundSettingsActivity(ChatListCreateFragment()) {
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, ChatlistCreateActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditActivity.kt
index 07d9c196c..de92cd964 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings.chatlist
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class ChatlistEditActivity : SettingsActivity(ChatListEditFragment()) {
+class ChatlistEditActivity : ServiceBoundSettingsActivity(ChatListEditFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListActivity.kt
index cb731e56f..0faa06e1f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings.highlightlist
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class HighlightListActivity : SettingsActivity(HighlightListFragment()) {
+class HighlightListActivity : ServiceBoundSettingsActivity(HighlightListFragment()) {
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, HighlightListActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleActivity.kt
index 91d3792c5..81cb99315 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleActivity.kt
@@ -3,9 +3,9 @@ package de.kuschku.quasseldroid.ui.coresettings.highlightrule
 import android.content.Context
 import android.content.Intent
 import de.kuschku.libquassel.quassel.syncables.HighlightRuleManager
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class HighlightRuleActivity : SettingsActivity(HighlightRuleFragment()) {
+class HighlightRuleActivity : ServiceBoundSettingsActivity(HighlightRuleFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateActivity.kt
index f6a8239a6..715ef4302 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings.identity
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class IdentityCreateActivity : SettingsActivity(IdentityCreateFragment()) {
+class IdentityCreateActivity : ServiceBoundSettingsActivity(IdentityCreateFragment()) {
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, IdentityCreateActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditActivity.kt
index c9ec38bdb..e0daff5ad 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditActivity.kt
@@ -3,9 +3,9 @@ package de.kuschku.quasseldroid.ui.coresettings.identity
 import android.content.Context
 import android.content.Intent
 import de.kuschku.libquassel.protocol.IdentityId
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class IdentityEditActivity : SettingsActivity(IdentityEditFragment()) {
+class IdentityEditActivity : ServiceBoundSettingsActivity(IdentityEditFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemActivity.kt
index b8275b5fd..ccc615456 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemActivity.kt
@@ -3,9 +3,9 @@ package de.kuschku.quasseldroid.ui.coresettings.ignoreitem
 import android.content.Context
 import android.content.Intent
 import de.kuschku.libquassel.quassel.syncables.IgnoreListManager
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class IgnoreItemActivity : SettingsActivity(IgnoreItemFragment()) {
+class IgnoreItemActivity : ServiceBoundSettingsActivity(IgnoreItemFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListActivity.kt
index 66c55a9b2..eec222b11 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings.ignorelist
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class IgnoreListActivity : SettingsActivity(IgnoreListFragment()) {
+class IgnoreListActivity : ServiceBoundSettingsActivity(IgnoreListFragment()) {
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, IgnoreListActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkCreateActivity.kt
index 25ef7bf72..daa8c732c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkCreateActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkCreateActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings.network
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class NetworkCreateActivity : SettingsActivity(NetworkCreateFragment()) {
+class NetworkCreateActivity : ServiceBoundSettingsActivity(NetworkCreateFragment()) {
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, NetworkCreateActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkEditActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkEditActivity.kt
index f813c0565..0750a1b73 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkEditActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/network/NetworkEditActivity.kt
@@ -3,9 +3,9 @@ package de.kuschku.quasseldroid.ui.coresettings.network
 import android.content.Context
 import android.content.Intent
 import de.kuschku.libquassel.protocol.NetworkId
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class NetworkEditActivity : SettingsActivity(NetworkEditFragment()) {
+class NetworkEditActivity : ServiceBoundSettingsActivity(NetworkEditFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigActivity.kt
index c7918c176..727bb1d36 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigActivity.kt
@@ -2,9 +2,9 @@ package de.kuschku.quasseldroid.ui.coresettings.networkconfig
 
 import android.content.Context
 import android.content.Intent
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class NetworkConfigActivity : SettingsActivity(NetworkConfigFragment()) {
+class NetworkConfigActivity : ServiceBoundSettingsActivity(NetworkConfigFragment()) {
   companion object {
     fun launch(context: Context) = context.startActivity(intent(context))
     fun intent(context: Context) = Intent(context, NetworkConfigActivity::class.java)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkserver/NetworkServerActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkserver/NetworkServerActivity.kt
index 9a9281c6f..d9a30d6bf 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkserver/NetworkServerActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkserver/NetworkServerActivity.kt
@@ -3,9 +3,9 @@ package de.kuschku.quasseldroid.ui.coresettings.networkserver
 import android.content.Context
 import android.content.Intent
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
-import de.kuschku.quasseldroid.util.ui.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.ServiceBoundSettingsActivity
 
-class NetworkServerActivity : SettingsActivity(NetworkServerFragment()) {
+class NetworkServerActivity : ServiceBoundSettingsActivity(NetworkServerFragment()) {
   companion object {
     fun launch(
       context: Context,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/SetupActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/SetupActivity.kt
index ee6e7bd9d..6eee73e76 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/SetupActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/SetupActivity.kt
@@ -10,18 +10,25 @@ import android.support.design.widget.FloatingActionButton
 import android.support.v4.app.FragmentManager
 import android.support.v4.app.FragmentStatePagerAdapter
 import android.support.v4.view.ViewPager
+import android.support.v7.widget.ActionMenuView
 import android.util.SparseArray
 import android.view.ViewGroup
 import butterknife.BindView
 import butterknife.ButterKnife
 import dagger.android.support.DaggerAppCompatActivity
 import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.app.AppSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.crash.CrashSettingsActivity
 import de.kuschku.quasseldroid.util.helper.observeSticky
 import de.kuschku.quasseldroid.util.helper.or
 import de.kuschku.quasseldroid.util.helper.switchMap
 import de.kuschku.quasseldroid.util.helper.updateRecentsHeaderIfExisting
 
 abstract class SetupActivity : DaggerAppCompatActivity() {
+  @BindView(R.id.menu_view)
+  lateinit var menuView: ActionMenuView
+
   @BindView(R.id.view_pager)
   lateinit var viewPager: ViewPager
 
@@ -80,6 +87,26 @@ abstract class SetupActivity : DaggerAppCompatActivity() {
     setContentView(R.layout.activity_setup)
     ButterKnife.bind(this)
 
+    menuView.popupTheme = R.style.Widget_PopupOverlay_Light
+    menuInflater.inflate(R.menu.activity_setup, menuView.menu)
+    menuView.setOnMenuItemClickListener {
+      when (it.itemId) {
+        R.id.action_client_settings -> {
+          AppSettingsActivity.launch(this)
+          true
+        }
+        R.id.action_crashes         -> {
+          CrashSettingsActivity.launch(this)
+          true
+        }
+        R.id.action_about           -> {
+          AboutSettingsActivity.launch(this)
+          true
+        }
+        else                        -> false
+      }
+    }
+
     adapter = SlidePagerAdapter(supportFragmentManager)
     fragments.forEach(adapter::addFragment)
     viewPager.adapter = adapter
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt
index 15ee758d7..436508774 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt
@@ -8,32 +8,23 @@ import android.content.SharedPreferences
 import android.os.Bundle
 import android.support.annotation.ColorRes
 import android.support.annotation.DrawableRes
-import android.support.v4.app.Fragment
-import android.support.v7.app.AppCompatActivity
-import dagger.android.AndroidInjection
-import dagger.android.AndroidInjector
-import dagger.android.DispatchingAndroidInjector
-import dagger.android.HasFragmentInjector
-import dagger.android.support.HasSupportFragmentInjector
 import de.kuschku.libquassel.session.Backend
 import de.kuschku.libquassel.util.Optional
 import de.kuschku.quasseldroid.Keys
 import de.kuschku.quasseldroid.R
-import de.kuschku.quasseldroid.settings.AppearanceSettings
 import de.kuschku.quasseldroid.settings.AutoCompleteSettings
 import de.kuschku.quasseldroid.settings.ConnectionSettings
 import de.kuschku.quasseldroid.settings.Settings
 import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionActivity
 import de.kuschku.quasseldroid.util.helper.sharedPreferences
 import de.kuschku.quasseldroid.util.helper.updateRecentsHeaderIfExisting
+import de.kuschku.quasseldroid.util.ui.ThemedActivity
 import de.kuschku.quasseldroid.viewmodel.QuasselViewModel
 import io.reactivex.subjects.BehaviorSubject
 import javax.inject.Inject
 
-abstract class ServiceBoundActivity : AppCompatActivity(),
-                                      SharedPreferences.OnSharedPreferenceChangeListener,
-                                      HasSupportFragmentInjector,
-                                      HasFragmentInjector {
+abstract class ServiceBoundActivity : ThemedActivity(),
+                                      SharedPreferences.OnSharedPreferenceChangeListener {
   @DrawableRes
   protected val icon: Int = R.mipmap.ic_launcher_recents
   @ColorRes
@@ -43,20 +34,6 @@ abstract class ServiceBoundActivity : AppCompatActivity(),
   protected val backend: BehaviorSubject<Optional<Backend>>
     get() = connection.backend
 
-  @Inject
-  lateinit var supportFragmentInjector: DispatchingAndroidInjector<Fragment>
-
-  @Inject
-  lateinit var frameworkFragmentInjector: DispatchingAndroidInjector<android.app.Fragment>
-
-  override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
-    return supportFragmentInjector
-  }
-
-  override fun fragmentInjector(): AndroidInjector<android.app.Fragment>? {
-    return frameworkFragmentInjector
-  }
-
   protected fun runInBackground(f: () -> Unit) {
     connection.backend.value.ifPresent {
       it.sessionManager().handlerService.backend(f)
@@ -69,9 +46,6 @@ abstract class ServiceBoundActivity : AppCompatActivity(),
     }
   }
 
-  @Inject
-  lateinit var appearanceSettings: AppearanceSettings
-
   @Inject
   lateinit var autoCompleteSettings: AutoCompleteSettings
 
@@ -85,10 +59,8 @@ abstract class ServiceBoundActivity : AppCompatActivity(),
   private var startedSelection = false
 
   override fun onCreate(savedInstanceState: Bundle?) {
-    AndroidInjection.inject(this)
     connection.context = this
     checkConnection()
-    setTheme(appearanceSettings.theme.style)
     super.onCreate(savedInstanceState)
     viewModel = ViewModelProviders.of(this)[QuasselViewModel::class.java]
     viewModel.backendWrapper.onNext(this.backend)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/ServiceBoundSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/ServiceBoundSettingsActivity.kt
new file mode 100644
index 000000000..30d155037
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/ServiceBoundSettingsActivity.kt
@@ -0,0 +1,79 @@
+package de.kuschku.quasseldroid.util.ui
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v7.widget.Toolbar
+import android.view.MenuItem
+import butterknife.BindView
+import butterknife.ButterKnife
+import com.afollestad.materialdialogs.MaterialDialog
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
+import de.kuschku.quasseldroid.util.service.ServiceBoundActivity
+
+abstract class ServiceBoundSettingsActivity(private val fragment: Fragment? = null) :
+  ServiceBoundActivity() {
+  protected open fun fragment(): Fragment? = null
+
+  private var changeable: SettingsFragment.Changeable? = null
+
+  @BindView(R.id.toolbar)
+  lateinit var toolbar: Toolbar
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    val arguments = intent.extras
+    super.onCreate(savedInstanceState)
+    setContentView(R.layout.activity_settings)
+    ButterKnife.bind(this)
+
+    setSupportActionBar(toolbar)
+    supportActionBar?.setDisplayHomeAsUpEnabled(true)
+
+    val fragment = this.fragment ?: this.fragment()
+    if (fragment != null) {
+      val transaction = supportFragmentManager.beginTransaction()
+      fragment.arguments = arguments
+      transaction.replace(R.id.fragment_container, fragment)
+      transaction.commit()
+    }
+
+    this.changeable = fragment as? SettingsFragment.Changeable
+  }
+
+  private fun shouldNavigateAway(callback: () -> Unit) {
+    val changeable = this.changeable
+    if (changeable?.hasChanged() == true) {
+      MaterialDialog.Builder(this)
+        .content(R.string.cancel_confirmation)
+        .positiveText(R.string.label_yes)
+        .negativeText(R.string.label_no)
+        .negativeColorAttr(R.attr.colorTextPrimary)
+        .backgroundColorAttr(R.attr.colorBackgroundCard)
+        .contentColorAttr(R.attr.colorTextPrimary)
+        .onPositive { _, _ ->
+          callback()
+        }
+        .build()
+        .show()
+    } else callback()
+  }
+
+  override fun onBackPressed() = shouldNavigateAway {
+    super.onBackPressed()
+  }
+
+  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
+    android.R.id.home -> {
+      shouldNavigateAway {
+        if (supportParentActivityIntent != null) {
+          startActivity(supportParentActivityIntent)
+          finish()
+        } else {
+          super.onBackPressed()
+        }
+      }
+      true
+    }
+    else              -> super.onOptionsItemSelected(item)
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt
index 9f52b3f5c..e2883e884 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt
@@ -9,9 +9,8 @@ import butterknife.ButterKnife
 import com.afollestad.materialdialogs.MaterialDialog
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
-import de.kuschku.quasseldroid.util.service.ServiceBoundActivity
 
-abstract class SettingsActivity(private val fragment: Fragment? = null) : ServiceBoundActivity() {
+abstract class SettingsActivity(private val fragment: Fragment? = null) : ThemedActivity() {
   protected open fun fragment(): Fragment? = null
 
   private var changeable: SettingsFragment.Changeable? = null
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/ThemedActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/ThemedActivity.kt
new file mode 100644
index 000000000..b61af035a
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/ThemedActivity.kt
@@ -0,0 +1,38 @@
+package de.kuschku.quasseldroid.util.ui
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v7.app.AppCompatActivity
+import dagger.android.AndroidInjection
+import dagger.android.AndroidInjector
+import dagger.android.DispatchingAndroidInjector
+import dagger.android.HasFragmentInjector
+import dagger.android.support.HasSupportFragmentInjector
+import de.kuschku.quasseldroid.settings.AppearanceSettings
+import javax.inject.Inject
+
+abstract class ThemedActivity : AppCompatActivity(), HasSupportFragmentInjector,
+                                HasFragmentInjector {
+  @Inject
+  lateinit var supportFragmentInjector: DispatchingAndroidInjector<Fragment>
+
+  @Inject
+  lateinit var frameworkFragmentInjector: DispatchingAndroidInjector<android.app.Fragment>
+
+  @Inject
+  lateinit var appearanceSettings: AppearanceSettings
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    AndroidInjection.inject(this)
+    setTheme(appearanceSettings.theme.style)
+    super.onCreate(savedInstanceState)
+  }
+
+  override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
+    return supportFragmentInjector
+  }
+
+  override fun fragmentInjector(): AndroidInjector<android.app.Fragment>? {
+    return frameworkFragmentInjector
+  }
+}
diff --git a/app/src/main/res/layout-sw600dp-land/activity_setup.xml b/app/src/main/res/layout-sw600dp-land/activity_setup.xml
index 31d62bdce..695362d64 100644
--- a/app/src/main/res/layout-sw600dp-land/activity_setup.xml
+++ b/app/src/main/res/layout-sw600dp-land/activity_setup.xml
@@ -9,6 +9,13 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
 
+  <android.support.v7.widget.ActionMenuView
+    android:id="@+id/menu_view"
+    android:layout_width="?actionBarSize"
+    android:layout_height="?actionBarSize"
+    android:layout_gravity="end|top"
+    android:theme="?attr/actionBarTheme" />
+
   <android.support.design.widget.FloatingActionButton
     android:id="@+id/next_button"
     android:layout_width="wrap_content"
diff --git a/app/src/main/res/layout-sw600dp/activity_setup.xml b/app/src/main/res/layout-sw600dp/activity_setup.xml
index 31d62bdce..695362d64 100644
--- a/app/src/main/res/layout-sw600dp/activity_setup.xml
+++ b/app/src/main/res/layout-sw600dp/activity_setup.xml
@@ -9,6 +9,13 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
 
+  <android.support.v7.widget.ActionMenuView
+    android:id="@+id/menu_view"
+    android:layout_width="?actionBarSize"
+    android:layout_height="?actionBarSize"
+    android:layout_gravity="end|top"
+    android:theme="?attr/actionBarTheme" />
+
   <android.support.design.widget.FloatingActionButton
     android:id="@+id/next_button"
     android:layout_width="wrap_content"
diff --git a/app/src/main/res/layout/activity_setup.xml b/app/src/main/res/layout/activity_setup.xml
index a0a74dc86..6d982518a 100644
--- a/app/src/main/res/layout/activity_setup.xml
+++ b/app/src/main/res/layout/activity_setup.xml
@@ -9,6 +9,13 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
 
+  <android.support.v7.widget.ActionMenuView
+    android:id="@+id/menu_view"
+    android:layout_width="?actionBarSize"
+    android:layout_height="?actionBarSize"
+    android:layout_gravity="end|top"
+    android:theme="?attr/actionBarTheme" />
+
   <android.support.design.widget.FloatingActionButton
     android:id="@+id/next_button"
     android:layout_width="wrap_content"
diff --git a/app/src/main/res/menu/activity_setup.xml b/app/src/main/res/menu/activity_setup.xml
new file mode 100644
index 000000000..8e26096af
--- /dev/null
+++ b/app/src/main/res/menu/activity_setup.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+  <item
+    android:id="@+id/action_client_settings"
+    android:title="@string/label_settings_client" />
+  <item
+    android:id="@+id/action_crashes"
+    android:title="@string/label_crashes" />
+  <item
+    android:id="@+id/action_about"
+    android:title="@string/label_about" />
+</menu>
diff --git a/app/src/main/res/values/themes_base.xml b/app/src/main/res/values/themes_base.xml
index 90530c4b2..81a56512e 100644
--- a/app/src/main/res/values/themes_base.xml
+++ b/app/src/main/res/values/themes_base.xml
@@ -38,7 +38,10 @@
 
   <style name="Theme.Base.ChatTheme.Light" parent="Theme.AppTheme.Light.NoActionBar" />
 
-  <style name="Theme.SetupTheme" parent="Theme.AppTheme.Light.NoActionBar" />
+  <style name="Theme.SetupTheme" parent="Theme.AppTheme.Light.NoActionBar">
+    <item name="actionBarTheme">@style/Widget.AppBarOverlay</item>
+    <item name="actionBarPopupTheme">@style/Widget.PopupOverlay.Light</item>
+  </style>
 
   <style name="Theme.SplashTheme" parent="Theme.AppTheme.Light.NoActionBar">
     <item name="android:windowBackground">@drawable/bg_splash</item>
-- 
GitLab