Home | History | Annotate | Download | only in CarPowerManager
      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 
     26 namespace android {
     27 namespace car {
     28 namespace hardware {
     29 namespace power {
     30 
     31 // Public functions
     32 int 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 
     43 int 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 
     61 int CarPowerManager::requestShutdownOnNextSuspend() {
     62     int retVal = -1;
     63 
     64     if (connectToCarService()) {
     65         mICarPower->requestShutdownOnNextSuspend();
     66         retVal = 0;
     67     }
     68     return retVal;
     69 }
     70 
     71 int 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
     89 bool 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