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
6aeed0c6
Unverified
Commit
6aeed0c6
authored
May 18, 2019
by
Sebastian Roth
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add permission to ignore battery optimizations
parent
e219b175
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
78 additions
and
6 deletions
+78
-6
android/src/main/java/com/baseflow/permissionhandler/PermissionHandlerPlugin.java
+66
-4
example/android/app/src/main/AndroidManifest.xml
+1
-0
example/lib/main.dart
+3
-1
ios/Classes/PermissionHandlerEnums.h
+1
-0
lib/src/permission_enums.dart
+7
-1
No files found.
android/src/main/java/com/baseflow/permissionhandler/PermissionHandlerPlugin.java
View file @
6aeed0c6
...
...
@@ -11,11 +11,15 @@ import android.content.pm.ResolveInfo;
import
android.location.LocationManager
;
import
android.net.Uri
;
import
android.os.Build
;
import
android.os.Build.VERSION
;
import
android.os.Build.VERSION_CODES
;
import
android.os.PowerManager
;
import
android.provider.Settings
;
import
android.telephony.TelephonyManager
;
import
android.text.TextUtils
;
import
android.util.Log
;
import
io.flutter.plugin.common.PluginRegistry.ActivityResultListener
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.util.ArrayList
;
...
...
@@ -37,6 +41,7 @@ import io.flutter.plugin.common.PluginRegistry.Registrar;
public
class
PermissionHandlerPlugin
implements
MethodCallHandler
{
private
static
final
String
LOG_TAG
=
"permissions_handler"
;
private
static
final
int
PERMISSION_CODE
=
24
;
private
static
final
int
PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS
=
5672353
;
//PERMISSION_GROUP
private
static
final
int
PERMISSION_GROUP_CALENDAR
=
0
;
...
...
@@ -54,7 +59,8 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
private
static
final
int
PERMISSION_GROUP_SMS
=
12
;
private
static
final
int
PERMISSION_GROUP_SPEECH
=
13
;
private
static
final
int
PERMISSION_GROUP_STORAGE
=
14
;
private
static
final
int
PERMISSION_GROUP_UNKNOWN
=
15
;
private
static
final
int
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS
=
15
;
private
static
final
int
PERMISSION_GROUP_UNKNOWN
=
16
;
private
PermissionHandlerPlugin
(
Registrar
mRegistrar
)
{
this
.
mRegistrar
=
mRegistrar
;
...
...
@@ -77,6 +83,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
PERMISSION_GROUP_SMS
,
PERMISSION_GROUP_SPEECH
,
PERMISSION_GROUP_STORAGE
,
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS
,
PERMISSION_GROUP_UNKNOWN
,
})
private
@interface
PermissionGroup
{
...
...
@@ -133,6 +140,18 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
}
}
});
registrar
.
addActivityResultListener
(
new
ActivityResultListener
()
{
@Override
public
boolean
onActivityResult
(
int
requestCode
,
int
responseCode
,
Intent
intent
)
{
if
(
requestCode
==
PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS
)
{
permissionHandlerPlugin
.
handleIgnoreBatteryOptimizationsRequest
(
responseCode
==
Activity
.
RESULT_OK
);
return
true
;
}
return
false
;
}
});
}
@PermissionGroup
...
...
@@ -249,10 +268,23 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
return
PERMISSION_STATUS_UNKNOWN
;
}
final
boolean
targetsMOrHigher
=
context
.
getApplicationInfo
().
targetSdkVersion
>=
android
.
os
.
Build
.
VERSION_CODES
.
M
;
final
boolean
targetsMOrHigher
=
context
.
getApplicationInfo
().
targetSdkVersion
>=
VERSION_CODES
.
M
;
for
(
String
name
:
names
)
{
if
(
targetsMOrHigher
)
{
if
(
permission
==
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS
)
{
String
packageName
=
context
.
getPackageName
();
PowerManager
pm
=
(
PowerManager
)
context
.
getSystemService
(
Context
.
POWER_SERVICE
);
if
(
VERSION
.
SDK_INT
>=
VERSION_CODES
.
M
)
{
if
(
pm
.
isIgnoringBatteryOptimizations
(
packageName
))
{
return
PERMISSION_STATUS_GRANTED
;
}
else
{
return
PERMISSION_STATUS_DENIED
;
}
}
else
{
return
PERMISSION_STATUS_RESTRICTED
;
}
}
final
int
permissionStatus
=
ContextCompat
.
checkSelfPermission
(
context
,
name
);
if
(
permissionStatus
==
PackageManager
.
PERMISSION_DENIED
)
{
return
PERMISSION_STATUS_DENIED
;
...
...
@@ -312,6 +344,10 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
return
SERVICE_STATUS_ENABLED
;
}
if
(
permission
==
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS
)
{
return
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
M
?
SERVICE_STATUS_ENABLED
:
SERVICE_STATUS_NOT_APPLICABLE
;
}
return
SERVICE_STATUS_NOT_APPLICABLE
;
}
...
...
@@ -371,7 +407,15 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
continue
;
}
permissionsToRequest
.
addAll
(
names
);
if
(
permission
==
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS
)
{
String
packageName
=
mRegistrar
.
context
().
getPackageName
();
Intent
intent
=
new
Intent
();
intent
.
setAction
(
Settings
.
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
);
intent
.
setData
(
Uri
.
parse
(
"package:"
+
packageName
));
mRegistrar
.
activity
().
startActivityForResult
(
intent
,
PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS
);
}
else
{
permissionsToRequest
.
addAll
(
names
);
}
}
else
{
if
(!
mRequestResults
.
containsKey
(
permission
))
{
mRequestResults
.
put
(
permission
,
PERMISSION_STATUS_GRANTED
);
...
...
@@ -429,6 +473,18 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
processResult
();
}
private
void
handleIgnoreBatteryOptimizationsRequest
(
boolean
granted
)
{
if
(
mResult
==
null
)
{
return
;
}
int
status
=
granted
?
PERMISSION_STATUS_GRANTED
:
PERMISSION_STATUS_DENIED
;
mRequestResults
.
put
(
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS
,
status
);
processResult
();
}
@PermissionStatus
private
int
toPermissionStatus
(
int
grantResult
)
{
return
grantResult
==
PackageManager
.
PERMISSION_GRANTED
?
PERMISSION_STATUS_GRANTED
:
PERMISSION_STATUS_DENIED
;
...
...
@@ -533,7 +589,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
break
;
case
PERMISSION_GROUP_SENSORS:
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
KITKAT_WATCH
)
{
if
(
VERSION
.
SDK_INT
>=
VERSION_CODES
.
KITKAT_WATCH
)
{
if
(
hasPermissionInManifest
(
Manifest
.
permission
.
BODY_SENSORS
))
{
permissionNames
.
add
(
Manifest
.
permission
.
BODY_SENSORS
);
}
...
...
@@ -565,6 +621,12 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
permissionNames
.
add
(
Manifest
.
permission
.
WRITE_EXTERNAL_STORAGE
);
break
;
case
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS:
if
(
hasPermissionInManifest
(
Manifest
.
permission
.
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
))
if
(
VERSION
.
SDK_INT
>=
VERSION_CODES
.
M
)
permissionNames
.
add
(
Manifest
.
permission
.
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
);
break
;
case
PERMISSION_GROUP_MEDIA_LIBRARY:
case
PERMISSION_GROUP_PHOTOS:
case
PERMISSION_GROUP_REMINDERS:
...
...
example/android/app/src/main/AndroidManifest.xml
View file @
6aeed0c6
...
...
@@ -25,6 +25,7 @@
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.SENSORS"
/>
<uses-permission
android:name=
"android.permission.BODY_SENSORS"
/>
<uses-permission
android:name=
"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
/>
<application
android:name=
"io.flutter.app.FlutterApplication"
...
...
example/lib/main.dart
View file @
6aeed0c6
...
...
@@ -30,7 +30,9 @@ class MyApp extends StatelessWidget {
return
permission
!=
PermissionGroup
.
unknown
&&
permission
!=
PermissionGroup
.
phone
&&
permission
!=
PermissionGroup
.
sms
&&
permission
!=
PermissionGroup
.
storage
;
permission
!=
PermissionGroup
.
storage
&&
permission
!=
PermissionGroup
.
ignoreBatteryOptimizations
;
}
else
{
return
permission
!=
PermissionGroup
.
unknown
&&
permission
!=
PermissionGroup
.
mediaLibrary
&&
...
...
ios/Classes/PermissionHandlerEnums.h
View file @
6aeed0c6
...
...
@@ -21,6 +21,7 @@ typedef NS_ENUM(int, PermissionGroup) {
PermissionGroupSms
,
PermissionGroupSpeech
,
PermissionGroupStorage
,
PermissionGroupIgnoreBatteryOptimizations
,
PermissionGroupUnknown
,
};
...
...
lib/src/permission_enums.dart
View file @
6aeed0c6
...
...
@@ -143,8 +143,12 @@ class PermissionGroup {
/// iOS: Nothing
static
const
PermissionGroup
storage
=
PermissionGroup
.
_
(
14
);
/// Android: Ignore Battery Optimizations
static
const
PermissionGroup
ignoreBatteryOptimizations
=
PermissionGroup
.
_
(
15
);
/// The unknown permission only used for return type, never requested
static
const
PermissionGroup
unknown
=
PermissionGroup
.
_
(
1
5
);
static
const
PermissionGroup
unknown
=
PermissionGroup
.
_
(
1
6
);
static
const
List
<
PermissionGroup
>
values
=
<
PermissionGroup
>[
calendar
,
...
...
@@ -162,6 +166,7 @@ class PermissionGroup {
sms
,
speech
,
storage
,
ignoreBatteryOptimizations
,
unknown
,
];
...
...
@@ -181,6 +186,7 @@ class PermissionGroup {
'sms'
,
'speech'
,
'storage'
,
'ignoreBatteryOptimizations'
,
'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