Merge "Ensure FloatingActionMode has a non-null FloatingToolbar." into oc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
76ec0575bc
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user