diff --git a/power-libperfmgr/Power.cpp b/power-libperfmgr/Power.cpp index 265a045..7eabdf8 100644 --- a/power-libperfmgr/Power.cpp +++ b/power-libperfmgr/Power.cpp @@ -49,7 +49,8 @@ constexpr char kPowerHalRenderingProp[] = "vendor.powerhal.rendering"; Power::Power() : mInteractionHandler(nullptr), - mSustainedPerfModeOn(false) { + mSustainedPerfModeOn(false), + mBatterySaverOn(false) { mInteractionHandler = std::make_unique(); mInteractionHandler->Init(); @@ -75,6 +76,13 @@ Power::Power() } } +static void endAllHints() { + std::shared_ptr hm = HintManager::GetInstance(); + for (auto hint : hm->GetHints()) { + hm->EndHint(hint); + } +} + ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) { LOG(DEBUG) << "Power setMode: " << toString(type) << " to: " << enabled; if (HintManager::GetInstance()->GetAdpfProfile() && @@ -93,6 +101,15 @@ ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) { } mSustainedPerfModeOn = true; break; + case Mode::LOW_POWER: + if (enabled) { + endAllHints(); + HintManager::GetInstance()->DoHint("LOW_POWER"); + } else { + HintManager::GetInstance()->EndHint("LOW_POWER"); + } + mBatterySaverOn = enabled; + break; case Mode::LAUNCH: if (mSustainedPerfModeOn) { break; @@ -115,6 +132,7 @@ ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) { case Mode::AUDIO_STREAMING_LOW_LATENCY: [[fallthrough]]; default: + if (mBatterySaverOn) break; if (enabled) { HintManager::GetInstance()->DoHint(toString(type)); } else { @@ -127,7 +145,8 @@ ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) { } ndk::ScopedAStatus Power::isModeSupported(Mode type, bool *_aidl_return) { - bool supported = HintManager::GetInstance()->IsHintSupported(toString(type)); + bool supported = type == Mode::LOW_POWER + || HintManager::GetInstance()->IsHintSupported(toString(type)); #ifdef TAP_TO_WAKE_NODE if (type == Mode::DOUBLE_TAP_TO_WAKE) { supported = true; @@ -146,7 +165,7 @@ ndk::ScopedAStatus Power::setBoost(Boost type, int32_t durationMs) { } switch (type) { case Boost::INTERACTION: - if (mSustainedPerfModeOn) { + if (mSustainedPerfModeOn || mBatterySaverOn) { break; } mInteractionHandler->Acquire(durationMs); @@ -158,7 +177,7 @@ ndk::ScopedAStatus Power::setBoost(Boost type, int32_t durationMs) { case Boost::AUDIO_LAUNCH: [[fallthrough]]; default: - if (mSustainedPerfModeOn) { + if (mSustainedPerfModeOn || mBatterySaverOn) { break; } if (durationMs > 0) { @@ -189,9 +208,11 @@ constexpr const char *boolToString(bool b) { binder_status_t Power::dump(int fd, const char **, uint32_t) { std::string buf(::android::base::StringPrintf( "HintManager Running: %s\n" - "SustainedPerformanceMode: %s\n", + "SustainedPerformanceMode: %s\n" + "BatterySaverMode: %s\n", boolToString(HintManager::GetInstance()->IsRunning()), - boolToString(mSustainedPerfModeOn))); + boolToString(mSustainedPerfModeOn), + boolToString(mBatterySaverOn))); // Dump nodes through libperfmgr HintManager::GetInstance()->DumpToFd(fd); PowerSessionManager::getInstance()->dumpToFd(fd); diff --git a/power-libperfmgr/Power.h b/power-libperfmgr/Power.h index c5bb2a8..4e43da2 100644 --- a/power-libperfmgr/Power.h +++ b/power-libperfmgr/Power.h @@ -52,6 +52,7 @@ class Power : public ::aidl::android::hardware::power::BnPower { private: std::unique_ptr mInteractionHandler; std::atomic mSustainedPerfModeOn; + std::atomic mBatterySaverOn; }; } // namespace pixel