From 359d1aedae16065bdb4ac3d8617404ba899ce3c6 Mon Sep 17 00:00:00 2001 From: Andras Kloczl Date: Tue, 4 May 2021 22:25:27 +0200 Subject: [PATCH] Fix launcher navigation issue when using a controller When navigating in Launcher home using a controller, the mCurrentPage variable isn't updated properly which results in out of order navigation. Test: manual Before: http://shortn/_c8A8mKiplN After: http://shortn/_ctxIaweqZY Bug: 187205980 Change-Id: I9ff4019b608e999749c4d0835cc3ceb35be93a3f --- src/com/android/launcher3/PagedView.java | 27 ++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index fb216987c9..8607fd5e75 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -835,18 +835,25 @@ public abstract class PagedView extends ViewGrou return; } + // Add the current page's views as focusable and the next possible page's too. If the + // last focus change action was left then the left neighbour's views will be added, and + // if it was right then the right neighbour's views will be added. + // Unfortunately mCurrentPage can be outdated if there were multiple control actions in a + // short period of time, but mNextPage is up to date because it is always updated by + // method snapToPage. + int nextPage = getNextPage(); // XXX-RTL: This will be fixed in a future CL - if (mCurrentPage >= 0 && mCurrentPage < getPageCount()) { - getPageAt(mCurrentPage).addFocusables(views, direction, focusableMode); + if (nextPage >= 0 && nextPage < getPageCount()) { + getPageAt(nextPage).addFocusables(views, direction, focusableMode); } if (direction == View.FOCUS_LEFT) { - if (mCurrentPage > 0) { - int nextPage = validateNewPage(mCurrentPage - 1); + if (nextPage > 0) { + nextPage = validateNewPage(nextPage - 1); getPageAt(nextPage).addFocusables(views, direction, focusableMode); } } else if (direction == View.FOCUS_RIGHT) { - if (mCurrentPage < getPageCount() - 1) { - int nextPage = validateNewPage(mCurrentPage + 1); + if (nextPage < getPageCount() - 1) { + nextPage = validateNewPage(nextPage + 1); getPageAt(nextPage).addFocusables(views, direction, focusableMode); } } @@ -1416,6 +1423,14 @@ public abstract class PagedView extends ViewGrou @Override public void requestChildFocus(View child, View focused) { super.requestChildFocus(child, focused); + + // In case the device is controlled by a controller, mCurrentPage isn't updated properly + // which results in incorrect navigation + int nextPage = getNextPage(); + if (nextPage != mCurrentPage) { + setCurrentPage(nextPage); + } + int page = indexToPage(indexOfChild(child)); if (page >= 0 && page != getCurrentPage() && !isInTouchMode()) { snapToPage(page);