1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef CAR_POWER_MANAGER 18 #define CAR_POWER_MANAGER 19 20 #include <binder/Status.h> 21 #include <utils/RefBase.h> 22 23 #include "android/car/ICar.h" 24 #include "android/car/hardware/power/BnCarPowerStateListener.h" 25 #include "android/car/hardware/power/ICarPower.h" 26 27 using android::binder::Status; 28 29 namespace android { 30 namespace car { 31 namespace hardware { 32 namespace power { 33 34 35 class CarPowerManager : public RefBase { 36 public: 37 // Enumeration of state change events 38 // NOTE: The entries in this enum must match the ones in CarPowerStateListener located in 39 // packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerManager.java 40 enum class State { 41 kWaitForVhal = 1, 42 kSuspendEnter = 2, 43 kSuspendExit = 3, 44 kShutdownEnter = 5, 45 kOn = 6, 46 kShutdownPrepare = 7, 47 kShutdownCancelled = 8, 48 49 50 kFirst = kWaitForVhal, 51 kLast = kShutdownCancelled, 52 }; 53 54 using Listener = std::function<void(State)>; 55 56 CarPowerManager() = default; ~CarPowerManager()57 virtual ~CarPowerManager() { 58 // Clear the listener if one is set 59 clearListener(); 60 } 61 62 // Removes the listener and turns off callbacks 63 // Returns 0 on success 64 int clearListener(); 65 66 // Request device to shutdown in lieu of suspend at the next opportunity 67 // Returns 0 on success 68 int requestShutdownOnNextSuspend(); 69 70 // Set the callback function. This will execute in the binder thread. 71 // Returns 0 on success 72 int setListener(Listener listener); 73 74 private: 75 class CarPowerStateListener final : public BnCarPowerStateListener { 76 public: CarPowerStateListener(CarPowerManager * parent)77 explicit CarPowerStateListener(CarPowerManager* parent) : mParent(parent) {}; 78 onStateChanged(int state)79 Status onStateChanged(int state) override { 80 sp<CarPowerManager> parent = mParent; 81 if ((parent == nullptr) || (parent->mListener == nullptr)) { 82 ALOGE("CarPowerManagerNative: onStateChanged null pointer detected!"); 83 } else if ((state < static_cast<int>(State::kFirst)) || 84 (state > static_cast<int>(State::kLast)) ) { 85 ALOGE("CarPowerManagerNative: onStateChanged unknown state: %d", state); 86 } else { 87 // Notify the listener of the state transition 88 parent->mListener(static_cast<State>(state)); 89 } 90 return binder::Status::ok(); 91 }; 92 93 private: 94 sp<CarPowerManager> mParent; 95 }; 96 97 bool connectToCarService(); 98 99 sp<ICarPower> mICarPower; 100 bool mIsConnected; 101 Listener mListener; 102 sp<CarPowerStateListener> mListenerToService; 103 }; 104 105 } // namespace power 106 } // namespace hardware 107 } // namespace car 108 } // namespace android 109 110 #endif // CAR_POWER_MANAGER 111