Check availability of storage on IO thread

This commit is contained in:
Torsten Grote 2020-10-20 11:23:20 -03:00
parent 7401ead553
commit 0a2131e108
No known key found for this signature in database
GPG key ID: 3E5F77D92CF891FF

View file

@ -19,6 +19,7 @@ import android.view.MenuItem
import android.view.View import android.view.View
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.Preference.OnPreferenceChangeListener import androidx.preference.Preference.OnPreferenceChangeListener
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
@ -29,6 +30,9 @@ import com.stevesoltys.seedvault.isMassStorage
import com.stevesoltys.seedvault.permitDiskReads import com.stevesoltys.seedvault.permitDiskReads
import com.stevesoltys.seedvault.restore.RestoreActivity import com.stevesoltys.seedvault.restore.RestoreActivity
import com.stevesoltys.seedvault.ui.toRelativeTime import com.stevesoltys.seedvault.ui.toRelativeTime
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.sharedViewModel
@ -63,7 +67,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
} }
override fun onStatusChanged(context: Context, action: String, device: UsbDevice) { override fun onStatusChanged(context: Context, action: String, device: UsbDevice) {
setMenuItemStates() lifecycleScope.launch { setMenuItemStates() }
} }
} }
@ -145,7 +149,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
setBackupEnabledState() setBackupEnabledState()
setBackupLocationSummary() setBackupLocationSummary()
setAutoRestoreState() setAutoRestoreState()
setMenuItemStates() lifecycleScope.launch { setMenuItemStates() }
if (storage?.isUsb == true) context?.registerReceiver(usbReceiver, usbFilter) if (storage?.isUsb == true) context?.registerReceiver(usbReceiver, usbFilter)
} }
@ -163,7 +167,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
if (resources.getBoolean(R.bool.show_restore_in_settings)) { if (resources.getBoolean(R.bool.show_restore_in_settings)) {
menuRestore?.isVisible = true menuRestore?.isVisible = true
} }
setMenuItemStates() lifecycleScope.launch { setMenuItemStates() }
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
@ -218,15 +222,18 @@ class SettingsFragment : PreferenceFragmentCompat() {
backupStatus.summary = getString(R.string.settings_backup_status_summary, lastBackup) backupStatus.summary = getString(R.string.settings_backup_status_summary, lastBackup)
} }
private fun setMenuItemStates() { private suspend fun setMenuItemStates() {
val context = context ?: return
if (menuBackupNow != null && menuRestore != null) { if (menuBackupNow != null && menuRestore != null) {
val storage = this.storage val storage = this.storage
val enabled = storage != null && val enabled = storage != null && storageAvailable(storage)
(!storage.isUsb || storage.getDocumentFile(context).isDirectory)
menuBackupNow?.isEnabled = enabled menuBackupNow?.isEnabled = enabled
menuRestore?.isEnabled = enabled menuRestore?.isEnabled = enabled
} }
} }
private suspend fun storageAvailable(storage: Storage) = withContext(Dispatchers.IO) {
val context = context ?: return@withContext false
(!storage.isUsb || storage.getDocumentFile(context).isDirectory)
}
} }