Index: chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e37502ce067ec60f7d5d5f131279f7a72230954e |
--- /dev/null |
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java |
@@ -0,0 +1,156 @@ |
+// 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.graphics.Rect; |
+import android.view.View; |
+import android.view.ViewGroup; |
+ |
+import org.chromium.chrome.browser.compositor.LayerTitleCache; |
+import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel; |
+import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanelHost; |
+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.ContextualSearchSceneLayer; |
+import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer; |
+import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; |
+import org.chromium.content.browser.ContentViewCore; |
+import org.chromium.ui.resources.ResourceManager; |
+ |
+import java.util.List; |
+ |
+/** |
+ * A {@link Layout} that can show a Contextual Search overlay that shows at the |
+ * bottom and can be swiped upwards. |
+ */ |
+public abstract class ContextualSearchSupportedLayout extends Layout { |
+ /** |
+ * The {@link ContextualSearchPanelHost} that allows the {@link ContextualSearchPanel} to |
+ * communicate back to the Layout. |
+ */ |
+ protected final ContextualSearchPanelHost mContextualSearchPanelHost; |
+ |
+ /** |
+ * The {@link ContextualSearchPanel} that represents the Contextual Search UI. |
+ */ |
+ protected final ContextualSearchPanel mSearchPanel; |
+ |
+ /** |
+ * The {@link SceneLayer} that renders contextual search UI. |
+ */ |
+ private final ContextualSearchSceneLayer mContextualSearchSceneLayer; |
+ |
+ /** |
+ * Size of half pixel in dps. |
+ */ |
+ private final float mHalfPixelDp; |
+ |
+ /** |
+ * @param context The current Android context. |
+ * @param updateHost The {@link LayoutUpdateHost} view for this layout. |
+ * @param renderHost The {@link LayoutRenderHost} view for this layout. |
+ * @param eventFilter The {@link EventFilter} that is needed for this view. |
+ * @param panel The {@link ContextualSearchPanel} that represents the Contextual Search UI. |
+ */ |
+ public ContextualSearchSupportedLayout(Context context, LayoutUpdateHost updateHost, |
+ LayoutRenderHost renderHost, EventFilter eventFilter, ContextualSearchPanel panel) { |
+ super(context, updateHost, renderHost, eventFilter); |
+ |
+ mContextualSearchPanelHost = new ContextualSearchPanelHost() { |
+ @Override |
+ public void hideLayout(boolean immediately) { |
+ ContextualSearchSupportedLayout.this.hideContextualSearch(immediately); |
+ } |
+ }; |
+ |
+ mSearchPanel = panel; |
+ float dpToPx = context.getResources().getDisplayMetrics().density; |
+ mHalfPixelDp = 0.5f / dpToPx; |
+ mContextualSearchSceneLayer = new ContextualSearchSceneLayer(dpToPx, panel); |
+ } |
+ |
+ @Override |
+ public void attachViews(ViewGroup container) { |
+ mSearchPanel.setContainerView(container); |
+ } |
+ |
+ @Override |
+ public void getAllViews(List<View> views) { |
+ // TODO(dtrainor): If we move ContextualSearch to an overlay, pull the views from there |
+ // instead in Layout.java. |
+ if (mSearchPanel != null && mSearchPanel.getManagementDelegate() != null) { |
+ ContentViewCore content = |
+ mSearchPanel.getManagementDelegate().getSearchContentViewCore(); |
+ if (content != null) views.add(content.getContainerView()); |
+ } |
+ super.getAllViews(views); |
+ } |
+ |
+ @Override |
+ public void getAllContentViewCores(List<ContentViewCore> contents) { |
+ // TODO(dtrainor): If we move ContextualSearch to an overlay, pull the content from there |
+ // instead in Layout.java. |
+ if (mSearchPanel != null && mSearchPanel.getManagementDelegate() != null) { |
+ ContentViewCore content = |
+ mSearchPanel.getManagementDelegate().getSearchContentViewCore(); |
+ if (content != null) contents.add(content); |
+ } |
+ super.getAllContentViewCores(contents); |
+ } |
+ |
+ @Override |
+ public void show(long time, boolean animate) { |
+ mSearchPanel.setHost(mContextualSearchPanelHost); |
+ super.show(time, animate); |
+ } |
+ |
+ /** |
+ * Hides the Contextual Search Supported Layout. |
+ * @param immediately Whether it should be hidden immediately. |
+ */ |
+ protected void hideContextualSearch(boolean immediately) { |
+ // NOTE(pedrosimonetti): To be implemented by a supported Layout. |
+ } |
+ |
+ @Override |
+ protected void notifySizeChanged(float width, float height, int orientation) { |
+ super.notifySizeChanged(width, height, orientation); |
+ |
+ // NOTE(pedrosimonetti): Due to some floating point madness, getHeight() and |
+ // getHeightMinusTopControls() might not always be the same when the Toolbar is |
+ // visible. For this reason, we're comparing to see if the difference between them |
+ // is less than half pixel. If so, it means the Toolbar is visible. |
+ final boolean isToolbarVisible = getHeight() - getHeightMinusTopControls() <= mHalfPixelDp; |
+ mSearchPanel.onSizeChanged(width, height, isToolbarVisible); |
+ } |
+ |
+ @Override |
+ protected boolean onUpdateAnimation(long time, boolean jumpToEnd) { |
+ boolean parentAnimating = super.onUpdateAnimation(time, jumpToEnd); |
+ boolean panelAnimating = mSearchPanel.onUpdateAnimation(time, jumpToEnd); |
+ return panelAnimating || parentAnimating; |
+ } |
+ |
+ @Override |
+ protected SceneLayer getSceneLayer() { |
+ return mContextualSearchSceneLayer; |
+ } |
+ |
+ @Override |
+ protected void updateSceneLayer(Rect viewport, Rect contentViewport, |
+ LayerTitleCache layerTitleCache, TabContentManager tabContentManager, |
+ ResourceManager resourceManager, ChromeFullscreenManager fullscreenManager) { |
+ super.updateSceneLayer(viewport, contentViewport, layerTitleCache, tabContentManager, |
+ resourceManager, fullscreenManager); |
+ if (mContextualSearchSceneLayer == null || mSearchPanel.getManagementDelegate() == null) { |
+ return; |
+ } |
+ |
+ ContentViewCore contentViewCore = |
+ mSearchPanel.getManagementDelegate().getSearchContentViewCore(); |
+ mContextualSearchSceneLayer.update(contentViewCore, resourceManager); |
+ } |
+} |