From c1d7a2fc23bfcf075ae9d20b737dad32a8697dbd Mon Sep 17 00:00:00 2001
From: Janne Mareike Koschinski <janne@kuschku.de>
Date: Wed, 23 Feb 2022 22:28:26 +0100
Subject: [PATCH] fix: resolve lint issues

---
 app/src/main/AndroidManifest.xml              |  4 --
 .../quasseldroid/dagger/ActivityBaseModule.kt |  8 ---
 .../kuschku/quasseldroid/dagger/AppModule.kt  |  2 -
 .../QuasseldroidNotificationManager.kt        | 18 ++++---
 .../quasseldroid/ssl/QuasselTrustManager.kt   |  2 +
 .../quasseldroid/ui/chat/ChatActivity.kt      |  5 +-
 .../chat/add/create/ChannelCreateFragment.kt  |  9 ++--
 .../ui/setup/ServiceBoundSetupActivity.kt     |  9 ++--
 .../quasseldroid/ui/setup/SetupActivity.kt    | 17 +++---
 .../util/helper/ActivityHelper.kt             | 54 +++++++++----------
 .../util/service/ServiceBoundActivity.kt      |  6 +--
 .../res/drawable-v21/bg_menuitem_dark.xml     | 29 ----------
 .../res/drawable-v21/bg_menuitem_light.xml    | 29 ----------
 .../drawable-v21/bg_menuitem_rounded_dark.xml | 37 -------------
 .../bg_menuitem_rounded_light.xml             | 37 -------------
 .../main/res/drawable/bg_menuitem_dark.xml    |  6 +--
 .../main/res/drawable/bg_menuitem_light.xml   |  6 +--
 .../res/drawable/bg_menuitem_rounded_dark.xml | 14 +++--
 .../drawable/bg_menuitem_rounded_light.xml    | 16 +++---
 .../res/layout/dialog_colorchooser_custom.xml |  3 +-
 .../res/layout/widget_core_account_add.xml    |  2 +-
 .../res/values-fr-rCA/strings_messages.xml    |  6 +--
 app/src/main/res/values-v21/themes_base.xml   | 45 ----------------
 app/src/main/res/values/themes_base.xml       | 32 ++++++-----
 .../quassel/syncables/RpcHandler.kt           |  9 ++++
 .../kuschku/libquassel/ssl/TrustManagers.kt   |  1 +
 .../integration/BufferViewConfigTest.kt       |  8 +--
 .../integration/SampleIntegrationTest.kt      | 14 ++---
 .../quassel/syncables/NetworkTest.kt          |  8 +--
 .../de/kuschku/libquassel/util/TestSession.kt | 27 +++++++++-
 lint.xml                                      |  8 +++
 .../malheur/collectors/DisplayCollector.kt    |  4 +-
 .../de/kuschku/ui/spinner/CutoutDrawable.java |  7 +--
 .../quasseldroid/util/emoji/EmojiData.kt      | 15 +-----
 .../util/helper/LiveDataHelper.kt             |  3 ++
 35 files changed, 172 insertions(+), 328 deletions(-)
 delete mode 100644 app/src/main/res/drawable-v21/bg_menuitem_dark.xml
 delete mode 100644 app/src/main/res/drawable-v21/bg_menuitem_light.xml
 delete mode 100644 app/src/main/res/drawable-v21/bg_menuitem_rounded_dark.xml
 delete mode 100644 app/src/main/res/drawable-v21/bg_menuitem_rounded_light.xml
 delete mode 100644 app/src/main/res/values-v21/themes_base.xml

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c9d62a77e..23987aca5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -45,7 +45,6 @@
     <activity
       android:name=".ui.chat.ChatActivity"
       android:exported="true"
-      android:label="@string/app_name"
       android:launchMode="singleTask"
       android:windowSoftInputMode="adjustResize">
       <intent-filter>
@@ -257,13 +256,11 @@
     <activity
       android:name=".ui.setup.accounts.selection.AccountSelectionActivity"
       android:exported="false"
-      android:label="@string/app_name"
       android:parentActivityName=".ui.chat.ChatActivity"
       android:windowSoftInputMode="adjustResize" />
     <activity
       android:name=".ui.setup.accounts.setup.AccountSetupActivity"
       android:exported="false"
-      android:label="@string/app_name"
       android:parentActivityName=".ui.setup.accounts.selection.AccountSelectionActivity"
       android:windowSoftInputMode="adjustResize" />
 
@@ -271,7 +268,6 @@
     <activity
       android:name=".ui.setup.accounts.edit.AccountEditActivity"
       android:exported="false"
-      android:label="@string/app_name"
       android:parentActivityName=".ui.setup.accounts.selection.AccountSelectionActivity"
       android:windowSoftInputMode="adjustResize" />
     <activity
diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityBaseModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityBaseModule.kt
index 77abda283..1a2eeaf7f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityBaseModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityBaseModule.kt
@@ -35,47 +35,39 @@ import de.kuschku.quasseldroid.viewmodel.QueryCreateViewModel
 object ActivityBaseModule {
   @ActivityScope
   @Provides
-  @JvmStatic
   fun bindContext(activity: FragmentActivity): Context = activity
 
   @ActivityScope
   @Provides
-  @JvmStatic
   fun provideViewModelProvider(activity: FragmentActivity) = ViewModelProvider(activity)
 
   @ActivityScope
   @Provides
-  @JvmStatic
   fun provideQuasselViewModel(viewModelProvider: ViewModelProvider) =
     viewModelProvider[QuasselViewModel::class.java]
 
   @ActivityScope
   @Provides
-  @JvmStatic
   fun provideChatViewModel(viewModelProvider: ViewModelProvider) =
     viewModelProvider[ChatViewModel::class.java]
 
   @ActivityScope
   @Provides
-  @JvmStatic
   fun provideEditorViewModel(viewModelProvider: ViewModelProvider) =
     viewModelProvider[EditorViewModel::class.java]
 
   @ActivityScope
   @Provides
-  @JvmStatic
   fun provideAccountViewModel(viewModelProvider: ViewModelProvider) =
     viewModelProvider[AccountViewModel::class.java]
 
   @ActivityScope
   @Provides
-  @JvmStatic
   fun provideQueryCreateViewModel(viewModelProvider: ViewModelProvider) =
     viewModelProvider[QueryCreateViewModel::class.java]
 
   @ActivityScope
   @Provides
-  @JvmStatic
   fun provideArchiveViewModel(viewModelProvider: ViewModelProvider) =
     viewModelProvider[ArchiveViewModel::class.java]
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/AppModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/AppModule.kt
index 379c68200..76588430c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/AppModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/AppModule.kt
@@ -29,11 +29,9 @@ import retrofit2.converter.gson.GsonConverterFactory
 @Module
 object AppModule {
   @Provides
-  @JvmStatic
   fun provideGson() = GsonBuilder().setPrettyPrinting().create()
 
   @Provides
-  @JvmStatic
   fun provideMatrixApi() = Retrofit.Builder()
     .baseUrl("https://matrix.org/")
     .addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create()))
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
index e123819c4..e4f651347 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
@@ -118,7 +118,8 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
       ChatActivity.intent(context.applicationContext, bufferId = buffer.id).apply {
         flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
       },
-      0
+      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) 0
+      else PendingIntent.FLAG_MUTABLE
     )
 
     val remoteInput = RemoteInput.Builder("reply_content")
@@ -132,7 +133,8 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
         context,
         bufferId = buffer.id
       ),
-      0
+      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) 0
+      else PendingIntent.FLAG_MUTABLE
     )
 
     val markReadPendingIntent = PendingIntent.getService(
@@ -143,7 +145,8 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
         bufferId = buffer.id,
         markReadMessage = notifications.last().messageId
       ),
-      0
+      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) 0
+      else PendingIntent.FLAG_MUTABLE
     )
 
     val deletePendingIntent = PendingIntent.getService(
@@ -154,7 +157,8 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
         bufferId = buffer.id,
         hideMessage = notifications.last().messageId
       ),
-      0
+      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) 0
+      else PendingIntent.FLAG_MUTABLE
     )
 
     val notification = NotificationCompat.Builder(
@@ -248,14 +252,16 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
       ChatActivity.intent(context.applicationContext).apply {
         flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
       },
-      0
+      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) 0
+      else PendingIntent.FLAG_MUTABLE
     )
 
     val pendingIntentDisconnect = PendingIntent.getService(
       context,
       System.currentTimeMillis().toInt(),
       QuasselService.intent(context.applicationContext, disconnect = true),
-      0
+      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) 0
+      else PendingIntent.FLAG_MUTABLE
     )
 
     val notification = NotificationCompat.Builder(
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ssl/QuasselTrustManager.kt b/app/src/main/java/de/kuschku/quasseldroid/ssl/QuasselTrustManager.kt
index 732a24ca3..6dca0ebd6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ssl/QuasselTrustManager.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ssl/QuasselTrustManager.kt
@@ -19,6 +19,7 @@
 
 package de.kuschku.quasseldroid.ssl
 
+import android.annotation.SuppressLint
 import de.kuschku.libquassel.connection.QuasselSecurityException
 import de.kuschku.quasseldroid.ssl.custom.QuasselCertificateManager
 import java.security.GeneralSecurityException
@@ -28,6 +29,7 @@ import javax.net.ssl.KeyManagerFactory
 import javax.net.ssl.TrustManagerFactory
 import javax.net.ssl.X509TrustManager
 
+@SuppressLint("CustomX509TrustManager")
 class QuasselTrustManager private constructor(
   private val certificateManager: QuasselCertificateManager,
   private val trustManager: X509TrustManager?
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index 06dad9d4c..028c5095e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -706,9 +706,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
                                  getString(R.string.label_error_connection, errorName, errorCode),
                                  Toast.LENGTH_LONG).show()
                 }
-                it is ConnectException &&
-                Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
-                cause is ErrnoException            -> {
+                it is ConnectException && cause is ErrnoException -> {
                   val errorCode = OsConstants.errnoName(cause.errno)
                   val errorName = OsConstants.strerror(cause.errno)
 
@@ -936,6 +934,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
   }
 
   override fun onSaveInstanceState(outState: Bundle) {
+    super.onSaveInstanceState(outState)
     chatViewModel.onSaveInstanceState(outState)
 
     outState.putLong(KEY_CONNECTED_ACCOUNT, connectedAccount.id)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt
index edb24889b..2f1d1e6ba 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt
@@ -48,6 +48,7 @@ import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.ui.settings.fragment.ServiceBoundSettingsFragment
 import de.kuschku.quasseldroid.viewmodel.helper.QuasselViewModelHelper
 import io.reactivex.Observable
+import io.reactivex.disposables.Disposable
 import javax.inject.Inject
 
 class ChannelCreateFragment : ServiceBoundSettingsFragment() {
@@ -180,8 +181,8 @@ class ChannelCreateFragment : ServiceBoundSettingsFragment() {
               sendInput(statusBuffer, "/join $channelName")
               modelHelper.networks.safeSwitchMap {
                 it[selectedNetworkId]?.liveIrcChannel(channelName)
-                ?: Observable.empty()
-              }.subscribe {
+                  ?: Observable.empty()
+              }.toLiveData().observe(viewLifecycleOwner) {
                 if (it.ircUsers().size <= 1) {
                   if (isInviteOnly) {
                     sendInput(statusBuffer, "/mode $channelName +i")
@@ -199,8 +200,8 @@ class ChannelCreateFragment : ServiceBoundSettingsFragment() {
                 activity?.let {
                   it.finish()
                   ChatActivity.launch(it,
-                                      networkId = selectedNetworkId,
-                                      channel = channelName
+                    networkId = selectedNetworkId,
+                    channel = channelName
                   )
                 }
               }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/ServiceBoundSetupActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/ServiceBoundSetupActivity.kt
index 49c8f53f4..1c62eb25f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/ServiceBoundSetupActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/ServiceBoundSetupActivity.kt
@@ -137,9 +137,7 @@ abstract class ServiceBoundSetupActivity :
   }
 
   fun updateRecentsHeader() {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
-      updateRecentsHeaderIfExisting(title.toString(), icon, recentsHeaderColor)
-    }
+    updateRecentsHeader(title.toString(), icon, recentsHeaderColor)
   }
 
   override fun setTitle(title: CharSequence?) {
@@ -200,8 +198,7 @@ abstract class ServiceBoundSetupActivity :
       else
         viewPager.setCurrentItem(viewPager.currentItem + 1, true)
     }
-    isValid.observeSticky(
-      this, Observer {
+    isValid.observeSticky(this) {
       if (it == true) {
         button.show()
         adapter.lastValidItem = viewPager.currentItem
@@ -209,7 +206,7 @@ abstract class ServiceBoundSetupActivity :
         button.hide()
         adapter.lastValidItem = viewPager.currentItem - 1
       }
-    })
+    }
     viewPager.addOnPageChangeListener(pageChangeListener)
     pageChanged()
     updateRecentsHeader()
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 8d2cbde44..9c9cbaf08 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
@@ -21,13 +21,11 @@ package de.kuschku.quasseldroid.ui.setup
 
 import android.content.Context
 import android.content.pm.PackageManager
-import android.os.Build
 import android.os.Bundle
 import androidx.annotation.ColorRes
 import androidx.annotation.DrawableRes
 import androidx.appcompat.widget.ActionMenuView
 import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.Observer
 import androidx.viewpager.widget.ViewPager
 import butterknife.BindView
 import butterknife.ButterKnife
@@ -39,7 +37,11 @@ import de.kuschku.quasseldroid.ui.clientsettings.about.AboutActivity
 import de.kuschku.quasseldroid.ui.clientsettings.client.ClientSettingsActivity
 import de.kuschku.quasseldroid.ui.clientsettings.crash.CrashActivity
 import de.kuschku.quasseldroid.ui.clientsettings.whitelist.WhitelistActivity
-import de.kuschku.quasseldroid.util.helper.*
+import de.kuschku.quasseldroid.util.helper.observeSticky
+import de.kuschku.quasseldroid.util.helper.or
+import de.kuschku.quasseldroid.util.helper.safeSwitchMap
+import de.kuschku.quasseldroid.util.helper.setTooltip
+import de.kuschku.quasseldroid.util.helper.updateRecentsHeader
 import de.kuschku.quasseldroid.util.ui.LocaleHelper
 
 abstract class SetupActivity : DaggerAppCompatActivity() {
@@ -99,9 +101,7 @@ abstract class SetupActivity : DaggerAppCompatActivity() {
   }
 
   fun updateRecentsHeader() {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
-      updateRecentsHeaderIfExisting(title.toString(), icon, recentsHeaderColor)
-    }
+    updateRecentsHeader(title.toString(), icon, recentsHeaderColor)
   }
 
   override fun setTitle(title: CharSequence?) {
@@ -161,8 +161,7 @@ abstract class SetupActivity : DaggerAppCompatActivity() {
       else
         viewPager.setCurrentItem(viewPager.currentItem + 1, true)
     }
-    isValid.observeSticky(
-      this, Observer {
+    isValid.observeSticky(this) {
       if (it == true) {
         button.show()
         adapter.lastValidItem = viewPager.currentItem
@@ -170,7 +169,7 @@ abstract class SetupActivity : DaggerAppCompatActivity() {
         button.hide()
         adapter.lastValidItem = viewPager.currentItem - 1
       }
-    })
+    }
     viewPager.addOnPageChangeListener(pageChangeListener)
     pageChanged()
     updateRecentsHeader()
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/helper/ActivityHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/helper/ActivityHelper.kt
index e10d71690..b02431a0d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/helper/ActivityHelper.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/helper/ActivityHelper.kt
@@ -19,12 +19,11 @@
 
 package de.kuschku.quasseldroid.util.helper
 
-import android.annotation.TargetApi
 import android.app.Activity
 import android.app.ActivityManager
-import android.graphics.Bitmap
 import android.graphics.BitmapFactory
 import android.os.Build
+import androidx.annotation.ColorInt
 import androidx.annotation.ColorRes
 import androidx.annotation.DrawableRes
 import androidx.annotation.StringRes
@@ -38,11 +37,13 @@ import androidx.annotation.StringRes
  * @param colorPrimary The color used as background for the header of the recents card - passed as Android
  * Color Resource
  */
-fun Activity.updateRecentsHeaderIfExisting(label: String, @DrawableRes icon: Int,
-                                           @ColorRes colorPrimary: Int) {
-  val iconRaw = BitmapFactory.decodeResource(resources, icon)
+fun Activity.updateRecentsHeader(
+  label: String,
+  @DrawableRes icon: Int,
+  @ColorRes colorPrimary: Int
+) {
   val colorPrimaryRaw = resources.getColorBackport(colorPrimary, theme)
-  updateRecentsHeaderIfExisting(label, iconRaw, colorPrimaryRaw)
+  updateRecentsHeaderInternal(label, icon, colorPrimaryRaw)
 }
 
 /**
@@ -54,26 +55,14 @@ fun Activity.updateRecentsHeaderIfExisting(label: String, @DrawableRes icon: Int
  * @param colorPrimary The color used as background for the header of the recents card - passed as Android
  * Color Resource
  */
-fun Activity.updateRecentsHeaderIfExisting(@StringRes label: Int, @DrawableRes icon: Int,
-                                           @ColorRes colorPrimary: Int) {
+fun Activity.updateRecentsHeader(
+  @StringRes label: Int,
+  @DrawableRes icon: Int,
+  @ColorRes colorPrimary: Int
+) {
   val labelRaw = resources.getString(label)
-  val iconRaw = BitmapFactory.decodeResource(resources, icon)
   val colorPrimaryRaw = resources.getColorBackport(colorPrimary, theme)
-  updateRecentsHeaderIfExisting(labelRaw, iconRaw, colorPrimaryRaw)
-}
-
-/**
- * Modifies the display of an {@see Activity} in the Android Recents menu if the current version
- * of Android supports doing so.
- *
- * @param label The text shown in recents as label
- * @param icon The icon displayed in recents
- * @param colorPrimary The color used as background for the header of the recents card
- */
-fun Activity.updateRecentsHeaderIfExisting(label: String, icon: Bitmap, colorPrimary: Int) {
-  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-    updateRecentsHeader(label, icon, colorPrimary)
-  }
+  updateRecentsHeaderInternal(labelRaw, icon, colorPrimaryRaw)
 }
 
 /**
@@ -82,10 +71,17 @@ fun Activity.updateRecentsHeaderIfExisting(label: String, icon: Bitmap, colorPri
  * @param label The text shown in recents as label
  * @param icon The icon displayed in recents
  * @param colorPrimary The color used as background for the header of the recents card
- * @since Lollipop
  */
-@TargetApi(Build.VERSION_CODES.LOLLIPOP)
-private fun Activity.updateRecentsHeader(label: String, icon: Bitmap,
-                                         colorPrimary: Int) {
-  setTaskDescription(ActivityManager.TaskDescription(label, icon, colorPrimary))
+private fun Activity.updateRecentsHeaderInternal(
+  label: String,
+  @DrawableRes icon: Int,
+  @ColorInt colorPrimary: Int
+) {
+  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+    setTaskDescription(ActivityManager.TaskDescription(label, icon, colorPrimary))
+  } else {
+    val iconRaw = BitmapFactory.decodeResource(resources, icon)
+    @Suppress("DEPRECATION")
+    setTaskDescription(ActivityManager.TaskDescription(label, iconRaw, colorPrimary))
+  }
 }
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 de466fa46..6e8fdc310 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
@@ -39,7 +39,7 @@ import de.kuschku.quasseldroid.settings.ConnectionSettings
 import de.kuschku.quasseldroid.settings.Settings
 import de.kuschku.quasseldroid.util.helper.editCommit
 import de.kuschku.quasseldroid.util.helper.sharedPreferences
-import de.kuschku.quasseldroid.util.helper.updateRecentsHeaderIfExisting
+import de.kuschku.quasseldroid.util.helper.updateRecentsHeader
 import de.kuschku.quasseldroid.util.ui.ThemedActivity
 import de.kuschku.quasseldroid.viewmodel.QuasselViewModel
 import io.reactivex.subjects.BehaviorSubject
@@ -105,9 +105,7 @@ abstract class ServiceBoundActivity :
   }
 
   fun updateRecentsHeader() {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
-      updateRecentsHeaderIfExisting(title.toString(), icon, recentsHeaderColor)
-    }
+    updateRecentsHeader(title.toString(), icon, recentsHeaderColor)
   }
 
   override fun setTitle(title: CharSequence?) {
diff --git a/app/src/main/res/drawable-v21/bg_menuitem_dark.xml b/app/src/main/res/drawable-v21/bg_menuitem_dark.xml
deleted file mode 100644
index 39762f7d4..000000000
--- a/app/src/main/res/drawable-v21/bg_menuitem_dark.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  Quasseldroid - Quassel client for Android
-
-  Copyright (c) 2020 Janne Mareike Koschinski
-  Copyright (c) 2020 The Quassel Project
-
-  This program is free software: you can redistribute it and/or modify it
-  under the terms of the GNU General Public License version 3 as published
-  by the Free Software Foundation.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License along
-  with this program. If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:state_selected="true">
-    <shape android:shape="rectangle">
-      <solid android:color="@color/ripple_dark" />
-    </shape>
-  </item>
-  <item>
-    <ripple android:color="@color/ripple_dark" />
-  </item>
-</selector>
diff --git a/app/src/main/res/drawable-v21/bg_menuitem_light.xml b/app/src/main/res/drawable-v21/bg_menuitem_light.xml
deleted file mode 100644
index 5baa69c49..000000000
--- a/app/src/main/res/drawable-v21/bg_menuitem_light.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  Quasseldroid - Quassel client for Android
-
-  Copyright (c) 2020 Janne Mareike Koschinski
-  Copyright (c) 2020 The Quassel Project
-
-  This program is free software: you can redistribute it and/or modify it
-  under the terms of the GNU General Public License version 3 as published
-  by the Free Software Foundation.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License along
-  with this program. If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:state_selected="true">
-    <shape android:shape="rectangle">
-      <solid android:color="@color/ripple_light" />
-    </shape>
-  </item>
-  <item>
-    <ripple android:color="@color/ripple_light" />
-  </item>
-</selector>
diff --git a/app/src/main/res/drawable-v21/bg_menuitem_rounded_dark.xml b/app/src/main/res/drawable-v21/bg_menuitem_rounded_dark.xml
deleted file mode 100644
index fa3e24dfe..000000000
--- a/app/src/main/res/drawable-v21/bg_menuitem_rounded_dark.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  Quasseldroid - Quassel client for Android
-
-  Copyright (c) 2020 Janne Mareike Koschinski
-  Copyright (c) 2020 The Quassel Project
-
-  This program is free software: you can redistribute it and/or modify it
-  under the terms of the GNU General Public License version 3 as published
-  by the Free Software Foundation.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License along
-  with this program. If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:state_selected="true">
-    <shape android:shape="rectangle">
-      <corners android:radius="@dimen/button_corner_radius" />
-      <solid android:color="@color/ripple_dark" />
-    </shape>
-  </item>
-  <item>
-    <ripple android:color="@color/ripple_dark">
-      <item android:id="@android:id/mask">
-        <shape>
-          <corners android:radius="@dimen/button_corner_radius" />
-          <solid android:color="#fff" />
-        </shape>
-      </item>
-    </ripple>
-  </item>
-</selector>
diff --git a/app/src/main/res/drawable-v21/bg_menuitem_rounded_light.xml b/app/src/main/res/drawable-v21/bg_menuitem_rounded_light.xml
deleted file mode 100644
index fdc934f88..000000000
--- a/app/src/main/res/drawable-v21/bg_menuitem_rounded_light.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  Quasseldroid - Quassel client for Android
-
-  Copyright (c) 2020 Janne Mareike Koschinski
-  Copyright (c) 2020 The Quassel Project
-
-  This program is free software: you can redistribute it and/or modify it
-  under the terms of the GNU General Public License version 3 as published
-  by the Free Software Foundation.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License along
-  with this program. If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:state_selected="true">
-    <shape>
-      <corners android:radius="@dimen/button_corner_radius" />
-      <solid android:color="@color/ripple_light" />
-    </shape>
-  </item>
-  <item>
-    <ripple android:color="@color/ripple_light">
-      <item android:id="@android:id/mask">
-        <shape>
-          <corners android:radius="@dimen/button_corner_radius" />
-          <solid android:color="#fff" />
-        </shape>
-      </item>
-    </ripple>
-  </item>
-</selector>
diff --git a/app/src/main/res/drawable/bg_menuitem_dark.xml b/app/src/main/res/drawable/bg_menuitem_dark.xml
index f535f8466..39762f7d4 100644
--- a/app/src/main/res/drawable/bg_menuitem_dark.xml
+++ b/app/src/main/res/drawable/bg_menuitem_dark.xml
@@ -23,9 +23,7 @@
       <solid android:color="@color/ripple_dark" />
     </shape>
   </item>
-  <item android:state_pressed="true">
-    <shape android:shape="rectangle">
-      <solid android:color="@color/ripple_dark" />
-    </shape>
+  <item>
+    <ripple android:color="@color/ripple_dark" />
   </item>
 </selector>
diff --git a/app/src/main/res/drawable/bg_menuitem_light.xml b/app/src/main/res/drawable/bg_menuitem_light.xml
index 33dc5abe5..5baa69c49 100644
--- a/app/src/main/res/drawable/bg_menuitem_light.xml
+++ b/app/src/main/res/drawable/bg_menuitem_light.xml
@@ -23,9 +23,7 @@
       <solid android:color="@color/ripple_light" />
     </shape>
   </item>
-  <item android:state_pressed="true">
-    <shape android:shape="rectangle">
-      <solid android:color="@color/ripple_light" />
-    </shape>
+  <item>
+    <ripple android:color="@color/ripple_light" />
   </item>
 </selector>
diff --git a/app/src/main/res/drawable/bg_menuitem_rounded_dark.xml b/app/src/main/res/drawable/bg_menuitem_rounded_dark.xml
index d632e1afb..fa3e24dfe 100644
--- a/app/src/main/res/drawable/bg_menuitem_rounded_dark.xml
+++ b/app/src/main/res/drawable/bg_menuitem_rounded_dark.xml
@@ -24,10 +24,14 @@
       <solid android:color="@color/ripple_dark" />
     </shape>
   </item>
-  <item android:state_pressed="true">
-    <shape android:shape="rectangle">
-      <corners android:radius="@dimen/button_corner_radius" />
-      <solid android:color="@color/ripple_dark" />
-    </shape>
+  <item>
+    <ripple android:color="@color/ripple_dark">
+      <item android:id="@android:id/mask">
+        <shape>
+          <corners android:radius="@dimen/button_corner_radius" />
+          <solid android:color="#fff" />
+        </shape>
+      </item>
+    </ripple>
   </item>
 </selector>
diff --git a/app/src/main/res/drawable/bg_menuitem_rounded_light.xml b/app/src/main/res/drawable/bg_menuitem_rounded_light.xml
index cc57283dd..fdc934f88 100644
--- a/app/src/main/res/drawable/bg_menuitem_rounded_light.xml
+++ b/app/src/main/res/drawable/bg_menuitem_rounded_light.xml
@@ -19,15 +19,19 @@
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_selected="true">
-    <shape android:shape="rectangle">
+    <shape>
       <corners android:radius="@dimen/button_corner_radius" />
       <solid android:color="@color/ripple_light" />
     </shape>
   </item>
-  <item android:state_pressed="true">
-    <shape android:shape="rectangle">
-      <corners android:radius="@dimen/button_corner_radius" />
-      <solid android:color="@color/ripple_light" />
-    </shape>
+  <item>
+    <ripple android:color="@color/ripple_light">
+      <item android:id="@android:id/mask">
+        <shape>
+          <corners android:radius="@dimen/button_corner_radius" />
+          <solid android:color="#fff" />
+        </shape>
+      </item>
+    </ripple>
   </item>
 </selector>
diff --git a/app/src/main/res/layout/dialog_colorchooser_custom.xml b/app/src/main/res/layout/dialog_colorchooser_custom.xml
index 348f547e6..fded56d58 100644
--- a/app/src/main/res/layout/dialog_colorchooser_custom.xml
+++ b/app/src/main/res/layout/dialog_colorchooser_custom.xml
@@ -61,7 +61,8 @@
       android:textColor="?colorTextPrimary"
       android:textColorHint="?colorTextSecondary"
       android:textSize="@dimen/md_title_textsize"
-      tools:ignore="HardcodedText" />
+      tools:ignore="HardcodedText"
+      android:importantForAutofill="no" />
 
   </LinearLayout>
 
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 4762aab26..5a23b2e5a 100644
--- a/app/src/main/res/layout/widget_core_account_add.xml
+++ b/app/src/main/res/layout/widget_core_account_add.xml
@@ -35,7 +35,7 @@
     android:layout_height="32dp"
     android:layout_gravity="center_vertical"
     android:layout_marginEnd="16dp"
-    android:tint="#727272"
+    app:tint="#727272"
     app:srcCompat="@drawable/ic_add"
     tools:ignore="ContentDescription" />
 
diff --git a/app/src/main/res/values-fr-rCA/strings_messages.xml b/app/src/main/res/values-fr-rCA/strings_messages.xml
index a7419f730..0dd804a8b 100644
--- a/app/src/main/res/values-fr-rCA/strings_messages.xml
+++ b/app/src/main/res/values-fr-rCA/strings_messages.xml
@@ -17,12 +17,12 @@
   with this program. If not, see <http://www.gnu.org/licenses/>.
   -->
 
-<resources>
-  <plurals name="message_netsplit_join">
+<resources xmlns:tools="http://schemas.android.com/tools">
+  <plurals name="message_netsplit_join" tools:ignore="MissingQuantity">
     <item quantity="one">Netsplit entre %1$s et %2$s est terminé: %3$d nouvel utilisateur: %4$s</item>
     <item quantity="other">Netsplit entre %1$s et %2$s est terminé: %3$d nouveaux utilisateurs: %4$s</item>
   </plurals>
-  <plurals name="message_netsplit_quit">
+  <plurals name="message_netsplit_quit" tools:ignore="MissingQuantity">
     <item quantity="one">Netsplit entre %1$s et %2$s: %3$d utilisateur a quitté: %4$s</item>
     <item quantity="other">Netsplit entre %1$s et %2$s: %3$d utilisateurs ont quittés: %4$s</item>
   </plurals>
diff --git a/app/src/main/res/values-v21/themes_base.xml b/app/src/main/res/values-v21/themes_base.xml
deleted file mode 100644
index a03970453..000000000
--- a/app/src/main/res/values-v21/themes_base.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
-  Quasseldroid - Quassel client for Android
-
-  Copyright (c) 2020 Janne Mareike Koschinski
-  Copyright (c) 2020 The Quassel Project
-
-  This program is free software: you can redistribute it and/or modify it
-  under the terms of the GNU General Public License version 3 as published
-  by the Free Software Foundation.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License along
-  with this program. If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<resources>
-
-  <style name="Theme.AppTheme.NoActionBar" parent="Theme.MaterialComponents.NoActionBar.Bridge">
-    <item name="colorPrimary">@color/colorPrimary</item>
-    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
-    <item name="colorAccent">@color/colorAccent</item>
-    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
-    <item name="android:statusBarColor">?attr/colorPrimaryDark</item>
-  </style>
-
-  <style name="Theme.AppTheme.Light.NoActionBar" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
-    <item name="colorPrimary">@color/colorPrimary</item>
-    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
-    <item name="colorAccent">@color/colorAccent</item>
-    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
-    <item name="android:statusBarColor">?attr/colorPrimaryDark</item>
-  </style>
-
-  <style name="Base.ChatTheme" parent="Theme.AppTheme.NoActionBar">
-    <item name="android:statusBarColor">#0000</item>
-  </style>
-
-  <style name="Base.ChatTheme.Light" parent="Theme.AppTheme.Light.NoActionBar">
-    <item name="android:statusBarColor">#0000</item>
-  </style>
-</resources>
diff --git a/app/src/main/res/values/themes_base.xml b/app/src/main/res/values/themes_base.xml
index 15d454569..6cd4fb69a 100644
--- a/app/src/main/res/values/themes_base.xml
+++ b/app/src/main/res/values/themes_base.xml
@@ -37,25 +37,29 @@
     <item name="backgroundMenuItemRounded">@drawable/bg_menuitem_rounded_light</item>
   </style>
 
-  <style name="Theme.AppTheme.NoActionBar" parent="Theme.AppTheme">
-    <item name="windowActionBar">false</item>
-    <item name="windowNoTitle">true</item>
-
-    <item name="backgroundMenuItem">@drawable/bg_menuitem_dark</item>
-    <item name="backgroundMenuItemRounded">@drawable/bg_menuitem_rounded_dark</item>
+  <style name="Theme.AppTheme.NoActionBar" parent="Theme.MaterialComponents.NoActionBar.Bridge">
+    <item name="colorPrimary">@color/colorPrimary</item>
+    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+    <item name="colorAccent">@color/colorAccent</item>
+    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+    <item name="android:statusBarColor">?attr/colorPrimaryDark</item>
   </style>
 
-  <style name="Theme.AppTheme.Light.NoActionBar" parent="Theme.AppTheme.Light">
-    <item name="windowActionBar">false</item>
-    <item name="windowNoTitle">true</item>
-
-    <item name="backgroundMenuItem">@drawable/bg_menuitem_light</item>
-    <item name="backgroundMenuItemRounded">@drawable/bg_menuitem_rounded_light</item>
+  <style name="Theme.AppTheme.Light.NoActionBar" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
+    <item name="colorPrimary">@color/colorPrimary</item>
+    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+    <item name="colorAccent">@color/colorAccent</item>
+    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+    <item name="android:statusBarColor">?attr/colorPrimaryDark</item>
   </style>
 
-  <style name="Theme.Base.ChatTheme" parent="Theme.AppTheme.NoActionBar" />
+  <style name="Base.ChatTheme" parent="Theme.AppTheme.NoActionBar">
+    <item name="android:statusBarColor">#0000</item>
+  </style>
 
-  <style name="Theme.Base.ChatTheme.Light" parent="Theme.AppTheme.Light.NoActionBar" />
+  <style name="Base.ChatTheme.Light" parent="Theme.AppTheme.Light.NoActionBar">
+    <item name="android:statusBarColor">#0000</item>
+  </style>
 
   <style name="Theme.SetupTheme" parent="Theme.AppTheme.Light">
     <item name="windowActionBar">false</item>
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
index 1305599f7..c90094aa6 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
@@ -39,6 +39,15 @@ class RpcHandler(
   private val backlogStorage: BacklogStorage? = null,
   private val notificationManager: NotificationManager? = null
 ) : SyncableObject(session.proxy, "RpcHandler"), IRpcHandler {
+  override fun deinit() {
+    super.deinit()
+    session = ISession.NULL
+  }
+
+  init {
+    initialized = true
+  }
+
   override fun displayStatusMsg(net: String?, msg: String?) {
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/ssl/TrustManagers.kt b/lib/src/main/java/de/kuschku/libquassel/ssl/TrustManagers.kt
index 736030725..31c8901c0 100644
--- a/lib/src/main/java/de/kuschku/libquassel/ssl/TrustManagers.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/ssl/TrustManagers.kt
@@ -35,6 +35,7 @@ object TrustManagers {
 
   fun trustAll() = TrustAllX509TrustManager()
 
+  @Suppress("CustomX509TrustManager")
   class TrustAllX509TrustManager : X509TrustManager {
     override fun checkClientTrusted(p0: Array<out X509Certificate>?, p1: String?) = Unit
     override fun checkServerTrusted(p0: Array<out X509Certificate>?, p1: String?) = Unit
diff --git a/lib/src/test/java/de/kuschku/libquassel/integration/BufferViewConfigTest.kt b/lib/src/test/java/de/kuschku/libquassel/integration/BufferViewConfigTest.kt
index 3ed2abb4b..2c46068fe 100644
--- a/lib/src/test/java/de/kuschku/libquassel/integration/BufferViewConfigTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/integration/BufferViewConfigTest.kt
@@ -20,9 +20,9 @@
 package de.kuschku.libquassel.integration
 
 import de.kuschku.libquassel.protocol.BufferId
-import de.kuschku.libquassel.protocol.QType
+import de.kuschku.libquassel.protocol.QuasselType
 import de.kuschku.libquassel.protocol.QVariant_
-import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.protocol.QtType
 import de.kuschku.libquassel.util.TestSession
 import de.kuschku.libquassel.util.setupTestSession
 import de.kuschku.libquassel.util.with
@@ -46,8 +46,8 @@ class BufferViewConfigTest {
       bufferViewConfig.insertBufferSorted(bufferSyncer.bufferInfo(BufferId(4))!!, bufferSyncer)
     }.does {
       callSync(bufferViewConfig, "requestAddBuffer", listOf(
-        QVariant_.of(BufferId(4), QType.BufferId),
-        QVariant_.of(2, Type.Int)
+        QVariant_.of(BufferId(4), QuasselType.BufferId),
+        QVariant_.of(2, QtType.Int)
       ))
     }
   }
diff --git a/lib/src/test/java/de/kuschku/libquassel/integration/SampleIntegrationTest.kt b/lib/src/test/java/de/kuschku/libquassel/integration/SampleIntegrationTest.kt
index a005fe23f..0f5b8680b 100644
--- a/lib/src/test/java/de/kuschku/libquassel/integration/SampleIntegrationTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/integration/SampleIntegrationTest.kt
@@ -20,9 +20,9 @@
 package de.kuschku.libquassel.integration
 
 import de.kuschku.libquassel.protocol.NetworkId
-import de.kuschku.libquassel.protocol.QType
+import de.kuschku.libquassel.protocol.QuasselType
 import de.kuschku.libquassel.protocol.QVariant_
-import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.protocol.QtType
 import de.kuschku.libquassel.util.withTestSession
 import org.junit.Test
 
@@ -30,15 +30,15 @@ class SampleIntegrationTest {
   @Test
   fun test() = withTestSession {
     ensure {
-      rpcHandler.changePassword(0L, "user", "pass", "p@ssword1")
+      rpcHandler.changePassword(0UL, "user", "pass", "p@ssword1")
     }.does {
       callRpc(
         "2changePassword(PeerPtr,QString,QString,QString)",
         listOf(
-          QVariant_.of(0L, QType.PeerPtr),
-          QVariant_.of("user", Type.QString),
-          QVariant_.of("pass", Type.QString),
-          QVariant_.of("p@ssword1", Type.QString)
+          QVariant_.of(0UL, QuasselType.PeerPtr),
+          QVariant_.of("user", QtType.QString),
+          QVariant_.of("pass", QtType.QString),
+          QVariant_.of("p@ssword1", QtType.QString)
         )
       )
     }
diff --git a/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt b/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt
index 648777872..c06367443 100644
--- a/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt
@@ -81,10 +81,10 @@ class NetworkTest {
     original.addSupport("CHANTYPES", "#")
     original.addSupport("CHARSET", "ascii")
     original.addSupport("ELIST", "MU")
-    original.addSupport("ESILENCE", null)
+    original.addSupport("ESILENCE", "")
     original.addSupport("EXCEPTS", "e")
     original.addSupport("EXTBAN", ",ABCNOQRSTUcjmprsz")
-    original.addSupport("FNC", null)
+    original.addSupport("FNC", "")
     original.addSupport("INVEX", "I")
     for (i in 0 until 8) {
       original.newIrcUser(randomString() + "!" + randomString() + "@" + randomString()).apply {
@@ -208,10 +208,10 @@ class NetworkTest {
     original.addSupport("CHANTYPES", "#")
     original.addSupport("CHARSET", "ascii")
     original.addSupport("ELIST", "MU")
-    original.addSupport("ESILENCE", null)
+    original.addSupport("ESILENCE", "")
     original.addSupport("EXCEPTS", "e")
     original.addSupport("EXTBAN", ",ABCNOQRSTUcjmprsz")
-    original.addSupport("FNC", null)
+    original.addSupport("FNC", "")
     original.addSupport("INVEX", "I")
     for (i in 0 until 8) {
       original.newIrcUser(randomString() + "!" + randomString() + "@" + randomString()).apply {
diff --git a/lib/src/test/java/de/kuschku/libquassel/util/TestSession.kt b/lib/src/test/java/de/kuschku/libquassel/util/TestSession.kt
index 382f211d6..aec1e47e8 100644
--- a/lib/src/test/java/de/kuschku/libquassel/util/TestSession.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/util/TestSession.kt
@@ -21,11 +21,33 @@ package de.kuschku.libquassel.util
 
 import de.kuschku.libquassel.connection.ConnectionState
 import de.kuschku.libquassel.connection.Features
-import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.IdentityId
+import de.kuschku.libquassel.protocol.Message_Type
+import de.kuschku.libquassel.protocol.Message_Types
+import de.kuschku.libquassel.protocol.MsgId
+import de.kuschku.libquassel.protocol.NetworkId
+import de.kuschku.libquassel.protocol.QVariantList
+import de.kuschku.libquassel.protocol.QVariantMap
 import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
 import de.kuschku.libquassel.quassel.BufferInfo
-import de.kuschku.libquassel.quassel.syncables.*
+import de.kuschku.libquassel.quassel.syncables.AliasManager
+import de.kuschku.libquassel.quassel.syncables.BacklogManager
+import de.kuschku.libquassel.quassel.syncables.BufferSyncer
+import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
+import de.kuschku.libquassel.quassel.syncables.BufferViewManager
+import de.kuschku.libquassel.quassel.syncables.CertManager
+import de.kuschku.libquassel.quassel.syncables.CoreInfo
+import de.kuschku.libquassel.quassel.syncables.DccConfig
+import de.kuschku.libquassel.quassel.syncables.HighlightRuleManager
+import de.kuschku.libquassel.quassel.syncables.Identity
+import de.kuschku.libquassel.quassel.syncables.IgnoreListManager
+import de.kuschku.libquassel.quassel.syncables.IrcChannel
+import de.kuschku.libquassel.quassel.syncables.IrcListHelper
+import de.kuschku.libquassel.quassel.syncables.IrcUser
+import de.kuschku.libquassel.quassel.syncables.Network
+import de.kuschku.libquassel.quassel.syncables.NetworkConfig
+import de.kuschku.libquassel.quassel.syncables.RpcHandler
 import de.kuschku.libquassel.quassel.syncables.interfaces.IAliasManager
 import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject
 import de.kuschku.libquassel.session.ISession
@@ -91,6 +113,7 @@ class TestSession : ProtocolHandler({ throw it }), ISession {
     }
 
     fun callRpc(slotName: String, params: QVariantList?) {
+      println(rpc)
       val matchingNames = rpc.filter {
         it.slotName == slotName
       }
diff --git a/lint.xml b/lint.xml
index 89a5ad06a..eab67bd5e 100644
--- a/lint.xml
+++ b/lint.xml
@@ -34,6 +34,8 @@
 
   <!-- Can’t request a translation without a release, can’t release without translation -->
   <issue id="MissingTranslation" severity="informational" />
+  <!-- Because we don’t use app bundles and never will use them -->
+  <issue id="AppBundleLocaleChanges" severity="informational" />
   <!-- Because this tries to apply english orthography to other locales -->
   <issue id="Typos" severity="ignore" />
 
@@ -42,4 +44,10 @@
 
   <!-- We’re not using AGP 5 yet, and once we are, we’ll use compose anyway -->
   <issue id="NonConstantResourceId" severity="informational" />
+
+  <!-- It’s only used for testing -->
+  <issue id="TrustAllX509TrustManager" severity="informational" />
+
+  <!-- TODO for the future -->
+  <issue id="DataExtractionRules" severity="informational" />
 </lint>
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt
index 2b0a4e74c..9d7a6ae22 100644
--- a/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt
@@ -41,7 +41,9 @@ class DisplayCollector(application: Application) :
 
   @Suppress("DEPRECATION")
   override fun collect(context: CrashContext, config: Boolean): DisplayInfo {
-    val display = context.application.display ?: windowManager.defaultDisplay
+    val display =
+      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) windowManager.defaultDisplay
+      else context.application.display ?: windowManager.defaultDisplay
     val hdrCapabilities = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
       val capabilitiesEnum = getHdrCapabilitiesEnum()
       display.hdrCapabilities.supportedHdrTypes.map(capabilitiesEnum::get)
diff --git a/ui_spinner/src/main/java/de/kuschku/ui/spinner/CutoutDrawable.java b/ui_spinner/src/main/java/de/kuschku/ui/spinner/CutoutDrawable.java
index 64b865c4c..e54b577e7 100644
--- a/ui_spinner/src/main/java/de/kuschku/ui/spinner/CutoutDrawable.java
+++ b/ui_spinner/src/main/java/de/kuschku/ui/spinner/CutoutDrawable.java
@@ -111,12 +111,7 @@ class CutoutDrawable extends MaterialShapeDrawable {
   }
 
   private void saveCanvasLayer(@NonNull Canvas canvas) {
-    if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
-      savedLayer = canvas.saveLayer(0, 0, canvas.getWidth(), canvas.getHeight(), null);
-    } else {
-      savedLayer =
-        canvas.saveLayer(0, 0, canvas.getWidth(), canvas.getHeight(), null, Canvas.ALL_SAVE_FLAG);
-    }
+    savedLayer = canvas.saveLayer(0, 0, canvas.getWidth(), canvas.getHeight(), null);
   }
 
   private void postDraw(@NonNull Canvas canvas) {
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/util/emoji/EmojiData.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/util/emoji/EmojiData.kt
index 1af17ba21..80fe823a1 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/util/emoji/EmojiData.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/util/emoji/EmojiData.kt
@@ -1735,20 +1735,7 @@ object EmojiData {
     "\u2139\uFE0F" to "\u2139", // INFORMATION_SOURCE
     "\u3297\uFE0F" to "\u3297", // CONGRATULATIONS
     "\u3299\uFE0F" to "\u3299" // SECRET
-  ) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
-    mapOf(
-      "\uD83C\uDDEF\uD83C\uDDF5" to "\uDBB9\uDCE5", // JP
-      "\uD83C\uDDF0\uD83C\uDDF7" to "\uDBB9\uDCEE", // KR
-      "\uD83C\uDDE9\uD83C\uDDEA" to "\uDBB9\uDCE8", // DE
-      "\uD83C\uDDE8\uD83C\uDDF3" to "\uDBB9\uDCED", // CN
-      "\uD83C\uDDFA\uD83C\uDDF8" to "\uDBB9\uDCE6", // US
-      "\uD83C\uDDEB\uD83C\uDDF7" to "\uDBB9\uDCE7", // FR
-      "\uD83C\uDDEA\uD83C\uDDF8" to "\uDBB9\uDCEB", // ES
-      "\uD83C\uDDEE\uD83C\uDDF9" to "\uDBB9\uDCE9", // IT
-      "\uD83C\uDDF7\uD83C\uDDFA" to "\uDBB9\uDCEC", // RU
-      "\uD83C\uDDEC\uD83C\uDDE7" to "\uDBB9\uDCEA" // GB
-    )
-  } else emptyMap()
+  )
 
   val emojis = conversionMap.values.toSet() + rawEmojiMap.values.toSet() + "\u200d" + "\ufe0f"
 
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/util/helper/LiveDataHelper.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/util/helper/LiveDataHelper.kt
index b2ebd431b..2fa4491c8 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/util/helper/LiveDataHelper.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/util/helper/LiveDataHelper.kt
@@ -20,6 +20,7 @@
 
 package de.kuschku.quasseldroid.util.helper
 
+import android.annotation.SuppressLint
 import androidx.annotation.MainThread
 import androidx.lifecycle.*
 import io.reactivex.Observable
@@ -33,6 +34,7 @@ inline fun <X, Y> LiveData<X?>.safeSwitchMap(
     this, object : Observer<X?> {
     var mSource: LiveData<Y>? = null
 
+    @SuppressLint("NullSafeMutableLiveData")
     override fun onChanged(x: X?) {
       val newLiveData = if (x == null) null else func(x)
       if (mSource === newLiveData) {
@@ -59,6 +61,7 @@ inline fun <X, Y> LiveData<X>.switchMapNotNull(
     this, object : Observer<X> {
     var mSource: LiveData<Y>? = null
 
+    @SuppressLint("NullSafeMutableLiveData")
     override fun onChanged(x: X?) {
       val newLiveData = if (x == null) null else func(x)
       if (mSource === newLiveData) {
-- 
GitLab