From f6566eae4ab3d31e3a682b9b5d7f9a2fa705f797 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Wed, 2 Jan 2019 13:57:32 +0100
Subject: [PATCH] Fixes #172 and #174

---
 .../chat/buffers/BufferViewConfigFragment.kt  |   4 +-
 .../ui/coresettings/CoreSettingsFragment.kt   |  23 +++
 .../highlightlist/HighlightListFragment.kt    |  12 ++
 .../quasseldroid/util/ui/BannerView.kt        |  56 ++++++
 .../quasseldroid/util/ui/WarningBarView.kt    |   4 +-
 .../res/layout/settings_highlightlist.xml     | 176 ++++++++++--------
 app/src/main/res/layout/settings_list.xml     |  11 +-
 .../widget_advertisement_support_patreon.xml  |  77 +-------
 app/src/main/res/layout/widget_banner.xml     |  81 ++++++++
 .../main/res/layout/widget_warning_bar.xml    |   8 +-
 app/src/main/res/values/strings.xml           |   3 +
 app/src/main/res/values/styles_widgets.xml    |  30 ++-
 12 files changed, 311 insertions(+), 174 deletions(-)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/ui/BannerView.kt
 create mode 100644 app/src/main/res/layout/widget_banner.xml

diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
index f9a396634..a4c7c5812 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
@@ -74,7 +74,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
   lateinit var chatList: RecyclerView
 
   @BindView(R.id.feature_context_bufferactivitysync)
-  lateinit var featureContextBufferactivitysync: WarningBarView
+  lateinit var featureContextBufferActivitySync: WarningBarView
 
   @Inject
   lateinit var appearanceSettings: AppearanceSettings
@@ -286,7 +286,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
     }
 
     viewModel.features.toLiveData().observe(this, Observer {
-      featureContextBufferactivitysync.setMode(
+      featureContextBufferActivitySync.setMode(
         if (it.hasFeature(ExtendedFeature.BufferActivitySync)) WarningBarView.MODE_NONE
         else WarningBarView.MODE_ICON
       )
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
index 777218ec8..f8bb0c9b7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
@@ -48,10 +48,18 @@ import de.kuschku.quasseldroid.ui.coresettings.network.NetworkEditActivity
 import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
 import de.kuschku.quasseldroid.util.helper.combineLatest
 import de.kuschku.quasseldroid.util.helper.toLiveData
+import de.kuschku.quasseldroid.util.helper.visibleIf
+import de.kuschku.quasseldroid.util.missingfeatures.MissingFeature
+import de.kuschku.quasseldroid.util.missingfeatures.MissingFeaturesDialog
+import de.kuschku.quasseldroid.util.missingfeatures.RequiredFeatures
 import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
+import de.kuschku.quasseldroid.util.ui.BannerView
 import io.reactivex.Observable
 
 class CoreSettingsFragment : ServiceBoundFragment() {
+  @BindView(R.id.feature_context_missing)
+  lateinit var featureContextMissing: BannerView
+
   @BindView(R.id.coreinfo)
   lateinit var coreinfo: View
 
@@ -161,6 +169,21 @@ class CoreSettingsFragment : ServiceBoundFragment() {
       chatListAdapter.submitList(it.orEmpty())
     })
 
+    var missingFeatureList: List<MissingFeature> = emptyList()
+    viewModel.features.toLiveData().observe(this, Observer { features ->
+      missingFeatureList = RequiredFeatures.features.filter {
+        it.feature !in features.enabledFeatures
+      }
+      featureContextMissing.visibleIf(missingFeatureList.isNotEmpty())
+    })
+
+    featureContextMissing.setOnClickListener {
+      MissingFeaturesDialog.Builder(requireActivity())
+        .missingFeatures(missingFeatureList)
+        .readOnly(true)
+        .show()
+    }
+
     networkconfig.setOnClickListener {
       NetworkConfigActivity.launch(requireContext())
     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
index ef6485ec6..65e4b00e4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
@@ -35,6 +35,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import butterknife.BindView
 import butterknife.ButterKnife
+import de.kuschku.libquassel.quassel.ExtendedFeature
 import de.kuschku.libquassel.quassel.syncables.HighlightRuleManager
 import de.kuschku.libquassel.quassel.syncables.interfaces.IHighlightRuleManager
 import de.kuschku.libquassel.util.Optional
@@ -42,9 +43,13 @@ import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
 import de.kuschku.quasseldroid.ui.coresettings.highlightrule.HighlightRuleActivity
 import de.kuschku.quasseldroid.util.helper.toLiveData
+import de.kuschku.quasseldroid.util.ui.WarningBarView
 
 class HighlightListFragment : SettingsFragment(), SettingsFragment.Savable,
                               SettingsFragment.Changeable {
+  @BindView(R.id.feature_context_coresidehighlights)
+  lateinit var featureContextCoreSideHighlights: WarningBarView
+
   @BindView(R.id.highlight_nick_type)
   lateinit var highlightNickType: Spinner
 
@@ -140,6 +145,13 @@ class HighlightListFragment : SettingsFragment(), SettingsFragment.Savable,
         }
       })
 
+    viewModel.features.toLiveData().observe(this, Observer {
+      featureContextCoreSideHighlights.setMode(
+        if (it.hasFeature(ExtendedFeature.CoreSideHighlights)) WarningBarView.MODE_NONE
+        else WarningBarView.MODE_ICON
+      )
+    })
+
     return view
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/BannerView.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/BannerView.kt
new file mode 100644
index 000000000..1569f6384
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/BannerView.kt
@@ -0,0 +1,56 @@
+package de.kuschku.quasseldroid.util.ui
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.FrameLayout
+import android.widget.TextView
+import androidx.annotation.StringRes
+import androidx.appcompat.widget.AppCompatImageView
+import butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.util.helper.use
+
+class BannerView : FrameLayout {
+  @BindView(R.id.icon)
+  lateinit var icon: AppCompatImageView
+
+  @BindView(R.id.text)
+  lateinit var text: TextView
+
+  @BindView(R.id.button)
+  lateinit var button: TextView
+
+  constructor(context: Context) :
+    this(context, null)
+
+  constructor(context: Context, attrs: AttributeSet?) :
+    this(context, attrs, 0)
+
+  constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
+    super(context, attrs, defStyleAttr) {
+
+    LayoutInflater.from(context).inflate(R.layout.widget_banner, this, true)
+    ButterKnife.bind(this)
+
+    context.theme.obtainStyledAttributes(attrs, R.styleable.BannerView, 0, 0).use {
+      if (it.hasValue(R.styleable.BannerView_icon))
+        icon.setImageDrawable(it.getDrawable(R.styleable.BannerView_icon))
+
+      if (it.hasValue(R.styleable.BannerView_text))
+        text.text = it.getString(R.styleable.BannerView_text)
+
+      if (it.hasValue(R.styleable.BannerView_buttonText))
+        button.text = it.getString(R.styleable.BannerView_buttonText)
+    }
+  }
+
+  fun setText(content: String) {
+    text.text = content
+  }
+
+  fun setText(@StringRes content: Int) {
+    text.setText(content)
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/WarningBarView.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/WarningBarView.kt
index 82d35fea1..6d02d505e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/WarningBarView.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/WarningBarView.kt
@@ -5,7 +5,7 @@ import android.content.Context
 import android.util.AttributeSet
 import android.view.LayoutInflater
 import android.view.View
-import android.widget.LinearLayout
+import android.widget.FrameLayout
 import android.widget.TextView
 import androidx.annotation.IntDef
 import androidx.annotation.StringRes
@@ -15,7 +15,7 @@ import butterknife.ButterKnife
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.util.helper.use
 
-class WarningBarView : LinearLayout {
+class WarningBarView : FrameLayout {
   @BindView(R.id.icon)
   lateinit var icon: AppCompatImageView
 
diff --git a/app/src/main/res/layout/settings_highlightlist.xml b/app/src/main/res/layout/settings_highlightlist.xml
index 7922e7529..1197d7ea2 100644
--- a/app/src/main/res/layout/settings_highlightlist.xml
+++ b/app/src/main/res/layout/settings_highlightlist.xml
@@ -24,110 +24,124 @@
   android:layout_height="match_parent"
   android:scrollbars="vertical">
 
-  <LinearLayout style="@style/Widget.CoreSettings.Wrapper">
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
 
-    <LinearLayout
+    <de.kuschku.quasseldroid.util.ui.WarningBarView
+      android:id="@+id/feature_context_coresidehighlights"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
-      android:minHeight="48dp">
+      app:icon="@drawable/ic_alert"
+      app:mode="none"
+      app:text="@string/label_feature_context_coresidehighlights" />
 
-      <androidx.appcompat.widget.AppCompatImageView
-        style="@style/Widget.CoreSettings.PrimaryItemIcon"
-        app:srcCompat="@drawable/ic_server_network" />
+    <LinearLayout style="@style/Widget.CoreSettings.Wrapper">
 
-      <TextView
-        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
-        android:text="@string/settings_highlightlist_highlight_nick" />
-    </LinearLayout>
-
-    <LinearLayout
-      style="@style/Widget.CoreSettings.DependentGroup"
-      android:visibility="visible">
-
-      <Spinner
-        android:id="@+id/highlight_nick_type"
-        style="@style/Widget.FullWidthSpinner"
-        tools:listitem="@layout/widget_spinner_item_inline" />
-
-      <androidx.appcompat.widget.SwitchCompat
-        android:id="@+id/is_case_sensitive"
-        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
-        android:text="@string/settings_highlightlist_nicks_case_sensitive" />
-    </LinearLayout>
-
-    <LinearLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:minHeight="48dp">
+      <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="48dp">
 
-      <androidx.appcompat.widget.AppCompatImageView
-        style="@style/Widget.CoreSettings.PrimaryItemIcon"
-        app:srcCompat="@drawable/ic_server_network" />
+        <androidx.appcompat.widget.AppCompatImageView
+          style="@style/Widget.CoreSettings.PrimaryItemIcon"
+          app:srcCompat="@drawable/ic_server_network" />
 
-      <TextView
-        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
-        android:text="@string/settings_highlightlist_rules" />
-    </LinearLayout>
+        <TextView
+          style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+          android:text="@string/settings_highlightlist_highlight_nick" />
+      </LinearLayout>
 
-    <LinearLayout
-      style="@style/Widget.CoreSettings.DependentGroup"
-      android:visibility="visible">
+      <LinearLayout
+        style="@style/Widget.CoreSettings.DependentGroup"
+        android:visibility="visible">
+
+        <Spinner
+          android:id="@+id/highlight_nick_type"
+          style="@style/Widget.FullWidthSpinner"
+          tools:listitem="@layout/widget_spinner_item_inline" />
+
+        <androidx.appcompat.widget.SwitchCompat
+          android:id="@+id/is_case_sensitive"
+          style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+          android:text="@string/settings_highlightlist_nicks_case_sensitive" />
+      </LinearLayout>
 
-      <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/highlight_rules"
+      <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        tools:itemCount="2"
-        tools:listitem="@layout/settings_highlightlist_rule" />
+        android:minHeight="48dp">
 
-      <LinearLayout
-        style="@style/Widget.CoreSettings.EditTextLayout"
-        android:orientation="horizontal">
+        <androidx.appcompat.widget.AppCompatImageView
+          style="@style/Widget.CoreSettings.PrimaryItemIcon"
+          app:srcCompat="@drawable/ic_server_network" />
 
-        <Button
-          android:id="@+id/new_highlight_rule"
-          style="@style/Widget.Button.Borderless.Colored"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="@string/label_new_highlight_rule" />
+        <TextView
+          style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+          android:text="@string/settings_highlightlist_rules" />
       </LinearLayout>
-    </LinearLayout>
-
-    <LinearLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:minHeight="48dp">
 
-      <androidx.appcompat.widget.AppCompatImageView
-        style="@style/Widget.CoreSettings.PrimaryItemIcon"
-        app:srcCompat="@drawable/ic_server_network" />
-
-      <TextView
-        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
-        android:text="@string/settings_highlightlist_ignore_rules" />
-    </LinearLayout>
+      <LinearLayout
+        style="@style/Widget.CoreSettings.DependentGroup"
+        android:visibility="visible">
 
-    <LinearLayout
-      style="@style/Widget.CoreSettings.DependentGroup"
-      android:visibility="visible">
+        <androidx.recyclerview.widget.RecyclerView
+          android:id="@+id/highlight_rules"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          tools:itemCount="2"
+          tools:listitem="@layout/settings_highlightlist_rule" />
+
+        <LinearLayout
+          style="@style/Widget.CoreSettings.EditTextLayout"
+          android:orientation="horizontal">
+
+          <Button
+            android:id="@+id/new_highlight_rule"
+            style="@style/Widget.Button.Borderless.Colored"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/label_new_highlight_rule" />
+        </LinearLayout>
+      </LinearLayout>
 
-      <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/highlight_ignore_rules"
+      <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        tools:itemCount="2"
-        tools:listitem="@layout/settings_highlightlist_rule" />
+        android:minHeight="48dp">
+
+        <androidx.appcompat.widget.AppCompatImageView
+          style="@style/Widget.CoreSettings.PrimaryItemIcon"
+          app:srcCompat="@drawable/ic_server_network" />
+
+        <TextView
+          style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+          android:text="@string/settings_highlightlist_ignore_rules" />
+      </LinearLayout>
 
       <LinearLayout
-        style="@style/Widget.CoreSettings.EditTextLayout"
-        android:orientation="horizontal">
+        style="@style/Widget.CoreSettings.DependentGroup"
+        android:visibility="visible">
 
-        <Button
-          android:id="@+id/new_highlight_ignore_rule"
-          style="@style/Widget.Button.Borderless.Colored"
-          android:layout_width="wrap_content"
+        <androidx.recyclerview.widget.RecyclerView
+          android:id="@+id/highlight_ignore_rules"
+          android:layout_width="match_parent"
           android:layout_height="wrap_content"
-          android:text="@string/label_new_highlight_ignore_rule" />
+          tools:itemCount="2"
+          tools:listitem="@layout/settings_highlightlist_rule" />
+
+        <LinearLayout
+          style="@style/Widget.CoreSettings.EditTextLayout"
+          android:orientation="horizontal">
+
+          <Button
+            android:id="@+id/new_highlight_ignore_rule"
+            style="@style/Widget.Button.Borderless.Colored"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/label_new_highlight_ignore_rule" />
+        </LinearLayout>
       </LinearLayout>
     </LinearLayout>
   </LinearLayout>
diff --git a/app/src/main/res/layout/settings_list.xml b/app/src/main/res/layout/settings_list.xml
index 267253e85..cc8cb4ad7 100644
--- a/app/src/main/res/layout/settings_list.xml
+++ b/app/src/main/res/layout/settings_list.xml
@@ -29,6 +29,15 @@
     android:layout_height="wrap_content"
     android:orientation="vertical">
 
+    <de.kuschku.quasseldroid.util.ui.BannerView
+      android:id="@+id/feature_context_missing"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:layout_marginBottom="8dp"
+      app:buttonText="@string/label_feature_context_missing_button"
+      app:icon="@drawable/ic_alert"
+      app:text="@string/label_feature_context_missing" />
+
     <LinearLayout style="@style/Widget.CoreSettings.PrimaryItemGroupHeader">
 
       <androidx.appcompat.widget.AppCompatImageView
@@ -76,8 +85,8 @@
     <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
-      android:layout_marginLeft="72dp"
       android:layout_marginStart="72dp"
+      android:layout_marginLeft="72dp"
       android:orientation="vertical">
 
       <androidx.recyclerview.widget.RecyclerView
diff --git a/app/src/main/res/layout/widget_advertisement_support_patreon.xml b/app/src/main/res/layout/widget_advertisement_support_patreon.xml
index 737115f9d..2df27a3f5 100644
--- a/app/src/main/res/layout/widget_advertisement_support_patreon.xml
+++ b/app/src/main/res/layout/widget_advertisement_support_patreon.xml
@@ -1,77 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<de.kuschku.quasseldroid.util.ui.BannerView xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
-  android:background="?colorBackgroundSnackbar"
-  android:baselineAligned="false"
-  android:clipToPadding="false"
-  android:focusable="true"
-  android:foreground="?selectableItemBackground"
-  android:orientation="vertical"
-  android:paddingStart="?android:attr/listPreferredItemPaddingLeft"
-  android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
-  android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
-  android:paddingRight="?android:attr/listPreferredItemPaddingRight"
-  android:theme="?attr/actionBarTheme">
-
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginStart="-4dp"
-    android:layout_marginLeft="-4dp"
-    android:baselineAligned="false"
-    android:gravity="center_vertical"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall"
-    android:orientation="horizontal">
-
-    <FrameLayout
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:gravity="start|center_vertical"
-      android:minWidth="60dp"
-      android:orientation="horizontal"
-      android:paddingStart="0dp"
-      android:paddingLeft="0dp"
-      android:paddingTop="4dp"
-      android:paddingEnd="12dp"
-      android:paddingRight="12dp"
-      android:paddingBottom="4dp">
-
-      <androidx.appcompat.widget.AppCompatImageView
-        android:layout_width="32dp"
-        android:layout_height="32dp"
-        app:srcCompat="@drawable/ic_splash"
-        app:tint="?android:textColorPrimary" />
-    </FrameLayout>
-
-    <LinearLayout
-      android:layout_width="0dip"
-      android:layout_height="wrap_content"
-      android:layout_weight="1"
-      android:orientation="vertical"
-      android:paddingTop="16dp"
-      android:paddingBottom="16dp">
-
-      <TextView
-        style="@style/Widget.RtlConformTextView"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:maxLines="10"
-        android:text="@string/advertisement_support_patreon"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="?android:textColorPrimary" />
-    </LinearLayout>
-
-  </LinearLayout>
-
-
-  <TextView
-    style="@style/Widget.Button.Borderless.Colored"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="end"
-    android:clickable="false"
-    android:text="@string/advertisement_support_button"
-    android:textColor="?android:textColorPrimary" />
-</LinearLayout>
+  app:buttonText="@string/advertisement_support_button"
+  app:icon="@drawable/ic_splash"
+  app:text="@string/advertisement_support_patreon" />
diff --git a/app/src/main/res/layout/widget_banner.xml b/app/src/main/res/layout/widget_banner.xml
new file mode 100644
index 000000000..d88b1d2c0
--- /dev/null
+++ b/app/src/main/res/layout/widget_banner.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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="wrap_content"
+  android:background="?colorBackgroundSnackbar"
+  android:baselineAligned="false"
+  android:clipToPadding="false"
+  android:focusable="true"
+  android:foreground="?selectableItemBackground"
+  android:orientation="vertical"
+  android:paddingStart="?android:attr/listPreferredItemPaddingLeft"
+  android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+  android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
+  android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+  android:theme="?attr/actionBarTheme">
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginStart="-4dp"
+    android:layout_marginLeft="-4dp"
+    android:baselineAligned="false"
+    android:gravity="center_vertical"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall"
+    android:orientation="horizontal">
+
+    <FrameLayout
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:gravity="start|center_vertical"
+      android:minWidth="60dp"
+      android:orientation="horizontal"
+      android:paddingStart="0dp"
+      android:paddingLeft="0dp"
+      android:paddingTop="4dp"
+      android:paddingEnd="12dp"
+      android:paddingRight="12dp"
+      android:paddingBottom="4dp">
+
+      <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/icon"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        app:tint="?android:textColorPrimary"
+        tools:srcCompat="@drawable/ic_alert" />
+    </FrameLayout>
+
+    <LinearLayout
+      android:layout_width="0dip"
+      android:layout_height="wrap_content"
+      android:layout_weight="1"
+      android:orientation="vertical"
+      android:paddingTop="16dp"
+      android:paddingBottom="16dp">
+
+      <TextView
+        android:id="@+id/text"
+        style="@style/Widget.RtlConformTextView"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:maxLines="10"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="?android:textColorPrimary"
+        tools:text="Your core is missing features that are required for Quasseldroid to work correctly." />
+    </LinearLayout>
+
+  </LinearLayout>
+
+
+  <TextView
+    android:id="@+id/button"
+    style="@style/Widget.Button.Borderless.Colored"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="end"
+    android:clickable="false"
+    android:textColor="?android:textColorPrimary"
+    tools:text="Details" />
+</LinearLayout>
diff --git a/app/src/main/res/layout/widget_warning_bar.xml b/app/src/main/res/layout/widget_warning_bar.xml
index 29a35c059..f7e13214a 100644
--- a/app/src/main/res/layout/widget_warning_bar.xml
+++ b/app/src/main/res/layout/widget_warning_bar.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <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="wrap_content"
   android:background="?colorBackgroundSnackbar"
@@ -18,9 +17,7 @@
     android:layout_height="20dp"
     android:layout_gravity="center_vertical"
     android:visibility="gone"
-    app:tint="?android:textColorPrimary"
-    tools:srcCompat="@drawable/ic_alert"
-    tools:visibility="visible" />
+    app:tint="?android:textColorPrimary" />
 
   <me.zhanghai.android.materialprogressbar.MaterialProgressBar
     android:id="@+id/progress"
@@ -37,7 +34,6 @@
     android:layout_height="wrap_content"
     android:layout_marginStart="16dp"
     android:layout_marginLeft="16dp"
-    android:textColor="?android:textColorPrimary"
-    tools:text="@string/label_feature_context_bufferactivitysync" />
+    android:textColor="?android:textColorPrimary" />
 
 </LinearLayout>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cd7b72e6a..374286472 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -138,6 +138,9 @@
   <string name="label_feature_backlogfiltertype">Required for receiving past notifications after connecting</string>
 
   <string name="label_feature_context_bufferactivitysync">Quasseldroid cannot highlight unread chats. Upgrade your core to Quassel v0.13 to resolve this.</string>
+  <string name="label_feature_context_coresidehighlights">Quasseldroid cannot configure highlights. Upgrade your core to Quassel v0.13 to resolve this.</string>
+  <string name="label_feature_context_missing">Your core is missing features that are required for Quasseldroid to work correctly.</string>
+  <string name="label_feature_context_missing_button">Details</string>
 
   <string name="notification_channel_background" translatable="false">background</string>
   <string name="notification_channel_connection_title">Connection</string>
diff --git a/app/src/main/res/values/styles_widgets.xml b/app/src/main/res/values/styles_widgets.xml
index feef8d4c3..aa4d1431d 100644
--- a/app/src/main/res/values/styles_widgets.xml
+++ b/app/src/main/res/values/styles_widgets.xml
@@ -336,15 +336,27 @@
     <item name="insetBackground">#4000</item>
   </style>
 
-  <!-- NavigationDrawerLayout -->
+  <attr name="icon" format="reference" />
+  <attr name="text" format="string" />
+  <attr name="mode">
+    <enum name="none" value="0" />
+    <enum name="text" value="1" />
+    <enum name="icon" value="2" />
+    <enum name="progress" value="3" />
+  </attr>
+  <attr name="buttonText" format="string" />
+
+  <!-- WarningBarView -->
   <declare-styleable name="WarningBarView">
-    <attr name="icon" format="reference" />
-    <attr name="text" format="string" />
-    <attr name="mode">
-      <enum name="none" value="0" />
-      <enum name="text" value="1" />
-      <enum name="icon" value="2" />
-      <enum name="progress" value="3" />
-    </attr>
+    <attr name="icon" />
+    <attr name="text" />
+    <attr name="mode" />
+  </declare-styleable>
+
+  <!-- BannerView -->
+  <declare-styleable name="BannerView">
+    <attr name="icon" />
+    <attr name="text" />
+    <attr name="buttonText" />
   </declare-styleable>
 </resources>
-- 
GitLab