import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
-import android.content.ComponentCallbacks;
import android.content.Context;
-import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Point;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.MeasureSpec;
+import android.view.View.OnLayoutChangeListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
};
private final Context mContext;
+ private final Window mWindow;
private final FloatingToolbarPopup mPopup;
private final Rect mContentRect = new Rect();
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());
}
* 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;
}
*/
public FloatingToolbar updateLayout() {
if (mPopup.isShowing()) {
- // show() performs all the logic we need here.
- show();
+ doShow();
}
return this;
}
* Dismisses this floating toolbar.
*/
public void dismiss() {
- mContext.unregisterComponentCallbacks(mOrientationChangeHandler);
+ unregisterOrientationHandler();
mPopup.dismiss();
}
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.
*/
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.
mParent.getWindowVisibleDisplayFrame(mViewPortOnScreen);
}
- private boolean viewPortHasChanged() {
- mParent.getWindowVisibleDisplayFrame(mTmpRect);
- return !mTmpRect.equals(mViewPortOnScreen);
- }
-
private int getAdjustedToolbarWidth(int suggestedWidth) {
int width = suggestedWidth;
refreshViewPort();
a.recycle();
return new ContextThemeWrapper(originalContext, themeId);
}
-}
\ No newline at end of file
+}