diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-04-17 18:03:48 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-04-17 18:03:48 +0000 |
commit | bb92c8b98b48ab9d51926f08b502ef2410409406 (patch) | |
tree | f5851353c6b784caf2fd9ba80438343156a11517 | |
parent | e551aa4127312e2bf9980499c0ea65c2ac36b6bf (diff) | |
parent | ef7e83eb7bf3e3e622f5e11a2ae3b76713ae917e (diff) | |
download | native-bb92c8b98b48ab9d51926f08b502ef2410409406.tar.gz |
Merge cherrypicks of [3912569, 3913632, 3913633, 3913557, 3913471, 3913509, 3913558, 3913541, 3913542, 3913472, 3913473, 3913735, 3913736, 3913737, 3913738, 3913739, 3913510, 3913511, 3913512, 3913513, 3913514, 3913559, 3913560, 3913755, 3913795, 3912643, 3913543, 3912570, 3913057] into sparse-4669640-L32000000164199687android-8.1.0_r29oreo-m4-s4-release
Change-Id: I375b1cbf5434c8f86200075ebd5aa228292bffd9
-rw-r--r-- | include/input/InputTransport.h | 14 | ||||
-rw-r--r-- | libs/input/InputTransport.cpp | 59 | ||||
-rw-r--r-- | services/sensorservice/SensorService.cpp | 8 |
3 files changed, 56 insertions, 25 deletions
diff --git a/include/input/InputTransport.h b/include/input/InputTransport.h index 944947420e..ea1d2aa41f 100644 --- a/include/input/InputTransport.h +++ b/include/input/InputTransport.h @@ -381,6 +381,18 @@ private: } } + void initializeFrom(const History& other) { + eventTime = other.eventTime; + idBits = other.idBits; // temporary copy + for (size_t i = 0; i < other.idBits.count(); i++) { + uint32_t id = idBits.clearFirstMarkedBit(); + int32_t index = other.idToIndex[id]; + idToIndex[id] = index; + pointers[index].copyFrom(other.pointers[index]); + } + idBits = other.idBits; // final copy + } + const PointerCoords& getPointerById(uint32_t id) const { return pointers[idToIndex[id]]; } @@ -455,7 +467,6 @@ private: int32_t* displayId); void updateTouchState(InputMessage& msg); - bool rewriteMessage(const TouchState& state, InputMessage& msg); void resampleTouchState(nsecs_t frameTime, MotionEvent* event, const InputMessage *next); @@ -464,6 +475,7 @@ private: status_t sendUnchainedFinishedSignal(uint32_t seq, bool handled); + static void rewriteMessage(TouchState& state, InputMessage& msg); static void initializeKeyEvent(KeyEvent* event, const InputMessage* msg); static void initializeMotionEvent(MotionEvent* event, const InputMessage* msg); static void addSample(MotionEvent* event, const InputMessage* msg); diff --git a/libs/input/InputTransport.cpp b/libs/input/InputTransport.cpp index d8dc9575ba..3e8b67931a 100644 --- a/libs/input/InputTransport.cpp +++ b/libs/input/InputTransport.cpp @@ -614,10 +614,7 @@ void InputConsumer::updateTouchState(InputMessage& msg) { if (index >= 0) { TouchState& touchState = mTouchStates.editItemAt(index); touchState.addHistory(msg); - bool messageRewritten = rewriteMessage(touchState, msg); - if (!messageRewritten) { - touchState.lastResample.idBits.clear(); - } + rewriteMessage(touchState, msg); } break; } @@ -645,7 +642,7 @@ void InputConsumer::updateTouchState(InputMessage& msg) { case AMOTION_EVENT_ACTION_SCROLL: { ssize_t index = findTouchState(deviceId, source); if (index >= 0) { - const TouchState& touchState = mTouchStates.itemAt(index); + TouchState& touchState = mTouchStates.editItemAt(index); rewriteMessage(touchState, msg); } break; @@ -655,7 +652,7 @@ void InputConsumer::updateTouchState(InputMessage& msg) { case AMOTION_EVENT_ACTION_CANCEL: { ssize_t index = findTouchState(deviceId, source); if (index >= 0) { - const TouchState& touchState = mTouchStates.itemAt(index); + TouchState& touchState = mTouchStates.editItemAt(index); rewriteMessage(touchState, msg); mTouchStates.removeAt(index); } @@ -664,28 +661,38 @@ void InputConsumer::updateTouchState(InputMessage& msg) { } } -bool InputConsumer::rewriteMessage(const TouchState& state, InputMessage& msg) { - bool messageRewritten = false; +/** + * Replace the coordinates in msg with the coordinates in lastResample, if necessary. + * + * If lastResample is no longer valid for a specific pointer (i.e. the lastResample time + * is in the past relative to msg and the past two events do not contain identical coordinates), + * then invalidate the lastResample data for that pointer. + * If the two past events have identical coordinates, then lastResample data for that pointer will + * remain valid, and will be used to replace these coordinates. Thus, if a certain coordinate x0 is + * resampled to the new value x1, then x1 will always be used to replace x0 until some new value + * not equal to x0 is received. + */ +void InputConsumer::rewriteMessage(TouchState& state, InputMessage& msg) { nsecs_t eventTime = msg.body.motion.eventTime; for (uint32_t i = 0; i < msg.body.motion.pointerCount; i++) { uint32_t id = msg.body.motion.pointers[i].properties.id; if (state.lastResample.idBits.hasBit(id)) { - PointerCoords& msgCoords = msg.body.motion.pointers[i].coords; - const PointerCoords& resampleCoords = state.lastResample.getPointerById(id); if (eventTime < state.lastResample.eventTime || state.recentCoordinatesAreIdentical(id)) { - msgCoords.setAxisValue(AMOTION_EVENT_AXIS_X, resampleCoords.getX()); - msgCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, resampleCoords.getY()); + PointerCoords& msgCoords = msg.body.motion.pointers[i].coords; + const PointerCoords& resampleCoords = state.lastResample.getPointerById(id); #if DEBUG_RESAMPLING ALOGD("[%d] - rewrite (%0.3f, %0.3f), old (%0.3f, %0.3f)", id, resampleCoords.getX(), resampleCoords.getY(), msgCoords.getX(), msgCoords.getY()); #endif - messageRewritten = true; + msgCoords.setAxisValue(AMOTION_EVENT_AXIS_X, resampleCoords.getX()); + msgCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, resampleCoords.getY()); + } else { + state.lastResample.idBits.clearBit(id); } } } - return messageRewritten; } void InputConsumer::resampleTouchState(nsecs_t sampleTime, MotionEvent* event, @@ -713,7 +720,6 @@ void InputConsumer::resampleTouchState(nsecs_t sampleTime, MotionEvent* event, } // Ensure that the current sample has all of the pointers that need to be reported. - // Also ensure that the past two "real" touch events do not contain duplicate coordinates const History* current = touchState.getHistory(0); size_t pointerCount = event->getPointerCount(); for (size_t i = 0; i < pointerCount; i++) { @@ -724,12 +730,6 @@ void InputConsumer::resampleTouchState(nsecs_t sampleTime, MotionEvent* event, #endif return; } - if (touchState.recentCoordinatesAreIdentical(id)) { -#if DEBUG_RESAMPLING - ALOGD("Not resampled, past two historical events have duplicate coordinates"); -#endif - return; - } } // Find the data to use for resampling. @@ -783,18 +783,32 @@ void InputConsumer::resampleTouchState(nsecs_t sampleTime, MotionEvent* event, } // Resample touch coordinates. + History oldLastResample; + oldLastResample.initializeFrom(touchState.lastResample); touchState.lastResample.eventTime = sampleTime; touchState.lastResample.idBits.clear(); for (size_t i = 0; i < pointerCount; i++) { uint32_t id = event->getPointerId(i); touchState.lastResample.idToIndex[id] = i; touchState.lastResample.idBits.markBit(id); + if (oldLastResample.hasPointerId(id) && touchState.recentCoordinatesAreIdentical(id)) { + // We maintain the previously resampled value for this pointer (stored in + // oldLastResample) when the coordinates for this pointer haven't changed since then. + // This way we don't introduce artificial jitter when pointers haven't actually moved. + + // We know here that the coordinates for the pointer haven't changed because we + // would've cleared the resampled bit in rewriteMessage if they had. We can't modify + // lastResample in place becasue the mapping from pointer ID to index may have changed. + touchState.lastResample.pointers[i].copyFrom(oldLastResample.getPointerById(id)); + continue; + } + PointerCoords& resampledCoords = touchState.lastResample.pointers[i]; const PointerCoords& currentCoords = current->getPointerById(id); + resampledCoords.copyFrom(currentCoords); if (other->idBits.hasBit(id) && shouldResampleTool(event->getToolType(i))) { const PointerCoords& otherCoords = other->getPointerById(id); - resampledCoords.copyFrom(currentCoords); resampledCoords.setAxisValue(AMOTION_EVENT_AXIS_X, lerp(currentCoords.getX(), otherCoords.getX(), alpha)); resampledCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, @@ -808,7 +822,6 @@ void InputConsumer::resampleTouchState(nsecs_t sampleTime, MotionEvent* event, alpha); #endif } else { - resampledCoords.copyFrom(currentCoords); #if DEBUG_RESAMPLING ALOGD("[%d] - out (%0.3f, %0.3f), cur (%0.3f, %0.3f)", id, resampledCoords.getX(), resampledCoords.getY(), diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index dc491d97c0..e5b6dcf750 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -21,6 +21,7 @@ #include <cutils/properties.h> #include <hardware/sensors.h> #include <hardware_legacy/power.h> +#include <log/log.h> #include <openssl/digest.h> #include <openssl/hmac.h> #include <openssl/rand.h> @@ -993,10 +994,15 @@ sp<ISensorEventConnection> SensorService::createSensorDirectConnection( // check specific to memory type switch(type) { case SENSOR_DIRECT_MEM_TYPE_ASHMEM: { // channel backed by ashmem + if (resource->numFds < 1) { + ALOGE("Ashmem direct channel requires a memory region to be supplied"); + android_errorWriteLog(0x534e4554, "70986337"); // SafetyNet + return nullptr; + } int fd = resource->data[0]; int size2 = ashmem_get_size_region(fd); // check size consistency - if (size2 < static_cast<int>(size)) { + if (size2 < static_cast<int64_t>(size)) { ALOGE("Ashmem direct channel size %" PRIu32 " greater than shared memory size %d", size, size2); return nullptr; |