From d25929a78a2ec609d1d8126c79688ab92c3ed796 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Tue, 5 Apr 2022 17:32:05 +0530 Subject: [PATCH 1/7] #issue2787 #issue2592 both fixed by same changes --- .../java/eu/mhutti1/utils/storage/StorageDeviceUtils.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/eu/mhutti1/utils/storage/StorageDeviceUtils.kt b/core/src/main/java/eu/mhutti1/utils/storage/StorageDeviceUtils.kt index d3a9bf8c4..b182b8a6b 100644 --- a/core/src/main/java/eu/mhutti1/utils/storage/StorageDeviceUtils.kt +++ b/core/src/main/java/eu/mhutti1/utils/storage/StorageDeviceUtils.kt @@ -33,7 +33,7 @@ object StorageDeviceUtils { @JvmStatic fun getReadableStorage(context: Context): List { val storageDevices = ArrayList().apply { - add(environmentDevices()) + add(environmentDevices(context)) addAll(externalMountPointDevices()) addAll(externalFilesDirsDevices(context, false)) } @@ -63,9 +63,9 @@ object StorageDeviceUtils { ?.map { dir -> StorageDevice(dir, false) } .orEmpty() - private fun environmentDevices() = + private fun environmentDevices(context: Context) = StorageDevice( - generalisePath(Environment.getExternalStorageDirectory().path, false), + generalisePath(context.getExternalFilesDir("").toString(), true), Environment.isExternalStorageEmulated() ) From 16f3dd2e645492568160607c9dec8da3e4657e57 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Wed, 13 Apr 2022 17:16:05 +0530 Subject: [PATCH 2/7] a) Directory changed from app specific to public now its sharable. b) Library androidx document addition c) this resolve issue file deleting after uninstall the app d) this also resolve bug related to zim file not able to load from app specific folder in android 10 and above. --- .../library/OnlineLibraryFragment.kt | 54 +++++++++++- .../settings/KiwixPrefsFragment.kt | 2 +- buildSrc/src/main/kotlin/Libs.kt | 82 ++++++++++--------- buildSrc/src/main/kotlin/Versions.kt | 5 +- core/build.gradle.kts | 3 + .../storage/adapter/StorageViewHolder.kt | 4 +- .../core/settings/CorePrefsFragment.java | 55 +++++++++++-- .../kiwix/kiwixmobile/core/utils/Constants.kt | 6 ++ .../core/utils/SharedPreferenceUtil.kt | 23 +++++- 9 files changed, 186 insertions(+), 48 deletions(-) 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 1cc1acafb..6aa62c05d 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 @@ -18,6 +18,8 @@ package org.kiwix.kiwixmobile.nav.destination.library +import android.annotation.SuppressLint +import android.app.Activity import android.content.Intent import android.net.ConnectivityManager import android.os.Bundle @@ -31,6 +33,7 @@ import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar +import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -53,7 +56,10 @@ import org.kiwix.kiwixmobile.core.extensions.closeKeyboard import org.kiwix.kiwixmobile.core.extensions.snack import org.kiwix.kiwixmobile.core.main.CoreMainActivity import org.kiwix.kiwixmobile.core.utils.BookUtils +import org.kiwix.kiwixmobile.core.utils.EXTERNAL_SELECT_POSITION +import org.kiwix.kiwixmobile.core.utils.INTERNAL_SELECT_POSITION import org.kiwix.kiwixmobile.core.utils.NetworkUtils +import org.kiwix.kiwixmobile.core.utils.REQUEST_SELECT_FOLDER_PERMISSION import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.SimpleRecyclerViewScrollListener import org.kiwix.kiwixmobile.core.utils.SimpleTextListener @@ -66,6 +72,7 @@ import org.kiwix.kiwixmobile.zim_manager.library_view.AvailableSpaceCalculator import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.LibraryAdapter import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.LibraryDelegate import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.LibraryListItem +import java.io.File import javax.inject.Inject class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { @@ -243,7 +250,52 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { } private fun storeDeviceInPreferences(storageDevice: StorageDevice) { - sharedPreferenceUtil.putPrefStorage(storageDevice.name) + if (storageDevice.isInternal) { + sharedPreferenceUtil.putPrefStorage( + sharedPreferenceUtil.getActualPath(storageDevice.name) + ) + sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION) + } else { + setFolder() + } + } + + private fun setFolder() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + intent.putExtra("android.content.extra.SHOW_ADVANCED", true) + startActivityForResult(intent, REQUEST_SELECT_FOLDER_PERMISSION) + } + + @SuppressLint("WrongConstant") override fun onActivityResult( + requestCode: Int, + resultCode: Int, + data: Intent? + ) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_SELECT_FOLDER_PERMISSION && resultCode == Activity.RESULT_OK) { + val uri = data!!.data + val takeFlags = data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION + or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + requireActivity().grantUriPermission( + requireActivity().packageName, uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + ) + requireActivity().contentResolver.takePersistableUriPermission(uri!!, takeFlags) + val dfile = DocumentFile.fromTreeUri(requireActivity(), uri) + val meraPath = dfile!!.uri.path!!.substring( + dfile.uri.path!!.lastIndexOf(":") + 1 + ) + var path = "${requireActivity().getExternalFilesDirs("")[1]}" + val separator = "/Android" + val sepPos = path.indexOf(separator) + if (sepPos == -1) { + } else { + path = path.substring(0, sepPos) + } + path = path + File.separator + meraPath + sharedPreferenceUtil.putPrefStorage(path) + sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) + } } private fun onBookItemClick(item: LibraryListItem.BookItem) { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt index 948466170..8f3c118b4 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt @@ -41,7 +41,7 @@ class KiwixPrefsFragment : CorePrefsFragment() { override fun setStorage() { findPreference(PREF_STORAGE)?.title = getString( - if (sharedPreferenceUtil.prefStorage == internalStorage()) R.string.internal_storage + if (sharedPreferenceUtil.prefStorage == internalStorage()?.let(sharedPreferenceUtil::getActualPath)) R.string.internal_storage else R.string.external_storage ) findPreference(PREF_STORAGE)?.summary = storageCalculator.calculateAvailableSpace() diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index feae21060..85306f39d 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -7,54 +7,62 @@ import kotlin.String * `$ ./gradlew buildSrcVersions` */ object Libs { + + /** + * For Getting Path of Selected Folder + **/ + + const val select_folder_document_file = + "androidx.documentfile:documentfile:" + Versions.document_file_version + /** * https://github.com/Kotlin/kotlinx.coroutines */ const val kotlinx_coroutines_android: String = - "org.jetbrains.kotlinx:kotlinx-coroutines-android:" + + "org.jetbrains.kotlinx:kotlinx-coroutines-android:" + Versions.org_jetbrains_kotlinx_kotlinx_coroutines /** * https://github.com/Kotlin/kotlinx.coroutines */ const val kotlinx_coroutines_test: String = "org.jetbrains.kotlinx:kotlinx-coroutines-test:" + - Versions.org_jetbrains_kotlinx_kotlinx_coroutines + Versions.org_jetbrains_kotlinx_kotlinx_coroutines /** * https://developer.android.com/testing */ const val espresso_contrib: String = "androidx.test.espresso:espresso-contrib:" + - Versions.androidx_test_espresso + Versions.androidx_test_espresso /** * https://developer.android.com/testing */ const val espresso_core: String = "androidx.test.espresso:espresso-core:" + - Versions.androidx_test_espresso + Versions.androidx_test_espresso /** * https://developer.android.com/testing */ const val espresso_intents: String = "androidx.test.espresso:espresso-intents:" + - Versions.androidx_test_espresso + Versions.androidx_test_espresso /** * https://developer.android.com/testing */ const val espresso_web: String = "androidx.test.espresso:espresso-web:" + - Versions.androidx_test_espresso + Versions.androidx_test_espresso /** * https://github.com/square/retrofit */ const val adapter_rxjava2: String = "com.squareup.retrofit2:adapter-rxjava2:" + - Versions.com_squareup_retrofit2 + Versions.com_squareup_retrofit2 /** * https://github.com/square/retrofit */ const val converter_simplexml: String = "com.squareup.retrofit2:converter-simplexml:" + - Versions.com_squareup_retrofit2 + Versions.com_squareup_retrofit2 /** * https://github.com/square/retrofit @@ -65,13 +73,13 @@ object Libs { * https://square.github.io/okhttp/ */ const val logging_interceptor: String = "com.squareup.okhttp3:logging-interceptor:" + - Versions.com_squareup_okhttp3 + Versions.com_squareup_okhttp3 /** * https://square.github.io/okhttp/ */ const val mockwebserver: String = "com.squareup.okhttp3:mockwebserver:" + - Versions.com_squareup_okhttp3 + Versions.com_squareup_okhttp3 /** * https://square.github.io/okhttp/ @@ -82,55 +90,55 @@ object Libs { * https://kotlinlang.org/ */ const val kotlin_android_extensions: String = "org.jetbrains.kotlin:kotlin-android-extensions:" + - Versions.org_jetbrains_kotlin + Versions.org_jetbrains_kotlin /** * https://kotlinlang.org/ */ const val kotlin_android_extensions_runtime: String = - "org.jetbrains.kotlin:kotlin-android-extensions-runtime:" + Versions.org_jetbrains_kotlin + "org.jetbrains.kotlin:kotlin-android-extensions-runtime:" + Versions.org_jetbrains_kotlin /** * https://kotlinlang.org/ */ const val kotlin_annotation_processing_gradle: String = - "org.jetbrains.kotlin:kotlin-annotation-processing-gradle:" + Versions.org_jetbrains_kotlin + "org.jetbrains.kotlin:kotlin-annotation-processing-gradle:" + Versions.org_jetbrains_kotlin /** * https://kotlinlang.org/ */ const val kotlin_gradle_plugin: String = "org.jetbrains.kotlin:kotlin-gradle-plugin:" + - Versions.org_jetbrains_kotlin + Versions.org_jetbrains_kotlin /** * https://kotlinlang.org/ */ const val kotlin_stdlib_jdk7: String = "org.jetbrains.kotlin:kotlin-stdlib-jdk7:" + - Versions.org_jetbrains_kotlin + Versions.org_jetbrains_kotlin /** * https://developer.android.com/topic/libraries/architecture/index.html */ const val navigation_fragment_ktx: String = "androidx.navigation:navigation-fragment-ktx:" + - Versions.androidx_navigation + Versions.androidx_navigation /** * https://developer.android.com/topic/libraries/architecture/index.html */ const val navigation_safe_args_gradle_plugin: String = - "androidx.navigation:navigation-safe-args-gradle-plugin:" + Versions.androidx_navigation + "androidx.navigation:navigation-safe-args-gradle-plugin:" + Versions.androidx_navigation /** * https://developer.android.com/topic/libraries/architecture/index.html */ const val navigation_testing: String = "androidx.navigation:navigation-testing:" + - Versions.androidx_navigation + Versions.androidx_navigation /** * https://developer.android.com/topic/libraries/architecture/index.html */ const val navigation_ui_ktx: String = "androidx.navigation:navigation-ui-ktx:" + - Versions.androidx_navigation + Versions.androidx_navigation /** * https://github.com/google/dagger @@ -141,19 +149,19 @@ object Libs { * https://github.com/google/dagger */ const val dagger_android: String = "com.google.dagger:dagger-android:" + - Versions.com_google_dagger + Versions.com_google_dagger /** * https://github.com/google/dagger */ const val dagger_android_processor: String = "com.google.dagger:dagger-android-processor:" + - Versions.com_google_dagger + Versions.com_google_dagger /** * https://github.com/google/dagger */ const val dagger_compiler: String = "com.google.dagger:dagger-compiler:" + - Versions.com_google_dagger + Versions.com_google_dagger /** * https://github.com/yahoo/squidb @@ -164,13 +172,13 @@ object Libs { * https://github.com/yahoo/squidb */ const val squidb_annotations: String = "com.yahoo.squidb:squidb-annotations:" + - Versions.com_yahoo_squidb + Versions.com_yahoo_squidb /** * https://github.com/yahoo/squidb */ const val squidb_processor: String = "com.yahoo.squidb:squidb-processor:" + - Versions.com_yahoo_squidb + Versions.com_yahoo_squidb /** * https://github.com/JakeWharton/butterknife/ @@ -181,13 +189,13 @@ object Libs { * https://github.com/JakeWharton/butterknife/ */ const val butterknife_compiler: String = "com.jakewharton:butterknife-compiler:" + - Versions.com_jakewharton + Versions.com_jakewharton /** * https://github.com/JakeWharton/butterknife/ */ const val butterknife_gradle_plugin: String = "com.jakewharton:butterknife-gradle-plugin:" + - Versions.com_jakewharton + Versions.com_jakewharton /** * https://developer.android.com/testing @@ -218,7 +226,7 @@ object Libs { * https://objectbox.io */ const val objectbox_gradle_plugin: String = "io.objectbox:objectbox-gradle-plugin:" + - Versions.io_objectbox + Versions.io_objectbox /** * https://objectbox.io @@ -234,7 +242,7 @@ object Libs { * https://objectbox.io */ const val objectbox_processor: String = "io.objectbox:objectbox-processor:" + - Versions.io_objectbox + Versions.io_objectbox /** * https://objectbox.io @@ -270,42 +278,42 @@ object Libs { * https://developer.android.com/topic/libraries/architecture/index.html */ const val android_arch_lifecycle_extensions: String = "android.arch.lifecycle:extensions:" + - Versions.android_arch_lifecycle_extensions + Versions.android_arch_lifecycle_extensions /** * https://developer.android.com/studio */ const val com_android_tools_build_gradle: String = "com.android.tools.build:gradle:" + - Versions.com_android_tools_build_gradle + Versions.com_android_tools_build_gradle const val de_fayard_buildsrcversions_gradle_plugin: String = - "de.fayard.buildSrcVersions:de.fayard.buildSrcVersions.gradle.plugin:" + + "de.fayard.buildSrcVersions:de.fayard.buildSrcVersions.gradle.plugin:" + Versions.de_fayard_buildsrcversions_gradle_plugin const val com_github_triplet_play_gradle_plugin: String = - "com.github.triplet.play:com.github.triplet.play.gradle.plugin:" + + "com.github.triplet.play:com.github.triplet.play.gradle.plugin:" + Versions.com_github_triplet_play_gradle_plugin /** * http://jcp.org/en/jsr/detail?id=250 */ const val javax_annotation_api: String = "javax.annotation:javax.annotation-api:" + - Versions.javax_annotation_api + Versions.javax_annotation_api const val ink_page_indicator: String = "com.pacioianu.david:ink-page-indicator:" + - Versions.ink_page_indicator + Versions.ink_page_indicator /** * http://github.com/square/leakcanary/ */ const val leakcanary_android: String = "com.squareup.leakcanary:leakcanary-android:" + - Versions.leakcanary_android + Versions.leakcanary_android /** * http://tools.android.com */ const val constraintlayout: String = "androidx.constraintlayout:constraintlayout:" + - Versions.constraintlayout + Versions.constraintlayout /** * http://developer.android.com/tools/extras/support-library.html @@ -323,7 +331,7 @@ object Libs { const val junit_jupiter: String = "org.junit.jupiter:junit-jupiter:" + Versions.junit_jupiter const val xfetch2okhttp: String = "androidx.tonyodev.fetch2okhttp:xfetch2okhttp:" + - Versions.xfetch2okhttp + Versions.xfetch2okhttp /** * https://assertj.github.io/doc/ diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 142cee923..9b5c75bf9 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -11,6 +11,9 @@ import org.gradle.plugin.use.PluginDependencySpec * YOU are responsible for updating manually the dependency version. */ object Versions { + + const val document_file_version: String = "1.0.1" + const val org_jetbrains_kotlinx_kotlinx_coroutines: String = "1.4.1" const val androidx_test_espresso: String = "3.3.0" @@ -121,4 +124,4 @@ object Versions { */ val PluginDependenciesSpec.buildSrcVersions: PluginDependencySpec inline get() = - id("de.fayard.buildSrcVersions").version(Versions.de_fayard_buildsrcversions_gradle_plugin) + id("de.fayard.buildSrcVersions").version(Versions.de_fayard_buildsrcversions_gradle_plugin) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index ad35718aa..b01ad950e 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -47,6 +47,9 @@ dependencies { implementation(Libs.squidb_annotations) add("kapt", Libs.squidb_processor) + // Document File + implementation(Libs.select_folder_document_file) + // Square implementation(Libs.converter_simplexml) { exclude(group = "xpp3", module = "xpp3") diff --git a/core/src/main/java/eu/mhutti1/utils/storage/adapter/StorageViewHolder.kt b/core/src/main/java/eu/mhutti1/utils/storage/adapter/StorageViewHolder.kt index e91c4b751..b949ba57d 100644 --- a/core/src/main/java/eu/mhutti1/utils/storage/adapter/StorageViewHolder.kt +++ b/core/src/main/java/eu/mhutti1/utils/storage/adapter/StorageViewHolder.kt @@ -43,7 +43,9 @@ internal class StorageViewHolder( else R.string.external_storage ) - file_name.isChecked = sharedPreferenceUtil.prefStorage == item.name + if (adapterPosition == sharedPreferenceUtil.storagePosition) { + file_name.isChecked = true + } file_size.text = storageCalculator.calculateAvailableSpace(item.file) + " / " + storageCalculator.calculateTotalSpace(item.file) + " " clickOverlay.setOnClickListener { 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 5a38303cf..b427616eb 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 @@ -20,12 +20,17 @@ package org.kiwix.kiwixmobile.core.settings; import android.Manifest; import android.annotation.SuppressLint; +import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.net.Uri; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.webkit.WebView; +import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; +import androidx.documentfile.provider.DocumentFile; import androidx.navigation.NavController; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; @@ -51,6 +56,10 @@ import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil; import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower; import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog; +import static android.app.Activity.RESULT_OK; +import static org.kiwix.kiwixmobile.core.utils.ConstantsKt.EXTERNAL_SELECT_POSITION; +import static org.kiwix.kiwixmobile.core.utils.ConstantsKt.INTERNAL_SELECT_POSITION; +import static org.kiwix.kiwixmobile.core.utils.ConstantsKt.REQUEST_SELECT_FOLDER_PERMISSION; import static org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil.PREF_NIGHT_MODE; import static org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil.PREF_STORAGE; @@ -175,9 +184,6 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme versionPref.setSummary(getVersionName() + " Build: " + getVersionCode()); } - - - private int getVersionCode() { try { return getActivity().getPackageManager() @@ -278,13 +284,52 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme findPreference(PREF_STORAGE).setSummary( storageCalculator.calculateAvailableSpace(storageDevice.getFile()) ); - sharedPreferenceUtil.putPrefStorage(storageDevice.getName()); + if (storageDevice.isInternal()) { + sharedPreferenceUtil.putPrefStorage( + sharedPreferenceUtil.getActualPath(storageDevice.getName())); findPreference(PREF_STORAGE).setTitle(getString(R.string.internal_storage)); + sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION); } else { - findPreference(PREF_STORAGE).setTitle(getString(R.string.external_storage)); + setFolder(); } return Unit.INSTANCE; } + private void setFolder() { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + intent.putExtra("android.content.extra.SHOW_ADVANCED", true); + startActivityForResult(intent, REQUEST_SELECT_FOLDER_PERMISSION); + } + + @SuppressLint("WrongConstant") @Override + public void onActivityResult(int requestCode, int resultCode, + @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_SELECT_FOLDER_PERMISSION && resultCode == RESULT_OK) { + Uri uri = data.getData(); + int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + getActivity().grantUriPermission(getActivity().getPackageName(), uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + getActivity().getContentResolver().takePersistableUriPermission(uri, takeFlags); + + DocumentFile dfile = DocumentFile.fromTreeUri(getActivity(), uri); + String meraPath = + dfile.getUri().getPath().substring(dfile.getUri().getPath().lastIndexOf(":") + 1); + + String path = getActivity().getExternalFilesDirs("")[1].toString(); + String separator = "/Android"; + int sepPos = path.indexOf(separator); + if (sepPos == -1) { + + } else { + path = path.substring(0, sepPos); + } + path = path + File.separator + meraPath; + sharedPreferenceUtil.putPrefStorage(path); + 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/Constants.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt index 308849cc3..975b60574 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt @@ -23,6 +23,7 @@ const val CONTACT_EMAIL_ADDRESS = "android@kiwix.org" // Request stuff const val REQUEST_STORAGE_PERMISSION = 1 const val REQUEST_WRITE_STORAGE_PERMISSION_ADD_NOTE = 3 +const val REQUEST_SELECT_FOLDER_PERMISSION = 4 // Tags const val TAG_FILE_SEARCHED = "searchedarticle" @@ -37,3 +38,8 @@ const val TAG_FROM_TAB_SWITCHER = "fromtabswitcher" const val EXTRA_IS_WIDGET_VOICE = "isWidgetVoice" const val HOTSPOT_SERVICE_CHANNEL_ID = "hotspotService" const val OLD_PROVIDER_DOMAIN = "org.kiwix.zim.base" + + +// For Storage select dialog +const val INTERNAL_SELECT_POSITION = 0 +const val EXTERNAL_SELECT_POSITION = 1 diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt index 19c4d0ac7..e98a2c4a9 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt @@ -76,12 +76,15 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { get() { val storage = sharedPreferences.getString(PREF_STORAGE, null) return when { - storage == null -> defaultStorage().also(::putPrefStorage) - !File(storage).exists() -> defaultStorage() + storage == null -> getActualPath(defaultStorage()).also(::putPrefStorage) + !File(storage).exists() -> getActualPath(defaultStorage()) else -> storage } } + val storagePosition: Int + get() = sharedPreferences.getInt(STORAGE_POSITION, 0) + private fun defaultStorage(): String = getExternalFilesDirs(context, null)[0]?.path ?: context.filesDir.path // a workaround for emulators @@ -108,6 +111,10 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { _prefStorages.onNext(storage) } + fun putStoragePosition(pos: Int) { + sharedPreferences.edit { putInt(STORAGE_POSITION, pos) } + } + fun putPrefFullScreen(fullScreen: Boolean) = sharedPreferences.edit { putBoolean(PREF_FULLSCREEN, fullScreen) } @@ -160,10 +167,22 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { _textZooms.offer(textZoom) } + fun getActualPath(path: String): String { + var s = path + val separator = "/Android" + val sepPos = path.indexOf(separator) + if (sepPos == -1) { + } else { + s = path.substring(0, sepPos) + } + return s + } + companion object { // Prefs const val PREF_LANG = "pref_language_chooser" const val PREF_STORAGE = "pref_select_folder" + const val STORAGE_POSITION = "storage_position" const val PREF_WIFI_ONLY = "pref_wifi_only" const val PREF_KIWIX_MOBILE = "kiwix-mobile" const val PREF_SHOW_INTRO = "showIntro" From 53af13291c1fba0b5e1c9b5e3e3b92ba314487f4 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Thu, 14 Apr 2022 16:42:16 +0530 Subject: [PATCH 3/7] Add dialog for external storage work --- .../library/OnlineLibraryFragment.kt | 45 +++++++-------- .../settings/KiwixPrefsFragment.kt | 4 +- .../core/settings/CorePrefsFragment.java | 52 ++++++++---------- .../core/utils/SharedPreferenceUtil.kt | 13 +++-- .../core/utils/dialog/KiwixDialog.kt | 8 +++ .../kiwixmobile/core/utils/files/FileUtils.kt | 31 ++++++++++- .../select_folder_preview_image1.png | Bin 0 -> 4012 bytes .../select_folder_preview_image2.png | Bin 0 -> 3060 bytes .../select_folder_preview_image1.png | Bin 0 -> 1794 bytes .../select_folder_preview_image2.png | Bin 0 -> 1338 bytes .../select_folder_preview_image1.png | Bin 0 -> 2471 bytes .../select_folder_preview_image2.png | Bin 0 -> 1880 bytes .../select_folder_preview_image1.png | Bin 0 -> 5865 bytes .../select_folder_preview_image2.png | Bin 0 -> 4267 bytes .../select_folder_preview_image1.png | Bin 0 -> 9815 bytes .../select_folder_preview_image2.png | Bin 0 -> 7230 bytes .../select_folder_preview_image1.png | Bin 0 -> 14241 bytes .../select_folder_preview_image2.png | Bin 0 -> 10433 bytes .../main/res/layout/select_folder_dialog.xml | 45 +++++++++++++++ core/src/main/res/values/strings.xml | 2 + 20 files changed, 141 insertions(+), 59 deletions(-) create mode 100644 core/src/main/res/drawable-hdpi/select_folder_preview_image1.png create mode 100644 core/src/main/res/drawable-hdpi/select_folder_preview_image2.png create mode 100644 core/src/main/res/drawable-ldpi/select_folder_preview_image1.png create mode 100644 core/src/main/res/drawable-ldpi/select_folder_preview_image2.png create mode 100644 core/src/main/res/drawable-mdpi/select_folder_preview_image1.png create mode 100644 core/src/main/res/drawable-mdpi/select_folder_preview_image2.png create mode 100644 core/src/main/res/drawable-xhdpi/select_folder_preview_image1.png create mode 100644 core/src/main/res/drawable-xhdpi/select_folder_preview_image2.png create mode 100644 core/src/main/res/drawable-xxhdpi/select_folder_preview_image1.png create mode 100644 core/src/main/res/drawable-xxhdpi/select_folder_preview_image2.png create mode 100644 core/src/main/res/drawable-xxxhdpi/select_folder_preview_image1.png create mode 100644 core/src/main/res/drawable-xxxhdpi/select_folder_preview_image2.png create mode 100644 core/src/main/res/layout/select_folder_dialog.xml 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 6aa62c05d..6930aa734 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 @@ -22,6 +22,7 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.net.ConnectivityManager +import android.os.Build import android.os.Bundle import android.provider.Settings import android.view.LayoutInflater @@ -33,7 +34,6 @@ import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar -import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -65,14 +65,15 @@ import org.kiwix.kiwixmobile.core.utils.SimpleRecyclerViewScrollListener import org.kiwix.kiwixmobile.core.utils.SimpleTextListener import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog +import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.SelectFolder import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.YesNoDialog.WifiOnly +import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getPathFromUri import org.kiwix.kiwixmobile.zim_manager.NetworkState import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel import org.kiwix.kiwixmobile.zim_manager.library_view.AvailableSpaceCalculator import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.LibraryAdapter import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.LibraryDelegate import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.LibraryListItem -import java.io.File import javax.inject.Inject class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { @@ -249,6 +250,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { downloader.download(book) } + @SuppressLint("InflateParams") private fun storeDeviceInPreferences(storageDevice: StorageDevice) { if (storageDevice.isInternal) { sharedPreferenceUtil.putPrefStorage( @@ -256,13 +258,24 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ) sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION) } else { - setFolder() + 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 { + sharedPreferenceUtil.putPrefStorage(storageDevice.name) + sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) + } } } - private fun setFolder() { + private fun selectFolder() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) - intent.putExtra("android.content.extra.SHOW_ADVANCED", true) + intent.addFlags( + Intent.FLAG_GRANT_READ_URI_PERMISSION + or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION + or Intent.FLAG_GRANT_PREFIX_URI_PERMISSION + ) startActivityForResult(intent, REQUEST_SELECT_FOLDER_PERMISSION) } @@ -273,27 +286,9 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_SELECT_FOLDER_PERMISSION && resultCode == Activity.RESULT_OK) { - val uri = data!!.data - val takeFlags = data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION - or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - requireActivity().grantUriPermission( - requireActivity().packageName, uri, - Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + sharedPreferenceUtil.putPrefStorage( + getPathFromUri(requireActivity(), data!!) ) - requireActivity().contentResolver.takePersistableUriPermission(uri!!, takeFlags) - val dfile = DocumentFile.fromTreeUri(requireActivity(), uri) - val meraPath = dfile!!.uri.path!!.substring( - dfile.uri.path!!.lastIndexOf(":") + 1 - ) - var path = "${requireActivity().getExternalFilesDirs("")[1]}" - val separator = "/Android" - val sepPos = path.indexOf(separator) - if (sepPos == -1) { - } else { - path = path.substring(0, sepPos) - } - path = path + File.separator + meraPath - sharedPreferenceUtil.putPrefStorage(path) sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt index 8f3c118b4..dbc580224 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt @@ -41,7 +41,9 @@ class KiwixPrefsFragment : CorePrefsFragment() { override fun setStorage() { findPreference(PREF_STORAGE)?.title = getString( - if (sharedPreferenceUtil.prefStorage == internalStorage()?.let(sharedPreferenceUtil::getActualPath)) R.string.internal_storage + if (sharedPreferenceUtil.prefStorage == internalStorage()?.let + (sharedPreferenceUtil::getActualPath) + ) R.string.internal_storage else R.string.external_storage ) findPreference(PREF_STORAGE)?.summary = storageCalculator.calculateAvailableSpace() 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 b427616eb..717f92d5d 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 @@ -23,14 +23,13 @@ import android.annotation.SuppressLint; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.net.Uri; +import android.os.Build; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; +import android.view.View; import android.webkit.WebView; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; -import androidx.documentfile.provider.DocumentFile; import androidx.navigation.NavController; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; @@ -55,8 +54,10 @@ import org.kiwix.kiwixmobile.core.utils.LanguageUtils; 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 static android.app.Activity.RESULT_OK; +import static android.content.Intent.ACTION_OPEN_DOCUMENT_TREE; import static org.kiwix.kiwixmobile.core.utils.ConstantsKt.EXTERNAL_SELECT_POSITION; import static org.kiwix.kiwixmobile.core.utils.ConstantsKt.INTERNAL_SELECT_POSITION; import static org.kiwix.kiwixmobile.core.utils.ConstantsKt.REQUEST_SELECT_FOLDER_PERMISSION; @@ -291,14 +292,28 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme findPreference(PREF_STORAGE).setTitle(getString(R.string.internal_storage)); sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION); } else { - setFolder(); + 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(storageDevice.getName()); + findPreference(PREF_STORAGE).setTitle(getString(R.string.external_storage)); + sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION); + } } return Unit.INSTANCE; } - private void setFolder() { - Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); - intent.putExtra("android.content.extra.SHOW_ADVANCED", true); + private void selectFolder() { + Intent intent = new Intent(ACTION_OPEN_DOCUMENT_TREE); + intent.addFlags( + Intent.FLAG_GRANT_READ_URI_PERMISSION + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION + | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION + | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); startActivityForResult(intent, REQUEST_SELECT_FOLDER_PERMISSION); } @@ -307,27 +322,8 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_SELECT_FOLDER_PERMISSION && resultCode == RESULT_OK) { - Uri uri = data.getData(); - int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - getActivity().grantUriPermission(getActivity().getPackageName(), uri, - Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - getActivity().getContentResolver().takePersistableUriPermission(uri, takeFlags); - - DocumentFile dfile = DocumentFile.fromTreeUri(getActivity(), uri); - String meraPath = - dfile.getUri().getPath().substring(dfile.getUri().getPath().lastIndexOf(":") + 1); - - String path = getActivity().getExternalFilesDirs("")[1].toString(); - String separator = "/Android"; - int sepPos = path.indexOf(separator); - if (sepPos == -1) { - - } else { - path = path.substring(0, sepPos); - } - path = path + File.separator + meraPath; - sharedPreferenceUtil.putPrefStorage(path); + sharedPreferenceUtil.putPrefStorage( + FileUtils.getPathFromUri(requireActivity(), data)); 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/SharedPreferenceUtil.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt index e98a2c4a9..d4e236bb4 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt @@ -27,6 +27,7 @@ import io.reactivex.Flowable import io.reactivex.processors.PublishProcessor import org.kiwix.kiwixmobile.core.NightModeConfig import org.kiwix.kiwixmobile.core.NightModeConfig.Mode.Companion.from +import org.kiwix.kiwixmobile.core.R import java.io.File import java.util.Locale import javax.inject.Inject @@ -77,7 +78,12 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { val storage = sharedPreferences.getString(PREF_STORAGE, null) return when { storage == null -> getActualPath(defaultStorage()).also(::putPrefStorage) - !File(storage).exists() -> getActualPath(defaultStorage()) + .also { + putStoragePosition(0) + } + !File(storage).exists() -> getActualPath(defaultStorage()).also { + putStoragePosition(0) + } else -> storage } } @@ -169,10 +175,9 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { fun getActualPath(path: String): String { var s = path - val separator = "/Android" + val separator = context.getString(R.string.android_directory_seperator) val sepPos = path.indexOf(separator) - if (sepPos == -1) { - } else { + if (sepPos != -1) { s = path.substring(0, sepPos) } return s diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt index 7bb1139ac..c774b3401 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt @@ -185,6 +185,14 @@ sealed class KiwixDialog( getView = customGetView ) + data class SelectFolder(val customGetView: (() -> View)?) : KiwixDialog( + R.string.select_folder, + null, + android.R.string.ok, + null, + getView = customGetView + ) + object NotesDiscardConfirmation : KiwixDialog( null, R.string.confirmation_alert_dialog_message, 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 dadb75e95..b5d336215 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 @@ -17,19 +17,23 @@ */ package org.kiwix.kiwixmobile.core.utils.files +import android.annotation.SuppressLint +import android.app.Activity import android.content.ContentUris import android.content.Context +import android.content.Intent import android.net.Uri import android.os.Environment import android.provider.DocumentsContract import android.util.Log +import androidx.documentfile.provider.DocumentFile +import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.downloader.ChunkUtils import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book import org.kiwix.kiwixmobile.core.extensions.get import java.io.BufferedReader import java.io.File import java.io.IOException -import java.util.ArrayList object FileUtils { @@ -228,4 +232,29 @@ object FileUtils { } catch (e: IOException) { "".also { e.printStackTrace() } } + + @SuppressLint("WrongConstant") + @JvmStatic fun getPathFromUri(activity: Activity, data: Intent): String { + val uri: Uri? = data.data + val takeFlags: Int = data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION + or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + activity.grantUriPermission( + activity.packageName, uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + ) + activity.contentResolver.takePersistableUriPermission(uri!!, takeFlags) + + val dFile = DocumentFile.fromTreeUri(activity, uri) + val originalPath = dFile!!.uri.path!!.substring( + dFile.uri.path!!.lastIndexOf(":") + 1 + ) + + var path = "${activity.getExternalFilesDirs("")[1]}" + val separator: String = activity.getString(R.string.android_directory_seperator) + val sepPos = path.indexOf(separator) + if (sepPos != -1) { + path = path.substring(0, sepPos) + } + return path + File.separator + originalPath + } } diff --git a/core/src/main/res/drawable-hdpi/select_folder_preview_image1.png b/core/src/main/res/drawable-hdpi/select_folder_preview_image1.png new file mode 100644 index 0000000000000000000000000000000000000000..d126231ddb0f2795550ce8c7421aef3b61e88d10 GIT binary patch literal 4012 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 kz82bV;@H2N{-0(1Ul6Nnf(I7g0MtfvU-HQ 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 literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-mdpi/select_folder_preview_image2.png b/core/src/main/res/drawable-mdpi/select_folder_preview_image2.png new file mode 100644 index 0000000000000000000000000000000000000000..84d1afef42ee0f54f133856a4573b80256393663 GIT binary patch literal 1880 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 literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xhdpi/select_folder_preview_image2.png b/core/src/main/res/drawable-xhdpi/select_folder_preview_image2.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab78d226dc7fbdc5398845c433fc313c7efe2f0 GIT binary patch literal 4267 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 literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xxhdpi/select_folder_preview_image2.png b/core/src/main/res/drawable-xxhdpi/select_folder_preview_image2.png new file mode 100644 index 0000000000000000000000000000000000000000..5d664ef54469ab4172e7cd7c2cea2ac2290659a0 GIT binary patch literal 7230 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 HnfU(?0~lEH literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xxxhdpi/select_folder_preview_image1.png b/core/src/main/res/drawable-xxxhdpi/select_folder_preview_image1.png new file mode 100644 index 0000000000000000000000000000000000000000..50983145263bf1ac56daf590bc395435567353a4 GIT binary patch literal 14241 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 literal 0 HcmV?d00001 diff --git a/core/src/main/res/layout/select_folder_dialog.xml b/core/src/main/res/layout/select_folder_dialog.xml new file mode 100644 index 000000000..3e5a95598 --- /dev/null +++ b/core/src/main/res/layout/select_folder_dialog.xml @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index e8b22ef18..a52f02519 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -295,6 +295,8 @@ In order to access all the zim files across device we need to have All Files Permission Allowed Not allowed + /Android + Please select a folder for external storage. @string/on @string/off From 919f23cefb8aed84a90c9dfa2fb7a6c383d7db25 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Thu, 21 Apr 2022 19:11:45 +0530 Subject: [PATCH 4/7] changes after review --- .../library/OnlineLibraryFragment.kt | 14 ++++--- .../settings/KiwixPrefsFragment.kt | 2 +- app/src/main/res/values/strings.xml | 1 + core/build.gradle.kts | 1 + .../core/settings/CorePrefsFragment.java | 2 +- .../core/utils/SharedPreferenceUtil.kt | 21 ++++------ .../kiwixmobile/core/utils/files/FileUtils.kt | 39 +++++++++++-------- .../main/res/layout/select_folder_dialog.xml | 4 +- core/src/main/res/values/strings.xml | 1 + 9 files changed, 45 insertions(+), 40 deletions(-) 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 6930aa734..a5733b081 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 @@ -31,6 +31,7 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar @@ -54,6 +55,7 @@ import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.navigate import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel import org.kiwix.kiwixmobile.core.extensions.closeKeyboard import org.kiwix.kiwixmobile.core.extensions.snack +import org.kiwix.kiwixmobile.core.extensions.toast import org.kiwix.kiwixmobile.core.main.CoreMainActivity import org.kiwix.kiwixmobile.core.utils.BookUtils import org.kiwix.kiwixmobile.core.utils.EXTERNAL_SELECT_POSITION @@ -254,7 +256,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { private fun storeDeviceInPreferences(storageDevice: StorageDevice) { if (storageDevice.isInternal) { sharedPreferenceUtil.putPrefStorage( - sharedPreferenceUtil.getActualPath(storageDevice.name) + sharedPreferenceUtil.getPublicDirectoryPath(storageDevice.name) ) sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION) } else { @@ -286,10 +288,12 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_SELECT_FOLDER_PERMISSION && resultCode == Activity.RESULT_OK) { - sharedPreferenceUtil.putPrefStorage( - getPathFromUri(requireActivity(), data!!) - ) - sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) + data?.let { + getPathFromUri(requireActivity(), data)?.let(sharedPreferenceUtil::putPrefStorage) + sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) + } ?: run { + activity.toast(resources.getString(R.string.error_occurred), Toast.LENGTH_SHORT) + } } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt index dbc580224..f3ff379f4 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt @@ -42,7 +42,7 @@ class KiwixPrefsFragment : CorePrefsFragment() { override fun setStorage() { findPreference(PREF_STORAGE)?.title = getString( if (sharedPreferenceUtil.prefStorage == internalStorage()?.let - (sharedPreferenceUtil::getActualPath) + (sharedPreferenceUtil::getPublicDirectoryPath) ) R.string.internal_storage else R.string.external_storage ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 96761d289..8be9846c4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,4 +6,5 @@ Failed to open file\nPlease try looking for this file in the Device Tab of your Library Send Files Receive Files + System unable to grant permission! diff --git a/core/build.gradle.kts b/core/build.gradle.kts index b01ad950e..58dec6613 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -45,6 +45,7 @@ dependencies { // SquiDB implementation(Libs.squidb) implementation(Libs.squidb_annotations) + implementation("androidx.documentfile:documentfile:1.0.1") add("kapt", Libs.squidb_processor) // Document File 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 717f92d5d..7b7cebb82 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 @@ -288,7 +288,7 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme if (storageDevice.isInternal()) { sharedPreferenceUtil.putPrefStorage( - sharedPreferenceUtil.getActualPath(storageDevice.getName())); + sharedPreferenceUtil.getPublicDirectoryPath(storageDevice.getName())); findPreference(PREF_STORAGE).setTitle(getString(R.string.internal_storage)); sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION); } else { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt index d4e236bb4..b7d0b67db 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt @@ -77,11 +77,11 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { get() { val storage = sharedPreferences.getString(PREF_STORAGE, null) return when { - storage == null -> getActualPath(defaultStorage()).also(::putPrefStorage) - .also { - putStoragePosition(0) - } - !File(storage).exists() -> getActualPath(defaultStorage()).also { + storage == null -> getPublicDirectoryPath(defaultStorage()).also { + putPrefStorage(it) + putStoragePosition(0) + } + !File(storage).exists() -> getPublicDirectoryPath(defaultStorage()).also { putStoragePosition(0) } else -> storage @@ -173,15 +173,8 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { _textZooms.offer(textZoom) } - fun getActualPath(path: String): String { - var s = path - val separator = context.getString(R.string.android_directory_seperator) - val sepPos = path.indexOf(separator) - if (sepPos != -1) { - s = path.substring(0, sepPos) - } - return s - } + fun getPublicDirectoryPath(path: String): String = + path.substringBefore(context.getString(R.string.android_directory_seperator)) companion object { // Prefs 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 b5d336215..068b15ad4 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 @@ -26,11 +26,13 @@ import android.net.Uri import android.os.Environment import android.provider.DocumentsContract import android.util.Log +import android.widget.Toast import androidx.documentfile.provider.DocumentFile import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.downloader.ChunkUtils import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book import org.kiwix.kiwixmobile.core.extensions.get +import org.kiwix.kiwixmobile.core.extensions.toast import java.io.BufferedReader import java.io.File import java.io.IOException @@ -234,27 +236,30 @@ object FileUtils { } @SuppressLint("WrongConstant") - @JvmStatic fun getPathFromUri(activity: Activity, data: Intent): String { + @JvmStatic fun getPathFromUri(activity: Activity, data: Intent): String? { val uri: Uri? = data.data val takeFlags: Int = data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - activity.grantUriPermission( - activity.packageName, uri, - Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION - ) - activity.contentResolver.takePersistableUriPermission(uri!!, takeFlags) + uri?.let { + activity.grantUriPermission( + activity.packageName, uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + ) + activity.contentResolver.takePersistableUriPermission(uri, takeFlags) - val dFile = DocumentFile.fromTreeUri(activity, uri) - val originalPath = dFile!!.uri.path!!.substring( - dFile.uri.path!!.lastIndexOf(":") + 1 - ) - - var path = "${activity.getExternalFilesDirs("")[1]}" - val separator: String = activity.getString(R.string.android_directory_seperator) - val sepPos = path.indexOf(separator) - if (sepPos != -1) { - path = path.substring(0, sepPos) + val dFile = DocumentFile.fromTreeUri(activity, uri) + if (dFile != null) { + val originalPath = dFile.uri.path!!.substring( + dFile.uri.path!!.lastIndexOf(":") + 1 + ) + val path = "${activity.getExternalFilesDirs("")[1]}" + return@getPathFromUri path.substringBefore(activity.getString(R.string.android_directory_seperator)) + .plus(File.separator).plus(originalPath) + } + activity.toast(activity.resources.getString(R.string.error_occurred), Toast.LENGTH_SHORT) + } ?: run { + activity.toast(activity.resources.getString(R.string.error_occurred), Toast.LENGTH_SHORT) } - return path + File.separator + originalPath + return null } } diff --git a/core/src/main/res/layout/select_folder_dialog.xml b/core/src/main/res/layout/select_folder_dialog.xml index 3e5a95598..4c4465322 100644 --- a/core/src/main/res/layout/select_folder_dialog.xml +++ b/core/src/main/res/layout/select_folder_dialog.xml @@ -24,7 +24,7 @@ Not allowed /Android Please select a folder for external storage. + System unable to grant permission! @string/on @string/off From 62202448f9c03fce62dfe31e6eef29d6b06c286f Mon Sep 17 00:00:00 2001 From: MohitMali Date: Thu, 21 Apr 2022 19:14:44 +0530 Subject: [PATCH 5/7] format fix lint issue --- .../java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 068b15ad4..894977225 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 @@ -253,7 +253,9 @@ object FileUtils { dFile.uri.path!!.lastIndexOf(":") + 1 ) val path = "${activity.getExternalFilesDirs("")[1]}" - return@getPathFromUri path.substringBefore(activity.getString(R.string.android_directory_seperator)) + return@getPathFromUri path.substringBefore( + activity.getString(R.string.android_directory_seperator) + ) .plus(File.separator).plus(originalPath) } activity.toast(activity.resources.getString(R.string.error_occurred), Toast.LENGTH_SHORT) From 2ed2843540241a95d251ff90b2bc78f4a8d5fc46 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Fri, 22 Apr 2022 12:14:44 +0530 Subject: [PATCH 6/7] Changes after review --- .../library/OnlineLibraryFragment.kt | 6 +++- app/src/main/res/values/strings.xml | 1 - core/build.gradle.kts | 1 - .../kiwixmobile/core/utils/files/FileUtils.kt | 36 ++++++++++++------- core/src/main/res/values/strings.xml | 2 +- 5 files changed, 29 insertions(+), 17 deletions(-) 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 a5733b081..b2b0c07f1 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 @@ -292,7 +292,11 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { getPathFromUri(requireActivity(), data)?.let(sharedPreferenceUtil::putPrefStorage) sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) } ?: run { - activity.toast(resources.getString(R.string.error_occurred), Toast.LENGTH_SHORT) + activity.toast( + resources + .getString(R.string.system_unable_to_grant_permission_message), + Toast.LENGTH_SHORT + ) } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8be9846c4..96761d289 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,5 +6,4 @@ Failed to open file\nPlease try looking for this file in the Device Tab of your Library Send Files Receive Files - System unable to grant permission! diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 58dec6613..b01ad950e 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { // SquiDB implementation(Libs.squidb) implementation(Libs.squidb_annotations) - implementation("androidx.documentfile:documentfile:1.0.1") add("kapt", Libs.squidb_processor) // Document File 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 894977225..81f6a117e 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 @@ -242,25 +242,35 @@ object FileUtils { or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) uri?.let { activity.grantUriPermission( - activity.packageName, uri, + activity.packageName, it, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) - activity.contentResolver.takePersistableUriPermission(uri, takeFlags) + activity.contentResolver.takePersistableUriPermission(it, takeFlags) - val dFile = DocumentFile.fromTreeUri(activity, uri) + val dFile = DocumentFile.fromTreeUri(activity, it) if (dFile != null) { - val originalPath = dFile.uri.path!!.substring( - dFile.uri.path!!.lastIndexOf(":") + 1 - ) - val path = "${activity.getExternalFilesDirs("")[1]}" - return@getPathFromUri path.substringBefore( - activity.getString(R.string.android_directory_seperator) - ) - .plus(File.separator).plus(originalPath) + dFile.uri.path?.let { file -> + val originalPath = file.substring( + file.lastIndexOf(":") + 1 + ) + val path = "${activity.getExternalFilesDirs("")[1]}" + return@getPathFromUri path.substringBefore( + activity.getString(R.string.android_directory_seperator) + ) + .plus(File.separator).plus(originalPath) + } } - activity.toast(activity.resources.getString(R.string.error_occurred), Toast.LENGTH_SHORT) + activity.toast( + activity.resources + .getString(R.string.system_unable_to_grant_permission_message), + Toast.LENGTH_SHORT + ) } ?: run { - activity.toast(activity.resources.getString(R.string.error_occurred), Toast.LENGTH_SHORT) + activity.toast( + activity.resources + .getString(R.string.system_unable_to_grant_permission_message), + Toast.LENGTH_SHORT + ) } return null } diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 3d08a9d49..9a3c61393 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -297,7 +297,7 @@ Not allowed /Android Please select a folder for external storage. - System unable to grant permission! + System unable to grant permission! @string/on @string/off From 7fc8e99b1cf22edaacce590d274e31e24ba8864d Mon Sep 17 00:00:00 2001 From: MohitMali Date: Mon, 25 Apr 2022 14:56:19 +0530 Subject: [PATCH 7/7] static analysis fix --- core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt index 975b60574..3376dbe4e 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/Constants.kt @@ -39,7 +39,6 @@ const val EXTRA_IS_WIDGET_VOICE = "isWidgetVoice" const val HOTSPOT_SERVICE_CHANNEL_ID = "hotspotService" const val OLD_PROVIDER_DOMAIN = "org.kiwix.zim.base" - // For Storage select dialog const val INTERNAL_SELECT_POSITION = 0 const val EXTERNAL_SELECT_POSITION = 1