From 318636d51bd411d25b3bb897a60e7a2c9a4bc0fa Mon Sep 17 00:00:00 2001 From: Yiling Chuang Date: Tue, 18 Jun 2024 06:26:39 +0000 Subject: [PATCH] Update the conditions of power plugged determination. Under charging optimization mode, use ADAPTIVE_LONGLIFE as the additional condition to check whether a device is plugged. Bug: 349949603 Flag: EXEMPT bugfix Test: atest SettingsRoboTests Change-Id: Idbdfaaa1d5c54be325b6182bcda81d4282c21ba0 --- .../settings/fuelgauge/BatteryInfo.java | 29 ++++- .../settings/fuelgauge/BatteryInfoTest.java | 122 ++++++++++++++++-- 2 files changed, 137 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index 7cf9e44bd66..fa30253a296 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -307,12 +307,13 @@ public class BatteryInfo { info.pluggedStatus = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); info.mCharging = info.pluggedStatus != 0; info.averageTimeToDischarge = estimate.getAverageDischargeTime(); - info.isLongLife = - batteryBroadcast.getIntExtra( - BatteryManager.EXTRA_CHARGING_STATUS, - BatteryManager.CHARGING_POLICY_DEFAULT) - == BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE; + final int chargingPolicy = + batteryBroadcast.getIntExtra( + BatteryManager.EXTRA_CHARGING_STATUS, + BatteryManager.CHARGING_POLICY_DEFAULT); + + info.isLongLife = chargingPolicy == BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE; info.statusLabel = Utils.getBatteryStatus(context, batteryBroadcast, isCompactStatus); info.batteryStatus = batteryBroadcast.getIntExtra( @@ -326,7 +327,15 @@ public class BatteryInfo { .getPowerUsageFeatureProvider() .isBatteryDefend(info); } - if (!info.mCharging) { + Log.d( + TAG, + "chargingPolicy = " + + chargingPolicy + + ", pluggedStatus = " + + info.pluggedStatus + + ", batteryStatus = " + + info.batteryStatus); + if (!isPluggedIn(context, info.mCharging, chargingPolicy)) { updateBatteryInfoDischarging(context, shortString, estimate, info); } else { updateBatteryInfoCharging( @@ -556,6 +565,14 @@ public class BatteryInfo { } } + private static boolean isPluggedIn(Context context, boolean isCharging, int chargingPolicy) { + return isCharging + || (chargingPolicy == BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE + && FeatureFactory.getFeatureFactory() + .getBatterySettingsFeatureProvider() + .isChargingOptimizationMode(context)); + } + public interface BatteryDataParser { void onParsingStarted(long startTime, long endTime); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java index b7e65906fab..851dc79a03f 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java @@ -48,6 +48,7 @@ import com.android.settings.testutils.BatteryTestUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.widget.UsageView; import com.android.settingslib.fuelgauge.Estimate; +import com.android.settingslib.utils.PowerUtil; import org.junit.After; import org.junit.Before; @@ -93,7 +94,8 @@ public class BatteryInfoTest { Map.of( ChargingType.WIRED, BatteryManager.BATTERY_PLUGGED_AC, ChargingType.WIRELESS, BatteryManager.BATTERY_PLUGGED_WIRELESS, - ChargingType.DOCKED, BatteryManager.BATTERY_PLUGGED_DOCK); + ChargingType.DOCKED, BatteryManager.BATTERY_PLUGGED_DOCK, + ChargingType.NONE, 0); private static final Map CHARGING_SPEED_MAP = Map.of( ChargingSpeed.FAST, 1501000, @@ -823,6 +825,92 @@ public class BatteryInfoTest { assertThat(batteryInfo.isLongLife).isFalse(); } + @Test + public void getBatteryInfo_plugTypeNoneWithLonglifeAndChargeOptimization_chargingString() { + prepareTestGetBatteryInfoEnvironment( + /* remainingTimeMs= */ Duration.ofMinutes(130).toMillis(), + /* chargingStringV2Enabled= */ false); + Intent batteryIntent = + createIntentForGetBatteryInfoTest( + ChargingType.NONE, + ChargingSpeed.REGULAR, + /* batteryLevel= */ 85, + BatteryManager.BATTERY_STATUS_DISCHARGING, + /* isLonglife= */ true); + var expectedRemainingLabel = "Expected remaining label"; + var expectedChargeLabel = "85% - " + expectedRemainingLabel; + when(mFeatureFactory.batterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) + .thenReturn(true); + when(mFeatureFactory.batterySettingsFeatureProvider.getChargingOptimizationRemainingLabel( + eq(mContext), anyInt(), anyInt(), anyLong(), anyLong())) + .thenReturn(expectedRemainingLabel); + when(mFeatureFactory.batterySettingsFeatureProvider.getChargingOptimizationChargeLabel( + eq(mContext), anyInt(), anyString(), anyLong(), anyLong())) + .thenReturn(expectedChargeLabel); + var expectedStatusLabel = "Not charging"; + + assertGetBatteryInfo( + batteryIntent, + /* currentTimeMillis= */ UNUSED_TIME_MS, + expectedStatusLabel, + expectedRemainingLabel, + expectedChargeLabel); + } + + @Test + public void getBatteryInfo_plugTypeNoneNotChargeOptimizationLonglife_dischargingString() { + prepareTestGetBatteryInfoEnvironment( + /* remainingTimeMs= */ Duration.ofMinutes(130).toMillis(), + /* chargingStringV2Enabled= */ false); + Intent batteryIntent = + createIntentForGetBatteryInfoTest( + ChargingType.NONE, + ChargingSpeed.REGULAR, + /* batteryLevel= */ 85, + BatteryManager.BATTERY_STATUS_DISCHARGING, + /* isLonglife= */ true); + var expectedRemainingLabel = + PowerUtil.getBatteryRemainingShortStringFormatted( + mContext, PowerUtil.convertUsToMs(1000L)); + when(mFeatureFactory.batterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) + .thenReturn(false); + var expectedStatusLabel = "Not charging"; + + assertGetBatteryInfo( + batteryIntent, + /* currentTimeMillis= */ UNUSED_TIME_MS, + expectedStatusLabel, + expectedRemainingLabel, + expectedRemainingLabel); + } + + @Test + public void getBatteryInfo_plugTypeNoneChargeOptimizationNotLonglife_dischargingString() { + prepareTestGetBatteryInfoEnvironment( + /* remainingTimeMs= */ Duration.ofMinutes(130).toMillis(), + /* chargingStringV2Enabled= */ false); + Intent batteryIntent = + createIntentForGetBatteryInfoTest( + ChargingType.NONE, + ChargingSpeed.REGULAR, + /* batteryLevel= */ 85, + BatteryManager.BATTERY_STATUS_DISCHARGING, + /* isLonglife= */ false); + var expectedRemainingLabel = + PowerUtil.getBatteryRemainingShortStringFormatted( + mContext, PowerUtil.convertUsToMs(1000L)); + when(mFeatureFactory.batterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) + .thenReturn(true); + var expectedStatusLabel = "Not charging"; + + assertGetBatteryInfo( + batteryIntent, + /* currentTimeMillis= */ UNUSED_TIME_MS, + expectedStatusLabel, + expectedRemainingLabel, + expectedRemainingLabel); + } + private enum ChargingSpeed { FAST, REGULAR, @@ -832,10 +920,11 @@ public class BatteryInfoTest { private enum ChargingType { WIRED, WIRELESS, - DOCKED + DOCKED, + NONE } - private Intent createIntentForLongLifeTest(Boolean hasLongLife) { + private static Intent createIntentForLongLifeTest(Boolean hasLongLife) { return new Intent(Intent.ACTION_BATTERY_CHANGED) .putExtra( BatteryManager.EXTRA_CHARGING_STATUS, @@ -844,16 +933,33 @@ public class BatteryInfoTest { : BatteryManager.CHARGING_POLICY_DEFAULT); } - private Intent createIntentForGetBatteryInfoTest( + private static Intent createIntentForGetBatteryInfoTest( ChargingType chargingType, ChargingSpeed chargingSpeed, int batteryLevel) { + return createIntentForGetBatteryInfoTest( + chargingType, + chargingSpeed, + batteryLevel, + BatteryManager.BATTERY_STATUS_CHARGING, + /* isLonglife= */ false); + } + + private static Intent createIntentForGetBatteryInfoTest( + ChargingType chargingType, + ChargingSpeed chargingSpeed, + int batteryLevel, + int chargingStatus, + boolean isLonglife) { return createBatteryIntent( - CHARGING_TYPE_MAP.get(chargingType), - batteryLevel, - BatteryManager.BATTERY_STATUS_CHARGING) + CHARGING_TYPE_MAP.get(chargingType), batteryLevel, chargingStatus) .putExtra( BatteryManager.EXTRA_MAX_CHARGING_CURRENT, CHARGING_SPEED_MAP.get(chargingSpeed)) - .putExtra(BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE, 5000000); + .putExtra(BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE, 5000000) + .putExtra( + BatteryManager.EXTRA_CHARGING_STATUS, + isLonglife + ? BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE + : BatteryManager.CHARGING_POLICY_DEFAULT); } private void prepareTestGetBatteryInfoEnvironment(