Index: chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NewTabPage.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NewTabPage.java |
deleted file mode 100644 |
index a31b5f251e23354cc0901d3aa45648ccf38762d4..0000000000000000000000000000000000000000 |
--- a/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NewTabPage.java |
+++ /dev/null |
@@ -1,593 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package org.chromium.chrome.browser.ntp; |
- |
-import android.app.Activity; |
-import android.app.Dialog; |
-import android.content.Context; |
-import android.graphics.Bitmap; |
-import android.graphics.Canvas; |
-import android.graphics.Rect; |
-import android.view.ContextMenu; |
-import android.view.LayoutInflater; |
-import android.view.Menu; |
-import android.view.MenuItem.OnMenuItemClickListener; |
-import android.view.View; |
- |
-import org.chromium.base.ApiCompatibilityUtils; |
-import org.chromium.base.VisibleForTesting; |
-import org.chromium.base.metrics.RecordHistogram; |
-import org.chromium.base.metrics.RecordUserAction; |
-import org.chromium.chrome.R; |
-import org.chromium.chrome.browser.LogoBridge; |
-import org.chromium.chrome.browser.LogoBridge.Logo; |
-import org.chromium.chrome.browser.LogoBridge.LogoObserver; |
-import org.chromium.chrome.browser.NativePage; |
-import org.chromium.chrome.browser.Tab; |
-import org.chromium.chrome.browser.UrlConstants; |
-import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareThumbnailProvider; |
-import org.chromium.chrome.browser.document.DocumentMetricIds; |
-import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkUtils; |
-import org.chromium.chrome.browser.favicon.FaviconHelper; |
-import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback; |
-import org.chromium.chrome.browser.favicon.LargeIconBridge; |
-import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; |
-import org.chromium.chrome.browser.ntp.BookmarksPage.BookmarkSelectedListener; |
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; |
-import org.chromium.chrome.browser.preferences.DocumentModeManager; |
-import org.chromium.chrome.browser.preferences.DocumentModePreference; |
-import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
-import org.chromium.chrome.browser.preferences.PreferencesLauncher; |
-import org.chromium.chrome.browser.profiles.MostVisitedSites; |
-import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObserver; |
-import org.chromium.chrome.browser.profiles.MostVisitedSites.ThumbnailCallback; |
-import org.chromium.chrome.browser.profiles.Profile; |
-import org.chromium.chrome.browser.search_engines.TemplateUrlService; |
-import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrlServiceObserver; |
-import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
-import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
-import org.chromium.chrome.browser.util.FeatureUtilities; |
-import org.chromium.content_public.browser.LoadUrlParams; |
-import org.chromium.ui.base.DeviceFormFactor; |
-import org.chromium.ui.base.PageTransition; |
- |
-import java.util.concurrent.TimeUnit; |
- |
-/** |
- * Provides functionality when the user interacts with the NTP. |
- */ |
-public class NewTabPage |
- implements NativePage, InvalidationAwareThumbnailProvider, TemplateUrlServiceObserver { |
- |
- // The number of times that an opt-out promo will be shown. |
- private static final int MAX_OPT_OUT_PROMO_COUNT = 10; |
- |
- // MostVisitedItem Context menu item IDs. |
- static final int ID_OPEN_IN_NEW_TAB = 0; |
- static final int ID_OPEN_IN_INCOGNITO_TAB = 1; |
- static final int ID_REMOVE = 2; |
- |
- private static MostVisitedSites sMostVisitedSitesForTests; |
- |
- private final Tab mTab; |
- private final TabModelSelector mTabModelSelector; |
- private final Activity mActivity; |
- |
- private final Profile mProfile; |
- private final String mTitle; |
- private final int mBackgroundColor; |
- private final NewTabPageView mNewTabPageView; |
- |
- private MostVisitedSites mMostVisitedSites; |
- private FaviconHelper mFaviconHelper; |
- private LargeIconBridge mLargeIconBridge; |
- private LogoBridge mLogoBridge; |
- private boolean mSearchProviderHasLogo; |
- private final boolean mOptOutPromoShown; |
- private String mOnLogoClickUrl; |
- private FakeboxDelegate mFakeboxDelegate; |
- |
- // The timestamp at which the constructor was called. |
- private final long mConstructedTimeNs; |
- |
- private boolean mIsLoaded; |
- |
- // Whether destroy() has been called. |
- private boolean mIsDestroyed; |
- |
- /** |
- * Allows clients to listen for updates to the scroll changes of the search box on the |
- * NTP. |
- */ |
- public interface OnSearchBoxScrollListener { |
- /** |
- * Callback to be notified when the scroll position of the search box on the NTP has |
- * changed. A scroll percentage of 0, means the search box has no scroll applied and |
- * is in it's natural resting position. A value of 1 means the search box is scrolled |
- * entirely to the top of the screen viewport. |
- * |
- * @param scrollPercentage The percentage the search box has been scrolled off the page. |
- */ |
- void onScrollChanged(float scrollPercentage); |
- } |
- |
- /** |
- * Handles user interaction with the fakebox (the URL bar in the NTP). |
- */ |
- public interface FakeboxDelegate { |
- /** |
- * Shows the voice recognition dialog. Called when the user taps the microphone icon. |
- */ |
- void startVoiceRecognition(); |
- |
- /** |
- * Focuses the URL bar when the user taps the fakebox, types in the fakebox, or pastes text |
- * into the fakebox. |
- * |
- * @param pastedText The text that was pasted or typed into the fakebox, or null if the user |
- * just tapped the fakebox. |
- */ |
- void requestUrlFocusFromFakebox(String pastedText); |
- } |
- |
- /** |
- * @param url The URL to check whether it is for the NTP. |
- * @return Whether the passed in URL is used to render the NTP. |
- */ |
- public static boolean isNTPUrl(String url) { |
- return url != null && url.startsWith(UrlConstants.NTP_URL); |
- } |
- |
- public static void launchBookmarksDialog(Activity activity, Tab tab, |
- TabModelSelector tabModelSelector) { |
- if (!EnhancedBookmarkUtils.showEnhancedBookmarkIfEnabled(activity)) { |
- BookmarkDialogSelectedListener listener = new BookmarkDialogSelectedListener(tab); |
- NativePage page = BookmarksPage.buildPageInDocumentMode( |
- activity, tab, tabModelSelector, Profile.getLastUsedProfile(), |
- listener); |
- page.updateForUrl(UrlConstants.BOOKMARKS_URL); |
- Dialog dialog = new NativePageDialog(activity, page); |
- listener.setDialog(dialog); |
- dialog.show(); |
- } |
- } |
- |
- public static void launchRecentTabsDialog(Activity activity, Tab tab, |
- boolean finishActivityOnOpen) { |
- DocumentRecentTabsManager manager = |
- new DocumentRecentTabsManager(tab, activity, finishActivityOnOpen); |
- NativePage page = new RecentTabsPage(activity, manager); |
- page.updateForUrl(UrlConstants.RECENT_TABS_URL); |
- Dialog dialog = new NativePageDialog(activity, page); |
- manager.setDialog(dialog); |
- dialog.show(); |
- } |
- |
- @VisibleForTesting |
- static void setMostVisitedSitesForTests(MostVisitedSites mostVisitedSitesForTests) { |
- sMostVisitedSitesForTests = mostVisitedSitesForTests; |
- } |
- |
- private final NewTabPageManager mNewTabPageManager = new NewTabPageManager() { |
- @Override |
- public boolean isLocationBarShownInNTP() { |
- if (mIsDestroyed) return false; |
- Context context = mNewTabPageView.getContext(); |
- return isInSingleUrlBarMode(context) |
- && !mNewTabPageView.urlFocusAnimationsDisabled(); |
- } |
- |
- private void recordOpenedMostVisitedItem(MostVisitedItem item) { |
- if (mIsDestroyed) return; |
- NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_MOST_VISITED_ENTRY); |
- RecordHistogram.recordEnumeratedHistogram("NewTabPage.MostVisited", item.getIndex(), |
- NewTabPageView.MAX_MOST_VISITED_SITES); |
- mMostVisitedSites.recordOpenedMostVisitedItem(item.getIndex()); |
- } |
- |
- private void recordDocumentOptOutPromoClick(int which) { |
- RecordHistogram.recordEnumeratedHistogram("DocumentActivity.OptOutClick", which, |
- DocumentMetricIds.OPT_OUT_CLICK_COUNT); |
- } |
- |
- @Override |
- public boolean shouldShowOptOutPromo() { |
- if (!FeatureUtilities.isDocumentMode(mActivity)) return false; |
- DocumentModeManager documentModeManager = DocumentModeManager.getInstance(mActivity); |
- return !documentModeManager.isOptOutPromoDismissed() |
- && (documentModeManager.getOptOutShownCount() < MAX_OPT_OUT_PROMO_COUNT); |
- } |
- |
- @Override |
- public void optOutPromoShown() { |
- assert FeatureUtilities.isDocumentMode(mActivity); |
- DocumentModeManager.getInstance(mActivity).incrementOptOutShownCount(); |
- RecordUserAction.record("DocumentActivity_OptOutShownOnHome"); |
- } |
- |
- @Override |
- public void optOutPromoClicked(boolean settingsClicked) { |
- assert FeatureUtilities.isDocumentMode(mActivity); |
- if (settingsClicked) { |
- recordDocumentOptOutPromoClick(DocumentMetricIds.OPT_OUT_CLICK_SETTINGS); |
- PreferencesLauncher.launchSettingsPage(mActivity, |
- DocumentModePreference.class.getName()); |
- } else { |
- recordDocumentOptOutPromoClick(DocumentMetricIds.OPT_OUT_CLICK_GOT_IT); |
- DocumentModeManager documentModeManager = DocumentModeManager.getInstance( |
- mActivity); |
- documentModeManager.setOptedOutState(DocumentModeManager.OPT_OUT_PROMO_DISMISSED); |
- } |
- } |
- |
- @Override |
- public void open(MostVisitedItem item) { |
- if (mIsDestroyed) return; |
- recordOpenedMostVisitedItem(item); |
- mTab.loadUrl(new LoadUrlParams(item.getUrl())); |
- } |
- |
- @Override |
- public void onCreateContextMenu(ContextMenu menu, OnMenuItemClickListener listener) { |
- if (mIsDestroyed) return; |
- menu.add(Menu.NONE, ID_OPEN_IN_NEW_TAB, Menu.NONE, R.string.contextmenu_open_in_new_tab) |
- .setOnMenuItemClickListener(listener); |
- if (PrefServiceBridge.getInstance().isIncognitoModeEnabled()) { |
- menu.add(Menu.NONE, ID_OPEN_IN_INCOGNITO_TAB, Menu.NONE, |
- R.string.contextmenu_open_in_incognito_tab).setOnMenuItemClickListener( |
- listener); |
- } |
- menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove) |
- .setOnMenuItemClickListener(listener); |
- } |
- |
- @Override |
- public boolean onMenuItemClick(int menuId, MostVisitedItem item) { |
- if (mIsDestroyed) return false; |
- switch (menuId) { |
- case ID_OPEN_IN_NEW_TAB: |
- recordOpenedMostVisitedItem(item); |
- mTabModelSelector.openNewTab(new LoadUrlParams(item.getUrl()), |
- TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab, false); |
- return true; |
- case ID_OPEN_IN_INCOGNITO_TAB: |
- recordOpenedMostVisitedItem(item); |
- if (FeatureUtilities.isDocumentMode(mActivity)) { |
- ApiCompatibilityUtils.finishAndRemoveTask(mActivity); |
- } |
- mTabModelSelector.openNewTab(new LoadUrlParams(item.getUrl()), |
- TabLaunchType.FROM_LONGPRESS_FOREGROUND, mTab, true); |
- return true; |
- case ID_REMOVE: |
- mMostVisitedSites.blacklistUrl(item.getUrl()); |
- return true; |
- default: |
- return false; |
- } |
- } |
- |
- @Override |
- public void navigateToBookmarks() { |
- if (mIsDestroyed) return; |
- RecordUserAction.record("MobileNTPSwitchToBookmarks"); |
- if (FeatureUtilities.isDocumentMode(mActivity)) { |
- launchBookmarksDialog(mActivity, mTab, mTabModelSelector); |
- } else if (!EnhancedBookmarkUtils.showEnhancedBookmarkIfEnabled(mActivity)) { |
- mTab.loadUrl(new LoadUrlParams(UrlConstants.BOOKMARKS_URL)); |
- } |
- } |
- |
- @Override |
- public void navigateToRecentTabs() { |
- if (mIsDestroyed) return; |
- RecordUserAction.record("MobileNTPSwitchToOpenTabs"); |
- if (FeatureUtilities.isDocumentMode(mActivity)) { |
- launchRecentTabsDialog(mActivity, mTab, true); |
- } else { |
- mTab.loadUrl(new LoadUrlParams(UrlConstants.RECENT_TABS_URL)); |
- } |
- } |
- |
- @Override |
- public void focusSearchBox(boolean beginVoiceSearch, String pastedText) { |
- if (mIsDestroyed) return; |
- if (mFakeboxDelegate != null) { |
- if (beginVoiceSearch) { |
- mFakeboxDelegate.startVoiceRecognition(); |
- } else { |
- mFakeboxDelegate.requestUrlFocusFromFakebox(pastedText); |
- } |
- } |
- } |
- |
- @Override |
- public void setMostVisitedURLsObserver(MostVisitedURLsObserver observer, int numResults) { |
- if (mIsDestroyed) return; |
- mMostVisitedSites.setMostVisitedURLsObserver(observer, numResults); |
- } |
- |
- @Override |
- public void getURLThumbnail(String url, ThumbnailCallback thumbnailCallback) { |
- if (mIsDestroyed) return; |
- mMostVisitedSites.getURLThumbnail(url, thumbnailCallback); |
- } |
- |
- @Override |
- public void getLocalFaviconImageForURL( |
- String url, int size, FaviconImageCallback faviconCallback) { |
- if (mIsDestroyed) return; |
- if (mFaviconHelper == null) mFaviconHelper = new FaviconHelper(); |
- mFaviconHelper.getLocalFaviconImageForURL(mProfile, url, FaviconHelper.FAVICON |
- | FaviconHelper.TOUCH_ICON | FaviconHelper.TOUCH_PRECOMPOSED_ICON, size, |
- faviconCallback); |
- } |
- |
- @Override |
- public void getLargeIconForUrl(String url, int size, LargeIconCallback callback) { |
- if (mIsDestroyed) return; |
- if (mLargeIconBridge == null) mLargeIconBridge = new LargeIconBridge(); |
- mLargeIconBridge.getLargeIconForUrl(mProfile, url, size, callback); |
- } |
- |
- @Override |
- public void openLogoLink() { |
- if (mIsDestroyed) return; |
- if (mOnLogoClickUrl == null) return; |
- mTab.loadUrl( |
- new LoadUrlParams(mOnLogoClickUrl, PageTransition.LINK)); |
- } |
- |
- @Override |
- public void getSearchProviderLogo(final LogoObserver logoObserver) { |
- if (mIsDestroyed) return; |
- LogoObserver wrapperCallback = new LogoObserver() { |
- @Override |
- public void onLogoAvailable(Logo logo, boolean fromCache) { |
- if (mIsDestroyed) return; |
- mOnLogoClickUrl = logo != null ? logo.onClickUrl : null; |
- logoObserver.onLogoAvailable(logo, fromCache); |
- } |
- }; |
- mLogoBridge.getCurrentLogo(wrapperCallback); |
- } |
- |
- @Override |
- public void onLoadingComplete() { |
- long loadTimeMs = (System.nanoTime() - mConstructedTimeNs) / 1000000; |
- RecordHistogram.recordTimesHistogram( |
- "Tab.NewTabOnload", loadTimeMs, TimeUnit.MILLISECONDS); |
- mIsLoaded = true; |
- |
- if (mIsDestroyed) return; |
- mMostVisitedSites.onLoadingComplete(); |
- } |
- }; |
- |
- /** |
- * Constructs a NewTabPage. |
- * @param activity The activity used for context to create the new tab page's View. |
- * @param tab The Tab that is showing this new tab page. |
- * @param tabModelSelector The TabModelSelector used to open tabs. |
- */ |
- public NewTabPage(Activity activity, Tab tab, TabModelSelector tabModelSelector) { |
- mConstructedTimeNs = System.nanoTime(); |
- |
- mTab = tab; |
- mActivity = activity; |
- mTabModelSelector = tabModelSelector; |
- mProfile = tab.getProfile(); |
- |
- mTitle = activity.getResources().getString(R.string.button_new_tab); |
- mBackgroundColor = activity.getResources().getColor(R.color.ntp_bg); |
- TemplateUrlService.getInstance().addObserver(this); |
- |
- // Whether to show the promo can change within the lifetime of a single NTP instance |
- // because the user can dismiss the promo. To ensure the UI is consistent, cache the |
- // value initially and ignore further updates. |
- mOptOutPromoShown = mNewTabPageManager.shouldShowOptOutPromo(); |
- |
- mMostVisitedSites = buildMostVisitedSites(mProfile); |
- mLogoBridge = new LogoBridge(mProfile); |
- updateSearchProviderHasLogo(); |
- |
- LayoutInflater inflater = LayoutInflater.from(activity); |
- mNewTabPageView = (NewTabPageView) inflater.inflate(R.layout.new_tab_page, null); |
- mNewTabPageView.initialize(mNewTabPageManager, isInSingleUrlBarMode(activity), |
- mSearchProviderHasLogo); |
- } |
- |
- private static MostVisitedSites buildMostVisitedSites(Profile profile) { |
- if (sMostVisitedSitesForTests != null) { |
- return sMostVisitedSitesForTests; |
- } else { |
- return new MostVisitedSites(profile); |
- } |
- } |
- |
- /** @return The view container for the new tab page. */ |
- @VisibleForTesting |
- NewTabPageView getNewTabPageView() { |
- return mNewTabPageView; |
- } |
- |
- /** |
- * Updates whether the NewTabPage should animate on URL focus changes. |
- * @param disable Whether to disable the animations. |
- */ |
- public void setUrlFocusAnimationsDisabled(boolean disable) { |
- mNewTabPageView.setUrlFocusAnimationsDisabled(disable); |
- } |
- |
- private boolean isInSingleUrlBarMode(Context context) { |
- if (DeviceFormFactor.isTablet(context)) return false; |
- if (mOptOutPromoShown) return false; |
- |
- return mSearchProviderHasLogo; |
- } |
- |
- private void updateSearchProviderHasLogo() { |
- mSearchProviderHasLogo = !mOptOutPromoShown |
- && TemplateUrlService.getInstance().isDefaultSearchEngineGoogle(); |
- } |
- |
- private void onSearchEngineUpdated() { |
- // TODO(newt): update this if other search providers provide logos. |
- updateSearchProviderHasLogo(); |
- mNewTabPageView.setSearchProviderHasLogo(mSearchProviderHasLogo); |
- } |
- |
- /** |
- * Specifies the percentage the URL is focused during an animation. 1.0 specifies that the URL |
- * bar has focus and has completed the focus animation. 0 is when the URL bar is does not have |
- * any focus. |
- * |
- * @param percent The percentage of the URL bar focus animation. |
- */ |
- public void setUrlFocusChangeAnimationPercent(float percent) { |
- mNewTabPageView.setUrlFocusChangeAnimationPercent(percent); |
- } |
- |
- /** |
- * Get the bounds of the search box in relation to the top level NewTabPage view. |
- * |
- * @param originalBounds The bounding region of the search box without external transforms |
- * applied. The delta between this and the transformed bounds determines |
- * the amount of scroll applied to this view. |
- * @param transformedBounds The bounding region of the search box including any transforms |
- * applied by the parent view hierarchy up to the NewTabPage view. |
- * This more accurately reflects the current drawing location of the |
- * search box. |
- */ |
- public void getSearchBoxBounds(Rect originalBounds, Rect transformedBounds) { |
- mNewTabPageView.getSearchBoxBounds(originalBounds, transformedBounds); |
- } |
- |
- /** |
- * @return Whether the location bar is shown in the NTP. |
- */ |
- public boolean isLocationBarShownInNTP() { |
- return mNewTabPageManager.isLocationBarShownInNTP(); |
- } |
- |
- /** |
- * Sets the listener for search box scroll changes. |
- * @param listener The listener to be notified on changes. |
- */ |
- public void setSearchBoxScrollListener(OnSearchBoxScrollListener listener) { |
- mNewTabPageView.setSearchBoxScrollListener(listener); |
- } |
- |
- /** |
- * Sets the FakeboxDelegate that this pages interacts with. |
- */ |
- public void setFakeboxDelegate(FakeboxDelegate fakeboxDelegate) { |
- mFakeboxDelegate = fakeboxDelegate; |
- } |
- |
- /** |
- * @return Whether the NTP has finished loaded. |
- */ |
- @VisibleForTesting |
- public boolean isLoadedForTests() { |
- return mIsLoaded; |
- } |
- |
- // TemplateUrlServiceObserver overrides |
- |
- @Override |
- public void onTemplateURLServiceChanged() { |
- onSearchEngineUpdated(); |
- } |
- |
- // NativePage overrides |
- |
- @Override |
- public void destroy() { |
- assert getView().getParent() == null : "Destroy called before removed from window"; |
- if (mFaviconHelper != null) { |
- mFaviconHelper.destroy(); |
- mFaviconHelper = null; |
- } |
- if (mLargeIconBridge != null) { |
- mLargeIconBridge.destroy(); |
- mLargeIconBridge = null; |
- } |
- if (mMostVisitedSites != null) { |
- mMostVisitedSites.destroy(); |
- mMostVisitedSites = null; |
- } |
- if (mLogoBridge != null) { |
- mLogoBridge.destroy(); |
- mLogoBridge = null; |
- } |
- TemplateUrlService.getInstance().removeObserver(this); |
- mIsDestroyed = true; |
- } |
- |
- @Override |
- public String getUrl() { |
- return UrlConstants.NTP_URL; |
- } |
- |
- @Override |
- public String getTitle() { |
- return mTitle; |
- } |
- |
- @Override |
- public int getBackgroundColor() { |
- return mBackgroundColor; |
- } |
- |
- @Override |
- public View getView() { |
- return mNewTabPageView; |
- } |
- |
- @Override |
- public String getHost() { |
- return UrlConstants.NTP_HOST; |
- } |
- |
- @Override |
- public void updateForUrl(String url) { |
- } |
- |
- // InvalidationAwareThumbnailProvider |
- |
- @Override |
- public boolean shouldCaptureThumbnail() { |
- return mNewTabPageView.shouldCaptureThumbnail(); |
- } |
- |
- @Override |
- public void captureThumbnail(Canvas canvas) { |
- mNewTabPageView.captureThumbnail(canvas); |
- } |
- |
- private static class BookmarkDialogSelectedListener implements BookmarkSelectedListener { |
- private Dialog mDialog; |
- private final Tab mTab; |
- |
- public BookmarkDialogSelectedListener(Tab tab) { |
- mTab = tab; |
- } |
- |
- @Override |
- public void onNewTabOpened() { |
- if (mDialog != null) mDialog.dismiss(); |
- } |
- |
- @Override |
- public void onBookmarkSelected(String url, String title, Bitmap favicon) { |
- if (mDialog != null) mDialog.dismiss(); |
- mTab.loadUrl(new LoadUrlParams(url)); |
- } |
- |
- public void setDialog(Dialog dialog) { |
- mDialog = dialog; |
- } |
- } |
-} |