Commit 10bc3cea by Maurits van Beusekom

Make sure you cannot run multiple permission requests at the same time

parent a07f2ca6
...@@ -10,6 +10,8 @@ import Foundation ...@@ -10,6 +10,8 @@ import Foundation
import UIKit import UIKit
import Swift import Swift
typealias PermissionRequestCompletion = (_ permissionRequestResults: [PermissionGroup:PermissionStatus]) -> ()
class PermissionManager: NSObject { class PermissionManager: NSObject {
private var _strategyInstances: [ObjectIdentifier: PermissionStrategy] = [:] private var _strategyInstances: [ObjectIdentifier: PermissionStrategy] = [:]
...@@ -20,7 +22,7 @@ class PermissionManager: NSObject { ...@@ -20,7 +22,7 @@ class PermissionManager: NSObject {
result(Codec.encodePermissionStatus(permissionStatus: permissionStatus)) result(Codec.encodePermissionStatus(permissionStatus: permissionStatus))
} }
func requestPermission(permissions: [PermissionGroup], result: @escaping FlutterResult) { func requestPermissions(permissions: [PermissionGroup], completion: @escaping PermissionRequestCompletion) {
var requestQueue = Set(permissions.map { $0 }) var requestQueue = Set(permissions.map { $0 })
var permissionStatusResult: [PermissionGroup: PermissionStatus] = [:] var permissionStatusResult: [PermissionGroup: PermissionStatus] = [:]
...@@ -35,7 +37,7 @@ class PermissionManager: NSObject { ...@@ -35,7 +37,7 @@ class PermissionManager: NSObject {
self._strategyInstances.removeValue(forKey: ObjectIdentifier(permissionStrategy as AnyObject)) self._strategyInstances.removeValue(forKey: ObjectIdentifier(permissionStrategy as AnyObject))
if requestQueue.count == 0 { if requestQueue.count == 0 {
result(Codec.encodePermissionRequestResult(permissionStatusResult: permissionStatusResult)) completion(permissionStatusResult)
return return
} }
} }
......
...@@ -10,6 +10,7 @@ import UIKit ...@@ -10,6 +10,7 @@ import UIKit
public class SwiftPermissionHandlerPlugin: NSObject, FlutterPlugin { public class SwiftPermissionHandlerPlugin: NSObject, FlutterPlugin {
private static let METHOD_CHANNEL_NAME = "flutter.baseflow.com/permissions/methods"; private static let METHOD_CHANNEL_NAME = "flutter.baseflow.com/permissions/methods";
private let _permissionManager: PermissionManager = PermissionManager() private let _permissionManager: PermissionManager = PermissionManager()
private var _methodResult: FlutterResult?
public static func register(with registrar: FlutterPluginRegistrar) { public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: METHOD_CHANNEL_NAME, binaryMessenger: registrar.messenger()) let channel = FlutterMethodChannel(name: METHOD_CHANNEL_NAME, binaryMessenger: registrar.messenger())
...@@ -25,11 +26,25 @@ public class SwiftPermissionHandlerPlugin: NSObject, FlutterPlugin { ...@@ -25,11 +26,25 @@ public class SwiftPermissionHandlerPlugin: NSObject, FlutterPlugin {
permission: permission, permission: permission,
result: result) result: result)
} else if call.method == "requestPermissions" { } else if call.method == "requestPermissions" {
if _methodResult != nil {
result(FlutterError(
code: "ERROR_ALREADY_REQUESTING_PERMISSIONS",
message: "A request for permissions is already running, please wait for it to finish before doing another request (note that you can request multiple permissions at the same time).",
details: nil))
}
_methodResult = result
let permissions: [PermissionGroup] = Codec.decodePermissionGroups(from: call.arguments) let permissions: [PermissionGroup] = Codec.decodePermissionGroups(from: call.arguments)
_permissionManager.requestPermission( _permissionManager.requestPermissions(permissions: permissions) {
permissions: permissions, (permissionRequestResults: [PermissionGroup:PermissionStatus]) in
result: result)
if self._methodResult != nil {
self._methodResult!(Codec.encodePermissionRequestResult(permissionStatusResult: permissionRequestResults))
}
self._methodResult = nil
}
} else if call.method == "shouldShowRequestPermissionRationale" { } else if call.method == "shouldShowRequestPermissionRationale" {
result(false) result(false)
} else if call.method == "openAppSettings" { } else if call.method == "openAppSettings" {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment