Index: chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..476caddcebf16374fe5cca8806652e288066fa7b |
--- /dev/null |
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java |
@@ -0,0 +1,150 @@ |
+// 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.compositor.layouts; |
+ |
+import android.content.Context; |
+import android.view.ViewGroup; |
+ |
+import org.chromium.chrome.browser.Tab; |
+import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; |
+import org.chromium.chrome.browser.compositor.layouts.phone.SimpleAnimationLayout; |
+import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; |
+import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate; |
+import org.chromium.chrome.browser.tabmodel.TabCreatorManager; |
+import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
+import org.chromium.chrome.browser.tabmodel.TabModelUtils; |
+import org.chromium.ui.resources.dynamics.DynamicResourceLoader; |
+ |
+/** |
+ * {@link LayoutManagerChromePhone} is the specialization of {@link LayoutManagerChrome} for the |
+ * phone. |
+ */ |
+public class LayoutManagerChromePhone extends LayoutManagerChrome { |
+ // Layouts |
+ private final Layout mSimpleAnimationLayout; |
+ |
+ /** |
+ * Creates an instance of a {@link LayoutManagerChromePhone}. |
+ * @param host A {@link LayoutManagerHost} instance. |
+ * @param overviewLayoutFactoryDelegate A {@link OverviewLayoutFactoryDelegate} instance. |
+ */ |
+ public LayoutManagerChromePhone( |
+ LayoutManagerHost host, OverviewLayoutFactoryDelegate overviewLayoutFactoryDelegate) { |
+ super(host, overviewLayoutFactoryDelegate); |
+ Context context = host.getContext(); |
+ LayoutRenderHost renderHost = host.getLayoutRenderHost(); |
+ |
+ // Build Layouts |
+ mSimpleAnimationLayout = |
+ new SimpleAnimationLayout(context, this, renderHost, mBlackHoleEventFilter); |
+ |
+ // Set up layout parameters |
+ mStaticLayout.setLayoutHandlesTabLifecycles(false); |
+ mToolbarSwipeLayout.setMovesToolbar(true); |
+ } |
+ |
+ @Override |
+ public void init(TabModelSelector selector, TabCreatorManager creator, |
+ TabContentManager content, ViewGroup androidContentContainer, |
+ ContextualSearchManagementDelegate contextualSearchDelegate, |
+ DynamicResourceLoader dynamicResourceLoader) { |
+ // Initialize Layouts |
+ mSimpleAnimationLayout.setTabModelSelector(selector, content); |
+ |
+ super.init(selector, creator, content, androidContentContainer, contextualSearchDelegate, |
+ dynamicResourceLoader); |
+ } |
+ |
+ @Override |
+ protected LayoutManagerTabModelObserver createTabModelObserver() { |
+ return new LayoutManagerTabModelObserver() { |
+ @Override |
+ public void willCloseTab(Tab tab, boolean animate) { |
+ super.willCloseTab(tab, animate); |
+ if (animate) tabClosing(tab.getId()); |
+ } |
+ }; |
+ } |
+ |
+ @Override |
+ protected void addGlobalSceneOverlay(SceneOverlay helper) { |
+ super.addGlobalSceneOverlay(helper); |
+ mSimpleAnimationLayout.addSceneOverlay(helper); |
+ } |
+ |
+ @Override |
+ protected void emptyCachesExcept(int tabId) { |
+ super.emptyCachesExcept(tabId); |
+ if (mTitleCache != null) mTitleCache.clearExcept(tabId); |
+ } |
+ |
+ private void tabClosing(int id) { |
+ Tab closedTab = getTabById(id); |
+ if (closedTab == null) return; |
+ |
+ if (getActiveLayout().handlesTabClosing()) { |
+ // The user is currently interacting with the {@code LayoutHost}. |
+ // Allow the foreground layout to animate the tab closing. |
+ getActiveLayout().onTabClosing(time(), id); |
+ } else if (mEnableAnimations) { |
+ startShowing(mSimpleAnimationLayout, false); |
+ getActiveLayout().onTabClosing(time(), id); |
+ } |
+ } |
+ |
+ @Override |
+ protected void tabClosed(int id, int nextId, boolean incognito) { |
+ boolean showOverview = nextId == Tab.INVALID_TAB_ID; |
+ Layout overviewLayout = useAccessibilityLayout() ? mOverviewListLayout : mOverviewLayout; |
+ if (getActiveLayout() != overviewLayout && showOverview) { |
+ // Since there will be no 'next' tab to display, switch to |
+ // overview mode when the animation is finished. |
+ setNextLayout(overviewLayout); |
+ } |
+ getActiveLayout().onTabClosed(time(), id, nextId, incognito); |
+ Tab nextTab = getTabById(nextId); |
+ if (nextTab != null) nextTab.requestFocus(); |
+ if (getActiveLayout() != overviewLayout && showOverview && !mEnableAnimations) { |
+ startShowing(overviewLayout, false); |
+ } |
+ } |
+ |
+ @Override |
+ protected void tabCreating(int sourceId, String url, boolean isIncognito) { |
+ if (!getActiveLayout().isHiding() && getActiveLayout().handlesTabCreating()) { |
+ // If the current layout in the foreground, let it handle the tab creation animation. |
+ // This check allows us to switch from the StackLayout to the SimpleAnimationLayout |
+ // smoothly. |
+ getActiveLayout().onTabCreating(sourceId); |
+ } else if (mEnableAnimations) { |
+ if (getActiveLayout() != null && getActiveLayout().isHiding()) { |
+ setNextLayout(mSimpleAnimationLayout); |
+ // The method Layout#doneHiding() will automatically show the next layout. |
+ getActiveLayout().doneHiding(); |
+ } else { |
+ startShowing(mSimpleAnimationLayout, false); |
+ } |
+ getActiveLayout().onTabCreating(sourceId); |
+ } |
+ } |
+ |
+ @Override |
+ protected void tabCreated(int id, int sourceId, TabLaunchType launchType, boolean isIncognito, |
+ boolean willBeSelected, float originX, float originY) { |
+ super.tabCreated(id, sourceId, launchType, isIncognito, willBeSelected, originX, originY); |
+ |
+ if (willBeSelected) { |
+ Tab newTab = TabModelUtils.getTabById(getTabModelSelector().getModel(isIncognito), id); |
+ if (newTab != null) newTab.requestFocus(); |
+ } |
+ } |
+ |
+ @Override |
+ public void releaseTabLayout(int id) { |
+ mTitleCache.remove(id); |
+ super.releaseTabLayout(id); |
+ } |
+} |