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