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