1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 * 15 * 16 */ 17 18 package com.android.settings.fuelgauge; 19 20 import static android.arch.lifecycle.Lifecycle.Event.ON_START; 21 import static com.google.common.truth.Truth.assertThat; 22 import static org.mockito.ArgumentMatchers.nullable; 23 import static org.mockito.Matchers.any; 24 import static org.mockito.Matchers.eq; 25 import static org.mockito.Mockito.doReturn; 26 import static org.mockito.Mockito.spy; 27 import static org.mockito.Mockito.verify; 28 import static org.mockito.Mockito.when; 29 30 import android.app.Activity; 31 import android.arch.lifecycle.LifecycleOwner; 32 import android.content.Context; 33 import android.content.Intent; 34 import android.os.BatteryManager; 35 import android.support.v14.preference.PreferenceFragment; 36 import android.support.v7.preference.PreferenceScreen; 37 import android.support.v7.widget.RecyclerView; 38 import android.widget.TextView; 39 40 import com.android.settings.R; 41 import com.android.settings.applications.LayoutPreference; 42 import com.android.settings.testutils.SettingsRobolectricTestRunner; 43 import com.android.settings.testutils.shadow.SettingsShadowResources; 44 import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; 45 import com.android.settings.testutils.shadow.ShadowEntityHeaderController; 46 import com.android.settings.widget.EntityHeaderController; 47 import com.android.settingslib.core.lifecycle.Lifecycle; 48 49 import org.junit.After; 50 import org.junit.Before; 51 import org.junit.Test; 52 import org.junit.runner.RunWith; 53 import org.mockito.Mock; 54 import org.mockito.MockitoAnnotations; 55 import org.robolectric.RuntimeEnvironment; 56 import org.robolectric.annotation.Config; 57 58 @RunWith(SettingsRobolectricTestRunner.class) 59 @Config(shadows = { 60 SettingsShadowResources.class, 61 SettingsShadowResourcesImpl.class, 62 SettingsShadowResources.SettingsShadowTheme.class, 63 ShadowEntityHeaderController.class 64 }) 65 public class BatteryHeaderPreferenceControllerTest { 66 67 private static final int BATTERY_LEVEL = 60; 68 private static final String TIME_LEFT = "2h30min"; 69 private static final String BATTERY_STATUS = "Charging"; 70 71 @Mock 72 private Activity mActivity; 73 @Mock 74 private PreferenceFragment mPreferenceFragment; 75 @Mock 76 private PreferenceScreen mPreferenceScreen; 77 @Mock 78 private BatteryInfo mBatteryInfo; 79 @Mock 80 private EntityHeaderController mEntityHeaderController; 81 private BatteryHeaderPreferenceController mController; 82 private Context mContext; 83 private BatteryMeterView mBatteryMeterView; 84 private TextView mBatteryPercentText; 85 private TextView mSummary; 86 private TextView mSummary2; 87 private LayoutPreference mBatteryLayoutPref; 88 private Intent mBatteryIntent; 89 private LifecycleOwner mLifecycleOwner; 90 private Lifecycle mLifecycle; 91 92 @Before 93 public void setUp() { 94 MockitoAnnotations.initMocks(this); 95 96 mLifecycleOwner = () -> mLifecycle; 97 mLifecycle = new Lifecycle(mLifecycleOwner); 98 mContext = spy(RuntimeEnvironment.application); 99 mBatteryMeterView = new BatteryMeterView(mContext); 100 mBatteryPercentText = new TextView(mContext); 101 mSummary = new TextView(mContext); 102 ShadowEntityHeaderController.setUseMock(mEntityHeaderController); 103 mSummary2 = new TextView(mContext); 104 105 mBatteryIntent = new Intent(); 106 mBatteryIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_LEVEL); 107 mBatteryIntent.putExtra(BatteryManager.EXTRA_SCALE, 100); 108 mBatteryIntent.putExtra(BatteryManager.EXTRA_PLUGGED, 1); 109 doReturn(mBatteryIntent).when(mContext).registerReceiver(any(), any()); 110 111 mBatteryLayoutPref = new LayoutPreference(mContext, R.layout.battery_header); 112 doReturn(mBatteryLayoutPref).when(mPreferenceScreen) 113 .findPreference(BatteryHeaderPreferenceController.KEY_BATTERY_HEADER); 114 115 mBatteryInfo.batteryLevel = BATTERY_LEVEL; 116 117 mController = new BatteryHeaderPreferenceController( 118 mContext, mActivity, mPreferenceFragment, mLifecycle); 119 mController.mBatteryMeterView = mBatteryMeterView; 120 mController.mBatteryPercentText = mBatteryPercentText; 121 mController.mSummary1 = mSummary; 122 mController.mSummary2 = mSummary2; 123 } 124 125 @After 126 public void tearDown() { 127 ShadowEntityHeaderController.reset(); 128 } 129 130 @Test 131 public void testDisplayPreference_displayBatteryLevel() { 132 mController.displayPreference(mPreferenceScreen); 133 134 assertThat(((BatteryMeterView) mBatteryLayoutPref.findViewById( 135 R.id.battery_header_icon)).getBatteryLevel()).isEqualTo(BATTERY_LEVEL); 136 assertThat(((TextView) mBatteryLayoutPref.findViewById(R.id.battery_percent)).getText()) 137 .isEqualTo("60%"); 138 } 139 140 @Test 141 public void testUpdatePreference_hasRemainingTime_showRemainingLabel() { 142 mBatteryInfo.remainingLabel = TIME_LEFT; 143 144 mController.updateHeaderPreference(mBatteryInfo); 145 146 assertThat(mSummary.getText()).isEqualTo(mBatteryInfo.remainingLabel); 147 } 148 149 @Test 150 public void testUpdatePreference_updateBatteryInfo() { 151 mBatteryInfo.remainingLabel = TIME_LEFT; 152 mBatteryInfo.batteryLevel = BATTERY_LEVEL; 153 mBatteryInfo.discharging = true; 154 155 mController.updateHeaderPreference(mBatteryInfo); 156 157 assertThat(mBatteryMeterView.mDrawable.getBatteryLevel()).isEqualTo(BATTERY_LEVEL); 158 assertThat(mBatteryMeterView.mDrawable.getCharging()).isEqualTo(false); 159 } 160 161 @Test 162 public void testUpdatePreference_noRemainingTime_showStatusLabel() { 163 mBatteryInfo.remainingLabel = null; 164 mBatteryInfo.statusLabel = BATTERY_STATUS; 165 166 mController.updateHeaderPreference(mBatteryInfo); 167 168 assertThat(mSummary.getText()).isEqualTo(BATTERY_STATUS); 169 } 170 171 @Test 172 public void testOnStart_shouldStyleActionBar() { 173 when(mEntityHeaderController.setRecyclerView(nullable(RecyclerView.class), eq(mLifecycle))) 174 .thenReturn(mEntityHeaderController); 175 176 mController.displayPreference(mPreferenceScreen); 177 mLifecycle.handleLifecycleEvent(ON_START); 178 179 verify(mEntityHeaderController).styleActionBar(mActivity); 180 } 181 182 @Test 183 public void testQuickUpdateHeaderPreference_showBatteryLevelAndChargingState() { 184 mController.quickUpdateHeaderPreference(); 185 186 assertThat(mBatteryMeterView.getBatteryLevel()).isEqualTo(BATTERY_LEVEL); 187 assertThat(mBatteryMeterView.getCharging()).isTrue(); 188 assertThat(mBatteryPercentText.getText()).isEqualTo("60%"); 189 } 190 } 191