diff options
author | Stephane Lee <stayfan@google.com> | 2020-10-21 15:08:36 -0700 |
---|---|---|
committer | Stephane Lee <stayfan@google.com> | 2020-12-14 12:09:16 -0800 |
commit | 17016fc4ac410d1dce66bbeeeaacd9815d7da2d0 (patch) | |
tree | 87fc3c24fa7690b066c9d5d045df1156df2d5a48 | |
parent | 20413ff8a9088657808feb9d5f87f36c98556047 (diff) | |
download | pixel-17016fc4ac410d1dce66bbeeeaacd9815d7da2d0.tar.gz |
Override 'online' status for kernel defender
Bug: 175614345
Test: 'atest HealthTestCases'
Merged-In: I2aae813163a319f1b0d4ac9fb143f586803e2618
Change-Id: I2aae813163a319f1b0d4ac9fb143f586803e2618
(cherry picked from commit 65e06412dd8f37f9c60bfbcc73a4c89ed1f37d7f)
-rw-r--r-- | health/BatteryDefender.cpp | 68 | ||||
-rw-r--r-- | health/include/pixelhealth/BatteryDefender.h | 6 | ||||
-rw-r--r-- | health/test/TestBatteryDefender.cpp | 53 |
3 files changed, 96 insertions, 31 deletions
diff --git a/health/BatteryDefender.cpp b/health/BatteryDefender.cpp index 2cc538b8..e11d1a96 100644 --- a/health/BatteryDefender.cpp +++ b/health/BatteryDefender.cpp @@ -172,19 +172,19 @@ int32_t BatteryDefender::getTimeToActivate(void) { } void BatteryDefender::stateMachine_runAction(const state_E state, - struct android::BatteryProperties *props) { + const struct android::BatteryProperties *props) { switch (state) { case STATE_INIT: loadPersistentStorage(); - mWasAcOnline = props->chargerAcOnline; - mWasUsbOnline = props->chargerUsbOnline; + if (props->chargerUsbOnline || props->chargerAcOnline) { + mWasAcOnline = props->chargerAcOnline; + mWasUsbOnline = props->chargerUsbOnline; + } break; case STATE_DISABLED: case STATE_DISCONNECTED: clearStateData(); - mWasAcOnline = false; - mWasUsbOnline = false; break; case STATE_CONNECTED: @@ -192,32 +192,11 @@ void BatteryDefender::stateMachine_runAction(const state_E state, if (props->batteryLevel == kChargeHighCapacityLevel) { mHasReachedHighCapacityLevel = true; } - - mWasAcOnline = props->chargerAcOnline; - mWasUsbOnline = props->chargerUsbOnline; break; case STATE_ACTIVE: addTimeToChargeTimers(); mTimeActiveSecs += mTimeBetweenUpdateCalls; - - /* Force online if active and still connected to power. - * Setting a charge limit below the current charge level may - * disable the adapter. This does not occur for wireless adapters. - */ - if (mIsUsbPresent) { - /* If both previous fields are incorrectly false, force USB online */ - if ((mWasAcOnline == false) && (mWasUsbOnline == false)) { - props->chargerUsbOnline = true; - } else { - if (mWasAcOnline) { - props->chargerAcOnline = true; - } - if (mWasUsbOnline) { - props->chargerUsbOnline = true; - } - } - } break; default: @@ -311,6 +290,38 @@ void BatteryDefender::stateMachine_firstAction(const state_E state) { } } +void BatteryDefender::updateDefenderProperties(struct android::BatteryProperties *props) { + /** + * Override the OVERHEAT flag for UI updates to settings. + * Also, force AC/USB online if active and still connected to power. + */ + if (mCurrentState == STATE_ACTIVE) { + props->batteryHealth = android::BATTERY_HEALTH_OVERHEAT; + } + + /** + * If the kernel is forcing the input current limit to 0, then the online status may + * need to be overwritten. Also, setting a charge limit below the current charge level + * may disable the adapter. This does not occur for wireless adapters. + * Note; only override "online" if necessary (all "online"s are false). + */ + if (props->chargerUsbOnline == false && props->chargerAcOnline == false) { + /* Override if the USB is connected and a battery defender is active */ + if (mIsUsbPresent && props->batteryHealth == android::BATTERY_HEALTH_OVERHEAT) { + if (mWasAcOnline) { + props->chargerAcOnline = true; + } + if (mWasUsbOnline) { + props->chargerUsbOnline = true; + } + } + } else { + /* One of these booleans will always be true if updated here */ + mWasAcOnline = props->chargerAcOnline; + mWasUsbOnline = props->chargerUsbOnline; + } +} + void BatteryDefender::update(struct android::BatteryProperties *props) { if (!props) { return; @@ -326,13 +337,16 @@ void BatteryDefender::update(struct android::BatteryProperties *props) { mTimeBetweenUpdateCalls = getDeltaTimeSeconds(&mTimePreviousSecs); // Run state machine - stateMachine_runAction(mCurrentState, props); /* May override battery properties */ + stateMachine_runAction(mCurrentState, props); const state_E nextState = stateMachine_getNextState(mCurrentState); if (nextState != mCurrentState) { stateMachine_firstAction(nextState); } mCurrentState = nextState; + // Verify/update battery defender battery properties + updateDefenderProperties(props); /* May override battery properties */ + // Store outputs writeTimeToFile(kPathPersistChargerPresentTime, mTimeChargerPresentSecs, &mTimeChargerPresentSecsPrevious); diff --git a/health/include/pixelhealth/BatteryDefender.h b/health/include/pixelhealth/BatteryDefender.h index acb1abab..bc642600 100644 --- a/health/include/pixelhealth/BatteryDefender.h +++ b/health/include/pixelhealth/BatteryDefender.h @@ -117,10 +117,11 @@ class BatteryDefender { int mChargeLevelStopPrevious = DEFAULT_CHARGE_LEVEL_STOP; bool mHasReachedHighCapacityLevel = false; bool mWasAcOnline = false; - bool mWasUsbOnline = false; + bool mWasUsbOnline = true; /* Default; in case neither AC/USB online becomes 1 */ // Process state actions - void stateMachine_runAction(const state_E state, struct android::BatteryProperties *props); + void stateMachine_runAction(const state_E state, + const struct android::BatteryProperties *props); // Check state transitions state_E stateMachine_getNextState(const state_E state); @@ -128,6 +129,7 @@ class BatteryDefender { // Process state entry actions void stateMachine_firstAction(const state_E state); + void updateDefenderProperties(struct android::BatteryProperties *props); void clearStateData(void); void loadPersistentStorage(void); int64_t getTime(void); diff --git a/health/test/TestBatteryDefender.cpp b/health/test/TestBatteryDefender.cpp index 6058440f..233dd720 100644 --- a/health/test/TestBatteryDefender.cpp +++ b/health/test/TestBatteryDefender.cpp @@ -417,7 +417,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitActive_allOnlineFalse) { EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2); battDefender.update(&props); ASSERT_EQ(props.chargerAcOnline, false); - ASSERT_EQ(props.chargerUsbOnline, false); + ASSERT_EQ(props.chargerUsbOnline, true); props.chargerAcOnline = false; props.chargerUsbOnline = false; @@ -517,7 +517,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_allOnlineFalse) { EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")).Times(2); battDefender.update(&props); ASSERT_EQ(props.chargerAcOnline, false); - ASSERT_EQ(props.chargerUsbOnline, false); + ASSERT_EQ(props.chargerUsbOnline, true); props.chargerAcOnline = false; props.chargerUsbOnline = false; @@ -610,6 +610,55 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_allOnline) { ASSERT_EQ(props.chargerUsbOnline, true); } +TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_overrideHealth) { + BatteryDefender battDefender; + + enableDefender(); + usbPresent(); + defaultThreshold(); + initToConnectedCapacityReached(); + + InSequence s; + + props.batteryHealth = android::BATTERY_HEALTH_UNKNOWN; + EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED")); + battDefender.update(&props); + ASSERT_EQ(props.batteryHealth, android::BATTERY_HEALTH_UNKNOWN); + + props.batteryHealth = android::BATTERY_HEALTH_UNKNOWN; + testvar_systemTimeSecs += DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1; + EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE")); + battDefender.update(&props); + ASSERT_EQ(props.batteryHealth, android::BATTERY_HEALTH_OVERHEAT); +} + +TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_kernelDefend) { + BatteryDefender battDefender; + + enableDefender(); + usbPresent(); + defaultThreshold(); + initToConnectedCapacityReached(); + + InSequence s; + + EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED")).Times(3); + battDefender.update(&props); + + props.chargerAcOnline = true; + props.chargerUsbOnline = true; + props.batteryHealth = android::BATTERY_HEALTH_OVERHEAT; + battDefender.update(&props); + ASSERT_EQ(props.chargerAcOnline, true); + ASSERT_EQ(props.chargerUsbOnline, true); + + props.chargerAcOnline = false; + props.chargerUsbOnline = false; + battDefender.update(&props); + ASSERT_EQ(props.chargerAcOnline, true); + ASSERT_EQ(props.chargerUsbOnline, true); +} + } // namespace health } // namespace pixel } // namespace google |