xref: /aosp_15_r20/frameworks/native/libs/sensor/Sensor.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
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 #include <sensor/Sensor.h>
18 
19 #include <inttypes.h>
20 
21 #include <binder/AppOpsManager.h>
22 #include <binder/IPermissionController.h>
23 #include <binder/IServiceManager.h>
24 #include <android_permission_flags.h>
25 
26 /*
27  * The permission to use for activity recognition sensors (like step counter).
28  * See sensor types for more details on what sensors should require this
29  * permission.
30  */
31 #define SENSOR_PERMISSION_ACTIVITY_RECOGNITION "android.permission.ACTIVITY_RECOGNITION"
32 
33 // ----------------------------------------------------------------------------
34 namespace android {
35 // ----------------------------------------------------------------------------
36 
Sensor(const char * name)37 Sensor::Sensor(const char * name) :
38         mName(name), mHandle(0), mType(0),
39         mMinValue(0), mMaxValue(0), mResolution(0),
40         mPower(0), mMinDelay(0), mVersion(0), mFifoReservedEventCount(0),
41         mFifoMaxEventCount(0), mRequiredAppOp(-1),
42         mMaxDelay(0), mFlags(0) {
43 }
44 
Sensor(struct sensor_t const * hwSensor,int halVersion)45 Sensor::Sensor(struct sensor_t const* hwSensor, int halVersion) :
46         Sensor(*hwSensor, uuid_t(), halVersion) {
47 }
48 
Sensor(struct sensor_t const & hwSensor,const uuid_t & uuid,int halVersion)49 Sensor::Sensor(struct sensor_t const& hwSensor, const uuid_t& uuid, int halVersion) :
50         Sensor("") {
51     mName = hwSensor.name;
52     mVendor = hwSensor.vendor;
53     mVersion = hwSensor.version;
54     mHandle = hwSensor.handle;
55     mType = hwSensor.type;
56     mMinValue = 0;                      // FIXME: minValue
57     mMaxValue = hwSensor.maxRange;      // FIXME: maxValue
58     mResolution = hwSensor.resolution;
59     mPower = hwSensor.power;
60     mMinDelay = hwSensor.minDelay;
61     mFlags = 0;
62     mUuid = uuid;
63 
64     // Set fifo event count zero for older devices which do not support batching. Fused
65     // sensors also have their fifo counts set to zero.
66     if (halVersion > SENSORS_DEVICE_API_VERSION_1_0) {
67         mFifoReservedEventCount = hwSensor.fifoReservedEventCount;
68         mFifoMaxEventCount = hwSensor.fifoMaxEventCount;
69     } else {
70         mFifoReservedEventCount = 0;
71         mFifoMaxEventCount = 0;
72     }
73 
74     if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) {
75         if (hwSensor.maxDelay > INT_MAX) {
76             // Max delay is declared as a 64 bit integer for 64 bit architectures. But it should
77             // always fit in a 32 bit integer, log error and cap it to INT_MAX.
78             ALOGE("Sensor maxDelay overflow error %s %" PRId64, mName.c_str(),
79                   static_cast<int64_t>(hwSensor.maxDelay));
80             mMaxDelay = INT_MAX;
81         } else {
82             mMaxDelay = static_cast<int32_t>(hwSensor.maxDelay);
83         }
84     } else {
85         // For older hals set maxDelay to 0.
86         mMaxDelay = 0;
87     }
88 
89     // Ensure existing sensors have correct string type, required permissions and reporting mode.
90     // Set reportingMode for all android defined sensor types, set wake-up flag only for proximity
91     // sensor, significant motion, tilt, pick_up gesture, wake gesture and glance gesture on older
92     // HALs. Newer HALs can define both wake-up and non wake-up proximity sensors.
93     // All the OEM defined defined sensors have flags set to whatever is provided by the HAL.
94     switch (mType) {
95     case SENSOR_TYPE_ACCELEROMETER:
96         mStringType = SENSOR_STRING_TYPE_ACCELEROMETER;
97         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
98         break;
99     case SENSOR_TYPE_AMBIENT_TEMPERATURE:
100         mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE;
101         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
102         break;
103     case SENSOR_TYPE_GAME_ROTATION_VECTOR:
104         mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR;
105         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
106         break;
107     case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR:
108         mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR;
109         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
110         break;
111     case SENSOR_TYPE_GRAVITY:
112         mStringType = SENSOR_STRING_TYPE_GRAVITY;
113         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
114         break;
115     case SENSOR_TYPE_GYROSCOPE:
116         mStringType = SENSOR_STRING_TYPE_GYROSCOPE;
117         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
118         break;
119     case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED:
120         mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED;
121         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
122         break;
123     case SENSOR_TYPE_HEART_RATE: {
124         mStringType = SENSOR_STRING_TYPE_HEART_RATE;
125         mRequiredPermission =
126           android::permission::flags::replace_body_sensor_permission_enabled() ?
127             SENSOR_PERMISSION_READ_HEART_RATE : SENSOR_PERMISSION_BODY_SENSORS;
128         AppOpsManager appOps;
129         mRequiredAppOp = appOps.permissionToOpCode(String16(mRequiredPermission));
130         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
131         } break;
132     case SENSOR_TYPE_LIGHT:
133         mStringType = SENSOR_STRING_TYPE_LIGHT;
134         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
135         break;
136     case SENSOR_TYPE_LINEAR_ACCELERATION:
137         mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION;
138         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
139         break;
140     case SENSOR_TYPE_MAGNETIC_FIELD:
141         mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD;
142         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
143         break;
144     case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED:
145         mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED;
146         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
147         break;
148     case SENSOR_TYPE_ORIENTATION:
149         mStringType = SENSOR_STRING_TYPE_ORIENTATION;
150         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
151         break;
152     case SENSOR_TYPE_PRESSURE:
153         mStringType = SENSOR_STRING_TYPE_PRESSURE;
154         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
155         break;
156     case SENSOR_TYPE_PROXIMITY:
157         mStringType = SENSOR_STRING_TYPE_PROXIMITY;
158         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
159         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
160             mFlags |= SENSOR_FLAG_WAKE_UP;
161         }
162         break;
163     case SENSOR_TYPE_RELATIVE_HUMIDITY:
164         mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY;
165         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
166         break;
167     case SENSOR_TYPE_ROTATION_VECTOR:
168         mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR;
169         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
170         break;
171     case SENSOR_TYPE_SIGNIFICANT_MOTION:
172         mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION;
173         mFlags |= SENSOR_FLAG_ONE_SHOT_MODE;
174         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
175             mFlags |= SENSOR_FLAG_WAKE_UP;
176         }
177         break;
178     case SENSOR_TYPE_STEP_COUNTER: {
179         mStringType = SENSOR_STRING_TYPE_STEP_COUNTER;
180         mRequiredPermission = SENSOR_PERMISSION_ACTIVITY_RECOGNITION;
181         AppOpsManager appOps;
182         mRequiredAppOp =
183                 appOps.permissionToOpCode(String16(mRequiredPermission));
184         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
185         } break;
186     case SENSOR_TYPE_STEP_DETECTOR: {
187         mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR;
188         mRequiredPermission = SENSOR_PERMISSION_ACTIVITY_RECOGNITION;
189         AppOpsManager appOps;
190         mRequiredAppOp =
191                 appOps.permissionToOpCode(String16(mRequiredPermission));
192         mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE;
193         } break;
194     case SENSOR_TYPE_TEMPERATURE:
195         mStringType = SENSOR_STRING_TYPE_TEMPERATURE;
196         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
197         break;
198     case SENSOR_TYPE_TILT_DETECTOR:
199         mStringType = SENSOR_STRING_TYPE_TILT_DETECTOR;
200         mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE;
201         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
202             mFlags |= SENSOR_FLAG_WAKE_UP;
203         }
204         break;
205     case SENSOR_TYPE_WAKE_GESTURE:
206         mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE;
207         mFlags |= SENSOR_FLAG_ONE_SHOT_MODE;
208         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
209             mFlags |= SENSOR_FLAG_WAKE_UP;
210         }
211         break;
212     case SENSOR_TYPE_GLANCE_GESTURE:
213         mStringType = SENSOR_STRING_TYPE_GLANCE_GESTURE;
214         mFlags |= SENSOR_FLAG_ONE_SHOT_MODE;
215         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
216             mFlags |= SENSOR_FLAG_WAKE_UP;
217         }
218         break;
219     case SENSOR_TYPE_PICK_UP_GESTURE:
220         mStringType = SENSOR_STRING_TYPE_PICK_UP_GESTURE;
221         mFlags |= SENSOR_FLAG_ONE_SHOT_MODE;
222         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
223             mFlags |= SENSOR_FLAG_WAKE_UP;
224         }
225         break;
226     case SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT:
227         mStringType = SENSOR_STRING_TYPE_LOW_LATENCY_OFFBODY_DETECT;
228         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
229         break;
230     case SENSOR_TYPE_WRIST_TILT_GESTURE:
231         mStringType = SENSOR_STRING_TYPE_WRIST_TILT_GESTURE;
232         mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE;
233         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
234             mFlags |= SENSOR_FLAG_WAKE_UP;
235         }
236         break;
237     case SENSOR_TYPE_DEVICE_ORIENTATION:
238         mStringType = SENSOR_STRING_TYPE_DEVICE_ORIENTATION;
239         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
240         break;
241     case SENSOR_TYPE_DYNAMIC_SENSOR_META:
242         mStringType = SENSOR_STRING_TYPE_DYNAMIC_SENSOR_META;
243         mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; // special trigger
244         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
245             mFlags |= SENSOR_FLAG_WAKE_UP;
246         }
247         break;
248     case SENSOR_TYPE_POSE_6DOF:
249         mStringType = SENSOR_STRING_TYPE_POSE_6DOF;
250         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
251         break;
252     case SENSOR_TYPE_STATIONARY_DETECT:
253         mStringType = SENSOR_STRING_TYPE_STATIONARY_DETECT;
254         mFlags |= SENSOR_FLAG_ONE_SHOT_MODE;
255         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
256             mFlags |= SENSOR_FLAG_WAKE_UP;
257         }
258         break;
259     case SENSOR_TYPE_MOTION_DETECT:
260         mStringType = SENSOR_STRING_TYPE_MOTION_DETECT;
261         mFlags |= SENSOR_FLAG_ONE_SHOT_MODE;
262         if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) {
263             mFlags |= SENSOR_FLAG_WAKE_UP;
264         }
265         break;
266     case SENSOR_TYPE_HEART_BEAT:
267         mStringType = SENSOR_STRING_TYPE_HEART_BEAT;
268         mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE;
269         break;
270     case SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED:
271         mStringType = SENSOR_STRING_TYPE_ACCELEROMETER_UNCALIBRATED;
272         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
273         break;
274     case SENSOR_TYPE_HINGE_ANGLE:
275         mStringType = SENSOR_STRING_TYPE_HINGE_ANGLE;
276         mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
277         break;
278     case SENSOR_TYPE_HEAD_TRACKER:
279         mStringType = SENSOR_STRING_TYPE_HEAD_TRACKER;
280         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
281         break;
282     case SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES:
283         mStringType = SENSOR_STRING_TYPE_ACCELEROMETER_LIMITED_AXES;
284         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
285         break;
286     case SENSOR_TYPE_GYROSCOPE_LIMITED_AXES:
287         mStringType = SENSOR_STRING_TYPE_GYROSCOPE_LIMITED_AXES;
288         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
289         break;
290     case SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED:
291         mStringType = SENSOR_STRING_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED;
292         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
293         break;
294     case SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED:
295         mStringType = SENSOR_STRING_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED;
296         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
297         break;
298     case SENSOR_TYPE_HEADING:
299         mStringType = SENSOR_STRING_TYPE_HEADING;
300         mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
301         break;
302     default:
303         // Only pipe the stringType, requiredPermission and flags for custom sensors.
304         if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor.stringType) {
305             mStringType = hwSensor.stringType;
306         }
307         if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor.requiredPermission) {
308             mRequiredPermission = hwSensor.requiredPermission;
309             bool requiresBodySensorPermission =
310                     !strcmp(mRequiredPermission, SENSOR_PERMISSION_BODY_SENSORS);
311             if (android::permission::flags::replace_body_sensor_permission_enabled()) {
312                 if (requiresBodySensorPermission) {
313                   ALOGE("Sensor %s using deprecated Body Sensor permission", mName.c_str());
314                 }
315 
316                 AppOpsManager appOps;
317                 // Lookup to see if an AppOp exists for the permission. If none
318                 // does, the default value of -1 is used.
319                 mRequiredAppOp = appOps.permissionToOpCode(String16(mRequiredPermission));
320             } else if (requiresBodySensorPermission) {
321                 AppOpsManager appOps;
322                 mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS));
323             }
324         }
325 
326         if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) {
327             mFlags = static_cast<uint32_t>(hwSensor.flags);
328         } else {
329             // This is an OEM defined sensor on an older HAL. Use minDelay to determine the
330             // reporting mode of the sensor.
331             if (mMinDelay > 0) {
332                 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE;
333             } else if (mMinDelay == 0) {
334                 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
335             } else if (mMinDelay < 0) {
336                 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE;
337             }
338         }
339         break;
340     }
341 
342     if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) {
343         // Wake-up flag of HAL 1.3 and above is set here
344         mFlags |= (hwSensor.flags & SENSOR_FLAG_WAKE_UP);
345 
346         // Log error if the reporting mode is not as expected, but respect HAL setting.
347         int actualReportingMode = (hwSensor.flags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT;
348         int expectedReportingMode = (mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT;
349         if (actualReportingMode != expectedReportingMode) {
350             ALOGE("Reporting Mode incorrect: sensor %s handle=%#010" PRIx32 " type=%" PRId32 " "
351                    "actual=%d expected=%d",
352                    mName.c_str(), mHandle, mType, actualReportingMode, expectedReportingMode);
353         }
354     }
355 
356     // Feature flags
357     // Set DYNAMIC_SENSOR_MASK and ADDITIONAL_INFO_MASK flag here. Compatible with HAL 1_3.
358     if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) {
359         mFlags |= hwSensor.flags & (DYNAMIC_SENSOR_MASK | ADDITIONAL_INFO_MASK);
360     }
361     // Set DIRECT_REPORT_MASK and DIRECT_CHANNEL_MASK flags. Compatible with HAL 1_3.
362     if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) {
363         // only on continuous sensors direct report mode is defined
364         if ((mFlags & REPORTING_MODE_MASK) == SENSOR_FLAG_CONTINUOUS_MODE) {
365             mFlags |= hwSensor.flags
366                 & (SENSOR_FLAG_MASK_DIRECT_REPORT | SENSOR_FLAG_MASK_DIRECT_CHANNEL);
367         }
368     }
369     // Set DATA_INJECTION flag here. Defined in HAL 1_4.
370     if (halVersion >= SENSORS_DEVICE_API_VERSION_1_4) {
371         mFlags |= (hwSensor.flags & DATA_INJECTION_MASK);
372     }
373 
374     if (mRequiredPermission.length() > 0) {
375         // If the sensor is protected by a permission we need to know if it is
376         // a runtime one to determine whether we can use the permission cache.
377         sp<IBinder> binder = defaultServiceManager()->getService(String16("permission"));
378         if (binder != nullptr) {
379             sp<IPermissionController> permCtrl = interface_cast<IPermissionController>(binder);
380             mRequiredPermissionRuntime = permCtrl->isRuntimePermission(
381                     String16(mRequiredPermission));
382         }
383     }
384 }
385 
~Sensor()386 Sensor::~Sensor() {
387 }
388 
getName() const389 const String8& Sensor::getName() const {
390     return mName;
391 }
392 
getVendor() const393 const String8& Sensor::getVendor() const {
394     return mVendor;
395 }
396 
getHandle() const397 int32_t Sensor::getHandle() const {
398     return mHandle;
399 }
400 
getType() const401 int32_t Sensor::getType() const {
402     return mType;
403 }
404 
getMinValue() const405 float Sensor::getMinValue() const {
406     return mMinValue;
407 }
408 
getMaxValue() const409 float Sensor::getMaxValue() const {
410     return mMaxValue;
411 }
412 
getResolution() const413 float Sensor::getResolution() const {
414     return mResolution;
415 }
416 
getPowerUsage() const417 float Sensor::getPowerUsage() const {
418     return mPower;
419 }
420 
getMinDelay() const421 int32_t Sensor::getMinDelay() const {
422     return mMinDelay;
423 }
424 
getMinDelayNs() const425 nsecs_t Sensor::getMinDelayNs() const {
426     return getMinDelay() * 1000;
427 }
428 
getVersion() const429 int32_t Sensor::getVersion() const {
430     return mVersion;
431 }
432 
getFifoReservedEventCount() const433 uint32_t Sensor::getFifoReservedEventCount() const {
434     return mFifoReservedEventCount;
435 }
436 
getFifoMaxEventCount() const437 uint32_t Sensor::getFifoMaxEventCount() const {
438     return mFifoMaxEventCount;
439 }
440 
getStringType() const441 const String8& Sensor::getStringType() const {
442     return mStringType;
443 }
444 
getRequiredPermission() const445 const String8& Sensor::getRequiredPermission() const {
446     return mRequiredPermission;
447 }
448 
isRequiredPermissionRuntime() const449 bool Sensor::isRequiredPermissionRuntime() const {
450     return mRequiredPermissionRuntime;
451 }
452 
getRequiredAppOp() const453 int32_t Sensor::getRequiredAppOp() const {
454     return mRequiredAppOp;
455 }
456 
getMaxDelay() const457 int32_t Sensor::getMaxDelay() const {
458     return mMaxDelay;
459 }
460 
getFlags() const461 uint32_t Sensor::getFlags() const {
462     return mFlags;
463 }
464 
isWakeUpSensor() const465 bool Sensor::isWakeUpSensor() const {
466     return (mFlags & SENSOR_FLAG_WAKE_UP) != 0;
467 }
468 
isDynamicSensor() const469 bool Sensor::isDynamicSensor() const {
470     return (mFlags & SENSOR_FLAG_DYNAMIC_SENSOR) != 0;
471 }
472 
isDataInjectionSupported() const473 bool Sensor::isDataInjectionSupported() const {
474     return (mFlags & SENSOR_FLAG_DATA_INJECTION) != 0;
475 }
476 
hasAdditionalInfo() const477 bool Sensor::hasAdditionalInfo() const {
478     return (mFlags & SENSOR_FLAG_ADDITIONAL_INFO) != 0;
479 }
480 
getHighestDirectReportRateLevel() const481 int32_t Sensor::getHighestDirectReportRateLevel() const {
482     return ((mFlags & SENSOR_FLAG_MASK_DIRECT_REPORT) >> SENSOR_FLAG_SHIFT_DIRECT_REPORT);
483 }
484 
isDirectChannelTypeSupported(int32_t sharedMemType) const485 bool Sensor::isDirectChannelTypeSupported(int32_t sharedMemType) const {
486     switch (sharedMemType) {
487         case SENSOR_DIRECT_MEM_TYPE_ASHMEM:
488             return mFlags & SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM;
489         case SENSOR_DIRECT_MEM_TYPE_GRALLOC:
490             return mFlags & SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC;
491         default:
492             return false;
493     }
494 }
495 
getReportingMode() const496 int32_t Sensor::getReportingMode() const {
497     return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT);
498 }
499 
getUuid() const500 const Sensor::uuid_t& Sensor::getUuid() const {
501     return mUuid;
502 }
503 
setId(int32_t id)504 void Sensor::setId(int32_t id) {
505     mId = id;
506 }
507 
getId() const508 int32_t Sensor::getId() const {
509     return mId;
510 }
511 
anonymizeUuid()512 void Sensor::anonymizeUuid() {
513     mUuid.i64[0] = mId;
514     mUuid.i64[1] = 0;
515 }
516 
capMinDelayMicros(int32_t cappedMinDelay)517 void Sensor::capMinDelayMicros(int32_t cappedMinDelay) {
518     if (mMinDelay < cappedMinDelay) {
519         mMinDelay = cappedMinDelay;
520     }
521 }
522 
capHighestDirectReportRateLevel(int32_t cappedRateLevel)523 void Sensor::capHighestDirectReportRateLevel(int32_t cappedRateLevel) {
524     if (cappedRateLevel < getHighestDirectReportRateLevel()) {
525         mFlags &= ~SENSOR_FLAG_MASK_DIRECT_REPORT;
526         mFlags |= cappedRateLevel << SENSOR_FLAG_SHIFT_DIRECT_REPORT;
527     }
528 }
529 
getFlattenedSize() const530 size_t Sensor::getFlattenedSize() const {
531     size_t fixedSize =
532             sizeof(mVersion) + sizeof(mHandle) + sizeof(mType) +
533             sizeof(mMinValue) + sizeof(mMaxValue) + sizeof(mResolution) +
534             sizeof(mPower) + sizeof(mMinDelay) + sizeof(mFifoMaxEventCount) +
535             sizeof(mFifoMaxEventCount) + sizeof(mRequiredPermissionRuntime) +
536             sizeof(mRequiredAppOp) + sizeof(mMaxDelay) + sizeof(mFlags) +
537             sizeof(mUuid) + sizeof(mId);
538 
539     size_t variableSize =
540             sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) +
541             sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) +
542             sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) +
543             sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length());
544 
545     return fixedSize + variableSize;
546 }
547 
flatten(void * buffer,size_t size) const548 status_t Sensor::flatten(void* buffer, size_t size) const {
549     if (size < getFlattenedSize()) {
550         return NO_MEMORY;
551     }
552 
553     flattenString8(buffer, size, mName);
554     flattenString8(buffer, size, mVendor);
555     FlattenableUtils::write(buffer, size, mVersion);
556     FlattenableUtils::write(buffer, size, mHandle);
557     FlattenableUtils::write(buffer, size, mType);
558     FlattenableUtils::write(buffer, size, mMinValue);
559     FlattenableUtils::write(buffer, size, mMaxValue);
560     FlattenableUtils::write(buffer, size, mResolution);
561     FlattenableUtils::write(buffer, size, mPower);
562     FlattenableUtils::write(buffer, size, mMinDelay);
563     FlattenableUtils::write(buffer, size, mFifoReservedEventCount);
564     FlattenableUtils::write(buffer, size, mFifoMaxEventCount);
565     flattenString8(buffer, size, mStringType);
566     flattenString8(buffer, size, mRequiredPermission);
567     FlattenableUtils::write(buffer, size, mRequiredPermissionRuntime);
568     FlattenableUtils::write(buffer, size, mRequiredAppOp);
569     FlattenableUtils::write(buffer, size, mMaxDelay);
570     FlattenableUtils::write(buffer, size, mFlags);
571     FlattenableUtils::write(buffer, size, mUuid);
572     FlattenableUtils::write(buffer, size, mId);
573     return NO_ERROR;
574 }
575 
unflatten(void const * buffer,size_t size)576 status_t Sensor::unflatten(void const* buffer, size_t size) {
577     if (!unflattenString8(buffer, size, mName)) {
578         return NO_MEMORY;
579     }
580     if (!unflattenString8(buffer, size, mVendor)) {
581         return NO_MEMORY;
582     }
583 
584     size_t fixedSize1 =
585             sizeof(mVersion) + sizeof(mHandle) + sizeof(mType) + sizeof(mMinValue) +
586             sizeof(mMaxValue) + sizeof(mResolution) + sizeof(mPower) + sizeof(mMinDelay) +
587             sizeof(mFifoMaxEventCount) + sizeof(mFifoMaxEventCount);
588     if (size < fixedSize1) {
589         return NO_MEMORY;
590     }
591 
592     FlattenableUtils::read(buffer, size, mVersion);
593     FlattenableUtils::read(buffer, size, mHandle);
594     FlattenableUtils::read(buffer, size, mType);
595     FlattenableUtils::read(buffer, size, mMinValue);
596     FlattenableUtils::read(buffer, size, mMaxValue);
597     FlattenableUtils::read(buffer, size, mResolution);
598     FlattenableUtils::read(buffer, size, mPower);
599     FlattenableUtils::read(buffer, size, mMinDelay);
600     FlattenableUtils::read(buffer, size, mFifoReservedEventCount);
601     FlattenableUtils::read(buffer, size, mFifoMaxEventCount);
602 
603     if (!unflattenString8(buffer, size, mStringType)) {
604         return NO_MEMORY;
605     }
606     if (!unflattenString8(buffer, size, mRequiredPermission)) {
607         return NO_MEMORY;
608     }
609 
610     size_t fixedSize2 =
611             sizeof(mRequiredPermissionRuntime) + sizeof(mRequiredAppOp) + sizeof(mMaxDelay) +
612             sizeof(mFlags) + sizeof(mUuid) + sizeof(mId);
613     if (size < fixedSize2) {
614         return NO_MEMORY;
615     }
616 
617     FlattenableUtils::read(buffer, size, mRequiredPermissionRuntime);
618     FlattenableUtils::read(buffer, size, mRequiredAppOp);
619     FlattenableUtils::read(buffer, size, mMaxDelay);
620     FlattenableUtils::read(buffer, size, mFlags);
621     FlattenableUtils::read(buffer, size, mUuid);
622     FlattenableUtils::read(buffer, size, mId);
623     return NO_ERROR;
624 }
625 
flattenString8(void * & buffer,size_t & size,const String8 & string8)626 void Sensor::flattenString8(void*& buffer, size_t& size,
627         const String8& string8) {
628     uint32_t len = static_cast<uint32_t>(string8.length());
629     FlattenableUtils::write(buffer, size, len);
630     memcpy(static_cast<char*>(buffer), string8.c_str(), len);
631     FlattenableUtils::advance(buffer, size, len);
632     size -= FlattenableUtils::align<4>(buffer);
633 }
634 
unflattenString8(void const * & buffer,size_t & size,String8 & outputString8)635 bool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) {
636     uint32_t len;
637     if (size < sizeof(len)) {
638         return false;
639     }
640     FlattenableUtils::read(buffer, size, len);
641     if (size < len) {
642         return false;
643     }
644     outputString8 = String8(static_cast<char const*>(buffer), len);
645 
646     if (size < FlattenableUtils::align<4>(len)) {
647         ALOGE("Malformed Sensor String8 field. Should be in a 4-byte aligned buffer but is not.");
648         return false;
649     }
650     FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
651 
652     return true;
653 }
654 
655 // ----------------------------------------------------------------------------
656 }; // namespace android
657