Commit 6aeed0c6 by Sebastian Roth

Add permission to ignore battery optimizations

parent e219b175
...@@ -11,11 +11,15 @@ import android.content.pm.ResolveInfo; ...@@ -11,11 +11,15 @@ import android.content.pm.ResolveInfo;
import android.location.LocationManager; import android.location.LocationManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; 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.provider.Settings;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import io.flutter.plugin.common.PluginRegistry.ActivityResultListener;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -37,6 +41,7 @@ import io.flutter.plugin.common.PluginRegistry.Registrar; ...@@ -37,6 +41,7 @@ import io.flutter.plugin.common.PluginRegistry.Registrar;
public class PermissionHandlerPlugin implements MethodCallHandler { public class PermissionHandlerPlugin implements MethodCallHandler {
private static final String LOG_TAG = "permissions_handler"; private static final String LOG_TAG = "permissions_handler";
private static final int PERMISSION_CODE = 24; private static final int PERMISSION_CODE = 24;
private static final int PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS = 5672353;
//PERMISSION_GROUP //PERMISSION_GROUP
private static final int PERMISSION_GROUP_CALENDAR = 0; private static final int PERMISSION_GROUP_CALENDAR = 0;
...@@ -54,7 +59,8 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -54,7 +59,8 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
private static final int PERMISSION_GROUP_SMS = 12; private static final int PERMISSION_GROUP_SMS = 12;
private static final int PERMISSION_GROUP_SPEECH = 13; private static final int PERMISSION_GROUP_SPEECH = 13;
private static final int PERMISSION_GROUP_STORAGE = 14; 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) { private PermissionHandlerPlugin(Registrar mRegistrar) {
this.mRegistrar = mRegistrar; this.mRegistrar = mRegistrar;
...@@ -77,6 +83,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -77,6 +83,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
PERMISSION_GROUP_SMS, PERMISSION_GROUP_SMS,
PERMISSION_GROUP_SPEECH, PERMISSION_GROUP_SPEECH,
PERMISSION_GROUP_STORAGE, PERMISSION_GROUP_STORAGE,
PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS,
PERMISSION_GROUP_UNKNOWN, PERMISSION_GROUP_UNKNOWN,
}) })
private @interface PermissionGroup { private @interface PermissionGroup {
...@@ -133,6 +140,18 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -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 @PermissionGroup
...@@ -249,10 +268,23 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -249,10 +268,23 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
return PERMISSION_STATUS_UNKNOWN; 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) { for (String name : names) {
if (targetsMOrHigher) { 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); final int permissionStatus = ContextCompat.checkSelfPermission(context, name);
if (permissionStatus == PackageManager.PERMISSION_DENIED) { if (permissionStatus == PackageManager.PERMISSION_DENIED) {
return PERMISSION_STATUS_DENIED; return PERMISSION_STATUS_DENIED;
...@@ -312,6 +344,10 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -312,6 +344,10 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
return SERVICE_STATUS_ENABLED; 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; return SERVICE_STATUS_NOT_APPLICABLE;
} }
...@@ -371,7 +407,15 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -371,7 +407,15 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
continue; 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 { } else {
if (!mRequestResults.containsKey(permission)) { if (!mRequestResults.containsKey(permission)) {
mRequestResults.put(permission, PERMISSION_STATUS_GRANTED); mRequestResults.put(permission, PERMISSION_STATUS_GRANTED);
...@@ -429,6 +473,18 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -429,6 +473,18 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
processResult(); 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 @PermissionStatus
private int toPermissionStatus(int grantResult) { private int toPermissionStatus(int grantResult) {
return grantResult == PackageManager.PERMISSION_GRANTED ? PERMISSION_STATUS_GRANTED : PERMISSION_STATUS_DENIED; return grantResult == PackageManager.PERMISSION_GRANTED ? PERMISSION_STATUS_GRANTED : PERMISSION_STATUS_DENIED;
...@@ -533,7 +589,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -533,7 +589,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
break; break;
case PERMISSION_GROUP_SENSORS: 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)) { if (hasPermissionInManifest(Manifest.permission.BODY_SENSORS)) {
permissionNames.add(Manifest.permission.BODY_SENSORS); permissionNames.add(Manifest.permission.BODY_SENSORS);
} }
...@@ -565,6 +621,12 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -565,6 +621,12 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
permissionNames.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); permissionNames.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
break; 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_MEDIA_LIBRARY:
case PERMISSION_GROUP_PHOTOS: case PERMISSION_GROUP_PHOTOS:
case PERMISSION_GROUP_REMINDERS: case PERMISSION_GROUP_REMINDERS:
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SENSORS" /> <uses-permission android:name="android.permission.SENSORS" />
<uses-permission android:name="android.permission.BODY_SENSORS" /> <uses-permission android:name="android.permission.BODY_SENSORS" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<application <application
android:name="io.flutter.app.FlutterApplication" android:name="io.flutter.app.FlutterApplication"
......
...@@ -30,7 +30,9 @@ class MyApp extends StatelessWidget { ...@@ -30,7 +30,9 @@ class MyApp extends StatelessWidget {
return permission != PermissionGroup.unknown && return permission != PermissionGroup.unknown &&
permission != PermissionGroup.phone && permission != PermissionGroup.phone &&
permission != PermissionGroup.sms && permission != PermissionGroup.sms &&
permission != PermissionGroup.storage; permission != PermissionGroup.storage &&
permission !=
PermissionGroup.ignoreBatteryOptimizations;
} else { } else {
return permission != PermissionGroup.unknown && return permission != PermissionGroup.unknown &&
permission != PermissionGroup.mediaLibrary && permission != PermissionGroup.mediaLibrary &&
......
...@@ -21,6 +21,7 @@ typedef NS_ENUM(int, PermissionGroup) { ...@@ -21,6 +21,7 @@ typedef NS_ENUM(int, PermissionGroup) {
PermissionGroupSms, PermissionGroupSms,
PermissionGroupSpeech, PermissionGroupSpeech,
PermissionGroupStorage, PermissionGroupStorage,
PermissionGroupIgnoreBatteryOptimizations,
PermissionGroupUnknown, PermissionGroupUnknown,
}; };
......
...@@ -143,8 +143,12 @@ class PermissionGroup { ...@@ -143,8 +143,12 @@ class PermissionGroup {
/// iOS: Nothing /// iOS: Nothing
static const PermissionGroup storage = PermissionGroup._(14); 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 /// The unknown permission only used for return type, never requested
static const PermissionGroup unknown = PermissionGroup._(15); static const PermissionGroup unknown = PermissionGroup._(16);
static const List<PermissionGroup> values = <PermissionGroup>[ static const List<PermissionGroup> values = <PermissionGroup>[
calendar, calendar,
...@@ -162,6 +166,7 @@ class PermissionGroup { ...@@ -162,6 +166,7 @@ class PermissionGroup {
sms, sms,
speech, speech,
storage, storage,
ignoreBatteryOptimizations,
unknown, unknown,
]; ];
...@@ -181,6 +186,7 @@ class PermissionGroup { ...@@ -181,6 +186,7 @@ class PermissionGroup {
'sms', 'sms',
'speech', 'speech',
'storage', 'storage',
'ignoreBatteryOptimizations',
'unknown', 'unknown',
]; ];
......
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