Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
permission_handler
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
songyanzhi
permission_handler
Commits
9dfed046
Unverified
Commit
9dfed046
authored
Oct 31, 2019
by
Maurits van Beusekom
Committed by
GitHub
Oct 31, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #164 from Tong-Huang/add-notification-feature
Add notification feature
parents
f24a2aa1
0f630d5f
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
137 additions
and
9 deletions
+137
-9
CONTRIBUTING.md
+1
-1
README.md
+4
-0
android/src/main/java/com/baseflow/permissionhandler/PermissionHandlerPlugin.java
+24
-7
example/ios/Runner/Runner.entitlements
+8
-0
ios/Classes/PermissionHandlerEnums.h
+1
-0
ios/Classes/PermissionManager.h
+1
-0
ios/Classes/PermissionManager.m
+2
-0
ios/Classes/strategies/NotificationPermissionStrategy.h
+14
-0
ios/Classes/strategies/NotificationPermissionStrategy.m
+75
-0
lib/src/permission_enums.dart
+7
-1
No files found.
CONTRIBUTING.md
View file @
9dfed046
...
...
@@ -37,7 +37,7 @@ We really appreciate contributions via GitHub pull requests. To contribute take
*
Apply your changes
*
Verify your changes and fix potential warnings/ errors:
*
Check formatting:
`flutter format .`
*
Run static analyses:
`flutter analyze
s
`
*
Run static analyses:
`flutter analyze`
*
Run unit-tests:
`flutter test`
*
Commit your changes:
`git commit -am "<your informative commit message>"`
*
Push changes to your fork:
`git push origin <name_of_your_branch>`
...
...
README.md
View file @
9dfed046
...
...
@@ -169,6 +169,10 @@ enum PermissionGroup {
/// Android: None
/// iOS: MPMediaLibrary
mediaLibrary
/// Android: Check notification enable
/// iOS: Check and request notification permission
notification
}
```
...
...
android/src/main/java/com/baseflow/permissionhandler/PermissionHandlerPlugin.java
View file @
9dfed046
...
...
@@ -19,6 +19,7 @@ import android.telephony.TelephonyManager;
import
android.text.TextUtils
;
import
android.util.Log
;
import
androidx.core.app.NotificationManagerCompat
;
import
io.flutter.plugin.common.PluginRegistry.ActivityResultListener
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
...
...
@@ -60,7 +61,8 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
private
static
final
int
PERMISSION_GROUP_SPEECH
=
13
;
private
static
final
int
PERMISSION_GROUP_STORAGE
=
14
;
private
static
final
int
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS
=
15
;
private
static
final
int
PERMISSION_GROUP_UNKNOWN
=
16
;
private
static
final
int
PERMISSION_GROUP_NOTIFICATION
=
16
;
private
static
final
int
PERMISSION_GROUP_UNKNOWN
=
17
;
private
PermissionHandlerPlugin
(
Registrar
mRegistrar
)
{
this
.
mRegistrar
=
mRegistrar
;
...
...
@@ -84,6 +86,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
PERMISSION_GROUP_SPEECH
,
PERMISSION_GROUP_STORAGE
,
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS
,
PERMISSION_GROUP_NOTIFICATION
,
PERMISSION_GROUP_UNKNOWN
,
})
private
@interface
PermissionGroup
{
...
...
@@ -250,6 +253,16 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
@PermissionStatus
private
int
checkPermissionStatus
(
@PermissionGroup
int
permission
)
{
final
Context
context
=
mRegistrar
.
activity
()
==
null
?
mRegistrar
.
activeContext
()
:
mRegistrar
.
activity
();
if
(
context
==
null
)
{
Log
.
d
(
LOG_TAG
,
"Unable to detect current Activity or App Context."
);
return
PERMISSION_STATUS_UNKNOWN
;
}
if
(
permission
==
PERMISSION_GROUP_NOTIFICATION
)
{
return
checkNotificationPermissionStatus
(
context
);
}
final
List
<
String
>
names
=
getManifestNames
(
permission
);
if
(
names
==
null
)
{
...
...
@@ -264,12 +277,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
return
PERMISSION_STATUS_UNKNOWN
;
}
final
Context
context
=
mRegistrar
.
activity
()
==
null
?
mRegistrar
.
activeContext
()
:
mRegistrar
.
activity
();
if
(
context
==
null
)
{
Log
.
d
(
LOG_TAG
,
"Unable to detect current Activity or App Context."
);
return
PERMISSION_STATUS_UNKNOWN
;
}
final
boolean
targetsMOrHigher
=
context
.
getApplicationInfo
().
targetSdkVersion
>=
VERSION_CODES
.
M
;
for
(
String
name
:
names
)
{
...
...
@@ -655,6 +662,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
permissionNames
.
add
(
Manifest
.
permission
.
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
);
break
;
case
PERMISSION_GROUP_NOTIFICATION:
case
PERMISSION_GROUP_MEDIA_LIBRARY:
case
PERMISSION_GROUP_PHOTOS:
case
PERMISSION_GROUP_REMINDERS:
...
...
@@ -726,4 +734,13 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
return
!
TextUtils
.
isEmpty
(
locationProviders
);
}
}
private
int
checkNotificationPermissionStatus
(
Context
context
)
{
NotificationManagerCompat
manager
=
NotificationManagerCompat
.
from
(
context
);
boolean
isGranted
=
manager
.
areNotificationsEnabled
();
if
(
isGranted
)
{
return
PERMISSION_STATUS_GRANTED
;
}
return
PERMISSION_STATUS_DENIED
;
}
}
example/ios/Runner/Runner.entitlements
0 → 100644
View file @
9dfed046
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist
version=
"1.0"
>
<dict>
<key>
com.apple.security.application-groups
</key>
<array/>
</dict>
</plist>
ios/Classes/PermissionHandlerEnums.h
View file @
9dfed046
...
...
@@ -22,6 +22,7 @@ typedef NS_ENUM(int, PermissionGroup) {
PermissionGroupSpeech
,
PermissionGroupStorage
,
PermissionGroupIgnoreBatteryOptimizations
,
PermissionGroupNotification
,
PermissionGroupUnknown
,
};
...
...
ios/Classes/PermissionManager.h
View file @
9dfed046
...
...
@@ -20,6 +20,7 @@
#import "SensorPermissionStrategy.h"
#import "SpeechPermissionStrategy.h"
#import "UnknownPermissionStrategy.h"
#import "NotificationPermissionStrategy.h"
#import "PermissionHandlerEnums.h"
#import "Codec.h"
...
...
ios/Classes/PermissionManager.m
View file @
9dfed046
...
...
@@ -99,6 +99,8 @@
return
[
SensorPermissionStrategy
new
];
case
PermissionGroupSpeech
:
return
[
SpeechPermissionStrategy
new
];
case
PermissionGroupNotification
:
return
[
NotificationPermissionStrategy
new
];
default
:
return
[
UnknownPermissionStrategy
new
];
}
...
...
ios/Classes/strategies/NotificationPermissionStrategy.h
0 → 100644
View file @
9dfed046
//
// NotificationPermissionStrategy.h
// permission_handler
//
// Created by Tong on 2019/10/21.
//
#import <Foundation/Foundation.h>
#import <UserNotifications/UserNotifications.h>
#import "PermissionStrategy.h"
@interface
NotificationPermissionStrategy
:
NSObject
<
PermissionStrategy
>
@end
ios/Classes/strategies/NotificationPermissionStrategy.m
0 → 100644
View file @
9dfed046
//
// NotificationPermissionStrategy.m
// permission_handler
//
// Created by Tong on 2019/10/21.
//
#import "NotificationPermissionStrategy.h"
@implementation
NotificationPermissionStrategy
-
(
PermissionStatus
)
checkPermissionStatus
:(
PermissionGroup
)
permission
{
return
[
NotificationPermissionStrategy
permissionStatus
];
}
-
(
ServiceStatus
)
checkServiceStatus
:(
PermissionGroup
)
permission
{
return
ServiceStatusNotApplicable
;
}
-
(
void
)
requestPermission
:(
PermissionGroup
)
permission
completionHandler
:(
PermissionStatusHandler
)
completionHandler
{
PermissionStatus
status
=
[
self
checkPermissionStatus
:
permission
];
if
(
status
!=
PermissionStatusUnknown
)
{
completionHandler
(
status
);
return
;
}
dispatch_async
(
dispatch_get_main_queue
(),
^
{
if
(
@available
(
iOS
10
.
0
,
*
))
{
UNUserNotificationCenter
*
center
=
[
UNUserNotificationCenter
currentNotificationCenter
];
UNAuthorizationOptions
authorizationOptions
=
0
;
authorizationOptions
+=
UNAuthorizationOptionSound
;
authorizationOptions
+=
UNAuthorizationOptionAlert
;
authorizationOptions
+=
UNAuthorizationOptionBadge
;
[
center
requestAuthorizationWithOptions
:(
authorizationOptions
)
completionHandler
:
^
(
BOOL
granted
,
NSError
*
_Nullable
error
)
{
if
(
!
granted
||
error
!=
nil
)
{
completionHandler
(
PermissionStatusDenied
);
return
;
}
}];
}
else
{
UIUserNotificationType
notificationTypes
=
0
;
notificationTypes
|=
UIUserNotificationTypeSound
;
notificationTypes
|=
UIUserNotificationTypeAlert
;
notificationTypes
|=
UIUserNotificationTypeBadge
;
UIUserNotificationSettings
*
settings
=
[
UIUserNotificationSettings
settingsForTypes
:
notificationTypes
categories
:
nil
];
[[
UIApplication
sharedApplication
]
registerUserNotificationSettings
:
settings
];
}
[[
UIApplication
sharedApplication
]
registerForRemoteNotifications
];
completionHandler
(
PermissionStatusGranted
);
});
}
+
(
PermissionStatus
)
permissionStatus
{
__block
PermissionStatus
permissionStatus
=
PermissionStatusGranted
;
if
(
@available
(
iOS
10
,
*
))
{
dispatch_semaphore_t
sem
=
dispatch_semaphore_create
(
0
);
[[
UNUserNotificationCenter
currentNotificationCenter
]
getNotificationSettingsWithCompletionHandler
:
^
(
UNNotificationSettings
*
_Nonnull
settings
)
{
if
(
settings
.
authorizationStatus
==
UNAuthorizationStatusDenied
)
{
permissionStatus
=
PermissionStatusDenied
;
}
else
if
(
settings
.
authorizationStatus
==
UNAuthorizationStatusNotDetermined
)
{
permissionStatus
=
PermissionStatusUnknown
;
}
dispatch_semaphore_signal
(
sem
);
}];
dispatch_semaphore_wait
(
sem
,
DISPATCH_TIME_FOREVER
);
}
else
if
(
@available
(
iOS
8
,
*
))
{
UIUserNotificationSettings
*
setting
=
[[
UIApplication
sharedApplication
]
currentUserNotificationSettings
];
if
(
setting
.
types
==
UIUserNotificationTypeNone
)
permissionStatus
=
PermissionStatusDenied
;
}
else
{
UIRemoteNotificationType
type
=
[[
UIApplication
sharedApplication
]
enabledRemoteNotificationTypes
];
if
(
type
==
UIUserNotificationTypeNone
)
permissionStatus
=
PermissionStatusDenied
;
}
return
permissionStatus
;
}
@end
lib/src/permission_enums.dart
View file @
9dfed046
...
...
@@ -149,8 +149,12 @@ class PermissionGroup {
static
const
PermissionGroup
ignoreBatteryOptimizations
=
PermissionGroup
.
_
(
15
);
/// Android: Notification
/// iOS: Notification
static
const
PermissionGroup
notification
=
PermissionGroup
.
_
(
16
);
/// The unknown permission only used for return type, never requested
static
const
PermissionGroup
unknown
=
PermissionGroup
.
_
(
1
6
);
static
const
PermissionGroup
unknown
=
PermissionGroup
.
_
(
1
7
);
static
const
List
<
PermissionGroup
>
values
=
<
PermissionGroup
>[
calendar
,
...
...
@@ -169,6 +173,7 @@ class PermissionGroup {
speech
,
storage
,
ignoreBatteryOptimizations
,
notification
,
unknown
,
];
...
...
@@ -189,6 +194,7 @@ class PermissionGroup {
'speech'
,
'storage'
,
'ignoreBatteryOptimizations'
,
'notification'
,
'unknown'
,
];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment