Merge "FloatingToolbar: Fix orientation change handling."

This commit is contained in:
Abodunrinwa Toki
2016-02-01 12:54:10 +00:00
committed by Android (Google) Code Review

View File

@@ -90,6 +90,7 @@ public final class FloatingToolbar {
};
private final Context mContext;
private final Window mWindow;
private final FloatingToolbarPopup mPopup;
private final Rect mContentRect = new Rect();
@@ -102,26 +103,31 @@ public final class FloatingToolbar {
private int mSuggestedWidth;
private boolean mWidthChanged = true;
private final ComponentCallbacks mOrientationChangeHandler = new ComponentCallbacks() {
private final OnLayoutChangeListener mOrientationChangeHandler = new OnLayoutChangeListener() {
private final Rect mNewRect = new Rect();
private final Rect mOldRect = new Rect();
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (mPopup.isShowing() && mPopup.viewPortHasChanged()) {
public void onLayoutChange(
View view,
int newLeft, int newRight, int newTop, int newBottom,
int oldLeft, int oldRight, int oldTop, int oldBottom) {
mNewRect.set(newLeft, newRight, newTop, newBottom);
mOldRect.set(oldLeft, oldRight, oldTop, oldBottom);
if (mPopup.isShowing() && !mNewRect.equals(mOldRect)) {
mWidthChanged = true;
updateLayout();
}
}
@Override
public void onLowMemory() {}
};
/**
* Initializes a floating toolbar.
*/
public FloatingToolbar(Context context, Window window) {
Preconditions.checkNotNull(context);
Preconditions.checkNotNull(window);
mContext = applyDefaultTheme(context);
mContext = applyDefaultTheme(Preconditions.checkNotNull(context));
mWindow = Preconditions.checkNotNull(window);
mPopup = new FloatingToolbarPopup(mContext, window.getDecorView());
}
@@ -179,21 +185,8 @@ public final class FloatingToolbar {
* Shows this floating toolbar.
*/
public FloatingToolbar show() {
mContext.unregisterComponentCallbacks(mOrientationChangeHandler);
mContext.registerComponentCallbacks(mOrientationChangeHandler);
List<MenuItem> menuItems = getVisibleAndEnabledMenuItems(mMenu);
if (!isCurrentlyShowing(menuItems) || mWidthChanged) {
mPopup.dismiss();
mPopup.layoutMenuItems(menuItems, mMenuItemClickListener, mSuggestedWidth);
mShowingMenuItems = getShowingMenuItemsReferences(menuItems);
}
if (!mPopup.isShowing()) {
mPopup.show(mContentRect);
} else if (!mPreviousContentRect.equals(mContentRect)) {
mPopup.updateCoordinates(mContentRect);
}
mWidthChanged = false;
mPreviousContentRect.set(mContentRect);
registerOrientationHandler();
doShow();
return this;
}
@@ -203,8 +196,7 @@ public final class FloatingToolbar {
*/
public FloatingToolbar updateLayout() {
if (mPopup.isShowing()) {
// show() performs all the logic we need here.
show();
doShow();
}
return this;
}
@@ -213,7 +205,7 @@ public final class FloatingToolbar {
* Dismisses this floating toolbar.
*/
public void dismiss() {
mContext.unregisterComponentCallbacks(mOrientationChangeHandler);
unregisterOrientationHandler();
mPopup.dismiss();
}
@@ -239,6 +231,22 @@ public final class FloatingToolbar {
return mPopup.isHidden();
}
private void doShow() {
List<MenuItem> menuItems = getVisibleAndEnabledMenuItems(mMenu);
if (!isCurrentlyShowing(menuItems) || mWidthChanged) {
mPopup.dismiss();
mPopup.layoutMenuItems(menuItems, mMenuItemClickListener, mSuggestedWidth);
mShowingMenuItems = getShowingMenuItemsReferences(menuItems);
}
if (!mPopup.isShowing()) {
mPopup.show(mContentRect);
} else if (!mPreviousContentRect.equals(mContentRect)) {
mPopup.updateCoordinates(mContentRect);
}
mWidthChanged = false;
mPreviousContentRect.set(mContentRect);
}
/**
* Returns true if this floating toolbar is currently showing the specified menu items.
*/
@@ -278,6 +286,15 @@ public final class FloatingToolbar {
return references;
}
private void registerOrientationHandler() {
unregisterOrientationHandler()
mWindow.getDecorView.addOnLayoutChangeListener(mOrientationChangeHandler);
}
private void unregisterOrientationHandler() {
mWindow.getDecorView.removeOnLayoutChangeListener(mOrientationChangeHandler);
}
/**
* A popup window used by the floating toolbar.
@@ -1012,11 +1029,6 @@ public final class FloatingToolbar {
mParent.getWindowVisibleDisplayFrame(mViewPortOnScreen);
}
private boolean viewPortHasChanged() {
mParent.getWindowVisibleDisplayFrame(mTmpRect);
return !mTmpRect.equals(mViewPortOnScreen);
}
private int getAdjustedToolbarWidth(int suggestedWidth) {
int width = suggestedWidth;
refreshViewPort();
@@ -1663,4 +1675,4 @@ public final class FloatingToolbar {
a.recycle();
return new ContextThemeWrapper(originalContext, themeId);
}
}
}