Merge "Update battery health state intent (1/3)" into udc-dev

This commit is contained in:
YK Hung
2023-05-15 03:27:44 +00:00
committed by Android (Google) Code Review
11 changed files with 87 additions and 83 deletions

View File

@@ -16,12 +16,11 @@
package com.android.settingslib.fuelgauge;
import static android.os.BatteryManager.BATTERY_HEALTH_OVERHEAT;
import static android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN;
import static android.os.BatteryManager.BATTERY_STATUS_FULL;
import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN;
import static android.os.BatteryManager.EXTRA_HEALTH;
import static android.os.BatteryManager.EXTRA_LEVEL;
import static android.os.BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE;
import static android.os.BatteryManager.CHARGING_POLICY_DEFAULT;
import static android.os.BatteryManager.EXTRA_CHARGING_STATUS;
import static android.os.BatteryManager.EXTRA_MAX_CHARGING_CURRENT;
import static android.os.BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE;
import static android.os.BatteryManager.EXTRA_PLUGGED;
@@ -51,7 +50,7 @@ public class BatteryStatus {
public final int status;
public final int level;
public final int plugged;
public final int health;
public final int chargingStatus;
public final int maxChargingWattage;
public final boolean present;
public final Optional<Boolean> incompatibleCharger;
@@ -62,12 +61,12 @@ public class BatteryStatus {
? null : new BatteryStatus(batteryChangedIntent, incompatibleCharger);
}
public BatteryStatus(int status, int level, int plugged, int health,
public BatteryStatus(int status, int level, int plugged, int chargingStatus,
int maxChargingWattage, boolean present) {
this.status = status;
this.level = level;
this.plugged = plugged;
this.health = health;
this.chargingStatus = chargingStatus;
this.maxChargingWattage = maxChargingWattage;
this.present = present;
this.incompatibleCharger = Optional.empty();
@@ -86,7 +85,8 @@ public class BatteryStatus {
status = batteryChangedIntent.getIntExtra(EXTRA_STATUS, BATTERY_STATUS_UNKNOWN);
plugged = batteryChangedIntent.getIntExtra(EXTRA_PLUGGED, 0);
level = getBatteryLevel(batteryChangedIntent);
health = batteryChangedIntent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN);
chargingStatus = batteryChangedIntent.getIntExtra(EXTRA_CHARGING_STATUS,
CHARGING_POLICY_DEFAULT);
present = batteryChangedIntent.getBooleanExtra(EXTRA_PRESENT, true);
this.incompatibleCharger = incompatibleCharger;
@@ -143,9 +143,9 @@ public class BatteryStatus {
return level < LOW_BATTERY_THRESHOLD;
}
/** Whether battery is overheated. */
public boolean isOverheated() {
return health == BATTERY_HEALTH_OVERHEAT;
/** Whether battery defender is enabled. */
public boolean isBatteryDefender() {
return chargingStatus == CHARGING_POLICY_ADAPTIVE_LONGLIFE;
}
/** Return current chargin speed is fast, slow or normal. */
@@ -163,7 +163,8 @@ public class BatteryStatus {
@Override
public String toString() {
return "BatteryStatus{status=" + status + ",level=" + level + ",plugged=" + plugged
+ ",health=" + health + ",maxChargingWattage=" + maxChargingWattage + "}";
+ ",chargingStatus=" + chargingStatus + ",maxChargingWattage=" + maxChargingWattage
+ "}";
}
/**

View File

@@ -29,6 +29,7 @@ import static android.hardware.biometrics.BiometricConstants.LockoutMode;
import static android.hardware.biometrics.BiometricSourceType.FACE;
import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT;
import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN;
import static android.os.BatteryManager.CHARGING_POLICY_DEFAULT;
import static android.os.PowerManager.WAKE_REASON_UNKNOWN;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT;
@@ -2457,7 +2458,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
}
// Take a guess at initial SIM state, battery status and PLMN until we get an update
mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, 100, 0, 0, 0, true);
mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, /* level= */ 100, /* plugged= */
0, CHARGING_POLICY_DEFAULT, /* maxChargingWattage= */0, /* present= */true);
// Watch for interesting updates
final IntentFilter filter = new IntentFilter();
@@ -3881,8 +3883,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
return true;
}
// change in battery overheat
return current.health != old.health;
// change in charging status
return current.chargingStatus != old.chargingStatus;
}
/**

View File

@@ -78,7 +78,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver {
private boolean mShowPercentAvailable;
private String mEstimateText = null;
private boolean mCharging;
private boolean mIsOverheated;
private boolean mIsBatteryDefender;
private boolean mDisplayShieldEnabled;
// Error state where we know nothing about the current battery state
private boolean mBatteryStateUnknown;
@@ -213,9 +213,9 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver {
mDrawable.setPowerSaveEnabled(isPowerSave);
}
void onIsOverheatedChanged(boolean isOverheated) {
boolean valueChanged = mIsOverheated != isOverheated;
mIsOverheated = isOverheated;
void onIsBatteryDefenderChanged(boolean isBatteryDefender) {
boolean valueChanged = mIsBatteryDefender != isBatteryDefender;
mIsBatteryDefender = isBatteryDefender;
if (valueChanged) {
updateContentDescription();
// The battery drawable is a different size depending on whether it's currently
@@ -308,12 +308,12 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver {
contentDescription = context.getString(R.string.accessibility_battery_unknown);
} else if (mShowPercentMode == MODE_ESTIMATE && !TextUtils.isEmpty(mEstimateText)) {
contentDescription = context.getString(
mIsOverheated
mIsBatteryDefender
? R.string.accessibility_battery_level_charging_paused_with_estimate
: R.string.accessibility_battery_level_with_estimate,
mLevel,
mEstimateText);
} else if (mIsOverheated) {
} else if (mIsBatteryDefender) {
contentDescription =
context.getString(R.string.accessibility_battery_level_charging_paused, mLevel);
} else if (mCharging) {
@@ -399,9 +399,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver {
float mainBatteryWidth =
res.getDimensionPixelSize(R.dimen.status_bar_battery_icon_width) * iconScaleFactor;
// If the battery is marked as overheated, we should display a shield indicating that the
// battery is being "defended".
boolean displayShield = mDisplayShieldEnabled && mIsOverheated;
boolean displayShield = mDisplayShieldEnabled && mIsBatteryDefender;
float fullBatteryIconHeight =
BatterySpecs.getFullBatteryHeight(mainBatteryHeight, displayShield);
float fullBatteryIconWidth =

View File

@@ -91,8 +91,8 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView>
}
@Override
public void onIsOverheatedChanged(boolean isOverheated) {
mView.onIsOverheatedChanged(isOverheated);
public void onIsBatteryDefenderChanged(boolean isBatteryDefender) {
mView.onIsBatteryDefenderChanged(isBatteryDefender);
}
};

View File

@@ -186,7 +186,7 @@ public class KeyguardIndicationController {
private boolean mPowerPluggedInDock;
private boolean mPowerCharged;
private boolean mBatteryOverheated;
private boolean mBatteryDefender;
private boolean mEnableBatteryDefender;
private boolean mIncompatibleCharger;
private int mChargingSpeed;
@@ -921,7 +921,7 @@ public class KeyguardIndicationController {
*/
protected String computePowerIndication() {
int chargingId;
if (mBatteryOverheated) {
if (mBatteryDefender) {
chargingId = R.string.keyguard_plugged_in_charging_limited;
String percentage = NumberFormat.getPercentInstance().format(mBatteryLevel / 100f);
return mContext.getResources().getString(chargingId, percentage);
@@ -1093,9 +1093,9 @@ public class KeyguardIndicationController {
mChargingSpeed = status.getChargingSpeed(mContext);
mBatteryLevel = status.level;
mBatteryPresent = status.present;
mBatteryOverheated = status.isOverheated();
mBatteryDefender = status.isBatteryDefender();
// when the battery is overheated, device doesn't charge so only guard on pluggedIn:
mEnableBatteryDefender = mBatteryOverheated && status.isPluggedIn();
mEnableBatteryDefender = mBatteryDefender && status.isPluggedIn();
mIncompatibleCharger = status.incompatibleCharger.orElse(false);
try {
mChargingTimeRemaining = mPowerPluggedIn
@@ -1106,7 +1106,7 @@ public class KeyguardIndicationController {
}
mKeyguardLogger.logRefreshBatteryInfo(isChargingOrFull, mPowerPluggedIn, mBatteryLevel,
mBatteryOverheated);
mBatteryDefender);
updateDeviceEntryIndication(!wasPluggedIn && mPowerPluggedInWired);
}

View File

@@ -156,7 +156,7 @@ public interface BatteryController extends DemoMode,
default void onWirelessChargingChanged(boolean isWirlessCharging) {
}
default void onIsOverheatedChanged(boolean isOverheated) {
default void onIsBatteryDefenderChanged(boolean isBatteryDefender) {
}
}

View File

@@ -16,9 +16,9 @@
package com.android.systemui.statusbar.policy;
import static android.os.BatteryManager.BATTERY_HEALTH_OVERHEAT;
import static android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN;
import static android.os.BatteryManager.EXTRA_HEALTH;
import static android.os.BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE;
import static android.os.BatteryManager.CHARGING_POLICY_DEFAULT;
import static android.os.BatteryManager.EXTRA_CHARGING_STATUS;
import static android.os.BatteryManager.EXTRA_PRESENT;
import static com.android.settingslib.fuelgauge.BatterySaverLogging.SAVER_ENABLED_QS;
@@ -94,7 +94,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
protected boolean mPowerSave;
private boolean mAodPowerSave;
private boolean mWirelessCharging;
private boolean mIsOverheated = false;
private boolean mIsBatteryDefender = false;
private boolean mTestMode = false;
@VisibleForTesting
boolean mHasReceivedBattery = false;
@@ -163,7 +163,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
pw.print(" mPluggedIn="); pw.println(mPluggedIn);
pw.print(" mCharging="); pw.println(mCharging);
pw.print(" mCharged="); pw.println(mCharged);
pw.print(" mIsOverheated="); pw.println(mIsOverheated);
pw.print(" mIsBatteryDefender="); pw.println(mIsBatteryDefender);
pw.print(" mPowerSave="); pw.println(mPowerSave);
pw.print(" mStateUnknown="); pw.println(mStateUnknown);
}
@@ -197,7 +197,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
cb.onPowerSaveChanged(mPowerSave);
cb.onBatteryUnknownStateChanged(mStateUnknown);
cb.onWirelessChargingChanged(mWirelessCharging);
cb.onIsOverheatedChanged(mIsOverheated);
cb.onIsBatteryDefenderChanged(mIsBatteryDefender);
}
@Override
@@ -236,11 +236,11 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
fireBatteryUnknownStateChanged();
}
int batteryHealth = intent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN);
boolean isOverheated = batteryHealth == BATTERY_HEALTH_OVERHEAT;
if (isOverheated != mIsOverheated) {
mIsOverheated = isOverheated;
fireIsOverheatedChanged();
int chargingStatus = intent.getIntExtra(EXTRA_CHARGING_STATUS, CHARGING_POLICY_DEFAULT);
boolean isBatteryDefender = chargingStatus == CHARGING_POLICY_ADAPTIVE_LONGLIFE;
if (isBatteryDefender != mIsBatteryDefender) {
mIsBatteryDefender = isBatteryDefender;
fireIsBatteryDefenderChanged();
}
fireBatteryLevelChanged();
@@ -313,8 +313,8 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
return mPluggedChargingSource == BatteryManager.BATTERY_PLUGGED_WIRELESS;
}
public boolean isOverheated() {
return mIsOverheated;
public boolean isBatteryDefender() {
return mIsBatteryDefender;
}
@Override
@@ -428,11 +428,11 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
}
}
private void fireIsOverheatedChanged() {
private void fireIsBatteryDefenderChanged() {
synchronized (mChangeCallbacks) {
final int n = mChangeCallbacks.size();
for (int i = 0; i < n; i++) {
mChangeCallbacks.get(i).onIsOverheatedChanged(mIsOverheated);
mChangeCallbacks.get(i).onIsBatteryDefenderChanged(mIsBatteryDefender);
}
}
}
@@ -447,7 +447,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
String plugged = args.getString("plugged");
String powerSave = args.getString("powersave");
String present = args.getString("present");
String overheated = args.getString("overheated");
String defender = args.getString("defender");
if (level != null) {
mLevel = Math.min(Math.max(Integer.parseInt(level), 0), 100);
}
@@ -462,9 +462,9 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
mStateUnknown = !present.equals("true");
fireBatteryUnknownStateChanged();
}
if (overheated != null) {
mIsOverheated = overheated.equals("true");
fireIsOverheatedChanged();
if (defender != null) {
mIsBatteryDefender = defender.equals("true");
fireIsBatteryDefenderChanged();
}
fireBatteryLevelChanged();
}

View File

@@ -3088,7 +3088,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
private Intent getBatteryIntent() {
return new Intent(Intent.ACTION_BATTERY_CHANGED).putExtra(
BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT);
BatteryManager.EXTRA_CHARGING_STATUS,
BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE);
}
private class TestableKeyguardUpdateMonitor extends KeyguardUpdateMonitor {

View File

@@ -85,9 +85,9 @@ class BatteryMeterViewTest : SysuiTestCase() {
}
@Test
fun contentDescription_estimateAndOverheated() {
fun contentDescription_estimateAndBatteryDefender() {
mBatteryMeterView.onBatteryLevelChanged(17, false)
mBatteryMeterView.onIsOverheatedChanged(true)
mBatteryMeterView.onIsBatteryDefenderChanged(true)
mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE)
mBatteryMeterView.setBatteryEstimateFetcher(Fetcher())
@@ -103,9 +103,9 @@ class BatteryMeterViewTest : SysuiTestCase() {
}
@Test
fun contentDescription_overheated() {
fun contentDescription_batteryDefender() {
mBatteryMeterView.onBatteryLevelChanged(90, false)
mBatteryMeterView.onIsOverheatedChanged(true)
mBatteryMeterView.onIsBatteryDefenderChanged(true)
assertThat(mBatteryMeterView.contentDescription).isEqualTo(
context.getString(R.string.accessibility_battery_level_charging_paused, 90)
@@ -155,14 +155,14 @@ class BatteryMeterViewTest : SysuiTestCase() {
@Test
fun contentDescription_manyUpdates_alwaysUpdated() {
// Overheated
// BatteryDefender
mBatteryMeterView.onBatteryLevelChanged(90, false)
mBatteryMeterView.onIsOverheatedChanged(true)
mBatteryMeterView.onIsBatteryDefenderChanged(true)
assertThat(mBatteryMeterView.contentDescription).isEqualTo(
context.getString(R.string.accessibility_battery_level_charging_paused, 90)
)
// Overheated & estimate
// BatteryDefender & estimate
mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE)
mBatteryMeterView.setBatteryEstimateFetcher(Fetcher())
mBatteryMeterView.updatePercentText()
@@ -175,7 +175,7 @@ class BatteryMeterViewTest : SysuiTestCase() {
)
// Just estimate
mBatteryMeterView.onIsOverheatedChanged(false)
mBatteryMeterView.onIsBatteryDefenderChanged(false)
assertThat(mBatteryMeterView.contentDescription).isEqualTo(
context.getString(
R.string.accessibility_battery_level_with_estimate,
@@ -198,35 +198,35 @@ class BatteryMeterViewTest : SysuiTestCase() {
}
@Test
fun isOverheatedChanged_true_drawableGetsTrue() {
fun isBatteryDefenderChanged_true_drawableGetsTrue() {
mBatteryMeterView.setDisplayShieldEnabled(true)
val drawable = getBatteryDrawable()
mBatteryMeterView.onIsOverheatedChanged(true)
mBatteryMeterView.onIsBatteryDefenderChanged(true)
assertThat(drawable.displayShield).isTrue()
}
@Test
fun isOverheatedChanged_false_drawableGetsFalse() {
fun isBatteryDefenderChanged_false_drawableGetsFalse() {
mBatteryMeterView.setDisplayShieldEnabled(true)
val drawable = getBatteryDrawable()
// Start as true
mBatteryMeterView.onIsOverheatedChanged(true)
mBatteryMeterView.onIsBatteryDefenderChanged(true)
// Update to false
mBatteryMeterView.onIsOverheatedChanged(false)
mBatteryMeterView.onIsBatteryDefenderChanged(false)
assertThat(drawable.displayShield).isFalse()
}
@Test
fun isOverheatedChanged_true_featureflagOff_drawableGetsFalse() {
fun isBatteryDefenderChanged_true_featureflagOff_drawableGetsFalse() {
mBatteryMeterView.setDisplayShieldEnabled(false)
val drawable = getBatteryDrawable()
mBatteryMeterView.onIsOverheatedChanged(true)
mBatteryMeterView.onIsBatteryDefenderChanged(true)
assertThat(drawable.displayShield).isFalse()
}

View File

@@ -1066,11 +1066,11 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
}
@Test
public void onRefreshBatteryInfo_chargingWithOverheat_presentChargingLimited() {
public void onRefreshBatteryInfo_chargingWithLongLife_presentChargingLimited() {
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
80 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */,
BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE, 0 /* maxChargingWattage */,
true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
@@ -1084,11 +1084,11 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
}
@Test
public void onRefreshBatteryInfo_fullChargedWithOverheat_presentChargingLimited() {
public void onRefreshBatteryInfo_fullChargedWithLongLife_presentChargingLimited() {
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
100 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */,
BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE, 0 /* maxChargingWattage */,
true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
@@ -1102,11 +1102,11 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
}
@Test
public void onRefreshBatteryInfo_fullChargedWithoutOverheat_presentCharged() {
public void onRefreshBatteryInfo_fullChargedWithoutLongLife_presentCharged() {
createController();
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
100 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
BatteryManager.BATTERY_HEALTH_GOOD, 0 /* maxChargingWattage */,
BatteryManager.CHARGING_POLICY_DEFAULT, 0 /* maxChargingWattage */,
true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);
@@ -1118,11 +1118,11 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
}
@Test
public void onRefreshBatteryInfo_dozing_dischargingWithOverheat_presentBatteryPercentage() {
public void onRefreshBatteryInfo_dozing_dischargingWithLongLife_presentBatteryPercentage() {
createController();
mController.setVisible(true);
BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_DISCHARGING,
90 /* level */, 0 /* plugged */, BatteryManager.BATTERY_HEALTH_OVERHEAT,
90 /* level */, 0 /* plugged */, BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE,
0 /* maxChargingWattage */, true /* present */);
mController.getKeyguardCallback().onRefreshBatteryInfo(status);

View File

@@ -226,31 +226,33 @@ public class BatteryControllerTest extends SysuiTestCase {
}
@Test
public void batteryStateChanged_healthNotOverheated_outputsFalse() {
public void batteryStateChanged_chargingStatusNotLongLife_outputsFalse() {
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
intent.putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_GOOD);
intent.putExtra(BatteryManager.EXTRA_CHARGING_STATUS,
BatteryManager.CHARGING_POLICY_DEFAULT);
mBatteryController.onReceive(getContext(), intent);
Assert.assertFalse(mBatteryController.isOverheated());
Assert.assertFalse(mBatteryController.isBatteryDefender());
}
@Test
public void batteryStateChanged_healthOverheated_outputsTrue() {
public void batteryStateChanged_chargingStatusLongLife_outputsTrue() {
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
intent.putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT);
intent.putExtra(BatteryManager.EXTRA_CHARGING_STATUS,
BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE);
mBatteryController.onReceive(getContext(), intent);
Assert.assertTrue(mBatteryController.isOverheated());
Assert.assertTrue(mBatteryController.isBatteryDefender());
}
@Test
public void batteryStateChanged_noHealthGiven_outputsFalse() {
public void batteryStateChanged_noChargingStatusGiven_outputsFalse() {
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
mBatteryController.onReceive(getContext(), intent);
Assert.assertFalse(mBatteryController.isOverheated());
Assert.assertFalse(mBatteryController.isBatteryDefender());
}
}