| Index: chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java
|
| index d79fdf00b96aab6ae70a07e04fb8303e9642a89b..4bdef17e7d4f9a73b4d454378a339c0c0e42ddcf 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java
|
| @@ -15,6 +15,7 @@ import android.graphics.drawable.GradientDrawable;
|
| import android.support.design.widget.CoordinatorLayout;
|
| import android.support.design.widget.CoordinatorLayout.Behavior;
|
| import android.support.design.widget.CoordinatorLayout.LayoutParams;
|
| +import android.view.Gravity;
|
| import android.view.LayoutInflater;
|
| import android.view.MotionEvent;
|
| import android.view.SurfaceView;
|
| @@ -25,6 +26,7 @@ import android.view.ViewGroup;
|
| import android.view.ViewGroup.MarginLayoutParams;
|
| import android.view.ViewTreeObserver.OnGlobalLayoutListener;
|
| import android.view.animation.DecelerateInterpolator;
|
| +import android.widget.FrameLayout;
|
| import android.widget.ImageView;
|
| import android.widget.TextView;
|
|
|
| @@ -46,6 +48,7 @@ class SnackbarView {
|
| private final ImageView mProfileImageView;
|
| private final int mAnimationDuration;
|
| private final boolean mIsTablet;
|
| + private ViewGroup mOriginalParent;
|
| private ViewGroup mParent;
|
| private Snackbar mSnackbar;
|
|
|
| @@ -98,7 +101,8 @@ class SnackbarView {
|
| SnackbarView(Activity activity, OnClickListener listener, Snackbar snackbar) {
|
| mActivity = activity;
|
| mIsTablet = DeviceFormFactor.isTablet(activity);
|
| - mParent = findParentView(activity);
|
| + mOriginalParent = findParentView(activity);
|
| + mParent = mOriginalParent;
|
| mView = (ViewGroup) LayoutInflater.from(activity).inflate(
|
| R.layout.snackbar, mParent, false);
|
| mAnimationDuration = mView.getResources()
|
| @@ -112,16 +116,7 @@ class SnackbarView {
|
| }
|
|
|
| void show() {
|
| - if (mParent instanceof CoordinatorLayout) {
|
| - CoordinatorLayout.LayoutParams lp = (LayoutParams) mView.getLayoutParams();
|
| - lp.setBehavior(mBehavior);
|
| - mParent.addView(mView, lp);
|
| - } else {
|
| - mParent.addView(mView);
|
| - }
|
| - adjustViewPosition();
|
| - mView.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener);
|
| -
|
| + addToParent();
|
| mView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
|
| @Override
|
| public void onLayoutChange(View v, int left, int top, int right, int bottom,
|
| @@ -185,6 +180,18 @@ class SnackbarView {
|
| }
|
| }
|
|
|
| + /**
|
| + * @see SnackbarManager#overrideParent(ViewGroup)
|
| + */
|
| + void overrideParent(ViewGroup overridingParent) {
|
| + mParent = overridingParent == null ? mOriginalParent : overridingParent;
|
| + if (isShowing()) {
|
| + mView.getViewTreeObserver().removeOnGlobalLayoutListener(mLayoutListener);
|
| + ((ViewGroup) mView.getParent()).removeView(mView);
|
| + }
|
| + addToParent();
|
| + }
|
| +
|
| boolean isShowing() {
|
| return mView.isShown();
|
| }
|
| @@ -208,6 +215,24 @@ class SnackbarView {
|
| return updateInternal(snackbar, true);
|
| }
|
|
|
| + private void addToParent() {
|
| + // LayoutParams in CoordinatorLayout and FrameLayout cannot be used interchangeably. Thus
|
| + // we create new LayoutParams every time.
|
| + if (mParent instanceof CoordinatorLayout) {
|
| + CoordinatorLayout.LayoutParams lp = new LayoutParams(getLayoutParams());
|
| + lp.gravity = Gravity.BOTTOM | Gravity.START;
|
| + lp.setBehavior(mBehavior);
|
| + mParent.addView(mView, lp);
|
| + } else if (mParent instanceof FrameLayout) {
|
| + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(getLayoutParams());
|
| + lp.gravity = Gravity.BOTTOM | Gravity.START;
|
| + mParent.addView(mView, lp);
|
| + } else {
|
| + assert false : "Only FrameLayout and CoordinatorLayout are supported to show snackbars";
|
| + }
|
| + mView.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener);
|
| + }
|
| +
|
| private boolean updateInternal(Snackbar snackbar, boolean animate) {
|
| if (mSnackbar == snackbar) return false;
|
| mSnackbar = snackbar;
|
|
|