Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java

Issue 2814843006: IPH - Added triggers for Download page (Closed)
Patch Set: initial Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698