From daeb06c3b0dd9bb80eb8e87254e96cfc5c5e9bfc Mon Sep 17 00:00:00 2001 From: pajacechen Date: Wed, 26 Jun 2024 14:56:58 +0800 Subject: [PATCH] [Bug Fix] "Dock defend string and tips in settings are incorrectly" issue Symptom: After the dock defend was triggered, the battery tips still show "Future-Bypass" dock defend mode. It should be the "Active" dock defend mode. Root Cause: The original `BatteryInfo.isBatteryDefender` was implemented by using `longlife`, due to the charging limit also reuse `longlife` issue, we replace the implementation of `BatteryInfo.isBatteryDefender` with HAL API call `isTempDefend` and `isDwellDefend`. However, the dock defend also needs `longlife`, the original `BatteryInfo.isBatteryDefender`. So the dock defend checking failed after replacing the implementation of `BatteryInfo.isBatteryDefender` Solution: - Add new property isLonglife in BatteryInfo - Replace all isBatteryDefender reference that needs isLonglife Bug: 348563863 Test: Manual Test and robotest Test: http://ab/I08300010291126076 (unit test) Test: http://ab/I67800010291096764 (robo test) Flag: EXEMPT bugfix Change-Id: I58424927522acc29dc49261a2c24829a5b34ef85 --- .../settings/fuelgauge/BatteryInfo.java | 7 +-- .../settings/fuelgauge/BatteryUtils.java | 4 +- .../PowerUsageFeatureProviderImpl.java | 2 +- .../detectors/BatteryDefenderDetector.java | 9 ++-- .../settings/fuelgauge/BatteryInfoTest.java | 43 +++++++++++++++++++ .../PowerUsageFeatureProviderImplTest.java | 8 ++-- .../BatteryDefenderDetectorTest.java | 12 +----- 7 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index b54801a677a..7cf9e44bd66 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -53,7 +53,8 @@ public class BatteryInfo { public int batteryStatus; public int pluggedStatus; public boolean discharging = true; - public boolean isBatteryDefender; + public boolean isBatteryDefender = false; + public boolean isLongLife = false; public boolean isFastCharging; public long remainingTimeUs = 0; public long averageTimeToDischarge = EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN; @@ -306,7 +307,7 @@ public class BatteryInfo { info.pluggedStatus = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); info.mCharging = info.pluggedStatus != 0; info.averageTimeToDischarge = estimate.getAverageDischargeTime(); - info.isBatteryDefender = + info.isLongLife = batteryBroadcast.getIntExtra( BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT) @@ -319,7 +320,7 @@ public class BatteryInfo { info.isFastCharging = BatteryStatus.getChargingSpeed(context, batteryBroadcast) == BatteryStatus.CHARGING_FAST; - if (info.isBatteryDefender) { + if (info.isLongLife) { info.isBatteryDefender = FeatureFactory.getFeatureFactory() .getPowerUsageFeatureProvider() diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 9e08664c901..7cb5733a9b0 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -600,12 +600,12 @@ public class BatteryUtils { context.getContentResolver(), SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 0) == 1) { return DockDefenderMode.TEMPORARILY_BYPASSED; - } else if (batteryInfo.isBatteryDefender + } else if (batteryInfo.isLongLife && FeatureFactory.getFeatureFactory() .getPowerUsageFeatureProvider() .isExtraDefend()) { return DockDefenderMode.ACTIVE; - } else if (!batteryInfo.isBatteryDefender) { + } else if (!batteryInfo.isLongLife) { return DockDefenderMode.FUTURE_BYPASS; } } diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index dc5b2269cf8..8ba63749cbd 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -247,7 +247,7 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider @Override public boolean isBatteryDefend(BatteryInfo info) { - return info.isBatteryDefender && !isExtraDefend(); + return info.isLongLife && !isExtraDefend(); } @Override diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java index 639b3c7b20d..6ff266574c9 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java @@ -21,7 +21,6 @@ import android.content.Context; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; -import com.android.settings.overlay.FeatureFactory; /** Detect whether the battery is overheated */ public class BatteryDefenderDetector implements BatteryTipDetector { @@ -35,12 +34,10 @@ public class BatteryDefenderDetector implements BatteryTipDetector { @Override public BatteryTip detect() { - final boolean isBasicBatteryDefend = - FeatureFactory.getFeatureFactory() - .getPowerUsageFeatureProvider() - .isBatteryDefend(mBatteryInfo); final int state = - isBasicBatteryDefend ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE; + mBatteryInfo.isBatteryDefender + ? BatteryTip.StateType.NEW + : BatteryTip.StateType.INVISIBLE; final boolean isPluggedIn = mBatteryInfo.pluggedStatus != 0; return new BatteryDefenderTip(state, isPluggedIn); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java index 7bafc6d5198..b7e65906fab 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java @@ -789,6 +789,40 @@ public class BatteryInfoTest { expectedChargeLabel); } + @Test + public void getBatteryInfo_longlife_shouldSetLonglife() { + var batteryIntent = createIntentForLongLifeTest(/* hasLongLife= */ true); + + var batteryInfo = + BatteryInfo.getBatteryInfo( + mContext, + batteryIntent, + mBatteryUsageStats, + /* estimate= */ MOCK_ESTIMATE, + /* elapsedRealtimeUs= */ 0L, + /* shortString= */ false, + /* currentTimeMs= */ 0L); + + assertThat(batteryInfo.isLongLife).isTrue(); + } + + @Test + public void getBatteryInfo_noLonglife_shouldNotLonglife() { + var batteryIntent = createIntentForLongLifeTest(/* hasLongLife= */ false); + + var batteryInfo = + BatteryInfo.getBatteryInfo( + mContext, + batteryIntent, + mBatteryUsageStats, + /* estimate= */ MOCK_ESTIMATE, + /* elapsedRealtimeUs= */ 0L, + /* shortString= */ false, + /* currentTimeMs= */ 0L); + + assertThat(batteryInfo.isLongLife).isFalse(); + } + private enum ChargingSpeed { FAST, REGULAR, @@ -801,6 +835,15 @@ public class BatteryInfoTest { DOCKED } + private Intent createIntentForLongLifeTest(Boolean hasLongLife) { + return new Intent(Intent.ACTION_BATTERY_CHANGED) + .putExtra( + BatteryManager.EXTRA_CHARGING_STATUS, + hasLongLife + ? BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE + : BatteryManager.CHARGING_POLICY_DEFAULT); + } + private Intent createIntentForGetBatteryInfoTest( ChargingType chargingType, ChargingSpeed chargingSpeed, int batteryLevel) { return createBatteryIntent( diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java index 6b32ff54c57..cecf8f0f6be 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java @@ -165,7 +165,7 @@ public class PowerUsageFeatureProviderImplTest { @Test public void isBatteryDefend_defenderModeAndExtraDefendAreFalse_returnFalse() { - mBatteryInfo.isBatteryDefender = false; + mBatteryInfo.isLongLife = false; doReturn(false).when(mPowerFeatureProvider).isExtraDefend(); assertThat(mPowerFeatureProvider.isBatteryDefend(mBatteryInfo)).isFalse(); @@ -173,7 +173,7 @@ public class PowerUsageFeatureProviderImplTest { @Test public void isBatteryDefend_defenderModeIsFalse_returnFalse() { - mBatteryInfo.isBatteryDefender = false; + mBatteryInfo.isLongLife = false; doReturn(true).when(mPowerFeatureProvider).isExtraDefend(); assertThat(mPowerFeatureProvider.isBatteryDefend(mBatteryInfo)).isFalse(); @@ -181,7 +181,7 @@ public class PowerUsageFeatureProviderImplTest { @Test public void isBatteryDefend_defenderModeAndExtraDefendAreTrue_returnFalse() { - mBatteryInfo.isBatteryDefender = true; + mBatteryInfo.isLongLife = true; doReturn(true).when(mPowerFeatureProvider).isExtraDefend(); assertThat(mPowerFeatureProvider.isBatteryDefend(mBatteryInfo)).isFalse(); @@ -189,7 +189,7 @@ public class PowerUsageFeatureProviderImplTest { @Test public void isBatteryDefend_extraDefendIsFalse_returnTrue() { - mBatteryInfo.isBatteryDefender = true; + mBatteryInfo.isLongLife = true; doReturn(false).when(mPowerFeatureProvider).isExtraDefend(); assertThat(mPowerFeatureProvider.isBatteryDefend(mBatteryInfo)).isTrue(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java index ab1ceb582aa..7643c410d5a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java @@ -18,15 +18,12 @@ package com.android.settings.fuelgauge.batterytip.detectors; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.when; - import android.content.Context; import androidx.test.core.app.ApplicationProvider; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; -import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; import org.junit.Test; @@ -41,28 +38,23 @@ public class BatteryDefenderDetectorTest { @Mock private BatteryInfo mBatteryInfo; private BatteryDefenderDetector mBatteryDefenderDetector; - private FakeFeatureFactory mFakeFeatureFactory; - @Before public void setUp() { MockitoAnnotations.initMocks(this); final Context context = ApplicationProvider.getApplicationContext(); mBatteryDefenderDetector = new BatteryDefenderDetector(mBatteryInfo, context); - mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); } @Test public void detect_notBatteryDefend_tipInvisible() { - when(mFakeFeatureFactory.powerUsageFeatureProvider.isBatteryDefend(mBatteryInfo)) - .thenReturn(false); + mBatteryInfo.isBatteryDefender = false; assertThat(mBatteryDefenderDetector.detect().isVisible()).isFalse(); } @Test public void detect_isBatteryDefend_tipNew() { - when(mFakeFeatureFactory.powerUsageFeatureProvider.isBatteryDefend(mBatteryInfo)) - .thenReturn(true); + mBatteryInfo.isBatteryDefender = true; assertThat(mBatteryDefenderDetector.detect().getState()) .isEqualTo(BatteryTip.StateType.NEW);