| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.ntp; | 5 package org.chromium.chrome.browser.ntp; |
| 6 | 6 |
| 7 import android.annotation.TargetApi; | 7 import android.annotation.TargetApi; |
| 8 import android.content.Context; | 8 import android.content.Context; |
| 9 import android.graphics.Canvas; | 9 import android.graphics.Canvas; |
| 10 import android.graphics.Point; | 10 import android.graphics.Point; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 import org.chromium.chrome.R; | 27 import org.chromium.chrome.R; |
| 28 import org.chromium.chrome.browser.ChromeActivity; | 28 import org.chromium.chrome.browser.ChromeActivity; |
| 29 import org.chromium.chrome.browser.ChromeFeatureList; | 29 import org.chromium.chrome.browser.ChromeFeatureList; |
| 30 import org.chromium.chrome.browser.ChromeSwitches; | 30 import org.chromium.chrome.browser.ChromeSwitches; |
| 31 import org.chromium.chrome.browser.NativePage; | 31 import org.chromium.chrome.browser.NativePage; |
| 32 import org.chromium.chrome.browser.NativePageHost; | 32 import org.chromium.chrome.browser.NativePageHost; |
| 33 import org.chromium.chrome.browser.UrlConstants; | 33 import org.chromium.chrome.browser.UrlConstants; |
| 34 import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareT
humbnailProvider; | 34 import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareT
humbnailProvider; |
| 35 import org.chromium.chrome.browser.download.DownloadManagerService; | 35 import org.chromium.chrome.browser.download.DownloadManagerService; |
| 36 import org.chromium.chrome.browser.metrics.StartupMetrics; | 36 import org.chromium.chrome.browser.metrics.StartupMetrics; |
| 37 import org.chromium.chrome.browser.ntp.LogoBridge.Logo; | |
| 38 import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver; | |
| 39 import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; | 37 import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; |
| 40 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge; | 38 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge; |
| 41 import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; | 39 import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; |
| 42 import org.chromium.chrome.browser.profiles.Profile; | 40 import org.chromium.chrome.browser.profiles.Profile; |
| 43 import org.chromium.chrome.browser.search_engines.TemplateUrlService; | 41 import org.chromium.chrome.browser.search_engines.TemplateUrlService; |
| 44 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl
ServiceObserver; | 42 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl
ServiceObserver; |
| 45 import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter; | 43 import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter; |
| 46 import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate; | 44 import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate; |
| 47 import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegateImpl
; | 45 import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegateImpl
; |
| 48 import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegateImpl; | 46 import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegateImpl; |
| 49 import org.chromium.chrome.browser.suggestions.Tile; | 47 import org.chromium.chrome.browser.suggestions.Tile; |
| 50 import org.chromium.chrome.browser.suggestions.TileGroup; | 48 import org.chromium.chrome.browser.suggestions.TileGroup; |
| 51 import org.chromium.chrome.browser.suggestions.TileGroupDelegateImpl; | 49 import org.chromium.chrome.browser.suggestions.TileGroupDelegateImpl; |
| 52 import org.chromium.chrome.browser.sync.SyncSessionsMetrics; | 50 import org.chromium.chrome.browser.sync.SyncSessionsMetrics; |
| 53 import org.chromium.chrome.browser.tab.EmptyTabObserver; | 51 import org.chromium.chrome.browser.tab.EmptyTabObserver; |
| 54 import org.chromium.chrome.browser.tab.Tab; | 52 import org.chromium.chrome.browser.tab.Tab; |
| 55 import org.chromium.chrome.browser.tab.TabObserver; | 53 import org.chromium.chrome.browser.tab.TabObserver; |
| 56 import org.chromium.chrome.browser.tabmodel.TabModel; | 54 import org.chromium.chrome.browser.tabmodel.TabModel; |
| 57 import org.chromium.chrome.browser.tabmodel.TabModelSelector; | 55 import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
| 58 import org.chromium.chrome.browser.tabmodel.TabModelUtils; | 56 import org.chromium.chrome.browser.tabmodel.TabModelUtils; |
| 59 import org.chromium.chrome.browser.util.FeatureUtilities; | 57 import org.chromium.chrome.browser.util.FeatureUtilities; |
| 60 import org.chromium.chrome.browser.util.UrlUtilities; | 58 import org.chromium.chrome.browser.util.UrlUtilities; |
| 61 import org.chromium.content_public.browser.LoadUrlParams; | |
| 62 import org.chromium.content_public.browser.NavigationController; | 59 import org.chromium.content_public.browser.NavigationController; |
| 63 import org.chromium.content_public.browser.NavigationEntry; | 60 import org.chromium.content_public.browser.NavigationEntry; |
| 64 import org.chromium.net.NetworkChangeNotifier; | 61 import org.chromium.net.NetworkChangeNotifier; |
| 65 import org.chromium.ui.base.DeviceFormFactor; | 62 import org.chromium.ui.base.DeviceFormFactor; |
| 66 import org.chromium.ui.base.PageTransition; | |
| 67 import org.chromium.ui.mojom.WindowOpenDisposition; | 63 import org.chromium.ui.mojom.WindowOpenDisposition; |
| 68 | 64 |
| 69 import java.util.concurrent.TimeUnit; | 65 import java.util.concurrent.TimeUnit; |
| 70 | 66 |
| 71 import jp.tomorrowkey.android.gifplayer.BaseGifImage; | |
| 72 | |
| 73 /** | 67 /** |
| 74 * Provides functionality when the user interacts with the NTP. | 68 * Provides functionality when the user interacts with the NTP. |
| 75 */ | 69 */ |
| 76 public class NewTabPage | 70 public class NewTabPage |
| 77 implements NativePage, InvalidationAwareThumbnailProvider, TemplateUrlSe
rviceObserver { | 71 implements NativePage, InvalidationAwareThumbnailProvider, TemplateUrlSe
rviceObserver { |
| 78 private static final String TAG = "NewTabPage"; | 72 private static final String TAG = "NewTabPage"; |
| 79 | 73 |
| 80 // UMA enum constants. CTA means the "click-to-action" icon. | |
| 81 private static final String LOGO_SHOWN_UMA_NAME = "NewTabPage.LogoShown"; | |
| 82 private static final int STATIC_LOGO_SHOWN = 0; | |
| 83 private static final int CTA_IMAGE_SHOWN = 1; | |
| 84 | |
| 85 private static final String LOGO_CLICK_UMA_NAME = "NewTabPage.LogoClick"; | |
| 86 private static final int STATIC_LOGO_CLICKED = 0; | |
| 87 private static final int CTA_IMAGE_CLICKED = 1; | |
| 88 private static final int ANIMATED_LOGO_CLICKED = 2; | |
| 89 | |
| 90 // Key for the scroll position data that may be stored in a navigation entry
. | 74 // Key for the scroll position data that may be stored in a navigation entry
. |
| 91 private static final String NAVIGATION_ENTRY_SCROLL_POSITION_KEY = "NewTabPa
geScrollPosition"; | 75 private static final String NAVIGATION_ENTRY_SCROLL_POSITION_KEY = "NewTabPa
geScrollPosition"; |
| 92 | 76 |
| 93 private static SuggestionsSource sSuggestionsSourceForTests; | 77 private static SuggestionsSource sSuggestionsSourceForTests; |
| 94 | 78 |
| 95 private final Tab mTab; | 79 private final Tab mTab; |
| 96 private final TabModelSelector mTabModelSelector; | 80 private final TabModelSelector mTabModelSelector; |
| 97 | 81 |
| 98 private final String mTitle; | 82 private final String mTitle; |
| 99 private final int mBackgroundColor; | 83 private final int mBackgroundColor; |
| 100 private final int mThemeColor; | 84 private final int mThemeColor; |
| 101 private final NewTabPageView mNewTabPageView; | 85 private final NewTabPageView mNewTabPageView; |
| 102 private final NewTabPageManagerImpl mNewTabPageManager; | 86 private final NewTabPageManagerImpl mNewTabPageManager; |
| 103 private final TileGroup.Delegate mTileGroupDelegate; | 87 private final TileGroup.Delegate mTileGroupDelegate; |
| 104 | 88 |
| 105 private TabObserver mTabObserver; | 89 private TabObserver mTabObserver; |
| 106 private LogoBridge mLogoBridge; | 90 private LogoBridge mLogoBridge; |
| 107 private boolean mSearchProviderHasLogo; | 91 private boolean mSearchProviderHasLogo; |
| 108 private String mOnLogoClickUrl; | |
| 109 private String mAnimatedLogoUrl; | |
| 110 private FakeboxDelegate mFakeboxDelegate; | 92 private FakeboxDelegate mFakeboxDelegate; |
| 111 private SnippetsBridge mSnippetsBridge; | 93 private SnippetsBridge mSnippetsBridge; |
| 112 | 94 |
| 113 // The timestamp at which the constructor was called. | 95 // The timestamp at which the constructor was called. |
| 114 private final long mConstructedTimeNs; | 96 private final long mConstructedTimeNs; |
| 115 | 97 |
| 116 // The timestamp at which this NTP was last shown to the user. | 98 // The timestamp at which this NTP was last shown to the user. |
| 117 private long mLastShownTimeNs; | 99 private long mLastShownTimeNs; |
| 118 | 100 |
| 119 private boolean mIsLoaded; | 101 private boolean mIsLoaded; |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 if (mFakeboxDelegate != null) { | 234 if (mFakeboxDelegate != null) { |
| 253 if (beginVoiceSearch) { | 235 if (beginVoiceSearch) { |
| 254 mFakeboxDelegate.startVoiceRecognition(); | 236 mFakeboxDelegate.startVoiceRecognition(); |
| 255 } else { | 237 } else { |
| 256 mFakeboxDelegate.requestUrlFocusFromFakebox(pastedText); | 238 mFakeboxDelegate.requestUrlFocusFromFakebox(pastedText); |
| 257 } | 239 } |
| 258 } | 240 } |
| 259 } | 241 } |
| 260 | 242 |
| 261 @Override | 243 @Override |
| 262 public void onLogoClicked(boolean isAnimatedLogoShowing) { | |
| 263 if (mIsDestroyed) return; | |
| 264 | |
| 265 if (!isAnimatedLogoShowing && mAnimatedLogoUrl != null) { | |
| 266 RecordHistogram.recordSparseSlowlyHistogram(LOGO_CLICK_UMA_NAME,
CTA_IMAGE_CLICKED); | |
| 267 mNewTabPageView.showLogoLoadingView(); | |
| 268 mLogoBridge.getAnimatedLogo(new LogoBridge.AnimatedLogoCallback(
) { | |
| 269 @Override | |
| 270 public void onAnimatedLogoAvailable(BaseGifImage animatedLog
oImage) { | |
| 271 if (mIsDestroyed) return; | |
| 272 mNewTabPageView.playAnimatedLogo(animatedLogoImage); | |
| 273 } | |
| 274 }, mAnimatedLogoUrl); | |
| 275 } else if (mOnLogoClickUrl != null) { | |
| 276 RecordHistogram.recordSparseSlowlyHistogram(LOGO_CLICK_UMA_NAME, | |
| 277 isAnimatedLogoShowing ? ANIMATED_LOGO_CLICKED : STATIC_L
OGO_CLICKED); | |
| 278 mTab.loadUrl(new LoadUrlParams(mOnLogoClickUrl, PageTransition.L
INK)); | |
| 279 } | |
| 280 } | |
| 281 | |
| 282 @Override | |
| 283 public void getSearchProviderLogo(final LogoObserver logoObserver) { | |
| 284 if (mIsDestroyed) return; | |
| 285 LogoObserver wrapperCallback = new LogoObserver() { | |
| 286 @Override | |
| 287 public void onLogoAvailable(Logo logo, boolean fromCache) { | |
| 288 if (mIsDestroyed) return; | |
| 289 mOnLogoClickUrl = logo != null ? logo.onClickUrl : null; | |
| 290 mAnimatedLogoUrl = logo != null ? logo.animatedLogoUrl : nul
l; | |
| 291 if (logo != null) { | |
| 292 RecordHistogram.recordSparseSlowlyHistogram(LOGO_SHOWN_U
MA_NAME, | |
| 293 logo.animatedLogoUrl == null ? STATIC_LOGO_SHOWN
: CTA_IMAGE_SHOWN); | |
| 294 } | |
| 295 logoObserver.onLogoAvailable(logo, fromCache); | |
| 296 } | |
| 297 }; | |
| 298 mLogoBridge.getCurrentLogo(wrapperCallback); | |
| 299 } | |
| 300 | |
| 301 @Override | |
| 302 public SuggestionsSource getSuggestionsSource() { | 244 public SuggestionsSource getSuggestionsSource() { |
| 303 if (sSuggestionsSourceForTests != null) return sSuggestionsSourceFor
Tests; | 245 if (sSuggestionsSourceForTests != null) return sSuggestionsSourceFor
Tests; |
| 304 return mSnippetsBridge; | 246 return mSnippetsBridge; |
| 305 } | 247 } |
| 306 | 248 |
| 307 @Override | 249 @Override |
| 308 public boolean isCurrentPage() { | 250 public boolean isCurrentPage() { |
| 309 if (mIsDestroyed) return false; | 251 if (mIsDestroyed) return false; |
| 310 if (mFakeboxDelegate == null) return false; | 252 if (mFakeboxDelegate == null) return false; |
| 311 return mFakeboxDelegate.isCurrentPage(NewTabPage.this); | 253 return mFakeboxDelegate.isCurrentPage(NewTabPage.this); |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 679 @Override | 621 @Override |
| 680 public boolean shouldCaptureThumbnail() { | 622 public boolean shouldCaptureThumbnail() { |
| 681 return mNewTabPageView.shouldCaptureThumbnail(); | 623 return mNewTabPageView.shouldCaptureThumbnail(); |
| 682 } | 624 } |
| 683 | 625 |
| 684 @Override | 626 @Override |
| 685 public void captureThumbnail(Canvas canvas) { | 627 public void captureThumbnail(Canvas canvas) { |
| 686 mNewTabPageView.captureThumbnail(canvas); | 628 mNewTabPageView.captureThumbnail(canvas); |
| 687 } | 629 } |
| 688 } | 630 } |
| OLD | NEW |