Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit efc894ee authored by Jackal Guo's avatar Jackal Guo Committed by Android (Google) Code Review
Browse files

Merge "Race condition while injecting ACTION_OUTSIDE" into qt-dev

parents fdc8356a 8bcc0a98
Loading
Loading
Loading
Loading
+34 −8
Original line number Diff line number Diff line
@@ -682,14 +682,6 @@ public final class AccessibilityInteractionController {
                    // Handle this hidden action separately
                    succeeded = handleClickableSpanActionUiThread(
                            target, virtualDescendantId, arguments);
                } else if (action == R.id.accessibilityActionOutsideTouch) {
                    // trigger ACTION_OUTSIDE to notify windows
                    final long now = SystemClock.uptimeMillis();
                    MotionEvent event = MotionEvent.obtain(now, now, MotionEvent.ACTION_OUTSIDE,
                            0, 0, 0);
                    event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
                    mViewRootImpl.dispatchInputEvent(event);
                    succeeded = true;
                } else {
                    AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider();
                    if (provider != null) {
@@ -756,6 +748,33 @@ public final class AccessibilityInteractionController {
        }
    }

    /**
     * Notify outside touch event to the target window.
     */
    public void notifyOutsideTouchClientThread() {
        final Message message = mHandler.obtainMessage();
        message.what = PrivateHandler.MSG_NOTIFY_OUTSIDE_TOUCH;

        // Don't care about pid and tid because there's no interrogating client for this message.
        scheduleMessage(message, 0, 0, CONSIDER_REQUEST_PREPARERS);
    }

    private void notifyOutsideTouchUiThread() {
        if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null
                || mViewRootImpl.mStopped || mViewRootImpl.mPausedForTransition) {
            return;
        }
        final View root = mViewRootImpl.mView;
        if (root != null && isShown(root)) {
            // trigger ACTION_OUTSIDE to notify windows
            final long now = SystemClock.uptimeMillis();
            final MotionEvent event = MotionEvent.obtain(now, now, MotionEvent.ACTION_OUTSIDE,
                    0, 0, 0);
            event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
            mViewRootImpl.dispatchInputEvent(event);
        }
    }

    private View findViewByAccessibilityId(int accessibilityId) {
        if (accessibilityId == AccessibilityNodeInfo.ROOT_ITEM_ID) {
            return mViewRootImpl.mView;
@@ -1328,6 +1347,8 @@ public final class AccessibilityInteractionController {
        private static final int FIRST_NO_ACCESSIBILITY_CALLBACK_MSG = 100;
        private static final int MSG_CLEAR_ACCESSIBILITY_FOCUS =
                FIRST_NO_ACCESSIBILITY_CALLBACK_MSG + 1;
        private static final int MSG_NOTIFY_OUTSIDE_TOUCH =
                FIRST_NO_ACCESSIBILITY_CALLBACK_MSG + 2;

        public PrivateHandler(Looper looper) {
            super(looper);
@@ -1357,6 +1378,8 @@ public final class AccessibilityInteractionController {
                    return "MSG_APP_PREPARATION_TIMEOUT";
                case MSG_CLEAR_ACCESSIBILITY_FOCUS:
                    return "MSG_CLEAR_ACCESSIBILITY_FOCUS";
                case MSG_NOTIFY_OUTSIDE_TOUCH:
                    return "MSG_NOTIFY_OUTSIDE_TOUCH";
                default:
                    throw new IllegalArgumentException("Unknown message type: " + type);
            }
@@ -1396,6 +1419,9 @@ public final class AccessibilityInteractionController {
                case MSG_CLEAR_ACCESSIBILITY_FOCUS: {
                    clearAccessibilityFocusUiThread();
                } break;
                case MSG_NOTIFY_OUTSIDE_TOUCH: {
                    notifyOutsideTouchUiThread();
                } break;
                default:
                    throw new IllegalArgumentException("Unknown message type: " + type);
            }
+9 −0
Original line number Diff line number Diff line
@@ -8819,6 +8819,15 @@ public final class ViewRootImpl implements ViewParent,
                        .clearAccessibilityFocusClientThread();
            }
        }

        @Override
        public void notifyOutsideTouch() {
            ViewRootImpl viewRootImpl = mViewRootImpl.get();
            if (viewRootImpl != null && viewRootImpl.mView != null) {
                viewRootImpl.getAccessibilityInteractionController()
                        .notifyOutsideTouchClientThread();
            }
        }
    }

    private class SendWindowContentChangedAccessibilityEvent implements Runnable {
+2 −0
Original line number Diff line number Diff line
@@ -57,4 +57,6 @@ oneway interface IAccessibilityInteractionConnection {
        int interrogatingPid, long interrogatingTid);

    void clearAccessibilityFocus();

    void notifyOutsideTouch();
}
+0 −3
Original line number Diff line number Diff line
@@ -185,9 +185,6 @@
    <!-- Accessibility action identifier for {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction#ACTION_HIDE_TOOLTIP}. -->
    <item type="id" name="accessibilityActionHideTooltip" />

  <!-- Accessibility action to notify a window there is an outside touch. -->
  <item type="id" name="accessibilityActionOutsideTouch" />

  <!-- A tag used to save the view added to a transition overlay -->
  <item type="id" name="transition_overlay_view_tag" />

+0 −1
Original line number Diff line number Diff line
@@ -245,7 +245,6 @@
  <java-symbol type="id" name="selection_end_handle" />
  <java-symbol type="id" name="insertion_handle" />
  <java-symbol type="id" name="accessibilityActionClickOnClickableSpan" />
  <java-symbol type="id" name="accessibilityActionOutsideTouch" />
  <java-symbol type="id" name="camera" />
  <java-symbol type="id" name="mic" />
  <java-symbol type="id" name="overlay" />
Loading