Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetHeaderViewHolder.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetHeaderViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetHeaderViewHolder.java |
index 919a1d243b767a962b0c94c84f5dcf9ff5385120..28ec164bb7f56cc8b4abbc45f595964659421568 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetHeaderViewHolder.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetHeaderViewHolder.java |
@@ -4,9 +4,6 @@ |
package org.chromium.chrome.browser.ntp.snippets; |
-import android.animation.Animator; |
-import android.animation.AnimatorListenerAdapter; |
-import android.animation.ObjectAnimator; |
import android.support.v7.widget.RecyclerView; |
import android.view.LayoutInflater; |
import android.view.View; |
@@ -14,90 +11,64 @@ import android.view.ViewGroup; |
import org.chromium.chrome.R; |
import org.chromium.chrome.browser.ntp.cards.NewTabPageListItem; |
+import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView; |
import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder; |
+import org.chromium.chrome.browser.util.MathUtils; |
/** |
* A class that represents the view for a single card snippet. |
*/ |
public class SnippetHeaderViewHolder extends NewTabPageViewHolder { |
- private static final int ANIMATION_DURATION_MS = 300; |
+ private static final double SCROLL_HEADER_HEIGHT_PERCENTAGE = 0.7; |
private final int mMaxSnippetHeaderHeight; |
+ private final int mMaxPeekPadding; |
+ private final NewTabPageRecyclerView mRecyclerView; |
+ |
private SnippetHeaderListItem mHeader; |
- private Animator mAnimator; |
public static View createView(ViewGroup parent) { |
return LayoutInflater.from(parent.getContext()) |
.inflate(R.layout.new_tab_page_snippets_card, parent, false); |
} |
- public SnippetHeaderViewHolder(final View cardView) { |
+ public SnippetHeaderViewHolder(final View cardView, final NewTabPageRecyclerView recyclerView) { |
super(cardView); |
mMaxSnippetHeaderHeight = cardView.getResources().getDimensionPixelSize( |
R.dimen.snippets_article_header_height); |
+ |
+ mMaxPeekPadding = cardView.getResources().getDimensionPixelSize( |
+ R.dimen.snippets_padding_and_peeking_card_height); |
+ |
+ mRecyclerView = recyclerView; |
} |
@Override |
public void onBindViewHolder(NewTabPageListItem header) { |
mHeader = (SnippetHeaderListItem) header; |
- animateFade(); |
+ updateDisplay(); |
} |
/** |
- * Update the view for the scroll-triggered fade in/out animation. |
- * @param omniBoxHeight The height of the omnibox displayed over the NTP, we use this to offset |
- * the start point of the transition. |
+ * Update the view for the fade in/out and heading height. |
*/ |
- public void onScrolled(int omniBoxHeight) { |
+ public void updateDisplay() { |
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) itemView.getLayoutParams(); |
int headerHeight = 0; |
- |
- // Measurement used to multiply the max snippet height to get a range on when to start |
- // modifying the display of article header. |
- final int numberHeaderHeight = 2; |
- // Used to indicate when to start modifying the snippet header. |
- int heightToStartChangingHeader = mMaxSnippetHeaderHeight * numberHeaderHeight; |
int snippetHeaderTop = itemView.getTop(); |
- |
- // Check if snippet header top is within range to start showing the snippet header. |
- if (snippetHeaderTop < omniBoxHeight + heightToStartChangingHeader) { |
- // The amount of space the article header has scrolled into the |
- // |heightToStartChangingHeader|. |
- int amountScrolledIntoHeaderSpace = |
- heightToStartChangingHeader - (snippetHeaderTop - omniBoxHeight); |
- |
- // Remove the |numberHeaderHeight| to get the actual header height we want to |
- // display. Never let the height be more than the |maxSnippetHeaderHeight|. |
- headerHeight = Math.min( |
- amountScrolledIntoHeaderSpace / numberHeaderHeight, mMaxSnippetHeaderHeight); |
- |
+ int recyclerViewHeight = mRecyclerView.getHeight(); |
+ |
+ // Check if snippet header top is within range to start showing. Set the header height, this |
+ // is a percentage of how much is scrolled. The balance of the scroll will |
+ // be used to display the peeking card. |
+ int amountScrolled = (recyclerViewHeight - mMaxPeekPadding) - snippetHeaderTop; |
+ if (mHeader.isVisible()) { |
+ headerHeight = MathUtils.clamp((int) (amountScrolled * SCROLL_HEADER_HEIGHT_PERCENTAGE), |
+ 0, mMaxSnippetHeaderHeight); |
} |
- if (mHeader.isVisible()) itemView.setAlpha((float) headerHeight / mMaxSnippetHeaderHeight); |
+ itemView.setAlpha((float) headerHeight / mMaxSnippetHeaderHeight); |
params.height = headerHeight; |
- itemView.setLayoutParams(params); |
- } |
- |
- /** |
- * Make the header fade in or out depending on the model's state. |
- * @see SnippetHeaderListItem#isVisible() |
- */ |
- private void animateFade() { |
- if (mAnimator != null) mAnimator.cancel(); |
- |
- float currentAlpha = itemView.getAlpha(); |
- float targetAlpha = mHeader.isVisible() ? 1f : 0f; |
- |
- if (currentAlpha == targetAlpha) return; |
- |
- mAnimator = ObjectAnimator.ofFloat(itemView, View.ALPHA, currentAlpha, targetAlpha); |
- mAnimator.setDuration(ANIMATION_DURATION_MS); |
- mAnimator.addListener(new AnimatorListenerAdapter() { |
- @Override |
- public void onAnimationEnd(Animator animator) { |
- mAnimator = null; |
- } |
- }); |
- mAnimator.start(); |
+ itemView.requestLayout(); |
} |
} |