diff --git a/api/current.txt b/api/current.txt index 72b5ca44643c0..4b30051f4577a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23419,6 +23419,7 @@ package android.os { public final class PowerManager { method public boolean isDeviceIdleMode(); + method public boolean isIgnoringBatteryOptimizations(java.lang.String); method public boolean isInteractive(); method public boolean isPowerSaveMode(); method public deprecated boolean isScreenOn(); diff --git a/api/system-current.txt b/api/system-current.txt index 6ef78d07422a4..582e1463658f7 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -25341,6 +25341,7 @@ package android.os { public final class PowerManager { method public boolean isDeviceIdleMode(); + method public boolean isIgnoringBatteryOptimizations(java.lang.String); method public boolean isInteractive(); method public boolean isPowerSaveMode(); method public boolean isScreenBrightnessBoosted(); diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 970623a028766..83ce087b5134e 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -2248,6 +2248,7 @@ public abstract class Context { //@hide: VOICE_INTERACTION_MANAGER_SERVICE, //@hide: BACKUP_SERVICE, DROPBOX_SERVICE, + //@hide: DEVICE_IDLE_CONTROLLER, DEVICE_POLICY_SERVICE, UI_MODE_SERVICE, DOWNLOAD_SERVICE, @@ -2873,6 +2874,13 @@ public abstract class Context { */ public static final String DROPBOX_SERVICE = "dropbox"; + /** + * System service name for the DeviceIdleController. There is no Java API for this. + * @see #getSystemService + * @hide + */ + public static final String DEVICE_IDLE_CONTROLLER = "deviceidle"; + /** * Use with {@link #getSystemService} to retrieve a * {@link android.app.admin.DevicePolicyManager} for working with global diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 7a1aa1e5c4083..6ef1cd02ebf83 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -392,6 +392,8 @@ public final class PowerManager { final IPowerManager mService; final Handler mHandler; + IDeviceIdleController mIDeviceIdleController; + /** * {@hide} */ @@ -891,6 +893,25 @@ public final class PowerManager { } } + /** + * Return whether the given application package name is on the device's power whitelist. + * Apps can be placed on the whitelist through the settings UI invoked by + * {@link android.provider.Settings#ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}. + */ + public boolean isIgnoringBatteryOptimizations(String packageName) { + synchronized (this) { + if (mIDeviceIdleController == null) { + mIDeviceIdleController = IDeviceIdleController.Stub.asInterface( + ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); + } + } + try { + return mIDeviceIdleController.isPowerSaveWhitelistApp(packageName); + } catch (RemoteException e) { + return false; + } + } + /** * Turn off the device. * diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e335f6d95797b..dfd72c2e0c5f9 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -579,13 +579,14 @@ public final class Settings { /** * Activity Action: Show screen for controlling which apps can ignore battery optimizations. *
- * In some cases, a matching Activity may not exist, so ensure you - * safeguard against this. - *
- * Input: The Intent's data URI specifies the application package name + * Input: Optionally, the Intent's data URI specifies the application package name * to be shown, with the "package" scheme. That is "package:com.my.app". *
* Output: Nothing. + *
+ * You can use {@link android.os.PowerManager#isIgnoringBatteryOptimizations + * PowerManager.isIgnoringBatteryOptimizations()} to determine if an application is + * already ignoring optimizations. */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS = diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index ad34b370e846a..6eba3f6427aaa 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -95,8 +95,6 @@ public class DeviceIdleController extends SystemService private static final boolean COMPRESS_TIME = false; - public static final String SERVICE_NAME = "deviceidle"; - private static final String ACTION_STEP_IDLE_STATE = "com.android.server.device_idle.STEP_IDLE_STATE"; @@ -636,7 +634,7 @@ public class DeviceIdleController extends SystemService mInactiveTimeout = mConstants.INACTIVE_TIMEOUT; } - publishBinderService(SERVICE_NAME, new BinderService()); + publishBinderService(Context.DEVICE_IDLE_CONTROLLER, new BinderService()); } @Override diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 81ef4d57d70f2..e00945599332a 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -338,7 +338,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub mNetworkStats = checkNotNull(networkStats, "missing networkStats"); mNetworkManager = checkNotNull(networkManagement, "missing networkManagement"); mDeviceIdleController = IDeviceIdleController.Stub.asInterface(ServiceManager.getService( - DeviceIdleController.SERVICE_NAME)); + Context.DEVICE_IDLE_CONTROLLER)); mTime = checkNotNull(time, "missing TrustedTime"); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 837570b5f2708..75b8278ec32ae 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -196,7 +196,7 @@ public class UsageStatsService extends SystemService implements mAppWidgetManager = getContext().getSystemService(AppWidgetManager.class); mDeviceIdleController = IDeviceIdleController.Stub.asInterface( - ServiceManager.getService(DeviceIdleController.SERVICE_NAME)); + ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); mBatteryStats = IBatteryStats.Stub.asInterface( ServiceManager.getService(BatteryStats.SERVICE_NAME)); mDisplayManager = (DisplayManager) getContext().getSystemService( diff --git a/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java b/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java index 94cbabf05319e..2f0bf39028414 100644 --- a/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java +++ b/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java @@ -32,15 +32,18 @@ import android.content.ContentProviderClient; import android.content.Intent; import android.content.ServiceConnection; import android.graphics.BitmapFactory; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; +import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.graphics.Bitmap; +import android.provider.Settings; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -60,6 +63,7 @@ public class ActivityTestMain extends Activity { static final String KEY_CONFIGURATION = "configuration"; ActivityManager mAm; + PowerManager mPower; AlarmManager mAlarm; Configuration mOverrideConfig; int mSecondUser; @@ -158,8 +162,9 @@ public class ActivityTestMain extends Activity { Log.i(TAG, "Referrer: " + getReferrer()); - mAm = (ActivityManager)getSystemService(ACTIVITY_SERVICE); - mAlarm = (AlarmManager)getSystemService(ALARM_SERVICE); + mAm = getSystemService(ActivityManager.class); + mPower = getSystemService(PowerManager.class); + mAlarm = getSystemService(AlarmManager.class); if (savedInstanceState != null) { mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION); if (mOverrideConfig != null) { @@ -445,7 +450,7 @@ public class ActivityTestMain extends Activity { new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Intent intent = new Intent(Intent.ACTION_MAIN); - intent.putExtra("gulp", new int[1024*1024]); + intent.putExtra("gulp", new int[1024 * 1024]); startActivity(intent); return true; } @@ -457,6 +462,17 @@ public class ActivityTestMain extends Activity { return true; } }); + menu.add("Ignore battery optimizations").setOnMenuItemClickListener( + new MenuItem.OnMenuItemClickListener() { + @Override public boolean onMenuItemClick(MenuItem item) { + Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); + if (!mPower.isIgnoringBatteryOptimizations(getPackageName())) { + intent.setData(Uri.fromParts("package", getPackageName(), null)); + } + startActivity(intent); + return true; + } + }); return true; }