Loading core/java/android/view/AccessibilityInteractionController.java +34 −8 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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); } Loading core/java/android/view/ViewRootImpl.java +9 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -57,4 +57,6 @@ oneway interface IAccessibilityInteractionConnection { int interrogatingPid, long interrogatingTid); void clearAccessibilityFocus(); void notifyOutsideTouch(); } core/res/res/values/ids.xml +0 −3 Original line number Diff line number Diff line Loading @@ -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" /> Loading core/res/res/values/symbols.xml +0 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
core/java/android/view/AccessibilityInteractionController.java +34 −8 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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); } Loading
core/java/android/view/ViewRootImpl.java +9 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading
core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -57,4 +57,6 @@ oneway interface IAccessibilityInteractionConnection { int interrogatingPid, long interrogatingTid); void clearAccessibilityFocus(); void notifyOutsideTouch(); }
core/res/res/values/ids.xml +0 −3 Original line number Diff line number Diff line Loading @@ -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" /> Loading
core/res/res/values/symbols.xml +0 −1 Original line number Diff line number Diff line Loading @@ -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