Merge "FloatingToolbar: Fix orientation change handling."
This commit is contained in:
committed by
Android (Google) Code Review
commit
cc3fb7a463
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user