Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2958)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/snackbar/SnackbarView.java

Issue 2032773002: [Android] Fix a bug that snackbar does not show when there is no tab on tablet (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@snacky_touch
Patch Set: comments Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698