From 53a1568d9db51f8e5db4d6ab2fccebe82b120fab Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 18 Sep 2020 14:35:14 -0500 Subject: [PATCH] Fix backup warning issues * Cache last Drive backup timestamp for offline use * Fix updating backup error indicator --- .../main/java/org/tasks/drive/DriveInvoker.kt | 4 ++-- .../main/java/org/tasks/jobs/DriveUploader.kt | 7 +++++++ .../org/tasks/preferences/IconPreference.kt | 17 ++++++++++++----- .../tasks/preferences/PreferencesViewModel.kt | 11 ++++++----- .../org/tasks/preferences/fragments/Backups.kt | 3 ++- app/src/main/res/values/keys.xml | 1 + 6 files changed, 30 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/tasks/drive/DriveInvoker.kt b/app/src/main/java/org/tasks/drive/DriveInvoker.kt index e3b1420b0..fab709094 100644 --- a/app/src/main/java/org/tasks/drive/DriveInvoker.kt +++ b/app/src/main/java/org/tasks/drive/DriveInvoker.kt @@ -73,14 +73,14 @@ class DriveInvoker @Inject constructor( } @Throws(IOException::class) - suspend fun createFile(folderId: String, uri: Uri?) { + suspend fun createFile(folderId: String, uri: Uri?): File? { val mime = FileHelper.getMimeType(context, uri!!) val metadata = File() .setParents(listOf(folderId)) .setMimeType(mime) .setName(FileHelper.getFilename(context, uri)) val content = InputStreamContent(mime, context.contentResolver.openInputStream(uri!!)) - execute(service.files().create(metadata, content)) + return execute(service.files().create(metadata, content)) } @Synchronized diff --git a/app/src/main/java/org/tasks/jobs/DriveUploader.kt b/app/src/main/java/org/tasks/jobs/DriveUploader.kt index 229e771e3..a95f05952 100644 --- a/app/src/main/java/org/tasks/jobs/DriveUploader.kt +++ b/app/src/main/java/org/tasks/jobs/DriveUploader.kt @@ -8,6 +8,7 @@ import androidx.work.Data import androidx.work.WorkerParameters import com.google.api.client.googleapis.json.GoogleJsonResponseException import com.google.api.services.drive.model.File +import com.todoroo.astrid.backup.BackupConstants import org.tasks.LocalBroadcastManager import org.tasks.R import org.tasks.Strings.isNullOrEmpty @@ -38,6 +39,12 @@ class DriveUploader @WorkerInject constructor( val folder = getFolder() ?: return Result.failure() preferences.setString(R.string.p_google_drive_backup_folder, folder.id) drive.createFile(folder.id, uri) + ?.let { + preferences.setLong( + R.string.p_backups_drive_last, + BackupConstants.getTimestamp(it) + ) + } localBroadcastManager.broadcastPreferenceRefresh() if (inputData.getBoolean(EXTRA_PURGE, false)) { drive diff --git a/app/src/main/java/org/tasks/preferences/IconPreference.kt b/app/src/main/java/org/tasks/preferences/IconPreference.kt index a165b640e..5dbfd7452 100644 --- a/app/src/main/java/org/tasks/preferences/IconPreference.kt +++ b/app/src/main/java/org/tasks/preferences/IconPreference.kt @@ -10,16 +10,23 @@ import org.tasks.R class IconPreference(context: Context?, attrs: AttributeSet?) : Preference(context, attrs) { - var iconVisible = false + private var imageView: ImageView? = null override fun onBindViewHolder(holder: PreferenceViewHolder?) { super.onBindViewHolder(holder) - (holder?.findViewById(R.id.preference_icon) as ImageView?)?.visibility = if (iconVisible) { - View.VISIBLE - } else { - View.GONE + imageView = holder?.findViewById(R.id.preference_icon) as ImageView? + updateVisibility() + } + + var iconVisible: Boolean = false + set(value) { + field = value + updateVisibility() } + + private fun updateVisibility() { + imageView?.visibility = if (iconVisible) View.VISIBLE else View.GONE } init { diff --git a/app/src/main/java/org/tasks/preferences/PreferencesViewModel.kt b/app/src/main/java/org/tasks/preferences/PreferencesViewModel.kt index e38b02266..3512aae94 100644 --- a/app/src/main/java/org/tasks/preferences/PreferencesViewModel.kt +++ b/app/src/main/java/org/tasks/preferences/PreferencesViewModel.kt @@ -7,7 +7,6 @@ import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.google.api.client.googleapis.json.GoogleJsonResponseException import com.google.api.services.drive.DriveScopes import com.todoroo.astrid.backup.BackupConstants import dagger.hilt.android.qualifiers.ApplicationContext @@ -62,18 +61,20 @@ class PreferencesViewModel @ViewModelInject constructor( lastDriveBackup.value = -1L return@launch } - val files = preferences.getStringValue(R.string.p_google_drive_backup_folder) + lastDriveBackup.value = preferences + .getStringValue(R.string.p_google_drive_backup_folder) ?.takeIf { it.isNotBlank() } ?.let { try { driveInvoker.getFilesByPrefix(it, "auto.", "user.") - } catch (e: GoogleJsonResponseException) { + .firstOrNull() + ?.let(BackupConstants::getTimestamp) + } catch (e: Exception) { Timber.e(e) null } } - ?: emptyList() - lastDriveBackup.value = files.firstOrNull()?.let { BackupConstants.getTimestamp(it) } ?: -1 + ?: preferences.getLong(R.string.p_backups_drive_last, -1L) } fun updateLocalBackup() = viewModelScope.launch { diff --git a/app/src/main/java/org/tasks/preferences/fragments/Backups.kt b/app/src/main/java/org/tasks/preferences/fragments/Backups.kt index bdab173f0..b95f382cd 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/Backups.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/Backups.kt @@ -232,7 +232,8 @@ class Backups : InjectingPreferenceFragment() { else -> { preference.summary = null preference.icon = null - preferences.setString(R.string.p_google_drive_backup_account, null) + preferences.remove(R.string.p_backups_drive_last) + preferences.remove(R.string.p_google_drive_backup_account) updateDriveAccount() viewModel.updateDriveBackup() true diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 5ddd7bd2c..0d27e7843 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -377,6 +377,7 @@ backups_ignore_warnings backups_android_backup_enabled backups_android_backup_last + backups_drive_last cv whats_new