From 7676217e4d82d5e4b57095aade5daa1feb83695d Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Wed, 10 Apr 2024 10:30:57 -0700 Subject: [PATCH] Call noteAppRestrictionChanged when toggling restrictions/exemptions This is to log the reasons for restriction level change and force stop Bug: 333882527 Test: statsd_testdrive 863 Toggle battery restrictions manually for an app and verify logging of reason atest BatteryOptimizeUtilsTest Change-Id: Ifcc99efc1b6acc5a992f7d952967210b07319f2e --- .../appinfo/AppButtonsPreferenceController.java | 5 +++++ .../android/settings/fuelgauge/BatteryOptimizeUtils.java | 4 ++-- src/com/android/settings/fuelgauge/BatteryUtils.java | 9 +++++++++ src/com/android/settings/fuelgauge/HighPowerDetail.java | 4 ++-- .../settings/spa/app/appinfo/PackageInfoPresenter.kt | 8 ++++++++ .../settings/fuelgauge/BatteryOptimizeUtilsTest.java | 8 ++++---- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 277f54b7464..41ce1fa35d9 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -558,6 +558,11 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp ActivityManager am = (ActivityManager) mActivity.getSystemService( Context.ACTIVITY_SERVICE); Log.d(TAG, "Stopping package " + pkgName); + if (android.app.Flags.appRestrictionsApi()) { + am.noteAppRestrictionEnabled(pkgName, mAppEntry.info.uid, + ActivityManager.RESTRICTION_LEVEL_FORCE_STOPPED, true, + ActivityManager.RESTRICTION_REASON_USER, "settings", 0L); + } am.forceStopPackage(pkgName); int userId = UserHandle.getUserId(mAppEntry.info.uid); mState.invalidatePackage(pkgName, userId); diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index 001876c394b..62e28fe6988 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -345,9 +345,9 @@ public class BatteryOptimizeUtils { try { batteryUtils.setForceAppStandby(uid, packageName, appStandbyMode); if (allowListed) { - powerAllowlistBackend.addApp(packageName); + powerAllowlistBackend.addApp(packageName, uid); } else { - powerAllowlistBackend.removeApp(packageName); + powerAllowlistBackend.removeApp(packageName, uid); } } catch (Exception e) { // Error cases, set standby mode as -1 for logging. diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 767f2c01881..b53bf477104 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -15,6 +15,7 @@ */ package com.android.settings.fuelgauge; +import android.app.ActivityManager; import android.app.AppOpsManager; import android.content.Context; import android.content.Intent; @@ -386,6 +387,14 @@ public class BatteryUtils { // Control whether app could run in the background if it is pre O app mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, mode); } + // Notify system of reason for change + if (isForceAppStandbyEnabled(uid, packageName) != (mode == AppOpsManager.MODE_IGNORED)) { + mContext.getSystemService(ActivityManager.class).noteAppRestrictionEnabled( + packageName, uid, ActivityManager.RESTRICTION_LEVEL_BACKGROUND_RESTRICTED, + mode == AppOpsManager.MODE_IGNORED, + ActivityManager.RESTRICTION_REASON_USER, + "settings", 0); + } // Control whether app could run jobs in the background mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, mode); diff --git a/src/com/android/settings/fuelgauge/HighPowerDetail.java b/src/com/android/settings/fuelgauge/HighPowerDetail.java index b2585a6d23f..ee9efaef87a 100644 --- a/src/com/android/settings/fuelgauge/HighPowerDetail.java +++ b/src/com/android/settings/fuelgauge/HighPowerDetail.java @@ -142,9 +142,9 @@ public class HighPowerDetail extends InstrumentedDialogFragment if (newValue) { mBatteryUtils.setForceAppStandby( mPackageUid, mPackageName, AppOpsManager.MODE_ALLOWED); - mBackend.addApp(mPackageName); + mBackend.addApp(mPackageName, mPackageUid); } else { - mBackend.removeApp(mPackageName); + mBackend.removeApp(mPackageName, mPackageUid); } } } diff --git a/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt b/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt index 81abae5a3e0..d5ce3af8e89 100644 --- a/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt +++ b/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt @@ -16,6 +16,7 @@ package com.android.settings.spa.app.appinfo +import android.app.ActivityManager import android.app.settings.SettingsEnums import android.content.Context import android.content.Intent @@ -154,6 +155,13 @@ class PackageInfoPresenter( logAction(SettingsEnums.ACTION_APP_FORCE_STOP) coroutineScope.launch(Dispatchers.Default) { Log.d(TAG, "Stopping package $packageName") + if (android.app.Flags.appRestrictionsApi()) { + val uid = userPackageManager.getPackageUid(packageName, 0) + context.activityManager.noteAppRestrictionEnabled( + packageName, uid, + ActivityManager.RESTRICTION_LEVEL_FORCE_STOPPED, true, + ActivityManager.RESTRICTION_REASON_USER, "settings", 0) + } context.activityManager.forceStopPackageAsUser(packageName, userId) } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java index 6085b9a3ce4..9686709c013 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java @@ -206,8 +206,8 @@ public class BatteryOptimizeUtilsTest { TimeUnit.SECONDS.sleep(1); verify(mMockBatteryUtils, never()).setForceAppStandby(anyInt(), anyString(), anyInt()); - verify(mMockBackend, never()).addApp(anyString()); - verify(mMockBackend, never()).removeApp(anyString()); + verify(mMockBackend, never()).addApp(anyString(), anyInt()); + verify(mMockBackend, never()).removeApp(anyString(), anyInt()); verifyNoInteractions(mObserver); } @@ -358,9 +358,9 @@ public class BatteryOptimizeUtilsTest { private void verifySetAppOptimizationMode(int appStandbyMode, boolean allowListed) { verify(mMockBatteryUtils).setForceAppStandby(UID, PACKAGE_NAME, appStandbyMode); if (allowListed) { - verify(mMockBackend).addApp(PACKAGE_NAME); + verify(mMockBackend).addApp(PACKAGE_NAME, UID); } else { - verify(mMockBackend).removeApp(PACKAGE_NAME); + verify(mMockBackend).removeApp(PACKAGE_NAME, UID); } } }