Haptic-Apps / Slide

Slide is an open-source, ad-free Reddit browser for Android.
https://reddit.com/r/slideforreddit
GNU General Public License v3.0
1.78k stars 344 forks source link

Crash when dragging subreddit to bottom in 'Manage your subreddits' #2196

Closed NBonaparte closed 8 years ago

NBonaparte commented 8 years ago

Dragging a subreddit to the bottom of the screen in the 'Manage your subreddits' page causes an 'Unfortunately, Slide has stopped' error. Slide version: 5.4.3.7 Android version: 6.0.1

Nxt3 commented 8 years ago

Stacktrace. It's an IndexOutOfBoundsException()

09-28 16:37:00.048 6441-6441/me.ccrama.redditslide.debug E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: me.ccrama.redditslide.debug, PID: 6441
                                                                           java.lang.IndexOutOfBoundsException: Index: 16, Size: 15
                                                                               at java.util.ArrayList.add(ArrayList.java:457)
                                                                               at me.ccrama.redditslide.DragSort.ReorderSubreddits$3.onItemMoved(ReorderSubreddits.java:268)
                                                                               at me.ccrama.redditslide.DragSort.DragSortRecycler.onTouchEvent(DragSortRecycler.java:315)
                                                                               at android.support.v7.widget.RecyclerView.dispatchOnItemTouch(RecyclerView.java:2464)
                                                                               at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2607)
                                                                               at android.view.View.dispatchTouchEvent(View.java:9939)
                                                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
                                                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2344)
                                                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                               at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                                                                               at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
                                                                               at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411)
                                                                               at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810)
                                                                               at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                                                                               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.DecorView.dispatchTouchEvent(DecorView.java:373)
                                                                               at android.view.View.dispatchPointerEvent(View.java:10159)
                                                                               at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4434)
                                                                               at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302)
                                                                               at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                               at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
                                                                               at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
                                                                               at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995)
                                                                               at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
                                                                               at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052)
                                                                               at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                               at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
                                                                               at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
                                                                               at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
                                                                               at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                                                                               at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210)
                                                                               at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184)
                                                                               at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145)
                                                                               at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6313)
                                                                               at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                               at android.os.MessageQueue.nativePollOnce(Native Method)
                                                                               at android.os.MessageQueue.next(MessageQueue.java:323)
                                                                               at android.os.Looper.loop(Looper.java:136)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
09-28 16:37:00.048 6441-6441/me.ccrama.redditslide.debug E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Nxt3 commented 8 years ago

This is a tricky one. Thought I fixed it, but I created a different bug.

ccrama commented 8 years ago

Just changed

public void onItemMoved(int from, int to) {
                String item = subs.remove(from);
                subs.add(to, item);
                adapter.notifyDataSetChanged();
            }

to

public void onItemMoved(int from, int to) {
                if(to == subs.size()){
                    to -=1;
                }
                String item = subs.remove(from);
                subs.add(to, item);
                adapter.notifyDataSetChanged();
            }

seems to be working!