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

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: nits 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;
31 import org.chromium.chrome.browser.ChromeTabbedActivity;
30 import org.chromium.chrome.browser.NativePage; 32 import org.chromium.chrome.browser.NativePage;
31 import org.chromium.chrome.browser.TabLoadStatus; 33 import org.chromium.chrome.browser.TabLoadStatus;
32 import org.chromium.chrome.browser.UrlConstants; 34 import org.chromium.chrome.browser.UrlConstants;
33 import org.chromium.chrome.browser.WindowDelegate; 35 import org.chromium.chrome.browser.WindowDelegate;
34 import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper; 36 import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper;
35 import org.chromium.chrome.browser.appmenu.AppMenuHandler; 37 import org.chromium.chrome.browser.appmenu.AppMenuHandler;
36 import org.chromium.chrome.browser.appmenu.AppMenuObserver; 38 import org.chromium.chrome.browser.appmenu.AppMenuObserver;
37 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate; 39 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
38 import org.chromium.chrome.browser.bookmarks.BookmarkBridge; 40 import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
39 import org.chromium.chrome.browser.compositor.Invalidator; 41 import org.chromium.chrome.browser.compositor.Invalidator;
40 import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; 42 import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
41 import org.chromium.chrome.browser.compositor.layouts.Layout; 43 import org.chromium.chrome.browser.compositor.layouts.Layout;
42 import org.chromium.chrome.browser.compositor.layouts.LayoutManager; 44 import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
43 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; 45 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
44 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.Overv iewModeObserver; 46 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.Overv iewModeObserver;
45 import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver; 47 import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
48 import org.chromium.chrome.browser.download.DownloadUtils;
49 import org.chromium.chrome.browser.feature_engagement_tracker.FeatureEngagementT rackerFactory;
46 import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibil ityDelegate; 50 import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibil ityDelegate;
47 import org.chromium.chrome.browser.fullscreen.FullscreenManager; 51 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
48 import org.chromium.chrome.browser.ntp.IncognitoNewTabPage; 52 import org.chromium.chrome.browser.ntp.IncognitoNewTabPage;
49 import org.chromium.chrome.browser.ntp.NativePageFactory; 53 import org.chromium.chrome.browser.ntp.NativePageFactory;
50 import org.chromium.chrome.browser.ntp.NewTabPage; 54 import org.chromium.chrome.browser.ntp.NewTabPage;
55 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
51 import org.chromium.chrome.browser.omnibox.LocationBar; 56 import org.chromium.chrome.browser.omnibox.LocationBar;
52 import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener; 57 import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener;
53 import org.chromium.chrome.browser.partnercustomizations.HomepageManager; 58 import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
54 import org.chromium.chrome.browser.partnercustomizations.HomepageManager.Homepag eStateListener; 59 import org.chromium.chrome.browser.partnercustomizations.HomepageManager.Homepag eStateListener;
55 import org.chromium.chrome.browser.profiles.Profile; 60 import org.chromium.chrome.browser.profiles.Profile;
56 import org.chromium.chrome.browser.search_engines.TemplateUrlService; 61 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
57 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ; 62 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ;
58 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ServiceObserver; 63 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ServiceObserver;
59 import org.chromium.chrome.browser.tab.EmptyTabObserver; 64 import org.chromium.chrome.browser.tab.EmptyTabObserver;
60 import org.chromium.chrome.browser.tab.Tab; 65 import org.chromium.chrome.browser.tab.Tab;
61 import org.chromium.chrome.browser.tab.TabObserver; 66 import org.chromium.chrome.browser.tab.TabObserver;
62 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; 67 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
63 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; 68 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
64 import org.chromium.chrome.browser.tabmodel.TabModel; 69 import org.chromium.chrome.browser.tabmodel.TabModel;
65 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; 70 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
66 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; 71 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType;
67 import org.chromium.chrome.browser.tabmodel.TabModelObserver; 72 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
68 import org.chromium.chrome.browser.tabmodel.TabModelSelector; 73 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
69 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; 74 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
70 import org.chromium.chrome.browser.toolbar.ActionModeController.ActionBarDelegat e; 75 import org.chromium.chrome.browser.toolbar.ActionModeController.ActionBarDelegat e;
71 import org.chromium.chrome.browser.widget.findinpage.FindToolbarManager; 76 import org.chromium.chrome.browser.widget.findinpage.FindToolbarManager;
72 import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver; 77 import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver;
78 import org.chromium.chrome.browser.widget.textbubble.ViewAnchoredTextBubble;
79 import org.chromium.components.feature_engagement_tracker.EventConstants;
80 import org.chromium.components.feature_engagement_tracker.FeatureConstants;
81 import org.chromium.components.feature_engagement_tracker.FeatureEngagementTrack er;
73 import org.chromium.content_public.browser.LoadUrlParams; 82 import org.chromium.content_public.browser.LoadUrlParams;
74 import org.chromium.content_public.browser.NavigationController; 83 import org.chromium.content_public.browser.NavigationController;
75 import org.chromium.content_public.browser.NavigationEntry; 84 import org.chromium.content_public.browser.NavigationEntry;
76 import org.chromium.content_public.browser.WebContents; 85 import org.chromium.content_public.browser.WebContents;
77 import org.chromium.ui.UiUtils; 86 import org.chromium.ui.UiUtils;
78 import org.chromium.ui.base.DeviceFormFactor; 87 import org.chromium.ui.base.DeviceFormFactor;
79 import org.chromium.ui.base.PageTransition; 88 import org.chromium.ui.base.PageTransition;
80 89
81 import java.util.ArrayList; 90 import java.util.ArrayList;
82 import java.util.List; 91 import java.util.List;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 141
133 private final TabObserver mTabObserver; 142 private final TabObserver mTabObserver;
134 private final BookmarkBridge.BookmarkModelObserver mBookmarksObserver; 143 private final BookmarkBridge.BookmarkModelObserver mBookmarksObserver;
135 private final List<FindToolbarObserver> mFindToolbarObservers; 144 private final List<FindToolbarObserver> mFindToolbarObservers;
136 private final OverviewModeObserver mOverviewModeObserver; 145 private final OverviewModeObserver mOverviewModeObserver;
137 private final SceneChangeObserver mSceneChangeObserver; 146 private final SceneChangeObserver mSceneChangeObserver;
138 private final ActionBarDelegate mActionBarDelegate; 147 private final ActionBarDelegate mActionBarDelegate;
139 private final ActionModeController mActionModeController; 148 private final ActionModeController mActionModeController;
140 private final LoadProgressSimulator mLoadProgressSimulator; 149 private final LoadProgressSimulator mLoadProgressSimulator;
141 private final Callback<Boolean> mUrlFocusChangedCallback; 150 private final Callback<Boolean> mUrlFocusChangedCallback;
151 private final Handler mHandler = new Handler();
142 152
143 private BrowserStateBrowserControlsVisibilityDelegate mControlsVisibilityDel egate; 153 private BrowserStateBrowserControlsVisibilityDelegate mControlsVisibilityDel egate;
144 private int mFullscreenFocusToken = FullscreenManager.INVALID_TOKEN; 154 private int mFullscreenFocusToken = FullscreenManager.INVALID_TOKEN;
145 private int mFullscreenFindInPageToken = FullscreenManager.INVALID_TOKEN; 155 private int mFullscreenFindInPageToken = FullscreenManager.INVALID_TOKEN;
146 private int mFullscreenMenuToken = FullscreenManager.INVALID_TOKEN; 156 private int mFullscreenMenuToken = FullscreenManager.INVALID_TOKEN;
147 private int mFullscreenHighlightToken = FullscreenManager.INVALID_TOKEN; 157 private int mFullscreenHighlightToken = FullscreenManager.INVALID_TOKEN;
148 158
149 private int mPreselectedTabId = Tab.INVALID_TAB_ID; 159 private int mPreselectedTabId = Tab.INVALID_TAB_ID;
150 160
151 private boolean mNativeLibraryReady; 161 private boolean mNativeLibraryReady;
152 private boolean mTabRestoreCompleted; 162 private boolean mTabRestoreCompleted;
153 163
154 private AppMenuButtonHelper mAppMenuButtonHelper; 164 private AppMenuButtonHelper mAppMenuButtonHelper;
155 165
166 private ViewAnchoredTextBubble mTextBubble;
167
156 private HomepageStateListener mHomepageStateListener; 168 private HomepageStateListener mHomepageStateListener;
157 169
158 private boolean mInitializedWithNative; 170 private boolean mInitializedWithNative;
159 171
160 private boolean mShouldUpdateTabCount = true; 172 private boolean mShouldUpdateTabCount = true;
161 private boolean mShouldUpdateToolbarPrimaryColor = true; 173 private boolean mShouldUpdateToolbarPrimaryColor = true;
162 174
163 /** 175 /**
164 * Creates a ToolbarManager object. 176 * Creates a ToolbarManager object.
165 * 177 *
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 } 345 }
334 346
335 @Override 347 @Override
336 public void onCrash(Tab tab, boolean sadTabShown) { 348 public void onCrash(Tab tab, boolean sadTabShown) {
337 updateTabLoadingState(false); 349 updateTabLoadingState(false);
338 updateButtonStatus(); 350 updateButtonStatus();
339 finishLoadProgress(false); 351 finishLoadProgress(false);
340 } 352 }
341 353
342 @Override 354 @Override
355 public void onPageLoadFinished(Tab tab) {
356 if (tab.isShowingErrorPage()) {
357 handleIPHForErrorPageShown(tab);
358 return;
359 }
360
361 handleIPHForSuccessfulPageLoad(tab);
362 }
363
364 @Override
343 public void onLoadStarted(Tab tab, boolean toDifferentDocument) { 365 public void onLoadStarted(Tab tab, boolean toDifferentDocument) {
344 if (!toDifferentDocument) return; 366 if (!toDifferentDocument) return;
345 updateButtonStatus(); 367 updateButtonStatus();
346 updateTabLoadingState(true); 368 updateTabLoadingState(true);
347 } 369 }
348 370
349 @Override 371 @Override
350 public void onLoadStopped(Tab tab, boolean toDifferentDocument) { 372 public void onLoadStopped(Tab tab, boolean toDifferentDocument) {
351 if (!toDifferentDocument) return; 373 if (!toDifferentDocument) return;
352 updateTabLoadingState(true); 374 updateTabLoadingState(true);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 // location bar animations. 496 // location bar animations.
475 if (errorCode != 0 && isInMainFrame && !hasPendingNonNtpNavigati on(tab)) { 497 if (errorCode != 0 && isInMainFrame && !hasPendingNonNtpNavigati on(tab)) {
476 NewTabPage ntp = mToolbarModel.getNewTabPageForCurrentTab(); 498 NewTabPage ntp = mToolbarModel.getNewTabPageForCurrentTab();
477 if (ntp == null) return; 499 if (ntp == null) return;
478 500
479 ntp.setUrlFocusAnimationsDisabled(false); 501 ntp.setUrlFocusAnimationsDisabled(false);
480 mToolbar.onTabOrModelChanged(); 502 mToolbar.onTabOrModelChanged();
481 if (mToolbar.getProgressBar() != null) mToolbar.getProgressB ar().finish(false); 503 if (mToolbar.getProgressBar() != null) mToolbar.getProgressB ar().finish(false);
482 } 504 }
483 } 505 }
506
507 private void handleIPHForSuccessfulPageLoad(final Tab tab) {
508 if (mTextBubble != null) {
509 mTextBubble.dismiss();
510 mTextBubble = null;
511 return;
512 }
513
514 // TODO(shaktisahu): Find out if the download menu button is ena bled (crbug/712438).
515 if (!(activity instanceof ChromeTabbedActivity)
516 || DeviceFormFactor.isTablet(mToolbar.getContext())
517 || activity.isInOverviewMode()
518 || !DownloadUtils.isAllowedToDownloadPage(tab)) {
519 return;
520 }
521
522 final FeatureEngagementTracker tracker =
523 FeatureEngagementTrackerFactory.getFeatureEngagementTrac kerForProfile(
524 tab.getProfile());
525
526 if (!tracker.shouldTriggerHelpUI(FeatureConstants.DOWNLOAD_PAGE_ FEATURE)) return;
527
528 mTextBubble = new ViewAnchoredTextBubble(mToolbar.getContext(), getMenuAnchor(),
529 R.string.iph_download_page_for_offline_usage_text);
530 mTextBubble.setDismissOnTouchInteraction(true);
531 mTextBubble.addOnDismissListener(new OnDismissListener() {
532 @Override
533 public void onDismiss() {
534 mHandler.post(new Runnable() {
535 @Override
536 public void run() {
537 tracker.dismissed();
538 activity.getAppMenuHandler().setMenuHighlight(nu ll);
539 }
540 });
541 }
542 });
543 activity.getAppMenuHandler().setMenuHighlight(R.id.offline_page_ id);
544 int yInsetPx = activity.getResources().getDimensionPixelOffset(
545 R.dimen.text_bubble_menu_anchor_y_inset);
546 mTextBubble.setInsetPx(0, yInsetPx, 0, 0);
547 mTextBubble.show();
548 }
549
550 private void handleIPHForErrorPageShown(Tab tab) {
551 if (!(activity instanceof ChromeTabbedActivity)
552 || DeviceFormFactor.isTablet(mToolbar.getContext())) {
553 return;
554 }
555
556 OfflinePageBridge bridge = OfflinePageBridge.getForProfile(tab.g etProfile());
557 if (bridge == null
558 || !bridge.isShowingDownloadButtonInErrorPage(tab.getWeb Contents())) {
559 return;
560 }
561
562 FeatureEngagementTracker tracker =
563 FeatureEngagementTrackerFactory.getFeatureEngagementTrac kerForProfile(
564 tab.getProfile());
565 tracker.notifyEvent(EventConstants.USER_HAS_SEEN_DINO);
566 }
484 }; 567 };
485 568
486 mBookmarksObserver = new BookmarkBridge.BookmarkModelObserver() { 569 mBookmarksObserver = new BookmarkBridge.BookmarkModelObserver() {
487 @Override 570 @Override
488 public void bookmarkModelChanged() { 571 public void bookmarkModelChanged() {
489 updateBookmarkButtonStatus(); 572 updateBookmarkButtonStatus();
490 } 573 }
491 }; 574 };
492 575
493 mFindToolbarObservers = new ArrayList<>(); 576 mFindToolbarObservers = new ArrayList<>();
(...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 } 1367 }
1285 1368
1286 /** 1369 /**
1287 * Cancels simulating load progress. 1370 * Cancels simulating load progress.
1288 */ 1371 */
1289 public void cancel() { 1372 public void cancel() {
1290 mHandler.removeMessages(MSG_ID_UPDATE_PROGRESS); 1373 mHandler.removeMessages(MSG_ID_UPDATE_PROGRESS);
1291 } 1374 }
1292 } 1375 }
1293 } 1376 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698