diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java index 06c3ceeca14..8467b2f85c1 100644 --- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java @@ -86,13 +86,14 @@ public class BatteryHeaderPreferenceController extends BasePreferenceController return mContext.getString( com.android.settingslib.R.string.battery_info_status_charging_on_hold); } + if (info.remainingLabel != null + && mBatterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) { + return info.remainingLabel; + } if (info.remainingLabel == null || info.batteryStatus == BatteryManager.BATTERY_STATUS_NOT_CHARGING) { return info.statusLabel; } - if (mBatterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) { - return info.remainingLabel; - } if (info.pluggedStatus == BatteryManager.BATTERY_PLUGGED_WIRELESS) { final CharSequence wirelessChargingLabel = mBatterySettingsFeatureProvider.getWirelessChargingLabel(mContext, info); diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index c333a33d67f..b54801a677a 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -390,12 +390,37 @@ public class BatteryInfo { info.remainingLabel = null; int chargingLimitedResId = R.string.power_charging_limited; info.chargeLabel = context.getString(chargingLimitedResId, info.batteryPercentString); - } else if ((chargeTimeMs > 0 + return; + } + final BatterySettingsFeatureProvider featureProvider = + FeatureFactory.getFeatureFactory().getBatterySettingsFeatureProvider(); + if (featureProvider.isChargingOptimizationMode(context)) { + final CharSequence chargeLabel = + featureProvider.getChargingOptimizationChargeLabel( + context, + info.batteryLevel, + info.batteryPercentString, + chargeTimeMs, + currentTimeMs); + if (chargeLabel != null) { + final CharSequence remainingLabel = + featureProvider.getChargingOptimizationRemainingLabel( + context, + info.batteryLevel, + info.pluggedStatus, + chargeTimeMs, + currentTimeMs); + if (remainingLabel != null) { + info.chargeLabel = chargeLabel; + info.remainingLabel = remainingLabel; + return; + } + } + } + if ((chargeTimeMs > 0 && status != BatteryManager.BATTERY_STATUS_FULL && dockDefenderMode == BatteryUtils.DockDefenderMode.DISABLED) || dockDefenderMode == BatteryUtils.DockDefenderMode.TEMPORARILY_BYPASSED) { - final BatterySettingsFeatureProvider featureProvider = - FeatureFactory.getFeatureFactory().getBatterySettingsFeatureProvider(); // Battery is charging to full info.remainingTimeUs = PowerUtil.convertMsToUs(chargeTimeMs); int resId = getChargingDurationResId(info.isFastCharging); @@ -419,8 +444,7 @@ public class BatteryInfo { info.batteryPercentString, chargeTimeMs, info.isFastCharging, - currentTimeMs, - featureProvider); + currentTimeMs); } else if (dockDefenderMode == BatteryUtils.DockDefenderMode.FUTURE_BYPASS) { // Dock defender will be triggered in the future, charging will be optimized. info.chargeLabel = @@ -447,14 +471,6 @@ public class BatteryInfo { int pluggedStatus, long currentTimeMs, BatterySettingsFeatureProvider featureProvider) { - if (featureProvider.isChargingOptimizationMode(context)) { - final CharSequence chargingOptimizationRemainingLabel = - featureProvider.getChargingOptimizationRemainingLabel( - context, chargeRemainingTimeMs, currentTimeMs); - if (chargingOptimizationRemainingLabel != null) { - return chargingOptimizationRemainingLabel; - } - } if (pluggedStatus == BatteryManager.BATTERY_PLUGGED_WIRELESS) { final CharSequence wirelessChargingRemainingLabel = featureProvider.getWirelessChargingRemainingLabel( @@ -488,16 +504,7 @@ public class BatteryInfo { String batteryPercentString, long chargeTimeMs, boolean isFastCharging, - long currentTimeMs, - BatterySettingsFeatureProvider featureProvider) { - if (featureProvider.isChargingOptimizationMode(context)) { - final CharSequence chargingOptimizationChargeLabel = - featureProvider.getChargingOptimizationChargeLabel( - context, batteryPercentString, chargeTimeMs, currentTimeMs); - if (chargingOptimizationChargeLabel != null) { - return chargingOptimizationChargeLabel; - } - } + long currentTimeMs) { if (com.android.settingslib.fuelgauge.BatteryUtils.isChargingStringV2Enabled()) { var timeString = PowerUtil.getTargetTimeShortString(context, chargeTimeMs, currentTimeMs); diff --git a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java index ab6d5acc1eb..454a2956861 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java @@ -60,13 +60,18 @@ public interface BatterySettingsFeatureProvider { /** Return a charging remaining time label for charging optimization mode. */ @Nullable CharSequence getChargingOptimizationRemainingLabel( - @NonNull Context context, long chargeRemainingTimeMs, long currentTimeMs); + @NonNull Context context, + int batteryLevel, + int pluggedStatus, + long chargeRemainingTimeMs, + long currentTimeMs); /** Return a charge label for charging optimization mode. */ @Nullable CharSequence getChargingOptimizationChargeLabel( @NonNull Context context, - @NonNull String batteryPercentageString, + int batteryLevel, + String batteryPercentageString, long chargeRemainingTimeMs, long currentTimeMs); } diff --git a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java index b2db3470fa9..40cfd0cb715 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java @@ -76,7 +76,11 @@ public class BatterySettingsFeatureProviderImpl implements BatterySettingsFeatur @Nullable @Override public CharSequence getChargingOptimizationRemainingLabel( - @NonNull Context context, long chargeRemainingTimeMs, long currentTimeMs) { + @NonNull Context context, + int batteryLevel, + int pluggedStatus, + long chargeRemainingTimeMs, + long currentTimeMs) { return null; } @@ -84,7 +88,8 @@ public class BatterySettingsFeatureProviderImpl implements BatterySettingsFeatur @Override public CharSequence getChargingOptimizationChargeLabel( @NonNull Context context, - @NonNull String batteryPercentageString, + int batteryLevel, + String batteryPercentageString, long chargeRemainingTimeMs, long currentTimeMs) { return null; diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java index 08d49f1a632..fd0d820feb1 100644 --- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java +++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java @@ -159,6 +159,11 @@ public class TopLevelBatteryPreferenceController extends BasePreferenceControlle com.android.settingslib.R.string.power_charging_on_hold_settings_home_page, info.batteryPercentString); } + final BatterySettingsFeatureProvider featureProvider = + FeatureFactory.getFeatureFactory().getBatterySettingsFeatureProvider(); + if (info.chargeLabel != null && featureProvider.isChargingOptimizationMode(mContext)) { + return info.chargeLabel; + } if (info.batteryStatus == BatteryManager.BATTERY_STATUS_NOT_CHARGING) { // Present status only if no remaining time or status anomalous return info.statusLabel; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java index bc6dadc72ac..1899eab7c51 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java @@ -286,8 +286,9 @@ public class BatteryHeaderPreferenceControllerTest { /* isFastCharging= */ true, /* isChargingStringV2= */ true); batteryInfo.pluggedStatus = BatteryManager.BATTERY_PLUGGED_WIRELESS; - when(mFactory.batterySettingsFeatureProvider.getWirelessChargingLabel(eq(mContext), - any(BatteryInfo.class))).thenReturn(label); + when(mFactory.batterySettingsFeatureProvider.getWirelessChargingLabel( + eq(mContext), any(BatteryInfo.class))) + .thenReturn(label); mController.updateBatteryStatus(/* label= */ null, batteryInfo); @@ -326,14 +327,64 @@ public class BatteryHeaderPreferenceControllerTest { verify(mBatteryUsageProgressBarPref).setBottomSummary(expectedChargingString); } + @Test + public void updateBatteryStatus_chargingOptimizationMode_remainingLabel() { + var batteryInfo = + arrangeUpdateBatteryStatusTestWithRemainingLabel( + /* remainingLabel= */ "Expected remaining label", + /* statusLabel= */ "Fast Charging", + /* isFastCharging= */ true, + /* isChargingStringV2= */ true); + var expectedChargingString = batteryInfo.remainingLabel; + when(mFactory.batterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) + .thenReturn(true); + + mController.updateBatteryStatus(/* label= */ null, batteryInfo); + + verify(mBatteryUsageProgressBarPref).setBottomSummary(expectedChargingString); + } + + @Test + public void updateBatteryStatus_chargingOptimizationModeNoRemainingLabel_statusLabel() { + var batteryInfo = + arrangeUpdateBatteryStatusTestWithRemainingLabel( + /* remainingLabel= */ null, + /* statusLabel= */ "Fast Charging", + /* isFastCharging= */ true, + /* isChargingStringV2= */ true); + var expectedChargingString = batteryInfo.statusLabel; + when(mFactory.batterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) + .thenReturn(true); + + mController.updateBatteryStatus(/* label= */ null, batteryInfo); + + verify(mBatteryUsageProgressBarPref).setBottomSummary(expectedChargingString); + } + + @Test + public void updateBatteryStatus_notChargingOptimizationMode_statusWithRemainingLabel() { + var batteryInfo = + arrangeUpdateBatteryStatusTestWithRemainingLabel( + /* remainingLabel= */ "Full by 1:30 PM", + /* statusLabel= */ "Fast Charging", + /* isFastCharging= */ true, + /* isChargingStringV2= */ true); + var expectedChargingString = batteryInfo.statusLabel + " • " + batteryInfo.remainingLabel; + when(mFactory.batterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) + .thenReturn(false); + + mController.updateBatteryStatus(/* label= */ null, batteryInfo); + + verify(mBatteryUsageProgressBarPref).setBottomSummary(expectedChargingString); + } + private BatteryInfo arrangeUpdateBatteryStatusTestWithRemainingLabel( String remainingLabel, String statusLabel, boolean isFastCharging, boolean isChargingStringV2) { SystemProperties.set( - BatteryUtils.PROPERTY_CHARGING_STRING_V2_KEY, - String.valueOf(isChargingStringV2)); + BatteryUtils.PROPERTY_CHARGING_STRING_V2_KEY, String.valueOf(isChargingStringV2)); mBatteryInfo.isBatteryDefender = false; mBatteryInfo.remainingLabel = remainingLabel; mBatteryInfo.statusLabel = statusLabel; @@ -389,8 +440,11 @@ public class BatteryHeaderPreferenceControllerTest { mController.updateHeaderPreference(mBatteryInfo); - verify(mBatteryUsageProgressBarPref).setBottomSummary(mContext.getString( - com.android.settingslib.R.string.battery_info_status_charging_on_hold)); + verify(mBatteryUsageProgressBarPref) + .setBottomSummary( + mContext.getString( + com.android.settingslib.R.string + .battery_info_status_charging_on_hold)); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java index a1081f4519e..7bafc6d5198 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java @@ -724,15 +724,15 @@ public class BatteryInfoTest { Intent batteryIntent = createIntentForGetBatteryInfoTest( ChargingType.WIRED, ChargingSpeed.REGULAR, /* batteryLevel= */ 65); - var expectedRemainingLabel = "Done charging by"; + var expectedRemainingLabel = "Expected remaining label"; var expectedChargeLabel = "65% - " + expectedRemainingLabel; when(mFeatureFactory.batterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) .thenReturn(true); when(mFeatureFactory.batterySettingsFeatureProvider.getChargingOptimizationRemainingLabel( - eq(mContext), anyLong(), anyLong())) + eq(mContext), anyInt(), anyInt(), anyLong(), anyLong())) .thenReturn(expectedRemainingLabel); when(mFeatureFactory.batterySettingsFeatureProvider.getChargingOptimizationChargeLabel( - eq(mContext), anyString(), anyLong(), anyLong())) + eq(mContext), anyInt(), anyString(), anyLong(), anyLong())) .thenReturn(expectedChargeLabel); var expectedStatusLabel = "Charging"; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java index c55a121785e..9f04892a3e5 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java @@ -19,6 +19,7 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; import android.content.Context; +import android.os.BatteryManager; import androidx.test.core.app.ApplicationProvider; @@ -87,12 +88,15 @@ public class BatterySettingsFeatureProviderImplTest { @Test public void getChargingOptimizationRemainingLabel_default_returnNull() { - assertThat(mImpl.getChargingOptimizationRemainingLabel(mContext, 1000L, 1000L)).isNull(); + assertThat( + mImpl.getChargingOptimizationRemainingLabel( + mContext, 75, BatteryManager.BATTERY_PLUGGED_AC, 1000L, 1000L)) + .isNull(); } @Test public void getChargingOptimizationChargeLabel_default_returnNull() { - assertThat(mImpl.getChargingOptimizationChargeLabel(mContext, "70%", 1000L, 1000L)) + assertThat(mImpl.getChargingOptimizationChargeLabel(mContext, 70, "70%", 1000L, 1000L)) .isNull(); } }