Commit a8764e7c by Maurits van Beusekom

fix merge conflict

parents 532443bc 8f856f8b
...@@ -220,10 +220,14 @@ class PermissionHandlerPlugin(private val registrar: Registrar, private var requ ...@@ -220,10 +220,14 @@ class PermissionHandlerPlugin(private val registrar: Registrar, private var requ
} }
} }
ActivityCompat.requestPermissions( if (permissionsToRequest.count() > 0) {
registrar.activity(), ActivityCompat.requestPermissions(
permissionsToRequest.toTypedArray(), registrar.activity(),
permissionCode) permissionsToRequest.toTypedArray(),
permissionCode)
} else if (mRequestResults.count() > 0) {
processResult()
}
} }
private fun handlePermissionsRequest(permissions: Array<String>, grantResults: IntArray) { private fun handlePermissionsRequest(permissions: Array<String>, grantResults: IntArray) {
......
...@@ -6,8 +6,28 @@ ...@@ -6,8 +6,28 @@
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.
--> -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_CALENDAR"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SENSORS" />
<uses-permission android:name="android.permission.BODY_SENSORS" />
<!-- io.flutter.app.FlutterApplication is an android.app.Application that <!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method. calls FlutterMain.startInitialization(this); in its onCreate method.
......
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:permission_handler/permission_enums.dart'; import 'package:permission_handler/permission_enums.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
...@@ -5,20 +7,40 @@ import 'package:permission_handler/permission_handler.dart'; ...@@ -5,20 +7,40 @@ import 'package:permission_handler/permission_handler.dart';
void main() => runApp(new MyApp()); void main() => runApp(new MyApp());
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new MaterialApp( return new MaterialApp(
home: new Scaffold( home: new Scaffold(
appBar: new AppBar( appBar: new AppBar(
title: const Text('Plugin example app'), title: const Text('Plugin example app'),
), actions: <Widget>[
body: new Center( IconButton(
child: new ListView( icon: const Icon(Icons.settings),
onPressed: () {
PermissionHandler.openAppSettings();
},
)
],
),
body: new Center(
child: new ListView(
children: PermissionGroup.values children: PermissionGroup.values
.where((PermissionGroup permission) => permission != PermissionGroup.unknown) .where((PermissionGroup permission) {
.map((PermissionGroup permission) => new PermissionWidget(permission)).toList() if (Platform.isIOS) {
), return permission != PermissionGroup.unknown &&
permission != PermissionGroup.phone &&
permission != PermissionGroup.sms &&
permission != PermissionGroup.storage;
} else {
return permission != PermissionGroup.unknown &&
permission != PermissionGroup.mediaLibrary &&
permission != PermissionGroup.photos &&
permission != PermissionGroup.reminders;
}
})
.map((PermissionGroup permission) =>
new PermissionWidget(permission))
.toList()),
), ),
)); ));
} }
...@@ -38,7 +60,7 @@ class _PermissionState extends State<PermissionWidget> { ...@@ -38,7 +60,7 @@ class _PermissionState extends State<PermissionWidget> {
PermissionStatus _permissionStatus = PermissionStatus.unknown; PermissionStatus _permissionStatus = PermissionStatus.unknown;
_PermissionState(this._permissionGroup); _PermissionState(this._permissionGroup);
@override @override
void initState() { void initState() {
super.initState(); super.initState();
...@@ -47,15 +69,46 @@ class _PermissionState extends State<PermissionWidget> { ...@@ -47,15 +69,46 @@ class _PermissionState extends State<PermissionWidget> {
} }
void _listenForPermissionStatus() async { void _listenForPermissionStatus() async {
print(_permissionGroup.toString()); final PermissionStatus status =
_permissionStatus = await PermissionHandler.checkPermissionStatus(_permissionGroup); await PermissionHandler.checkPermissionStatus(_permissionGroup);
setState(() {
_permissionStatus = status;
});
}
Color getPermissionColor() {
switch (_permissionStatus) {
case PermissionStatus.denied:
return Colors.red;
case PermissionStatus.granted:
return Colors.green;
default:
return Colors.grey;
}
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new ListTile( return new ListTile(
title: new Text(_permissionGroup.toString()), title: new Text(_permissionGroup.toString()),
subtitle: new Text(_permissionStatus.toString()), subtitle: new Text(
_permissionStatus.toString(),
style: new TextStyle(color: getPermissionColor()),
),
onTap: () async {
requestPermission(_permissionGroup);
},
); );
} }
}
\ No newline at end of file void requestPermission(PermissionGroup permission) async {
final List<PermissionGroup> permissions = <PermissionGroup>[permission];
final Map<PermissionGroup, PermissionStatus> permissionRequestResult =
await PermissionHandler.requestPermissions(permissions);
setState(() {
_permissionStatus = permissionRequestResult[permission];
});
}
}
...@@ -8,41 +8,36 @@ ...@@ -8,41 +8,36 @@
import Flutter import Flutter
import Foundation import Foundation
import UIKit import UIKit
import Swift
class PermissionManager: NSObject { class PermissionManager: NSObject {
private var _strategyInstances: [ObjectIdentifier: PermissionStrategy] = [:]
static func checkPermissionStatus(permission: PermissionGroup, result: @escaping FlutterResult) { static func checkPermissionStatus(permission: PermissionGroup, result: @escaping FlutterResult) {
let permissionStrategy = PermissionManager.createPermissionStrategy(permission: permission) let permissionStrategy = PermissionManager.createPermissionStrategy(permission: permission)
let permissionStatus = permissionStrategy?.checkPermissionStatus(permission: permission) ?? PermissionStatus.unknown let permissionStatus = permissionStrategy.checkPermissionStatus(permission: permission)
result(Codec.encodePermissionStatus(permissionStatus: permissionStatus)) result(Codec.encodePermissionStatus(permissionStatus: permissionStatus))
} }
static func requestPermission(permissions: [PermissionGroup], result: @escaping FlutterResult) { func requestPermission(permissions: [PermissionGroup], result: @escaping FlutterResult) {
var requestQueue = Set(permissions.map { $0 }) var requestQueue = Set(permissions.map { $0 })
var permissionStatusResult: [PermissionGroup: PermissionStatus] = [:] var permissionStatusResult: [PermissionGroup: PermissionStatus] = [:]
for permission in permissions { for permission in permissions {
let permissionStrategy = PermissionManager.createPermissionStrategy(permission: permission) let permissionStrategy = PermissionManager.createPermissionStrategy(permission: permission)
let identifier = ObjectIdentifier(permissionStrategy as AnyObject)
if permissionStrategy == nil { _strategyInstances[identifier] = permissionStrategy
permissionStatusResult[permission] = PermissionStatus.unknown
permissionStrategy.requestPermission(permission: permission) { (permissionStatus: PermissionStatus) in
permissionStatusResult[permission] = permissionStatus
requestQueue.remove(permission) requestQueue.remove(permission)
self._strategyInstances.removeValue(forKey: ObjectIdentifier(permissionStrategy as AnyObject))
if requestQueue.count == 0 { if requestQueue.count == 0 {
result(Codec.encodePermissionRequestResult(permissionStatusResult: permissionStatusResult)) result(Codec.encodePermissionRequestResult(permissionStatusResult: permissionStatusResult))
return return
} }
} else {
permissionStrategy!.requestPermission(permission: permission) { (permissionStatus: PermissionStatus) in
permissionStatusResult[permission] = permissionStatus
requestQueue.remove(permission)
if requestQueue.count == 0 {
result(Codec.encodePermissionRequestResult(permissionStatusResult: permissionStatusResult))
return
}
}
} }
} }
} }
...@@ -63,7 +58,7 @@ class PermissionManager: NSObject { ...@@ -63,7 +58,7 @@ class PermissionManager: NSObject {
result(false) result(false)
} }
private static func createPermissionStrategy(permission: PermissionGroup) -> PermissionStrategy? { private static func createPermissionStrategy(permission: PermissionGroup) -> PermissionStrategy {
switch permission { switch permission {
case PermissionGroup.calendar: case PermissionGroup.calendar:
return EventPermissionStrategy() return EventPermissionStrategy()
...@@ -88,7 +83,7 @@ class PermissionManager: NSObject { ...@@ -88,7 +83,7 @@ class PermissionManager: NSObject {
case PermissionGroup.speech: case PermissionGroup.speech:
return SpeechPermissionStrategy() return SpeechPermissionStrategy()
default: default:
return nil return UnknownPermissionStrategy()
} }
} }
} }
...@@ -9,6 +9,7 @@ import UIKit ...@@ -9,6 +9,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()
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())
...@@ -18,15 +19,17 @@ public class SwiftPermissionHandlerPlugin: NSObject, FlutterPlugin { ...@@ -18,15 +19,17 @@ public class SwiftPermissionHandlerPlugin: NSObject, FlutterPlugin {
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
if call.method == "checkPermissionStatus" { if call.method == "checkPermissionStatus" {
let permission: PermissionGroup = Codec.decodePermissionGroup(from: call.arguments)
PermissionManager.checkPermissionStatus( PermissionManager.checkPermissionStatus(
permission: Codec.decodePermissionGroup( permission: permission,
from: call.arguments), result: result)
result: result)
} else if call.method == "requestPermissions" { } else if call.method == "requestPermissions" {
PermissionManager.requestPermission( let permissions: [PermissionGroup] = Codec.decodePermissionGroups(from: call.arguments)
permissions: Codec.decodePermissionGroups(
from: call.arguments), _permissionManager.requestPermission(
result: result) permissions: permissions,
result: result)
} else if call.method == "shouldShowRequestPermissionRationale" { } else if call.method == "shouldShowRequestPermissionRationale" {
result(false) result(false)
} else if call.method == "openAppSettings" { } else if call.method == "openAppSettings" {
......
...@@ -9,6 +9,7 @@ import CoreLocation ...@@ -9,6 +9,7 @@ import CoreLocation
import Foundation import Foundation
class LocationPermissionStrategy : NSObject, PermissionStrategy, CLLocationManagerDelegate { class LocationPermissionStrategy : NSObject, PermissionStrategy, CLLocationManagerDelegate {
private var _locationManager: CLLocationManager? = nil
private var _permissionStatusHandler: PermissionStatusHandler? = nil private var _permissionStatusHandler: PermissionStatusHandler? = nil
private var _requestedPermission: PermissionGroup? = nil private var _requestedPermission: PermissionGroup? = nil
...@@ -40,26 +41,29 @@ class LocationPermissionStrategy : NSObject, PermissionStrategy, CLLocationManag ...@@ -40,26 +41,29 @@ class LocationPermissionStrategy : NSObject, PermissionStrategy, CLLocationManag
_permissionStatusHandler = completionHandler _permissionStatusHandler = completionHandler
_requestedPermission = permission _requestedPermission = permission
let locationManager = CLLocationManager.init()
locationManager.delegate = self
if(permission != PermissionGroup.location) { if(_locationManager == nil) {
if (Bundle.main.object(forInfoDictionaryKey: "NSLocationWhenInUseUsageDescription") != nil) { _locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization() _locationManager!.delegate = self
} else if (Bundle.main.object(forInfoDictionaryKey: "NSLocationAlwaysUsageDescription") != nil) { }
locationManager.requestAlwaysAuthorization();
if(permission == PermissionGroup.location) {
if (Bundle.main.object(forInfoDictionaryKey: "NSLocationAlwaysUsageDescription") != nil) {
_locationManager!.requestAlwaysAuthorization()
} else if (Bundle.main.object(forInfoDictionaryKey: "NSLocationWhenInUseUsageDescription") != nil) {
_locationManager!.requestWhenInUseAuthorization();
} else { } else {
NSException(name: NSExceptionName.internalInconsistencyException, reason:"To use location in iOS8 you need to define either NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription in the app bundle's Info.plist file", userInfo: nil).raise() NSException(name: NSExceptionName.internalInconsistencyException, reason:"To use location in iOS8 you need to define either NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription in the app bundle's Info.plist file", userInfo: nil).raise()
} }
} else if permission == PermissionGroup.locationAlways { } else if permission == PermissionGroup.locationAlways {
if (Bundle.main.object(forInfoDictionaryKey: "NSLocationAlwaysUsageDescription") != nil) { if (Bundle.main.object(forInfoDictionaryKey: "NSLocationAlwaysUsageDescription") != nil) {
locationManager.requestAlwaysAuthorization(); _locationManager!.requestAlwaysAuthorization();
} else { } else {
NSException(name: NSExceptionName.internalInconsistencyException, reason:"To use location in iOS8 you need to define NSLocationAlwaysUsageDescription in the app bundle's Info.plist file", userInfo: nil).raise() NSException(name: NSExceptionName.internalInconsistencyException, reason:"To use location in iOS8 you need to define NSLocationAlwaysUsageDescription in the app bundle's Info.plist file", userInfo: nil).raise()
} }
} else if permission == PermissionGroup.locationWhenInUse { } else if permission == PermissionGroup.locationWhenInUse {
if (Bundle.main.object(forInfoDictionaryKey: "NSLocationWhenInUseUsageDescription") != nil) { if (Bundle.main.object(forInfoDictionaryKey: "NSLocationWhenInUseUsageDescription") != nil) {
locationManager.requestWhenInUseAuthorization(); _locationManager!.requestWhenInUseAuthorization();
} else { } else {
NSException(name: NSExceptionName.internalInconsistencyException, reason:"To use location in iOS8 you need to define NSLocationWhenInUseUsageDescription in the app bundle's Info.plist file", userInfo: nil).raise() NSException(name: NSExceptionName.internalInconsistencyException, reason:"To use location in iOS8 you need to define NSLocationWhenInUseUsageDescription in the app bundle's Info.plist file", userInfo: nil).raise()
} }
...@@ -67,6 +71,10 @@ class LocationPermissionStrategy : NSObject, PermissionStrategy, CLLocationManag ...@@ -67,6 +71,10 @@ class LocationPermissionStrategy : NSObject, PermissionStrategy, CLLocationManag
} }
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == CLAuthorizationStatus.notDetermined {
return
}
guard let completionHandler = _permissionStatusHandler else { return } guard let completionHandler = _permissionStatusHandler else { return }
completionHandler( completionHandler(
......
...@@ -48,14 +48,13 @@ class SensorPermissionStrategy : NSObject, PermissionStrategy { ...@@ -48,14 +48,13 @@ class SensorPermissionStrategy : NSObject, PermissionStrategy {
if #available(iOS 11.0, *) { if #available(iOS 11.0, *) {
let motionManager = CMMotionActivityManager.init() let motionManager = CMMotionActivityManager.init()
motionManager.queryActivityStarting(from: NSDate.distantPast, to: NSDate.distantFuture, to: OperationQueue.main) { motionManager.startActivityUpdates(to: OperationQueue.main) { (_) in
(results: [CMMotionActivity]?, error: Error?) in motionManager.stopActivityUpdates()
if results != nil {
completionHandler(PermissionStatus.granted) completionHandler(.granted)
} else {
completionHandler(PermissionStatus.denied)
}
} }
} else {
completionHandler(.unknown)
} }
} }
} }
...@@ -38,9 +38,9 @@ class SpeechPermissionStrategy : NSObject, PermissionStrategy { ...@@ -38,9 +38,9 @@ class SpeechPermissionStrategy : NSObject, PermissionStrategy {
SpeechPermissionStrategy.determinePermissionStatus(authorizationStatus: authorizationStatus)) SpeechPermissionStrategy.determinePermissionStatus(authorizationStatus: authorizationStatus))
return return
} }
} else {
completionHandler(PermissionStatus.unknown)
} }
completionHandler(PermissionStatus.unknown)
} }
@available(iOS 10.0, *) @available(iOS 10.0, *)
......
//
// UnknownPermissionStrategy.swift
// permission_handler
//
// Created by Maurits van Beusekom on 07/08/2018.
//
import Foundation
class UnknownPermissionStrategy : NSObject, PermissionStrategy {
func checkPermissionStatus(permission: PermissionGroup) -> PermissionStatus {
return PermissionStatus.unknown
}
func requestPermission(permission: PermissionGroup, completionHandler: @escaping PermissionStatusHandler) {
completionHandler(PermissionStatus.unknown)
}
}
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