Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef8a51fa authored by Jacky Wang's avatar Jacky Wang
Browse files

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
parent 7dee0538
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -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);
+12 −0
Original line number Diff line number Diff line
@@ -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;
    }
}
+0 −9
Original line number Diff line number Diff line
@@ -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()) {
+0 −31
Original line number Diff line number Diff line
@@ -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);
    }
}
+15 −0
Original line number Diff line number Diff line
@@ -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(