Index: chrome/android/java_staging/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1241501ff5fba993e5c76c91c65a366cd3c8dcb4 |
--- /dev/null |
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java |
@@ -0,0 +1,160 @@ |
+// 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.emptybackground; |
+ |
+import android.app.Activity; |
+import android.view.View; |
+import android.view.View.OnAttachStateChangeListener; |
+import android.view.ViewStub; |
+ |
+import com.google.android.apps.chrome.R; |
+ |
+import org.chromium.chrome.browser.Tab; |
+import org.chromium.chrome.browser.appmenu.AppMenuHandler; |
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; |
+import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; |
+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.TabModelObserver; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; |
+ |
+import java.util.List; |
+ |
+/** |
+ * Handler for {@link EmptyBackgroundViewTablet}. |
+ */ |
+public class EmptyBackgroundViewWrapper { |
+ private final Activity mActivity; |
+ private final TabModelSelector mTabModelSelector; |
+ private final ChromeTabCreator mTabCreator; |
+ private final TabModelObserver mTabModelObserver; |
+ private final TabModelSelectorObserver mTabModelSelectorObserver; |
+ private final OverviewModeBehavior mOverviewModeBehavior; |
+ |
+ private EmptyBackgroundViewTablet mBackgroundView; |
+ private final AppMenuHandler mMenuHandler; |
+ |
+ /** |
+ * Creates a {@link EmptyBackgroundViewWrapper} instance that will lazily inflate. |
+ * @param selector A {@link TabModelSelector} that will be used to query system |
+ * state. |
+ * @param tabCreator A {@link ChromeTabCreator} that will be used to open the New Tab |
+ * Page. |
+ * @param activity An {@link Activity} that represents a parent of the |
+ * {@link android.view.ViewStub}. |
+ * @param menuHandler A {@link AppMenuHandler} to handle menu touch events. |
+ * @param overviewModeBehavior A {@link OverviewModeBehavior} instance to detect when the app |
+ * is in overview mode. |
+ */ |
+ public EmptyBackgroundViewWrapper(TabModelSelector selector, ChromeTabCreator tabCreator, |
+ Activity activity, AppMenuHandler menuHandler, |
+ OverviewModeBehavior overviewModeBehavior) { |
+ mActivity = activity; |
+ mMenuHandler = menuHandler; |
+ mTabModelSelector = selector; |
+ mTabCreator = tabCreator; |
+ mOverviewModeBehavior = overviewModeBehavior; |
+ mTabModelObserver = new EmptyTabModelObserver() { |
+ @Override |
+ public void didAddTab(Tab tab, TabLaunchType type) { |
+ updateEmptyContainerState(); |
+ } |
+ |
+ @Override |
+ public void tabClosureUndone(Tab tab) { |
+ updateEmptyContainerState(); |
+ } |
+ |
+ @Override |
+ public void didCloseTab(Tab tab) { |
+ updateEmptyContainerState(); |
+ } |
+ |
+ @Override |
+ public void tabPendingClosure(Tab tab) { |
+ updateEmptyContainerState(); |
+ } |
+ |
+ @Override |
+ public void allTabsPendingClosure(List<Integer> tabIds) { |
+ updateEmptyContainerState(); |
+ } |
+ }; |
+ mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() { |
+ @Override |
+ public void onTabModelSelected(TabModel newModel, TabModel oldModel) { |
+ updateEmptyContainerState(); |
+ } |
+ }; |
+ } |
+ |
+ /** |
+ * Initialize the wrapper to listen for the proper notifications. |
+ */ |
+ public void initialize() { |
+ for (TabModel model : mTabModelSelector.getModels()) model.addObserver(mTabModelObserver); |
+ mTabModelSelector.addObserver(mTabModelSelectorObserver); |
+ } |
+ |
+ /** |
+ * Unregister all dependencies and listeners. |
+ */ |
+ public void uninitialize() { |
+ for (TabModel model : mTabModelSelector.getModels()) { |
+ model.removeObserver(mTabModelObserver); |
+ } |
+ mTabModelSelector.removeObserver(mTabModelSelectorObserver); |
+ } |
+ |
+ private void inflateViewIfNecessary() { |
+ if (mBackgroundView != null) return; |
+ |
+ mBackgroundView = (EmptyBackgroundViewTablet) ((ViewStub) mActivity.findViewById( |
+ R.id.empty_container_stub)).inflate(); |
+ mBackgroundView.setTabModelSelector(mTabModelSelector); |
+ mBackgroundView.setTabCreator(mTabCreator); |
+ mBackgroundView.setMenuOnTouchListener(mMenuHandler); |
+ mBackgroundView.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { |
+ @Override |
+ public void onViewDetachedFromWindow(View v) { |
+ uninitialize(); |
+ } |
+ |
+ @Override |
+ public void onViewAttachedToWindow(View v) { |
+ } |
+ }); |
+ } |
+ |
+ private void updateEmptyContainerState() { |
+ boolean showEmptyBackground = shouldShowEmptyContainer(); |
+ if (showEmptyBackground) { |
+ inflateViewIfNecessary(); |
+ } |
+ |
+ if (mBackgroundView != null) { |
+ mBackgroundView.setEmptyContainerState(showEmptyBackground); |
+ } |
+ } |
+ |
+ private boolean shouldShowEmptyContainer() { |
+ TabModel model = mTabModelSelector.getModel(false); |
+ if (model == null) { |
+ return false; |
+ } |
+ boolean isIncognitoEmpty = mTabModelSelector.getModel(true).getCount() == 0; |
+ boolean incognitoSelected = mTabModelSelector.isIncognitoSelected(); |
+ |
+ // Only show the empty container if: |
+ // 1. There are no tabs in the normal TabModel AND |
+ // 2. Overview mode is not showing AND |
+ // 3. We're in the normal TabModel OR there are no tabs present in either model |
+ return model.getCount() == 0 && !mOverviewModeBehavior.overviewVisible() |
+ && (!incognitoSelected || isIncognitoEmpty); |
+ } |
+} |