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.toolbar; | 5 package org.chromium.chrome.browser.toolbar; |
6 | 6 |
7 import android.content.Context; | 7 import android.content.Context; |
8 import android.content.res.Configuration; | 8 import android.content.res.Configuration; |
9 import android.graphics.drawable.Drawable; | 9 import android.graphics.drawable.Drawable; |
10 import android.os.Handler; | 10 import android.os.Handler; |
11 import android.os.Looper; | 11 import android.os.Looper; |
12 import android.os.Message; | 12 import android.os.Message; |
13 import android.os.SystemClock; | 13 import android.os.SystemClock; |
14 import android.support.v7.app.ActionBar; | 14 import android.support.v7.app.ActionBar; |
15 import android.text.TextUtils; | 15 import android.text.TextUtils; |
16 import android.view.View; | 16 import android.view.View; |
17 import android.view.View.OnAttachStateChangeListener; | 17 import android.view.View.OnAttachStateChangeListener; |
18 import android.view.View.OnClickListener; | 18 import android.view.View.OnClickListener; |
19 import android.view.ViewGroup.MarginLayoutParams; | 19 import android.view.ViewGroup.MarginLayoutParams; |
20 import android.widget.FrameLayout; | 20 import android.widget.FrameLayout; |
21 import android.widget.PopupWindow.OnDismissListener; | |
21 | 22 |
22 import org.chromium.base.ApiCompatibilityUtils; | 23 import org.chromium.base.ApiCompatibilityUtils; |
23 import org.chromium.base.Callback; | 24 import org.chromium.base.Callback; |
24 import org.chromium.base.ThreadUtils; | 25 import org.chromium.base.ThreadUtils; |
25 import org.chromium.base.VisibleForTesting; | 26 import org.chromium.base.VisibleForTesting; |
26 import org.chromium.base.metrics.RecordHistogram; | 27 import org.chromium.base.metrics.RecordHistogram; |
27 import org.chromium.base.metrics.RecordUserAction; | 28 import org.chromium.base.metrics.RecordUserAction; |
28 import org.chromium.chrome.R; | 29 import org.chromium.chrome.R; |
29 import org.chromium.chrome.browser.ChromeActivity; | 30 import org.chromium.chrome.browser.ChromeActivity; |
30 import org.chromium.chrome.browser.NativePage; | 31 import org.chromium.chrome.browser.NativePage; |
31 import org.chromium.chrome.browser.TabLoadStatus; | 32 import org.chromium.chrome.browser.TabLoadStatus; |
32 import org.chromium.chrome.browser.UrlConstants; | 33 import org.chromium.chrome.browser.UrlConstants; |
33 import org.chromium.chrome.browser.WindowDelegate; | 34 import org.chromium.chrome.browser.WindowDelegate; |
34 import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper; | 35 import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper; |
35 import org.chromium.chrome.browser.appmenu.AppMenuHandler; | 36 import org.chromium.chrome.browser.appmenu.AppMenuHandler; |
36 import org.chromium.chrome.browser.appmenu.AppMenuObserver; | 37 import org.chromium.chrome.browser.appmenu.AppMenuObserver; |
37 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate; | 38 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate; |
38 import org.chromium.chrome.browser.bookmarks.BookmarkBridge; | 39 import org.chromium.chrome.browser.bookmarks.BookmarkBridge; |
39 import org.chromium.chrome.browser.compositor.Invalidator; | 40 import org.chromium.chrome.browser.compositor.Invalidator; |
40 import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; | 41 import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; |
41 import org.chromium.chrome.browser.compositor.layouts.Layout; | 42 import org.chromium.chrome.browser.compositor.layouts.Layout; |
42 import org.chromium.chrome.browser.compositor.layouts.LayoutManager; | 43 import org.chromium.chrome.browser.compositor.layouts.LayoutManager; |
43 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; | 44 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; |
44 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.Overv iewModeObserver; | 45 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.Overv iewModeObserver; |
45 import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver; | 46 import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver; |
47 import org.chromium.chrome.browser.download.DownloadUtils; | |
48 import org.chromium.chrome.browser.feature_engagement_tracker.FeatureEngagementT rackerFactory; | |
46 import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibil ityDelegate; | 49 import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibil ityDelegate; |
47 import org.chromium.chrome.browser.fullscreen.FullscreenManager; | 50 import org.chromium.chrome.browser.fullscreen.FullscreenManager; |
48 import org.chromium.chrome.browser.ntp.IncognitoNewTabPage; | 51 import org.chromium.chrome.browser.ntp.IncognitoNewTabPage; |
49 import org.chromium.chrome.browser.ntp.NativePageFactory; | 52 import org.chromium.chrome.browser.ntp.NativePageFactory; |
50 import org.chromium.chrome.browser.ntp.NewTabPage; | 53 import org.chromium.chrome.browser.ntp.NewTabPage; |
51 import org.chromium.chrome.browser.omnibox.LocationBar; | 54 import org.chromium.chrome.browser.omnibox.LocationBar; |
52 import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener; | 55 import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener; |
53 import org.chromium.chrome.browser.partnercustomizations.HomepageManager; | 56 import org.chromium.chrome.browser.partnercustomizations.HomepageManager; |
54 import org.chromium.chrome.browser.partnercustomizations.HomepageManager.Homepag eStateListener; | 57 import org.chromium.chrome.browser.partnercustomizations.HomepageManager.Homepag eStateListener; |
55 import org.chromium.chrome.browser.profiles.Profile; | 58 import org.chromium.chrome.browser.profiles.Profile; |
56 import org.chromium.chrome.browser.search_engines.TemplateUrlService; | 59 import org.chromium.chrome.browser.search_engines.TemplateUrlService; |
57 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ; | 60 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ; |
58 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ServiceObserver; | 61 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ServiceObserver; |
59 import org.chromium.chrome.browser.tab.EmptyTabObserver; | 62 import org.chromium.chrome.browser.tab.EmptyTabObserver; |
60 import org.chromium.chrome.browser.tab.Tab; | 63 import org.chromium.chrome.browser.tab.Tab; |
61 import org.chromium.chrome.browser.tab.TabObserver; | 64 import org.chromium.chrome.browser.tab.TabObserver; |
62 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; | 65 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; |
63 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; | 66 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; |
64 import org.chromium.chrome.browser.tabmodel.TabModel; | 67 import org.chromium.chrome.browser.tabmodel.TabModel; |
65 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; | 68 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
66 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; | 69 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; |
67 import org.chromium.chrome.browser.tabmodel.TabModelObserver; | 70 import org.chromium.chrome.browser.tabmodel.TabModelObserver; |
68 import org.chromium.chrome.browser.tabmodel.TabModelSelector; | 71 import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
69 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; | 72 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; |
70 import org.chromium.chrome.browser.toolbar.ActionModeController.ActionBarDelegat e; | 73 import org.chromium.chrome.browser.toolbar.ActionModeController.ActionBarDelegat e; |
71 import org.chromium.chrome.browser.widget.findinpage.FindToolbarManager; | 74 import org.chromium.chrome.browser.widget.findinpage.FindToolbarManager; |
72 import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver; | 75 import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver; |
76 import org.chromium.chrome.browser.widget.textbubble.ViewAnchoredTextBubble; | |
77 import org.chromium.components.feature_engagement_tracker.FeatureConstants; | |
78 import org.chromium.components.feature_engagement_tracker.FeatureEngagementTrack er; | |
73 import org.chromium.content_public.browser.LoadUrlParams; | 79 import org.chromium.content_public.browser.LoadUrlParams; |
74 import org.chromium.content_public.browser.NavigationController; | 80 import org.chromium.content_public.browser.NavigationController; |
75 import org.chromium.content_public.browser.NavigationEntry; | 81 import org.chromium.content_public.browser.NavigationEntry; |
76 import org.chromium.content_public.browser.WebContents; | 82 import org.chromium.content_public.browser.WebContents; |
83 import org.chromium.net.NetError; | |
77 import org.chromium.ui.UiUtils; | 84 import org.chromium.ui.UiUtils; |
78 import org.chromium.ui.base.DeviceFormFactor; | 85 import org.chromium.ui.base.DeviceFormFactor; |
79 import org.chromium.ui.base.PageTransition; | 86 import org.chromium.ui.base.PageTransition; |
80 | 87 |
81 import java.util.ArrayList; | 88 import java.util.ArrayList; |
82 import java.util.List; | 89 import java.util.List; |
83 import java.util.concurrent.TimeUnit; | 90 import java.util.concurrent.TimeUnit; |
84 | 91 |
85 /** | 92 /** |
86 * Contains logic for managing the toolbar visual component. This class manages the interactions | 93 * Contains logic for managing the toolbar visual component. This class manages the interactions |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
462 | 469 |
463 @Override | 470 @Override |
464 public void onDidFinishNavigation(Tab tab, String url, boolean isInM ainFrame, | 471 public void onDidFinishNavigation(Tab tab, String url, boolean isInM ainFrame, |
465 boolean isErrorPage, boolean hasCommitted, boolean isSameDoc ument, | 472 boolean isErrorPage, boolean hasCommitted, boolean isSameDoc ument, |
466 boolean isFragmentNavigation, Integer pageTransition, int er rorCode, | 473 boolean isFragmentNavigation, Integer pageTransition, int er rorCode, |
467 int httpStatusCode) { | 474 int httpStatusCode) { |
468 if (hasCommitted && isInMainFrame && !isSameDocument) { | 475 if (hasCommitted && isInMainFrame && !isSameDocument) { |
469 mToolbar.onNavigatedToDifferentPage(); | 476 mToolbar.onNavigatedToDifferentPage(); |
470 } | 477 } |
471 | 478 |
479 displayFeatureEngagementTextBubbleIfNecessary(tab, errorCode); | |
480 | |
472 // If the load failed due to a different navigation, there is no need to reset the | 481 // If the load failed due to a different navigation, there is no need to reset the |
473 // location bar animations. | 482 // location bar animations. |
474 if (errorCode != 0 && isInMainFrame && !hasPendingNonNtpNavigati on(tab)) { | 483 if (errorCode != 0 && isInMainFrame && !hasPendingNonNtpNavigati on(tab)) { |
475 NewTabPage ntp = mToolbarModel.getNewTabPageForCurrentTab(); | 484 NewTabPage ntp = mToolbarModel.getNewTabPageForCurrentTab(); |
476 if (ntp == null) return; | 485 if (ntp == null) return; |
477 | 486 |
478 ntp.setUrlFocusAnimationsDisabled(false); | 487 ntp.setUrlFocusAnimationsDisabled(false); |
479 mToolbar.onTabOrModelChanged(); | 488 mToolbar.onTabOrModelChanged(); |
480 if (mToolbar.getProgressBar() != null) mToolbar.getProgressB ar().finish(false); | 489 if (mToolbar.getProgressBar() != null) mToolbar.getProgressB ar().finish(false); |
481 } | 490 } |
482 } | 491 } |
492 | |
493 private void displayFeatureEngagementTextBubbleIfNecessary(Tab tab, int errorCode) { | |
David Trainor- moved to gerrit
2017/04/13 03:58:24
Should we dismiss the bubble if the page navigates
| |
494 final FeatureEngagementTracker tracker = | |
495 FeatureEngagementTrackerFactory.getFeatureEngagementTrac kerForProfile( | |
496 tab.getProfile()); | |
497 | |
498 if (errorCode == NetError.ERR_INTERNET_DISCONNECTED) { | |
499 tracker.notifyEvent(FeatureConstants.USER_HAS_SEEN_DINO_EVEN T); | |
500 return; | |
501 } | |
502 | |
503 boolean shouldTrigger = false; | |
504 if (errorCode == 0 && DownloadUtils.isAllowedToDownloadPage(tab) ) { | |
505 shouldTrigger = | |
506 tracker.shouldTriggerHelpUI(FeatureConstants.DOWNLOA D_PAGE_FEATURE); | |
507 } | |
508 | |
509 if (!shouldTrigger) return; | |
510 | |
511 ViewAnchoredTextBubble textBubble = | |
512 new ViewAnchoredTextBubble(mToolbar.getContext(), getMen uAnchor(), | |
513 R.string.iph_download_page_for_offline_usage_tex t); | |
514 textBubble.setDismissOnTouchInteraction(true); | |
515 textBubble.setOnDismissListener(new OnDismissListener() { | |
516 @Override | |
517 public void onDismiss() { | |
518 tracker.dismissed(); | |
519 } | |
520 }); | |
521 textBubble.show(); | |
522 } | |
483 }; | 523 }; |
484 | 524 |
485 mBookmarksObserver = new BookmarkBridge.BookmarkModelObserver() { | 525 mBookmarksObserver = new BookmarkBridge.BookmarkModelObserver() { |
486 @Override | 526 @Override |
487 public void bookmarkModelChanged() { | 527 public void bookmarkModelChanged() { |
488 updateBookmarkButtonStatus(); | 528 updateBookmarkButtonStatus(); |
489 } | 529 } |
490 }; | 530 }; |
491 | 531 |
492 mFindToolbarObservers = new ArrayList<>(); | 532 mFindToolbarObservers = new ArrayList<>(); |
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1268 } | 1308 } |
1269 | 1309 |
1270 /** | 1310 /** |
1271 * Cancels simulating load progress. | 1311 * Cancels simulating load progress. |
1272 */ | 1312 */ |
1273 public void cancel() { | 1313 public void cancel() { |
1274 mHandler.removeMessages(MSG_ID_UPDATE_PROGRESS); | 1314 mHandler.removeMessages(MSG_ID_UPDATE_PROGRESS); |
1275 } | 1315 } |
1276 } | 1316 } |
1277 } | 1317 } |
OLD | NEW |