Skip to content

Commit

Permalink
[Feature] Add Android/data and Android/obb as types of storage to add.
Browse files Browse the repository at this point in the history
Fixes: #611
  • Loading branch information
zhanghai committed Feb 5, 2022
1 parent 41a207a commit 5e7f24d
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<AddDocumentTreeFragment.Args>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// Calls ensureSubDecor().
findViewById<View>(android.R.id.content)
if (savedInstanceState == null) {
val fragment = AddDocumentTreeFragment().putArgs(args)
supportFragmentManager.commit {
add<AddDocumentTreeFragment>(AddDocumentTreeFragment::class.java.name)
add(fragment, AddDocumentTreeFragment::class.java.name)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Args>()

private val openDocumentTreeLauncher = registerForActivityResult(
ActivityResultContracts.OpenDocumentTree(), this::onOpenDocumentTreeResult
)
Expand All @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,8 @@
<string name="storage_list_title">Storage</string>
<string name="storage_list_empty">No storage</string>
<string name="storage_add_storage_title">Add storage</string>
<string name="storage_add_storage_android_data" translatable="false">Android/data</string>
<string name="storage_add_storage_android_obb" translatable="false">Android/obb</string>
<string name="storage_add_storage_document_tree">External storage</string>
<string name="storage_add_storage_sftp_server">SFTP server</string>
<string name="storage_add_storage_smb_server">SMB server</string>
Expand Down

0 comments on commit 5e7f24d

Please sign in to comment.