| /* |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef CAR_POWER_MANAGER |
| #define CAR_POWER_MANAGER |
| |
| #include <binder/Status.h> |
| #include <utils/RefBase.h> |
| |
| #include "android/car/ICar.h" |
| #include "android/car/hardware/power/BnCarPowerStateListener.h" |
| #include "android/car/hardware/power/ICarPower.h" |
| |
| using android::binder::Status; |
| |
| namespace android { |
| namespace car { |
| namespace hardware { |
| namespace power { |
| |
| |
| class CarPowerManager : public RefBase { |
| public: |
| // Enumeration of state change events |
| // NOTE: The entries in this enum must match the ones in CarPowerStateListener located in |
| // packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerManager.java |
| enum class State { |
| kShutdownCancelled = 0, |
| kShutdownEnter = 1, |
| kWaitForVhal = 2, |
| kSuspendEnter = 3, |
| kSuspendExit = 4, |
| kOn = 5, |
| kShutdownPrepare = 6, |
| |
| kFirst = kWaitForVhal, |
| kLast = kShutdownCancelled, |
| }; |
| |
| using Listener = std::function<void(State)>; |
| |
| CarPowerManager() = default; |
| virtual ~CarPowerManager() { |
| // Clear the listener if one is set |
| clearListener(); |
| } |
| |
| // Removes the listener and turns off callbacks |
| // Returns 0 on success |
| int clearListener(); |
| |
| // Request device to shutdown in lieu of suspend at the next opportunity |
| // Returns 0 on success |
| int requestShutdownOnNextSuspend(); |
| |
| // Set the callback function. This will execute in the binder thread. |
| // Returns 0 on success |
| int setListener(Listener listener); |
| |
| private: |
| class CarPowerStateListener final : public BnCarPowerStateListener { |
| public: |
| explicit CarPowerStateListener(CarPowerManager* parent) : mParent(parent) {}; |
| |
| Status onStateChanged(int state, int token) override { |
| sp<CarPowerManager> parent = mParent; |
| if ((parent != nullptr) && (parent->mListener != nullptr)) { |
| if ((state >= static_cast<int>(State::kFirst)) && |
| (state <= static_cast<int>(State::kLast))) { |
| // Notify the listener of the state transition |
| parent->mListener(static_cast<State>(state)); |
| if (token != 0) { |
| // Call finished() method to let CPMS know we're ready to suspend/shutdown. |
| parent->mICarPower->finished(parent->mListenerToService, token); |
| } |
| } else { |
| ALOGE("CarPowerManagerNative: onStateChanged unknown state: %d", state); |
| } |
| } else { |
| ALOGE("CarPowerManagerNative: onStateChanged null pointer detected!"); |
| } |
| return binder::Status::ok(); |
| }; |
| |
| private: |
| sp<CarPowerManager> mParent; |
| }; |
| |
| bool connectToCarService(); |
| |
| sp<ICarPower> mICarPower; |
| bool mIsConnected; |
| Listener mListener; |
| sp<CarPowerStateListener> mListenerToService; |
| }; |
| |
| } // namespace power |
| } // namespace hardware |
| } // namespace car |
| } // namespace android |
| |
| #endif // CAR_POWER_MANAGER |
| |