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