| 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; |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |