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