diff options
author | Allan Wang <me@allanwang.ca> | 2019-05-21 20:26:17 -0700 |
---|---|---|
committer | Allan Wang <me@allanwang.ca> | 2019-05-21 20:26:17 -0700 |
commit | b787e49a5f8f97a2b330d4503ceb66056ef9ccd7 (patch) | |
tree | e6ed8065053c6b9bbb2aa6c819ae3209760e1982 /core/src/main/kotlin/ca | |
parent | a9abc039c4684b3923c9162d86551e280ab342da (diff) | |
download | kau-b787e49a5f8f97a2b330d4503ceb66056ef9ccd7.tar.gz kau-b787e49a5f8f97a2b330d4503ceb66056ef9ccd7.tar.bz2 kau-b787e49a5f8f97a2b330d4503ceb66056ef9ccd7.zip |
Remove pending flag
Diffstat (limited to 'core/src/main/kotlin/ca')
-rw-r--r-- | core/src/main/kotlin/ca/allanwang/kau/kotlin/Streams.kt | 1 | ||||
-rw-r--r-- | core/src/main/kotlin/ca/allanwang/kau/permissions/PermissionManager.kt | 34 |
2 files changed, 13 insertions, 22 deletions
diff --git a/core/src/main/kotlin/ca/allanwang/kau/kotlin/Streams.kt b/core/src/main/kotlin/ca/allanwang/kau/kotlin/Streams.kt index bfa73fd..65d15a7 100644 --- a/core/src/main/kotlin/ca/allanwang/kau/kotlin/Streams.kt +++ b/core/src/main/kotlin/ca/allanwang/kau/kotlin/Streams.kt @@ -24,7 +24,6 @@ package ca.allanwang.kau.kotlin * Since we don't have access to the internals of our extended class, * We will simply iterate and remove when the filter returns {@code false} */ -@Synchronized inline fun <T, C : MutableIterable<T>> C.kauRemoveIf(filter: (item: T) -> Boolean): C { val iter = iterator() while (iter.hasNext()) diff --git a/core/src/main/kotlin/ca/allanwang/kau/permissions/PermissionManager.kt b/core/src/main/kotlin/ca/allanwang/kau/permissions/PermissionManager.kt index 669f32e..769a9fb 100644 --- a/core/src/main/kotlin/ca/allanwang/kau/permissions/PermissionManager.kt +++ b/core/src/main/kotlin/ca/allanwang/kau/permissions/PermissionManager.kt @@ -19,6 +19,7 @@ import android.app.Activity import android.content.Context import android.content.pm.PackageManager import androidx.core.app.ActivityCompat +import ca.allanwang.kau.kotlin.kauRemoveIf import ca.allanwang.kau.kotlin.lazyContext import ca.allanwang.kau.logging.KL import ca.allanwang.kau.utils.KauException @@ -35,7 +36,6 @@ import java.lang.ref.WeakReference */ internal object PermissionManager { - private var requestInProgress = false private val pendingResults = mutableListOf<WeakReference<PermissionResult>>() /** @@ -60,13 +60,13 @@ internal object PermissionManager { val missingPermissions = permissions.filter { !context.hasPermission(it) } if (missingPermissions.isEmpty()) return callback(true, null) pendingResults.add(WeakReference(PermissionResult(permissions, callback = callback))) - if (!requestInProgress) { - requestInProgress = true + if (pendingResults.size == 1) { requestPermissions(context, missingPermissions.toTypedArray()) - } else KL.d { "Request is postponed since another one is still in progress; did you remember to override onRequestPermissionsResult?" } + } else { + KL.d { "Request is postponed since another one is still in progress; did you remember to override onRequestPermissionsResult?" } + } } - @Synchronized private fun requestPermissions(context: Context, permissions: Array<out String>) { permissions.forEach { if (!manifestPermission(context).contains(it)) { @@ -88,23 +88,15 @@ internal object PermissionManager { fun onRequestPermissionsResult(context: Context, permissions: Array<out String>, grantResults: IntArray) { KL.i { "On permission result: pending ${pendingResults.size}" } val count = Math.min(permissions.size, grantResults.size) - val iter = pendingResults.iterator() - while (iter.hasNext()) { - val action = iter.next().get() - if ((0 until count).any { action?.onResult(permissions[it], grantResults[it]) != false }) - iter.remove() + pendingResults.kauRemoveIf { + val action = it.get() + action == null || (0 until count).any { i -> action.onResult(permissions[i], grantResults[i]) } } - if (pendingResults.isEmpty()) - requestInProgress = false - else { - val action = pendingResults.map { it.get() }.firstOrNull { it != null } - if (action == null) { //actions have been unlinked from their weak references - pendingResults.clear() - requestInProgress = false - return - } - requestPermissions(context, action.permissions.toTypedArray()) + val action = pendingResults.asSequence().map { it.get() }.firstOrNull { it != null } + if (action == null) { //actions have been unlinked from their weak references + pendingResults.clear() + return } - KL.i { "Post on permission result: pending ${pendingResults.size}" } + requestPermissions(context, action.permissions.toTypedArray()) } } |