Add Battery Defender feature to Settings
- Reupload CL from ag/13108999 to fix the merge conflict - Adding new tips of Battery Defender, will be presented once battery is overheated - Launch Help Center article of battery overheat when clicking Battery Defender tip Screenshots: https://screenshot.googleplex.com/7jUibTJANgR6UQ6.png https://screenshot.googleplex.com/tUj2LLi87SfndBN.png Bug: 172794045 Bug: 173497281 Bug: 173496188 Test: make RunSettingsRoboTests -j40 Change-Id: Ibb106a5d42cdf6232abf9ddf4b3225bdcebccf4a
This commit is contained in:
@@ -66,6 +66,7 @@ public class BatteryBroadcastReceiverTest {
|
||||
mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext);
|
||||
mBatteryBroadcastReceiver.mBatteryLevel = BATTERY_INIT_LEVEL;
|
||||
mBatteryBroadcastReceiver.mBatteryStatus = BATTERY_INIT_STATUS;
|
||||
mBatteryBroadcastReceiver.mBatteryHealth = BatteryManager.BATTERY_HEALTH_UNKNOWN;
|
||||
mBatteryBroadcastReceiver.setBatteryChangedListener(mBatteryListener);
|
||||
|
||||
mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
|
||||
@@ -90,6 +91,21 @@ public class BatteryBroadcastReceiverTest {
|
||||
verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_LEVEL);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(shadows = {
|
||||
BatteryFixSliceTest.ShadowBatteryStatsHelperLoader.class,
|
||||
BatteryFixSliceTest.ShadowBatteryTipLoader.class
|
||||
})
|
||||
public void testOnReceive_batteryHealthChanged_dataUpdated() {
|
||||
mChargingIntent
|
||||
.putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT);
|
||||
mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);
|
||||
|
||||
assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
|
||||
.isEqualTo(BatteryManager.BATTERY_HEALTH_OVERHEAT);
|
||||
verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_HEALTH);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(shadows = {
|
||||
BatteryFixSliceTest.ShadowBatteryStatsHelperLoader.class,
|
||||
@@ -131,6 +147,8 @@ public class BatteryBroadcastReceiverTest {
|
||||
|
||||
assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(batteryLevel);
|
||||
assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus);
|
||||
assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
|
||||
.isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN);
|
||||
verify(mBatteryListener, never()).onBatteryChanged(anyInt());
|
||||
}
|
||||
|
||||
@@ -149,6 +167,8 @@ public class BatteryBroadcastReceiverTest {
|
||||
.isEqualTo(Utils.getBatteryPercentage(mChargingIntent));
|
||||
assertThat(mBatteryBroadcastReceiver.mBatteryStatus)
|
||||
.isEqualTo(Utils.getBatteryStatus(mContext, mChargingIntent));
|
||||
assertThat(mBatteryBroadcastReceiver.mBatteryHealth)
|
||||
.isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN);
|
||||
// 2 times because register will force update the battery
|
||||
verify(mBatteryListener, times(2)).onBatteryChanged(BatteryUpdateType.MANUAL);
|
||||
}
|
||||
|
@@ -175,6 +175,15 @@ public class BatteryHeaderPreferenceControllerTest {
|
||||
assertThat(mSummary.getText()).isEqualTo(BATTERY_STATUS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updatePreference_isOverheat_showEmptyText() {
|
||||
mBatteryInfo.isOverheated = true;
|
||||
|
||||
mController.updateHeaderPreference(mBatteryInfo);
|
||||
|
||||
assertThat(mSummary.getText().toString().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onStart_shouldStyleActionBar() {
|
||||
when(mEntityHeaderController.setRecyclerView(nullable(RecyclerView.class), eq(mLifecycle)))
|
||||
|
@@ -246,6 +246,22 @@ public class BatteryInfoTest {
|
||||
assertThat(info.chargeLabel).isEqualTo("100%");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetBatteryInfo_chargingWithOverheated_updateChargeLabel() {
|
||||
doReturn(TEST_CHARGE_TIME_REMAINING)
|
||||
.when(mBatteryStats)
|
||||
.computeChargeTimeRemaining(anyLong());
|
||||
mChargingBatteryBroadcast
|
||||
.putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT);
|
||||
|
||||
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
|
||||
mBatteryStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
|
||||
false /* shortString */);
|
||||
|
||||
assertThat(info.isOverheated).isTrue();
|
||||
assertThat(info.chargeLabel).isEqualTo("50% - Battery limited temporarily");
|
||||
}
|
||||
|
||||
// Make our battery stats return a sequence of battery events.
|
||||
private void mockBatteryStatsHistory() {
|
||||
// Mock out new data every time start...Locked is called.
|
||||
|
@@ -144,6 +144,8 @@ public class BatteryUtilsTest {
|
||||
@Mock
|
||||
private BatterySipper mIdleBatterySipper;
|
||||
@Mock
|
||||
private BatteryInfo mBatteryInfo;
|
||||
@Mock
|
||||
private Bundle mBundle;
|
||||
@Mock
|
||||
private UserManager mUserManager;
|
||||
@@ -754,4 +756,36 @@ public class BatteryUtilsTest {
|
||||
assertThat(estimate.isBasedOnUsage()).isTrue();
|
||||
assertThat(estimate.getAverageDischargeTime()).isEqualTo(1000);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsBatteryDefenderOn_isOverheatedAndIsCharging_returnTrue() {
|
||||
mBatteryInfo.isOverheated = true;
|
||||
mBatteryInfo.discharging = false;
|
||||
|
||||
assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsBatteryDefenderOn_isOverheatedAndDischarging_returnFalse() {
|
||||
mBatteryInfo.isOverheated = true;
|
||||
mBatteryInfo.discharging = true;
|
||||
|
||||
assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsBatteryDefenderOn_notOverheatedAndDischarging_returnFalse() {
|
||||
mBatteryInfo.isOverheated = false;
|
||||
mBatteryInfo.discharging = true;
|
||||
|
||||
assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsBatteryDefenderOn_notOverheatedAndIsCharging_returnFalse() {
|
||||
mBatteryInfo.isOverheated = false;
|
||||
mBatteryInfo.discharging = false;
|
||||
|
||||
assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse();
|
||||
}
|
||||
}
|
||||
|
@@ -50,6 +50,7 @@ import java.util.List;
|
||||
public class BatteryTipLoaderTest {
|
||||
|
||||
private static final int[] TIP_ORDER = {
|
||||
BatteryTip.TipType.BATTERY_DEFENDER,
|
||||
BatteryTip.TipType.BATTERY_SAVER,
|
||||
BatteryTip.TipType.HIGH_DEVICE_USAGE,
|
||||
BatteryTip.TipType.LOW_BATTERY,
|
||||
|
@@ -23,10 +23,12 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
import com.android.settings.fuelgauge.batterytip.actions.BatteryDefenderAction;
|
||||
import com.android.settings.fuelgauge.batterytip.actions.BatterySaverAction;
|
||||
import com.android.settings.fuelgauge.batterytip.actions.OpenBatterySaverAction;
|
||||
import com.android.settings.fuelgauge.batterytip.actions.OpenRestrictAppFragmentAction;
|
||||
import com.android.settings.fuelgauge.batterytip.actions.RestrictAppAction;
|
||||
import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip;
|
||||
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
|
||||
import com.android.settings.fuelgauge.batterytip.tips.EarlyWarningTip;
|
||||
import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip;
|
||||
@@ -53,6 +55,7 @@ public class BatteryTipUtilsTest {
|
||||
private RestrictAppTip mRestrictAppTip;
|
||||
private EarlyWarningTip mEarlyWarningTip;
|
||||
private LowBatteryTip mLowBatteryTip;
|
||||
private BatteryDefenderTip mBatteryDefenderTip;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -67,6 +70,7 @@ public class BatteryTipUtilsTest {
|
||||
mLowBatteryTip = spy(
|
||||
new LowBatteryTip(BatteryTip.StateType.NEW, false /* powerSaveModeOn */,
|
||||
"" /* summary */));
|
||||
mBatteryDefenderTip = spy(new BatteryDefenderTip(BatteryTip.StateType.NEW));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -116,4 +120,13 @@ public class BatteryTipUtilsTest {
|
||||
assertThat(BatteryTipUtils.getActionForBatteryTip(mLowBatteryTip, mSettingsActivity,
|
||||
mFragment)).isInstanceOf(OpenBatterySaverAction.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void
|
||||
testGetActionForBatteryTip_typeBatteryDefenderStateNew_returnActionBatteryDefender() {
|
||||
when(mBatteryDefenderTip.getState()).thenReturn(BatteryTip.StateType.NEW);
|
||||
|
||||
assertThat(BatteryTipUtils.getActionForBatteryTip(mBatteryDefenderTip, mSettingsActivity,
|
||||
mFragment)).isInstanceOf(BatteryDefenderAction.class);
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (C) 2020 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.fuelgauge.batterytip.detectors;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import com.android.settings.fuelgauge.BatteryInfo;
|
||||
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class BatteryDefenderDetectorTest {
|
||||
|
||||
@Mock
|
||||
private BatteryInfo mBatteryInfo;
|
||||
private BatteryDefenderDetector mBatteryDefenderDetector;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mBatteryInfo.discharging = false;
|
||||
|
||||
mBatteryDefenderDetector = new BatteryDefenderDetector(mBatteryInfo);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDetect_notOverheated_tipInvisible() {
|
||||
mBatteryInfo.isOverheated = false;
|
||||
|
||||
assertThat(mBatteryDefenderDetector.detect().isVisible()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDetect_isOverheated_tipNew() {
|
||||
mBatteryInfo.isOverheated = true;
|
||||
|
||||
assertThat(mBatteryDefenderDetector.detect().getState())
|
||||
.isEqualTo(BatteryTip.StateType.NEW);
|
||||
}
|
||||
}
|
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (C) 2020 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.settings.fuelgauge.batterytip.tips;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class BatteryDefenderTipTest {
|
||||
|
||||
private Context mContext;
|
||||
private BatteryDefenderTip mBatteryDefenderTip;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mBatteryDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getTitle_showTitle() {
|
||||
assertThat(mBatteryDefenderTip.getTitle(mContext))
|
||||
.isEqualTo(mContext.getString(R.string.battery_tip_limited_temporarily_title));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSummary_showSummary() {
|
||||
assertThat(mBatteryDefenderTip.getSummary(mContext))
|
||||
.isEqualTo(mContext.getString(R.string.battery_tip_limited_temporarily_summary));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getIcon_showIcon() {
|
||||
assertThat(mBatteryDefenderTip.getIconId())
|
||||
.isEqualTo(R.drawable.ic_battery_status_good_24dp);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user