From 280685324e2eb0b4e8885c3075fed7b2ee08e044 Mon Sep 17 00:00:00 2001 From: t-m-w <7275539+t-m-w@users.noreply.github.com> Date: Mon, 28 Nov 2022 00:08:14 -0500 Subject: [PATCH] [UNTESTED] Support a lack of MANAGE_DOCUMENTS permission When `android.permission.MANAGE_DOCUMENTS` is not granted, Seedvault prompts to select a storage location. Do not insist on resolving the storage's actual root, as it will likely (or perhaps always) fail. Use a fake storage root as is done for USB and app-based options. Known issues: * Selected location is assumed not to be USB and not to require network access in its storage options. Change-Id: I357b4c68673d71c087be41e9c94c2841c1d6658e --- .../seedvault/ui/storage/StorageActivity.kt | 4 +++- .../seedvault/ui/storage/StorageRootResolver.kt | 16 ++++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageActivity.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageActivity.kt index b2cd0326..198d0f50 100644 --- a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageActivity.kt +++ b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageActivity.kt @@ -35,7 +35,9 @@ class StorageActivity : BackupActivity() { val authority = uri.authority ?: throw AssertionError("No authority in $uri") val storageRoot = StorageRootResolver.getStorageRoots(this, authority).getOrNull(0) if (storageRoot == null) { - viewModel.onUriPermissionResultReceived(null) + viewModel.onSafOptionChosen( + StorageRootResolver.getFakeStorageRootForUri(this, uri)) + viewModel.onUriPermissionResultReceived(uri) } else { viewModel.onSafOptionChosen(storageRoot) viewModel.onUriPermissionResultReceived(uri) diff --git a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageRootResolver.kt b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageRootResolver.kt index 4d615e6a..57cfdf6a 100644 --- a/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageRootResolver.kt +++ b/app/src/main/java/com/stevesoltys/seedvault/ui/storage/StorageRootResolver.kt @@ -3,6 +3,7 @@ package com.stevesoltys.seedvault.ui.storage import android.content.Context import android.database.Cursor import android.graphics.drawable.Drawable +import android.net.Uri import android.os.UserHandle import android.provider.DocumentsContract import android.provider.DocumentsContract.Root.COLUMN_AVAILABLE_BYTES @@ -57,6 +58,21 @@ internal object StorageRootResolver { return roots } + fun getFakeStorageRootForUri(context: Context, uri: Uri): SafOption { + return SafOption( + authority = AUTHORITY_STORAGE, + rootId = "fake", + documentId = "fake", + // TODO: Use something other than the USB icon? + icon = getIcon(context, AUTHORITY_STORAGE, "usb", 0), + title = context.getString(R.string.storage_user_selected_location_title), + summary = context.getString(R.string.storage_user_selected_location_summary), + availableBytes = null, + isUsb = false, // TODO: Check this if possible instead of forcing false + requiresNetwork = false, // TODO: Check this if possible instead of forcing false + ) + } + private fun getStorageRoot(context: Context, authority: String, cursor: Cursor): SafOption? { val flags = cursor.getInt(COLUMN_FLAGS) val supportsCreate = flags and FLAG_SUPPORTS_CREATE != 0 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b4976db9..77323f6c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,6 +55,8 @@ Where to find your backups? People with access to your storage location can learn which apps you use, but do not get access to the apps\' data. Existing backups in this location will be deleted. + User-chosen location + Chosen using the folder browser USB flash drive Needs to be plugged in %1$s free