Commit a3bacb4a by Michael Nabil Committed by GitHub

Refactor Permission Handling for Improved Readability (#1164)

* Add `PermissionCallbacks`

* Fix

* Clean tests

* Update permission_handler/CHANGELOG.md

Co-authored-by: Maurits van Beusekom <maurits@baseflow.com>

* Fix type

* Merge `PermissionCallbacks` to `PermissionActions`

* Fix format

* Fix test

* Convert all the variables to private

---------

Co-authored-by: Maurits van Beusekom <maurits@baseflow.com>
parent 83329fac
## 11.0.1
* Adds extension methods to the `PermissionStatus` enum allowing developers to register callback methods, which will improve code readability.
## 11.0.0
* **BREAKING CHANGE:** Updates `permission_handler_android` dependency to version 11.0.0.
......
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';
......@@ -21,6 +23,60 @@ Future<bool> openAppSettings() => _handler.openAppSettings();
/// Actions that can be executed on a permission.
extension PermissionActions on Permission {
/// Callback for when permission is denied.
static FutureOr<void>? Function()? _onDenied;
/// Callback for when permission is granted.
static FutureOr<void>? Function()? _onGranted;
/// Callback for when permission is permanently denied.
static FutureOr<void>? Function()? _onPermanentlyDenied;
/// Callback for when permission is restricted.
static FutureOr<void>? Function()? _onRestricted;
/// Callback for when permission is limited.
static FutureOr<void>? Function()? _onLimited;
/// Callback for when permission is Provisional.
static FutureOr<void>? Function()? _onProvisional;
/// Method to set a callback for when permission is denied.
Permission onDeniedCallback(FutureOr<void>? Function()? callback) {
_onDenied = callback;
return this;
}
/// Method to set a callback for when permission is granted.
Permission onGrantedCallback(FutureOr<void>? Function()? callback) {
_onGranted = callback;
return this;
}
/// Method to set a callback for when permission is permanently denied.
Permission onPermanentlyDeniedCallback(FutureOr<void>? Function()? callback) {
_onPermanentlyDenied = callback;
return this;
}
/// Method to set a callback for when permission is restricted.
Permission onRestrictedCallback(FutureOr<void>? Function()? callback) {
_onRestricted = callback;
return this;
}
/// Method to set a callback for when permission is limited.
Permission onLimitedCallback(FutureOr<void>? Function()? callback) {
_onLimited = callback;
return this;
}
/// Method to set a callback for when permission is provisional.
Permission onProvisionalCallback(FutureOr<void>? Function()? callback) {
_onProvisional = callback;
return this;
}
/// Checks the current status of the given [Permission].
///
/// Notes about specific permissions:
......@@ -49,8 +105,24 @@ extension PermissionActions on Permission {
///
/// Returns the new [PermissionStatus].
Future<PermissionStatus> request() async {
final permissionStatus = (await [this].request())[this];
return permissionStatus ?? PermissionStatus.denied;
final permissionStatus =
(await [this].request())[this] ?? PermissionStatus.denied;
if (permissionStatus.isDenied) {
_onDenied?.call();
} else if (permissionStatus.isGranted) {
_onGranted?.call();
} else if (permissionStatus.isPermanentlyDenied) {
_onPermanentlyDenied?.call();
} else if (permissionStatus.isRestricted) {
_onRestricted?.call();
} else if (permissionStatus.isLimited) {
_onLimited?.call();
} else if (permissionStatus.isProvisional) {
_onProvisional?.call();
}
return permissionStatus;
}
}
......
......@@ -2,7 +2,7 @@ name: permission_handler
description: Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.
repository: https://github.com/baseflow/flutter-permission-handler
issue_tracker: https://github.com/Baseflow/flutter-permission-handler/issues
version: 11.0.0
version: 11.0.1
environment:
sdk: ">=2.15.0 <4.0.0"
......
......@@ -94,6 +94,71 @@ void main() {
expect(permissionMap, isA<Map<Permission, PermissionStatus>>());
});
test('onDeniedCallback sets onDenied', () async {
bool callbackCalled = false;
callback() => callbackCalled = true;
await Permission.location.onDeniedCallback(callback).request();
expect(callbackCalled, isTrue);
});
test('onGrantedCallback sets onGranted', () async {
bool callbackCalled = false;
callback() => callbackCalled = true;
await Permission.location.onGrantedCallback(callback).request();
expect(callbackCalled, isFalse);
});
test('onPermanentlyDeniedCallback sets onPermanentlyDenied', () async {
bool callbackCalled = false;
callback() => callbackCalled = true;
await Permission.location.onPermanentlyDeniedCallback(callback).request();
expect(callbackCalled, isFalse);
});
test('onRestrictedCallback sets onRestricted', () async {
bool callbackCalled = false;
callback() => callbackCalled = true;
await Permission.location.onRestrictedCallback(callback).request();
expect(callbackCalled, isFalse);
});
test('onLimitedCallback sets onLimited', () async {
bool callbackCalled = false;
callback() => callbackCalled = true;
await Permission.location.onLimitedCallback(callback).request();
expect(callbackCalled, isFalse);
});
test('onProvisionalCallback sets onProvisional', () async {
bool callbackCalled = false;
callback() => callbackCalled = true;
await Permission.location.onProvisionalCallback(callback).request();
expect(callbackCalled, isFalse);
});
test('onGrantedCallback sets onGranted', () async {
bool callbackCalled = false;
callback() => callbackCalled = true;
await Permission.location.onGrantedCallback(callback).request();
expect(callbackCalled, isFalse);
});
test('ask calls the appropriate callback', () async {
List<String> callbackCalled = [];
await Permission.camera
.onDeniedCallback(() => callbackCalled.add('Denied'))
.onGrantedCallback(() => callbackCalled.add('Granted'))
.onPermanentlyDeniedCallback(
() => callbackCalled.add('PermanentlyDenied'))
.onRestrictedCallback(() => callbackCalled.add('Restricted'))
.onLimitedCallback(() => callbackCalled.add('Limited'))
.onProvisionalCallback(() => callbackCalled.add('Provisional'))
.request();
expect(callbackCalled, ['Denied']);
});
});
}
......
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