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

Commit 081dbac7 authored by Jacky Wang's avatar Jacky Wang Committed by Cherrypicker Worker
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
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ef8a51fac85eedee8f9509b9f7c002281c1ae093)
Merged-In: Ia3917c8dc2654185f5f048c048362fd47379b7d1
Change-Id: Ia3917c8dc2654185f5f048c048362fd47379b7d1
parent a234e169
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(