From ba3b5d7e53428b8259abe22e7b3f86ed43e8fe33 Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Fri, 29 Jul 2022 18:05:16 +0000 Subject: [PATCH] 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 --- .../server/usage/AppStandbyController.java | 6 ++++-- core/api/test-current.txt | 2 ++ .../android/app/usage/IUsageStatsManager.aidl | 1 + .../java/android/app/usage/UsageStatsManager.java | 13 +++++++++++++ core/java/android/os/IPowerManager.aidl | 1 + core/java/android/os/PowerManager.java | 15 +++++++++++++++ .../android/server/power/PowerManagerService.java | 11 +++++++++++ .../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 5d9f3357125af..f1c4eb45420cf 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -1543,8 +1543,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 463d0c49f72d6..7688b58eb690c 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -670,6 +670,7 @@ package android.app.usage { public final class UsageStatsManager { method public void forceUsageSourceSettingRead(); + method public boolean isAppStandbyEnabled(); } } @@ -1795,6 +1796,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 cc78f1a2ae7c4..429551722bfd8 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 1dfc7d48640e8..4b0ca28266565 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 4fe6524dee271..f1e3ab07686b7 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 3063d3ae92a51..01b75d104e5ee 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -1809,6 +1809,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 988b4eba852ef..2a1748c441dca 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -5787,6 +5787,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 a0b01a7fc27db..c6944ede2604d 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();