Index: chrome/android/java_staging/src/org/chromium/chrome/browser/widget/OverviewListLayout.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/OverviewListLayout.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/OverviewListLayout.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..424b302d5dc31c8e71118efcc8bf3fd01d46a9dc |
--- /dev/null |
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/OverviewListLayout.java |
@@ -0,0 +1,183 @@ |
+// 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.widget; |
+ |
+import android.content.Context; |
+import android.view.LayoutInflater; |
+import android.view.ViewGroup; |
+import android.widget.FrameLayout; |
+import android.widget.ListView; |
+ |
+import org.chromium.base.VisibleForTesting; |
+import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.compositor.layouts.Layout; |
+import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; |
+import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; |
+import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; |
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter; |
+import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer; |
+import org.chromium.chrome.browser.tabmodel.TabModel; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
+import org.chromium.chrome.browser.tabmodel.TabModelUtils; |
+import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelAdapter.AccessibilityTabModelAdapterListener; |
+import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelWrapper; |
+ |
+/** |
+ * A {@link Layout} that shows the tabs as two {@link ListView}s, one for each {@link TabModel} to |
+ * represent. |
+ */ |
+public class OverviewListLayout extends Layout implements AccessibilityTabModelAdapterListener { |
+ private AccessibilityTabModelWrapper mTabModelWrapper; |
+ private final float mDpToPx; |
+ private final SceneLayer mSceneLayer; |
+ |
+ public OverviewListLayout(Context context, LayoutUpdateHost updateHost, |
+ LayoutRenderHost renderHost, EventFilter eventFilter) { |
+ super(context, updateHost, renderHost, eventFilter); |
+ mDpToPx = context.getResources().getDisplayMetrics().density; |
+ mSceneLayer = new SceneLayer(); |
+ } |
+ |
+ @Override |
+ public void attachViews(ViewGroup container) { |
+ if (mTabModelWrapper == null) { |
+ mTabModelWrapper = |
+ (AccessibilityTabModelWrapper) LayoutInflater.from(container.getContext()) |
+ .inflate(R.layout.accessibility_tab_switcher, null); |
+ mTabModelWrapper.setup(this); |
+ mTabModelWrapper.setTabModelSelector(mTabModelSelector); |
+ adjustForFullscreen(); |
+ } |
+ |
+ if (container == null) return; |
+ |
+ if (mTabModelWrapper.getParent() == null) { |
+ container.addView(mTabModelWrapper); |
+ } |
+ } |
+ |
+ @Override |
+ public int getSizingFlags() { |
+ return SizingFlags.REQUIRE_FULLSCREEN_SIZE; |
+ } |
+ |
+ @Override |
+ protected void notifySizeChanged(float width, float height, int orientation) { |
+ adjustForFullscreen(); |
+ } |
+ |
+ private void adjustForFullscreen() { |
+ if (mTabModelWrapper == null) return; |
+ FrameLayout.LayoutParams params = |
+ (FrameLayout.LayoutParams) mTabModelWrapper.getLayoutParams(); |
+ if (params == null) return; |
+ params.topMargin = (int) ((getHeight() - getHeightMinusTopControls()) * mDpToPx); |
+ mTabModelWrapper.setLayoutParams(params); |
+ } |
+ |
+ @Override |
+ public boolean handlesTabClosing() { |
+ return true; |
+ } |
+ |
+ @Override |
+ public boolean handlesTabCreating() { |
+ return true; |
+ } |
+ |
+ @Override |
+ public boolean handlesCloseAll() { |
+ return true; |
+ } |
+ |
+ @Override |
+ public void onTabCreating(int sourceTabId) { |
+ super.onTabCreating(sourceTabId); |
+ startHiding(sourceTabId, false); |
+ } |
+ |
+ @Override |
+ public void onTabCreated(long time, int tabId, int tabIndex, int sourceTabId, |
+ boolean newIsIncognito, boolean background, float originX, float originY) { |
+ super.onTabCreated( |
+ time, tabId, tabIndex, sourceTabId, newIsIncognito, background, originX, originY); |
+ startHiding(tabId, false); |
+ } |
+ |
+ @Override |
+ public void onTabModelSwitched(boolean incognito) { |
+ super.onTabModelSwitched(incognito); |
+ if (mTabModelWrapper == null) return; |
+ mTabModelWrapper.setStateBasedOnModel(); |
+ } |
+ |
+ @Override |
+ public void show(long time, boolean animate) { |
+ super.show(time, animate); |
+ if (mTabModelWrapper == null) return; |
+ mTabModelWrapper.setStateBasedOnModel(); |
+ |
+ doneShowing(); |
+ } |
+ |
+ @Override |
+ public void startHiding(int nextId, boolean hintAtTabSelection) { |
+ super.startHiding(nextId, hintAtTabSelection); |
+ |
+ doneHiding(); |
+ } |
+ |
+ @Override |
+ public void detachViews() { |
+ if (mTabModelSelector != null) mTabModelSelector.commitAllTabClosures(); |
+ if (mTabModelWrapper != null) { |
+ ViewGroup parent = (ViewGroup) mTabModelWrapper.getParent(); |
+ if (parent != null) parent.removeView(mTabModelWrapper); |
+ } |
+ } |
+ |
+ @Override |
+ public void setTabModelSelector( |
+ TabModelSelector tabModelSelector, TabContentManager tabContentManager) { |
+ super.setTabModelSelector(tabModelSelector, tabContentManager); |
+ |
+ if (mTabModelWrapper == null) return; |
+ mTabModelWrapper.setTabModelSelector(tabModelSelector); |
+ } |
+ |
+ @VisibleForTesting |
+ public ViewGroup getContainer() { |
+ return mTabModelWrapper; |
+ } |
+ |
+ @Override |
+ public void onTabsAllClosing(long time, boolean incognito) { |
+ super.onTabsAllClosing(time, incognito); |
+ |
+ TabModel model = mTabModelSelector.getModel(incognito); |
+ while (model.getCount() > 0) TabModelUtils.closeTabByIndex(model, 0); |
+ |
+ if (incognito) { |
+ mTabModelSelector.selectModel(!incognito); |
+ } |
+ if (mTabModelWrapper == null) return; |
+ mTabModelWrapper.setStateBasedOnModel(); |
+ } |
+ |
+ @Override |
+ public void onTabClosureCommitted(long time, int tabId, boolean incognito) { |
+ mTabModelWrapper.setStateBasedOnModel(); |
+ } |
+ |
+ @Override |
+ public void showTab(int tabId) { |
+ onTabSelecting(0, tabId); |
+ } |
+ |
+ @Override |
+ protected SceneLayer getSceneLayer() { |
+ return mSceneLayer; |
+ } |
+} |