1cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat/* 2cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * Copyright (C) 2015 The Android Open Source Project 3cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * 4cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * Licensed under the Apache License, Version 2.0 (the "License"); 5cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * you may not use this file except in compliance with the License. 6cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * You may obtain a copy of the License at 7cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * 8cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * http://www.apache.org/licenses/LICENSE-2.0 9cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * 10cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * Unless required by applicable law or agreed to in writing, software 11cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * distributed under the License is distributed on an "AS IS" BASIS, 12cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * See the License for the specific language governing permissions and 14cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * limitations under the License. 15cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat */ 16cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 17cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#ifndef SYSTEM_NATIVEPOWER_DAEMON_POWER_MANAGER_H_ 18cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#define SYSTEM_NATIVEPOWER_DAEMON_POWER_MANAGER_H_ 19cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 20cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <memory> 21cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 22e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat#include <base/files/file_path.h> 23cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <base/macros.h> 24e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat#include <base/time/time.h> 25cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <nativepower/BnPowerManager.h> 26cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 27c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat#include "system_property_setter.h" 28cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include "wake_lock_manager.h" 29cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 30cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Eratnamespace android { 31cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 32cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Eratclass PowerManager : public BnPowerManager { 33cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat public: 34c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat // The part of the reboot or shutdown system properties' values that appears 35c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat // before the reason. These strings are hardcoded in 36c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat // system/core/init/builtins.cpp. 37c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat static const char kRebootPrefix[]; 38c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat static const char kShutdownPrefix[]; 39c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat 40e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat // Value written to |power_state_path_| to suspend the system to memory. 41e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat static const char kPowerStateSuspend[]; 42e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat 43cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat PowerManager(); 44cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat ~PowerManager() override; 45cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 46cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat // Must be called before Init(). 47c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat void set_property_setter_for_testing( 48c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat std::unique_ptr<SystemPropertySetterInterface> setter) { 49c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat property_setter_ = std::move(setter); 50c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat } 51c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat 52c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat // Must be called before Init(). 53cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat void set_wake_lock_manager_for_testing( 54cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat std::unique_ptr<WakeLockManagerInterface> manager) { 55cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat wake_lock_manager_ = std::move(manager); 56cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat } 57cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 58e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat void set_power_state_path_for_testing(const base::FilePath& path) { 59e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat power_state_path_ = path; 60e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat } 61e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat 62cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat // Initializes the object, returning true on success. 63cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat bool Init(); 64cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 65cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat // BnPowerManager: 66cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat status_t acquireWakeLock(int flags, 67cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const sp<IBinder>& lock, 68cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const String16& tag, 69cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const String16& packageName, 70cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat bool isOneWay=false) override; 71cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat status_t acquireWakeLockWithUid(int flags, 72cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const sp<IBinder>& lock, 73cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const String16& tag, 74cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const String16& packageName, 75cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat int uid, 76cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat bool isOneWay=false) override; 77cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat status_t releaseWakeLock(const sp<IBinder>& lock, 78cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat int flags, 79cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat bool isOneWay=false) override; 80cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat status_t updateWakeLockUids(const sp<IBinder>& lock, 81cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat int len, 82cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const int* uids, 83cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat bool isOneWay=false) override; 84cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat status_t powerHint(int hintId, int data) override; 8577ca78c8d297564db431a5b3a9165e170bb7c72aDaniel Erat status_t goToSleep(int64_t event_time_ms, int reason, int flags) override; 8677ca78c8d297564db431a5b3a9165e170bb7c72aDaniel Erat status_t reboot(bool confirm, const String16& reason, bool wait) override; 8777ca78c8d297564db431a5b3a9165e170bb7c72aDaniel Erat status_t shutdown(bool confirm, const String16& reason, bool wait) override; 8877ca78c8d297564db431a5b3a9165e170bb7c72aDaniel Erat status_t crash(const String16& message) override; 89cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 90cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat private: 91cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat // Helper method for acquireWakeLock*(). Returns true on success. 92cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat bool AddWakeLockRequest(const sp<IBinder>& lock, 93cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const String16& tag, 94cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat const String16& packageName, 95cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat int uid); 96cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 97c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat std::unique_ptr<SystemPropertySetterInterface> property_setter_; 98cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat std::unique_ptr<WakeLockManagerInterface> wake_lock_manager_; 99cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 100e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat // Path to sysfs file that can be written to change the power state. 101e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat base::FilePath power_state_path_; 102e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat 103e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat // System uptime (as duration since boot) when userspace was last resumed from 104e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat // suspend. Initially unset. 105e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat base::TimeDelta last_resume_uptime_; 106e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat 107cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat DISALLOW_COPY_AND_ASSIGN(PowerManager); 108cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat}; 109cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 110cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat} // namespace android 111cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 112cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#endif // SYSTEM_NATIVEPOWER_DAEMON_POWER_MANAGER_H_ 113