Skip to content

Commit

Permalink
Remove Dexter
Browse files Browse the repository at this point in the history
  • Loading branch information
anggrayudi committed Jul 14, 2021
1 parent 1219672 commit f652af4
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 42 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ buildscript {

addRepos(repositories)

ext.kotlin_version = '1.5.20'
ext.kotlin_version = '1.5.21'

dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
Expand Down
1 change: 0 additions & 1 deletion storage/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ dependencies {
api deps.core_ktx
api deps.fragment
api deps.documentfile
api deps.dexter
api deps.coroutines.core
api deps.coroutines.android
implementation deps.timber
Expand Down
85 changes: 58 additions & 27 deletions storage/src/main/java/com/anggrayudi/storage/SimpleStorageHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ import com.anggrayudi.storage.callback.FolderPickerCallback
import com.anggrayudi.storage.callback.StorageAccessCallback
import com.anggrayudi.storage.file.StorageType
import com.anggrayudi.storage.file.getAbsolutePath
import com.karumi.dexter.Dexter
import com.karumi.dexter.MultiplePermissionsReport
import com.karumi.dexter.listener.multi.BaseMultiplePermissionsListener
import com.anggrayudi.storage.permission.*

/**
* Helper class to ease you using file & folder picker.
Expand All @@ -30,28 +28,42 @@ import com.karumi.dexter.listener.multi.BaseMultiplePermissionsListener
class SimpleStorageHelper {

val storage: SimpleStorage
private val permissionRequest: PermissionRequest

private var originalRequestCode = 0
private var pickerToOpenOnceGranted = 0
private var filterMimeTypes: Set<String>? = null
private var onPermissionsResult: ((Boolean) -> Unit)? = null

// For unknown Activity type
@JvmOverloads
constructor(activity: Activity, savedState: Bundle? = null) {
constructor(activity: Activity, requestCodeForPermissionDialog: Int, savedState: Bundle? = null) {
storage = SimpleStorage(activity)
init(savedState)
permissionRequest = ActivityPermissionRequest.Builder(activity, requestCodeForPermissionDialog)
.withPermissions(*rwPermission)
.withCallback(permissionCallback)
.build()
}

@JvmOverloads
constructor(activity: ComponentActivity, savedState: Bundle? = null) {
storage = SimpleStorage(activity)
init(savedState)
permissionRequest = ActivityPermissionRequest.Builder(activity)
.withPermissions(*rwPermission)
.withCallback(permissionCallback)
.build()
}

@JvmOverloads
constructor(fragment: Fragment, savedState: Bundle? = null) {
storage = SimpleStorage(fragment)
init(savedState)
permissionRequest = FragmentPermissionRequest.Builder(fragment)
.withPermissions(*rwPermission)
.withCallback(permissionCallback)
.build()
}

var onStorageAccessGranted: ((requestCode: Int, root: DocumentFile) -> Unit)? = null
Expand Down Expand Up @@ -119,7 +131,7 @@ class SimpleStorageHelper {
}

override fun onStoragePermissionDenied(requestCode: Int) {
requestStoragePermission(storage.context) { if (it) storage.openFolderPicker() else reset() }
requestStoragePermission { if (it) storage.openFolderPicker() else reset() }
}

override fun onCanceledByUser(requestCode: Int) {
Expand Down Expand Up @@ -152,7 +164,7 @@ class SimpleStorageHelper {
}

override fun onStoragePermissionDenied(requestCode: Int) {
requestStoragePermission(storage.context) { if (it) storage.openFolderPicker() else reset() }
requestStoragePermission { if (it) storage.openFolderPicker() else reset() }
}

override fun onCanceledByUser(requestCode: Int) {
Expand All @@ -166,7 +178,7 @@ class SimpleStorageHelper {

storage.filePickerCallback = object : FilePickerCallback {
override fun onStoragePermissionDenied(requestCode: Int, file: DocumentFile?) {
requestStoragePermission(storage.context) { if (it) storage.openFilePicker() else reset() }
requestStoragePermission { if (it) storage.openFilePicker() else reset() }
}

override fun onFileSelected(requestCode: Int, file: DocumentFile) {
Expand Down Expand Up @@ -199,6 +211,45 @@ class SimpleStorageHelper {
}
}

private fun requestStoragePermission(onResult: (Boolean) -> Unit) {
onPermissionsResult = onResult
permissionRequest.check()
}

/**
* Mandatory for [Activity], but not for [Fragment] and [ComponentActivity]
*/
fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
if (permissionRequest is ActivityPermissionRequest) {
permissionRequest.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}

private val permissionCallback: PermissionCallback
get() = object : PermissionCallback {
override fun onPermissionsChecked(result: PermissionResult, fromSystemDialog: Boolean) {
val granted = result.areAllPermissionsGranted
if (!granted) {
Toast.makeText(storage.context, R.string.ss_please_grant_storage_permission, Toast.LENGTH_SHORT).show()
}
onPermissionsResult?.invoke(granted)
onPermissionsResult = null
}

override fun onShouldRedirectToSystemSettings(blockedPermissions: List<PermissionReport>) {
redirectToSystemSettings(storage.context)
onPermissionsResult?.invoke(false)
onPermissionsResult = null
}
}

private val rwPermission: Array<String>
get() = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)

private fun reset() {
pickerToOpenOnceGranted = 0
originalRequestCode = 0
Expand Down Expand Up @@ -267,26 +318,6 @@ class SimpleStorageHelper {
private const val KEY_ORIGINAL_REQUEST_CODE = BuildConfig.LIBRARY_PACKAGE_NAME + ".originalRequestCode"
private const val KEY_FILTER_MIME_TYPES = BuildConfig.LIBRARY_PACKAGE_NAME + ".filterMimeTypes"

@JvmStatic
fun requestStoragePermission(context: Context, onPermissionsResult: (Boolean) -> Unit) {
Dexter.withContext(context)
.withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(object : BaseMultiplePermissionsListener() {
override fun onPermissionsChecked(report: MultiplePermissionsReport) {
if (report.isAnyPermissionPermanentlyDenied) {
redirectToSystemSettings(context)
onPermissionsResult(false)
return
}
val granted = report.areAllPermissionsGranted()
if (!granted) {
Toast.makeText(context, R.string.ss_please_grant_storage_permission, Toast.LENGTH_SHORT).show()
}
onPermissionsResult(granted)
}
}).check()
}

@JvmStatic
fun redirectToSystemSettings(context: Context) {
AlertDialog.Builder(context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@ import androidx.activity.ComponentActivity
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.karumi.dexter.Dexter

/**
* [Dexter] cannot display consent dialog before requesting runtime permissions, thus we create our own permission request handler.
*
* Created on 12/13/20
* @author Anggrayudi H
*/
Expand All @@ -25,11 +22,11 @@ class ActivityPermissionRequest private constructor(
onRequestPermissionsResult(it)
} else null

fun check() = apply {
override fun check() {
permissions.forEach {
if (ContextCompat.checkSelfPermission(activity, it) != PackageManager.PERMISSION_GRANTED) {
callback.onDisplayConsentDialog(this@ActivityPermissionRequest)
return@apply
return
}
}
callback.onPermissionsChecked(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@ import androidx.core.app.ActivityCompat
import androidx.core.app.ActivityOptionsCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.karumi.dexter.Dexter

/**
* [Dexter] cannot display consent dialog before requesting runtime permissions, thus we create our own permission request handler.
*
* Created on 12/13/20
* @author Anggrayudi H
*/
Expand All @@ -25,12 +22,12 @@ class FragmentPermissionRequest private constructor(
onRequestPermissionsResult(it)
}

fun check() = apply {
override fun check() {
val context = fragment.requireContext()
permissions.forEach {
if (ContextCompat.checkSelfPermission(context, it) != PackageManager.PERMISSION_GRANTED) {
callback.onDisplayConsentDialog(this@FragmentPermissionRequest)
return@apply
return
}
}
callback.onPermissionsChecked(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ package com.anggrayudi.storage.permission
*/
interface PermissionRequest {

fun check()

fun continueToPermissionRequest()
}
4 changes: 1 addition & 3 deletions versions.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ versions.atsl_rules = "1.2.0"
versions.atsl_runner = "1.2.0"
versions.core_ktx = "1.3.2"
versions.coroutines = "1.4.3"
versions.dexter = "6.2.2"
versions.documentfile = "1.0.1"
versions.espresso = "3.3.0"
versions.fragment = "1.3.5"
Expand All @@ -31,7 +30,7 @@ def deps = [:]
// Google -------------------------------
deps.activity = "androidx.activity:activity:$versions.activity"
deps.appcompat = "androidx.appcompat:appcompat:$versions.appcompat"
deps.fragment = "androidx.fragment:fragment-ktx:$versions.fragment"
deps.fragment = "androidx.fragment:fragment:$versions.fragment"
deps.core_ktx = "androidx.core:core-ktx:$versions.core_ktx"
deps.multidex = "androidx.multidex:multidex:$versions.multidex"
deps.documentfile = "androidx.documentfile:documentfile:$versions.documentfile"
Expand All @@ -56,7 +55,6 @@ deps.robolectric = "org.robolectric:robolectric:$versions.robolectric"
deps.mockk = "io.mockk:mockk:$versions.mockk"

// Others -------------------------------
deps.dexter = "com.karumi:dexter:$versions.dexter"
deps.material_dialogs = "com.afollestad.material-dialogs:core:$versions.material_dialogs"
deps.material_progressbar = "me.zhanghai.android.materialprogressbar:library:$versions.material_progressbar"
deps.timber = "com.jakewharton.timber:timber:$versions.timber"
Expand Down

0 comments on commit f652af4

Please sign in to comment.