Skip to content

Commit dc6beac

Browse files
authored
Merge pull request #1 from BaseflowIT/develop
Sync original repo into fork
2 parents f24a2aa + 9dfed04 commit dc6beac

File tree

10 files changed

+137
-9
lines changed

10 files changed

+137
-9
lines changed

CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ We really appreciate contributions via GitHub pull requests. To contribute take
3737
* Apply your changes
3838
* Verify your changes and fix potential warnings/ errors:
3939
* Check formatting: `flutter format .`
40-
* Run static analyses: `flutter analyzes`
40+
* Run static analyses: `flutter analyze`
4141
* Run unit-tests: `flutter test`
4242
* Commit your changes: `git commit -am "<your informative commit message>"`
4343
* Push changes to your fork: `git push origin <name_of_your_branch>`

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ enum PermissionGroup {
169169
/// Android: None
170170
/// iOS: MPMediaLibrary
171171
mediaLibrary
172+
173+
/// Android: Check notification enable
174+
/// iOS: Check and request notification permission
175+
notification
172176
}
173177
```
174178

android/src/main/java/com/baseflow/permissionhandler/PermissionHandlerPlugin.java

+24-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import android.text.TextUtils;
2020
import android.util.Log;
2121

22+
import androidx.core.app.NotificationManagerCompat;
2223
import io.flutter.plugin.common.PluginRegistry.ActivityResultListener;
2324
import java.lang.annotation.Retention;
2425
import java.lang.annotation.RetentionPolicy;
@@ -60,7 +61,8 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
6061
private static final int PERMISSION_GROUP_SPEECH = 13;
6162
private static final int PERMISSION_GROUP_STORAGE = 14;
6263
private static final int PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS = 15;
63-
private static final int PERMISSION_GROUP_UNKNOWN = 16;
64+
private static final int PERMISSION_GROUP_NOTIFICATION = 16;
65+
private static final int PERMISSION_GROUP_UNKNOWN = 17;
6466

6567
private PermissionHandlerPlugin(Registrar mRegistrar) {
6668
this.mRegistrar = mRegistrar;
@@ -84,6 +86,7 @@ private PermissionHandlerPlugin(Registrar mRegistrar) {
8486
PERMISSION_GROUP_SPEECH,
8587
PERMISSION_GROUP_STORAGE,
8688
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS,
89+
PERMISSION_GROUP_NOTIFICATION,
8790
PERMISSION_GROUP_UNKNOWN,
8891
})
8992
private @interface PermissionGroup {
@@ -250,6 +253,16 @@ public void onMethodCall(MethodCall call, Result result) {
250253

251254
@PermissionStatus
252255
private int checkPermissionStatus(@PermissionGroup int permission) {
256+
final Context context = mRegistrar.activity() == null ? mRegistrar.activeContext() : mRegistrar.activity();
257+
if (context == null) {
258+
Log.d(LOG_TAG, "Unable to detect current Activity or App Context.");
259+
return PERMISSION_STATUS_UNKNOWN;
260+
}
261+
262+
if (permission == PERMISSION_GROUP_NOTIFICATION) {
263+
return checkNotificationPermissionStatus(context);
264+
}
265+
253266
final List<String> names = getManifestNames(permission);
254267

255268
if (names == null) {
@@ -264,12 +277,6 @@ private int checkPermissionStatus(@PermissionGroup int permission) {
264277
return PERMISSION_STATUS_UNKNOWN;
265278
}
266279

267-
final Context context = mRegistrar.activity() == null ? mRegistrar.activeContext() : mRegistrar.activity();
268-
if (context == null) {
269-
Log.d(LOG_TAG, "Unable to detect current Activity or App Context.");
270-
return PERMISSION_STATUS_UNKNOWN;
271-
}
272-
273280
final boolean targetsMOrHigher = context.getApplicationInfo().targetSdkVersion >= VERSION_CODES.M;
274281

275282
for (String name : names) {
@@ -655,6 +662,7 @@ private List<String> getManifestNames(@PermissionGroup int permission) {
655662
permissionNames.add(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
656663
break;
657664

665+
case PERMISSION_GROUP_NOTIFICATION:
658666
case PERMISSION_GROUP_MEDIA_LIBRARY:
659667
case PERMISSION_GROUP_PHOTOS:
660668
case PERMISSION_GROUP_REMINDERS:
@@ -726,4 +734,13 @@ private boolean isLocationServiceEnabled(Context context) {
726734
return !TextUtils.isEmpty(locationProviders);
727735
}
728736
}
737+
738+
private int checkNotificationPermissionStatus(Context context) {
739+
NotificationManagerCompat manager = NotificationManagerCompat.from(context);
740+
boolean isGranted = manager.areNotificationsEnabled();
741+
if (isGranted) {
742+
return PERMISSION_STATUS_GRANTED;
743+
}
744+
return PERMISSION_STATUS_DENIED;
745+
}
729746
}
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>com.apple.security.application-groups</key>
6+
<array/>
7+
</dict>
8+
</plist>

ios/Classes/PermissionHandlerEnums.h

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ typedef NS_ENUM(int, PermissionGroup) {
2222
PermissionGroupSpeech,
2323
PermissionGroupStorage,
2424
PermissionGroupIgnoreBatteryOptimizations,
25+
PermissionGroupNotification,
2526
PermissionGroupUnknown,
2627
};
2728

ios/Classes/PermissionManager.h

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#import "SensorPermissionStrategy.h"
2121
#import "SpeechPermissionStrategy.h"
2222
#import "UnknownPermissionStrategy.h"
23+
#import "NotificationPermissionStrategy.h"
2324
#import "PermissionHandlerEnums.h"
2425
#import "Codec.h"
2526

ios/Classes/PermissionManager.m

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ + (id)createPermissionStrategy:(PermissionGroup)permission {
9999
return [SensorPermissionStrategy new];
100100
case PermissionGroupSpeech:
101101
return [SpeechPermissionStrategy new];
102+
case PermissionGroupNotification:
103+
return [NotificationPermissionStrategy new];
102104
default:
103105
return [UnknownPermissionStrategy new];
104106
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// NotificationPermissionStrategy.h
3+
// permission_handler
4+
//
5+
// Created by Tong on 2019/10/21.
6+
//
7+
8+
#import <Foundation/Foundation.h>
9+
#import <UserNotifications/UserNotifications.h>
10+
#import "PermissionStrategy.h"
11+
12+
@interface NotificationPermissionStrategy : NSObject <PermissionStrategy>
13+
14+
@end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
//
2+
// NotificationPermissionStrategy.m
3+
// permission_handler
4+
//
5+
// Created by Tong on 2019/10/21.
6+
//
7+
8+
#import "NotificationPermissionStrategy.h"
9+
10+
@implementation NotificationPermissionStrategy
11+
12+
- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
13+
return [NotificationPermissionStrategy permissionStatus];
14+
}
15+
16+
- (ServiceStatus)checkServiceStatus:(PermissionGroup)permission {
17+
return ServiceStatusNotApplicable;
18+
}
19+
20+
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
21+
PermissionStatus status = [self checkPermissionStatus:permission];
22+
if (status != PermissionStatusUnknown) {
23+
completionHandler(status);
24+
return;
25+
}
26+
dispatch_async(dispatch_get_main_queue(), ^{
27+
if(@available(iOS 10.0, *)) {
28+
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
29+
UNAuthorizationOptions authorizationOptions = 0;
30+
authorizationOptions += UNAuthorizationOptionSound;
31+
authorizationOptions += UNAuthorizationOptionAlert;
32+
authorizationOptions += UNAuthorizationOptionBadge;
33+
[center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) {
34+
if (!granted || error != nil) {
35+
completionHandler(PermissionStatusDenied);
36+
return;
37+
}
38+
}];
39+
} else {
40+
UIUserNotificationType notificationTypes = 0;
41+
notificationTypes |= UIUserNotificationTypeSound;
42+
notificationTypes |= UIUserNotificationTypeAlert;
43+
notificationTypes |= UIUserNotificationTypeBadge;
44+
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil];
45+
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
46+
}
47+
[[UIApplication sharedApplication] registerForRemoteNotifications];
48+
completionHandler(PermissionStatusGranted);
49+
});
50+
}
51+
52+
+ (PermissionStatus)permissionStatus {
53+
__block PermissionStatus permissionStatus = PermissionStatusGranted;
54+
if (@available(iOS 10 , *)) {
55+
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
56+
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
57+
if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
58+
permissionStatus = PermissionStatusDenied;
59+
} else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
60+
permissionStatus = PermissionStatusUnknown;
61+
}
62+
dispatch_semaphore_signal(sem);
63+
}];
64+
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
65+
} else if (@available(iOS 8 , *)) {
66+
UIUserNotificationSettings * setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
67+
if (setting.types == UIUserNotificationTypeNone) permissionStatus = PermissionStatusDenied;
68+
} else {
69+
UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
70+
if (type == UIUserNotificationTypeNone) permissionStatus = PermissionStatusDenied;
71+
}
72+
return permissionStatus;
73+
}
74+
75+
@end

lib/src/permission_enums.dart

+7-1
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,12 @@ class PermissionGroup {
149149
static const PermissionGroup ignoreBatteryOptimizations =
150150
PermissionGroup._(15);
151151

152+
/// Android: Notification
153+
/// iOS: Notification
154+
static const PermissionGroup notification = PermissionGroup._(16);
155+
152156
/// The unknown permission only used for return type, never requested
153-
static const PermissionGroup unknown = PermissionGroup._(16);
157+
static const PermissionGroup unknown = PermissionGroup._(17);
154158

155159
static const List<PermissionGroup> values = <PermissionGroup>[
156160
calendar,
@@ -169,6 +173,7 @@ class PermissionGroup {
169173
speech,
170174
storage,
171175
ignoreBatteryOptimizations,
176+
notification,
172177
unknown,
173178
];
174179

@@ -189,6 +194,7 @@ class PermissionGroup {
189194
'speech',
190195
'storage',
191196
'ignoreBatteryOptimizations',
197+
'notification',
192198
'unknown',
193199
];
194200

0 commit comments

Comments
 (0)