| Index: chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
|
| index c20a709a77f3cfc82ea876389fa9efc6bddcd43a..ca3d02333c1b7f7d51b66d8e1e0707f030425700 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
|
| @@ -10,6 +10,7 @@ import android.app.SearchManager;
|
| import android.content.Context;
|
| import android.content.Intent;
|
| import android.content.SharedPreferences;
|
| +import android.content.res.Configuration;
|
| import android.graphics.Bitmap;
|
| import android.graphics.Color;
|
| import android.graphics.Rect;
|
| @@ -47,7 +48,11 @@ import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.BookmarksBridge.BookmarkModelObserver;
|
| import org.chromium.chrome.browser.IntentHandler.IntentHandlerDelegate;
|
| import org.chromium.chrome.browser.IntentHandler.TabOpenType;
|
| +import org.chromium.chrome.browser.appmenu.AppMenu;
|
| import org.chromium.chrome.browser.appmenu.AppMenuHandler;
|
| +import org.chromium.chrome.browser.appmenu.AppMenuObserver;
|
| +import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
|
| +import org.chromium.chrome.browser.appmenu.ChromeAppMenuPropertiesDelegate;
|
| import org.chromium.chrome.browser.bookmark.ManageBookmarkActivity;
|
| import org.chromium.chrome.browser.compositor.CompositorViewHolder;
|
| import org.chromium.chrome.browser.compositor.layouts.Layout;
|
| @@ -101,6 +106,9 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector;
|
| import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
|
| import org.chromium.chrome.browser.tabmodel.TabModelUtils;
|
| import org.chromium.chrome.browser.tabmodel.TabWindowManager;
|
| +import org.chromium.chrome.browser.toolbar.Toolbar;
|
| +import org.chromium.chrome.browser.toolbar.ToolbarControlContainer;
|
| +import org.chromium.chrome.browser.toolbar.ToolbarManager;
|
| import org.chromium.chrome.browser.util.FeatureUtilities;
|
| import org.chromium.chrome.browser.webapps.AddToHomescreenDialog;
|
| import org.chromium.chrome.browser.widget.ControlContainer;
|
| @@ -177,6 +185,9 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| private ReaderModeActivityDelegate mReaderModeActivityDelegate;
|
| private SnackbarManager mSnackbarManager;
|
| private LoFiBarPopupController mLoFiBarPopupController;
|
| + private ChromeAppMenuPropertiesDelegate mAppMenuPropertiesDelegate;
|
| + private AppMenuHandler mAppMenuHandler;
|
| + private ToolbarManager mToolbarManager;
|
|
|
| // Time in ms that it took took us to inflate the initial layout
|
| private long mInflateInitialLayoutDurationMs;
|
| @@ -258,6 +269,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| };
|
| controlContainer.getViewTreeObserver().addOnPreDrawListener(mFirstDrawListener);
|
| }
|
| + initializeToolbar();
|
| }
|
|
|
| /**
|
| @@ -297,6 +309,51 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| }
|
|
|
| /**
|
| + * Constructs {@link ToolbarManager} and the handler necessary for controlling the menu on the
|
| + * {@link Toolbar}. Extending classes can override this call to avoid creating the toolbar.
|
| + */
|
| + protected void initializeToolbar() {
|
| + final View controlContainer = findViewById(R.id.control_container);
|
| + assert controlContainer != null;
|
| + ToolbarControlContainer toolbarContainer = (ToolbarControlContainer) controlContainer;
|
| + mAppMenuPropertiesDelegate = createAppMenuPropertiesDelegate();
|
| + mAppMenuHandler = new AppMenuHandler(this,
|
| + mAppMenuPropertiesDelegate, getAppMenuLayoutId());
|
| + mToolbarManager = new ToolbarManager(this, toolbarContainer, mAppMenuHandler,
|
| + mAppMenuPropertiesDelegate, getCompositorViewHolder().getInvalidator());
|
| + mAppMenuHandler.addObserver(new AppMenuObserver() {
|
| + @Override
|
| + public void onMenuVisibilityChanged(boolean isVisible) {
|
| + if (!isVisible) {
|
| + mAppMenuPropertiesDelegate.onMenuDismissed();
|
| + }
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @return {@link ToolbarManager} that belongs to this activity.
|
| + */
|
| + protected ToolbarManager getToolbarManager() {
|
| + return mToolbarManager;
|
| + }
|
| +
|
| + /**
|
| + * @return The resource id for the menu to use in {@link AppMenu}. Default is R.menu.main_menu.
|
| + */
|
| + protected int getAppMenuLayoutId() {
|
| + return R.menu.main_menu;
|
| + }
|
| +
|
| + /**
|
| + * @return {@link ChromeAppMenuPropertiesDelegate} instance that the {@link AppMenuHandler}
|
| + * should be using in this activity.
|
| + */
|
| + protected ChromeAppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
|
| + return new ChromeAppMenuPropertiesDelegate(this);
|
| + }
|
| +
|
| + /**
|
| * @return The resource id for the layout to use for {@link ControlContainer}. 0 by default.
|
| */
|
| protected int getControlContainerLayoutId() {
|
| @@ -467,6 +524,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
|
|
| @Override
|
| public void onStopWithNative() {
|
| + if (mAppMenuHandler != null) mAppMenuHandler.hideAppMenu();
|
| if (mGSAServiceClient != null) {
|
| mGSAServiceClient.disconnect();
|
| mGSAServiceClient = null;
|
| @@ -487,6 +545,12 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| mIntentHandler.onNewIntent(this, intent);
|
| }
|
|
|
| + @Override
|
| + public boolean hasDoneFirstDraw() {
|
| + return mToolbarManager != null
|
| + ? mToolbarManager.hasDoneFirstDraw() : super.hasDoneFirstDraw();
|
| + }
|
| +
|
| /**
|
| * @return Whether the given activity contains a {@link CustomTab}.
|
| */
|
| @@ -515,8 +579,12 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| getChromeApplication().getUpdateInfoBarHelper().checkForUpdateOnBackgroundThread(this);
|
|
|
| removeSnapshotDatabase();
|
| - RecordHistogram.recordTimesHistogram("MobileStartup.ToolbarInflationTime",
|
| - mInflateInitialLayoutDurationMs, TimeUnit.MILLISECONDS);
|
| + if (mToolbarManager != null) {
|
| + String simpleName = getClass().getSimpleName();
|
| + RecordHistogram.recordTimesHistogram("MobileStartup.ToolbarInflationTime." + simpleName,
|
| + mInflateInitialLayoutDurationMs, TimeUnit.MILLISECONDS);
|
| + mToolbarManager.onDeferredStartup(getOnCreateTimestampMs(), simpleName);
|
| + }
|
| }
|
|
|
| @Override
|
| @@ -617,6 +685,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| * by the {@link WindowAndroid}.
|
| */
|
| protected void onDestroyInternal() {
|
| + if (mToolbarManager != null) mToolbarManager.destroy();
|
| }
|
|
|
| /**
|
| @@ -662,6 +731,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| */
|
| protected void onAccessibilityModeChanged(boolean enabled) {
|
| InfoBarContainer.setIsAllowedToAutoHide(!enabled);
|
| + if (mToolbarManager != null) mToolbarManager.onAccessibilityStatusChanged(enabled);
|
| }
|
|
|
| @Override
|
| @@ -1052,9 +1122,14 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
|
|
| @Override
|
| public void onOrientationChange(int orientation) {
|
| - if (mContextualSearchManager != null) {
|
| - mContextualSearchManager.onOrientationChange();
|
| - }
|
| + if (mContextualSearchManager != null) mContextualSearchManager.onOrientationChange();
|
| + if (mToolbarManager != null) mToolbarManager.onOrientationChange();
|
| + }
|
| +
|
| + @Override
|
| + public void onConfigurationChanged(Configuration newConfig) {
|
| + if (mAppMenuHandler != null) mAppMenuHandler.hideAppMenu();
|
| + super.onConfigurationChanged(newConfig);
|
| }
|
|
|
| @Override
|
| @@ -1096,9 +1171,20 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
|
| return true;
|
| }
|
|
|
| + /**
|
| + * @return The {@link AppMenuHandler} associated with this activity.
|
| + */
|
| @VisibleForTesting
|
| public AppMenuHandler getAppMenuHandler() {
|
| - return null;
|
| + return mAppMenuHandler;
|
| + }
|
| +
|
| + /**
|
| + * @return The {@link AppMenuPropertiesDelegate} associated with this activity.
|
| + */
|
| + @VisibleForTesting
|
| + public ChromeAppMenuPropertiesDelegate getAppMenuPropertiesDelegate() {
|
| + return mAppMenuPropertiesDelegate;
|
| }
|
|
|
| /**
|
|
|