Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java

Issue 2273713002: 📰Use the scroll offset to stop the card from peeking (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix test Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 7d1e6c8d752be43836b7df69d38c5f27aaa16267..ea9d3b60b14dd79485828d0552d24ea906375185 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
@@ -33,6 +33,7 @@
private final LinearLayoutManager mLayoutManager;
private final int mToolbarHeight;
private final int mMinBottomSpacing;
+ private final int mMaxHeaderHeight;
/**
* Total height of the items being dismissed. Tracked to allow the bottom space to compensate
@@ -46,6 +47,9 @@
/** Whether the RecyclerView should react to touch events. */
private boolean mTouchEnabled = true;
+ /** Whether the above-the-fold left space for a peeking card to be displayed. */
+ private boolean mHasSpaceForPeekingCard;
+
/**
* Constructor needed to inflate from XML.
*/
@@ -69,6 +73,7 @@ public boolean onSingleTapUp(MotionEvent e) {
+ res.getDimensionPixelSize(R.dimen.toolbar_progress_bar_height);
mMinBottomSpacing =
res.getDimensionPixelSize(R.dimen.ntp_min_bottom_spacing_recycler_view);
+ mMaxHeaderHeight = res.getDimensionPixelSize(R.dimen.snippets_article_header_height);
}
public boolean isFirstItemVisible() {
@@ -127,6 +132,10 @@ public void setAboveTheFoldView(View aboveTheFoldView) {
mAboveTheFoldView = aboveTheFoldView;
}
+ public void setHasSpaceForPeekingCard(boolean hasSpaceForPeekingCard) {
+ mHasSpaceForPeekingCard = hasSpaceForPeekingCard;
+ }
+
/** Scroll up from the cards' current position and snap to present the first one. */
public void scrollToFirstCard() {
// Offset the target scroll by the height of the omnibox (the top padding).
@@ -196,35 +205,39 @@ int calculateBottomSpacing() {
return Math.max(mMinBottomSpacing, bottomSpacing);
}
- /**
- * Refresh the peeking state of the first card.
- */
- public void updatePeekingCard() {
+ public void updatePeekingCardAndHeader() {
+ NewTabPageLayout aboveTheFoldView = findAboveTheFoldView();
+ if (aboveTheFoldView == null) return;
+
+ SectionHeaderViewHolder header = findFirstHeader();
+ if (header == null) return;
+
+ header.updateDisplay(computeVerticalScrollOffset(), mHasSpaceForPeekingCard);
+
CardViewHolder firstCard = findFirstCard();
- if (firstCard == null) return;
+ if (firstCard != null) updatePeekingCard(firstCard);
- if (firstCard.itemView.isShown()) {
- if (findAboveTheFoldView() == null) return;
- firstCard.setCanPeek(findAboveTheFoldView().hasSpaceForPeekingCard());
- firstCard.updatePeek();
- }
+ // Update the space at the bottom, which needs to know about the height of the header.
+ refreshBottomSpacing();
}
/**
- * Show the snippets header when the user scrolls down and snippet articles starts reaching the
- * top of the screen.
+ * Updates the peeking state of the provided card. Relies on the dimensions of the header to
+ * be correct, prefer {@link #updatePeekingCardAndHeader} that updates both together.
*/
- public void updateSnippetsHeaderDisplay() {
+ public void updatePeekingCard(CardViewHolder peekingCard) {
SectionHeaderViewHolder header = findFirstHeader();
- if (header == null) return;
-
- if (findAboveTheFoldView() == null) return;
- header.setCanTransition(findAboveTheFoldView().hasSpaceForPeekingCard());
- // Start doing the calculations if the snippet header is currently shown on screen.
- header.updateDisplay();
+ if (header == null) {
+ // No header, we must have scrolled quite far. Fallback to a non animated (full bleed)
+ // card.
+ peekingCard.updatePeek(0, /* shouldAnimate */ false);
+ return;
+ }
- // Update the space at the bottom, which needs to know about the height of the header.
- refreshBottomSpacing();
+ // Here we consider that if the header is animating (is not completely expanded), the card
+ // should as well. In that case, the space below the header is what we have available.
+ boolean shouldAnimate = header.itemView.getHeight() < mMaxHeaderHeight;
+ peekingCard.updatePeek(getHeight() - header.itemView.getBottom(), shouldAnimate);
}
public NewTabPageAdapter getNewTabPageAdapter() {
@@ -347,8 +360,7 @@ public void snapScroll(View fakeBox, int parentScrollY, int parentHeight) {
// and to allow the peeking card to peek a bit before snapping back.
CardViewHolder peekingCardViewHolder = findFirstCard();
if (peekingCardViewHolder != null && isFirstItemVisible()) {
-
- if (!peekingCardViewHolder.getCanPeek()) return;
+ if (!mHasSpaceForPeekingCard) return;
View peekingCardView = peekingCardViewHolder.itemView;
View headerView = findFirstHeader().itemView;

Powered by Google App Engine
This is Rietveld 408576698