From bec0d1e2a5c3a9745b6b51218b6033946fb22da8 Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Thu, 7 Jul 2022 14:15:54 +0530 Subject: [PATCH] Remove Manage external storage permission and check ACTION_OPEN_DOCUMENT_TREE --- .../library/LocalLibraryFragment.kt | 33 ++++++++++--------- .../library/OnlineLibraryFragment.kt | 18 ++++++++-- .../core/settings/CorePrefsFragment.java | 26 ++++++++++++--- .../kiwixmobile/core/utils/files/FileUtils.kt | 12 +++++-- 4 files changed, 66 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt index f289bc5fb..986a21639 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt @@ -38,7 +38,6 @@ import androidx.appcompat.view.ActionMode import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat import androidx.core.net.toUri -import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -58,13 +57,11 @@ import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.navigate import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel import org.kiwix.kiwixmobile.core.extensions.toast import org.kiwix.kiwixmobile.core.main.CoreMainActivity -import org.kiwix.kiwixmobile.core.navigateToSettings import org.kiwix.kiwixmobile.core.utils.FILE_SELECT_CODE import org.kiwix.kiwixmobile.core.utils.LanguageUtils import org.kiwix.kiwixmobile.core.utils.REQUEST_STORAGE_PERMISSION import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower -import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog import org.kiwix.kiwixmobile.core.utils.files.FileUtils import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BookOnDiskDelegate import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskAdapter @@ -185,6 +182,11 @@ class LocalLibraryFragment : BaseFragment() { when (requestCode) { FILE_SELECT_CODE -> { data?.data?.let { uri -> + val contentResolver = requireActivity().contentResolver + + val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or + Intent.FLAG_GRANT_WRITE_URI_PERMISSION + contentResolver.takePersistableUriPermission(uri, takeFlags) getZimFileFromUri(uri)?.let(::navigateToReaderFragment) } } @@ -302,18 +304,19 @@ class LocalLibraryFragment : BaseFragment() { // We already have permission!! requestFileSystemCheck() } else { - if (sharedPreferenceUtil.manageExternalFilesPermissionDialog) { - // We should only ask for first time, If the users wants to revoke settings - // then they can directly toggle this feature from settings screen - sharedPreferenceUtil.manageExternalFilesPermissionDialog = false - // Show Dialog and Go to settings to give permission - dialogShower.show( - KiwixDialog.ManageExternalFilesPermissionDialog, - { - this.activity?.let(FragmentActivity::navigateToSettings) - } - ) - } + // This code is for taking MANAGE_EXTERNAL_STORAGE permission + // if (sharedPreferenceUtil.manageExternalFilesPermissionDialog) { + // // We should only ask for first time, If the users wants to revoke settings + // // then they can directly toggle this feature from settings screen + // sharedPreferenceUtil.manageExternalFilesPermissionDialog = false + // // Show Dialog and Go to settings to give permission + // dialogShower.show( + // KiwixDialog.ManageExternalFilesPermissionDialog, + // { + // this.activity?.let(FragmentActivity::navigateToSettings) + // } + // ) + // } } } else { requestFileSystemCheck() diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt index 490dd1f61..4bb408761 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt @@ -99,6 +99,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject lateinit var bookUtils: BookUtils @Inject lateinit var availableSpaceCalculator: AvailableSpaceCalculator + private val isInternalStorageSelected = false private val zimManageViewModel by lazy { requireActivity().viewModel(viewModelFactory) } @@ -305,6 +306,12 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { @SuppressLint("InflateParams") private fun storeDeviceInPreferences(storageDevice: StorageDevice) { if (storageDevice.isInternal) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val view = LayoutInflater.from(activity).inflate(R.layout.select_folder_dialog, null) + dialogShower.show(SelectFolder { view }, ::selectFolder) + } else { + setExternalStoragePath(storageDevice) + } sharedPreferenceUtil.putPrefStorage( sharedPreferenceUtil.getPublicDirectoryPath(storageDevice.name) ) @@ -347,8 +354,15 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_SELECT_FOLDER_PERMISSION && resultCode == Activity.RESULT_OK) { data?.let { - getPathFromUri(requireActivity(), data)?.let(sharedPreferenceUtil::putPrefStorage) - sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) + getPathFromUri( + requireActivity(), data, + isInternalStorageSelected + )?.let(sharedPreferenceUtil::putPrefStorage) + if (isInternalStorageSelected) { + sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION) + } else { + sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) + } } ?: run { activity.toast( resources diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java index 45133e648..5392b44b1 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java @@ -86,6 +86,7 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme protected NightModeConfig nightModeConfig; @Inject protected DialogShower alertDialogShower; + private boolean isInternalStorageSelected = false; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { @@ -288,11 +289,22 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme ); if (storageDevice.isInternal()) { - sharedPreferenceUtil.putPrefStorage( - sharedPreferenceUtil.getPublicDirectoryPath(storageDevice.getName())); + isInternalStorageSelected = true; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + @SuppressLint("InflateParams") View view = + LayoutInflater.from(getActivity()).inflate(R.layout.select_folder_dialog, null); + alertDialogShower.show(new KiwixDialog.SelectFolder(() -> view), () -> { + selectFolder(); + return Unit.INSTANCE; + }); + } else { + sharedPreferenceUtil.putPrefStorage( + sharedPreferenceUtil.getPublicDirectoryPath(storageDevice.getName())); + } findPreference(PREF_STORAGE).setTitle(getString(R.string.internal_storage)); sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION); } else { + isInternalStorageSelected = false; if (sharedPreferenceUtil.isPlayStoreBuild()) { setExternalStoragePath(storageDevice); } else { @@ -333,8 +345,14 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_SELECT_FOLDER_PERMISSION && resultCode == RESULT_OK) { sharedPreferenceUtil.putPrefStorage( - FileUtils.getPathFromUri(requireActivity(), data)); - findPreference(PREF_STORAGE).setTitle(getString(R.string.external_storage)); + FileUtils.getPathFromUri(requireActivity(), data, isInternalStorageSelected)); + if (isInternalStorageSelected) { + sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION); + findPreference(PREF_STORAGE).setTitle(getString(R.string.internal_storage)); + } else { + sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION); + findPreference(PREF_STORAGE).setTitle(getString(R.string.external_storage)); + } sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION); } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt index 315560917..43ae5bf66 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt @@ -251,7 +251,11 @@ object FileUtils { .substringBefore(context.getString(R.string.android_directory_seperator)) @SuppressLint("WrongConstant") - @JvmStatic fun getPathFromUri(activity: Activity, data: Intent): String? { + @JvmStatic fun getPathFromUri( + activity: Activity, + data: Intent, + isInternalStorageSelected: Boolean + ): String? { val uri: Uri? = data.data val takeFlags: Int = data.flags and ( Intent.FLAG_GRANT_READ_URI_PERMISSION @@ -270,7 +274,8 @@ object FileUtils { val originalPath = file.substring( file.lastIndexOf(":") + 1 ) - val path = "${activity.getExternalFilesDirs("")[1]}" + val path = + "${activity.getExternalFilesDirs("")[getStoragePosition(isInternalStorageSelected)]}" return@getPathFromUri path.substringBefore( activity.getString(R.string.android_directory_seperator) ) @@ -292,6 +297,9 @@ object FileUtils { return null } + private fun getStoragePosition(isInternalStorageSelected: Boolean): Int = + if (isInternalStorageSelected) 0 else 1 + /** * Returns the file name from the url or src. In url it gets the file name from the last '/' and * if it contains '.'. If the url is null then it'll get the file name from the last '/'.