Index: chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java |
index 83bead5f9bfc6521e4aa9fac117ec269c8290342..8a489de9af70ea0699c2b61c550ee4bf0fc5ee00 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java |
@@ -12,6 +12,7 @@ import android.animation.ValueAnimator; |
import android.content.Context; |
import android.content.SharedPreferences; |
import android.graphics.Color; |
+import android.graphics.Rect; |
import android.graphics.Region; |
import android.support.annotation.IntDef; |
import android.support.annotation.Nullable; |
@@ -134,6 +135,9 @@ public class BottomSheet |
/** The height of the shadow that sits above the toolbar. */ |
private final int mToolbarShadowHeight; |
+ /** The height of the bottom navigation bar that appears when the bottom sheet is expanded. */ |
+ private final float mBottomNavHeight; |
+ |
/** The {@link BottomSheetMetrics} used to record user actions and histograms. */ |
private final BottomSheetMetrics mMetrics; |
@@ -401,6 +405,8 @@ public class BottomSheet |
mToolbarShadowHeight = |
getResources().getDimensionPixelOffset(R.dimen.toolbar_shadow_height); |
+ mBottomNavHeight = getResources().getDimensionPixelSize(R.dimen.bottom_nav_height); |
+ |
mVelocityTracker = VelocityTracker.obtain(); |
mGestureDetector = new GestureDetector(context, new BottomSheetSwipeDetector()); |
@@ -499,6 +505,14 @@ public class BottomSheet |
} |
/** |
+ * Defocus the omnibox. |
+ */ |
+ public void defocusOmnibox() { |
+ if (mDefaultToolbarView == null) return; |
+ mDefaultToolbarView.getLocationBar().setUrlBarFocus(false); |
+ } |
+ |
+ /** |
* @param tabModelSelector A TabModelSelector for getting the current tab and activity. |
*/ |
public void setTabModelSelector(TabModelSelector tabModelSelector) { |
@@ -565,18 +579,45 @@ public class BottomSheet |
// Listen to height changes on the root. |
root.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { |
+ /** The height of the screen minus the keyboard height. */ |
+ private float mHeightMinusKeyboard; |
+ |
@Override |
public void onLayoutChange(View v, int left, int top, int right, int bottom, |
int oldLeft, int oldTop, int oldRight, int oldBottom) { |
+ // Compute the new height taking the keyboard into account. |
+ // TODO(mdjones): Share this logic with LocationBarLayout: crbug.com/725725. |
+ int decorHeight = mActivity.getWindow().getDecorView().getHeight(); |
+ Rect displayFrame = new Rect(); |
+ mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(displayFrame); |
+ int heightMinusKeyboard = Math.min(decorHeight, displayFrame.height()); |
+ |
+ boolean keyboardHeightChanged = heightMinusKeyboard != mHeightMinusKeyboard; |
+ |
// Make sure the size of the layout actually changed. |
- if (bottom - top == oldBottom - oldTop && right - left == oldRight - oldLeft) { |
+ if (!keyboardHeightChanged && bottom - top == oldBottom - oldTop |
+ && right - left == oldRight - oldLeft) { |
return; |
} |
mContainerWidth = right - left; |
mContainerHeight = bottom - top; |
+ mHeightMinusKeyboard = heightMinusKeyboard; |
+ int keyboardHeight = (int) (mContainerHeight - mHeightMinusKeyboard); |
updateSheetDimensions(); |
+ for (BottomSheetObserver o : mObservers) { |
+ o.onSheetLayout((int) mContainerHeight, (int) mHeightMinusKeyboard); |
+ } |
+ |
+ // If the keyboard height changed, recompute the padding for the content area. This |
+ // shrinks the content size while retaining the default background color where the |
+ // keyboard is appearing. |
+ if (keyboardHeightChanged && isSheetOpen()) { |
+ mBottomSheetContentContainer.setPadding( |
+ 0, 0, 0, (int) mBottomNavHeight + keyboardHeight); |
+ } |
+ |
// If we are in the middle of a touch event stream (i.e. scrolling while keyboard is |
// up) don't set the sheet state. Instead allow the gesture detector to position the |
// sheet and make sure the keyboard hides. |
@@ -964,6 +1005,8 @@ public class BottomSheet |
* @param offset The offset that the sheet should be. |
*/ |
private void setSheetOffsetFromBottom(float offset) { |
+ if (MathUtils.areFloatsEqual(offset, getSheetOffsetFromBottom())) return; |
+ |
if (MathUtils.areFloatsEqual(getSheetOffsetFromBottom(), getMinOffset()) |
&& offset > getMinOffset()) { |
onSheetOpened(); |