Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java |
| index b42064c877b624d1a66408c9fa19a409e4dbec9e..84f12fdb30357794dc1e15a35dc56efc831ad1cf 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java |
| @@ -13,6 +13,7 @@ import android.net.Uri; |
| import android.os.Build; |
| import android.os.SystemClock; |
| import android.support.v4.view.ViewCompat; |
| +import android.support.v7.widget.RecyclerView; |
| import android.view.ContextMenu; |
| import android.view.LayoutInflater; |
| import android.view.Menu; |
| @@ -22,6 +23,7 @@ import android.view.View; |
| import org.chromium.base.ApiCompatibilityUtils; |
| import org.chromium.base.Callback; |
| import org.chromium.base.CommandLine; |
| +import org.chromium.base.Log; |
| import org.chromium.base.ThreadUtils; |
| import org.chromium.base.VisibleForTesting; |
| import org.chromium.base.metrics.RecordHistogram; |
| @@ -69,6 +71,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelUtils; |
| import org.chromium.chrome.browser.tabmodel.document.TabDelegate; |
| import org.chromium.chrome.browser.util.UrlUtilities; |
| import org.chromium.content_public.browser.LoadUrlParams; |
| +import org.chromium.content_public.browser.NavigationController; |
| +import org.chromium.content_public.browser.NavigationEntry; |
| import org.chromium.content_public.common.Referrer; |
| import org.chromium.net.NetworkChangeNotifier; |
| import org.chromium.ui.base.DeviceFormFactor; |
| @@ -86,6 +90,7 @@ import jp.tomorrowkey.android.gifplayer.BaseGifImage; |
| */ |
| public class NewTabPage |
| implements NativePage, InvalidationAwareThumbnailProvider, TemplateUrlServiceObserver { |
| + private static final String TAG = "NewTabPage"; |
| // MostVisitedItem Context menu item IDs. |
| static final int ID_OPEN_IN_NEW_WINDOW = 0; |
| @@ -103,6 +108,9 @@ public class NewTabPage |
| private static final int CTA_IMAGE_CLICKED = 1; |
| private static final int ANIMATED_LOGO_CLICKED = 2; |
| + // Key for the scroll position data that may be stored in a navigation entry. |
| + private static final String NAVIGATION_ENTRY_SCROLL_POSITION_KEY = "NewTabPageScrollPosition"; |
| + |
| private static final String CHROME_CONTENT_SUGGESTIONS_REFERRER = |
| "https://www.googleapis.com/auth/chrome-content-suggestions"; |
| @@ -665,6 +673,23 @@ public class NewTabPage |
| public void onHidden(Tab tab) { |
| if (mIsLoaded) recordNTPInteractionTime(); |
| } |
| + |
| + @Override |
| + public void onPageLoadStarted(Tab tab, String url) { |
| + int scrollPosition = mNewTabPageView.getScrollPosition(); |
| + if (scrollPosition == RecyclerView.NO_POSITION) return; |
| + |
| + if (mTab.getWebContents() == null) return; |
| + |
| + NavigationController controller = mTab.getWebContents().getNavigationController(); |
| + int index = controller.getLastCommittedEntryIndex(); |
| + NavigationEntry entry = controller.getEntryAtIndex(index); |
| + if (entry == null) return; |
| + |
| + assert isNTPUrl(entry.getUrl()); |
| + controller.setEntryExtraData(index, NAVIGATION_ENTRY_SCROLL_POSITION_KEY, |
| + Integer.toString(scrollPosition)); |
| + } |
| }; |
| mTab.addObserver(mTabObserver); |
| mMostVisitedSites = buildMostVisitedSites(mProfile); |
| @@ -677,7 +702,8 @@ public class NewTabPage |
| LayoutInflater inflater = LayoutInflater.from(activity); |
| mNewTabPageView = (NewTabPageView) inflater.inflate(R.layout.new_tab_page_view, null); |
| - mNewTabPageView.initialize(mNewTabPageManager, mSearchProviderHasLogo, mSnippetsBridge); |
| + mNewTabPageView.initialize(mNewTabPageManager, mSearchProviderHasLogo, mSnippetsBridge, |
| + getScrollPositionFromNavigationEntry()); |
| RecordHistogram.recordBooleanHistogram( |
| "NewTabPage.MobileIsUserOnline", NetworkChangeNotifier.isOnline()); |
| @@ -837,6 +863,29 @@ public class NewTabPage |
| } |
| /** |
| + * Returns the value of the adapter scroll position that was stored in the last committed |
| + * navigation entry. Returns {@code RecyclerView.NO_POSITION} if there is no last committed |
| + * navigation entry, or if no data is found. |
| + * @return The adapter scroll position. |
| + */ |
| + private int getScrollPositionFromNavigationEntry() { |
| + if (mTab.getWebContents() == null) return RecyclerView.NO_POSITION; |
| + |
| + NavigationController controller = mTab.getWebContents().getNavigationController(); |
| + int index = controller.getLastCommittedEntryIndex(); |
| + String scrollPositionData = |
| + controller.getEntryExtraData(index, NAVIGATION_ENTRY_SCROLL_POSITION_KEY); |
| + if (scrollPositionData == null) return RecyclerView.NO_POSITION; |
|
Ted C
2016/09/26 18:40:26
I was testing locally and got this stack:
W/cr_New
Michael van Ouwerkerk
2016/09/27 14:36:58
Agreed, done.
|
| + |
| + try { |
| + return Integer.parseInt(scrollPositionData); |
| + } catch (NumberFormatException e) { |
| + Log.w(TAG, "Bad data found for scroll position: %s", scrollPositionData, e); |
| + return RecyclerView.NO_POSITION; |
| + } |
| + } |
| + |
| + /** |
| * @return Whether the NTP has finished loaded. |
| */ |
| @VisibleForTesting |