From 227fe86cf910acf26ba320f85ac87d524894b485 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 7 May 2024 10:46:50 +0300 Subject: [PATCH] Allow to add readonly manga directories --- .../koitharu/kotatsu/core/ui/BaseActivity.kt | 4 ++++ .../storage/MangaDirectorySelectDialog.kt | 2 +- .../settings/storage/PickDirectoryContract.kt | 19 +++++++++++++++++++ .../directories/MangaDirectoriesActivity.kt | 3 ++- .../directories/MangaDirectoriesViewModel.kt | 2 +- 5 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/PickDirectoryContract.kt diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseActivity.kt index d0a5dc319..c7b607991 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseActivity.kt @@ -98,6 +98,10 @@ abstract class BaseActivity : } override fun onSupportNavigateUp(): Boolean { + if (supportFragmentManager.backStackEntryCount > 0) { + supportFragmentManager.popBackStack() + return false + } dispatchNavigateUp() return true } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/MangaDirectorySelectDialog.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/MangaDirectorySelectDialog.kt index e4df84d85..735be10a0 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/MangaDirectorySelectDialog.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/MangaDirectorySelectDialog.kt @@ -29,7 +29,7 @@ class MangaDirectorySelectDialog : AlertDialogFragment { private val viewModel: MangaDirectorySelectViewModel by viewModels() - private val pickFileTreeLauncher = registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { + private val pickFileTreeLauncher = registerForActivityResult(PickDirectoryContract()) { if (it != null) viewModel.onCustomDirectoryPicked(it) } private val permissionRequestLauncher = registerForActivityResult( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/PickDirectoryContract.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/PickDirectoryContract.kt new file mode 100644 index 000000000..bad93c72b --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/PickDirectoryContract.kt @@ -0,0 +1,19 @@ +package org.koitharu.kotatsu.settings.storage + +import android.content.Context +import android.content.Intent +import android.net.Uri +import androidx.activity.result.contract.ActivityResultContracts + +class PickDirectoryContract : ActivityResultContracts.OpenDocumentTree() { + + override fun createIntent(context: Context, input: Uri?): Intent { + val intent = super.createIntent(context, input) + intent.addFlags( + Intent.FLAG_GRANT_READ_URI_PERMISSION + or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, + ) + return intent + } +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/directories/MangaDirectoriesActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/directories/MangaDirectoriesActivity.kt index 7e2d35eec..456cf8aa6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/directories/MangaDirectoriesActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/directories/MangaDirectoriesActivity.kt @@ -26,6 +26,7 @@ import org.koitharu.kotatsu.core.util.ext.tryLaunch import org.koitharu.kotatsu.databinding.ActivityMangaDirectoriesBinding import org.koitharu.kotatsu.settings.storage.DirectoryDiffCallback import org.koitharu.kotatsu.settings.storage.DirectoryModel +import org.koitharu.kotatsu.settings.storage.PickDirectoryContract import org.koitharu.kotatsu.settings.storage.RequestStorageManagerPermissionContract @AndroidEntryPoint @@ -33,7 +34,7 @@ class MangaDirectoriesActivity : BaseActivity() OnListItemClickListener, View.OnClickListener { private val viewModel: MangaDirectoriesViewModel by viewModels() - private val pickFileTreeLauncher = registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { + private val pickFileTreeLauncher = registerForActivityResult(PickDirectoryContract()) { if (it != null) viewModel.onCustomDirectoryPicked(it) } private val permissionRequestLauncher = registerForActivityResult( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/directories/MangaDirectoriesViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/directories/MangaDirectoriesViewModel.kt index b53cc05de..d9d8834cb 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/directories/MangaDirectoriesViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/storage/directories/MangaDirectoriesViewModel.kt @@ -37,7 +37,7 @@ class MangaDirectoriesViewModel @Inject constructor( val dir = requireNotNull(storageManager.resolveUri(uri)) { "Cannot resolve file name of \"$uri\"" } - if (!dir.canWrite()) { + if (!dir.canRead()) { throw AccessDeniedException(dir) } if (dir !in storageManager.getApplicationStorageDirs()) {