diff options
| -rw-r--r-- | core/java/com/android/internal/widget/FloatingToolbar.java | 78 |
1 files changed, 33 insertions, 45 deletions
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java index 4143eb586c1c..3a004690d2cb 100644 --- a/core/java/com/android/internal/widget/FloatingToolbar.java +++ b/core/java/com/android/internal/widget/FloatingToolbar.java @@ -90,7 +90,6 @@ public final class FloatingToolbar { }; private final Context mContext; - private final Window mWindow; private final FloatingToolbarPopup mPopup; private final Rect mContentRect = new Rect(); @@ -103,31 +102,26 @@ public final class FloatingToolbar { private int mSuggestedWidth; private boolean mWidthChanged = true; - private final OnLayoutChangeListener mOrientationChangeHandler = new OnLayoutChangeListener() { - - private final Rect mNewRect = new Rect(); - private final Rect mOldRect = new Rect(); - + private final ComponentCallbacks mOrientationChangeHandler = new ComponentCallbacks() { @Override - 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)) { + public void onConfigurationChanged(Configuration newConfig) { + if (mPopup.isShowing() && mPopup.viewPortHasChanged()) { mWidthChanged = true; updateLayout(); } } + + @Override + public void onLowMemory() {} }; /** * Initializes a floating toolbar. */ public FloatingToolbar(Context context, Window window) { - mContext = applyDefaultTheme(Preconditions.checkNotNull(context)); - mWindow = Preconditions.checkNotNull(window); + Preconditions.checkNotNull(context); + Preconditions.checkNotNull(window); + mContext = applyDefaultTheme(context); mPopup = new FloatingToolbarPopup(mContext, window.getDecorView()); } @@ -185,8 +179,21 @@ public final class FloatingToolbar { * Shows this floating toolbar. */ public FloatingToolbar show() { - registerOrientationHandler(); - doShow(); + 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); return this; } @@ -196,7 +203,8 @@ public final class FloatingToolbar { */ public FloatingToolbar updateLayout() { if (mPopup.isShowing()) { - doShow(); + // show() performs all the logic we need here. + show(); } return this; } @@ -205,7 +213,7 @@ public final class FloatingToolbar { * Dismisses this floating toolbar. */ public void dismiss() { - unregisterOrientationHandler(); + mContext.unregisterComponentCallbacks(mOrientationChangeHandler); mPopup.dismiss(); } @@ -231,22 +239,6 @@ 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. */ @@ -286,15 +278,6 @@ 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. @@ -1026,6 +1009,11 @@ 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(); @@ -1670,4 +1658,4 @@ public final class FloatingToolbar { a.recycle(); return new ContextThemeWrapper(originalContext, themeId); } -} +}
\ No newline at end of file |