From f1e41c0bd9f1b5e2eb4b3e00e3657a256ece8d40 Mon Sep 17 00:00:00 2001 From: "Wesley.CW Wang" Date: Wed, 24 Mar 2021 16:56:16 +0800 Subject: [PATCH] Adjust battery tips action - Change low battery tips action to launch battery saver page - Enable smart battery tip when battery level is lower than expected and battery saver is off Bug: 183582881 Test: make RunSettingsRoboTests -j40 Change-Id: I38b0ff7109d5ea95703edeade26cdfeed50f1403 --- .../batterytip/BatteryTipLoader.java | 3 +- .../fuelgauge/batterytip/BatteryTipUtils.java | 7 +--- .../detectors/SmartBatteryDetector.java | 22 +++++++++-- .../batterytip/BatteryTipUtilsTest.java | 21 +--------- .../detectors/SmartBatteryDetectorTest.java | 39 ++++++++++++++++++- 5 files changed, 61 insertions(+), 31 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java index 1052afe8981..623bd4f1008 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java @@ -69,7 +69,8 @@ public class BatteryTipLoader extends AsyncLoaderCompat> { tips.add(new LowBatteryDetector(context, policy, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect()); - tips.add(new SmartBatteryDetector(policy, context.getContentResolver()).detect()); + tips.add(new SmartBatteryDetector( + context, policy, batteryInfo, context.getContentResolver()).detect()); tips.add(new EarlyWarningDetector(policy, context).detect()); tips.add(new BatteryDefenderDetector(batteryInfo).detect()); // Disable this feature now since it introduces false positive cases. We will try to improve diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java index e88a4946979..d12784f4ce3 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java @@ -30,7 +30,6 @@ import com.android.internal.util.CollectionUtils; 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.BatteryTipAction; import com.android.settings.fuelgauge.batterytip.actions.OpenBatterySaverAction; import com.android.settings.fuelgauge.batterytip.actions.OpenRestrictAppFragmentAction; @@ -99,11 +98,7 @@ public class BatteryTipUtils { return new SmartBatteryAction(settingsActivity, fragment); case BatteryTip.TipType.BATTERY_SAVER: case BatteryTip.TipType.LOW_BATTERY: - if (batteryTip.getState() == BatteryTip.StateType.HANDLED) { - return new OpenBatterySaverAction(settingsActivity); - } else { - return new BatterySaverAction(settingsActivity); - } + return new OpenBatterySaverAction(settingsActivity); case BatteryTip.TipType.APP_RESTRICTION: if (batteryTip.getState() == BatteryTip.StateType.HANDLED) { return new OpenRestrictAppFragmentAction(fragment, (RestrictAppTip) batteryTip); diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java index a8d49814432..23409a1ee3a 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java @@ -17,8 +17,11 @@ package com.android.settings.fuelgauge.batterytip.detectors; import android.content.ContentResolver; +import android.content.Context; +import android.os.PowerManager; import android.provider.Settings; +import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.SmartBatteryTip; @@ -27,22 +30,33 @@ import com.android.settings.fuelgauge.batterytip.tips.SmartBatteryTip; * Detect whether to show smart battery tip. */ public class SmartBatteryDetector implements BatteryTipDetector { + private static final int EXPECTED_BATTERY_LEVEL = 30; + + private BatteryInfo mBatteryInfo; private BatteryTipPolicy mPolicy; private ContentResolver mContentResolver; + private PowerManager mPowerManager; - public SmartBatteryDetector(BatteryTipPolicy policy, ContentResolver contentResolver) { + public SmartBatteryDetector(Context context, BatteryTipPolicy policy, BatteryInfo batteryInfo, + ContentResolver contentResolver) { mPolicy = policy; + mBatteryInfo = batteryInfo; mContentResolver = contentResolver; + mPowerManager = context.getSystemService(PowerManager.class); } @Override public BatteryTip detect() { - // Show it if there is no other tips shown final boolean smartBatteryOff = Settings.Global.getInt(mContentResolver, - Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 1) == 0 + Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 1) == 0; + final boolean isUnderExpectedBatteryLevel = + mBatteryInfo.batteryLevel <= EXPECTED_BATTERY_LEVEL; + // Show it if in test or smart battery is off. + final boolean enableSmartBatteryTip = + smartBatteryOff && !mPowerManager.isPowerSaveMode() && isUnderExpectedBatteryLevel || mPolicy.testSmartBatteryTip; final int state = - smartBatteryOff ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE; + enableSmartBatteryTip ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE; return new SmartBatteryTip(state); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java index 619978897fc..6954f9a58ab 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java @@ -24,7 +24,6 @@ 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; @@ -90,33 +89,17 @@ public class BatteryTipUtilsTest { } @Test - public void testGetActionForBatteryTip_typeEarlyWarningStateNew_returnActionBatterySaver() { + public void testGetActionForBatteryTip_typeEarlyWarningStateNew_returnActionOpen() { when(mEarlyWarningTip.getState()).thenReturn(BatteryTip.StateType.NEW); - assertThat(BatteryTipUtils.getActionForBatteryTip(mEarlyWarningTip, mSettingsActivity, - mFragment)).isInstanceOf(BatterySaverAction.class); - } - - @Test - public void testGetActionForBatteryTip_typeEarlyWarningStateHandled_returnActionOpen() { - when(mEarlyWarningTip.getState()).thenReturn(BatteryTip.StateType.HANDLED); - assertThat(BatteryTipUtils.getActionForBatteryTip(mEarlyWarningTip, mSettingsActivity, mFragment)).isInstanceOf(OpenBatterySaverAction.class); } @Test - public void testGetActionForBatteryTip_typeLowBatteryStateNew_returnActionBatterySaver() { + public void testGetActionForBatteryTip_typeLowBatteryStateNew_returnActionOpen() { when(mLowBatteryTip.getState()).thenReturn(BatteryTip.StateType.NEW); - assertThat(BatteryTipUtils.getActionForBatteryTip(mLowBatteryTip, mSettingsActivity, - mFragment)).isInstanceOf(BatterySaverAction.class); - } - - @Test - public void testGetActionForBatteryTip_typeLowBatteryStateHandled_returnActionOpen() { - when(mLowBatteryTip.getState()).thenReturn(BatteryTip.StateType.HANDLED); - assertThat(BatteryTipUtils.getActionForBatteryTip(mLowBatteryTip, mSettingsActivity, mFragment)).isInstanceOf(OpenBatterySaverAction.class); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java index 477bf49f7f7..00dcbd46806 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java @@ -22,26 +22,37 @@ import static org.mockito.Mockito.spy; import android.content.ContentResolver; import android.content.Context; +import android.os.PowerManager; import android.provider.Settings; +import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; 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; import org.robolectric.RuntimeEnvironment; +import org.robolectric.Shadows; +import org.robolectric.shadows.ShadowPowerManager; import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) public class SmartBatteryDetectorTest { + private static final int EXPECTED_BATTERY_LEVEL = 30; + private static final int UNEXPECTED_BATTERY_LEVEL = 31; + private Context mContext; private ContentResolver mContentResolver; private SmartBatteryDetector mSmartBatteryDetector; private BatteryTipPolicy mPolicy; + private ShadowPowerManager mShadowPowerManager; + @Mock + private BatteryInfo mBatteryInfo; @Before public void setUp() { @@ -50,7 +61,9 @@ public class SmartBatteryDetectorTest { mContext = RuntimeEnvironment.application; mContentResolver = mContext.getContentResolver(); mPolicy = spy(new BatteryTipPolicy(mContext)); - mSmartBatteryDetector = new SmartBatteryDetector(mPolicy, mContentResolver); + mShadowPowerManager = Shadows.shadowOf(mContext.getSystemService(PowerManager.class)); + mSmartBatteryDetector = + new SmartBatteryDetector(mContext, mPolicy, mBatteryInfo, mContentResolver); } @Test @@ -64,14 +77,38 @@ public class SmartBatteryDetectorTest { public void testDetect_smartBatteryOff_tipVisible() { Settings.Global.putInt(mContentResolver, Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0); + mShadowPowerManager.setIsPowerSaveMode(false); + mBatteryInfo.batteryLevel = EXPECTED_BATTERY_LEVEL; assertThat(mSmartBatteryDetector.detect().isVisible()).isTrue(); } + @Test + public void testDetect_batterySaverOn_tipInvisible() { + Settings.Global.putInt(mContentResolver, + Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0); + mShadowPowerManager.setIsPowerSaveMode(true); + mBatteryInfo.batteryLevel = EXPECTED_BATTERY_LEVEL; + + assertThat(mSmartBatteryDetector.detect().isVisible()).isFalse(); + } + + @Test + public void testDetect_unexpectedBatteryLevel_tipInvisible() { + Settings.Global.putInt(mContentResolver, + Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 0); + mShadowPowerManager.setIsPowerSaveMode(true); + mBatteryInfo.batteryLevel = UNEXPECTED_BATTERY_LEVEL; + + assertThat(mSmartBatteryDetector.detect().isVisible()).isFalse(); + } + @Test public void testDetect_smartBatteryOn_tipInvisible() { Settings.Global.putInt(mContentResolver, Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 1); + mShadowPowerManager.setIsPowerSaveMode(false); + mBatteryInfo.batteryLevel = EXPECTED_BATTERY_LEVEL; assertThat(mSmartBatteryDetector.detect().isVisible()).isFalse(); }