16f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber/*
26f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Copyright (C) 2017 The Android Open Source Project
36f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
46f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
56f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * you may not use this file except in compliance with the License.
66f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * You may obtain a copy of the License at
76f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
86f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
96f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber *
106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * Unless required by applicable law or agreed to in writing, software
116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * See the License for the specific language governing permissions and
146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber * limitations under the License.
156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber */
166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include "ALooper.h"
186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include "ASensorEventQueue.h"
196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include "ASensorManager.h"
206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define LOG_TAG "libsensorndkbridge"
226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include <android-base/logging.h>
236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include <android/looper.h>
247814f8fc474412fdf200b2eb87a507f1236a0f32Martijn Coenen#include <hidl/HidlTransportSupport.h>
256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#include <sensors/convert.h>
266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
276f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::hardware::sensors::V1_0::SensorInfo;
286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::frameworks::sensorservice::V1_0::IEventQueue;
296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::frameworks::sensorservice::V1_0::ISensorManager;
306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::frameworks::sensorservice::V1_0::Result;
316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::hardware::sensors::V1_0::SensorType;
326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::sp;
339b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yehusing android::wp;
346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::Mutex;
356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::status_t;
366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::OK;
376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::NO_INIT;
386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::BAD_VALUE;
396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::hardware::hidl_vec;
406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberusing android::hardware::Return;
416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberstatic Mutex gLock;
436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber// static
456f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager *ASensorManager::sInstance = NULL;
466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber// static
486f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager *ASensorManager::getInstance() {
496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(gLock);
506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (sInstance == NULL) {
516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        sInstance = new ASensorManager;
526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (sInstance->initCheck() != OK) {
536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            delete sInstance;
546f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            sInstance = NULL;
556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }
566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return sInstance;
586f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
609b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yehvoid ASensorManager::SensorDeathRecipient::serviceDied(
619b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh        uint64_t, const wp<::android::hidl::base::V1_0::IBase>&) {
629b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh    LOG(ERROR) << "Sensor service died. Cleanup sensor manager instance!";
639b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh    Mutex::Autolock autoLock(gLock);
649b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh    delete sInstance;
659b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh    sInstance = NULL;
669b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh}
679b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh
686f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager::ASensorManager()
696f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    : mInitCheck(NO_INIT) {
706f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    mManager = ISensorManager::getService();
716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (mManager != NULL) {
729b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh        mDeathRecipient = new SensorDeathRecipient();
739b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh        Return<bool> linked = mManager->linkToDeath(mDeathRecipient, /*cookie*/ 0);
749b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh        if (!linked.isOk()) {
759b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh            LOG(ERROR) << "Transaction error in linking to sensor service death: " <<
769b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh                    linked.description().c_str();
779b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh        } else if (!linked) {
789b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh            LOG(WARNING) << "Unable to link to sensor service death notifications";
799b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh        } else {
809b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh            LOG(DEBUG) << "Link to sensor service death notification successful";
819b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh            mInitCheck = OK;
829b8dd60f0d4cc2503266fa49b1ae74ad78051c2bYin-Chia Yeh        }
836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberstatus_t ASensorManager::initCheck() const {
876f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return mInitCheck;
886f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
896f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
906f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager::getSensorList(ASensorList *out) {
916f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorManager::getSensorList";
926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(mLock);
946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
956f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (mSensorList == NULL) {
966f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        Return<void> ret =
976f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            mManager->getSensorList([&](const auto &list, auto result) {
986f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                if (result != Result::OK) {
996f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    return;
1006f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                }
1016f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1026f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                mSensors = list;
1036f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        });
1046f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1056f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        (void)ret.isOk();
1066f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1076f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        mSensorList.reset(new ASensorRef[mSensors.size()]);
1086f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        for (size_t i = 0; i < mSensors.size(); ++i) {
1096f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            mSensorList.get()[i] =
1106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                reinterpret_cast<ASensorRef>(&mSensors[i]);
1116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }
1126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
1136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (out) {
1156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        *out = reinterpret_cast<ASensorList>(mSensorList.get());
1166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
1176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return mSensors.size();
1196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1216f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorRef ASensorManager::getDefaultSensor(int type) {
1226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    (void)getSensorList(NULL /* list */);
1236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    ASensorRef defaultSensor = NULL;
1256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Return<void> ret = mManager->getDefaultSensor(
1276f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            static_cast<SensorType>(type),
1286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            [&](const auto &sensor, auto result) {
1296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                if (result != Result::OK) {
1306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    return;
1316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                }
1326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                for (size_t i = 0; i < mSensors.size(); ++i) {
1346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    if (sensor == mSensors[i]) {
1356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                        defaultSensor =
1366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                             reinterpret_cast<ASensorRef>(&mSensors[i]);
1376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                        break;
1396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    }
1406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                }
1416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            });
1426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    (void)ret.isOk();
1446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return defaultSensor;
1466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1486f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorRef ASensorManager::getDefaultSensorEx(
1496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int /* type */, bool /* wakeup */) {
1506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    // XXX ISensorManager's getDefaultSensorEx() lacks a "wakeup" parameter.
1516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return NULL;
1526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1546f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorEventQueue *ASensorManager::createEventQueue(
1556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ALooper *looper, int ident, ALooper_callbackFunc callback, void *data) {
1566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorManager::createEventQueue";
1576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1586f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    sp<ASensorEventQueue> queue =
1596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        new ASensorEventQueue(looper, ident, callback, data);
1606f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1617814f8fc474412fdf200b2eb87a507f1236a0f32Martijn Coenen    ::android::hardware::setMinSchedulerPolicy(queue, SCHED_FIFO, 98);
1626f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Result result;
1636f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Return<void> ret =
1646f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        mManager->createEventQueue(
1656f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                queue, [&](const sp<IEventQueue> &queueImpl, auto tmpResult) {
1666f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    result = tmpResult;
1676f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    if (result != Result::OK) {
1686f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                        return;
1696f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    }
1706f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                    queue->setImpl(queueImpl);
1726f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber                });
1736f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1746f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (!ret.isOk() || result != Result::OK) {
1756f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        LOG(ERROR) << "FAILED to create event queue";
1766f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        return NULL;
1776f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
1786f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
179097a59dec99c2d88ec95330a58292eec1bed5d67Andreas Huber    queue->incStrong(NULL /* id */);
1806f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1816f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "Returning event queue " << queue.get();
1826f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue.get();
1836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ASensorManager::destroyEventQueue(ASensorEventQueue *queue) {
1866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorManager::destroyEventQueue(" << queue << ")";
1876f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1886f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    queue->invalidate();
1896f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
190097a59dec99c2d88ec95330a58292eec1bed5d67Andreas Huber    queue->decStrong(NULL /* id */);
1916f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    queue = NULL;
1926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber////////////////////////////////////////////////////////////////////////////////
1956f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
1966f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager *ASensorManager_getInstance() {
1976f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return ASensorManager::getInstance();
1986f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
1996f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2006f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorManager *ASensorManager_getInstanceForPackage(
2016f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        const char* /* packageName */) {
2026f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return ASensorManager::getInstance();
2036f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2046f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2056f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define RETURN_IF_MANAGER_IS_NULL(x)    \
2066f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    do {                                \
2076f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (manager == NULL) {          \
2086f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            return x;                   \
2096f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }                               \
2106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    } while (0)
2116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define RETURN_IF_QUEUE_IS_NULL(x)      \
2136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    do {                                \
2146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (queue == NULL) {            \
2156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            return x;                   \
2166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }                               \
2176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    } while (0)
2186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#define RETURN_IF_SENSOR_IS_NULL(x)     \
2206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    do {                                \
2216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        if (sensor == NULL) {           \
2226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            return x;                   \
2236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        }                               \
2246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    } while (0)
2256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) {
2276f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return manager->getSensorList(list);
2296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2316f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensor const* ASensorManager_getDefaultSensor(
2326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, int type) {
2336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(NULL);
2346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return manager->getDefaultSensor(type);
2366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#if 0
2396f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensor const* ASensorManager_getDefaultSensorEx(
2406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, int type, bool wakeUp) {
2416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(NULL);
2426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return manager->getDefaultSensorEx(type, wakeUp);
2446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#endif
2466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2476f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberASensorEventQueue* ASensorManager_createEventQueue(
2486f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager,
2496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ALooper* looper,
2506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int ident,
2516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ALooper_callbackFunc callback,
2526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        void* data) {
2536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(NULL);
2546f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (looper == NULL) {
2566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        return NULL;
2576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
2586f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return manager->createEventQueue(looper, ident, callback, data);
2606f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2616f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2626f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_destroyEventQueue(
2636f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, ASensorEventQueue* queue) {
2646f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2656f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
2666f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2676f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    manager->destroyEventQueue(queue);
2686f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    queue = NULL;
2696f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2706f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return OK;
2716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2726f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2736f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#if 0
2746f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_createSharedMemoryDirectChannel(
2756f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, int fd, size_t size) {
2766f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2776f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2786f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return OK;
2796f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2806f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2816f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_createHardwareBufferDirectChannel(
2826f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, AHardwareBuffer const * buffer, size_t size) {
2836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return OK;
2866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2876f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2886f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ASensorManager_destroyDirectChannel(
2896f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager, int channelId) {
2906f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2916f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
2926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorManager_configureDirectReport(
2936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorManager* manager,
2946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensor const* sensor,
2956f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int channelId,int rate) {
2966f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_MANAGER_IS_NULL(BAD_VALUE);
2976f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return OK;
2986f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
2996f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#endif
3006f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3016f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_registerSensor(
3026f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue,
3036f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensor const* sensor,
3046f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int32_t samplingPeriodUs,
3056f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int64_t maxBatchReportLatencyUs) {
3066f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorEventQueue_registerSensor";
3076f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3086f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->registerSensor(
3096f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            sensor, samplingPeriodUs, maxBatchReportLatencyUs);
3106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_enableSensor(
3136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue, ASensor const* sensor) {
3146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorEventQueue_enableSensor(queue " << queue << ")";
3156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->enableSensor(sensor);
3176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_disableSensor(
3206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue, ASensor const* sensor) {
3216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorEventQueue_disableSensor";
3226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->disableSensor(sensor);
3246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_setEventRate(
3276f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue,
3286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensor const* sensor,
3296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int32_t usec) {
3306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->setEventRate(sensor, usec);
3326f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensorEventQueue_hasEvents(ASensorEventQueue* queue) {
3356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->hasEvents();
3376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberssize_t ASensorEventQueue_getEvents(
3406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensorEventQueue* queue, ASensorEvent* events, size_t count) {
3416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ASensorEventQueue_getEvents";
3426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_QUEUE_IS_NULL(BAD_VALUE);
3436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return queue->getEvents(events, count);
3446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberconst char *ASensor_getName(ASensor const* sensor) {
3476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(NULL);
3486f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->name.c_str();
3496f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3506f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3516f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberconst char *ASensor_getVendor(ASensor const* sensor) {
3526f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(NULL);
3536f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->vendor.c_str();
3546f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3556f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3566f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getType(ASensor const* sensor) {
3576f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_TYPE_INVALID);
3586f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return static_cast<int>(
3596f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber            reinterpret_cast<const SensorInfo *>(sensor)->type);
3606f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3616f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3626f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberfloat ASensor_getResolution(ASensor const* sensor) {
3636f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_RESOLUTION_INVALID);
3646f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->resolution;
3656f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3666f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3676f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getMinDelay(ASensor const* sensor) {
3686f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_DELAY_INVALID);
3696f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->minDelay;
3706f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3716f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3726f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getFifoMaxEventCount(ASensor const* sensor) {
3736f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID);
3746f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->fifoMaxEventCount;
3756f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3766f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3776f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getFifoReservedEventCount(ASensor const* sensor) {
3786f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID);
3796f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->fifoReservedEventCount;
3806f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3816f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3826f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberconst char* ASensor_getStringType(ASensor const* sensor) {
3836f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(NULL);
3846f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->typeAsString.c_str();
3856f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3866f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
38741625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huberextern "C" float ASensor_getMaxRange(ASensor const* sensor) {
38841625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huber    RETURN_IF_SENSOR_IS_NULL(nanf(""));
38941625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huber    return reinterpret_cast<const SensorInfo *>(sensor)->maxRange;
39041625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huber}
39141625a254b3824ec0ea776695b3cd1fbb17faa30Andreas Huber
3926f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#if 0
3936f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getReportingMode(ASensor const* sensor) {
3946f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(AREPORTING_MODE_INVALID);
3956f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return 0;
3966f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
3976f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
3986f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberbool ASensor_isWakeUpSensor(ASensor const* sensor) {
3996f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(false);
4006f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return false;
4016f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4026f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4036f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberbool ASensor_isDirectChannelTypeSupported(
4046f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        ASensor const* sensor, int channelType) {
4056f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(false);
4066f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return false;
4076f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4086f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4096f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ASensor_getHighestDirectReportRateLevel(ASensor const* sensor) {
4106f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    RETURN_IF_SENSOR_IS_NULL(ASENSOR_DIRECT_RATE_STOP);
4116f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return 0;
4126f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4136f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber#endif
4146f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4156f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberstatic ALooper *getTheLooper() {
4166f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    static ALooper *sLooper = NULL;
4176f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4186f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    Mutex::Autolock autoLock(gLock);
4196f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    if (sLooper == NULL) {
4206f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        sLooper = new ALooper;
4216f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    }
4226f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4236f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return sLooper;
4246f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4256f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4266f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4276f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberALooper *ALooper_forThread() {
4286f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ALooper_forThread";
4296f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return getTheLooper();
4306f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4316f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4326f96cb345a8ebfd9fef5f32931373776a798a193Andreas HuberALooper *ALooper_prepare(int /* opts */) {
4336f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ALooper_prepare";
4346f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return getTheLooper();
4356f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4366f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4376f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huberint ALooper_pollOnce(
4386f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber        int timeoutMillis, int* outFd, int* outEvents, void** outData) {
4396f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    int res = getTheLooper()->pollOnce(timeoutMillis, outFd, outEvents, outData);
4406f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ALooper_pollOnce => " << res;
4416f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    return res;
4426f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
4436f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber
4446f96cb345a8ebfd9fef5f32931373776a798a193Andreas Hubervoid ALooper_wake(ALooper* looper) {
4456f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    LOG(VERBOSE) << "ALooper_wake";
4466f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber    looper->wake();
4476f96cb345a8ebfd9fef5f32931373776a798a193Andreas Huber}
448