• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 #ifndef ANDROID_SENSOR_SERVICE_H
18 #define ANDROID_SENSOR_SERVICE_H
19 
20 #include "SensorList.h"
21 #include "RecentEventLogger.h"
22 
23 #include <android-base/macros.h>
24 #include <binder/AppOpsManager.h>
25 #include <binder/BinderService.h>
26 #include <binder/IUidObserver.h>
27 #include <cutils/compiler.h>
28 #include <cutils/multiuser.h>
29 #include <private/android_filesystem_config.h>
30 #include <sensor/ISensorServer.h>
31 #include <sensor/ISensorEventConnection.h>
32 #include <sensor/Sensor.h>
33 #include "android/hardware/BnSensorPrivacyListener.h"
34 
35 #include <utils/AndroidThreads.h>
36 #include <utils/KeyedVector.h>
37 #include <utils/Looper.h>
38 #include <utils/SortedVector.h>
39 #include <utils/String8.h>
40 #include <utils/Vector.h>
41 #include <utils/threads.h>
42 
43 #include <stdint.h>
44 #include <sys/types.h>
45 #include <unordered_map>
46 #include <unordered_set>
47 #include <vector>
48 
49 #if __clang__
50 // Clang warns about SensorEventConnection::dump hiding BBinder::dump. The cause isn't fixable
51 // without changing the API, so let's tell clang this is indeed intentional.
52 #pragma clang diagnostic ignored "-Woverloaded-virtual"
53 #endif
54 
55 // ---------------------------------------------------------------------------
56 #define IGNORE_HARDWARE_FUSION  false
57 #define DEBUG_CONNECTIONS   false
58 // Max size is 100 KB which is enough to accept a batch of about 1000 events.
59 #define MAX_SOCKET_BUFFER_SIZE_BATCHED (100 * 1024)
60 // For older HALs which don't support batching, use a smaller socket buffer size.
61 #define SOCKET_BUFFER_SIZE_NON_BATCHED (4 * 1024)
62 
63 #define SENSOR_REGISTRATIONS_BUF_SIZE 200
64 
65 // Apps that targets S+ and do not have HIGH_SAMPLING_RATE_SENSORS permission will be capped
66 // at 200 Hz. The cap also applies to all requests when the mic toggle is flipped to on, regardless
67 // of their target SDKs and permission.
68 // Capped sampling periods for apps that have non-direct sensor connections.
69 #define SENSOR_SERVICE_CAPPED_SAMPLING_PERIOD_NS (5 * 1000 * 1000)
70 // Capped sampling rate level for apps that have direct sensor connections.
71 // The enum SENSOR_DIRECT_RATE_NORMAL corresponds to a rate value of at most 110 Hz.
72 #define SENSOR_SERVICE_CAPPED_SAMPLING_RATE_LEVEL SENSOR_DIRECT_RATE_NORMAL
73 
74 namespace android {
75 // ---------------------------------------------------------------------------
76 class SensorInterface;
77 
78 class SensorService :
79         public BinderService<SensorService>,
80         public BnSensorServer,
81         protected Thread
82 {
83     // nested class/struct for internal use
84     class SensorEventConnection;
85     class SensorDirectConnection;
86 
87 public:
88     enum UidState {
89       UID_STATE_ACTIVE = 0,
90       UID_STATE_IDLE,
91     };
92 
93     enum Mode {
94        // The regular operating mode where any application can register/unregister/call flush on
95        // sensors.
96        NORMAL = 0,
97        // This mode is only used for testing purposes. Not all HALs support this mode. In this mode,
98        // the HAL ignores the sensor data provided by physical sensors and accepts the data that is
99        // injected from the SensorService as if it were the real sensor data. This mode is primarily
100        // used for testing various algorithms like vendor provided SensorFusion, Step Counter and
101        // Step Detector etc. Typically in this mode, there will be a client (a
102        // SensorEventConnection) which will be injecting sensor data into the HAL. Normal apps can
103        // unregister and register for any sensor that supports injection. Registering to sensors
104        // that do not support injection will give an error.  TODO: Allow exactly one
105        // client to inject sensor data at a time.
106        DATA_INJECTION = 1,
107        // This mode is used only for testing sensors. Each sensor can be tested in isolation with
108        // the required sampling_rate and maxReportLatency parameters without having to think about
109        // the data rates requested by other applications. End user devices are always expected to be
110        // in NORMAL mode. When this mode is first activated, all active sensors from all connections
111        // are disabled. Calling flush() will return an error. In this mode, only the requests from
112        // selected apps whose package names are allowlisted are allowed (typically CTS apps).  Only
113        // these apps can register/unregister/call flush() on sensors. If SensorService switches to
114        // NORMAL mode again, all sensors that were previously registered to are activated with the
115        // corresponding parameters if the application hasn't unregistered for sensors in the mean
116        // time.  NOTE: Non allowlisted app whose sensors were previously deactivated may still
117        // receive events if a allowlisted app requests data from the same sensor.
118        RESTRICTED = 2
119 
120       // State Transitions supported.
121       //     RESTRICTED   <---  NORMAL   ---> DATA_INJECTION
122       //                  --->           <---
123 
124       // Shell commands to switch modes in SensorService.
125       // 1) Put SensorService in RESTRICTED mode with packageName .cts. If it is already in
126       // restricted mode it is treated as a NO_OP (and packageName is NOT changed).
127       //
128       //     $ adb shell dumpsys sensorservice restrict .cts.
129       //
130       // 2) Put SensorService in DATA_INJECTION mode with packageName .xts. If it is already in
131       // data_injection mode it is treated as a NO_OP (and packageName is NOT changed).
132       //
133       //     $ adb shell dumpsys sensorservice data_injection .xts.
134       //
135       // 3) Reset sensorservice back to NORMAL mode.
136       //     $ adb shell dumpsys sensorservice enable
137     };
138 
139     class ProximityActiveListener : public virtual RefBase {
140     public:
141         // Note that the callback is invoked from an async thread and can interact with the
142         // SensorService directly.
143         virtual void onProximityActive(bool isActive) = 0;
144     };
145 
getServiceName()146     static char const* getServiceName() ANDROID_API { return "sensorservice"; }
147     SensorService() ANDROID_API;
148 
149     void cleanupConnection(SensorEventConnection* connection);
150     void cleanupConnection(SensorDirectConnection* c);
151 
152     // Call with mLock held.
153     void checkAndReportProxStateChangeLocked();
154     void notifyProximityStateLocked(const bool isActive,
155                                     const std::vector<sp<ProximityActiveListener>>& listeners);
156 
157     status_t enable(const sp<SensorEventConnection>& connection, int handle,
158                     nsecs_t samplingPeriodNs,  nsecs_t maxBatchReportLatencyNs, int reservedFlags,
159                     const String16& opPackageName);
160 
161     status_t disable(const sp<SensorEventConnection>& connection, int handle);
162 
163     status_t setEventRate(const sp<SensorEventConnection>& connection, int handle, nsecs_t ns,
164                           const String16& opPackageName);
165 
166     status_t flushSensor(const sp<SensorEventConnection>& connection,
167                          const String16& opPackageName);
168 
169     status_t addProximityActiveListener(const sp<ProximityActiveListener>& callback) ANDROID_API;
170     status_t removeProximityActiveListener(const sp<ProximityActiveListener>& callback) ANDROID_API;
171 
172     // Returns true if a sensor should be throttled according to our rate-throttling rules.
173     static bool isSensorInCappedSet(int sensorType);
174 
175     virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args);
176 
177 private:
178     friend class BinderService<SensorService>;
179 
180     // nested class/struct for internal use
181     class ConnectionSafeAutolock;
182     class SensorConnectionHolder;
183     class SensorEventAckReceiver;
184     class SensorRecord;
185     class SensorRegistrationInfo;
186 
187     // Promoting a SensorEventConnection or SensorDirectConnection from wp to sp must be done with
188     // mLock held, but destroying that sp must be done unlocked to avoid a race condition that
189     // causes a deadlock (remote dies while we hold a local sp, then our decStrong() call invokes
190     // the dtor -> cleanupConnection() tries to re-lock the mutex). This class ensures safe usage
191     // by wrapping a Mutex::Autolock on SensorService's mLock, plus vectors that hold promoted sp<>
192     // references until the lock is released, when they are safely destroyed.
193     // All read accesses to the connection lists in mConnectionHolder must be done via this class.
194     class ConnectionSafeAutolock final {
195     public:
196         // Returns a list of non-null promoted connection references
197         const std::vector<sp<SensorEventConnection>>& getActiveConnections();
198         const std::vector<sp<SensorDirectConnection>>& getDirectConnections();
199 
200     private:
201         // Constructed via SensorConnectionHolder::lock()
202         friend class SensorConnectionHolder;
203         explicit ConnectionSafeAutolock(SensorConnectionHolder& holder, Mutex& mutex);
204         DISALLOW_IMPLICIT_CONSTRUCTORS(ConnectionSafeAutolock);
205 
206         // NOTE: Order of these members is important, as the destructor for non-static members
207         // get invoked in the reverse order of their declaration. Here we are relying on the
208         // Autolock to be destroyed *before* the vectors, so the sp<> objects are destroyed without
209         // the lock held, which avoids the deadlock.
210         SensorConnectionHolder& mConnectionHolder;
211         std::vector<std::vector<sp<SensorEventConnection>>> mReferencedActiveConnections;
212         std::vector<std::vector<sp<SensorDirectConnection>>> mReferencedDirectConnections;
213         Mutex::Autolock mAutolock;
214 
215         template<typename ConnectionType>
216         const std::vector<sp<ConnectionType>>& getConnectionsHelper(
217                 const SortedVector<wp<ConnectionType>>& connectionList,
218                 std::vector<std::vector<sp<ConnectionType>>>* referenceHolder);
219     };
220 
221     // Encapsulates the collection of active SensorEventConection and SensorDirectConnection
222     // references. Write access is done through this class with mLock held, but all read access
223     // must be routed through ConnectionSafeAutolock.
224     class SensorConnectionHolder {
225     public:
226         void addEventConnectionIfNotPresent(const sp<SensorEventConnection>& connection);
227         void removeEventConnection(const wp<SensorEventConnection>& connection);
228 
229         void addDirectConnection(const sp<SensorDirectConnection>& connection);
230         void removeDirectConnection(const wp<SensorDirectConnection>& connection);
231 
232         // Pass in the mutex that protects this connection holder; acquires the lock and returns an
233         // object that can be used to safely read the lists of connections
234         ConnectionSafeAutolock lock(Mutex& mutex);
235 
236     private:
237         friend class ConnectionSafeAutolock;
238         SortedVector< wp<SensorEventConnection> > mActiveConnections;
239         SortedVector< wp<SensorDirectConnection> > mDirectConnections;
240     };
241 
242     // If accessing a sensor we need to make sure the UID has access to it. If
243     // the app UID is idle then it cannot access sensors and gets no trigger
244     // events, no on-change events, flush event behavior does not change, and
245     // recurring events are the same as the first one delivered in idle state
246     // emulating no sensor change. As soon as the app UID transitions to an
247     // active state we will start reporting events as usual and vise versa. This
248     // approach transparently handles observing sensors while the app UID transitions
249     // between idle/active state avoiding to get stuck in a state receiving sensor
250     // data while idle or not receiving sensor data while active.
251     class UidPolicy : public BnUidObserver {
252         public:
UidPolicy(wp<SensorService> service)253             explicit UidPolicy(wp<SensorService> service)
254                     : mService(service) {}
255             void registerSelf();
256             void unregisterSelf();
257 
258             bool isUidActive(uid_t uid);
259 
260             void onUidGone(uid_t uid, bool disabled) override;
261             void onUidActive(uid_t uid) override;
262             void onUidIdle(uid_t uid, bool disabled) override;
onUidStateChanged(uid_t uid __unused,int32_t procState __unused,int64_t procStateSeq __unused,int32_t capability __unused)263             void onUidStateChanged(uid_t uid __unused, int32_t procState __unused,
264                                    int64_t procStateSeq __unused,
265                                    int32_t capability __unused) override {}
onUidProcAdjChanged(uid_t uid __unused)266             void onUidProcAdjChanged(uid_t uid __unused) override {}
267 
268             void addOverrideUid(uid_t uid, bool active);
269             void removeOverrideUid(uid_t uid);
270         private:
271             bool isUidActiveLocked(uid_t uid);
272             void updateOverrideUid(uid_t uid, bool active, bool insert);
273 
274             Mutex mUidLock;
275             wp<SensorService> mService;
276             std::unordered_set<uid_t> mActiveUids;
277             std::unordered_map<uid_t, bool> mOverrideUids;
278     };
279 
280     bool isUidActive(uid_t uid);
281 
282     // Sensor privacy allows a user to disable access to all sensors on the device. When
283     // enabled sensor privacy will prevent all apps, including active apps, from accessing
284     // sensors, they will not receive trigger nor on-change events, flush event behavior
285     // does not change, and recurring events are the same as the first one delivered when
286     // sensor privacy was enabled. All sensor direct connections will be stopped as well
287     // and new direct connections will not be allowed while sensor privacy is enabled.
288     // Once sensor privacy is disabled access to sensors will be restored for active
289     // apps, previously stopped direct connections will be restarted, and new direct
290     // connections will be allowed again.
291     class SensorPrivacyPolicy : public hardware::BnSensorPrivacyListener {
292         public:
SensorPrivacyPolicy(wp<SensorService> service)293             explicit SensorPrivacyPolicy(wp<SensorService> service)
294                     : mService(service) {}
295             void registerSelf();
296             void unregisterSelf();
297 
298             bool isSensorPrivacyEnabled();
299 
300             binder::Status onSensorPrivacyChanged(int toggleType, int sensor,
301                                                   bool enabled);
302 
303         protected:
304             std::atomic_bool mSensorPrivacyEnabled;
305             wp<SensorService> mService;
306 
307         private:
308             Mutex mSensorPrivacyLock;
309     };
310 
311     class MicrophonePrivacyPolicy : public SensorPrivacyPolicy {
312         public:
MicrophonePrivacyPolicy(wp<SensorService> service)313             explicit MicrophonePrivacyPolicy(wp<SensorService> service)
314                     : SensorPrivacyPolicy(service) {}
315             void registerSelf();
316             void unregisterSelf();
317 
318             binder::Status onSensorPrivacyChanged(int toggleType, int sensor,
319                                                   bool enabled);
320     };
321 
322     // A class automatically clearing and restoring binder caller identity inside
323     // a code block (scoped variable).
324     // Declare one systematically before calling SensorPrivacyManager methods so that they are
325     // executed with the same level of privilege as the SensorService process.
326     class AutoCallerClear {
327         public:
AutoCallerClear()328             AutoCallerClear() :
329                 mToken(IPCThreadState::self()->clearCallingIdentity()) {}
~AutoCallerClear()330             ~AutoCallerClear() {
331                 IPCThreadState::self()->restoreCallingIdentity(mToken);
332             }
333 
334         private:
335             const int64_t mToken;
336     };
337 
338     static const char* WAKE_LOCK_NAME;
339     virtual ~SensorService();
340 
341     virtual void onFirstRef();
342 
343     // Thread interface
344     virtual bool threadLoop();
345 
346     // ISensorServer interface
347     virtual Vector<Sensor> getSensorList(const String16& opPackageName);
348     virtual Vector<Sensor> getDynamicSensorList(const String16& opPackageName);
349     virtual sp<ISensorEventConnection> createSensorEventConnection(
350             const String8& packageName,
351             int requestedMode, const String16& opPackageName, const String16& attributionTag);
352     virtual int isDataInjectionEnabled();
353     virtual sp<ISensorEventConnection> createSensorDirectConnection(const String16& opPackageName,
354             uint32_t size, int32_t type, int32_t format, const native_handle *resource);
355     virtual int setOperationParameter(
356             int32_t handle, int32_t type, const Vector<float> &floats, const Vector<int32_t> &ints);
357     virtual status_t dump(int fd, const Vector<String16>& args);
358 
359     status_t dumpProtoLocked(int fd, ConnectionSafeAutolock* connLock) const;
360     String8 getSensorName(int handle) const;
361     String8 getSensorStringType(int handle) const;
362     bool isVirtualSensor(int handle) const;
363     sp<SensorInterface> getSensorInterfaceFromHandle(int handle) const;
364     bool isWakeUpSensor(int type) const;
365     void recordLastValueLocked(sensors_event_t const* buffer, size_t count);
366     static void sortEventBuffer(sensors_event_t* buffer, size_t count);
367     const Sensor& registerSensor(SensorInterface* sensor,
368                                  bool isDebug = false, bool isVirtual = false);
369     const Sensor& registerVirtualSensor(SensorInterface* sensor, bool isDebug = false);
370     const Sensor& registerDynamicSensorLocked(SensorInterface* sensor, bool isDebug = false);
371     bool unregisterDynamicSensorLocked(int handle);
372     status_t cleanupWithoutDisable(const sp<SensorEventConnection>& connection, int handle);
373     status_t cleanupWithoutDisableLocked(const sp<SensorEventConnection>& connection, int handle);
374     void cleanupAutoDisabledSensorLocked(const sp<SensorEventConnection>& connection,
375             sensors_event_t const* buffer, const int count);
376     bool canAccessSensor(const Sensor& sensor, const char* operation,
377             const String16& opPackageName);
378     static bool hasPermissionForSensor(const Sensor& sensor);
379     static int getTargetSdkVersion(const String16& opPackageName);
380     static void resetTargetSdkVersionCache(const String16& opPackageName);
381     // SensorService acquires a partial wakelock for delivering events from wake up sensors. This
382     // method checks whether all the events from these wake up sensors have been delivered to the
383     // corresponding applications, if yes the wakelock is released.
384     void checkWakeLockState();
385     void checkWakeLockStateLocked(ConnectionSafeAutolock* connLock);
386     bool isWakeLockAcquired();
387     bool isWakeUpSensorEvent(const sensors_event_t& event) const;
388 
389     sp<Looper> getLooper() const;
390 
391     // Reset mWakeLockRefCounts for all SensorEventConnections to zero. This may happen if
392     // SensorService did not receive any acknowledgements from apps which have registered for
393     // wake_up sensors.
394     void resetAllWakeLockRefCounts();
395 
396     // Acquire or release wake_lock. If wake_lock is acquired, set the timeout in the looper to 5
397     // seconds and wake the looper.
398     void setWakeLockAcquiredLocked(bool acquire);
399 
400     // Send events from the event cache for this particular connection.
401     void sendEventsFromCache(const sp<SensorEventConnection>& connection);
402 
403     // If SensorService is operating in RESTRICTED mode, only select whitelisted packages are
404     // allowed to register for or call flush on sensors. Typically only cts test packages are
405     // allowed.
406     bool isWhiteListedPackage(const String8& packageName);
407 
408     // Returns true if a connection with the specified opPackageName has no access to sensors
409     // in the RESTRICTED mode (i.e. the service is in RESTRICTED mode, and the package is not
410     // whitelisted). mLock must be held to invoke this method.
411     bool isOperationRestrictedLocked(const String16& opPackageName);
412 
413     status_t adjustSamplingPeriodBasedOnMicAndPermission(nsecs_t* requestedPeriodNs,
414                                                     const String16& opPackageName);
415     status_t adjustRateLevelBasedOnMicAndPermission(int* requestedRateLevel,
416                                               const String16& opPackageName);
417     bool isRateCappedBasedOnPermission(const String16& opPackageName);
418     bool isPackageDebuggable(const String16& opPackageName);
419 
420     // Reset the state of SensorService to NORMAL mode.
421     status_t resetToNormalMode();
422     status_t resetToNormalModeLocked();
423 
424     // Transforms the UUIDs for all the sensors into proper IDs.
425     void makeUuidsIntoIdsForSensorList(Vector<Sensor> &sensorList) const;
426     // Gets the appropriate ID from the given UUID.
427     int32_t getIdFromUuid(const Sensor::uuid_t &uuid) const;
428     // Either read from storage or create a new one.
429     static bool initializeHmacKey();
430 
431     // Enable SCHED_FIFO priority for thread
432     void enableSchedFifoMode();
433 
434     // Sets whether the given UID can get sensor data
435     void onUidStateChanged(uid_t uid, UidState state);
436 
437     // Returns true if a connection with the given uid and opPackageName
438     // currently has access to sensors.
439     bool hasSensorAccess(uid_t uid, const String16& opPackageName);
440     // Same as hasSensorAccess but with mLock held.
441     bool hasSensorAccessLocked(uid_t uid, const String16& opPackageName);
442 
443     // Overrides the UID state as if it is idle
444     status_t handleSetUidState(Vector<String16>& args, int err);
445     // Clears the override for the UID state
446     status_t handleResetUidState(Vector<String16>& args, int err);
447     // Gets the UID state
448     status_t handleGetUidState(Vector<String16>& args, int out, int err);
449     // Prints the shell command help
450     status_t printHelp(int out);
451 
452     // temporarily stops all active direct connections and disables all sensors
453     void disableAllSensors();
454     void disableAllSensorsLocked(ConnectionSafeAutolock* connLock);
455     // restarts the previously stopped direct connections and enables all sensors
456     void enableAllSensors();
457     void enableAllSensorsLocked(ConnectionSafeAutolock* connLock);
458 
459     // Caps active direct connections (when the mic toggle is flipped to on)
460     void capRates();
461     // Removes the capped rate on active direct connections (when the mic toggle is flipped to off)
462     void uncapRates();
463 
isAudioServerOrSystemServerUid(uid_t uid)464     static inline bool isAudioServerOrSystemServerUid(uid_t uid) {
465         return multiuser_get_app_id(uid) == AID_SYSTEM || uid == AID_AUDIOSERVER;
466     }
467 
468     static uint8_t sHmacGlobalKey[128];
469     static bool sHmacGlobalKeyIsValid;
470 
471     static std::atomic_uint64_t curProxCallbackSeq;
472     static std::atomic_uint64_t completedCallbackSeq;
473 
474     SensorServiceUtil::SensorList mSensors;
475     status_t mInitCheck;
476 
477     // Socket buffersize used to initialize BitTube. This size depends on whether batching is
478     // supported or not.
479     uint32_t mSocketBufferSize;
480     sp<Looper> mLooper;
481     sp<SensorEventAckReceiver> mAckReceiver;
482 
483     // protected by mLock
484     mutable Mutex mLock;
485     DefaultKeyedVector<int, SensorRecord*> mActiveSensors;
486     std::unordered_set<int> mActiveVirtualSensors;
487     SensorConnectionHolder mConnectionHolder;
488     bool mWakeLockAcquired;
489     sensors_event_t *mSensorEventBuffer, *mSensorEventScratch;
490     // WARNING: these SensorEventConnection instances must not be promoted to sp, except via
491     // modification to add support for them in ConnectionSafeAutolock
492     wp<const SensorEventConnection> * mMapFlushEventsToConnections;
493     std::unordered_map<int, SensorServiceUtil::RecentEventLogger*> mRecentEvent;
494     Mode mCurrentOperatingMode;
495 
496     // true if the head tracker sensor type is currently restricted to system usage only
497     // (can only be unrestricted for testing, via shell cmd)
498     bool mHtRestricted = true;
499 
500     // This packagaName is set when SensorService is in RESTRICTED or DATA_INJECTION mode. Only
501     // applications with this packageName are allowed to activate/deactivate or call flush on
502     // sensors. To run CTS this is can be set to ".cts." and only CTS tests will get access to
503     // sensors.
504     String8 mWhiteListedPackage;
505 
506     int mNextSensorRegIndex;
507     Vector<SensorRegistrationInfo> mLastNSensorRegistrations;
508 
509     sp<UidPolicy> mUidPolicy;
510     sp<SensorPrivacyPolicy> mSensorPrivacyPolicy;
511 
512     static AppOpsManager sAppOpsManager;
513     static std::map<String16, int> sPackageTargetVersion;
514     static Mutex sPackageTargetVersionLock;
515     static String16 sSensorInterfaceDescriptorPrefix;
516 
517     sp<MicrophonePrivacyPolicy> mMicSensorPrivacyPolicy;
518 
519     // Keeps track of the handles of all proximity sensors in the system.
520     std::vector<int32_t> mProxSensorHandles;
521     // The last proximity sensor active state reported to listeners.
522     bool mLastReportedProxIsActive;
523     // Listeners subscribed to receive updates on the proximity sensor active state.
524     std::vector<sp<ProximityActiveListener>> mProximityActiveListeners;
525 };
526 
527 } // namespace android
528 #endif // ANDROID_SENSOR_SERVICE_H
529