PeterStaev / nativescript-image-swipe

A NativeScript widget to easily :point_up_2: and :mag: through a list of images
Apache License 2.0
35 stars 21 forks source link

Crashing on android with IllegalArgumentException: pointerIndex out of range #16

Closed 000panther closed 5 years ago

000panther commented 6 years ago

When zooming into images, the image scroll does in more than half of the cases reset to 0,0. Additionally, the demo crashes after some zooming operations with this error message:

This happens in our integration, as well as in the current demo app.

System.err: com.tns.NativeScriptException: 
System.err: Calling js method onInterceptTouchEvent failed
System.err: 
System.err: Error: java.lang.IllegalArgumentException: pointerIndex out of range
System.err:     android.view.MotionEvent.nativeGetAxisValue(Native Method)
System.err:     android.view.MotionEvent.getX(MotionEvent.java:2201)
System.err:     android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2063)
System.err:     com.tns.Runtime.callJSMethodNative(Native Method)
System.err:     com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1084)
System.err:     com.tns.Runtime.callJSMethodImpl(Runtime.java:966)
System.err:     com.tns.Runtime.callJSMethod(Runtime.java:953)
System.err:     com.tns.Runtime.callJSMethod(Runtime.java:937)
System.err:     com.tns.Runtime.callJSMethod(Runtime.java:929)
System.err:     com.tns.gen.android.support.v4.view.ViewPager_frnal_ts_helpers_l58_c38__StateViewPager.onInterceptTouchEvent(ViewPager_frnal_ts_helpers_l58_c38__StateViewPager.java:17)
System.err:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2504)
System.err:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:445)
System.err:     com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1828)
System.err:     android.app.Activity.dispatchTouchEvent(Activity.java:3292)
System.err:     com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:407)
System.err:     android.view.View.dispatchPointerEvent(View.java:11960)
System.err:     android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4776)
System.err:     android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4590)
System.err:     android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
System.err:     android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
System.err:     android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
System.err:     android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4274)
System.err:     android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155)
System.err:     android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4331)
System.err:     android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
System.err:     android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
System.err:     android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
System.err:     android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155)
System.err:     android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
System.err:     android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6642)
System.err:     android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6616)
System.err:     android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6577)
System.err:     android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6745)
System.err:     android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
System.err:     android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
System.err:     android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
System.err:     android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6716)
System.err:     android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6768)
System.err:     android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
System.err:     android.view.Choreographer.doCallbacks(Choreographer.java:723)
System.err:     android.view.Choreographer.doFrame(Choreographer.java:652)
System.err:     android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
System.err:     android.os.Handler.handleCallback(Handler.java:789)
System.err:     android.os.Handler.dispatchMessage(Handler.java:98)
System.err:     android.os.Looper.loop(Looper.java:164)
System.err:     android.app.ActivityThread.main(ActivityThread.java:6541)
System.err:     java.lang.reflect.Method.invoke(Native Method)
System.err:     com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
System.err:     com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
System.err: File: "file:///data/data/com.tangrainc.imageswipedemo/files/app/tns_modules/nativescript-image-swipe/image-swipe.js, line: 116, column: 58
System.err: 
System.err: StackTrace: 
System.err:     Frame: function:'StateViewPager.onInterceptTouchEvent', file:'file:///data/data/com.tangrainc.imageswipedemo/files/app/tns_modules/nativescript-image-swipe/image-swipe.js', line: 116, column: 59
System.err: 
System.err:     at com.tns.Runtime.callJSMethodNative(Native Method)
System.err:     at com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1084)
System.err:     at com.tns.Runtime.callJSMethodImpl(Runtime.java:966)
System.err:     at com.tns.Runtime.callJSMethod(Runtime.java:953)
System.err:     at com.tns.Runtime.callJSMethod(Runtime.java:937)
System.err:     at com.tns.Runtime.callJSMethod(Runtime.java:929)
System.err:     at com.tns.gen.android.support.v4.view.ViewPager_frnal_ts_helpers_l58_c38__StateViewPager.onInterceptTouchEvent(ViewPager_frnal_ts_helpers_l58_c38__StateViewPager.java:17)
System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2504)
System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
System.err:     at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:445)
System.err:     at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1828)
System.err:     at android.app.Activity.dispatchTouchEvent(Activity.java:3292)
System.err:     at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:407)
System.err:     at android.view.View.dispatchPointerEvent(View.java:11960)
System.err:     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4776)
System.err:     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4590)
System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
System.err:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
System.err:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
System.err:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4274)
System.err:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155)
System.err:     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4331)
System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
System.err:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
System.err:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
System.err:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155)
System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
System.err:     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6642)
System.err:     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6616)
System.err:     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6577)
System.err:     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6745)
System.err:     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
System.err:     at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
System.err:     at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
System.err:     at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6716)
System.err:     at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6768)
System.err:     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
System.err:     at android.view.Choreographer.doCallbacks(Choreographer.java:723)
System.err:     at android.view.Choreographer.doFrame(Choreographer.java:652)
System.err:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
System.err:     at android.os.Handler.handleCallback(Handler.java:789)
System.err:     at android.os.Handler.dispatchMessage(Handler.java:98)
System.err:     at android.os.Looper.loop(Looper.java:164)
System.err:     at android.app.ActivityThread.main(ActivityThread.java:6541)
System.err:     at java.lang.reflect.Method.invoke(Native Method)
System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
System.err: Caused by: java.lang.IllegalArgumentException: pointerIndex out of range
System.err:     at android.view.MotionEvent.nativeGetAxisValue(Native Method)
System.err:     at android.view.MotionEvent.getX(MotionEvent.java:2201)
System.err:     at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2063)
System.err:     ... 58 more

Device: Nexus 6P Android Version: 8.0.0

000panther commented 6 years ago

O.K. I found both issues for my use case, but they are not yet ready for a pull request.

The random reset of the view was caused by the OrientationListener.onOrientationChanged event. This seems to be the wrong listener, it fires multiple times per second and returns the degrees instead of an Orientation. The correct listener seems to be the onConfigurationChanged Listener, but for my use case orientation changes do not matter so i did not yet implement this.

https://stackoverflow.com/questions/5726657/how-to-detect-orientation-change-in-layout-in-android

Additionally, In the onInterceptTouchEvent I added a try catch clause, but after the change on top, it did not seem to throw anymore.

PeterStaev commented 6 years ago

Hey @000panther , I just had the chance to test this under Android 7.0 and Android 8.0 on the simulator and sadly I cannot simulate neither the crash nor the reset scroll. I've also added logging to the orientation change listener and I do not see it being called multiple times per second. It is fired couple of times when you rotate and then is being called when yous swipe through the images. So the event works as expected, and yes it receives the degrees which is ok.

Marking this with help wanted in case you or someone else can simulate this behavior and founds the root of it, I'm more than happy to accept PRs to fix whatever the problem is.

PeterStaev commented 5 years ago

No further response so closing this one for now. In case you still have problems, please provide more details.

romanran commented 5 years ago

Same thing happening here on Samsung tablet with Android 7.0. It happens if you zoom in, then zoom out fast. I dont use any props but src. I am using Vue, Vue.registerElement('ImageZoom', () => require('nativescript-image-zoom').ImageZoom)

romanran commented 5 years ago

Foudn this thread https://github.com/chrisbanes/PhotoView/issues/31