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 18 #include <binder/AppOpsManager.h> 19 #include <binder/IServiceManager.h> 20 #include <gui/Sensor.h> 21 #include <hardware/sensors.h> 22 #include <log/log.h> 23 #include <utils/Errors.h> 24 #include <utils/String8.h> 25 #include <utils/Flattenable.h> 26 27 #include <inttypes.h> 28 #include <stdint.h> 29 #include <sys/types.h> 30 #include <sys/limits.h> 31 32 // ---------------------------------------------------------------------------- 33 namespace android { 34 // ---------------------------------------------------------------------------- 35 36 Sensor::Sensor(const char * name) : 37 mName(name), mHandle(0), mType(0), 38 mMinValue(0), mMaxValue(0), mResolution(0), 39 mPower(0), mMinDelay(0), mVersion(0), mFifoReservedEventCount(0), 40 mFifoMaxEventCount(0), mRequiredAppOp(0), 41 mMaxDelay(0), mFlags(0) { 42 } 43 44 Sensor::Sensor(struct sensor_t const* hwSensor, int halVersion) : 45 Sensor(*hwSensor, uuid_t(), halVersion) { 46 } 47 48 Sensor::Sensor(struct sensor_t const& hwSensor, const uuid_t& uuid, int halVersion) { 49 mName = hwSensor.name; 50 mVendor = hwSensor.vendor; 51 mVersion = hwSensor.version; 52 mHandle = hwSensor.handle; 53 mType = hwSensor.type; 54 mMinValue = 0; // FIXME: minValue 55 mMaxValue = hwSensor.maxRange; // FIXME: maxValue 56 mResolution = hwSensor.resolution; 57 mPower = hwSensor.power; 58 mMinDelay = hwSensor.minDelay; 59 mFlags = 0; 60 mUuid = uuid; 61 62 // Set fifo event count zero for older devices which do not support batching. Fused 63 // sensors also have their fifo counts set to zero. 64 if (halVersion > SENSORS_DEVICE_API_VERSION_1_0) { 65 mFifoReservedEventCount = hwSensor.fifoReservedEventCount; 66 mFifoMaxEventCount = hwSensor.fifoMaxEventCount; 67 } else { 68 mFifoReservedEventCount = 0; 69 mFifoMaxEventCount = 0; 70 } 71 72 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 73 if (hwSensor.maxDelay > INT_MAX) { 74 // Max delay is declared as a 64 bit integer for 64 bit architectures. But it should 75 // always fit in a 32 bit integer, log error and cap it to INT_MAX. 76 ALOGE("Sensor maxDelay overflow error %s %" PRId64, mName.string(), 77 static_cast<int64_t>(hwSensor.maxDelay)); 78 mMaxDelay = INT_MAX; 79 } else { 80 mMaxDelay = static_cast<int32_t>(hwSensor.maxDelay); 81 } 82 } else { 83 // For older hals set maxDelay to 0. 84 mMaxDelay = 0; 85 } 86 87 // Ensure existing sensors have correct string type, required permissions and reporting mode. 88 // Set reportingMode for all android defined sensor types, set wake-up flag only for proximity 89 // sensor, significant motion, tilt, pick_up gesture, wake gesture and glance gesture on older 90 // HALs. Newer HALs can define both wake-up and non wake-up proximity sensors. 91 // All the OEM defined defined sensors have flags set to whatever is provided by the HAL. 92 switch (mType) { 93 case SENSOR_TYPE_ACCELEROMETER: 94 mStringType = SENSOR_STRING_TYPE_ACCELEROMETER; 95 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 96 break; 97 case SENSOR_TYPE_AMBIENT_TEMPERATURE: 98 mStringType = SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE; 99 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 100 break; 101 case SENSOR_TYPE_GAME_ROTATION_VECTOR: 102 mStringType = SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR; 103 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 104 break; 105 case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: 106 mStringType = SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR; 107 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 108 break; 109 case SENSOR_TYPE_GRAVITY: 110 mStringType = SENSOR_STRING_TYPE_GRAVITY; 111 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 112 break; 113 case SENSOR_TYPE_GYROSCOPE: 114 mStringType = SENSOR_STRING_TYPE_GYROSCOPE; 115 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 116 break; 117 case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: 118 mStringType = SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED; 119 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 120 break; 121 case SENSOR_TYPE_HEART_RATE: { 122 mStringType = SENSOR_STRING_TYPE_HEART_RATE; 123 mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; 124 AppOpsManager appOps; 125 mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS)); 126 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 127 } break; 128 case SENSOR_TYPE_LIGHT: 129 mStringType = SENSOR_STRING_TYPE_LIGHT; 130 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 131 break; 132 case SENSOR_TYPE_LINEAR_ACCELERATION: 133 mStringType = SENSOR_STRING_TYPE_LINEAR_ACCELERATION; 134 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 135 break; 136 case SENSOR_TYPE_MAGNETIC_FIELD: 137 mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD; 138 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 139 break; 140 case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: 141 mStringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; 142 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 143 break; 144 case SENSOR_TYPE_ORIENTATION: 145 mStringType = SENSOR_STRING_TYPE_ORIENTATION; 146 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 147 break; 148 case SENSOR_TYPE_PRESSURE: 149 mStringType = SENSOR_STRING_TYPE_PRESSURE; 150 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 151 break; 152 case SENSOR_TYPE_PROXIMITY: 153 mStringType = SENSOR_STRING_TYPE_PROXIMITY; 154 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 155 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 156 mFlags |= SENSOR_FLAG_WAKE_UP; 157 } 158 break; 159 case SENSOR_TYPE_RELATIVE_HUMIDITY: 160 mStringType = SENSOR_STRING_TYPE_RELATIVE_HUMIDITY; 161 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 162 break; 163 case SENSOR_TYPE_ROTATION_VECTOR: 164 mStringType = SENSOR_STRING_TYPE_ROTATION_VECTOR; 165 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 166 break; 167 case SENSOR_TYPE_SIGNIFICANT_MOTION: 168 mStringType = SENSOR_STRING_TYPE_SIGNIFICANT_MOTION; 169 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 170 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 171 mFlags |= SENSOR_FLAG_WAKE_UP; 172 } 173 break; 174 case SENSOR_TYPE_STEP_COUNTER: 175 mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; 176 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 177 break; 178 case SENSOR_TYPE_STEP_DETECTOR: 179 mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; 180 mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 181 break; 182 case SENSOR_TYPE_TEMPERATURE: 183 mStringType = SENSOR_STRING_TYPE_TEMPERATURE; 184 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 185 break; 186 case SENSOR_TYPE_TILT_DETECTOR: 187 mStringType = SENSOR_STRING_TYPE_TILT_DETECTOR; 188 mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 189 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 190 mFlags |= SENSOR_FLAG_WAKE_UP; 191 } 192 break; 193 case SENSOR_TYPE_WAKE_GESTURE: 194 mStringType = SENSOR_STRING_TYPE_WAKE_GESTURE; 195 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 196 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 197 mFlags |= SENSOR_FLAG_WAKE_UP; 198 } 199 break; 200 case SENSOR_TYPE_GLANCE_GESTURE: 201 mStringType = SENSOR_STRING_TYPE_GLANCE_GESTURE; 202 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 203 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 204 mFlags |= SENSOR_FLAG_WAKE_UP; 205 } 206 break; 207 case SENSOR_TYPE_PICK_UP_GESTURE: 208 mStringType = SENSOR_STRING_TYPE_PICK_UP_GESTURE; 209 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 210 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 211 mFlags |= SENSOR_FLAG_WAKE_UP; 212 } 213 break; 214 case SENSOR_TYPE_WRIST_TILT_GESTURE: 215 mStringType = SENSOR_STRING_TYPE_WRIST_TILT_GESTURE; 216 mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 217 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 218 mFlags |= SENSOR_FLAG_WAKE_UP; 219 } 220 break; 221 case SENSOR_TYPE_DYNAMIC_SENSOR_META: 222 mStringType = SENSOR_STRING_TYPE_DYNAMIC_SENSOR_META; 223 mFlags = SENSOR_FLAG_SPECIAL_REPORTING_MODE; // special trigger and non-wake up 224 break; 225 case SENSOR_TYPE_POSE_6DOF: 226 mStringType = SENSOR_STRING_TYPE_POSE_6DOF; 227 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 228 break; 229 case SENSOR_TYPE_STATIONARY_DETECT: 230 mStringType = SENSOR_STRING_TYPE_STATIONARY_DETECT; 231 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 232 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 233 mFlags |= SENSOR_FLAG_WAKE_UP; 234 } 235 break; 236 case SENSOR_TYPE_MOTION_DETECT: 237 mStringType = SENSOR_STRING_TYPE_MOTION_DETECT; 238 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 239 if (halVersion < SENSORS_DEVICE_API_VERSION_1_3) { 240 mFlags |= SENSOR_FLAG_WAKE_UP; 241 } 242 break; 243 case SENSOR_TYPE_HEART_BEAT: 244 mStringType = SENSOR_STRING_TYPE_HEART_BEAT; 245 mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; 246 break; 247 default: 248 // Only pipe the stringType, requiredPermission and flags for custom sensors. 249 if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor.stringType) { 250 mStringType = hwSensor.stringType; 251 } 252 if (halVersion > SENSORS_DEVICE_API_VERSION_1_0 && hwSensor.requiredPermission) { 253 mRequiredPermission = hwSensor.requiredPermission; 254 if (!strcmp(mRequiredPermission, SENSOR_PERMISSION_BODY_SENSORS)) { 255 AppOpsManager appOps; 256 mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS)); 257 } 258 } 259 260 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 261 mFlags = static_cast<uint32_t>(hwSensor.flags); 262 } else { 263 // This is an OEM defined sensor on an older HAL. Use minDelay to determine the 264 // reporting mode of the sensor. 265 if (mMinDelay > 0) { 266 mFlags |= SENSOR_FLAG_CONTINUOUS_MODE; 267 } else if (mMinDelay == 0) { 268 mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; 269 } else if (mMinDelay < 0) { 270 mFlags |= SENSOR_FLAG_ONE_SHOT_MODE; 271 } 272 } 273 break; 274 } 275 276 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 277 // Wake-up flag of HAL 1.3 and above is set here 278 mFlags |= (hwSensor.flags & SENSOR_FLAG_WAKE_UP); 279 280 // Log error if the reporting mode is not as expected, but respect HAL setting. 281 int actualReportingMode = (hwSensor.flags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 282 int expectedReportingMode = (mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT; 283 if (actualReportingMode != expectedReportingMode) { 284 ALOGE("Reporting Mode incorrect: sensor %s handle=%#010" PRIx32 " type=%" PRId32 " " 285 "actual=%d expected=%d", 286 mName.string(), mHandle, mType, actualReportingMode, expectedReportingMode); 287 } 288 } 289 290 // Feature flags 291 // Set DYNAMIC_SENSOR_MASK and ADDITIONAL_INFO_MASK flag here. Compatible with HAL 1_3. 292 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_3) { 293 mFlags |= (hwSensor.flags & (DYNAMIC_SENSOR_MASK | ADDITIONAL_INFO_MASK)); 294 } 295 // Set DATA_INJECTION flag here. Defined in HAL 1_4. 296 if (halVersion >= SENSORS_DEVICE_API_VERSION_1_4) { 297 mFlags |= (hwSensor.flags & DATA_INJECTION_MASK); 298 } 299 300 if (mRequiredPermission.length() > 0) { 301 // If the sensor is protected by a permission we need to know if it is 302 // a runtime one to determine whether we can use the permission cache. 303 sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); 304 if (binder != 0) { 305 sp<IPermissionController> permCtrl = interface_cast<IPermissionController>(binder); 306 mRequiredPermissionRuntime = permCtrl->isRuntimePermission( 307 String16(mRequiredPermission)); 308 } 309 } 310 } 311 312 Sensor::~Sensor() { 313 } 314 315 const String8& Sensor::getName() const { 316 return mName; 317 } 318 319 const String8& Sensor::getVendor() const { 320 return mVendor; 321 } 322 323 int32_t Sensor::getHandle() const { 324 return mHandle; 325 } 326 327 int32_t Sensor::getType() const { 328 return mType; 329 } 330 331 float Sensor::getMinValue() const { 332 return mMinValue; 333 } 334 335 float Sensor::getMaxValue() const { 336 return mMaxValue; 337 } 338 339 float Sensor::getResolution() const { 340 return mResolution; 341 } 342 343 float Sensor::getPowerUsage() const { 344 return mPower; 345 } 346 347 int32_t Sensor::getMinDelay() const { 348 return mMinDelay; 349 } 350 351 nsecs_t Sensor::getMinDelayNs() const { 352 return getMinDelay() * 1000; 353 } 354 355 int32_t Sensor::getVersion() const { 356 return mVersion; 357 } 358 359 uint32_t Sensor::getFifoReservedEventCount() const { 360 return mFifoReservedEventCount; 361 } 362 363 uint32_t Sensor::getFifoMaxEventCount() const { 364 return mFifoMaxEventCount; 365 } 366 367 const String8& Sensor::getStringType() const { 368 return mStringType; 369 } 370 371 const String8& Sensor::getRequiredPermission() const { 372 return mRequiredPermission; 373 } 374 375 bool Sensor::isRequiredPermissionRuntime() const { 376 return mRequiredPermissionRuntime; 377 } 378 379 int32_t Sensor::getRequiredAppOp() const { 380 return mRequiredAppOp; 381 } 382 383 int32_t Sensor::getMaxDelay() const { 384 return mMaxDelay; 385 } 386 387 uint32_t Sensor::getFlags() const { 388 return mFlags; 389 } 390 391 bool Sensor::isWakeUpSensor() const { 392 return (mFlags & SENSOR_FLAG_WAKE_UP) != 0; 393 } 394 395 bool Sensor::isDynamicSensor() const { 396 return (mFlags & SENSOR_FLAG_DYNAMIC_SENSOR) != 0; 397 } 398 399 bool Sensor::hasAdditionalInfo() const { 400 return (mFlags & SENSOR_FLAG_ADDITIONAL_INFO) != 0; 401 } 402 403 int32_t Sensor::getReportingMode() const { 404 return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT); 405 } 406 407 const Sensor::uuid_t& Sensor::getUuid() const { 408 return mUuid; 409 } 410 411 void Sensor::setId(int32_t id) { 412 mUuid.i64[0] = id; 413 mUuid.i64[1] = 0; 414 } 415 416 int32_t Sensor::getId() const { 417 return int32_t(mUuid.i64[0]); 418 } 419 420 size_t Sensor::getFlattenedSize() const { 421 size_t fixedSize = 422 sizeof(mVersion) + sizeof(mHandle) + sizeof(mType) + 423 sizeof(mMinValue) + sizeof(mMaxValue) + sizeof(mResolution) + 424 sizeof(mPower) + sizeof(mMinDelay) + sizeof(mFifoMaxEventCount) + 425 sizeof(mFifoMaxEventCount) + sizeof(mRequiredPermissionRuntime) + 426 sizeof(mRequiredAppOp) + sizeof(mMaxDelay) + sizeof(mFlags) + sizeof(mUuid); 427 428 size_t variableSize = 429 sizeof(uint32_t) + FlattenableUtils::align<4>(mName.length()) + 430 sizeof(uint32_t) + FlattenableUtils::align<4>(mVendor.length()) + 431 sizeof(uint32_t) + FlattenableUtils::align<4>(mStringType.length()) + 432 sizeof(uint32_t) + FlattenableUtils::align<4>(mRequiredPermission.length()); 433 434 return fixedSize + variableSize; 435 } 436 437 status_t Sensor::flatten(void* buffer, size_t size) const { 438 if (size < getFlattenedSize()) { 439 return NO_MEMORY; 440 } 441 442 flattenString8(buffer, size, mName); 443 flattenString8(buffer, size, mVendor); 444 FlattenableUtils::write(buffer, size, mVersion); 445 FlattenableUtils::write(buffer, size, mHandle); 446 FlattenableUtils::write(buffer, size, mType); 447 FlattenableUtils::write(buffer, size, mMinValue); 448 FlattenableUtils::write(buffer, size, mMaxValue); 449 FlattenableUtils::write(buffer, size, mResolution); 450 FlattenableUtils::write(buffer, size, mPower); 451 FlattenableUtils::write(buffer, size, mMinDelay); 452 FlattenableUtils::write(buffer, size, mFifoReservedEventCount); 453 FlattenableUtils::write(buffer, size, mFifoMaxEventCount); 454 flattenString8(buffer, size, mStringType); 455 flattenString8(buffer, size, mRequiredPermission); 456 FlattenableUtils::write(buffer, size, mRequiredPermissionRuntime); 457 FlattenableUtils::write(buffer, size, mRequiredAppOp); 458 FlattenableUtils::write(buffer, size, mMaxDelay); 459 FlattenableUtils::write(buffer, size, mFlags); 460 if (mUuid.i64[1] != 0) { 461 // We should never hit this case with our current API, but we 462 // could via a careless API change. If that happens, 463 // this code will keep us from leaking our UUID (while probably 464 // breaking dynamic sensors). See b/29547335. 465 ALOGW("Sensor with UUID being flattened; sending 0. Expect " 466 "bad dynamic sensor behavior"); 467 uuid_t tmpUuid; // default constructor makes this 0. 468 FlattenableUtils::write(buffer, size, tmpUuid); 469 } else { 470 FlattenableUtils::write(buffer, size, mUuid); 471 } 472 return NO_ERROR; 473 } 474 475 status_t Sensor::unflatten(void const* buffer, size_t size) { 476 if (!unflattenString8(buffer, size, mName)) { 477 return NO_MEMORY; 478 } 479 if (!unflattenString8(buffer, size, mVendor)) { 480 return NO_MEMORY; 481 } 482 483 size_t fixedSize1 = 484 sizeof(mVersion) + sizeof(mHandle) + sizeof(mType) + sizeof(mMinValue) + 485 sizeof(mMaxValue) + sizeof(mResolution) + sizeof(mPower) + sizeof(mMinDelay) + 486 sizeof(mFifoMaxEventCount) + sizeof(mFifoMaxEventCount); 487 if (size < fixedSize1) { 488 return NO_MEMORY; 489 } 490 491 FlattenableUtils::read(buffer, size, mVersion); 492 FlattenableUtils::read(buffer, size, mHandle); 493 FlattenableUtils::read(buffer, size, mType); 494 FlattenableUtils::read(buffer, size, mMinValue); 495 FlattenableUtils::read(buffer, size, mMaxValue); 496 FlattenableUtils::read(buffer, size, mResolution); 497 FlattenableUtils::read(buffer, size, mPower); 498 FlattenableUtils::read(buffer, size, mMinDelay); 499 FlattenableUtils::read(buffer, size, mFifoReservedEventCount); 500 FlattenableUtils::read(buffer, size, mFifoMaxEventCount); 501 502 if (!unflattenString8(buffer, size, mStringType)) { 503 return NO_MEMORY; 504 } 505 if (!unflattenString8(buffer, size, mRequiredPermission)) { 506 return NO_MEMORY; 507 } 508 509 size_t fixedSize2 = 510 sizeof(mRequiredPermissionRuntime) + sizeof(mRequiredAppOp) + sizeof(mMaxDelay) + 511 sizeof(mFlags) + sizeof(mUuid); 512 if (size < fixedSize2) { 513 return NO_MEMORY; 514 } 515 516 FlattenableUtils::read(buffer, size, mRequiredPermissionRuntime); 517 FlattenableUtils::read(buffer, size, mRequiredAppOp); 518 FlattenableUtils::read(buffer, size, mMaxDelay); 519 FlattenableUtils::read(buffer, size, mFlags); 520 FlattenableUtils::read(buffer, size, mUuid); 521 return NO_ERROR; 522 } 523 524 void Sensor::flattenString8(void*& buffer, size_t& size, 525 const String8& string8) { 526 uint32_t len = static_cast<uint32_t>(string8.length()); 527 FlattenableUtils::write(buffer, size, len); 528 memcpy(static_cast<char*>(buffer), string8.string(), len); 529 FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 530 } 531 532 bool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& outputString8) { 533 uint32_t len; 534 if (size < sizeof(len)) { 535 return false; 536 } 537 FlattenableUtils::read(buffer, size, len); 538 if (size < len) { 539 return false; 540 } 541 outputString8.setTo(static_cast<char const*>(buffer), len); 542 FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); 543 return true; 544 } 545 546 // ---------------------------------------------------------------------------- 547 }; // namespace android 548