1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.fuelgauge; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.ArgumentMatchers.any; 22 import static org.mockito.ArgumentMatchers.anyInt; 23 import static org.mockito.Mockito.doAnswer; 24 import static org.mockito.Mockito.doReturn; 25 import static org.mockito.Mockito.never; 26 import static org.mockito.Mockito.spy; 27 import static org.mockito.Mockito.verify; 28 29 import android.content.Context; 30 31 import androidx.test.core.app.ApplicationProvider; 32 33 import com.android.settingslib.widget.MainSwitchPreference; 34 import com.android.settingslib.widget.SelectorWithWidgetPreference; 35 36 import org.junit.Before; 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 import org.mockito.Mock; 40 import org.mockito.MockitoAnnotations; 41 import org.mockito.stubbing.Answer; 42 import org.robolectric.RobolectricTestRunner; 43 44 @RunWith(RobolectricTestRunner.class) 45 public class BatteryOptimizationModePreferenceControllerTest { 46 private static final int UID = 12345; 47 private static final String PACKAGE_NAME = "com.android.app"; 48 49 private int mTestMode; 50 private Context mContext; 51 private BatteryOptimizationModePreferenceController mBackgroundUsageController; 52 private BatteryOptimizeUtils mBatteryOptimizeUtils; 53 54 @Mock MainSwitchPreference mBackgroundUsageAllowabilityPreference; 55 @Mock SelectorWithWidgetPreference mOptimizedPreference; 56 @Mock SelectorWithWidgetPreference mUnrestrictedPreference; 57 58 @Before setUp()59 public void setUp() throws Exception { 60 MockitoAnnotations.initMocks(this); 61 62 mContext = spy(ApplicationProvider.getApplicationContext()); 63 prepareTestBatteryOptimizationUtils(); 64 mBackgroundUsageController = 65 spy( 66 new BatteryOptimizationModePreferenceController( 67 mContext, "test", mBatteryOptimizeUtils)); 68 mBackgroundUsageController.mBackgroundUsageAllowabilityPreference = 69 mBackgroundUsageAllowabilityPreference; 70 mBackgroundUsageController.mOptimizedPreference = mOptimizedPreference; 71 mBackgroundUsageController.mUnrestrictedPreference = mUnrestrictedPreference; 72 } 73 74 @Test initPreferences_mutableMode_setEnabled()75 public void initPreferences_mutableMode_setEnabled() { 76 doReturn(true).when(mBatteryOptimizeUtils).isOptimizeModeMutable(); 77 78 mBackgroundUsageController.initPreferences(); 79 80 verify(mBackgroundUsageAllowabilityPreference).setEnabled(true); 81 verify(mOptimizedPreference).setEnabled(true); 82 verify(mUnrestrictedPreference).setEnabled(true); 83 verify(mBackgroundUsageAllowabilityPreference, never()).setOnPreferenceClickListener(any()); 84 verify(mBackgroundUsageAllowabilityPreference).setOnPreferenceChangeListener(any()); 85 verify(mOptimizedPreference).setOnPreferenceClickListener(any()); 86 verify(mUnrestrictedPreference).setOnPreferenceClickListener(any()); 87 } 88 89 @Test initPreferences_immutableMode_setDisabledAndSkipSetListeners()90 public void initPreferences_immutableMode_setDisabledAndSkipSetListeners() { 91 doReturn(false).when(mBatteryOptimizeUtils).isOptimizeModeMutable(); 92 93 mBackgroundUsageController.initPreferences(); 94 95 verify(mBackgroundUsageAllowabilityPreference).setEnabled(false); 96 verify(mOptimizedPreference).setEnabled(false); 97 verify(mUnrestrictedPreference).setEnabled(false); 98 verify(mBackgroundUsageAllowabilityPreference, never()).setOnPreferenceClickListener(any()); 99 verify(mBackgroundUsageAllowabilityPreference, never()) 100 .setOnPreferenceChangeListener(any()); 101 verify(mOptimizedPreference, never()).setOnPreferenceClickListener(any()); 102 verify(mUnrestrictedPreference, never()).setOnPreferenceClickListener(any()); 103 } 104 105 @Test updatePreferences_setIntoUnrestrictedMode_setExpectedPrefStatus()106 public void updatePreferences_setIntoUnrestrictedMode_setExpectedPrefStatus() { 107 mTestMode = BatteryOptimizeUtils.MODE_UNRESTRICTED; 108 109 mBackgroundUsageController.updatePreferences(mTestMode); 110 111 verifyPreferences(mTestMode); 112 } 113 114 @Test updatePreferences_setIntoOptimizedMode_setExpectedPrefStatus()115 public void updatePreferences_setIntoOptimizedMode_setExpectedPrefStatus() { 116 mTestMode = BatteryOptimizeUtils.MODE_OPTIMIZED; 117 118 mBackgroundUsageController.updatePreferences(mTestMode); 119 120 verifyPreferences(mTestMode); 121 } 122 123 @Test updatePreferences_setIntoRestrictedMode_setExpectedPrefStatus()124 public void updatePreferences_setIntoRestrictedMode_setExpectedPrefStatus() { 125 mTestMode = BatteryOptimizeUtils.MODE_RESTRICTED; 126 127 mBackgroundUsageController.updatePreferences(mTestMode); 128 129 verifyPreferences(mTestMode); 130 } 131 132 @Test handleBatteryOptimizeModeUpdated_modeChange_setExpectedPrefStatus()133 public void handleBatteryOptimizeModeUpdated_modeChange_setExpectedPrefStatus() { 134 mTestMode = BatteryOptimizeUtils.MODE_RESTRICTED; 135 136 mBackgroundUsageController.handleBatteryOptimizeModeUpdated( 137 BatteryOptimizeUtils.MODE_OPTIMIZED); 138 139 verify(mBatteryOptimizeUtils) 140 .setAppUsageState( 141 BatteryOptimizeUtils.MODE_OPTIMIZED, 142 BatteryOptimizeHistoricalLogEntry.Action.APPLY); 143 assertThat(mTestMode).isEqualTo(BatteryOptimizeUtils.MODE_OPTIMIZED); 144 verifyPreferences(mBatteryOptimizeUtils.getAppOptimizationMode()); 145 } 146 147 @Test handleBatteryOptimizeModeUpdated_modeNotChange_setExpectedPrefStatus()148 public void handleBatteryOptimizeModeUpdated_modeNotChange_setExpectedPrefStatus() { 149 mTestMode = BatteryOptimizeUtils.MODE_RESTRICTED; 150 151 mBackgroundUsageController.handleBatteryOptimizeModeUpdated( 152 BatteryOptimizeUtils.MODE_RESTRICTED); 153 154 verify(mBatteryOptimizeUtils, never()).setAppUsageState(anyInt(), any()); 155 assertThat(mTestMode).isEqualTo(BatteryOptimizeUtils.MODE_RESTRICTED); 156 verify(mBackgroundUsageController, never()).updatePreferences(anyInt()); 157 } 158 prepareTestBatteryOptimizationUtils()159 private void prepareTestBatteryOptimizationUtils() { 160 mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(mContext, UID, PACKAGE_NAME)); 161 Answer<Void> setTestMode = 162 invocation -> { 163 mTestMode = invocation.getArgument(0); 164 return null; 165 }; 166 doAnswer(setTestMode).when(mBatteryOptimizeUtils).setAppUsageState(anyInt(), any()); 167 Answer<Integer> getTestMode = invocation -> mTestMode; 168 doAnswer(getTestMode).when(mBatteryOptimizeUtils).getAppOptimizationMode(); 169 } 170 verifyPreferences(int mode)171 private void verifyPreferences(int mode) { 172 boolean isAllowBackground = mode != BatteryOptimizeUtils.MODE_RESTRICTED; 173 verify(mBackgroundUsageAllowabilityPreference).setChecked(isAllowBackground); 174 verify(mOptimizedPreference).setEnabled(isAllowBackground); 175 verify(mUnrestrictedPreference).setEnabled(isAllowBackground); 176 verify(mOptimizedPreference).setChecked(mode == BatteryOptimizeUtils.MODE_OPTIMIZED); 177 verify(mUnrestrictedPreference).setChecked(mode == BatteryOptimizeUtils.MODE_UNRESTRICTED); 178 } 179 } 180