1fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung/* 2fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * Copyright (C) 2017 The Android Open Source Project 3fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * 4fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 5fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * you may not use this file except in compliance with the License. 6fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * You may obtain a copy of the License at 7fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * 8fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * http://www.apache.org/licenses/LICENSE-2.0 9fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * 10fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * Unless required by applicable law or agreed to in writing, software 11fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * distributed under the License is distributed on an "AS IS" BASIS, 12fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * See the License for the specific language governing permissions and 14fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * limitations under the License. 15fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung */ 16fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungpackage com.android.systemui.pip.phone; 17fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 18fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.graphics.Rect; 19fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.graphics.Region; 20fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.os.Bundle; 21fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.os.Handler; 22fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.os.RemoteException; 23fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.view.MagnificationSpec; 24fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.view.accessibility.AccessibilityNodeInfo; 25fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.view.accessibility.AccessibilityWindowInfo; 26fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.view.accessibility.IAccessibilityInteractionConnection; 27fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport android.view.accessibility.IAccessibilityInteractionConnectionCallback; 28fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 29fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport java.util.ArrayList; 30fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungimport java.util.List; 31fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 32fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung/** 33fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * Expose the touch actions to accessibility as if this object were a window with a single view. 34fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung * That pseudo-view exposes all of the actions this object can perform. 35fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung */ 36fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chungpublic class PipAccessibilityInteractionConnection 37fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung extends IAccessibilityInteractionConnection.Stub { 38fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 39fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public interface AccessibilityCallbacks { 40fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung void onAccessibilityShowMenu(); 41fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 42fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 43fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung private static final long ACCESSIBILITY_NODE_ID = 1; 44fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung private List<AccessibilityNodeInfo> mAccessibilityNodeInfoList; 45fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 46fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung private Handler mHandler; 47fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung private PipMotionHelper mMotionHelper; 48fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung private AccessibilityCallbacks mCallbacks; 49fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 50fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung private Rect mTmpBounds = new Rect(); 51fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 52fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public PipAccessibilityInteractionConnection(PipMotionHelper motionHelper, 53fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung AccessibilityCallbacks callbacks, Handler handler) { 54fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mHandler = handler; 55fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mMotionHelper = motionHelper; 56fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mCallbacks = callbacks; 57fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 58fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 59fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung @Override 60fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public void findAccessibilityNodeInfoByAccessibilityId(long accessibilityNodeId, 61fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung Region interactiveRegion, int interactionId, 62fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung IAccessibilityInteractionConnectionCallback callback, int flags, 63fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int interrogatingPid, long interrogatingTid, MagnificationSpec spec, Bundle args) { 64fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung try { 65fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung callback.setFindAccessibilityNodeInfosResult( 66fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung (accessibilityNodeId == AccessibilityNodeInfo.ROOT_NODE_ID) 67fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung ? getNodeList() : null, interactionId); 68fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } catch (RemoteException re) { 69fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung /* best effort - ignore */ 70fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 71fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 72fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 73fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung @Override 74fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public void performAccessibilityAction(long accessibilityNodeId, int action, 75fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung Bundle arguments, int interactionId, 76fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung IAccessibilityInteractionConnectionCallback callback, int flags, 77fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int interrogatingPid, long interrogatingTid) { 78fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung // We only support one view. A request for anything else is invalid 79fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung boolean result = false; 80fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung if (accessibilityNodeId == AccessibilityNodeInfo.ROOT_NODE_ID) { 81fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung switch (action) { 82fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung case AccessibilityNodeInfo.ACTION_CLICK: 83fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mHandler.post(() -> { 84fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mCallbacks.onAccessibilityShowMenu(); 85fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung }); 86fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung result = true; 87fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung break; 88fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung case AccessibilityNodeInfo.ACTION_DISMISS: 89fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mMotionHelper.dismissPip(); 90fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung result = true; 91fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung break; 92fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung case com.android.internal.R.id.accessibilityActionMoveWindow: 93fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int newX = arguments.getInt( 94fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung AccessibilityNodeInfo.ACTION_ARGUMENT_MOVE_WINDOW_X); 95fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int newY = arguments.getInt( 96fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung AccessibilityNodeInfo.ACTION_ARGUMENT_MOVE_WINDOW_Y); 97fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung Rect pipBounds = new Rect(); 98fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung pipBounds.set(mMotionHelper.getBounds()); 99fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mTmpBounds.offsetTo(newX, newY); 100fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mMotionHelper.movePip(mTmpBounds); 101fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung result = true; 102fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung break; 103fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung case AccessibilityNodeInfo.ACTION_EXPAND: 104fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mMotionHelper.expandPip(); 105fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung result = true; 106fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung break; 107fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung default: 108fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung // Leave result as false 109fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 110fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 111fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung try { 112fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung callback.setPerformAccessibilityActionResult(result, interactionId); 113fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } catch (RemoteException re) { 114fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung /* best effort - ignore */ 115fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 116fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 117fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 118fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung @Override 119fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public void findAccessibilityNodeInfosByViewId(long accessibilityNodeId, 120fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung String viewId, Region interactiveRegion, int interactionId, 121fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung IAccessibilityInteractionConnectionCallback callback, int flags, 122fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int interrogatingPid, long interrogatingTid, MagnificationSpec spec) { 123fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung // We have no view with a proper ID 124fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung try { 125fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung callback.setFindAccessibilityNodeInfoResult(null, interactionId); 126fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } catch (RemoteException re) { 127fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung /* best effort - ignore */ 128fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 129fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 130fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 131fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung @Override 132fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text, 133fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung Region interactiveRegion, int interactionId, 134fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung IAccessibilityInteractionConnectionCallback callback, int flags, 135fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int interrogatingPid, long interrogatingTid, MagnificationSpec spec) { 136fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung // We have no view with text 137fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung try { 138fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung callback.setFindAccessibilityNodeInfoResult(null, interactionId); 139fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } catch (RemoteException re) { 140fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung /* best effort - ignore */ 141fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 142fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 143fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 144fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung @Override 145fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public void findFocus(long accessibilityNodeId, int focusType, Region interactiveRegion, 146fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, 147fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int interrogatingPid, long interrogatingTid, MagnificationSpec spec) { 148fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung // We have no view that can take focus 149fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung try { 150fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung callback.setFindAccessibilityNodeInfoResult(null, interactionId); 151fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } catch (RemoteException re) { 152fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung /* best effort - ignore */ 153fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 154fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 155fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 156fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung @Override 157fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public void focusSearch(long accessibilityNodeId, int direction, Region interactiveRegion, 158fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, 159fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung int interrogatingPid, long interrogatingTid, MagnificationSpec spec) { 160fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung // We have no view that can take focus 161fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung try { 162fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung callback.setFindAccessibilityNodeInfoResult(null, interactionId); 163fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } catch (RemoteException re) { 164fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung /* best effort - ignore */ 165fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 166fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 167fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 168fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung public static AccessibilityNodeInfo obtainRootAccessibilityNodeInfo() { 169fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); 170fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung info.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID, 171fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID); 172fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK); 173fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_DISMISS); 174fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_MOVE_WINDOW); 175fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND); 176fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung info.setImportantForAccessibility(true); 177fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung info.setClickable(true); 178fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung info.setVisibleToUser(true); 179fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung return info; 180fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 181fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung 182fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung private List<AccessibilityNodeInfo> getNodeList() { 183fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung if (mAccessibilityNodeInfoList == null) { 184fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mAccessibilityNodeInfoList = new ArrayList<>(1); 185fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 186fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung AccessibilityNodeInfo info = obtainRootAccessibilityNodeInfo(); 187fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mAccessibilityNodeInfoList.clear(); 188fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung mAccessibilityNodeInfoList.add(info); 189fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung return mAccessibilityNodeInfoList; 190fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung } 191fe1fa64b0fe14ff4a5a64034bdd9cba4c88b5f49Winson Chung} 192