Commit 5208c8db by azack Committed by GitHub

Issue #988: Provisional Notification Permissions Part 1/3 (#990)

* Issue #988: Updating platform interface for provisional permission status

* Issue #988: Updating platform interface for provisional permission status - increasing test coverage
parent 48d5351e
## 3.10.0
* Added support for iOS 12+ Provisional Notification permissions.
## 3.9.0
* Added support for the new Android 13 permissions: SCHEDULE_EXACT_ALARM, READ_MEDIA_IMAGES, READ_MEDIA_VIDEO and READ_MEDIA_AUDIO
......
......@@ -23,6 +23,10 @@ enum PermissionStatus {
/// dialog will not be shown when requesting this permission. The user may
/// still change the permission status in the settings.
permanentlyDenied,
/// The application is provisionally authorized to post noninterruptive user notifications.
/// *Only supported on iOS (iOS12+).*
provisional,
}
/// Conversion extension methods for the [PermissionStatus] type.
......@@ -40,6 +44,8 @@ extension PermissionStatusValue on PermissionStatus {
return 3;
case PermissionStatus.permanentlyDenied:
return 4;
case PermissionStatus.provisional:
return 5;
default:
throw UnimplementedError();
}
......@@ -53,6 +59,7 @@ extension PermissionStatusValue on PermissionStatus {
PermissionStatus.restricted,
PermissionStatus.limited,
PermissionStatus.permanentlyDenied,
PermissionStatus.provisional,
][value];
}
}
......@@ -79,7 +86,7 @@ extension PermissionStatusGetters on PermissionStatus {
/// The user may still change the permission status in the settings.
///
/// *On iOS:*
/// If the user has denied acces to the requested feature.
/// If the user has denied access to the requested feature.
/// The user may still change the permission status in the settings
///
/// WARNING: This can only be determined AFTER requesting this permission.
......@@ -88,6 +95,9 @@ extension PermissionStatusGetters on PermissionStatus {
/// Indicates that permission for limited use of the resource is granted.
bool get isLimited => this == PermissionStatus.limited;
/// If the application is provisionally authorized to post noninterruptive user notifications.
bool get isProvisional => this == PermissionStatus.provisional;
}
/// Utility getter extensions for the `Future<PermissionStatus>` type.
......@@ -111,11 +121,15 @@ extension FuturePermissionStatusGetters on Future<PermissionStatus> {
/// The user may still change the permission status in the settings.
///
/// *On iOS:*
/// If the user has denied acces to the requested feature.
/// If the user has denied access to the requested feature.
/// The user may still change the permission status in the settings
Future<bool> get isPermanentlyDenied async =>
(await this).isPermanentlyDenied;
/// Indicates that permission for limited use of the resource is granted.
Future<bool> get isLimited async => (await this).isLimited;
/// If the application is provisionally authorized to post noninterruptive user notifications.
/// *Only supported on iOS.*
Future<bool> get isProvisional async => (await this).isProvisional;
}
......@@ -3,7 +3,7 @@ description: A common platform interface for the permission_handler plugin.
homepage: https://github.com/baseflow/flutter-permission-handler/tree/master/permission_handler_platform_interface
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
version: 3.9.0
version: 3.10.0
dependencies:
flutter:
......
......@@ -2,11 +2,11 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';
void main() {
group('PermissionSatus', () {
test('PermissionStatus should contain 5 options', () {
group('PermissionStatus', () {
test('PermissionStatus should contain 6 options', () {
const values = PermissionStatus.values;
expect(values.length, 5);
expect(values.length, 6);
});
test('PermissionStatus enum should have items in correct index', () {
......@@ -17,16 +17,18 @@ void main() {
expect(values[2], PermissionStatus.restricted);
expect(values[3], PermissionStatus.limited);
expect(values[4], PermissionStatus.permanentlyDenied);
expect(values[5], PermissionStatus.provisional);
});
});
group('PermissionStatusValue', () {
test('PermissonStatusValue returns right integer', () {
test('PermissionStatusValue returns right integer', () {
expect(PermissionStatus.denied.value, 0);
expect(PermissionStatus.granted.value, 1);
expect(PermissionStatus.restricted.value, 2);
expect(PermissionStatus.limited.value, 3);
expect(PermissionStatus.permanentlyDenied.value, 4);
expect(PermissionStatus.provisional.value, 5);
});
test(
......@@ -40,6 +42,8 @@ void main() {
expect(PermissionStatusValue.statusByValue(3), PermissionStatus.limited);
expect(PermissionStatusValue.statusByValue(4),
PermissionStatus.permanentlyDenied);
expect(
PermissionStatusValue.statusByValue(5), PermissionStatus.provisional);
});
});
......@@ -50,6 +54,7 @@ void main() {
expect(PermissionStatus.restricted.isRestricted, true);
expect(PermissionStatus.limited.isLimited, true);
expect(PermissionStatus.permanentlyDenied.isPermanentlyDenied, true);
expect(PermissionStatus.provisional.isProvisional, true);
});
test('Getters should return false if statement is not met', () {
......@@ -58,6 +63,34 @@ void main() {
expect(PermissionStatus.restricted.isDenied, false);
expect(PermissionStatus.limited.isDenied, false);
expect(PermissionStatus.permanentlyDenied.isDenied, false);
expect(PermissionStatus.provisional.isDenied, false);
});
});
group('FuturePermissionStatusGetters', () {
mockFuture(PermissionStatus status) => Future.value(status);
test('Getters should return true if statement is met', () async {
expect(await mockFuture(PermissionStatus.denied).isDenied, true);
expect(await mockFuture(PermissionStatus.granted).isGranted, true);
expect(await mockFuture(PermissionStatus.restricted).isRestricted, true);
expect(await mockFuture(PermissionStatus.limited).isLimited, true);
expect(
await mockFuture(PermissionStatus.permanentlyDenied)
.isPermanentlyDenied,
true);
expect(
await mockFuture(PermissionStatus.provisional).isProvisional, true);
});
test('Getters should return false if statement is not met', () async {
expect(await mockFuture(PermissionStatus.denied).isGranted, false);
expect(await mockFuture(PermissionStatus.granted).isDenied, false);
expect(await mockFuture(PermissionStatus.restricted).isDenied, false);
expect(await mockFuture(PermissionStatus.limited).isDenied, false);
expect(
await mockFuture(PermissionStatus.permanentlyDenied).isDenied, false);
expect(await mockFuture(PermissionStatus.provisional).isDenied, false);
});
});
......
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