Merge "Ensure FloatingActionMode has a non-null FloatingToolbar." into oc-dev

This commit is contained in:
TreeHugger Robot
2017-05-23 15:57:44 +00:00
committed by Android (Google) Code Review
3 changed files with 27 additions and 49 deletions

View File

@@ -1759,8 +1759,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
mFloatingActionMode.finish();
}
cleanupFloatingActionModeViews();
mFloatingToolbar = new FloatingToolbar(mContext, mWindow);
final FloatingActionMode mode =
new FloatingActionMode(mContext, callback, originatingView);
new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar);
mFloatingActionModeOriginatingView = originatingView;
mFloatingToolbarPreDrawListener =
new ViewTreeObserver.OnPreDrawListener() {
@@ -1775,8 +1776,6 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
private void setHandledFloatingActionMode(ActionMode mode) {
mFloatingActionMode = mode;
mFloatingToolbar = new FloatingToolbar(mContext, mWindow);
((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar);
mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary.
mFloatingActionModeOriginatingView.getViewTreeObserver()
.addOnPreDrawListener(mFloatingToolbarPreDrawListener);

View File

@@ -16,6 +16,7 @@
package com.android.internal.view;
import android.annotation.NonNull;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
@@ -36,26 +37,26 @@ import com.android.internal.widget.FloatingToolbar;
import java.util.Arrays;
public class FloatingActionMode extends ActionMode {
public final class FloatingActionMode extends ActionMode {
private static final int MAX_HIDE_DURATION = 3000;
private static final int MOVING_HIDE_DELAY = 50;
private final Context mContext;
private final ActionMode.Callback2 mCallback;
private final MenuBuilder mMenu;
private final Rect mContentRect;
private final Rect mContentRectOnScreen;
private final Rect mPreviousContentRectOnScreen;
private final int[] mViewPositionOnScreen;
private final int[] mPreviousViewPositionOnScreen;
private final int[] mRootViewPositionOnScreen;
private final Rect mViewRectOnScreen;
private final Rect mPreviousViewRectOnScreen;
private final Rect mScreenRect;
private final View mOriginatingView;
@NonNull private final Context mContext;
@NonNull private final ActionMode.Callback2 mCallback;
@NonNull private final MenuBuilder mMenu;
@NonNull private final Rect mContentRect;
@NonNull private final Rect mContentRectOnScreen;
@NonNull private final Rect mPreviousContentRectOnScreen;
@NonNull private final int[] mViewPositionOnScreen;
@NonNull private final int[] mPreviousViewPositionOnScreen;
@NonNull private final int[] mRootViewPositionOnScreen;
@NonNull private final Rect mViewRectOnScreen;
@NonNull private final Rect mPreviousViewRectOnScreen;
@NonNull private final Rect mScreenRect;
@NonNull private final View mOriginatingView;
@NonNull private final Point mDisplaySize;
private final int mBottomAllowance;
private final Point mDisplaySize;
private final Runnable mMovingOff = new Runnable() {
public void run() {
@@ -75,11 +76,12 @@ public class FloatingActionMode extends ActionMode {
}
};
private FloatingToolbar mFloatingToolbar;
private FloatingToolbarVisibilityHelper mFloatingToolbarVisibilityHelper;
@NonNull private FloatingToolbar mFloatingToolbar;
@NonNull private FloatingToolbarVisibilityHelper mFloatingToolbarVisibilityHelper;
public FloatingActionMode(
Context context, ActionMode.Callback2 callback, View originatingView) {
Context context, ActionMode.Callback2 callback,
View originatingView, FloatingToolbar floatingToolbar) {
mContext = Preconditions.checkNotNull(context);
mCallback = Preconditions.checkNotNull(callback);
mMenu = new MenuBuilder(context).setDefaultShowAsAction(
@@ -110,17 +112,13 @@ public class FloatingActionMode extends ActionMode {
mBottomAllowance = context.getResources()
.getDimensionPixelSize(R.dimen.content_rect_bottom_clip_allowance);
mDisplaySize = new Point();
setFloatingToolbar(Preconditions.checkNotNull(floatingToolbar));
}
public void setFloatingToolbar(FloatingToolbar floatingToolbar) {
private void setFloatingToolbar(FloatingToolbar floatingToolbar) {
mFloatingToolbar = floatingToolbar
.setMenu(mMenu)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return mMenu.performItemAction(item, 0);
}
});
.setOnMenuItemClickListener(item -> mMenu.performItemAction(item, 0));
mFloatingToolbarVisibilityHelper = new FloatingToolbarVisibilityHelper(mFloatingToolbar);
mFloatingToolbarVisibilityHelper.activate();
}
@@ -142,21 +140,17 @@ public class FloatingActionMode extends ActionMode {
@Override
public void invalidate() {
checkToolbarInitialized();
mCallback.onPrepareActionMode(this, mMenu);
invalidateContentRect(); // Will re-layout and show the toolbar if necessary.
}
@Override
public void invalidateContentRect() {
checkToolbarInitialized();
mCallback.onGetContentRect(this, mOriginatingView, mContentRect);
repositionToolbar();
}
public void updateViewLocationInWindow() {
checkToolbarInitialized();
mOriginatingView.getLocationOnScreen(mViewPositionOnScreen);
mOriginatingView.getRootView().getLocationOnScreen(mRootViewPositionOnScreen);
mOriginatingView.getGlobalVisibleRect(mViewRectOnScreen);
@@ -172,8 +166,6 @@ public class FloatingActionMode extends ActionMode {
}
private void repositionToolbar() {
checkToolbarInitialized();
mContentRectOnScreen.set(mContentRect);
// Offset the content rect into screen coordinates, taking into account any transformations
@@ -235,8 +227,6 @@ public class FloatingActionMode extends ActionMode {
@Override
public void hide(long duration) {
checkToolbarInitialized();
if (duration == ActionMode.DEFAULT_HIDE_DURATION) {
duration = ViewConfiguration.getDefaultActionModeHideDuration();
}
@@ -253,14 +243,12 @@ public class FloatingActionMode extends ActionMode {
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
checkToolbarInitialized();
mFloatingToolbarVisibilityHelper.setWindowFocused(hasWindowFocus);
mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
}
@Override
public void finish() {
checkToolbarInitialized();
reset();
mCallback.onDestroyActionMode(this);
}
@@ -290,14 +278,6 @@ public class FloatingActionMode extends ActionMode {
return new MenuInflater(mContext);
}
/**
* @throws IllegalStateException
*/
private void checkToolbarInitialized() {
Preconditions.checkState(mFloatingToolbar != null);
Preconditions.checkState(mFloatingToolbarVisibilityHelper != null);
}
private void reset() {
mFloatingToolbar.dismiss();
mFloatingToolbarVisibilityHelper.deactivate();

View File

@@ -407,8 +407,9 @@ public class StatusBarWindowView extends FrameLayout {
mFloatingActionMode.finish();
}
cleanupFloatingActionModeViews();
mFloatingToolbar = new FloatingToolbar(mContext, mFakeWindow);
final FloatingActionMode mode =
new FloatingActionMode(mContext, callback, originatingView);
new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar);
mFloatingActionModeOriginatingView = originatingView;
mFloatingToolbarPreDrawListener =
new ViewTreeObserver.OnPreDrawListener() {
@@ -423,8 +424,6 @@ public class StatusBarWindowView extends FrameLayout {
private void setHandledFloatingActionMode(ActionMode mode) {
mFloatingActionMode = mode;
mFloatingToolbar = new FloatingToolbar(mContext, mFakeWindow);
((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar);
mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary.
mFloatingActionModeOriginatingView.getViewTreeObserver()
.addOnPreDrawListener(mFloatingToolbarPreDrawListener);