Use previous pressure value if the current fusion data is zero.

Occasionally we'll receive the stylus up signal (pressure = 0) before
we receive the touch screen up signal. Rather than giving pointer a
pressure value of 0 (which is one of the signals of hovering) or
falling back to the touchscreen pressure values (which would make for
an inconsistent stream), use the previous pressure value which should
always be non-zero for a stream of fused data.

Bug: 20449776
Change-Id: I71eb97e7c4ea53e42b0eb54fc1f8ae7f89aad9d1
This commit is contained in:
Michael Wright 2015-04-23 17:39:53 +01:00
parent 43fd19fd1a
commit 53dca3aadd
2 changed files with 15 additions and 9 deletions

View File

@ -4076,14 +4076,20 @@ void TouchInputMapper::applyExternalStylusButtonState(nsecs_t when) {
} }
void TouchInputMapper::applyExternalStylusTouchState(nsecs_t when) { void TouchInputMapper::applyExternalStylusTouchState(nsecs_t when) {
CookedPointerData& cpd = mCurrentCookedState.cookedPointerData; CookedPointerData& currentPointerData = mCurrentCookedState.cookedPointerData;
if (mExternalStylusId != -1 && cpd.isTouching(mExternalStylusId)) { const CookedPointerData& lastPointerData = mLastCookedState.cookedPointerData;
if (mExternalStylusState.pressure != 0.0f) {
PointerCoords& coords = cpd.editPointerCoordsWithId(mExternalStylusId);
coords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, mExternalStylusState.pressure);
}
PointerProperties& properties = cpd.editPointerPropertiesWithId(mExternalStylusId); if (mExternalStylusId != -1 && currentPointerData.isTouching(mExternalStylusId)) {
float pressure = mExternalStylusState.pressure;
if (pressure == 0.0f && lastPointerData.isTouching(mExternalStylusId)) {
const PointerCoords& coords = lastPointerData.pointerCoordsForId(mExternalStylusId);
pressure = coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE);
}
PointerCoords& coords = currentPointerData.editPointerCoordsWithId(mExternalStylusId);
coords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pressure);
PointerProperties& properties =
currentPointerData.editPointerPropertiesWithId(mExternalStylusId);
if (mExternalStylusState.toolType != AMOTION_EVENT_TOOL_TYPE_UNKNOWN) { if (mExternalStylusState.toolType != AMOTION_EVENT_TOOL_TYPE_UNKNOWN) {
properties.toolType = mExternalStylusState.toolType; properties.toolType = mExternalStylusState.toolType;
} }

View File

@ -881,11 +881,11 @@ struct CookedPointerData {
return pointerProperties[idToIndex[id]]; return pointerProperties[idToIndex[id]];
} }
inline bool isHovering(uint32_t pointerIndex) { inline bool isHovering(uint32_t pointerIndex) const {
return hoveringIdBits.hasBit(pointerProperties[pointerIndex].id); return hoveringIdBits.hasBit(pointerProperties[pointerIndex].id);
} }
inline bool isTouching(uint32_t pointerIndex) { inline bool isTouching(uint32_t pointerIndex) const {
return touchingIdBits.hasBit(pointerProperties[pointerIndex].id); return touchingIdBits.hasBit(pointerProperties[pointerIndex].id);
} }
}; };