1 /* 2 * Copyright (C) 2021 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.systemui.battery; 18 19 import static android.provider.Settings.System.SHOW_BATTERY_PERCENT; 20 21 import static com.android.systemui.util.mockito.KotlinMockitoHelpersKt.eq; 22 23 import static org.mockito.ArgumentMatchers.any; 24 import static org.mockito.ArgumentMatchers.anyBoolean; 25 import static org.mockito.ArgumentMatchers.anyInt; 26 import static org.mockito.Mockito.never; 27 import static org.mockito.Mockito.verify; 28 import static org.mockito.Mockito.when; 29 30 import android.content.ContentResolver; 31 import android.os.Handler; 32 import android.provider.Settings; 33 34 import androidx.test.filters.SmallTest; 35 36 import com.android.systemui.R; 37 import com.android.systemui.SysuiTestCase; 38 import com.android.systemui.flags.FakeFeatureFlags; 39 import com.android.systemui.settings.UserTracker; 40 import com.android.systemui.statusbar.phone.StatusBarLocation; 41 import com.android.systemui.statusbar.policy.BatteryController; 42 import com.android.systemui.statusbar.policy.ConfigurationController; 43 import com.android.systemui.tuner.TunerService; 44 45 import org.junit.Before; 46 import org.junit.Test; 47 import org.mockito.Mock; 48 import org.mockito.MockitoAnnotations; 49 50 @SmallTest 51 public class BatteryMeterViewControllerTest extends SysuiTestCase { 52 @Mock 53 private BatteryMeterView mBatteryMeterView; 54 55 @Mock 56 private UserTracker mUserTracker; 57 @Mock 58 private ConfigurationController mConfigurationController; 59 @Mock 60 private TunerService mTunerService; 61 @Mock 62 private Handler mHandler; 63 @Mock 64 private ContentResolver mContentResolver; 65 @Mock 66 private BatteryController mBatteryController; 67 private FakeFeatureFlags mFakeFeatureFlags = new FakeFeatureFlags(); 68 69 private BatteryMeterViewController mController; 70 71 @Before setup()72 public void setup() throws Exception { 73 MockitoAnnotations.initMocks(this); 74 75 when(mBatteryMeterView.getContext()).thenReturn(mContext); 76 when(mBatteryMeterView.getResources()).thenReturn(mContext.getResources()); 77 78 mContext.getOrCreateTestableResources().addOverride( 79 R.bool.flag_battery_shield_icon, false); 80 } 81 82 @Test onViewAttached_callbacksRegistered()83 public void onViewAttached_callbacksRegistered() { 84 initController(); 85 mController.onViewAttached(); 86 87 verify(mConfigurationController).addCallback(any()); 88 verify(mTunerService).addTunable(any(), any()); 89 verify(mContentResolver).registerContentObserver( 90 eq(Settings.System.getUriFor(SHOW_BATTERY_PERCENT)), anyBoolean(), any(), anyInt() 91 ); 92 verify(mContentResolver).registerContentObserver( 93 eq(Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME)), 94 anyBoolean(), 95 any() 96 ); 97 verify(mBatteryController).addCallback(any()); 98 } 99 100 @Test onViewDetached_callbacksUnregistered()101 public void onViewDetached_callbacksUnregistered() { 102 initController(); 103 // Set everything up first. 104 mController.onViewAttached(); 105 106 mController.onViewDetached(); 107 108 verify(mConfigurationController).removeCallback(any()); 109 verify(mTunerService).removeTunable(any()); 110 verify(mContentResolver).unregisterContentObserver(any()); 111 verify(mBatteryController).removeCallback(any()); 112 } 113 114 @Test ignoreTunerUpdates_afterOnViewAttached_callbackUnregistered()115 public void ignoreTunerUpdates_afterOnViewAttached_callbackUnregistered() { 116 initController(); 117 // Start out receiving tuner updates 118 mController.onViewAttached(); 119 120 mController.ignoreTunerUpdates(); 121 122 verify(mTunerService).removeTunable(any()); 123 } 124 125 @Test ignoreTunerUpdates_beforeOnViewAttached_callbackNeverRegistered()126 public void ignoreTunerUpdates_beforeOnViewAttached_callbackNeverRegistered() { 127 initController(); 128 129 mController.ignoreTunerUpdates(); 130 131 mController.onViewAttached(); 132 133 verify(mTunerService, never()).addTunable(any(), any()); 134 } 135 136 @Test shieldFlagDisabled_viewNotified()137 public void shieldFlagDisabled_viewNotified() { 138 mContext.getOrCreateTestableResources().addOverride( 139 R.bool.flag_battery_shield_icon, false); 140 141 initController(); 142 143 verify(mBatteryMeterView).setDisplayShieldEnabled(false); 144 } 145 146 @Test shieldFlagEnabled_viewNotified()147 public void shieldFlagEnabled_viewNotified() { 148 mContext.getOrCreateTestableResources().addOverride( 149 R.bool.flag_battery_shield_icon, true); 150 151 initController(); 152 153 verify(mBatteryMeterView).setDisplayShieldEnabled(true); 154 } 155 initController()156 private void initController() { 157 mController = new BatteryMeterViewController( 158 mBatteryMeterView, 159 StatusBarLocation.HOME, 160 mUserTracker, 161 mConfigurationController, 162 mTunerService, 163 mHandler, 164 mContentResolver, 165 mFakeFeatureFlags, 166 mBatteryController 167 ); 168 } 169 } 170