From fcd8afe0728dd71d397015632a329278557788e7 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Tue, 9 Feb 2021 15:37:05 -0300
Subject: [PATCH] Don't crash when storage app gets uninstalled

---
 .../seedvault/settings/SettingsViewModel.kt          | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

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 aadf7127..10a45232 100644
--- a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsViewModel.kt
+++ b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsViewModel.kt
@@ -8,6 +8,7 @@ import android.net.NetworkCapabilities
 import android.net.NetworkRequest
 import android.net.Uri
 import android.provider.Settings
+import android.util.Log
 import android.widget.Toast
 import android.widget.Toast.LENGTH_LONG
 import androidx.annotation.UiThread
@@ -27,6 +28,7 @@ import com.stevesoltys.seedvault.ui.notification.BackupNotificationManager
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 
+private const val TAG = "SettingsViewModel"
 private const val USER_FULL_DATA_BACKUP_AWARE = "user_full_data_backup_aware"
 
 internal class SettingsViewModel(
@@ -93,8 +95,14 @@ internal class SettingsViewModel(
         val storage = settingsManager.getStorage() ?: return
 
         // register storage observer
-        contentResolver.unregisterContentObserver(storageObserver)
-        contentResolver.registerContentObserver(storage.uri, false, storageObserver)
+        try {
+            contentResolver.unregisterContentObserver(storageObserver)
+            contentResolver.registerContentObserver(storage.uri, false, storageObserver)
+        } catch (e: SecurityException) {
+            // This can happen if the app providing the storage was uninstalled.
+            // validLocationIsSet() gets called elsewhere and prompts for a new storage location.
+            Log.e(TAG, "Error registering content observer for ${storage.uri}", e)
+        }
 
         // register network observer if needed
         if (networkCallback.registered && !storage.requiresNetwork) {