From 8b578f8c511fa2e81895f90943767099dd34f2e2 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 16 Feb 2021 17:05:16 -0300 Subject: [PATCH] handle storage backup when USB is used as target --- .../seedvault/UsbIntentReceiver.kt | 8 ++++++ .../seedvault/settings/SettingsManager.kt | 4 +++ .../seedvault/settings/SettingsViewModel.kt | 25 +++++++++++++------ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/stevesoltys/seedvault/UsbIntentReceiver.kt b/app/src/main/java/com/stevesoltys/seedvault/UsbIntentReceiver.kt index c225ac6e..a4738fdc 100644 --- a/app/src/main/java/com/stevesoltys/seedvault/UsbIntentReceiver.kt +++ b/app/src/main/java/com/stevesoltys/seedvault/UsbIntentReceiver.kt @@ -14,9 +14,11 @@ import android.os.Handler import android.os.Looper import android.provider.DocumentsContract import android.util.Log +import androidx.core.content.ContextCompat.startForegroundService import com.stevesoltys.seedvault.metadata.MetadataManager import com.stevesoltys.seedvault.settings.FlashDrive import com.stevesoltys.seedvault.settings.SettingsManager +import com.stevesoltys.seedvault.storage.StorageBackupService import com.stevesoltys.seedvault.transport.requestBackup import com.stevesoltys.seedvault.ui.storage.AUTHORITY_STORAGE import org.koin.core.context.KoinContextHandler.get @@ -54,6 +56,12 @@ class UsbIntentReceiver : UsbMonitor() { } override fun onStatusChanged(context: Context, action: String, device: UsbDevice) { + if (settingsManager.isStorageBackupEnabled()) { + // TODO is it safe to start this at the same time as app backup? + val i = Intent(context, StorageBackupService::class.java) + startForegroundService(context, i) + } + Thread { requestBackup(context) }.start() 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 0217638d..727f7d83 100644 --- a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsManager.kt +++ b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsManager.kt @@ -30,6 +30,8 @@ private const val PREF_KEY_FLASH_DRIVE_PRODUCT_ID = "flashDriveProductId" private const val PREF_KEY_BACKUP_APP_BLACKLIST = "backupAppBlacklist" +private const val PREF_KEY_BACKUP_STORAGE = "backup_storage" + class SettingsManager(private val context: Context) { private val prefs = permitDiskReads { @@ -138,6 +140,8 @@ class SettingsManager(private val context: Context) { fun isBackupEnabled(packageName: String) = !blacklistedApps.contains(packageName) + fun isStorageBackupEnabled() = prefs.getBoolean(PREF_KEY_BACKUP_STORAGE, false) + @UiThread fun onAppBackupStatusChanged(status: AppStatus) { if (status.enabled) blacklistedApps.remove(status.packageName) 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 c84a6664..57cf1af6 100644 --- a/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/stevesoltys/seedvault/settings/SettingsViewModel.kt @@ -126,6 +126,13 @@ internal class SettingsViewModel( networkCallback.registered = true } + if (settingsManager.isStorageBackupEnabled()) { + // disable storage backup if new storage is on USB + if (storage.isUsb) disableStorageBackup() + // enable it, just in case the previous storage was on USB + else enableStorageBackup() + } + viewModelScope.launch(Dispatchers.IO) { val canDo = settingsManager.canDoBackupNow() mBackupPossible.postValue(canDo) @@ -192,14 +199,16 @@ internal class SettingsViewModel( return keyManager.hasMainKey() } - fun enableStorageBackup() = BackupJobService.scheduleJob( - context = app, - jobServiceClass = StorageBackupJobService::class.java, - periodMillis = HOURS.toMillis(24), - networkType = NETWORK_TYPE_UNMETERED, - deviceIdle = false, - charging = true - ) + fun enableStorageBackup() { + if (settingsManager.getStorage()?.isUsb == false) BackupJobService.scheduleJob( + context = app, + jobServiceClass = StorageBackupJobService::class.java, + periodMillis = HOURS.toMillis(24), + networkType = NETWORK_TYPE_UNMETERED, + deviceIdle = false, + charging = true + ) + } fun disableStorageBackup() { BackupJobService.cancelJob(app)