Fix racing condition of mTouchExcludeRegion
Copy region from DisplayContent.mTouchExcludeRegion instead of directly refer to the same object of DisplayContent, and able to protect it by lock of self class, don't have to lock out mWindowMap on every tap. This fix is to avoid racing condition of mTouchExcludeRegion. Change-Id: I7401968167c2e539b4da2afe71e3020038fbfcbf Signed-off-by: tingna_sung <tingna_sung@htc.com>
This commit is contained in:
@@ -241,6 +241,7 @@ class DisplayContent {
|
||||
mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE);
|
||||
}
|
||||
}
|
||||
mTapDetector.setTouchExcludeRegion(mTouchExcludeRegion);
|
||||
}
|
||||
|
||||
void switchUserStacks(int newUserId) {
|
||||
|
||||
@@ -31,7 +31,7 @@ public class StackTapPointerEventListener implements PointerEventListener {
|
||||
private float mDownX;
|
||||
private float mDownY;
|
||||
private int mPointerId;
|
||||
final private Region mTouchExcludeRegion;
|
||||
final private Region mTouchExcludeRegion = new Region();
|
||||
private final WindowManagerService mService;
|
||||
private final DisplayContent mDisplayContent;
|
||||
|
||||
@@ -39,7 +39,6 @@ public class StackTapPointerEventListener implements PointerEventListener {
|
||||
DisplayContent displayContent) {
|
||||
mService = service;
|
||||
mDisplayContent = displayContent;
|
||||
mTouchExcludeRegion = displayContent.mTouchExcludeRegion;
|
||||
DisplayInfo info = displayContent.getDisplayInfo();
|
||||
mMotionSlop = (int)(info.logicalDensityDpi * TAP_MOTION_SLOP_INCHES);
|
||||
}
|
||||
@@ -72,13 +71,15 @@ public class StackTapPointerEventListener implements PointerEventListener {
|
||||
if (mPointerId == motionEvent.getPointerId(index)) {
|
||||
final int x = (int)motionEvent.getX(index);
|
||||
final int y = (int)motionEvent.getY(index);
|
||||
if ((motionEvent.getEventTime() - motionEvent.getDownTime())
|
||||
< TAP_TIMEOUT_MSEC
|
||||
&& Math.abs(x - mDownX) < mMotionSlop
|
||||
&& Math.abs(y - mDownY) < mMotionSlop
|
||||
&& !mTouchExcludeRegion.contains(x, y)) {
|
||||
mService.mH.obtainMessage(H.TAP_OUTSIDE_STACK, x, y,
|
||||
mDisplayContent).sendToTarget();
|
||||
synchronized(this) {
|
||||
if ((motionEvent.getEventTime() - motionEvent.getDownTime())
|
||||
< TAP_TIMEOUT_MSEC
|
||||
&& Math.abs(x - mDownX) < mMotionSlop
|
||||
&& Math.abs(y - mDownY) < mMotionSlop
|
||||
&& !mTouchExcludeRegion.contains(x, y)) {
|
||||
mService.mH.obtainMessage(H.TAP_OUTSIDE_STACK, x, y,
|
||||
mDisplayContent).sendToTarget();
|
||||
}
|
||||
}
|
||||
mPointerId = -1;
|
||||
}
|
||||
@@ -86,4 +87,10 @@ public class StackTapPointerEventListener implements PointerEventListener {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setTouchExcludeRegion(Region newRegion) {
|
||||
synchronized (this) {
|
||||
mTouchExcludeRegion.set(newRegion);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user