Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java |
index ffa11e8ee6a47cfa9392076d4e03825c5971ac01..4e66f182912daee62118da67b01c849c26094f4d 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java |
@@ -44,12 +44,21 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
private static final float SEARCH_BAR_BORDER_HEIGHT_DP = 1.f; |
/** |
- * The height of the expanded Contextual Search Panel relative to the height |
- * of the screen. |
+ * The height of the expanded Search Panel relative to the height of the screen. |
*/ |
private static final float EXPANDED_PANEL_HEIGHT_PERCENTAGE = .7f; |
/** |
+ * The width of the small version of the Search Panel in dps. |
+ */ |
+ private static final float SMALL_PANEL_WIDTH_DP = 600.f; |
+ |
+ /** |
+ * The minimum width a screen should have in order to trigger the small version of the Panel. |
+ */ |
+ private static final float SMALL_PANEL_WIDTH_THRESHOLD_DP = 620.f; |
+ |
+ /** |
* The height of the Contextual Search Panel's Shadow in dps. |
*/ |
private static final float PANEL_SHADOW_HEIGHT_DP = 16.f; |
@@ -277,6 +286,9 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
private float mLayoutHeight; |
private boolean mIsToolbarShowing; |
+ private float mMaximumWidth; |
+ private float mMaximumHeight; |
+ |
/** |
* Called when the size of the view has changed. |
* |
@@ -288,19 +300,41 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
mLayoutWidth = width; |
mLayoutHeight = height; |
mIsToolbarShowing = isToolbarShowing; |
+ |
+ mMaximumWidth = calculateSearchPanelWidth(); |
+ mMaximumHeight = getPanelHeightFromState(PanelState.MAXIMIZED); |
+ } |
+ |
+ /** |
+ * @return Whether the Panel is in fullscreen size. |
+ */ |
+ protected boolean isFullscreenSizePanel() { |
+ return getFullscreenWidth() <= SMALL_PANEL_WIDTH_THRESHOLD_DP; |
+ } |
+ |
+ /** |
+ * @return The current X-position of the Contextual Search Panel. |
+ */ |
+ protected float calculateSearchPanelX() { |
+ return isFullscreenSizePanel() ? 0.f : |
+ Math.round((getFullscreenWidth() - calculateSearchPanelWidth()) / 2.f); |
} |
/** |
- * Returns the Y position of the Contextual Search Panel. |
- * Layouts supporting Contextual Search should override this method. |
- * |
* @return The current Y-position of the Contextual Search Panel. |
*/ |
- public float getContextualSearchPanelY() { |
+ protected float calculateSearchPanelY() { |
return getFullscreenHeight() - mHeight; |
} |
/** |
+ * @return The current width of the Contextual Search Panel. |
+ */ |
+ protected float calculateSearchPanelWidth() { |
+ return isFullscreenSizePanel() ? getFullscreenWidth() : SMALL_PANEL_WIDTH_DP; |
+ } |
+ |
+ /** |
* @return The height of the Chrome toolbar in dp. |
*/ |
public float getToolbarHeight() { |
@@ -354,6 +388,20 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
return height; |
} |
+ /** |
+ * @return The maximum width of the Contextual Search Panel in pixels. |
+ */ |
+ public int getMaximumWidthPx() { |
+ return Math.round(mMaximumWidth / mPxToDp); |
+ } |
+ |
+ /** |
+ * @return The maximum height of the Contextual Search Panel in pixels. |
+ */ |
+ public int getMaximumHeightPx() { |
+ return Math.round(mMaximumHeight / mPxToDp); |
+ } |
+ |
// ============================================================================================ |
// UI States |
// ============================================================================================ |
@@ -401,30 +449,37 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
// Contextual Search Panel states |
// -------------------------------------------------------------------------------------------- |
+ private float mOffsetX; |
private float mOffsetY; |
private float mHeight; |
- private float mWidth; |
private boolean mIsMaximized; |
/** |
* @return The vertical offset of the Contextual Search Panel. |
*/ |
+ public float getOffsetX() { |
+ return mOffsetX; |
+ } |
+ |
+ /** |
+ * @return The vertical offset of the Contextual Search Panel. |
+ */ |
public float getOffsetY() { |
return mOffsetY; |
} |
/** |
- * @return The height of the Contextual Search Panel. |
+ * @return The width of the Contextual Search Panel in dps. |
*/ |
- public float getHeight() { |
- return mHeight; |
+ public float getWidth() { |
+ return mMaximumWidth; |
} |
/** |
- * @return The width of the Contextual Search Panel. |
+ * @return The height of the Contextual Search Panel in dps. |
*/ |
- public float getWidth() { |
- return mWidth; |
+ public float getHeight() { |
+ return mHeight; |
} |
/** |
@@ -449,7 +504,6 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
private boolean mSearchBarShadowVisible = false; |
private float mSearchBarShadowOpacity = 0.f; |
- private boolean mSearchProviderIconVisible; |
private float mSearchProviderIconOpacity; |
private float mSearchIconOpacity; |
@@ -898,9 +952,9 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
* @param percentage The completion percentage of the transition. |
*/ |
private void updatePanelSize(float height, PanelState endState, float percentage) { |
- mWidth = getFullscreenWidth(); |
+ mOffsetX = calculateSearchPanelX(); |
+ mOffsetY = calculateSearchPanelY(); |
mHeight = height; |
- mOffsetY = getContextualSearchPanelY(); |
mIsMaximized = height == getPanelHeightFromState(PanelState.MAXIMIZED); |
} |
@@ -1216,6 +1270,10 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
* @return The target offset Y. |
*/ |
private float calculateBasePageTargetY(PanelState expandedState) { |
+ // Only a fullscreen wide Panel should offset the base page. A small panel should |
+ // always return zero to ensure the Base Page remains in the same position. |
+ if (!isFullscreenSizePanel()) return 0.f; |
+ |
// Convert from px to dp. |
final float selectionY = mBasePageSelectionYPx * mPxToDp; |
@@ -1305,6 +1363,13 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
LayoutInflater.from(mContext).inflate(R.layout.contextual_search_view, mContainerView); |
mControl = (ContextualSearchControl) |
mContainerView.findViewById(R.id.contextual_search_view); |
+ |
+ // Adjust size for small Panel. |
+ if (!isFullscreenSizePanel()) { |
+ mControl.getLayoutParams().width = getMaximumWidthPx(); |
+ mControl.requestLayout(); |
+ } |
+ |
if (mResourceLoader != null) { |
mResourceLoader.registerResource(R.id.contextual_search_view, |
mControl.getResourceAdapter()); |
@@ -1387,13 +1452,22 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
R.layout.contextual_search_opt_out_promo, mContainerView); |
mPromoView = (ContextualSearchOptOutPromo) |
mContainerView.findViewById(R.id.contextual_search_opt_out_promo); |
+ |
+ final int maximumWidth = getMaximumWidthPx(); |
+ |
+ // Adjust size for small Panel. |
+ if (!isFullscreenSizePanel()) { |
+ mPromoView.getLayoutParams().width = maximumWidth; |
+ mPromoView.requestLayout(); |
+ } |
+ |
if (mResourceLoader != null) { |
mResourceLoader.registerResource(R.id.contextual_search_opt_out_promo, |
mPromoView.getResourceAdapter()); |
} |
mPromoView.setPromoHost(this); |
- setPromoContentHeightPx(mPromoView.getHeightForGivenWidth(mContainerView.getWidth())); |
+ setPromoContentHeightPx(mPromoView.getHeightForGivenWidth(maximumWidth)); |
} |
assert mPromoView != null; |
@@ -1422,6 +1496,7 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl |
public void showPromoViewAtYPosition(float y) { |
if (mPromoView == null || !isPromoAvailable()) return; |
+ mPromoView.setTranslationX(getOffsetX() / mPxToDp); |
mPromoView.setTranslationY(y); |
mPromoView.setVisibility(View.VISIBLE); |