Fix nullability issues that AOSP is complaining about now
diff --git a/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreFilesFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreFilesFragment.kt
index 531ce03..861598b 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreFilesFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreFilesFragment.kt
@@ -24,14 +24,14 @@
     ): View {
         val v = super.onCreateView(inflater, container, savedInstanceState)
 
-        val topStub: ViewStub = v.findViewById(R.id.topStub)
+        val topStub: ViewStub = v.requireViewById(R.id.topStub)
         topStub.layoutResource = R.layout.header_snapshots
         topStub.inflate()
 
-        val bottomStub: ViewStub = v.findViewById(R.id.bottomStub)
+        val bottomStub: ViewStub = v.requireViewById(R.id.bottomStub)
         bottomStub.layoutResource = R.layout.footer_snapshots
         val footer = bottomStub.inflate()
-        val skipView: TextView = footer.findViewById(R.id.skipView)
+        val skipView: TextView = footer.requireViewById(R.id.skipView)
         skipView.setOnClickListener {
             requireActivity().apply {
                 setResult(RESULT_OK)
@@ -54,7 +54,7 @@
     ): View {
         val v: View = inflater.inflate(R.layout.fragment_restore_files_started, container, false)
 
-        val button: Button = v.findViewById(R.id.button)
+        val button: Button = v.requireViewById(R.id.button)
         button.setOnClickListener {
             requireActivity().apply {
                 setResult(RESULT_OK)
diff --git a/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreProgressFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreProgressFragment.kt
index 17bf9fc..472776d 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreProgressFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreProgressFragment.kt
@@ -37,11 +37,11 @@
     ): View {
         val v: View = inflater.inflate(R.layout.fragment_restore_progress, container, false)
 
-        progressBar = v.findViewById(R.id.progressBar)
-        titleView = v.findViewById(R.id.titleView)
-        backupNameView = v.findViewById(R.id.backupNameView)
-        appList = v.findViewById(R.id.appList)
-        button = v.findViewById(R.id.button)
+        progressBar = v.requireViewById(R.id.progressBar)
+        titleView = v.requireViewById(R.id.titleView)
+        backupNameView = v.requireViewById(R.id.backupNameView)
+        appList = v.requireViewById(R.id.appList)
+        button = v.requireViewById(R.id.button)
 
         return v
     }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreSetAdapter.kt b/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreSetAdapter.kt
index f7e7cbb..f55ccbe 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreSetAdapter.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreSetAdapter.kt
@@ -31,8 +31,8 @@
 
     inner class RestoreSetViewHolder(private val v: View) : ViewHolder(v) {
 
-        private val titleView = v.findViewById<TextView>(R.id.titleView)
-        private val subtitleView = v.findViewById<TextView>(R.id.subtitleView)
+        private val titleView = v.requireViewById<TextView>(R.id.titleView)
+        private val subtitleView = v.requireViewById<TextView>(R.id.subtitleView)
 
         internal fun bind(item: RestorableBackup) {
             v.setOnClickListener { listener.onRestorableBackupClicked(item) }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreSetFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreSetFragment.kt
index 6959565..14c248a 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreSetFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/restore/RestoreSetFragment.kt
@@ -30,10 +30,10 @@
     ): View {
         val v: View = inflater.inflate(R.layout.fragment_restore_set, container, false)
 
-        listView = v.findViewById(R.id.listView)
-        progressBar = v.findViewById(R.id.progressBar)
-        errorView = v.findViewById(R.id.errorView)
-        skipView = v.findViewById(R.id.skipView)
+        listView = v.requireViewById(R.id.listView)
+        progressBar = v.requireViewById(R.id.progressBar)
+        errorView = v.requireViewById(R.id.errorView)
+        skipView = v.requireViewById(R.id.skipView)
 
         return v
     }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/restore/install/ApkRestore.kt b/app/src/main/java/com/stevesoltys/seedvault/restore/install/ApkRestore.kt
index c469f00..a553ce8 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/restore/install/ApkRestore.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/restore/install/ApkRestore.kt
@@ -129,13 +129,13 @@
         }
 
         // get app icon and label (name)
-        val appInfo = packageInfo.applicationInfo.apply {
+        val appInfo = packageInfo.applicationInfo?.apply {
             // set APK paths before, so package manager can find it for icon extraction
             sourceDir = cachedApk.absolutePath
             publicSourceDir = cachedApk.absolutePath
         }
-        val icon = appInfo.loadIcon(pm)
-        val name = pm.getApplicationLabel(appInfo)
+        val icon = appInfo?.loadIcon(pm)
+        val name = appInfo?.let { pm.getApplicationLabel(it) }
 
         installResult.update(packageName) { result ->
             result.copy(state = IN_PROGRESS, name = name, icon = icon)
diff --git a/app/src/main/java/com/stevesoltys/seedvault/restore/install/InstallProgressFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/restore/install/InstallProgressFragment.kt
index 62948cb..df46838 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/restore/install/InstallProgressFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/restore/install/InstallProgressFragment.kt
@@ -41,11 +41,11 @@
     ): View {
         val v: View = inflater.inflate(R.layout.fragment_restore_progress, container, false)
 
-        progressBar = v.findViewById(R.id.progressBar)
-        titleView = v.findViewById(R.id.titleView)
-        backupNameView = v.findViewById(R.id.backupNameView)
-        appList = v.findViewById(R.id.appList)
-        button = v.findViewById(R.id.button)
+        progressBar = v.requireViewById(R.id.progressBar)
+        titleView = v.requireViewById(R.id.titleView)
+        backupNameView = v.requireViewById(R.id.backupNameView)
+        appList = v.requireViewById(R.id.appList)
+        button = v.requireViewById(R.id.button)
 
         return v
     }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/settings/AboutDialogFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/settings/AboutDialogFragment.kt
index 81738a2..ea56692 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/settings/AboutDialogFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/settings/AboutDialogFragment.kt
@@ -27,12 +27,12 @@
         val v: View = inflater.inflate(R.layout.fragment_about, container, false)
 
         val versionName = packageService.getVersionName(requireContext().packageName) ?: "???"
-        val versionView: TextView = v.findViewById(R.id.versionView)
+        val versionView: TextView = v.requireViewById(R.id.versionView)
         versionView.text = getString(R.string.about_version, versionName)
 
         val linkMovementMethod = LinkMovementMethod.getInstance()
-        val contributorsView = v.findViewById<TextView>(R.id.contributorView)
-        val orgsView = v.findViewById<TextView>(R.id.about_contributing_organizations_content)
+        val contributorsView = v.requireViewById<TextView>(R.id.contributorView)
+        val orgsView = v.requireViewById<TextView>(R.id.about_contributing_organizations_content)
         contributorsView.movementMethod = linkMovementMethod
         orgsView.movementMethod = linkMovementMethod
 
diff --git a/app/src/main/java/com/stevesoltys/seedvault/settings/AppStatusFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/settings/AppStatusFragment.kt
index 85c1898..bb678e8 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/settings/AppStatusFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/settings/AppStatusFragment.kt
@@ -39,8 +39,8 @@
         setHasOptionsMenu(true)
         val v: View = inflater.inflate(R.layout.fragment_app_status, container, false)
 
-        progressBar = v.findViewById(R.id.progressBar)
-        list = v.findViewById(R.id.list)
+        progressBar = v.requireViewById(R.id.progressBar)
+        list = v.requireViewById(R.id.list)
 
         return v
     }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsActivity.kt b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsActivity.kt
index 68194e2..11fc6b5 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsActivity.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsActivity.kt
@@ -61,7 +61,7 @@
         pref: Preference,
     ): Boolean {
         val fragment =
-            supportFragmentManager.fragmentFactory.instantiate(classLoader, pref.fragment)
+            supportFragmentManager.fragmentFactory.instantiate(classLoader, pref.fragment!!)
         if (pref.key == PREF_BACKUP_RECOVERY_CODE) fragment.arguments = Bundle().apply {
             putBoolean(ARG_FOR_NEW_CODE, false)
         }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsFragment.kt
index 38aaf80..8115c53 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsFragment.kt
@@ -259,10 +259,14 @@
                 // warn if battery optimization is active
                 // we don't bother with yet another dialog, because the ROM should handle it
                 val context = requireContext()
-                val powerManager = context.getSystemService(PowerManager::class.java)
-                if (!powerManager.isIgnoringBatteryOptimizations(context.packageName)) {
-                    Toast.makeText(context, R.string.settings_backup_storage_battery_optimization,
-                        LENGTH_LONG).show()
+                val powerManager: PowerManager? = context.getSystemService(PowerManager::class.java)
+                if (powerManager != null &&
+                    !powerManager.isIgnoringBatteryOptimizations(context.packageName)
+                ) {
+                    Toast.makeText(
+                        context, R.string.settings_backup_storage_battery_optimization,
+                        LENGTH_LONG
+                    ).show()
                 }
                 viewModel.enableStorageBackup()
                 backupStorage.isChecked = true
diff --git a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsManager.kt b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsManager.kt
index b7ab7c6..47176a0 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsManager.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsManager.kt
@@ -191,7 +191,7 @@
     }
 
     private fun hasUnmeteredInternet(context: Context): Boolean {
-        val cm = context.getSystemService(ConnectivityManager::class.java)
+        val cm = context.getSystemService(ConnectivityManager::class.java) ?: return false
         val isMetered = cm.isActiveNetworkMetered
         val capabilities = cm.getNetworkCapabilities(cm.activeNetwork) ?: return false
         return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && !isMetered
diff --git a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsViewModel.kt b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsViewModel.kt
index cf1b338..f56faa2 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsViewModel.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsViewModel.kt
@@ -60,7 +60,8 @@
 ) : RequireProvisioningViewModel(app, settingsManager, keyManager) {
 
     private val contentResolver = app.contentResolver
-    private val connectivityManager = app.getSystemService(ConnectivityManager::class.java)
+    private val connectivityManager: ConnectivityManager? =
+        app.getSystemService(ConnectivityManager::class.java)
 
     override val isRestoreOperation = false
 
@@ -129,13 +130,13 @@
 
         // register network observer if needed
         if (networkCallback.registered && !storage.requiresNetwork) {
-            connectivityManager.unregisterNetworkCallback(networkCallback)
+            connectivityManager?.unregisterNetworkCallback(networkCallback)
             networkCallback.registered = false
         } else if (!networkCallback.registered && storage.requiresNetwork) {
             val request = NetworkRequest.Builder()
                 .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                 .build()
-            connectivityManager.registerNetworkCallback(request, networkCallback)
+            connectivityManager?.registerNetworkCallback(request, networkCallback)
             networkCallback.registered = true
         }
 
@@ -156,7 +157,7 @@
     override fun onCleared() {
         contentResolver.unregisterContentObserver(storageObserver)
         if (networkCallback.registered) {
-            connectivityManager.unregisterNetworkCallback(networkCallback)
+            connectivityManager?.unregisterNetworkCallback(networkCallback)
             networkCallback.registered = false
         }
     }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/transport/backup/ApkBackup.kt b/app/src/main/java/com/stevesoltys/seedvault/transport/backup/ApkBackup.kt
index b248b8d..c55eb8d 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/transport/backup/ApkBackup.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/transport/backup/ApkBackup.kt
@@ -74,13 +74,14 @@
         }
 
         // TODO remove when adding support for packages with multiple signers
-        if (packageInfo.signingInfo.hasMultipleSigners()) {
+        val signingInfo = packageInfo.signingInfo ?: return null
+        if (signingInfo.hasMultipleSigners()) {
             Log.e(TAG, "Package $packageName has multiple signers. Not backing it up.")
             return null
         }
 
         // get signatures
-        val signatures = packageInfo.signingInfo.getSignatures()
+        val signatures = signingInfo.getSignatures()
         if (signatures.isEmpty()) {
             Log.e(TAG, "Package $packageName has no signatures. Not backing it up.")
             return null
@@ -107,7 +108,8 @@
         }
 
         // get an InputStream for the APK
-        val inputStream = getApkInputStream(packageInfo.applicationInfo.sourceDir)
+        val sourceDir = packageInfo.applicationInfo?.sourceDir ?: return null
+        val inputStream = getApkInputStream(sourceDir)
         // copy the APK to the storage's output and calculate SHA-256 hash while at it
         val name = crypto.getNameForApk(metadataManager.salt, packageName)
         val sha256 = copyStreamsAndGetHash(inputStream, streamGetter(name))
@@ -158,7 +160,7 @@
     ): List<ApkSplit> {
         check(packageInfo.splitNames != null)
         // attention: though not documented, splitSourceDirs can be null
-        val splitSourceDirs = packageInfo.applicationInfo.splitSourceDirs ?: emptyArray()
+        val splitSourceDirs = packageInfo.applicationInfo?.splitSourceDirs ?: emptyArray()
         check(packageInfo.splitNames.size == splitSourceDirs.size) {
             "Size Mismatch! ${packageInfo.splitNames.size} != ${splitSourceDirs.size} " +
                 "splitNames is ${packageInfo.splitNames.toList()}, " +
@@ -238,8 +240,10 @@
 /**
  * Returns a list of Base64 encoded SHA-256 signature hashes.
  */
-fun SigningInfo.getSignatures(): List<String> {
-    return if (hasMultipleSigners()) {
+fun SigningInfo?.getSignatures(): List<String> {
+    return if (this == null) {
+        emptyList()
+    } else if (hasMultipleSigners()) {
         apkContentsSigners.map { signature ->
             hashSignature(signature).encodeBase64()
         }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/transport/backup/PackageService.kt b/app/src/main/java/com/stevesoltys/seedvault/transport/backup/PackageService.kt
index 7a59437..58afe8d 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/transport/backup/PackageService.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/transport/backup/PackageService.kt
@@ -174,7 +174,8 @@
     }
 
     private fun PackageInfo.allowsBackup(): Boolean {
-        if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false
+        val appInfo = applicationInfo
+        if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return false
 
         return if (settingsManager.d2dBackupsEnabled()) {
             /**
@@ -191,7 +192,7 @@
              */
             true
         } else {
-            applicationInfo.flags and FLAG_ALLOW_BACKUP != 0
+            appInfo.flags and FLAG_ALLOW_BACKUP != 0
         }
     }
 
@@ -226,8 +227,9 @@
 }
 
 internal fun PackageInfo.isSystemApp(): Boolean {
-    if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return true
-    return applicationInfo.flags and FLAG_SYSTEM != 0
+    val appInfo = applicationInfo
+    if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return true
+    return appInfo.flags and FLAG_SYSTEM != 0
 }
 
 /**
@@ -235,18 +237,21 @@
  * We don't back up those APKs.
  */
 internal fun PackageInfo.isNotUpdatedSystemApp(): Boolean {
-    if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return true
-    val isSystemApp = applicationInfo.flags and FLAG_SYSTEM != 0
-    val isUpdatedSystemApp = applicationInfo.flags and FLAG_UPDATED_SYSTEM_APP != 0
+    val appInfo = applicationInfo
+    if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return true
+    val isSystemApp = appInfo.flags and FLAG_SYSTEM != 0
+    val isUpdatedSystemApp = appInfo.flags and FLAG_UPDATED_SYSTEM_APP != 0
     return isSystemApp && !isUpdatedSystemApp
 }
 
 internal fun PackageInfo.isStopped(): Boolean {
-    if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false
-    return applicationInfo.flags and FLAG_STOPPED != 0
+    val appInfo = applicationInfo
+    if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return false
+    return appInfo.flags and FLAG_STOPPED != 0
 }
 
 internal fun PackageInfo.isTestOnly(): Boolean {
-    if (packageName == MAGIC_PACKAGE_MANAGER || applicationInfo == null) return false
-    return applicationInfo.flags and FLAG_TEST_ONLY != 0
+    val appInfo = applicationInfo
+    if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return false
+    return appInfo.flags and FLAG_TEST_ONLY != 0
 }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/AppViewHolder.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/AppViewHolder.kt
index 37686fc..8a3cd45 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/ui/AppViewHolder.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/ui/AppViewHolder.kt
@@ -8,9 +8,9 @@
 import android.view.View.VISIBLE
 import android.widget.ImageView
 import android.widget.ProgressBar
-import android.widget.Switch
 import android.widget.TextView
 import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.switchmaterial.SwitchMaterial
 import com.stevesoltys.seedvault.R
 import com.stevesoltys.seedvault.ui.AppBackupState.FAILED
 import com.stevesoltys.seedvault.ui.AppBackupState.IN_PROGRESS
@@ -22,12 +22,12 @@
     protected val pm: PackageManager = context.packageManager
 
     protected val clickableBackground = v.background!!
-    protected val appIcon: ImageView = v.findViewById(R.id.appIcon)
-    protected val appName: TextView = v.findViewById(R.id.appName)
-    protected val appInfo: TextView = v.findViewById(R.id.appInfo)
-    protected val appStatus: ImageView = v.findViewById(R.id.appStatus)
-    protected val progressBar: ProgressBar = v.findViewById(R.id.progressBar)
-    protected val switchView: Switch = v.findViewById(R.id.switchView)
+    protected val appIcon: ImageView = v.requireViewById(R.id.appIcon)
+    protected val appName: TextView = v.requireViewById(R.id.appName)
+    protected val appInfo: TextView = v.requireViewById(R.id.appInfo)
+    protected val appStatus: ImageView = v.requireViewById(R.id.appStatus)
+    protected val progressBar: ProgressBar = v.requireViewById(R.id.progressBar)
+    protected val switchView: SwitchMaterial = v.requireViewById(R.id.switchView)
 
     init {
         // don't use clickable background by default
diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeAdapter.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeAdapter.kt
index 1003300..5d35a5c 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeAdapter.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeAdapter.kt
@@ -27,8 +27,8 @@
 
 class RecoveryCodeViewHolder(v: View) : RecyclerView.ViewHolder(v) {
 
-    private val num = v.findViewById<TextView>(R.id.num)
-    private val word = v.findViewById<TextView>(R.id.word)
+    private val num = v.requireViewById<TextView>(R.id.num)
+    private val word = v.requireViewById<TextView>(R.id.word)
 
     internal fun bind(number: Int, item: CharArray) {
         num.text = number.toString()
diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeInputFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeInputFragment.kt
index 76ee2d6..4853aaa 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeInputFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeInputFragment.kt
@@ -71,24 +71,24 @@
     ): View {
         val v: View = inflater.inflate(R.layout.fragment_recovery_code_input, container, false)
 
-        if (!isDebugBuild()) getActivity()?.window?.addFlags(FLAG_SECURE)
+        if (!isDebugBuild()) activity?.window?.addFlags(FLAG_SECURE)
 
-        introText = v.findViewById(R.id.introText)
-        doneButton = v.findViewById(R.id.doneButton)
-        newCodeButton = v.findViewById(R.id.newCodeButton)
-        wordLayout1 = v.findViewById(R.id.wordLayout1)
-        wordLayout2 = v.findViewById(R.id.wordLayout2)
-        wordLayout3 = v.findViewById(R.id.wordLayout3)
-        wordLayout4 = v.findViewById(R.id.wordLayout4)
-        wordLayout5 = v.findViewById(R.id.wordLayout5)
-        wordLayout6 = v.findViewById(R.id.wordLayout6)
-        wordLayout7 = v.findViewById(R.id.wordLayout7)
-        wordLayout8 = v.findViewById(R.id.wordLayout8)
-        wordLayout9 = v.findViewById(R.id.wordLayout9)
-        wordLayout10 = v.findViewById(R.id.wordLayout10)
-        wordLayout11 = v.findViewById(R.id.wordLayout11)
-        wordLayout12 = v.findViewById(R.id.wordLayout12)
-        wordList = v.findViewById(R.id.wordList)
+        introText = v.requireViewById(R.id.introText)
+        doneButton = v.requireViewById(R.id.doneButton)
+        newCodeButton = v.requireViewById(R.id.newCodeButton)
+        wordLayout1 = v.requireViewById(R.id.wordLayout1)
+        wordLayout2 = v.requireViewById(R.id.wordLayout2)
+        wordLayout3 = v.requireViewById(R.id.wordLayout3)
+        wordLayout4 = v.requireViewById(R.id.wordLayout4)
+        wordLayout5 = v.requireViewById(R.id.wordLayout5)
+        wordLayout6 = v.requireViewById(R.id.wordLayout6)
+        wordLayout7 = v.requireViewById(R.id.wordLayout7)
+        wordLayout8 = v.requireViewById(R.id.wordLayout8)
+        wordLayout9 = v.requireViewById(R.id.wordLayout9)
+        wordLayout10 = v.requireViewById(R.id.wordLayout10)
+        wordLayout11 = v.requireViewById(R.id.wordLayout11)
+        wordLayout12 = v.requireViewById(R.id.wordLayout12)
+        wordList = v.requireViewById(R.id.wordList)
 
         arguments?.getBoolean(ARG_FOR_NEW_CODE, true)?.let {
             forStoringNewCode = it
@@ -148,7 +148,7 @@
         }
         if (forStoringNewCode) {
             val keyguardManager = requireContext().getSystemService(KeyguardManager::class.java)
-            if (keyguardManager.isDeviceSecure) {
+            if (keyguardManager?.isDeviceSecure == true) {
                 // if we have a lock-screen secret, we can ask for it before storing the code
                 storeNewCodeAfterAuth(input)
             } else {
diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeOutputFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeOutputFragment.kt
index 012ce09..ca585e3 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeOutputFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/ui/recoverycode/RecoveryCodeOutputFragment.kt
@@ -28,10 +28,10 @@
     ): View {
         val v: View = inflater.inflate(R.layout.fragment_recovery_code_output, container, false)
 
-        if (!isDebugBuild()) getActivity()?.window?.addFlags(FLAG_SECURE)
+        if (!isDebugBuild()) activity?.window?.addFlags(FLAG_SECURE)
 
-        wordList = v.findViewById(R.id.wordList)
-        confirmCodeButton = v.findViewById(R.id.confirmCodeButton)
+        wordList = v.requireViewById(R.id.wordList)
+        confirmCodeButton = v.requireViewById(R.id.confirmCodeButton)
 
         return v
     }
diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageCheckFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageCheckFragment.kt
index fe45f4c..b1df24e 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageCheckFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageCheckFragment.kt
@@ -41,10 +41,10 @@
     ): View {
         val v: View = inflater.inflate(R.layout.fragment_storage_check, container, false)
 
-        titleView = v.findViewById(R.id.titleView)
-        progressBar = v.findViewById(R.id.progressBar)
-        errorView = v.findViewById(R.id.errorView)
-        backButton = v.findViewById(R.id.backButton)
+        titleView = v.requireViewById(R.id.titleView)
+        progressBar = v.requireViewById(R.id.progressBar)
+        errorView = v.requireViewById(R.id.errorView)
+        backButton = v.requireViewById(R.id.backButton)
 
         return v
     }
@@ -56,7 +56,7 @@
 
         val errorMsg = requireArguments().getString(ERROR_MSG)
         if (errorMsg != null) {
-            view.findViewById<View>(R.id.patienceView).visibility = GONE
+            view.requireViewById<View>(R.id.patienceView).visibility = GONE
             progressBar.visibility = INVISIBLE
             errorView.text = errorMsg
             errorView.visibility = VISIBLE
diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageOptionAdapter.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageOptionAdapter.kt
index ff4c448..ab2a906 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageOptionAdapter.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageOptionAdapter.kt
@@ -45,9 +45,9 @@
 
     internal inner class StorageOptionViewHolder(private val v: View) : ViewHolder(v) {
 
-        private val iconView = v.findViewById<ImageView>(R.id.iconView)
-        private val titleView = v.findViewById<TextView>(R.id.titleView)
-        private val summaryView = v.findViewById<TextView>(R.id.summaryView)
+        private val iconView = v.requireViewById<ImageView>(R.id.iconView)
+        private val titleView = v.requireViewById<TextView>(R.id.titleView)
+        private val summaryView = v.requireViewById<TextView>(R.id.summaryView)
 
         internal fun bind(item: StorageOption) {
             if (item.enabled) {
diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageOptionsFragment.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageOptionsFragment.kt
index fc84248..12c6526 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageOptionsFragment.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageOptionsFragment.kt
@@ -57,12 +57,12 @@
     ): View {
         val v: View = inflater.inflate(R.layout.fragment_storage_root, container, false)
 
-        titleView = v.findViewById(R.id.titleView)
-        warningIcon = v.findViewById(R.id.warningIcon)
-        warningText = v.findViewById(R.id.warningText)
-        listView = v.findViewById(R.id.listView)
-        progressBar = v.findViewById(R.id.progressBar)
-        skipView = v.findViewById(R.id.skipView)
+        titleView = v.requireViewById(R.id.titleView)
+        warningIcon = v.requireViewById(R.id.warningIcon)
+        warningText = v.requireViewById(R.id.warningText)
+        listView = v.requireViewById(R.id.listView)
+        progressBar = v.requireViewById(R.id.progressBar)
+        skipView = v.requireViewById(R.id.skipView)
 
         return v
     }
diff --git a/app/src/main/res/layout/list_item_app_status.xml b/app/src/main/res/layout/list_item_app_status.xml
index 5d630c7..b556a19 100644
--- a/app/src/main/res/layout/list_item_app_status.xml
+++ b/app/src/main/res/layout/list_item_app_status.xml
@@ -68,7 +68,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
-    <Switch
+    <com.google.android.material.switchmaterial.SwitchMaterial
         android:id="@+id/switchView"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"