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#define LOG_TAG "CarPowerManagerNative" 18 19#include <binder/IServiceManager.h> 20#include <binder/IBinder.h> 21#include <binder/IInterface.h> 22#include <utils/Log.h> 23 24#include "CarPowerManager.h" 25 26namespace android { 27namespace car { 28namespace hardware { 29namespace power { 30 31// Public functions 32int CarPowerManager::clearListener() { 33 int retVal = -1; 34 35 if (mIsConnected && (mListenerToService != nullptr)) { 36 mICarPower->unregisterListener(mListenerToService); 37 mListenerToService = nullptr; 38 retVal = 0; 39 } 40 return retVal; 41} 42 43int CarPowerManager::getBootReason(BootReason *bootReason) { 44 int retVal = -1; 45 46 if ((bootReason != nullptr) && connectToCarService()) { 47 int reason = -1; 48 mICarPower->getBootReason(&reason); 49 50 if ((reason >= static_cast<int>(BootReason::kFirst)) && 51 (reason <= static_cast<int>(BootReason::kLast))) { 52 *bootReason = static_cast<BootReason>(reason); 53 retVal = 0; 54 } else { 55 ALOGE("Received unknown bootReason = %d", reason); 56 } 57 } 58 return retVal; 59} 60 61int CarPowerManager::requestShutdownOnNextSuspend() { 62 int retVal = -1; 63 64 if (connectToCarService()) { 65 mICarPower->requestShutdownOnNextSuspend(); 66 retVal = 0; 67 } 68 return retVal; 69} 70 71int CarPowerManager::setListener(Listener listener) { 72 int retVal = -1; 73 74 if (connectToCarService()) { 75 if (mListenerToService == nullptr) { 76 mListenerToService = new CarPowerStateListener(this); 77 mICarPower->registerListener(mListenerToService); 78 } 79 80 // Set the listener 81 mListener = listener; 82 retVal = 0; 83 } 84 return retVal; 85} 86 87 88// Private functions 89bool CarPowerManager::connectToCarService() { 90 if (mIsConnected) { 91 // Service is already connected 92 return true; 93 } 94 95 const String16 ICarName("car_service"); 96 const String16 ICarPowerName("power"); 97 98 ALOGI("Connecting to CarService" LOG_TAG); 99 100 // Get ICar 101 sp<IServiceManager> serviceManager = defaultServiceManager(); 102 if (serviceManager == nullptr) { 103 ALOGE("Cannot get defaultServiceManager"); 104 return(false); 105 } 106 107 sp<IBinder> binder = (serviceManager->getService(ICarName)); 108 if (binder == nullptr) { 109 ALOGE("Cannot get ICar"); 110 return false; 111 } 112 113 // Get ICarPower 114 sp<ICar> iCar = interface_cast<ICar>(binder); 115 if (iCar == nullptr) { 116 ALOGW("car service unavailable"); 117 return false; 118 } 119 120 iCar->getCarService(ICarPowerName, &binder); 121 if (binder == nullptr) { 122 ALOGE("Cannot get ICarPower"); 123 return false; 124 } 125 126 mICarPower = interface_cast<ICarPower>(binder); 127 if (mICarPower == nullptr) { 128 ALOGW("car power management service unavailable"); 129 return false; 130 } 131 mIsConnected = true; 132 return true; 133} 134 135 136} // namespace power 137} // namespace hardware 138} // namespace car 139} // namespace android 140 141