Merge "Fix: Handwriting only initiate for the first time" into tm-dev

This commit is contained in:
Haoyu Zhang
2022-03-15 02:51:33 +00:00
committed by Android (Google) Code Review
2 changed files with 26 additions and 23 deletions

View File

@@ -249,19 +249,19 @@ public class HandwritingInitiator {
return; return;
} }
Rect handwritingArea = getViewHandwritingArea(connectedView); final Rect handwritingArea = getViewHandwritingArea(connectedView);
if (handwritingArea != null) { if (contains(handwritingArea, mState.mStylusDownX, mState.mStylusDownY)) {
if (contains(handwritingArea, mState.mStylusDownX, mState.mStylusDownY)) { startHandwriting(connectedView);
startHandwriting(connectedView); } else {
} reset();
} }
reset();
} }
/** For test only. */ /** For test only. */
@VisibleForTesting @VisibleForTesting
public void startHandwriting(@NonNull View view) { public void startHandwriting(@NonNull View view) {
mImm.startStylusHandwriting(view); mImm.startStylusHandwriting(view);
reset();
} }
/** /**
@@ -287,7 +287,7 @@ public class HandwritingInitiator {
final View connectedView = getConnectedView(); final View connectedView = getConnectedView();
if (connectedView != null && connectedView.isAutoHandwritingEnabled()) { if (connectedView != null && connectedView.isAutoHandwritingEnabled()) {
final Rect handwritingArea = getViewHandwritingArea(connectedView); final Rect handwritingArea = getViewHandwritingArea(connectedView);
if (handwritingArea != null && contains(handwritingArea, x, y)) { if (contains(handwritingArea, x, y)) {
return connectedView; return connectedView;
} }
} }
@@ -298,8 +298,7 @@ public class HandwritingInitiator {
for (HandwritableViewInfo viewInfo : handwritableViewInfos) { for (HandwritableViewInfo viewInfo : handwritableViewInfos) {
final View view = viewInfo.getView(); final View view = viewInfo.getView();
if (!view.isAutoHandwritingEnabled()) continue; if (!view.isAutoHandwritingEnabled()) continue;
final Rect rect = viewInfo.getHandwritingArea(); if (contains(viewInfo.getHandwritingArea(), x, y)) {
if (rect != null && contains(rect, x, y)) {
return viewInfo.getView(); return viewInfo.getView();
} }
} }
@@ -315,12 +314,15 @@ public class HandwritingInitiator {
private static Rect getViewHandwritingArea(@NonNull View view) { private static Rect getViewHandwritingArea(@NonNull View view) {
final ViewParent viewParent = view.getParent(); final ViewParent viewParent = view.getParent();
if (viewParent != null && view.isAttachedToWindow() && view.isAggregatedVisible()) { if (viewParent != null && view.isAttachedToWindow() && view.isAggregatedVisible()) {
Rect handwritingArea = view.getHandwritingArea(); final Rect localHandwritingArea = view.getHandwritingArea();
if (handwritingArea == null) { final Rect globalHandwritingArea = new Rect();
handwritingArea = new Rect(0, 0, view.getWidth(), view.getHeight()); if (localHandwritingArea != null) {
globalHandwritingArea.set(localHandwritingArea);
} else {
globalHandwritingArea.set(0, 0, view.getWidth(), view.getHeight());
} }
if (viewParent.getChildVisibleRect(view, handwritingArea, null)) { if (viewParent.getChildVisibleRect(view, globalHandwritingArea, null)) {
return handwritingArea; return globalHandwritingArea;
} }
} }
return null; return null;
@@ -329,7 +331,8 @@ public class HandwritingInitiator {
/** /**
* Return true if the (x, y) is inside by the given {@link Rect}. * Return true if the (x, y) is inside by the given {@link Rect}.
*/ */
private boolean contains(@NonNull Rect rect, float x, float y) { private boolean contains(@Nullable Rect rect, float x, float y) {
if (rect == null) return false;
return x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom; return x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom;
} }
@@ -481,17 +484,18 @@ public class HandwritingInitiator {
if (!mIsDirty) { if (!mIsDirty) {
return true; return true;
} }
final Rect localRect = view.getHandwritingArea(); final Rect handwritingArea = view.getHandwritingArea();
if (localRect == null) { if (handwritingArea == null) {
return false; return false;
} }
ViewParent parent = view.getParent(); ViewParent parent = view.getParent();
if (parent != null) { if (parent != null) {
final Rect newRect = new Rect(localRect); if (mHandwritingArea == null) {
if (parent.getChildVisibleRect(view, newRect, null /* offset */)) { mHandwritingArea = new Rect();
mHandwritingArea = newRect; }
} else { mHandwritingArea.set(handwritingArea);
if (!parent.getChildVisibleRect(view, mHandwritingArea, null /* offset */)) {
mHandwritingArea = null; mHandwritingArea = null;
} }
} }

View File

@@ -12016,7 +12016,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/** /**
* Return the handwriting areas set on this view, in its local coordinates. * Return the handwriting areas set on this view, in its local coordinates.
* Notice: the caller of this method should not modify the Rect returned.
* @see #setHandwritingArea(Rect) * @see #setHandwritingArea(Rect)
* *
* @hide * @hide
@@ -12025,7 +12024,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public Rect getHandwritingArea() { public Rect getHandwritingArea() {
final ListenerInfo info = mListenerInfo; final ListenerInfo info = mListenerInfo;
if (info != null) { if (info != null) {
return info.mHandwritingArea; return new Rect(info.mHandwritingArea);
} }
return null; return null;
} }