Status Update
Comments
al...@android.com <al...@android.com> #2
Does this occur when using version 24.0.0 of the support library?
[Deleted User] <[Deleted User]> #3
Yes. on version 24.0.0
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at android.support.v4.widget.ViewDragHelper.saveLastMotion(ViewDragHelper.java:849)
at android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(ViewDragHelper.java:1057)
at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:1438)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2064)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2330)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1614)
at android.app.Activity.dispatchTouchEvent(Activity.java:2658)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2278)
at android.view.View.dispatchPointerEvent(View.java:8358)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4711)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4572)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4130)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4184)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4153)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4264)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4161)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4321)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4130)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4184)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4153)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4161)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4130)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6453)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6366)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6337)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6302)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6533)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(InputEventReceiver.java)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6506)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6552)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813)
at android.view.Choreographer.doCallbacks(Choreographer.java:613)
at android.view.Choreographer.doFrame(Choreographer.java:581)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5679)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
at dalvik.system.NativeStart.main(NativeStart.java)
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at android.support.v4.widget.ViewDragHelper.saveLastMotion(ViewDragHelper.java:849)
at android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(ViewDragHelper.java:1057)
at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:1438)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2064)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2330)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1614)
at android.app.Activity.dispatchTouchEvent(Activity.java:2658)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2278)
at android.view.View.dispatchPointerEvent(View.java:8358)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4711)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4572)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4130)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4184)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4153)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4264)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4161)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4321)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4130)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4184)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4153)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4161)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4130)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6453)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6366)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6337)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6302)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6533)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(InputEventReceiver.java)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6506)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6552)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813)
at android.view.Choreographer.doCallbacks(Choreographer.java:613)
at android.view.Choreographer.doFrame(Choreographer.java:581)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5679)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
at dalvik.system.NativeStart.main(NativeStart.java)
al...@android.com <al...@android.com>
au...@google.com <au...@google.com> #4
Do you have specific repro steps or do you just get it from your crash reporting?
[Deleted User] <[Deleted User]> #5
It is from crash reports.
au...@google.com <au...@google.com> #6
The issue is in the fact that ViewDragHelper received ACTION_UP without a corresponding ACTION_DOWN meaning that some code intercepted that ACTION_DOWN. I added a check so we no longer crash, however this will simply suppress the issue and thus you should look into your app's code to see where the interception takes place. Are you calling requestDisallowInterceptTouchEvent() in your code?
[Deleted User] <[Deleted User]> #7
I see... I am calling it on the onTouch method of my view:
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if(!mListenForTouchEvents || !mStack.isEnabled()) {
return false;
}
v.getParent().requestDisallowInterceptTouchEvent(true);
mStack.onSwipeStart();
mPointerId = event.getPointerId(0);
mDownX = event.getX(mPointerId);
mDownY = event.getY(mPointerId);
return true;
case MotionEvent.ACTION_MOVE:
int pointerIndex = event.findPointerIndex(mPointerId);
if (pointerIndex < 0) return false;
float dx = event.getX(pointerIndex) - mDownX;
float dy = event.getY(pointerIndex) - mDownY;
float newX = mObservedView.getX() + dx;
float newY = mObservedView.getY() + dy;
mObservedView.setX(newX);
mObservedView.setY(newY);
float dragDistanceX = newX - mInitialX;
float swipeProgress = Math.min(Math.max(
dragDistanceX / mStack.getWidth(), -1), 1);
setSwipeDirection(swipeProgress);
float viewCenterHorizontal = mObservedView.getX() + (mObservedView.getWidth() / 2);
float parentFirstThird = mStack.getWidth() / 4f;
float parentLastThird = parentFirstThird * 3;
float mAlpha = Math.abs(swipeProgress);
float cardAlpha = 0;
float iconAlpha = 0;
if (viewCenterHorizontal < parentFirstThird && mStack.getAllowedSwipeDirections() != Stack.SWIPE_DIRECTION_ONLY_RIGHT) {
cardAlpha = mAlpha - mAlpha/2;
iconAlpha = mAlpha + mAlpha*2;
} else if (viewCenterHorizontal > parentLastThird && mStack.getAllowedSwipeDirections() != Stack.SWIPE_DIRECTION_ONLY_LEFT) {
cardAlpha = mAlpha - mAlpha/2;
iconAlpha = mAlpha + mAlpha*2;
} else {
cardAlpha = mAlpha/2;
iconAlpha = mAlpha*2;
}
((MatchCard) mObservedView).desisionIcon.setAlpha(iconAlpha);
mStack.onSwipeProgress(swipeProgress);
if (mRotateDegrees > 0) {
float rotation = mRotateDegrees * swipeProgress;
mObservedView.setRotation(rotation);
}
if (mOpacityEnd < 1f) {
float alpha = 1 - Math.min(Math.abs(swipeProgress * 2), 1);
mObservedView.setAlpha(alpha);
}
return true;
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
mStack.onSwipeEnd();
checkViewPosition();
if(mDownX - event.getX() == 0 && mDownY - event.getY() == 0) {
mSwipeStack.onTap();
}
swipeDirection = SwipeDirection.None;
return true;
}
return false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if(!mListenForTouchEvents || !mStack.isEnabled()) {
return false;
}
v.getParent().requestDisallowInterceptTouchEvent(true);
mStack.onSwipeStart();
mPointerId = event.getPointerId(0);
mDownX = event.getX(mPointerId);
mDownY = event.getY(mPointerId);
return true;
case MotionEvent.ACTION_MOVE:
int pointerIndex = event.findPointerIndex(mPointerId);
if (pointerIndex < 0) return false;
float dx = event.getX(pointerIndex) - mDownX;
float dy = event.getY(pointerIndex) - mDownY;
float newX = mObservedView.getX() + dx;
float newY = mObservedView.getY() + dy;
mObservedView.setX(newX);
mObservedView.setY(newY);
float dragDistanceX = newX - mInitialX;
float swipeProgress = Math.min(Math.max(
dragDistanceX / mStack.getWidth(), -1), 1);
setSwipeDirection(swipeProgress);
float viewCenterHorizontal = mObservedView.getX() + (mObservedView.getWidth() / 2);
float parentFirstThird = mStack.getWidth() / 4f;
float parentLastThird = parentFirstThird * 3;
float mAlpha = Math.abs(swipeProgress);
float cardAlpha = 0;
float iconAlpha = 0;
if (viewCenterHorizontal < parentFirstThird && mStack.getAllowedSwipeDirections() != Stack.SWIPE_DIRECTION_ONLY_RIGHT) {
cardAlpha = mAlpha - mAlpha/2;
iconAlpha = mAlpha + mAlpha*2;
} else if (viewCenterHorizontal > parentLastThird && mStack.getAllowedSwipeDirections() != Stack.SWIPE_DIRECTION_ONLY_LEFT) {
cardAlpha = mAlpha - mAlpha/2;
iconAlpha = mAlpha + mAlpha*2;
} else {
cardAlpha = mAlpha/2;
iconAlpha = mAlpha*2;
}
((MatchCard) mObservedView).desisionIcon.setAlpha(iconAlpha);
mStack.onSwipeProgress(swipeProgress);
if (mRotateDegrees > 0) {
float rotation = mRotateDegrees * swipeProgress;
mObservedView.setRotation(rotation);
}
if (mOpacityEnd < 1f) {
float alpha = 1 - Math.min(Math.abs(swipeProgress * 2), 1);
mObservedView.setAlpha(alpha);
}
return true;
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
mStack.onSwipeEnd();
checkViewPosition();
if(mDownX - event.getX() == 0 && mDownY - event.getY() == 0) {
mSwipeStack.onTap();
}
swipeDirection = SwipeDirection.None;
return true;
}
return false;
}
au...@google.com <au...@google.com> #8
You should remove v.getParent().requestDisallowInterceptTouchEvent(false); That should probably fix your issue. The way touch event streams work is that once you start intercepting then you should continue all the way otherwise you might get into weird states.
I am *guessing* that this happens with multi-pointer (multi finger) touch where you get up from one pointer, but the other is still down, that calls requestDisallowInterceptTouchEvent(false) and then you are in the state of getting ACTION_MOVE without ACTION_DOWN.
I am *guessing* that this happens with multi-pointer (multi finger) touch where you get up from one pointer, but the other is still down, that calls requestDisallowInterceptTouchEvent(false) and then you are in the state of getting ACTION_MOVE without ACTION_DOWN.
[Deleted User] <[Deleted User]> #9
I'll test it.
Thank you. Your guess sounds very plausible
Thank you. Your guess sounds very plausible
[Deleted User] <[Deleted User]> #10
[Comment deleted]
al...@android.com <al...@android.com> #11
Released in 24.1.0.
Description
- Samsung gt_i9060i Android 4,4,4
- Samsung SM-G530H Android 4.4.4
- Samsung sm_g361h Android 5.1.1
- Samsung SM-J200F Android 5.1.1
- Samsung sm_g530h
- Condor pgn513 Android 5.1
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at android.support.v4.widget.ViewDragHelper.saveLastMotion(ViewDragHelper.java:849)
at android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(ViewDragHelper.java:1057)
at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:1434)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1996)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2519)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2519)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2519)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2519)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2519)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2171)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2485)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1801)
at android.app.Activity.dispatchTouchEvent(Activity.java:2797)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2446)
at android.view.View.dispatchPointerEvent(View.java:8806)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4662)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4520)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4034)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4087)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4053)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4190)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4061)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4247)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4034)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4087)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4053)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4061)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4034)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6463)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6437)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6390)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6622)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(InputEventReceiver.java)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6581)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6648)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:800)
at android.view.Choreographer.doCallbacks(Choreographer.java:603)
at android.view.Choreographer.doFrame(Choreographer.java:570)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:786)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)