Index: chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ffafcbedd72c89ea71a4fa176abc564888350608 |
--- /dev/null |
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java |
@@ -0,0 +1,246 @@ |
+// 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.text.TextUtils; |
+import android.view.ViewGroup; |
+ |
+import com.google.android.apps.chrome.R; |
+ |
+import org.chromium.chrome.browser.Tab; |
+import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; |
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.AreaGestureEventFilter; |
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeEventFilter.ScrollDirection; |
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler; |
+import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager; |
+import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate; |
+import org.chromium.chrome.browser.tabmodel.TabCreatorManager; |
+import org.chromium.chrome.browser.tabmodel.TabModel; |
+import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; |
+import org.chromium.ui.resources.dynamics.DynamicResourceLoader; |
+ |
+import java.util.List; |
+ |
+/** |
+ * {@link LayoutManagerChromeTablet} is the specialization of {@link LayoutManagerChrome} for |
+ * the tablet. |
+ */ |
+public class LayoutManagerChromeTablet extends LayoutManagerChrome { |
+ // Event Filters |
+ private final AreaGestureEventFilter mTabStripFilter; |
+ |
+ // Internal State |
+ private final String mDefaultTitle; |
+ |
+ private StripLayoutHelperManager mTabStripLayoutHelperManager; |
+ private TabModelSelectorTabObserver mTabObserver; |
+ |
+ /** |
+ * Creates an instance of a {@link LayoutManagerChromePhone}. |
+ * @param host A {@link LayoutManagerHost} instance. |
+ * @param overviewLayoutFactoryDelegate A {@link OverviewLayoutFactoryDelegate} instance. |
+ */ |
+ public LayoutManagerChromeTablet( |
+ LayoutManagerHost host, OverviewLayoutFactoryDelegate overviewLayoutFactoryDelegate) { |
+ super(host, overviewLayoutFactoryDelegate); |
+ Context context = host.getContext(); |
+ |
+ // Build Event Filters |
+ mTabStripFilter = new AreaGestureEventFilter( |
+ context, this, new TabStripEventHandler(), null, false, false); |
+ |
+ mTabStripLayoutHelperManager = new StripLayoutHelperManager( |
+ context, this, mHost.getLayoutRenderHost(), mTabStripFilter); |
+ |
+ // Set up state |
+ mDefaultTitle = context.getString(R.string.tab_loading_default_title); |
+ |
+ addGlobalSceneOverlay(mTabStripLayoutHelperManager); |
+ |
+ setNextLayout(null); |
+ } |
+ |
+ @Override |
+ public void destroy() { |
+ super.destroy(); |
+ |
+ if (mTabStripLayoutHelperManager != null) { |
+ mTabStripLayoutHelperManager.destroy(); |
+ mTabStripLayoutHelperManager = null; |
+ } |
+ |
+ if (mTabObserver != null) { |
+ mTabObserver.destroy(); |
+ mTabObserver = null; |
+ } |
+ } |
+ |
+ @Override |
+ protected ToolbarSwipeHandler createToolbarSwipeHandler(LayoutProvider provider) { |
+ return new TabletToolbarSwipeHandler(provider); |
+ } |
+ |
+ @Override |
+ public void tabSelected(int tabId, int prevId, boolean incognito) { |
+ if (getActiveLayout() == mStaticLayout || getActiveLayout() == mOverviewListLayout) { |
+ super.tabSelected(tabId, prevId, incognito); |
+ } else { |
+ startShowing(mStaticLayout, false); |
+ // TODO(dtrainor, jscholler): This is hacky because we're relying on it to set the |
+ // internal tab to show and not start hiding until we're done calling finalizeShowing(). |
+ // This prevents a flicker because we properly build and set the internal |
+ // {@link LayoutTab} before actually showing the {@link TabView}. |
+ if (getActiveLayout() != null) { |
+ getActiveLayout().onTabSelected(time(), tabId, prevId, incognito); |
+ } |
+ if (getActiveLayout() != null) getActiveLayout().onTabSelecting(time(), tabId); |
+ } |
+ } |
+ |
+ @Override |
+ protected void tabCreated(int id, int sourceId, TabLaunchType launchType, boolean incognito, |
+ boolean willBeSelected, float originX, float originY) { |
+ if (getFullscreenManager() != null) getFullscreenManager().showControlsTransient(); |
+ super.tabCreated(id, sourceId, launchType, incognito, willBeSelected, originX, originY); |
+ } |
+ |
+ @Override |
+ protected void tabClosed(int id, int nextId, boolean incognito) { |
+ super.tabClosed(id, nextId, incognito); |
+ } |
+ |
+ @Override |
+ protected void tabClosureCommitted(int id, boolean incognito) { |
+ super.tabClosureCommitted(id, incognito); |
+ if (mTitleCache != null) mTitleCache.remove(id); |
+ } |
+ |
+ @Override |
+ public void init(TabModelSelector selector, TabCreatorManager creator, |
+ TabContentManager content, ViewGroup androidContentContainer, |
+ ContextualSearchManagementDelegate contextualSearchDelegate, |
+ DynamicResourceLoader dynamicResourceLoader) { |
+ if (mTabStripLayoutHelperManager != null) { |
+ mTabStripLayoutHelperManager.setTabModelSelector(selector, creator, content); |
+ } |
+ |
+ super.init(selector, creator, content, androidContentContainer, contextualSearchDelegate, |
+ dynamicResourceLoader); |
+ |
+ mTabObserver = new TabModelSelectorTabObserver(selector) { |
+ @Override |
+ public void onFaviconUpdated(Tab tab) { |
+ updateTitle(tab); |
+ } |
+ |
+ @Override |
+ public void onTitleUpdated(Tab tab) { |
+ updateTitle(tab); |
+ } |
+ }; |
+ |
+ // Make sure any tabs already restored get loaded into the title cache. |
+ List<TabModel> models = selector.getModels(); |
+ for (int i = 0; i < models.size(); i++) { |
+ TabModel model = models.get(i); |
+ for (int j = 0; j < model.getCount(); j++) { |
+ Tab tab = model.getTabAt(j); |
+ if (tab != null && mTitleCache != null) { |
+ mTitleCache.put(tab.getId(), getTitleBitmap(tab), getFaviconBitmap(tab), |
+ tab.isIncognito(), tab.isTitleDirectionRtl()); |
+ } |
+ } |
+ } |
+ } |
+ |
+ @Override |
+ protected LayoutManagerTabModelObserver createTabModelObserver() { |
+ return new LayoutManagerTabModelObserver() { |
+ @Override |
+ public void didAddTab(Tab tab, TabLaunchType launchType) { |
+ super.didAddTab(tab, launchType); |
+ updateTitle(getTabById(tab.getId())); |
+ } |
+ }; |
+ } |
+ |
+ @Override |
+ protected String getTitleForTab(Tab tab) { |
+ String title = super.getTitleForTab(tab); |
+ if (TextUtils.isEmpty(title)) title = mDefaultTitle; |
+ return title; |
+ } |
+ |
+ @Override |
+ public StripLayoutHelperManager getStripLayoutHelperManager() { |
+ return mTabStripLayoutHelperManager; |
+ } |
+ |
+ private void updateTitle(Tab tab) { |
+ if (tab != null && mTitleCache != null) { |
+ mTitleCache.put(tab.getId(), getTitleBitmap(tab), getFaviconBitmap(tab), |
+ tab.isIncognito(), tab.isTitleDirectionRtl()); |
+ |
+ getActiveLayout().tabTitleChanged(tab.getId(), getTitleForTab(tab)); |
+ } |
+ } |
+ |
+ private class TabletToolbarSwipeHandler extends ToolbarSwipeHandler { |
+ public TabletToolbarSwipeHandler(LayoutProvider provider) { |
+ super(provider); |
+ } |
+ |
+ @Override |
+ public boolean isSwipeEnabled(ScrollDirection direction) { |
+ if ((direction == ScrollDirection.LEFT || direction == ScrollDirection.RIGHT) |
+ && (getTabModelSelector() == null |
+ || getTabModelSelector().getCurrentModel().getCount() <= 1)) { |
+ return false; |
+ } |
+ |
+ return super.isSwipeEnabled(direction); |
+ } |
+ } |
+ |
+ private class TabStripEventHandler implements GestureHandler { |
+ @Override |
+ public void onDown(float x, float y) { |
+ mTabStripLayoutHelperManager.onDown(time(), x, y); |
+ } |
+ |
+ @Override |
+ public void onUpOrCancel() { |
+ mTabStripLayoutHelperManager.onUpOrCancel(time()); |
+ } |
+ |
+ @Override |
+ public void drag(float x, float y, float dx, float dy, float tx, float ty) { |
+ mTabStripLayoutHelperManager.drag(time(), x, y, dx, dy, tx, ty); |
+ } |
+ |
+ @Override |
+ public void click(float x, float y) { |
+ mTabStripLayoutHelperManager.click(time(), x, y); |
+ } |
+ |
+ @Override |
+ public void fling(float x, float y, float velocityX, float velocityY) { |
+ mTabStripLayoutHelperManager.fling(time(), x, y, velocityX, velocityY); |
+ } |
+ |
+ @Override |
+ public void onLongPress(float x, float y) { |
+ mTabStripLayoutHelperManager.onLongPress(time(), x, y); |
+ } |
+ |
+ @Override |
+ public void onPinch(float x0, float y0, float x1, float y1, boolean firstEvent) { |
+ // Not implemented. |
+ } |
+ } |
+} |