diff options
author | Nick Chalko <nchalko@google.com> | 2017-10-03 10:16:37 -0700 |
---|---|---|
committer | Nick Chalko <nchalko@google.com> | 2017-10-04 13:48:13 +0000 |
commit | 6ebde20b03db4c0d57f67acaac11832b610b966b (patch) | |
tree | d31e2adc1f9cce4f27ca07d30bee921032e33a3c /src/com/android/tv/menu/MenuLayoutManager.java | |
parent | ee027a576ddebaf1ae739219be01b0240b15f80c (diff) | |
download | TV-6ebde20b03db4c0d57f67acaac11832b610b966b.tar.gz |
Sync to match Live Channels 1.15(ncis)oreo-mr1-dev
aka ub-tv-dev at a73a150bb7d0d1ce867ef980c6ac8411899d40ad
Bug: 64021596
Change-Id: I7c544fd15e2c58784f8babc31877ad0dfeebb4c0
(cherry picked from commit 633eb826b8c97731dfc5ef12c7bf78a63734275d)
Diffstat (limited to 'src/com/android/tv/menu/MenuLayoutManager.java')
-rw-r--r-- | src/com/android/tv/menu/MenuLayoutManager.java | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/src/com/android/tv/menu/MenuLayoutManager.java b/src/com/android/tv/menu/MenuLayoutManager.java index 6c767247..173d4004 100644 --- a/src/com/android/tv/menu/MenuLayoutManager.java +++ b/src/com/android/tv/menu/MenuLayoutManager.java @@ -28,6 +28,7 @@ import android.support.annotation.UiThread; import android.support.v4.view.animation.FastOutLinearInInterpolator; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.support.v4.view.animation.LinearOutSlowInInterpolator; +import android.support.v7.widget.RecyclerView; import android.util.Log; import android.util.Property; import android.view.View; @@ -56,12 +57,14 @@ public class MenuLayoutManager { // The visible duration of the title before it is hidden. private static final long TITLE_SHOW_DURATION_BEFORE_HIDDEN_MS = TimeUnit.SECONDS.toMillis(2); + private static final int INVALID_POSITION = -1; private final MenuView mMenuView; private final List<MenuRow> mMenuRows = new ArrayList<>(); private final List<MenuRowView> mMenuRowViews = new ArrayList<>(); private final List<Integer> mRemovingRowViews = new ArrayList<>(); - private int mSelectedPosition = -1; + private int mSelectedPosition = INVALID_POSITION; + private int mPendingSelectedPosition = INVALID_POSITION; private final int mRowAlignFromBottom; private final int mRowContentsPaddingTop; @@ -130,8 +133,8 @@ public class MenuLayoutManager { MenuRowView currentView = mMenuRowViews.get(mSelectedPosition); if (currentView.getVisibility() == View.GONE) { // If the selected row is not visible, select the first visible row. - int firstVisiblePosition = findNextVisiblePosition(-1); - if (firstVisiblePosition != -1) { + int firstVisiblePosition = findNextVisiblePosition(INVALID_POSITION); + if (firstVisiblePosition != INVALID_POSITION) { mSelectedPosition = firstVisiblePosition; } else { // No rows are visible. @@ -157,6 +160,10 @@ public class MenuLayoutManager { view.onDeselected(); } } + + if (mPendingSelectedPosition != INVALID_POSITION) { + setSelectedPositionSmooth(mPendingSelectedPosition); + } } private int findNextVisiblePosition(int start) { @@ -166,7 +173,7 @@ public class MenuLayoutManager { return i; } } - return -1; + return INVALID_POSITION; } private void dumpChildren(String prefix) { @@ -327,6 +334,7 @@ public class MenuLayoutManager { mMenuRowViews.get(mSelectedPosition).onDeselected(); } mSelectedPosition = position; + mPendingSelectedPosition = INVALID_POSITION; if (Utils.isIndexValid(mMenuRowViews, mSelectedPosition)) { mMenuRowViews.get(mSelectedPosition).onSelected(false); } @@ -380,14 +388,29 @@ public class MenuLayoutManager { // again from the intermediate state. mTitleFadeOutAnimator.cancel(); } - final int oldPosition = mSelectedPosition; - mSelectedPosition = position; if (DEBUG) dumpChildren("startRowAnimation()"); - MenuRowView currentView = mMenuRowViews.get(position); // Show the children of the next row. - currentView.getTitleView().setVisibility(View.VISIBLE); - currentView.getContentsView().setVisibility(View.VISIBLE); + final MenuRowView currentView = mMenuRowViews.get(position); + TextView currentTitleView = currentView.getTitleView(); + View currentContentsView = currentView.getContentsView(); + currentTitleView.setVisibility(View.VISIBLE); + currentContentsView.setVisibility(View.VISIBLE); + if (currentView instanceof PlayControlsRowView) { + ((PlayControlsRowView) currentView).onPreselected(); + } + // When contents view's visibility is gone, layouting might be delayed until it's shown and + // thus cause onBindViewHolder() and menu action updating occurs in front of users' sight. + // Therefore we call requestLayout() here if there are pending adapter updates. + if (currentContentsView instanceof RecyclerView + && ((RecyclerView) currentContentsView).hasPendingAdapterUpdates()) { + currentContentsView.requestLayout(); + mPendingSelectedPosition = position; + return; + } + final int oldPosition = mSelectedPosition; + mSelectedPosition = position; + mPendingSelectedPosition = INVALID_POSITION; // Request focus after the new contents view shows up. mMenuView.requestFocus(); if (mTempTitleViewForOld == null) { @@ -407,7 +430,7 @@ public class MenuLayoutManager { // Old row. MenuRow oldRow = mMenuRows.get(oldPosition); - MenuRowView oldView = mMenuRowViews.get(oldPosition); + final MenuRowView oldView = mMenuRowViews.get(oldPosition); View oldContentsView = oldView.getContentsView(); // Old contents view. animators.add(createAlphaAnimator(oldContentsView, 1.0f, 0.0f, 1.0f, mLinearOutSlowIn) @@ -468,8 +491,6 @@ public class MenuLayoutManager { } // Current row. Rect currentLayoutRect = new Rect(layouts.get(position)); - TextView currentTitleView = currentView.getTitleView(); - View currentContentsView = currentView.getContentsView(); currentContentsView.setAlpha(0.0f); if (scrollDown) { // Current title view. @@ -529,7 +550,7 @@ public class MenuLayoutManager { int nextPosition; if (scrollDown) { nextPosition = findNextVisiblePosition(position); - if (nextPosition != -1) { + if (nextPosition != INVALID_POSITION) { MenuRowView nextView = mMenuRowViews.get(nextPosition); Rect nextLayoutRect = layouts.get(nextPosition); animators.add(createTranslationYAnimator(nextView, @@ -539,7 +560,7 @@ public class MenuLayoutManager { } } else { nextPosition = findNextVisiblePosition(oldPosition); - if (nextPosition != -1) { + if (nextPosition != INVALID_POSITION) { MenuRowView nextView = mMenuRowViews.get(nextPosition); animators.add(createTranslationYAnimator(nextView, 0, mRowScrollUpAnimationOffset)); animators.add(createAlphaAnimator(nextView, @@ -572,9 +593,8 @@ public class MenuLayoutManager { for (ViewPropertyValueHolder holder : propertyValuesAfterAnimation) { holder.property.set(holder.view, holder.value); } - oldTitleView.setVisibility(View.VISIBLE); - mMenuRowViews.get(oldPosition).onDeselected(); - mMenuRowViews.get(position).onSelected(true); + oldView.onDeselected(); + currentView.onSelected(true); mTempTitleViewForOld.setVisibility(View.GONE); mTempTitleViewForCurrent.setVisibility(View.GONE); layout(mMenuView.getLeft(), mMenuView.getTop(), mMenuView.getRight(), |