From 081dbac72e13b3ec09b2f654df2737ae85b80926 Mon Sep 17 00:00:00 2001 From: Jacky Wang Date: Fri, 8 Mar 2024 19:36:14 +0800 Subject: [PATCH] Reset app preferences does not trigger backup for App battery usages Bug: 328712606 Fix: 328712606 Test: UT && Verify logcat when change/reset App battery usages (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ef8a51fac85eedee8f9509b9f7c002281c1ae093) Merged-In: Ia3917c8dc2654185f5f048c048362fd47379b7d1 Change-Id: Ia3917c8dc2654185f5f048c048362fd47379b7d1 --- .../fuelgauge/AdvancedPowerUsageDetail.java | 9 ------ .../fuelgauge/BatteryOptimizeUtils.java | 12 +++++++ .../fuelgauge/PowerBackgroundUsageDetail.java | 9 ------ .../AdvancedPowerUsageDetailTest.java | 31 ------------------- .../fuelgauge/BatteryOptimizeUtilsTest.java | 15 +++++++++ 5 files changed, 27 insertions(+), 49 deletions(-) diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 6ef5aa82a49..42e6d9c4b68 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -52,7 +52,6 @@ import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.instrumentation.Instrumentable; -import com.android.settingslib.datastore.ChangeReason; import com.android.settingslib.widget.LayoutPreference; import java.util.ArrayList; @@ -272,7 +271,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment public void onPause() { super.onPause(); - notifyBackupManager(); final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode(); mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode); logMetricCategory(currentOptimizeMode); @@ -289,13 +287,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment Log.d(TAG, "Leave with mode: " + currentOptimizeMode); } - @VisibleForTesting - void notifyBackupManager() { - if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) { - BatterySettingsStorage.get(getContext()).notifyChange(ChangeReason.UPDATE); - } - } - @VisibleForTesting void initHeader() { final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header); diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index dc4aade4545..001876c394b 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -33,6 +33,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; +import com.android.settingslib.datastore.ChangeReason; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import java.lang.annotation.Retention; @@ -222,6 +223,10 @@ public class BatteryOptimizeUtils { return; } + // App preferences are already clear when code reach here, and there may be no + // setAppUsageStateInternal call to notifyChange. So always trigger notifyChange here. + BatterySettingsStorage.get(context).notifyChange(ChangeReason.DELETE); + allowlistBackend.refreshList(); // Resets optimization mode for each application. for (ApplicationInfo info : applications) { @@ -351,6 +356,9 @@ public class BatteryOptimizeUtils { } BatteryOptimizeLogUtils.writeLog( context, action, packageNameKey, createLogEvent(appStandbyMode, allowListed)); + if (action != Action.RESET) { // reset has been notified in resetAppOptimizationMode + BatterySettingsStorage.get(context).notifyChange(toChangeReason(action)); + } } private static String createLogEvent(int appStandbyMode, boolean allowListed) { @@ -362,4 +370,8 @@ public class BatteryOptimizeUtils { allowListed, getAppOptimizationMode(appStandbyMode, allowListed)); } + + private static @ChangeReason int toChangeReason(Action action) { + return action == Action.RESTORE ? ChangeReason.RESTORE : ChangeReason.UPDATE; + } } diff --git a/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java b/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java index 56702cf5c2a..b662d3ef908 100644 --- a/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java +++ b/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java @@ -41,7 +41,6 @@ import com.android.settingslib.HelpUtils; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.datastore.ChangeReason; import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.MainSwitchPreference; @@ -116,7 +115,6 @@ public class PowerBackgroundUsageDetail extends DashboardFragment public void onPause() { super.onPause(); - notifyBackupManager(); final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode(); mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode); logMetricCategory(currentOptimizeMode); @@ -183,13 +181,6 @@ public class PowerBackgroundUsageDetail extends DashboardFragment onRadioButtonClicked(isEnabled ? mOptimizePreference : null); } - @VisibleForTesting - void notifyBackupManager() { - if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) { - BatterySettingsStorage.get(getContext()).notifyChange(ChangeReason.UPDATE); - } - } - @VisibleForTesting int getSelectedPreference() { if (!mMainSwitchPreference.isChecked()) { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index 0648de4ad69..80739e9d47a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -60,12 +60,8 @@ import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; -import com.android.settingslib.datastore.ChangeReason; -import com.android.settingslib.datastore.Observer; import com.android.settingslib.widget.LayoutPreference; -import com.google.common.util.concurrent.MoreExecutors; - import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -119,10 +115,8 @@ public class AdvancedPowerUsageDetailTest { @Mock private AppOpsManager mAppOpsManager; @Mock private LoaderManager mLoaderManager; @Mock private BatteryOptimizeUtils mBatteryOptimizeUtils; - @Mock private Observer mObserver; private Context mContext; - private BatterySettingsStorage mBatterySettingsStorage; private PrimarySwitchPreference mAllowBackgroundUsagePreference; private AdvancedPowerUsageDetail mFragment; private SettingsActivity mTestActivity; @@ -134,7 +128,6 @@ public class AdvancedPowerUsageDetailTest { @Before public void setUp() { mContext = spy(ApplicationProvider.getApplicationContext()); - mBatterySettingsStorage = BatterySettingsStorage.get(mContext); when(mContext.getPackageName()).thenReturn("foo"); mFeatureFactory = FakeFeatureFactory.setupForTest(); mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider; @@ -448,28 +441,4 @@ public class AdvancedPowerUsageDetailTest { TimeUnit.SECONDS.sleep(1); verifyNoInteractions(mMetricsFeatureProvider); } - - @Test - public void notifyBackupManager_optimizationModeIsNotChanged_notInvokeDataChanged() { - mBatterySettingsStorage.addObserver(mObserver, MoreExecutors.directExecutor()); - final int mode = BatteryOptimizeUtils.MODE_RESTRICTED; - mFragment.mOptimizationMode = mode; - when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode); - - mFragment.notifyBackupManager(); - - verifyNoInteractions(mObserver); - } - - @Test - public void notifyBackupManager_optimizationModeIsChanged_invokeDataChanged() { - mBatterySettingsStorage.addObserver(mObserver, MoreExecutors.directExecutor()); - mFragment.mOptimizationMode = BatteryOptimizeUtils.MODE_RESTRICTED; - when(mBatteryOptimizeUtils.getAppOptimizationMode()) - .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED); - - mFragment.notifyBackupManager(); - - verify(mObserver).onChanged(ChangeReason.UPDATE); - } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java index 3551eeb431e..6085b9a3ce4 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java @@ -49,8 +49,12 @@ import android.os.UserManager; import android.util.ArraySet; import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; +import com.android.settingslib.datastore.ChangeReason; +import com.android.settingslib.datastore.Observer; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; +import com.google.common.util.concurrent.MoreExecutors; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -74,14 +78,18 @@ public class BatteryOptimizeUtilsTest { @Mock private PowerAllowlistBackend mMockBackend; @Mock private IPackageManager mMockIPackageManager; @Mock private UserManager mMockUserManager; + @Mock private Observer mObserver; private Context mContext; private BatteryOptimizeUtils mBatteryOptimizeUtils; + private BatterySettingsStorage mBatterySettingsStorage; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + mBatterySettingsStorage = BatterySettingsStorage.get(mContext); + mBatterySettingsStorage.addObserver(mObserver, MoreExecutors.directExecutor()); mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(mContext, UID, PACKAGE_NAME)); mBatteryOptimizeUtils.mAppOpsManager = mMockAppOpsManager; mBatteryOptimizeUtils.mBatteryUtils = mMockBatteryUtils; @@ -156,6 +164,7 @@ public class BatteryOptimizeUtilsTest { TimeUnit.SECONDS.sleep(1); verifySetAppOptimizationMode(AppOpsManager.MODE_IGNORED, /* allowListed */ false); + verify(mObserver).onChanged(ChangeReason.UPDATE); } @Test @@ -169,6 +178,7 @@ public class BatteryOptimizeUtilsTest { TimeUnit.SECONDS.sleep(1); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ true); + verify(mObserver).onChanged(ChangeReason.UPDATE); } @Test @@ -182,6 +192,7 @@ public class BatteryOptimizeUtilsTest { TimeUnit.SECONDS.sleep(1); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false); + verify(mObserver).onChanged(ChangeReason.UPDATE); } @Test @@ -197,6 +208,7 @@ public class BatteryOptimizeUtilsTest { verify(mMockBatteryUtils, never()).setForceAppStandby(anyInt(), anyString(), anyInt()); verify(mMockBackend, never()).addApp(anyString()); verify(mMockBackend, never()).removeApp(anyString()); + verifyNoInteractions(mObserver); } @Test @@ -288,6 +300,7 @@ public class BatteryOptimizeUtilsTest { inOrder.verify(mMockBackend).isAllowlisted(PACKAGE_NAME, UID); inOrder.verify(mMockBackend).isSysAllowlisted(PACKAGE_NAME); verifyNoMoreInteractions(mMockBackend); + verify(mObserver).onChanged(ChangeReason.DELETE); } @Test @@ -298,6 +311,7 @@ public class BatteryOptimizeUtilsTest { /* isSystemOrDefaultApp */ false); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false); + verify(mObserver).onChanged(ChangeReason.DELETE); } @Test @@ -308,6 +322,7 @@ public class BatteryOptimizeUtilsTest { /* isSystemOrDefaultApp */ false); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false); + verify(mObserver).onChanged(ChangeReason.DELETE); } private void runTestForResetWithMode(