| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
|
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
|
| deleted file mode 100644
|
| index d7cc1f393fc5e809b56f9ba100e8998d505e6172..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
|
| +++ /dev/null
|
| @@ -1,1062 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package org.chromium.chrome.browser.toolbar;
|
| -
|
| -import android.content.Context;
|
| -import android.graphics.Bitmap;
|
| -import android.os.Handler;
|
| -import android.os.Looper;
|
| -import android.os.Message;
|
| -import android.os.SystemClock;
|
| -import android.support.v7.app.ActionBar;
|
| -import android.text.TextUtils;
|
| -import android.view.View;
|
| -import android.view.View.OnAttachStateChangeListener;
|
| -import android.view.View.OnClickListener;
|
| -import android.widget.FrameLayout;
|
| -
|
| -import org.chromium.base.ThreadUtils;
|
| -import org.chromium.base.metrics.RecordHistogram;
|
| -import org.chromium.base.metrics.RecordUserAction;
|
| -import org.chromium.chrome.R;
|
| -import org.chromium.chrome.browser.BookmarksBridge;
|
| -import org.chromium.chrome.browser.ChromeActivity;
|
| -import org.chromium.chrome.browser.ChromeBrowserProviderClient;
|
| -import org.chromium.chrome.browser.ContextualMenuBar;
|
| -import org.chromium.chrome.browser.ContextualMenuBar.ActionBarDelegate;
|
| -import org.chromium.chrome.browser.CustomSelectionActionModeCallback;
|
| -import org.chromium.chrome.browser.EmptyTabObserver;
|
| -import org.chromium.chrome.browser.Tab;
|
| -import org.chromium.chrome.browser.TabLoadStatus;
|
| -import org.chromium.chrome.browser.TabObserver;
|
| -import org.chromium.chrome.browser.UrlConstants;
|
| -import org.chromium.chrome.browser.WindowDelegate;
|
| -import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper;
|
| -import org.chromium.chrome.browser.appmenu.AppMenuHandler;
|
| -import org.chromium.chrome.browser.appmenu.AppMenuObserver;
|
| -import org.chromium.chrome.browser.appmenu.ChromeAppMenuPropertiesDelegate;
|
| -import org.chromium.chrome.browser.compositor.Invalidator;
|
| -import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
|
| -import org.chromium.chrome.browser.compositor.layouts.Layout;
|
| -import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
|
| -import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
|
| -import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver;
|
| -import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
|
| -import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
|
| -import org.chromium.chrome.browser.fullscreen.FullscreenManager;
|
| -import org.chromium.chrome.browser.ntp.NativePageFactory;
|
| -import org.chromium.chrome.browser.ntp.NewTabPage;
|
| -import org.chromium.chrome.browser.omnibox.LocationBar;
|
| -import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener;
|
| -import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
|
| -import org.chromium.chrome.browser.partnercustomizations.HomepageManager.HomepageStateListener;
|
| -import org.chromium.chrome.browser.profiles.Profile;
|
| -import org.chromium.chrome.browser.search_engines.TemplateUrlService;
|
| -import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl;
|
| -import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrlServiceObserver;
|
| -import org.chromium.chrome.browser.tab.ChromeTab;
|
| -import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
|
| -import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
|
| -import org.chromium.chrome.browser.tabmodel.TabModel;
|
| -import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
|
| -import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType;
|
| -import org.chromium.chrome.browser.tabmodel.TabModelObserver;
|
| -import org.chromium.chrome.browser.tabmodel.TabModelSelector;
|
| -import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
|
| -import org.chromium.chrome.browser.widget.findinpage.FindToolbarManager;
|
| -import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver;
|
| -import org.chromium.content_public.browser.LoadUrlParams;
|
| -import org.chromium.content_public.browser.NavigationController;
|
| -import org.chromium.content_public.browser.WebContents;
|
| -import org.chromium.ui.base.DeviceFormFactor;
|
| -import org.chromium.ui.base.PageTransition;
|
| -
|
| -import java.util.List;
|
| -import java.util.concurrent.TimeUnit;
|
| -
|
| -/**
|
| - * Contains logic for managing the toolbar visual component. This class manages the interactions
|
| - * with the rest of the application to ensure the toolbar is always visually up to date.
|
| - */
|
| -public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListener {
|
| -
|
| - /**
|
| - * Handle UI updates of menu icons. Only applicable for phones.
|
| - */
|
| - public interface MenuDelegatePhone {
|
| -
|
| - /**
|
| - * Called when current tab's loading status changes.
|
| - *
|
| - * @param isLoading Whether the current tab is loading.
|
| - */
|
| - public void updateReloadButtonState(boolean isLoading);
|
| - }
|
| -
|
| - /**
|
| - * The number of ms to wait before reporting to UMA omnibox interaction metrics.
|
| - */
|
| - private static final int RECORD_UMA_PERFORMANCE_METRICS_DELAY_MS = 30000;
|
| -
|
| - private static final int MIN_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS = 1000;
|
| - private static final int MAX_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS = 30000;
|
| -
|
| - /**
|
| - * The minimum load progress that can be shown when a page is loading. This is not 0 so that
|
| - * it's obvious to the user that something is attempting to load.
|
| - */
|
| - public static final int MINIMUM_LOAD_PROGRESS = 5;
|
| -
|
| - private final ToolbarLayout mToolbar;
|
| - private final ToolbarControlContainer mControlContainer;
|
| -
|
| - private TabModelSelector mTabModelSelector;
|
| - private TabModelSelectorObserver mTabModelSelectorObserver;
|
| - private TabModelObserver mTabModelObserver;
|
| - private MenuDelegatePhone mMenuDelegatePhone;
|
| - private final ToolbarModelImpl mToolbarModel;
|
| - private Profile mCurrentProfile;
|
| - private BookmarksBridge mBookmarksBridge;
|
| - private TemplateUrlServiceObserver mTemplateUrlObserver;
|
| - private final LocationBar mLocationBar;
|
| - private FindToolbarManager mFindToolbarManager;
|
| -
|
| - private final TabObserver mTabObserver;
|
| - private final BookmarksBridge.BookmarkModelObserver mBookmarksObserver;
|
| - private final FindToolbarObserver mFindToolbarObserver;
|
| - private final OverviewModeObserver mOverviewModeObserver;
|
| - private final SceneChangeObserver mSceneChangeObserver;
|
| - private final ActionBarDelegate mActionBarDelegate;
|
| - private final ContextualMenuBar mContextualMenuBar;
|
| - private final LoadProgressSimulator mLoadProgressSimulator;
|
| -
|
| - private ChromeFullscreenManager mFullscreenManager;
|
| - private int mFullscreenFocusToken = FullscreenManager.INVALID_TOKEN;
|
| - private int mFullscreenFindInPageToken = FullscreenManager.INVALID_TOKEN;
|
| - private int mFullscreenMenuToken = FullscreenManager.INVALID_TOKEN;
|
| -
|
| - private int mPreselectedTabId = Tab.INVALID_TAB_ID;
|
| -
|
| - private boolean mNativeLibraryReady;
|
| - private boolean mTabRestoreCompleted;
|
| -
|
| - private AppMenuButtonHelper mAppMenuButtonHelper;
|
| -
|
| - private HomepageStateListener mHomepageStateListener;
|
| -
|
| - private boolean mInitializedWithNative;
|
| -
|
| - /**
|
| - * Creates a ToolbarManager object.
|
| - * @param controlContainer The container of the toolbar.
|
| - * @param menuHandler The handler for interacting with the menu.
|
| - */
|
| - public ToolbarManager(final ChromeActivity activity,
|
| - ToolbarControlContainer controlContainer, final AppMenuHandler menuHandler,
|
| - final ChromeAppMenuPropertiesDelegate appMenuPropertiesDelegate,
|
| - Invalidator invalidator) {
|
| - mActionBarDelegate = new ContextualMenuBar.ActionBarDelegate() {
|
| - @Override
|
| - public void setControlTopMargin(int margin) {
|
| - FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)
|
| - mControlContainer.getLayoutParams();
|
| - lp.topMargin = margin;
|
| - mControlContainer.setLayoutParams(lp);
|
| - }
|
| -
|
| - @Override
|
| - public int getControlTopMargin() {
|
| - FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)
|
| - mControlContainer.getLayoutParams();
|
| - return lp.topMargin;
|
| - }
|
| -
|
| - @Override
|
| - public ActionBar getSupportActionBar() {
|
| - return activity.getSupportActionBar();
|
| - }
|
| -
|
| - @Override
|
| - public void setActionBarBackgroundVisibility(boolean visible) {
|
| - int visibility = visible ? View.VISIBLE : View.GONE;
|
| - activity.findViewById(R.id.action_bar_black_background).setVisibility(visibility);
|
| - // TODO(tedchoc): Add support for changing the color based on the brand color.
|
| - }
|
| - };
|
| - mContextualMenuBar = new ContextualMenuBar(activity, mActionBarDelegate);
|
| - mContextualMenuBar.setCustomSelectionActionModeCallback(
|
| - new CustomSelectionActionModeCallback());
|
| -
|
| - mToolbarModel = new ToolbarModelImpl();
|
| - mControlContainer = controlContainer;
|
| - assert mControlContainer != null;
|
| -
|
| - mToolbar = (ToolbarLayout) controlContainer.findViewById(R.id.toolbar);
|
| -
|
| - mToolbar.setPaintInvalidator(invalidator);
|
| -
|
| - MenuDelegatePhone menuDelegate = new MenuDelegatePhone() {
|
| - @Override
|
| - public void updateReloadButtonState(boolean isLoading) {
|
| - if (appMenuPropertiesDelegate != null) {
|
| - appMenuPropertiesDelegate.loadingStateChanged(isLoading);
|
| - menuHandler.menuItemContentChanged(R.id.icon_row_menu_id);
|
| - }
|
| - }
|
| - };
|
| - setMenuDelegatePhone(menuDelegate);
|
| -
|
| - mLocationBar = mToolbar.getLocationBar();
|
| - mLocationBar.setToolbarDataProvider(mToolbarModel);
|
| - mLocationBar.setUrlFocusChangeListener(this);
|
| - mLocationBar.setDefaultTextEditActionModeCallback(
|
| - mContextualMenuBar.getCustomSelectionActionModeCallback());
|
| - mLocationBar.initializeControls(
|
| - new WindowDelegate(activity.getWindow()),
|
| - mContextualMenuBar.getActionBarDelegate(),
|
| - activity.getWindowAndroid());
|
| - mLocationBar.setIgnoreURLBarModification(false);
|
| -
|
| - setMenuHandler(menuHandler);
|
| - mToolbar.initialize(mToolbarModel, this, mAppMenuButtonHelper);
|
| -
|
| - mHomepageStateListener = new HomepageStateListener() {
|
| - @Override
|
| - public void onHomepageStateUpdated() {
|
| - mToolbar.onHomeButtonUpdate(
|
| - HomepageManager.isHomepageEnabled(mToolbar.getContext()));
|
| - }
|
| - };
|
| - HomepageManager.getInstance(mToolbar.getContext()).addListener(mHomepageStateListener);
|
| -
|
| - mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
|
| - @Override
|
| - public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
|
| - refreshSelectedTab();
|
| - updateTabCount();
|
| - mControlContainer.invalidateBitmap();
|
| - }
|
| -
|
| - @Override
|
| - public void onTabStateInitialized() {
|
| - mTabRestoreCompleted = true;
|
| - handleTabRestoreCompleted();
|
| - }
|
| - };
|
| -
|
| - mTabModelObserver = new EmptyTabModelObserver() {
|
| - @Override
|
| - public void didAddTab(Tab tab, TabLaunchType type) {
|
| - updateTabCount();
|
| - }
|
| -
|
| - @Override
|
| - public void didSelectTab(Tab tab, TabSelectionType type, int lastId) {
|
| - mPreselectedTabId = Tab.INVALID_TAB_ID;
|
| - refreshSelectedTab();
|
| - }
|
| -
|
| - @Override
|
| - public void tabClosureUndone(Tab tab) {
|
| - updateTabCount();
|
| - refreshSelectedTab();
|
| - }
|
| -
|
| - @Override
|
| - public void didCloseTab(Tab tab) {
|
| - updateTabCount();
|
| - refreshSelectedTab();
|
| - }
|
| -
|
| - @Override
|
| - public void tabPendingClosure(Tab tab) {
|
| - updateTabCount();
|
| - refreshSelectedTab();
|
| - }
|
| -
|
| - @Override
|
| - public void allTabsPendingClosure(List<Integer> tabIds) {
|
| - updateTabCount();
|
| - refreshSelectedTab();
|
| - }
|
| - };
|
| -
|
| - mTabObserver = new EmptyTabObserver() {
|
| - @Override
|
| - public void onSSLStateUpdated(Tab tab) {
|
| - super.onSSLStateUpdated(tab);
|
| - assert tab == mToolbarModel.getTab();
|
| - mLocationBar.updateSecurityIcon(tab.getSecurityLevel());
|
| - }
|
| -
|
| - @Override
|
| - public void onWebContentsInstantSupportDisabled() {
|
| - mLocationBar.setUrlToPageUrl();
|
| - }
|
| -
|
| - @Override
|
| - public void onDidNavigateMainFrame(Tab tab, String url, String baseUrl,
|
| - boolean isNavigationToDifferentPage, boolean isFragmentNavigation,
|
| - int statusCode) {
|
| - if (isNavigationToDifferentPage) {
|
| - mToolbar.onNavigatedToDifferentPage();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onPageLoadStarted(Tab tab, String url) {
|
| - updateButtonStatus();
|
| - updateTabLoadingState(true, true);
|
| - }
|
| -
|
| - @Override
|
| - public void onPageLoadFinished(Tab tab) {
|
| - ToolbarManager.this.onPageLoadFinished();
|
| - }
|
| -
|
| - @Override
|
| - public void onPageLoadFailed(Tab tab, int errorCode) {
|
| - ToolbarManager.this.onPageLoadFailed();
|
| - }
|
| -
|
| - @Override
|
| - public void onTitleUpdated(Tab tab) {
|
| - mLocationBar.setTitleToPageTitle();
|
| - }
|
| -
|
| - @Override
|
| - public void onUrlUpdated(Tab tab) {
|
| - // Update the SSL security state as a result of this notification as it will
|
| - // sometimes be the only update we receive.
|
| - updateTabLoadingState(false, true);
|
| -
|
| - // A URL update is a decent enough indicator that the toolbar widget is in
|
| - // a stable state to capture its bitmap for use in fullscreen.
|
| - mControlContainer.setReadyForBitmapCapture(true);
|
| - }
|
| -
|
| - @Override
|
| - public void onCrash(Tab tab, boolean sadTabShown) {
|
| - onTabCrash();
|
| - }
|
| -
|
| - @Override
|
| - public void onLoadProgressChanged(Tab tab, int progress) {
|
| - updateLoadProgress(progress);
|
| - }
|
| -
|
| - @Override
|
| - public void onContentChanged(Tab tab) {
|
| - mToolbar.onTabContentViewChanged();
|
| - }
|
| -
|
| - @Override
|
| - public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) {
|
| - if (!didStartLoad) return;
|
| -
|
| - ChromeTab chromeTab = ChromeTab.fromTab(tab);
|
| - if (!chromeTab.getBackgroundContentViewHelper().isPageSwappingInProgress()
|
| - && didFinishLoad) {
|
| - mLoadProgressSimulator.start();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onDidStartNavigationToPendingEntry(Tab tab, String url) {
|
| - // Update URL as soon as it becomes available when it's a new tab.
|
| - // But we want to update only when it's a new tab. So we check whether the current
|
| - // navigation entry is initial, meaning whether it has the same target URL as the
|
| - // initial URL of the tab.
|
| - WebContents webContents = tab.getWebContents();
|
| - if (webContents == null) return;
|
| - NavigationController navigationController = webContents.getNavigationController();
|
| - if (navigationController == null) return;
|
| - if (navigationController.isInitialNavigation()) {
|
| - mLocationBar.setUrlToPageUrl();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onLoadUrl(Tab tab, LoadUrlParams params, int loadType) {
|
| - NewTabPage ntp = mToolbarModel.getNewTabPageForCurrentTab();
|
| - if (ntp == null) return;
|
| - if (!NewTabPage.isNTPUrl(params.getUrl())
|
| - && loadType != TabLoadStatus.PAGE_LOAD_FAILED) {
|
| - ntp.setUrlFocusAnimationsDisabled(true);
|
| - mToolbar.onTabOrModelChanged();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onDidFailLoad(Tab tab, boolean isProvisionalLoad, boolean isMainFrame,
|
| - int errorCode, String description, String failingUrl) {
|
| - NewTabPage ntp = mToolbarModel.getNewTabPageForCurrentTab();
|
| - if (ntp == null) return;
|
| - if (isProvisionalLoad && isMainFrame) {
|
| - ntp.setUrlFocusAnimationsDisabled(false);
|
| - mToolbar.onTabOrModelChanged();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onContextualActionBarVisibilityChanged(Tab tab, boolean visible) {
|
| - if (visible) RecordUserAction.record("MobileActionBarShown");
|
| - ActionBar actionBar = mActionBarDelegate.getSupportActionBar();
|
| - if (!visible && actionBar != null) actionBar.hide();
|
| - if (DeviceFormFactor.isTablet(activity)) {
|
| - if (visible) {
|
| - mContextualMenuBar.showControls();
|
| - } else {
|
| - mContextualMenuBar.hideControls();
|
| - }
|
| - }
|
| - }
|
| - };
|
| -
|
| - mBookmarksObserver = new BookmarksBridge.BookmarkModelObserver() {
|
| - @Override
|
| - public void bookmarkModelChanged() {
|
| - updateBookmarkButtonStatus();
|
| - }
|
| - };
|
| -
|
| - mFindToolbarObserver = new FindToolbarObserver() {
|
| - @Override
|
| - public void onFindToolbarShown() {
|
| - mToolbar.handleFindToolbarStateChange(true);
|
| - if (mFullscreenManager != null) {
|
| - mFullscreenFindInPageToken =
|
| - mFullscreenManager.showControlsPersistentAndClearOldToken(
|
| - mFullscreenFindInPageToken);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onFindToolbarHidden() {
|
| - mToolbar.handleFindToolbarStateChange(false);
|
| - if (mFullscreenManager != null) {
|
| - mFullscreenManager.hideControlsPersistent(mFullscreenFindInPageToken);
|
| - mFullscreenFindInPageToken = FullscreenManager.INVALID_TOKEN;
|
| - }
|
| - }
|
| - };
|
| -
|
| - mOverviewModeObserver = new EmptyOverviewModeObserver() {
|
| - @Override
|
| - public void onOverviewModeStartedShowing(boolean showToolbar) {
|
| - mToolbar.setTabSwitcherMode(true, showToolbar, false);
|
| - updateButtonStatus();
|
| - }
|
| -
|
| - @Override
|
| - public void onOverviewModeStartedHiding(boolean showToolbar, boolean delayAnimation) {
|
| - mToolbar.setTabSwitcherMode(false, showToolbar, delayAnimation);
|
| - updateButtonStatus();
|
| - }
|
| -
|
| - @Override
|
| - public void onOverviewModeFinishedHiding() {
|
| - mToolbar.onTabSwitcherTransitionFinished();
|
| - }
|
| - };
|
| -
|
| - mSceneChangeObserver = new SceneChangeObserver() {
|
| - @Override
|
| - public void onTabSelectionHinted(int tabId) {
|
| - mPreselectedTabId = tabId;
|
| - refreshSelectedTab();
|
| - }
|
| -
|
| - @Override
|
| - public void onSceneChange(Layout layout) {
|
| - mToolbar.setContentAttached(layout.shouldDisplayContentOverlay());
|
| - }
|
| - };
|
| -
|
| - mLoadProgressSimulator = new LoadProgressSimulator(this);
|
| - }
|
| -
|
| - /**
|
| - * Initialize the manager with the components that had native initialization dependencies.
|
| - * <p>
|
| - * Calling this must occur after the native library have completely loaded.
|
| - *
|
| - * @param tabModelSelector The selector that handles tab management.
|
| - * @param fullscreenManager The manager in charge of interacting with the fullscreen feature.
|
| - * @param findToolbarManager The manager for find in page.
|
| - * @param overviewModeBehavior The overview mode manager.
|
| - * @param layoutDriver A {@link LayoutManager} instance used to watch for scene changes.
|
| - */
|
| - public void initializeWithNative(TabModelSelector tabModelSelector,
|
| - ChromeFullscreenManager fullscreenManager,
|
| - final FindToolbarManager findToolbarManager,
|
| - final OverviewModeBehavior overviewModeBehavior,
|
| - final LayoutManager layoutDriver,
|
| - OnClickListener tabSwitcherClickHandler,
|
| - OnClickListener newTabClickHandler,
|
| - OnClickListener bookmarkClickHandler,
|
| - OnClickListener customTabsBackClickHandler) {
|
| - assert !mInitializedWithNative;
|
| - mTabModelSelector = tabModelSelector;
|
| -
|
| - mToolbar.getLocationBar().updateVisualsForState();
|
| - mToolbar.getLocationBar().setUrlToPageUrl();
|
| - mToolbar.setOnTabSwitcherClickHandler(tabSwitcherClickHandler);
|
| - mToolbar.setOnNewTabClickHandler(newTabClickHandler);
|
| - mToolbar.setBookmarkClickHandler(bookmarkClickHandler);
|
| - mToolbar.setCustomTabReturnClickHandler(customTabsBackClickHandler);
|
| -
|
| - mToolbarModel.initializeWithNative();
|
| -
|
| - mToolbar.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
|
| - @Override
|
| - public void onViewDetachedFromWindow(View v) {
|
| - Context context = mToolbar.getContext();
|
| - HomepageManager.getInstance(context).removeListener(mHomepageStateListener);
|
| - mTabModelSelector.removeObserver(mTabModelSelectorObserver);
|
| - for (TabModel model : mTabModelSelector.getModels()) {
|
| - model.removeObserver(mTabModelObserver);
|
| - }
|
| - if (mBookmarksBridge != null) {
|
| - mBookmarksBridge.destroy();
|
| - mBookmarksBridge = null;
|
| - }
|
| - if (mTemplateUrlObserver != null) {
|
| - TemplateUrlService.getInstance().removeObserver(mTemplateUrlObserver);
|
| - mTemplateUrlObserver = null;
|
| - }
|
| -
|
| - findToolbarManager.removeObserver(mFindToolbarObserver);
|
| - if (overviewModeBehavior != null) {
|
| - overviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver);
|
| - }
|
| - if (layoutDriver != null) {
|
| - layoutDriver.removeSceneChangeObserver(mSceneChangeObserver);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onViewAttachedToWindow(View v) {
|
| - // As we have only just registered for notifications, any that were sent prior to
|
| - // this may have been missed.
|
| - // Calling refreshSelectedTab in case we missed the initial selection notification.
|
| - refreshSelectedTab();
|
| - }
|
| - });
|
| -
|
| - mFindToolbarManager = findToolbarManager;
|
| -
|
| - assert fullscreenManager != null;
|
| - mFullscreenManager = fullscreenManager;
|
| -
|
| - mNativeLibraryReady = false;
|
| -
|
| - findToolbarManager.addObserver(mFindToolbarObserver);
|
| - if (overviewModeBehavior != null) {
|
| - overviewModeBehavior.addOverviewModeObserver(mOverviewModeObserver);
|
| - }
|
| - if (layoutDriver != null) layoutDriver.addSceneChangeObserver(mSceneChangeObserver);
|
| -
|
| - onNativeLibraryReady();
|
| - mInitializedWithNative = true;
|
| - }
|
| -
|
| - /**
|
| - * @return The toolbar interface that this manager handles.
|
| - */
|
| - public Toolbar getToolbar() {
|
| - return mToolbar;
|
| - }
|
| -
|
| - /**
|
| - * @return The menu bar for handling contextual text selection.
|
| - */
|
| - public ContextualMenuBar getContextualMenuBar() {
|
| - return mContextualMenuBar;
|
| - }
|
| -
|
| - /**
|
| - * @return Whether the UI has been initialized.
|
| - */
|
| - public boolean isInitialized() {
|
| - return mInitializedWithNative;
|
| - }
|
| -
|
| - /**
|
| - * @return The view that the pop up menu should be anchored to on the UI.
|
| - */
|
| - public View getMenuAnchor() {
|
| - return mToolbar.getLocationBar().getMenuAnchor();
|
| - }
|
| -
|
| - /**
|
| - * Adds a custom action button to the {@link Toolbar} if it is supported.
|
| - * @param buttonSource The {@link Bitmap} resource to use as the source for the button.
|
| - * @param listener The {@link OnClickListener} to use for clicks to the button.
|
| - */
|
| - public void addCustomActionButton(Bitmap buttonSource, OnClickListener listener) {
|
| - mToolbar.addCustomActionButton(buttonSource, listener);
|
| - }
|
| -
|
| - /**
|
| - * Call to tear down all of the toolbar dependencies.
|
| - */
|
| - public void destroy() {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - if (currentTab != null) currentTab.removeObserver(mTabObserver);
|
| - }
|
| -
|
| - /**
|
| - * Called when the orientation of the activity has changed.
|
| - */
|
| - public void onOrientationChange() {
|
| - mContextualMenuBar.showControlsOnOrientationChange();
|
| - }
|
| -
|
| - /**
|
| - * Called when the accessibility enabled state changes.
|
| - * @param enabled Whether accessibility is enabled.
|
| - */
|
| - public void onAccessibilityStatusChanged(boolean enabled) {
|
| - mToolbar.onAccessibilityStatusChanged(enabled);
|
| - }
|
| -
|
| - private void registerTemplateUrlObserver() {
|
| - final TemplateUrlService templateUrlService = TemplateUrlService.getInstance();
|
| - assert mTemplateUrlObserver == null;
|
| - mTemplateUrlObserver = new TemplateUrlServiceObserver() {
|
| - private TemplateUrl mSearchEngine =
|
| - templateUrlService.getDefaultSearchEngineTemplateUrl();
|
| -
|
| - @Override
|
| - public void onTemplateURLServiceChanged() {
|
| - TemplateUrl searchEngine = templateUrlService.getDefaultSearchEngineTemplateUrl();
|
| - if ((mSearchEngine == null && searchEngine == null)
|
| - || (mSearchEngine != null && mSearchEngine.equals(searchEngine))) {
|
| - return;
|
| - }
|
| -
|
| - mSearchEngine = searchEngine;
|
| - mToolbar.onDefaultSearchEngineChanged();
|
| - }
|
| - };
|
| - templateUrlService.addObserver(mTemplateUrlObserver);
|
| - }
|
| -
|
| - private void onNativeLibraryReady() {
|
| - mNativeLibraryReady = true;
|
| - mToolbar.onNativeLibraryReady();
|
| -
|
| - final TemplateUrlService templateUrlService = TemplateUrlService.getInstance();
|
| - TemplateUrlService.LoadListener mTemplateServiceLoadListener =
|
| - new TemplateUrlService.LoadListener() {
|
| - @Override
|
| - public void onTemplateUrlServiceLoaded() {
|
| - registerTemplateUrlObserver();
|
| - templateUrlService.unregisterLoadListener(this);
|
| - }
|
| - };
|
| - templateUrlService.registerLoadListener(mTemplateServiceLoadListener);
|
| - if (templateUrlService.isLoaded()) {
|
| - mTemplateServiceLoadListener.onTemplateUrlServiceLoaded();
|
| - } else {
|
| - templateUrlService.load();
|
| - }
|
| -
|
| - mTabModelSelector.addObserver(mTabModelSelectorObserver);
|
| - for (TabModel model : mTabModelSelector.getModels()) model.addObserver(mTabModelObserver);
|
| -
|
| - refreshSelectedTab();
|
| - if (mTabModelSelector.isTabStateInitialized()) mTabRestoreCompleted = true;
|
| - handleTabRestoreCompleted();
|
| - }
|
| -
|
| - private void handleTabRestoreCompleted() {
|
| - if (!mTabRestoreCompleted || !mNativeLibraryReady) return;
|
| - mToolbar.onStateRestored();
|
| - updateTabCount();
|
| - }
|
| -
|
| - /**
|
| - * Sets the handler for any special case handling related with the menu button.
|
| - * @param menuHandler The handler to be used.
|
| - */
|
| - private void setMenuHandler(AppMenuHandler menuHandler) {
|
| - menuHandler.addObserver(new AppMenuObserver() {
|
| - @Override
|
| - public void onMenuVisibilityChanged(boolean isVisible) {
|
| - if (mFullscreenManager == null) return;
|
| - if (isVisible) {
|
| - mFullscreenMenuToken =
|
| - mFullscreenManager.showControlsPersistentAndClearOldToken(
|
| - mFullscreenMenuToken);
|
| - } else {
|
| - mFullscreenManager.hideControlsPersistent(mFullscreenMenuToken);
|
| - mFullscreenMenuToken = FullscreenManager.INVALID_TOKEN;
|
| - }
|
| - }
|
| - });
|
| - mAppMenuButtonHelper = new AppMenuButtonHelper(menuHandler);
|
| - mAppMenuButtonHelper.setOnAppMenuShownListener(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - RecordUserAction.record("MobileToolbarShowMenu");
|
| - }
|
| - });
|
| - mLocationBar.setMenuButtonHelper(mAppMenuButtonHelper);
|
| - }
|
| -
|
| - /**
|
| - * Set the delegate that will handle updates from toolbar driven state changes.
|
| - * @param menuDelegatePhone The menu delegate to be updated (only applicable to phones).
|
| - */
|
| - public void setMenuDelegatePhone(MenuDelegatePhone menuDelegatePhone) {
|
| - mMenuDelegatePhone = menuDelegatePhone;
|
| - }
|
| -
|
| - @Override
|
| - public boolean back() {
|
| - Tab tab = mToolbarModel.getTab();
|
| - if (tab != null && tab.canGoBack()) {
|
| - tab.goBack();
|
| - updateButtonStatus();
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - @Override
|
| - public boolean forward() {
|
| - Tab tab = mToolbarModel.getTab();
|
| - if (tab != null && tab.canGoForward()) {
|
| - tab.goForward();
|
| - updateButtonStatus();
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - @Override
|
| - public void stopOrReloadCurrentTab() {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - if (currentTab != null) {
|
| - if (currentTab.isLoading()) {
|
| - currentTab.stopLoading();
|
| - } else {
|
| - currentTab.reload();
|
| - RecordUserAction.record("MobileToolbarReload");
|
| - }
|
| - }
|
| - updateButtonStatus();
|
| - }
|
| -
|
| - @Override
|
| - public void openHomepage() {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - assert currentTab != null;
|
| - Context context = mToolbar.getContext();
|
| - String homePageUrl = HomepageManager.getHomepageUri(context);
|
| - if (TextUtils.isEmpty(homePageUrl)) {
|
| - homePageUrl = UrlConstants.NTP_URL;
|
| - }
|
| - currentTab.loadUrl(new LoadUrlParams(homePageUrl, PageTransition.HOME_PAGE));
|
| - }
|
| -
|
| - /**
|
| - * Triggered when the URL input field has gained or lost focus.
|
| - * @param hasFocus Whether the URL field has gained focus.
|
| - */
|
| - @Override
|
| - public void onUrlFocusChange(boolean hasFocus) {
|
| - mToolbar.onUrlFocusChange(hasFocus);
|
| -
|
| - if (mFindToolbarManager != null && hasFocus) mFindToolbarManager.hideToolbar();
|
| -
|
| - if (mFullscreenManager == null) return;
|
| - if (hasFocus) {
|
| - mFullscreenFocusToken = mFullscreenManager.showControlsPersistentAndClearOldToken(
|
| - mFullscreenFocusToken);
|
| - } else {
|
| - mFullscreenManager.hideControlsPersistent(mFullscreenFocusToken);
|
| - mFullscreenFocusToken = FullscreenManager.INVALID_TOKEN;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Update the primary color used by the model to the given color.
|
| - * @param color The primary color for the current tab.
|
| - */
|
| - public void updatePrimaryColor(int color) {
|
| - boolean colorChanged = mToolbarModel.getPrimaryColor() != color;
|
| - if (!colorChanged) return;
|
| -
|
| - mToolbarModel.setPrimaryColor(color);
|
| - mToolbar.onPrimaryColorChanged();
|
| - }
|
| -
|
| - /**
|
| - * Focuses or unfocuses the URL bar.
|
| - * @param focused Whether URL bar should be focused.
|
| - */
|
| - public void setUrlBarFocus(boolean focused) {
|
| - if (!isInitialized()) return;
|
| - mToolbar.getLocationBar().setUrlBarFocus(focused);
|
| - }
|
| -
|
| - /**
|
| - * @return Whether {@link Toolbar} has drawn at least once.
|
| - */
|
| - public boolean hasDoneFirstDraw() {
|
| - return mToolbar.getFirstDrawTime() != 0;
|
| - }
|
| -
|
| - /**
|
| - * Handle all necessary tasks that can be delayed until initialization completes.
|
| - * @param activityCreationTimeMs The time of creation for the activity this toolbar belongs to.
|
| - * @param activityName Simple class name for the activity this toolbar belongs to.
|
| - */
|
| - public void onDeferredStartup(final long activityCreationTimeMs,
|
| - final String activityName) {
|
| - // Record startup performance statistics
|
| - long elapsedTime = SystemClock.elapsedRealtime() - activityCreationTimeMs;
|
| - if (elapsedTime < RECORD_UMA_PERFORMANCE_METRICS_DELAY_MS) {
|
| - ThreadUtils.postOnUiThreadDelayed(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - onDeferredStartup(activityCreationTimeMs, activityName);
|
| - }
|
| - }, RECORD_UMA_PERFORMANCE_METRICS_DELAY_MS - elapsedTime);
|
| - }
|
| - RecordHistogram.recordTimesHistogram("MobileStartup.ToolbarFirstDrawTime." + activityName,
|
| - mToolbar.getFirstDrawTime() - activityCreationTimeMs, TimeUnit.MILLISECONDS);
|
| -
|
| - long firstFocusTime = mToolbar.getLocationBar().getFirstUrlBarFocusTime();
|
| - if (firstFocusTime != 0) {
|
| - RecordHistogram.recordCustomTimesHistogram(
|
| - "MobileStartup.ToolbarFirstFocusTime." + activityName,
|
| - firstFocusTime - activityCreationTimeMs, MIN_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS,
|
| - MAX_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS, TimeUnit.MILLISECONDS, 50);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Finish any toolbar animations.
|
| - */
|
| - public void finishAnimations() {
|
| - if (isInitialized()) mToolbar.finishAnimations();
|
| - }
|
| -
|
| - /**
|
| - * Updates the current number of Tabs based on the TabModel this Toolbar contains.
|
| - */
|
| - private void updateTabCount() {
|
| - if (!mTabRestoreCompleted) return;
|
| - mToolbar.updateTabCountVisuals(mTabModelSelector.getCurrentModel().getCount());
|
| - }
|
| -
|
| - /**
|
| - * Updates the current button states and calls appropriate abstract visibility methods, giving
|
| - * inheriting classes the chance to update the button visuals as well.
|
| - */
|
| - private void updateButtonStatus() {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - boolean tabCrashed = currentTab != null && currentTab.isShowingSadTab();
|
| -
|
| - mToolbar.updateBackButtonVisibility(currentTab != null && currentTab.canGoBack());
|
| - mToolbar.updateForwardButtonVisibility(currentTab != null && currentTab.canGoForward());
|
| - updateReloadState(tabCrashed);
|
| - updateBookmarkButtonStatus();
|
| -
|
| - mToolbar.getMenuButton().setVisibility(
|
| - mToolbar.shouldShowMenuButton() ? View.VISIBLE : View.GONE);
|
| - }
|
| -
|
| - private void updateBookmarkButtonStatus() {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - boolean isBookmarked = currentTab != null
|
| - && currentTab.getBookmarkId() != ChromeBrowserProviderClient.INVALID_BOOKMARK_ID;
|
| - mToolbar.updateBookmarkButtonVisibility(isBookmarked);
|
| - }
|
| -
|
| - private void updateReloadState(boolean tabCrashed) {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - boolean isLoading = false;
|
| - if (!tabCrashed) {
|
| - isLoading = (currentTab != null && currentTab.isLoading()) || !mNativeLibraryReady;
|
| - }
|
| - mToolbar.updateReloadButtonVisibility(isLoading);
|
| - if (mMenuDelegatePhone != null) mMenuDelegatePhone.updateReloadButtonState(isLoading);
|
| - }
|
| -
|
| - /**
|
| - * Triggered when the selected tab has changed.
|
| - */
|
| - private void refreshSelectedTab() {
|
| - ChromeTab tab = null;
|
| - if (mPreselectedTabId != Tab.INVALID_TAB_ID) {
|
| - tab = ChromeTab.fromTab(mTabModelSelector.getTabById(mPreselectedTabId));
|
| - }
|
| - if (tab == null) tab = ChromeTab.fromTab(mTabModelSelector.getCurrentTab());
|
| -
|
| - boolean wasIncognito = mToolbarModel.isIncognito();
|
| - ChromeTab previousTab = ChromeTab.fromTab(mToolbarModel.getTab());
|
| -
|
| - boolean isIncognito =
|
| - tab != null ? tab.isIncognito() : mTabModelSelector.isIncognitoSelected();
|
| - mToolbarModel.setTab(tab, isIncognito);
|
| -
|
| - updateCurrentTabDisplayStatus();
|
| - if (previousTab != tab || wasIncognito != isIncognito) {
|
| - if (previousTab != tab) {
|
| - if (previousTab != null) previousTab.removeObserver(mTabObserver);
|
| - if (tab != null) tab.addObserver(mTabObserver);
|
| - }
|
| - int defaultPrimaryColor = isIncognito
|
| - ? mToolbar.getResources().getColor(R.color.incognito_primary_color)
|
| - : mToolbar.getResources().getColor(R.color.default_primary_color);
|
| - int primaryColor = (tab != null && tab.getWebContents() != null)
|
| - ? tab.getWebContents().getThemeColor(defaultPrimaryColor) : defaultPrimaryColor;
|
| - updatePrimaryColor(primaryColor);
|
| -
|
| - mToolbar.onTabOrModelChanged();
|
| -
|
| - if (tab != null && tab.getWebContents() != null
|
| - && tab.getWebContents().isLoadingToDifferentDocument()) {
|
| - mToolbar.onNavigatedToDifferentPage();
|
| - }
|
| - }
|
| -
|
| - Profile profile = mTabModelSelector.getModel(isIncognito).getProfile();
|
| - if (mCurrentProfile != profile) {
|
| - if (mBookmarksBridge != null) mBookmarksBridge.destroy();
|
| - mBookmarksBridge = new BookmarksBridge(profile);
|
| - mBookmarksBridge.addObserver(mBookmarksObserver);
|
| - mLocationBar.setAutocompleteProfile(profile);
|
| - mCurrentProfile = profile;
|
| - }
|
| - }
|
| -
|
| - private void updateCurrentTabDisplayStatus() {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - mLocationBar.setUrlToPageUrl();
|
| - if (currentTab == null) {
|
| - updateLoadProgressInternal(0);
|
| - updateButtonStatus();
|
| - return;
|
| - }
|
| - boolean isLoading = currentTab.isLoading();
|
| - updateTabLoadingState(isLoading, true);
|
| -
|
| - if (currentTab.getProgress() == 100 || currentTab.isShowingInterstitialPage()) {
|
| - // We are switching to a tab that is fully loaded. Don't set the load progress to 1.0,
|
| - // that would cause the load progress bar to show briefly.
|
| - updateLoadProgressInternal(0);
|
| - } else {
|
| - updateLoadProgress(currentTab.getProgress());
|
| - }
|
| - updateButtonStatus();
|
| - }
|
| -
|
| - private void onTabCrash() {
|
| - updateTabLoadingState(false, false);
|
| - updateLoadProgressInternal(0);
|
| - updateButtonStatus();
|
| - }
|
| -
|
| - private void onPageLoadFinished() {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - updateTabLoadingState(false, true);
|
| - int currentProgress = currentTab.getProgress();
|
| - if (currentProgress != 100) {
|
| - // If we made some progress, fast-forward to complete, otherwise just dismiss any
|
| - // MINIMUM_LOAD_PROGRESS that had been set.
|
| - if (currentProgress > MINIMUM_LOAD_PROGRESS) {
|
| - updateLoadProgress(100);
|
| - } else {
|
| - updateLoadProgressInternal(0);
|
| - }
|
| - }
|
| - updateButtonStatus();
|
| - }
|
| -
|
| - private void onPageLoadFailed() {
|
| - updateTabLoadingState(false, true);
|
| - updateButtonStatus();
|
| - updateLoadProgressInternal(0);
|
| - }
|
| -
|
| - private void updateTabLoadingState(boolean isLoading, boolean updateUrl) {
|
| - Tab currentTab = mToolbarModel.getTab();
|
| - mLocationBar.updateLoadingState(updateUrl);
|
| - if (isLoading) updateLoadProgress(currentTab.getProgress());
|
| - if (updateUrl) updateButtonStatus();
|
| - }
|
| -
|
| - private void updateLoadProgressInternal(int progress) {
|
| - if (progress == mToolbarModel.getLoadProgress()) return;
|
| - mToolbarModel.setLoadProgress(progress);
|
| - mToolbar.setLoadProgress(progress);
|
| - if (progress == 0) mLoadProgressSimulator.cancel();
|
| - }
|
| -
|
| - private void updateLoadProgress(int progress) {
|
| - mLoadProgressSimulator.cancel();
|
| - progress = Math.max(progress, MINIMUM_LOAD_PROGRESS);
|
| - Tab tab = mToolbarModel.getTab();
|
| - if (tab != null
|
| - && NativePageFactory.isNativePageUrl(tab.getUrl(), tab.isIncognito())) {
|
| - progress = 0;
|
| - }
|
| - updateLoadProgressInternal(progress);
|
| - if (progress == 100 || progress == 0) {
|
| - updateButtonStatus();
|
| - } else {
|
| - // Update the reload state regardless or whether or not the progress is 100.
|
| - updateReloadState(false);
|
| - }
|
| - }
|
| -
|
| - private static class LoadProgressSimulator {
|
| - private static final int MSG_ID_UPDATE_PROGRESS = 1;
|
| -
|
| - private static final int PROGRESS_INCREMENT = 10;
|
| - private static final int PROGRESS_INCREMENT_DELAY_MS = 10;
|
| -
|
| - private final ToolbarManager mToolbar;
|
| - private final Handler mHandler;
|
| -
|
| - private int mProgress;
|
| -
|
| - public LoadProgressSimulator(ToolbarManager toolbar) {
|
| - mToolbar = toolbar;
|
| - mHandler = new Handler(Looper.getMainLooper()) {
|
| - @Override
|
| - public void handleMessage(Message msg) {
|
| - assert msg.what == MSG_ID_UPDATE_PROGRESS;
|
| - mProgress = Math.min(100, mProgress += PROGRESS_INCREMENT);
|
| - mToolbar.updateLoadProgressInternal(mProgress);
|
| -
|
| - if (mProgress >= 100) return;
|
| - sendEmptyMessageDelayed(MSG_ID_UPDATE_PROGRESS, PROGRESS_INCREMENT_DELAY_MS);
|
| - }
|
| - };
|
| - }
|
| -
|
| - /**
|
| - * Start simulating load progress from a baseline of 0.
|
| - */
|
| - public void start() {
|
| - mProgress = 0;
|
| - mHandler.sendEmptyMessage(MSG_ID_UPDATE_PROGRESS);
|
| - }
|
| -
|
| - /**
|
| - * Cancels simulating load progress.
|
| - */
|
| - public void cancel() {
|
| - mHandler.removeMessages(MSG_ID_UPDATE_PROGRESS);
|
| - }
|
| - }
|
| -}
|
|
|