Merge "[Magnifier-39] Hide both handles on overlap" into pi-dev

This commit is contained in:
Mihai Popa
2018-04-11 22:15:35 +00:00
committed by Android (Google) Code Review
2 changed files with 64 additions and 13 deletions

View File

@@ -39,6 +39,7 @@ import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -4837,14 +4838,48 @@ public class Editor {
return true;
}
private boolean handleOverlapsMagnifier() {
final int handleY = mContainer.getDecorViewLayoutParams().y;
final int magnifierBottomWhenAtWindowTop =
mTextView.getRootWindowInsets().getSystemWindowInsetTop()
+ mMagnifierAnimator.mMagnifier.getHeight();
return handleY <= magnifierBottomWhenAtWindowTop;
private boolean handleOverlapsMagnifier(@NonNull final HandleView handle,
@NonNull final Rect magnifierRect) {
final PopupWindow window = handle.mContainer;
if (!window.hasDecorView()) {
return false;
}
final Rect handleRect = new Rect(
window.getDecorViewLayoutParams().x,
window.getDecorViewLayoutParams().y,
window.getDecorViewLayoutParams().x + window.getContentView().getWidth(),
window.getDecorViewLayoutParams().y + window.getContentView().getHeight());
return Rect.intersects(handleRect, magnifierRect);
}
private @Nullable HandleView getOtherSelectionHandle() {
final SelectionModifierCursorController controller = getSelectionController();
if (controller == null || !controller.isActive()) {
return null;
}
return controller.mStartHandle != this
? controller.mStartHandle
: controller.mEndHandle;
}
private final Magnifier.Callback mHandlesVisibilityCallback = new Magnifier.Callback() {
@Override
public void onOperationComplete() {
final Point magnifierTopLeft = mMagnifierAnimator.mMagnifier.getWindowCoords();
if (magnifierTopLeft == null) {
return;
}
final Rect magnifierRect = new Rect(magnifierTopLeft.x, magnifierTopLeft.y,
magnifierTopLeft.x + mMagnifierAnimator.mMagnifier.getWidth(),
magnifierTopLeft.y + mMagnifierAnimator.mMagnifier.getHeight());
setVisible(!handleOverlapsMagnifier(HandleView.this, magnifierRect));
final HandleView otherHandle = getOtherSelectionHandle();
if (otherHandle != null) {
otherHandle.setVisible(!handleOverlapsMagnifier(otherHandle, magnifierRect));
}
}
};
protected final void updateMagnifier(@NonNull final MotionEvent event) {
if (mMagnifierAnimator == null) {
return;
@@ -4858,12 +4893,8 @@ public class Editor {
mRenderCursorRegardlessTiming = true;
mTextView.invalidateCursorPath();
suspendBlink();
// Hide handle if it overlaps the magnifier.
if (handleOverlapsMagnifier()) {
setVisible(false);
} else {
setVisible(true);
}
mMagnifierAnimator.mMagnifier
.setOnOperationCompleteCallback(mHandlesVisibilityCallback);
mMagnifierAnimator.show(showPosInView.x, showPosInView.y);
} else {
@@ -4877,6 +4908,10 @@ public class Editor {
mRenderCursorRegardlessTiming = false;
resumeBlink();
setVisible(true);
final HandleView otherHandle = getOtherSelectionHandle();
if (otherHandle != null) {
otherHandle.setVisible(true);
}
}
}

View File

@@ -233,6 +233,17 @@ public final class Magnifier {
return mZoom;
}
/**
* @hide
*/
@Nullable
public Point getWindowCoords() {
if (mWindow == null) {
return null;
}
return new Point(mWindow.mLastDrawContentPositionX, mWindow.mLastDrawContentPositionY);
}
@Nullable
private Surface getValidViewSurface() {
// TODO: deduplicate this against the first part of #performPixelCopy
@@ -374,8 +385,11 @@ public final class Magnifier {
private final Runnable mMagnifierUpdater;
// The handler where the magnifier updater jobs will be post'd.
private final Handler mHandler;
// The callback to be run after the next draw. Only used for testing.
// The callback to be run after the next draw.
private Callback mCallback;
// The position of the magnifier content when the last draw was requested.
private int mLastDrawContentPositionX;
private int mLastDrawContentPositionY;
// Members below describe the state of the magnifier. Reads/writes to them
// have to be synchronized between the UI thread and the thread that handles
@@ -598,6 +612,8 @@ public final class Magnifier {
callback = null;
}
mLastDrawContentPositionX = mWindowPositionX + mOffsetX;
mLastDrawContentPositionY = mWindowPositionY + mOffsetY;
mFrameDrawScheduled = false;
}