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
Change-Id: Ia3917c8dc2654185f5f048c048362fd47379b7d1
This commit is contained in:
Jacky Wang
2024-03-08 19:36:14 +08:00
parent 7dee0538d6
commit ef8a51fac8
5 changed files with 27 additions and 49 deletions

View File

@@ -52,7 +52,6 @@ import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.Instrumentable; import com.android.settingslib.core.instrumentation.Instrumentable;
import com.android.settingslib.datastore.ChangeReason;
import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.LayoutPreference;
import java.util.ArrayList; import java.util.ArrayList;
@@ -272,7 +271,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
notifyBackupManager();
final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode(); final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode();
mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode); mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode);
logMetricCategory(currentOptimizeMode); logMetricCategory(currentOptimizeMode);
@@ -289,13 +287,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment
Log.d(TAG, "Leave with mode: " + currentOptimizeMode); Log.d(TAG, "Leave with mode: " + currentOptimizeMode);
} }
@VisibleForTesting
void notifyBackupManager() {
if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
BatterySettingsStorage.get(getContext()).notifyChange(ChangeReason.UPDATE);
}
}
@VisibleForTesting @VisibleForTesting
void initHeader() { void initHeader() {
final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header); final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header);

View File

@@ -33,6 +33,7 @@ import androidx.annotation.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action;
import com.android.settingslib.datastore.ChangeReason;
import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@@ -222,6 +223,10 @@ public class BatteryOptimizeUtils {
return; 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(); allowlistBackend.refreshList();
// Resets optimization mode for each application. // Resets optimization mode for each application.
for (ApplicationInfo info : applications) { for (ApplicationInfo info : applications) {
@@ -351,6 +356,9 @@ public class BatteryOptimizeUtils {
} }
BatteryOptimizeLogUtils.writeLog( BatteryOptimizeLogUtils.writeLog(
context, action, packageNameKey, createLogEvent(appStandbyMode, allowListed)); 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) { private static String createLogEvent(int appStandbyMode, boolean allowListed) {
@@ -362,4 +370,8 @@ public class BatteryOptimizeUtils {
allowListed, allowListed,
getAppOptimizationMode(appStandbyMode, allowListed)); getAppOptimizationMode(appStandbyMode, allowListed));
} }
private static @ChangeReason int toChangeReason(Action action) {
return action == Action.RESTORE ? ChangeReason.RESTORE : ChangeReason.UPDATE;
}
} }

View File

@@ -41,7 +41,6 @@ import com.android.settingslib.HelpUtils;
import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.datastore.ChangeReason;
import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.LayoutPreference;
import com.android.settingslib.widget.MainSwitchPreference; import com.android.settingslib.widget.MainSwitchPreference;
@@ -116,7 +115,6 @@ public class PowerBackgroundUsageDetail extends DashboardFragment
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
notifyBackupManager();
final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode(); final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode();
mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode); mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode);
logMetricCategory(currentOptimizeMode); logMetricCategory(currentOptimizeMode);
@@ -183,13 +181,6 @@ public class PowerBackgroundUsageDetail extends DashboardFragment
onRadioButtonClicked(isEnabled ? mOptimizePreference : null); onRadioButtonClicked(isEnabled ? mOptimizePreference : null);
} }
@VisibleForTesting
void notifyBackupManager() {
if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
BatterySettingsStorage.get(getContext()).notifyChange(ChangeReason.UPDATE);
}
}
@VisibleForTesting @VisibleForTesting
int getSelectedPreference() { int getSelectedPreference() {
if (!mMainSwitchPreference.isChecked()) { if (!mMainSwitchPreference.isChecked()) {

View File

@@ -60,12 +60,8 @@ import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.instantapps.InstantAppDataProvider; import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; 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.android.settingslib.widget.LayoutPreference;
import com.google.common.util.concurrent.MoreExecutors;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
@@ -119,10 +115,8 @@ public class AdvancedPowerUsageDetailTest {
@Mock private AppOpsManager mAppOpsManager; @Mock private AppOpsManager mAppOpsManager;
@Mock private LoaderManager mLoaderManager; @Mock private LoaderManager mLoaderManager;
@Mock private BatteryOptimizeUtils mBatteryOptimizeUtils; @Mock private BatteryOptimizeUtils mBatteryOptimizeUtils;
@Mock private Observer mObserver;
private Context mContext; private Context mContext;
private BatterySettingsStorage mBatterySettingsStorage;
private PrimarySwitchPreference mAllowBackgroundUsagePreference; private PrimarySwitchPreference mAllowBackgroundUsagePreference;
private AdvancedPowerUsageDetail mFragment; private AdvancedPowerUsageDetail mFragment;
private SettingsActivity mTestActivity; private SettingsActivity mTestActivity;
@@ -134,7 +128,6 @@ public class AdvancedPowerUsageDetailTest {
@Before @Before
public void setUp() { public void setUp() {
mContext = spy(ApplicationProvider.getApplicationContext()); mContext = spy(ApplicationProvider.getApplicationContext());
mBatterySettingsStorage = BatterySettingsStorage.get(mContext);
when(mContext.getPackageName()).thenReturn("foo"); when(mContext.getPackageName()).thenReturn("foo");
mFeatureFactory = FakeFeatureFactory.setupForTest(); mFeatureFactory = FakeFeatureFactory.setupForTest();
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider; mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
@@ -448,28 +441,4 @@ public class AdvancedPowerUsageDetailTest {
TimeUnit.SECONDS.sleep(1); TimeUnit.SECONDS.sleep(1);
verifyNoInteractions(mMetricsFeatureProvider); 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);
}
} }

View File

@@ -49,8 +49,12 @@ import android.os.UserManager;
import android.util.ArraySet; import android.util.ArraySet;
import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; 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.android.settingslib.fuelgauge.PowerAllowlistBackend;
import com.google.common.util.concurrent.MoreExecutors;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -74,14 +78,18 @@ public class BatteryOptimizeUtilsTest {
@Mock private PowerAllowlistBackend mMockBackend; @Mock private PowerAllowlistBackend mMockBackend;
@Mock private IPackageManager mMockIPackageManager; @Mock private IPackageManager mMockIPackageManager;
@Mock private UserManager mMockUserManager; @Mock private UserManager mMockUserManager;
@Mock private Observer mObserver;
private Context mContext; private Context mContext;
private BatteryOptimizeUtils mBatteryOptimizeUtils; private BatteryOptimizeUtils mBatteryOptimizeUtils;
private BatterySettingsStorage mBatterySettingsStorage;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
mBatterySettingsStorage = BatterySettingsStorage.get(mContext);
mBatterySettingsStorage.addObserver(mObserver, MoreExecutors.directExecutor());
mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(mContext, UID, PACKAGE_NAME)); mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(mContext, UID, PACKAGE_NAME));
mBatteryOptimizeUtils.mAppOpsManager = mMockAppOpsManager; mBatteryOptimizeUtils.mAppOpsManager = mMockAppOpsManager;
mBatteryOptimizeUtils.mBatteryUtils = mMockBatteryUtils; mBatteryOptimizeUtils.mBatteryUtils = mMockBatteryUtils;
@@ -156,6 +164,7 @@ public class BatteryOptimizeUtilsTest {
TimeUnit.SECONDS.sleep(1); TimeUnit.SECONDS.sleep(1);
verifySetAppOptimizationMode(AppOpsManager.MODE_IGNORED, /* allowListed */ false); verifySetAppOptimizationMode(AppOpsManager.MODE_IGNORED, /* allowListed */ false);
verify(mObserver).onChanged(ChangeReason.UPDATE);
} }
@Test @Test
@@ -169,6 +178,7 @@ public class BatteryOptimizeUtilsTest {
TimeUnit.SECONDS.sleep(1); TimeUnit.SECONDS.sleep(1);
verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ true); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ true);
verify(mObserver).onChanged(ChangeReason.UPDATE);
} }
@Test @Test
@@ -182,6 +192,7 @@ public class BatteryOptimizeUtilsTest {
TimeUnit.SECONDS.sleep(1); TimeUnit.SECONDS.sleep(1);
verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false);
verify(mObserver).onChanged(ChangeReason.UPDATE);
} }
@Test @Test
@@ -197,6 +208,7 @@ public class BatteryOptimizeUtilsTest {
verify(mMockBatteryUtils, never()).setForceAppStandby(anyInt(), anyString(), anyInt()); verify(mMockBatteryUtils, never()).setForceAppStandby(anyInt(), anyString(), anyInt());
verify(mMockBackend, never()).addApp(anyString()); verify(mMockBackend, never()).addApp(anyString());
verify(mMockBackend, never()).removeApp(anyString()); verify(mMockBackend, never()).removeApp(anyString());
verifyNoInteractions(mObserver);
} }
@Test @Test
@@ -288,6 +300,7 @@ public class BatteryOptimizeUtilsTest {
inOrder.verify(mMockBackend).isAllowlisted(PACKAGE_NAME, UID); inOrder.verify(mMockBackend).isAllowlisted(PACKAGE_NAME, UID);
inOrder.verify(mMockBackend).isSysAllowlisted(PACKAGE_NAME); inOrder.verify(mMockBackend).isSysAllowlisted(PACKAGE_NAME);
verifyNoMoreInteractions(mMockBackend); verifyNoMoreInteractions(mMockBackend);
verify(mObserver).onChanged(ChangeReason.DELETE);
} }
@Test @Test
@@ -298,6 +311,7 @@ public class BatteryOptimizeUtilsTest {
/* isSystemOrDefaultApp */ false); /* isSystemOrDefaultApp */ false);
verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false);
verify(mObserver).onChanged(ChangeReason.DELETE);
} }
@Test @Test
@@ -308,6 +322,7 @@ public class BatteryOptimizeUtilsTest {
/* isSystemOrDefaultApp */ false); /* isSystemOrDefaultApp */ false);
verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false); verifySetAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false);
verify(mObserver).onChanged(ChangeReason.DELETE);
} }
private void runTestForResetWithMode( private void runTestForResetWithMode(