/* * Copyright (C) 2016 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 ANDROID_SENSOR_SERVICE_UTIL_SENSOR_LIST_H #define ANDROID_SENSOR_SERVICE_UTIL_SENSOR_LIST_H #include "SensorInterface.h" #include "SensorServiceUtils.h" #include #include #include #include #include #include #include namespace android { class SensorInterface; namespace SensorServiceUtil { class SensorList : public Dumpable { public: struct Entry { sp si; const bool isForDebug; const bool isVirtual; Entry(SensorInterface* si_, bool debug_, bool virtual_) : si(si_), isForDebug(debug_), isVirtual(virtual_) { } }; // After SensorInterface * is added into SensorList, it can be assumed that SensorList own the // object it pointed to and the object should not be released elsewhere. bool add(int handle, SensorInterface* si, bool isForDebug = false, bool isVirtual = false); // After a handle is removed, the object that SensorInterface * pointing to may get deleted if // no more sp<> of the same object exist. bool remove(int handle); inline bool hasAnySensor() const { return mHandleMap.size() > 0;} //helper functions const Vector getUserSensors() const; const Vector getUserDebugSensors() const; const Vector getDynamicSensors() const; const Vector getVirtualSensors() const; String8 getName(int handle) const; String8 getStringType(int handle) const; sp getInterface(int handle) const; bool isNewHandle(int handle) const; // Iterate through Sensor in sensor list and perform operation f on each Sensor object. // // TF is a function with the signature: // bool f(const Sensor &); // A return value of 'false' stops the iteration immediately. // // Note: in the function f, it is illegal to make calls to member functions of the same // SensorList object on which forEachSensor is invoked. template void forEachSensor(const TF& f) const; // Iterate through Entry in sensor list and perform operation f on each Entry. // // TF is a function with the signature: // bool f(const Entry &); // A return value of 'false' stops the iteration over entries immediately. // // Note: in the function being passed in, it is illegal to make calls to member functions of the // same SensorList object on which forEachSensor is invoked. template void forEachEntry(const TF& f) const; const Sensor& getNonSensor() const { return mNonSensor;} // Dumpable interface virtual std::string dump() const override; virtual void dump(util::ProtoOutputStream* proto) const override; virtual ~SensorList(); private: const static Sensor mNonSensor; //.getName() == "unknown", template T getOne(int handle, const TF& accessor, T def = T()) const; mutable std::mutex mLock; std::map mHandleMap; std::unordered_set mUsedHandle; }; template void SensorList::forEachSensor(const TF& f) const { // lock happens in forEachEntry forEachEntry([&f] (const Entry& e) -> bool { return f(e.si->getSensor());}); } template void SensorList::forEachEntry(const TF& f) const { std::lock_guard lk(mLock); for (auto&& i : mHandleMap) { if (!f(i.second)){ break; } } } template T SensorList::getOne(int handle, const TF& accessor, T def) const { std::lock_guard lk(mLock); auto i = mHandleMap.find(handle); if (i != mHandleMap.end()) { return accessor(i->second); } else { return def; } } } // namespace SensorServiceUtil } // namespace android #endif // ANDROID_SENSOR_SERVICE_UTIL_SENSOR_LIST_H