Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java |
index 56073eb873ebab2a771b054d55267835a6a1170f..72bbdee20dee6efaca228843ab431f77f89f90fa 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java |
@@ -29,9 +29,6 @@ |
import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; |
import org.chromium.chrome.browser.util.ViewUtils; |
-import java.util.HashMap; |
-import java.util.Map; |
- |
/** |
* Simple wrapper on top of a RecyclerView that will acquire focus when tapped. Ensures the |
* New Tab page receives focus when clicked. |
@@ -51,13 +48,6 @@ |
* for their removal animation and avoid moving the scroll position. |
*/ |
private int mCompensationHeight; |
- |
- /** |
- * Height compensation value for each item being dismissed. Since dismissals sometimes include |
- * sibling elements, and these don't get the standard treatment, we track the total height |
- * associated with the element the user interacted with. |
- */ |
- private final Map<ViewHolder, Integer> mCompensationHeightMap = new HashMap<>(); |
/** View used to calculate the position of the cards' snap point. */ |
private View mAboveTheFoldView; |
@@ -181,23 +171,23 @@ |
* below the fold to push the header up to to the top of the screen. |
*/ |
int calculateBottomSpacing() { |
- int aboveTheFoldPosition = getNewTabPageAdapter().getAboveTheFoldPosition(); |
+ int firstHeaderPos = getNewTabPageAdapter().getFirstHeaderPosition(); |
int firstVisiblePos = mLayoutManager.findFirstVisibleItemPosition(); |
- if (aboveTheFoldPosition == RecyclerView.NO_POSITION |
+ if (firstHeaderPos == RecyclerView.NO_POSITION |
|| firstVisiblePos == RecyclerView.NO_POSITION) { |
return 0; |
} |
- // We have enough items to fill the view, since the above-the-fold item is not even visible. |
- if (firstVisiblePos > aboveTheFoldPosition) { |
+ // We have enough items to fill the view, since the snap point item is not even visible. |
+ if (firstVisiblePos > firstHeaderPos) { |
return 0; |
} |
ViewHolder lastContentItem = findLastContentItem(); |
- ViewHolder aboveTheFold = findViewHolderForAdapterPosition(aboveTheFoldPosition); |
+ ViewHolder firstHeader = findFirstHeader(); |
int bottomSpacing = getHeight() - mToolbarHeight; |
- if (lastContentItem == null || aboveTheFold == null) { |
+ if (lastContentItem == null || firstHeader == null) { |
// This can happen in several cases, where some elements are not visible and the |
// RecyclerView didn't already attach them. We handle it by just adding space to make |
// sure that we never run out and force the UI to jump around and get stuck in a |
@@ -208,14 +198,14 @@ |
// - Dismissing a snippet and having the status card coming to take its place. |
// - Refresh while being below the fold, for example by tapping the status card. |
- if (aboveTheFold != null) bottomSpacing -= aboveTheFold.itemView.getBottom(); |
+ if (firstHeader != null) bottomSpacing -= firstHeader.itemView.getTop(); |
Log.w(TAG, "The RecyclerView items are not attached, can't determine the content " |
+ "height: snap=%s, last=%s. Using full height: %d ", |
- aboveTheFold, lastContentItem, bottomSpacing); |
+ firstHeader, lastContentItem, bottomSpacing); |
} else { |
int contentHeight = |
- lastContentItem.itemView.getBottom() - aboveTheFold.itemView.getBottom(); |
+ lastContentItem.itemView.getBottom() - firstHeader.itemView.getTop(); |
bottomSpacing -= contentHeight - mCompensationHeight; |
} |
@@ -354,28 +344,15 @@ |
} |
/** Called when an item is in the process of being removed from the view. */ |
- public void onItemDismissStarted(ViewHolder viewHolder) { |
- assert !mCompensationHeightMap.containsKey(viewHolder); |
- |
- int dismissedHeight = viewHolder.itemView.getHeight(); |
- |
- ViewHolder siblingViewHolder = getNewTabPageAdapter().getDismissSibling(viewHolder); |
- if (siblingViewHolder != null) { |
- dismissedHeight += siblingViewHolder.itemView.getHeight(); |
- } |
- |
- mCompensationHeightMap.put(viewHolder, dismissedHeight); |
- mCompensationHeight += dismissedHeight; |
+ public void onItemDismissStarted(View itemView) { |
+ mCompensationHeight += itemView.getHeight(); |
refreshBottomSpacing(); |
} |
/** Called when an item has finished being removed from the view. */ |
- public void onItemDismissFinished(ViewHolder viewHolder) { |
- assert mCompensationHeightMap.containsKey(viewHolder); |
- mCompensationHeight -= mCompensationHeightMap.remove(viewHolder); |
- |
+ public void onItemDismissFinished(View itemView) { |
+ mCompensationHeight -= itemView.getHeight(); |
assert mCompensationHeight >= 0; |
- refreshBottomSpacing(); |
} |
/** |
@@ -424,13 +401,8 @@ |
if (peekingCardViewHolder != null && isFirstItemVisible()) { |
if (!mHasSpaceForPeekingCard) return; |
- ViewHolder firstHeaderViewHolder = findFirstHeader(); |
- // It is possible to have a card but no header, for example the sign in promo. |
- // That one does not peek. |
- if (firstHeaderViewHolder == null) return; |
- |
View peekingCardView = peekingCardViewHolder.itemView; |
- View headerView = firstHeaderViewHolder.itemView; |
+ View headerView = findFirstHeader().itemView; |
final int peekingHeight = getResources().getDimensionPixelSize( |
R.dimen.snippets_padding_and_peeking_card_height); |
@@ -500,13 +472,13 @@ |
animation.addListener(new AnimatorListenerAdapter() { |
@Override |
public void onAnimationStart(Animator animation) { |
- NewTabPageRecyclerView.this.onItemDismissStarted(viewHolder); |
+ NewTabPageRecyclerView.this.onItemDismissStarted(itemView); |
} |
@Override |
public void onAnimationEnd(Animator animation) { |
getNewTabPageAdapter().dismissItem(position); |
- NewTabPageRecyclerView.this.onItemDismissFinished(viewHolder); |
+ NewTabPageRecyclerView.this.onItemDismissFinished(itemView); |
} |
}); |
animation.start(); |