diff --git a/app/src/main/java/me/zhanghai/android/files/provider/document/resolver/ExternalStorageProviderPrimaryAndroidDataHack.kt b/app/src/main/java/me/zhanghai/android/files/provider/document/resolver/ExternalStorageProviderPrimaryAndroidDataHack.kt index 9a2ee5047..5c3db9238 100644 --- a/app/src/main/java/me/zhanghai/android/files/provider/document/resolver/ExternalStorageProviderPrimaryAndroidDataHack.kt +++ b/app/src/main/java/me/zhanghai/android/files/provider/document/resolver/ExternalStorageProviderPrimaryAndroidDataHack.kt @@ -10,6 +10,7 @@ import android.database.MergeCursor import android.net.Uri import android.provider.DocumentsContract import me.zhanghai.android.files.compat.DocumentsContractCompat +import me.zhanghai.android.files.file.asDocumentTreeUri import me.zhanghai.android.files.provider.content.resolver.requireString // On Android 11, ExternalStorageProvider no longer returns Android/data and Android/obb as children diff --git a/app/src/main/java/me/zhanghai/android/files/storage/AddDocumentTreeActivity.kt b/app/src/main/java/me/zhanghai/android/files/storage/AddDocumentTreeActivity.kt index 0a7a432c2..9d5b378f7 100644 --- a/app/src/main/java/me/zhanghai/android/files/storage/AddDocumentTreeActivity.kt +++ b/app/src/main/java/me/zhanghai/android/files/storage/AddDocumentTreeActivity.kt @@ -7,19 +7,23 @@ package me.zhanghai.android.files.storage import android.os.Bundle import android.view.View -import androidx.fragment.app.add import androidx.fragment.app.commit import me.zhanghai.android.files.app.AppActivity +import me.zhanghai.android.files.util.args +import me.zhanghai.android.files.util.putArgs class AddDocumentTreeActivity : AppActivity() { + private val args by args() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Calls ensureSubDecor(). findViewById(android.R.id.content) if (savedInstanceState == null) { + val fragment = AddDocumentTreeFragment().putArgs(args) supportFragmentManager.commit { - add(AddDocumentTreeFragment::class.java.name) + add(fragment, AddDocumentTreeFragment::class.java.name) } } } diff --git a/app/src/main/java/me/zhanghai/android/files/storage/AddDocumentTreeFragment.kt b/app/src/main/java/me/zhanghai/android/files/storage/AddDocumentTreeFragment.kt index c8feb90a4..f7334485e 100644 --- a/app/src/main/java/me/zhanghai/android/files/storage/AddDocumentTreeFragment.kt +++ b/app/src/main/java/me/zhanghai/android/files/storage/AddDocumentTreeFragment.kt @@ -8,14 +8,20 @@ package me.zhanghai.android.files.storage import android.net.Uri import android.os.Bundle import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.StringRes import androidx.fragment.app.Fragment +import kotlinx.parcelize.Parcelize import me.zhanghai.android.files.file.DocumentTreeUri import me.zhanghai.android.files.file.asDocumentTreeUriOrNull import me.zhanghai.android.files.file.takePersistablePermission +import me.zhanghai.android.files.util.ParcelableArgs +import me.zhanghai.android.files.util.args import me.zhanghai.android.files.util.finish import me.zhanghai.android.files.util.launchSafe class AddDocumentTreeFragment : Fragment() { + private val args by args() + private val openDocumentTreeLauncher = registerForActivityResult( ActivityResultContracts.OpenDocumentTree(), this::onOpenDocumentTreeResult ) @@ -24,20 +30,27 @@ class AddDocumentTreeFragment : Fragment() { super.onActivityCreated(savedInstanceState) if (savedInstanceState == null) { - openDocumentTreeLauncher.launchSafe(null, this) + openDocumentTreeLauncher.launchSafe(args.treeUri?.value, this) } } private fun onOpenDocumentTreeResult(result: Uri?) { - val documentTreeUri = result?.asDocumentTreeUriOrNull() - if (documentTreeUri != null) { - addDocumentTree(documentTreeUri) + val treeUri = result?.asDocumentTreeUriOrNull() + if (treeUri != null) { + addDocumentTree(treeUri) } finish() } private fun addDocumentTree(treeUri: DocumentTreeUri) { treeUri.takePersistablePermission() - Storages.addOrReplace(DocumentTree(null, null, treeUri)) + val documentTree = DocumentTree(null, args.customNameRes?.let { getString(it) }, treeUri) + Storages.addOrReplace(documentTree) } + + @Parcelize + class Args( + @StringRes val customNameRes: Int?, + val treeUri: DocumentTreeUri? + ) : ParcelableArgs } diff --git a/app/src/main/java/me/zhanghai/android/files/storage/AddStorageDialogFragment.kt b/app/src/main/java/me/zhanghai/android/files/storage/AddStorageDialogFragment.kt index 319f1be29..bab66dcd5 100644 --- a/app/src/main/java/me/zhanghai/android/files/storage/AddStorageDialogFragment.kt +++ b/app/src/main/java/me/zhanghai/android/files/storage/AddStorageDialogFragment.kt @@ -7,10 +7,13 @@ package me.zhanghai.android.files.storage import android.app.Dialog import android.content.DialogInterface +import android.os.Build import android.os.Bundle import androidx.appcompat.app.AppCompatDialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder import me.zhanghai.android.files.R +import me.zhanghai.android.files.file.asDocumentTreeUri +import me.zhanghai.android.files.provider.document.resolver.ExternalStorageProviderHacks import me.zhanghai.android.files.util.createIntent import me.zhanghai.android.files.util.finish import me.zhanghai.android.files.util.putArgs @@ -36,7 +39,29 @@ class AddStorageDialogFragment : AppCompatDialogFragment() { } companion object { - private val STORAGE_TYPES = listOf( + private val STORAGE_TYPES = listOfNotNull( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + (R.string.storage_add_storage_android_data + to AddDocumentTreeActivity ::class.createIntent() + .putArgs( + AddDocumentTreeFragment.Args( + R.string.storage_add_storage_android_data, + ExternalStorageProviderHacks.DOCUMENT_URI_ANDROID_DATA + .asDocumentTreeUri() + ) + )) + } else null, + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + (R.string.storage_add_storage_android_obb + to AddDocumentTreeActivity ::class.createIntent() + .putArgs( + AddDocumentTreeFragment.Args( + R.string.storage_add_storage_android_obb, + ExternalStorageProviderHacks.DOCUMENT_URI_ANDROID_OBB + .asDocumentTreeUri() + ) + )) + } else null, R.string.storage_add_storage_document_tree to AddDocumentTreeActivity::class.createIntent(), R.string.storage_add_storage_sftp_server to EditSftpServerActivity::class.createIntent() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4f2fbcf5c..b411b873e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -480,6 +480,8 @@ Storage No storage Add storage + Android/data + Android/obb External storage SFTP server SMB server