From 1656f9a8b6ba2335a463d2d5218270a29833d39f Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Fri, 29 Jul 2022 18:05:16 +0000 Subject: Support test skipping when power save modes aren't enabled. Some classes of devices will not have auto power save modes enabled. On those devices, we should skip tests that require the modes be enabled. Bug: 240108412 Bug: 240630396 Test: Manually go through CTS-V "Ignore Battery Optimizations Test" Test: atest CtsUsageStatsTestCases:UsageStatsTest Change-Id: Icc64fbe75213386a1f41fae258e50c4032920b0a (cherry picked from commit ba3b5d7e53428b8259abe22e7b3f86ed43e8fe33) Merged-In: Icc64fbe75213386a1f41fae258e50c4032920b0a --- .../com/android/server/usage/AppStandbyController.java | 6 ++++-- core/api/test-current.txt | 2 ++ core/java/android/app/usage/IUsageStatsManager.aidl | 1 + core/java/android/app/usage/UsageStatsManager.java | 13 +++++++++++++ core/java/android/os/IPowerManager.aidl | 1 + core/java/android/os/PowerManager.java | 15 +++++++++++++++ .../com/android/server/power/PowerManagerService.java | 11 +++++++++++ .../java/com/android/server/usage/UsageStatsService.java | 5 +++++ 8 files changed, 52 insertions(+), 2 deletions(-) diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index a6f47d4e4908..c1316991535e 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -1554,8 +1554,10 @@ public class AppStandbyController @Override @StandbyBuckets public int getAppStandbyBucket(String packageName, int userId, long elapsedRealtime, boolean shouldObfuscateInstantApps) { - if (!mAppIdleEnabled || (shouldObfuscateInstantApps - && mInjector.isPackageEphemeral(userId, packageName))) { + if (!mAppIdleEnabled) { + return STANDBY_BUCKET_EXEMPTED; + } + if (shouldObfuscateInstantApps && mInjector.isPackageEphemeral(userId, packageName)) { return STANDBY_BUCKET_ACTIVE; } diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 6e61569a8352..984c19d6acbb 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -683,6 +683,7 @@ package android.app.usage { public final class UsageStatsManager { method public void forceUsageSourceSettingRead(); + method public boolean isAppStandbyEnabled(); } } @@ -1834,6 +1835,7 @@ package android.os { } public final class PowerManager { + method public boolean areAutoPowerSaveModesEnabled(); method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_LOW_POWER_STANDBY, android.Manifest.permission.DEVICE_POWER}) public void forceLowPowerStandbyActive(boolean); field public static final String ACTION_ENHANCED_DISCHARGE_PREDICTION_CHANGED = "android.os.action.ENHANCED_DISCHARGE_PREDICTION_CHANGED"; field @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public static final int SYSTEM_WAKELOCK = -2147483648; // 0x80000000 diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl index d4fbdc6850a4..dc173132a58d 100644 --- a/core/java/android/app/usage/IUsageStatsManager.aidl +++ b/core/java/android/app/usage/IUsageStatsManager.aidl @@ -44,6 +44,7 @@ interface IUsageStatsManager { UsageEvents queryEventsForPackageForUser(long beginTime, long endTime, int userId, String pkg, String callingPackage); @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) void setAppInactive(String packageName, boolean inactive, int userId); + boolean isAppStandbyEnabled(); @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) boolean isAppInactive(String packageName, int userId, String callingPackage); void onCarrierPrivilegedAppsChanged(); diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index 1dfc7d48640e..4b0ca2826656 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -641,6 +641,19 @@ public final class UsageStatsManager { return aggregatedStats; } + /** + * Returns whether the app standby bucket feature is enabled. + * @hide + */ + @TestApi + public boolean isAppStandbyEnabled() { + try { + return mService.isAppStandbyEnabled(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Returns whether the specified app is currently considered inactive. This will be true if the * app hasn't been used directly or indirectly for a period of time defined by the system. This diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index 4fe6524dee27..f1e3ab07686b 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -53,6 +53,7 @@ interface IPowerManager float getBrightnessConstraint(int constraint); @UnsupportedAppUsage boolean isInteractive(); + boolean areAutoPowerSaveModesEnabled(); boolean isPowerSaveMode(); PowerSaveState getPowerSaveState(int serviceType); boolean setPowerSaveModeEnabled(boolean mode); diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 132bd667f6db..aa733b5c6d49 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -1865,6 +1865,21 @@ public final class PowerManager { } } + /** + * Returns true if the platform has auto power save modes (eg. Doze & app standby) enabled. + * This doesn't necessarily mean that the individual features are enabled. For example, if this + * returns true, Doze might be enabled while app standby buckets remain disabled. + * @hide + */ + @TestApi + public boolean areAutoPowerSaveModesEnabled() { + try { + return mService.areAutoPowerSaveModesEnabled(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Returns true if the device is currently in power save mode. When in this mode, * applications should reduce their functionality in order to conserve battery as diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 6fb7af1a3610..9e0d9c6a3240 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -5824,6 +5824,17 @@ public final class PowerManagerService extends SystemService } } + @Override // Binder call + public boolean areAutoPowerSaveModesEnabled() { + final long ident = Binder.clearCallingIdentity(); + try { + return mContext.getResources().getBoolean( + com.android.internal.R.bool.config_enableAutoPowerModes); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + @Override // Binder call public boolean isPowerSaveMode() { final long ident = Binder.clearCallingIdentity(); diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index a2b5520372ce..140dad51fc1b 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -2288,6 +2288,11 @@ public class UsageStatsService extends SystemService implements } } + @Override + public boolean isAppStandbyEnabled() { + return mAppStandby.isAppIdleEnabled(); + } + @Override public boolean isAppInactive(String packageName, int userId, String callingPackage) { final int callingUid = Binder.getCallingUid(); -- cgit v1.2.3-59-g8ed1b