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

Unified Diff: chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java

Issue 1206673003: Merge java_staging/src into java/src. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 6 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 side-by-side diff with in-line comments
Download patch
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);
- }
- }
-}

Powered by Google App Engine
This is Rietveld 408576698