Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81abe87d authored by Chet Haase's avatar Chet Haase
Browse files

Fix Recent Apps jumping artifact

When removing an item from the Recents list such that the list went from
larger than the screen to smaller (bringing the first item completely into view)
there was an artifact where the list would jump briefly, just prior to running
the transition to animate the remaining items into place.

The problem was that the custom ScrollView classes in the Recents app were
manipulating the scrollX/Y values of the items as a side-effect of any resize
of the list. Meanwhile, the LayoutTransition was manipulating both the size and
the scroll position of the list. The transition's scroll values would get clobbered by
the app's side-effect operation, causing the jump that we'd see on the screen.

The fix was to disable the side-effect operation during a layout transition.

Change-Id: I17f3f05d0e8a792e41bd46869ee700f128e63216
parent 5e3f4000
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -165,6 +165,13 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        // Skip this work if a transition is running; it sets the scroll values independently
        // and should not have those animated values clobbered by this logic
        LayoutTransition transition = mLinearLayout.getLayoutTransition();
        if (transition != null && transition.isRunning()) {
            return;
        }
        // Keep track of the last visible item in the list so we can restore it
        // to the bottom when the orientation changes.
        mLastScrollPosition = scrollPositionOfMostRecent();
@@ -172,8 +179,13 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
        // This has to happen post-layout, so run it "in the future"
        post(new Runnable() {
            public void run() {
                // Make sure we're still not clobbering the transition-set values, since this
                // runnable launches asynchronously
                LayoutTransition transition = mLinearLayout.getLayoutTransition();
                if (transition == null || !transition.isRunning()) {
                    scrollTo(mLastScrollPosition, 0);
                }
            }
        });
    }

+13 −1
Original line number Diff line number Diff line
@@ -166,6 +166,13 @@ public class RecentsVerticalScrollView extends ScrollView implements SwipeHelper
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        // Skip this work if a transition is running; it sets the scroll values independently
        // and should not have those animated values clobbered by this logic
        LayoutTransition transition = mLinearLayout.getLayoutTransition();
        if (transition != null && transition.isRunning()) {
            return;
        }
        // Keep track of the last visible item in the list so we can restore it
        // to the bottom when the orientation changes.
        mLastScrollPosition = scrollPositionOfMostRecent();
@@ -173,8 +180,13 @@ public class RecentsVerticalScrollView extends ScrollView implements SwipeHelper
        // This has to happen post-layout, so run it "in the future"
        post(new Runnable() {
            public void run() {
                // Make sure we're still not clobbering the transition-set values, since this
                // runnable launches asynchronously
                LayoutTransition transition = mLinearLayout.getLayoutTransition();
                if (transition == null || !transition.isRunning()) {
                    scrollTo(0, mLastScrollPosition);
                }
            }
        });
    }