From f80388402fc04179ea6c9136fb698c22481305b5 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Wed, 11 May 2022 20:29:55 +0530 Subject: [PATCH 1/7] adding write permission missing for android 10 --- .../nav/destination/library/LocalLibraryFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 c5790905c..6708c83f7 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 @@ -275,7 +275,10 @@ class LocalLibraryFragment : BaseFragment() { ) { context.toast(R.string.request_storage) requestPermissions( - arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), + arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ), REQUEST_STORAGE_PERMISSION ) } else { From e4476cb6c7709b880166cdc15625cb132dcdc602 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Thu, 12 May 2022 15:23:56 +0530 Subject: [PATCH 2/7] adding check for write permission --- .../library/OnlineLibraryFragment.kt | 81 ++++++++++++++----- 1 file changed, 59 insertions(+), 22 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 b2b0c07f1..1c5364863 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,9 +18,12 @@ package org.kiwix.kiwixmobile.nav.destination.library +import android.Manifest import android.annotation.SuppressLint import android.app.Activity import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.PackageManager.PERMISSION_GRANTED import android.net.ConnectivityManager import android.os.Build import android.os.Bundle @@ -35,6 +38,8 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -62,6 +67,7 @@ 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.REQUEST_STORAGE_PERMISSION import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.SimpleRecyclerViewScrollListener import org.kiwix.kiwixmobile.core.utils.SimpleTextListener @@ -108,6 +114,12 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { private val isNotConnected get() = conMan.activeNetworkInfo?.isConnected == false + private val isWriteStoragePermissionAllowed + get() = ContextCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED + override fun inject(baseActivity: BaseActivity) { baseActivity.cachedComponent.inject(this) } @@ -301,30 +313,55 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { } } + private fun requestExternalStoragePermission() { + ActivityCompat.requestPermissions( + requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), + REQUEST_STORAGE_PERMISSION + ) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_STORAGE_PERMISSION && + grantResults.isNotEmpty() && + grantResults[0] != PERMISSION_GRANTED + ) { + requestExternalStoragePermission() + } + } + private fun onBookItemClick(item: LibraryListItem.BookItem) { - when { - isNotConnected -> { - noInternetSnackbar() - return + if (isWriteStoragePermissionAllowed) { + when { + isNotConnected -> { + noInternetSnackbar() + return + } + noWifiWithWifiOnlyPreferenceSet -> { + dialogShower.show(WifiOnly, { + sharedPreferenceUtil.putPrefWifiOnly(false) + downloadFile(item.book) + }) + return + } + else -> availableSpaceCalculator.hasAvailableSpaceFor(item, + { downloadFile(item.book) }, + { + libraryList.snack( + getString(R.string.download_no_space) + + "\n" + getString(R.string.space_available) + " " + + it, + R.string.download_change_storage, + ::showStorageSelectDialog + ) + }) } - noWifiWithWifiOnlyPreferenceSet -> { - dialogShower.show(WifiOnly, { - sharedPreferenceUtil.putPrefWifiOnly(false) - downloadFile(item.book) - }) - return - } - else -> availableSpaceCalculator.hasAvailableSpaceFor(item, - { downloadFile(item.book) }, - { - libraryList.snack( - getString(R.string.download_no_space) + - "\n" + getString(R.string.space_available) + " " + - it, - R.string.download_change_storage, - ::showStorageSelectDialog - ) - }) + } else { + requestExternalStoragePermission() } } From 2ef2fdba15fca695f1b214ab60fdea28c0c60f4b Mon Sep 17 00:00:00 2001 From: MohitMali Date: Fri, 13 May 2022 10:31:47 +0530 Subject: [PATCH 3/7] Changes after review --- .../destination/library/OnlineLibraryFragment.kt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 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 1c5364863..db8d65671 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,7 +22,6 @@ import android.Manifest import android.annotation.SuppressLint import android.app.Activity import android.content.Intent -import android.content.pm.PackageManager import android.content.pm.PackageManager.PERMISSION_GRANTED import android.net.ConnectivityManager import android.os.Build @@ -114,12 +113,6 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { private val isNotConnected get() = conMan.activeNetworkInfo?.isConnected == false - private val isWriteStoragePermissionAllowed - get() = ContextCompat.checkSelfPermission( - requireActivity(), - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) == PackageManager.PERMISSION_GRANTED - override fun inject(baseActivity: BaseActivity) { baseActivity.cachedComponent.inject(this) } @@ -330,12 +323,16 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { grantResults.isNotEmpty() && grantResults[0] != PERMISSION_GRANTED ) { + context.toast(R.string.request_storage) requestExternalStoragePermission() } } + private fun hasPermission(permission: String): Boolean = + ContextCompat.checkSelfPermission(requireActivity(), permission) == PERMISSION_GRANTED + private fun onBookItemClick(item: LibraryListItem.BookItem) { - if (isWriteStoragePermissionAllowed) { + if (hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { when { isNotConnected -> { noInternetSnackbar() From 03c691373b66862ef55ca20901172674fd893fa1 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Fri, 13 May 2022 12:03:02 +0530 Subject: [PATCH 4/7] Changes after review --- .../nav/destination/library/OnlineLibraryFragment.kt | 2 +- core/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 db8d65671..8a209266a 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 @@ -323,7 +323,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { grantResults.isNotEmpty() && grantResults[0] != PERMISSION_GRANTED ) { - context.toast(R.string.request_storage) + context.toast(R.string.request_write_storage) requestExternalStoragePermission() } } diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index c91e0fd57..db9001289 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -64,6 +64,7 @@ Could not find an installed application for this type of file No Content Headers Found To access offline content we need access to your storage + To download zim files we need write access to your storage Are you sure you want to delete your search history and reset all active tabs? Delete this item? Clear history From 0a0cf213ac6220626c8bcceec2b97d90b1b8d3f4 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Fri, 13 May 2022 17:25:03 +0530 Subject: [PATCH 5/7] Changes after review --- .../library/OnlineLibraryFragment.kt | 28 +++++++++++++++---- .../core/utils/dialog/KiwixDialog.kt | 7 +++++ 2 files changed, 30 insertions(+), 5 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 8a209266a..e93ca1142 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 @@ -19,6 +19,7 @@ package org.kiwix.kiwixmobile.nav.destination.library import android.Manifest +import android.Manifest.permission.WRITE_EXTERNAL_STORAGE import android.annotation.SuppressLint import android.app.Activity import android.content.Intent @@ -70,6 +71,7 @@ import org.kiwix.kiwixmobile.core.utils.REQUEST_STORAGE_PERMISSION import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.SimpleRecyclerViewScrollListener import org.kiwix.kiwixmobile.core.utils.SimpleTextListener +import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower 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 @@ -88,6 +90,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { @Inject lateinit var conMan: ConnectivityManager @Inject lateinit var downloader: Downloader @Inject lateinit var dialogShower: DialogShower + @Inject lateinit var alertDialogShower: AlertDialogShower @Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject lateinit var bookUtils: BookUtils @@ -306,6 +309,21 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { } } + private fun checkExternalStorageWritePermission(): Boolean { + return hasPermission(WRITE_EXTERNAL_STORAGE).also { permissionGranted -> + if (!permissionGranted) { + if (shouldShowRationale(WRITE_EXTERNAL_STORAGE)) { + alertDialogShower.show( + KiwixDialog.WriteStoragePermissionRationale, + ::requestExternalStoragePermission + ) + } else { + requestExternalStoragePermission() + } + } + } + } + private fun requestExternalStoragePermission() { ActivityCompat.requestPermissions( requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), @@ -313,6 +331,9 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ) } + private fun shouldShowRationale(writeExternalStorage: String) = + ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), writeExternalStorage) + override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, @@ -323,8 +344,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { grantResults.isNotEmpty() && grantResults[0] != PERMISSION_GRANTED ) { - context.toast(R.string.request_write_storage) - requestExternalStoragePermission() + checkExternalStorageWritePermission() } } @@ -332,7 +352,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ContextCompat.checkSelfPermission(requireActivity(), permission) == PERMISSION_GRANTED private fun onBookItemClick(item: LibraryListItem.BookItem) { - if (hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + if (checkExternalStorageWritePermission()) { when { isNotConnected -> { noInternetSnackbar() @@ -357,8 +377,6 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ) }) } - } else { - requestExternalStoragePermission() } } 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 c774b3401..f01df81c0 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 @@ -61,6 +61,13 @@ sealed class KiwixDialog( android.R.string.cancel ) + object WriteStoragePermissionRationale : KiwixDialog( + null, + R.string.request_write_storage, + android.R.string.yes, + android.R.string.cancel + ) + object EnableWifiP2pServices : KiwixDialog( null, R.string.request_enable_wifi, R.string.yes, android.R.string.no ) From 45f8b39ded26738c6cddbb7d7d3f8f5121643865 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Sat, 14 May 2022 10:42:46 +0530 Subject: [PATCH 6/7] Changes after review --- .../library/OnlineLibraryFragment.kt | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 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 e93ca1142..6b1e20fdb 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 @@ -25,6 +25,7 @@ import android.app.Activity import android.content.Intent import android.content.pm.PackageManager.PERMISSION_GRANTED import android.net.ConnectivityManager +import android.net.Uri import android.os.Build import android.os.Bundle import android.provider.Settings @@ -318,12 +319,24 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ::requestExternalStoragePermission ) } else { - requestExternalStoragePermission() + alertDialogShower.show( + KiwixDialog.WriteStoragePermissionRationale, + ::openAppSettings + ) } } } } + private fun openAppSettings() { + val uri: Uri = Uri.fromParts("package", requireActivity().packageName, null) + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + data = uri + } + startActivity(intent) + } + private fun requestExternalStoragePermission() { ActivityCompat.requestPermissions( requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), @@ -342,9 +355,11 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_STORAGE_PERMISSION && grantResults.isNotEmpty() && - grantResults[0] != PERMISSION_GRANTED + permissions[0] == Manifest.permission.WRITE_EXTERNAL_STORAGE ) { - checkExternalStorageWritePermission() + if (grantResults[0] != PERMISSION_GRANTED) { + checkExternalStorageWritePermission() + } } } From 09e11473600de85519013d865caa1d718de7872e Mon Sep 17 00:00:00 2001 From: MohitMali Date: Mon, 16 May 2022 18:39:43 +0530 Subject: [PATCH 7/7] changes permission check --- .../nav/destination/library/OnlineLibraryFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6b1e20fdb..c2339222b 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 @@ -354,7 +354,7 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_STORAGE_PERMISSION && - grantResults.isNotEmpty() && + permissions.isNotEmpty() && permissions[0] == Manifest.permission.WRITE_EXTERNAL_STORAGE ) { if (grantResults[0] != PERMISSION_GRANTED) {