1015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver/* 2015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** Copyright 2017, The Android Open Source Project 3015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** 4015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** Licensed under the Apache License, Version 2.0 (the "License"); 5015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** you may not use this file except in compliance with the License. 6015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** You may obtain a copy of the License at 7015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** 8015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** http://www.apache.org/licenses/LICENSE-2.0 9015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** 10015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** Unless required by applicable law or agreed to in writing, software 11015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** distributed under the License is distributed on an "AS IS" BASIS, 12015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** See the License for the specific language governing permissions and 14015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver ** limitations under the License. 15015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver */ 16015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 17015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverpackage com.android.server.accessibility; 18015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 19015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.accessibilityservice.AccessibilityServiceInfo; 20015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.accessibilityservice.IAccessibilityServiceClient; 214b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Suslaimport android.annotation.Nullable; 22015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.app.UiAutomation; 23015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.content.ComponentName; 24015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.content.Context; 25015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.os.Handler; 26015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.os.IBinder; 27015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.os.IBinder.DeathRecipient; 28015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.os.RemoteException; 29015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.util.Slog; 30015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport android.view.accessibility.AccessibilityEvent; 31015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 32239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaverimport com.android.internal.util.DumpUtils; 33e99bc0501a288735d337f2ff64f8fa47f766a59bAdrian Roosimport com.android.server.wm.WindowManagerInternal; 34e99bc0501a288735d337f2ff64f8fa47f766a59bAdrian Roos 35015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport java.io.FileDescriptor; 36015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverimport java.io.PrintWriter; 37015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 38015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver/** 39015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * Class to manage UiAutomation. 40015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver */ 41015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaverclass UiAutomationManager { 42015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver private static final ComponentName COMPONENT_NAME = 43015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver new ComponentName("com.android.server.accessibility", "UiAutomation"); 44015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver private static final String LOG_TAG = "UiAutomationManager"; 45015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 46015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver private UiAutomationService mUiAutomationService; 47015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 48015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver private AccessibilityServiceInfo mUiAutomationServiceInfo; 49015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 504b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla private AbstractAccessibilityServiceConnection.SystemSupport mSystemSupport; 51239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver 52015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver private int mUiAutomationFlags; 53015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 54015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver private IBinder mUiAutomationServiceOwner; 55ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver private final DeathRecipient mUiAutomationServiceOwnerDeathRecipient = 56015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver new DeathRecipient() { 57015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 58015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public void binderDied() { 59015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationServiceOwner.unlinkToDeath(this, 0); 60015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationServiceOwner = null; 61015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver if (mUiAutomationService != null) { 62015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver destroyUiAutomationService(); 63015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 64015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 65015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver }; 66015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 67015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver /** 68015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * Register a UiAutomation. Only one may be registered at a time. 69015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * 70015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * @param owner A binder object owned by the process that owns the UiAutomation to be 71015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * registered. 72015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * @param serviceClient The UiAutomation's service interface. 73015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * @param accessibilityServiceInfo The UiAutomation's service info 74015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * @param flags The UiAutomation's flags 75015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver * @param id The id for the service connection 76015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver */ 77015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver void registerUiTestAutomationServiceLocked(IBinder owner, 78015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver IAccessibilityServiceClient serviceClient, 79015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver Context context, AccessibilityServiceInfo accessibilityServiceInfo, 80015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver int id, Handler mainHandler, Object lock, 81015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver AccessibilityManagerService.SecurityPolicy securityPolicy, 824b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla AbstractAccessibilityServiceConnection.SystemSupport systemSupport, 83015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver WindowManagerInternal windowManagerInternal, 84015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver GlobalActionPerformer globalActionPerfomer, int flags) { 85015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver accessibilityServiceInfo.setComponentName(COMPONENT_NAME); 86015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 87015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver if (mUiAutomationService != null) { 88015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver throw new IllegalStateException("UiAutomationService " + serviceClient 89015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver + "already registered!"); 90015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 91015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 92015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver try { 93ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver owner.linkToDeath(mUiAutomationServiceOwnerDeathRecipient, 0); 94015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } catch (RemoteException re) { 95015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver Slog.e(LOG_TAG, "Couldn't register for the death of a UiTestAutomationService!", re); 96015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return; 97015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 98015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 99239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver mSystemSupport = systemSupport; 100015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService = new UiAutomationService(context, accessibilityServiceInfo, id, 101015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mainHandler, lock, securityPolicy, systemSupport, windowManagerInternal, 102015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver globalActionPerfomer); 103015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationServiceOwner = owner; 104015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationFlags = flags; 105015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationServiceInfo = accessibilityServiceInfo; 106015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.mServiceInterface = serviceClient; 107015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.onAdded(); 108015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver try { 109015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.mServiceInterface.asBinder().linkToDeath(mUiAutomationService, 0); 110015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } catch (RemoteException re) { 111015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver Slog.e(LOG_TAG, "Failed registering death link: " + re); 112015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver destroyUiAutomationService(); 113015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return; 114015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 115015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 116015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.connectServiceUnknownThread(); 117015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 118015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 119015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver void unregisterUiTestAutomationServiceLocked(IAccessibilityServiceClient serviceClient) { 120015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver if ((mUiAutomationService == null) 121015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver || (serviceClient == null) 122015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver || (mUiAutomationService.mServiceInterface == null) 123015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver || (serviceClient.asBinder() 124015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver != mUiAutomationService.mServiceInterface.asBinder())) { 125015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver throw new IllegalStateException("UiAutomationService " + serviceClient 126015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver + " not registered!"); 127015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 128015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 129015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver destroyUiAutomationService(); 130015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 131015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 132015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver void sendAccessibilityEventLocked(AccessibilityEvent event) { 133015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver if (mUiAutomationService != null) { 134015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.notifyAccessibilityEvent(event); 135015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 136015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 137015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 138015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver boolean isUiAutomationRunningLocked() { 139015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return (mUiAutomationService != null); 140015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 141015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 142015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver boolean suppressingAccessibilityServicesLocked() { 143015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return (mUiAutomationService != null) && ((mUiAutomationFlags 144015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver & UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES) == 0); 145015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 146015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 147015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver boolean isTouchExplorationEnabledLocked() { 148015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return (mUiAutomationService != null) 149015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver && mUiAutomationService.mRequestTouchExplorationMode; 150015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 151015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 152015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver boolean canRetrieveInteractiveWindowsLocked() { 153015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return (mUiAutomationService != null) && mUiAutomationService.mRetrieveInteractiveWindows; 154015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 155015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 156015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver int getRequestedEventMaskLocked() { 157015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver if (mUiAutomationService == null) return 0; 158015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return mUiAutomationService.mEventTypes; 159015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 160015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 1614b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla int getRelevantEventTypes() { 1624b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla if (mUiAutomationService == null) return 0; 1634b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla return mUiAutomationService.getRelevantEventTypes(); 1644b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla } 1654b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla 1664b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla @Nullable 1674b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla AccessibilityServiceInfo getServiceInfo() { 1684b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla if (mUiAutomationService == null) return null; 1694b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla return mUiAutomationService.getServiceInfo(); 1704b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla } 1714b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla 172015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver void dumpUiAutomationService(FileDescriptor fd, final PrintWriter pw, String[] args) { 173015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver if (mUiAutomationService != null) { 174015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.dump(fd, pw, args); 175015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 176015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 177015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 178015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver private void destroyUiAutomationService() { 179015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.mServiceInterface.asBinder().unlinkToDeath(mUiAutomationService, 0); 180015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.onRemoved(); 181015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService.resetLocked(); 182015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationService = null; 183015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationFlags = 0; 184015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver if (mUiAutomationServiceOwner != null) { 185ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver mUiAutomationServiceOwner.unlinkToDeath(mUiAutomationServiceOwnerDeathRecipient, 0); 186015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver mUiAutomationServiceOwner = null; 187015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 188239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver mSystemSupport.onClientChange(false); 189015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 190015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 1914b7c919e725bc87bea82ab2c2370f094a049b8cfEugene Susla private class UiAutomationService extends AbstractAccessibilityServiceConnection { 192ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver private final Handler mMainHandler; 193ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver 194015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver UiAutomationService(Context context, AccessibilityServiceInfo accessibilityServiceInfo, 195015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver int id, Handler mainHandler, Object lock, 196015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver AccessibilityManagerService.SecurityPolicy securityPolicy, 197015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver SystemSupport systemSupport, WindowManagerInternal windowManagerInternal, 198015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver GlobalActionPerformer globalActionPerfomer) { 199015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver super(context, COMPONENT_NAME, accessibilityServiceInfo, id, mainHandler, lock, 200015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver securityPolicy, systemSupport, windowManagerInternal, globalActionPerfomer); 201ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver mMainHandler = mainHandler; 202015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 203015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 204015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver void connectServiceUnknownThread() { 205015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver // This needs to be done on the main thread 206ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver mMainHandler.post(() -> { 207015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver try { 208ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver final IAccessibilityServiceClient serviceInterface; 209ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver final IBinder service; 210ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver synchronized (mLock) { 211ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver serviceInterface = mServiceInterface; 212ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver mService = (serviceInterface == null) ? null : mServiceInterface.asBinder(); 213ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver service = mService; 214ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver } 215ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver // If the serviceInterface is null, the UiAutomation has been shut down on 216ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver // another thread. 217ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver if (serviceInterface != null) { 218ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver service.linkToDeath(this, 0); 219ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver serviceInterface.init(this, mId, mOverlayWindowToken); 220ff7068359bb9814ea383822bc14eaa44265e9f0bPhil Weaver } 221015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } catch (RemoteException re) { 222015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver Slog.w(LOG_TAG, "Error initialized connection", re); 223015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver destroyUiAutomationService(); 224015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 225015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver }); 226015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 227015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 228015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 229015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public void binderDied() { 230015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver destroyUiAutomationService(); 231015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 232015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 233015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 234015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver protected boolean isCalledForCurrentUserLocked() { 235015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver // Allow UiAutomation to work for any user 236015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return true; 237015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 238015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 239015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 240015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver protected boolean supportsFlagForNotImportantViews(AccessibilityServiceInfo info) { 241015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return true; 242015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 243015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 244239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver @Override 245239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { 246239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; 247239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver synchronized (mLock) { 248239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver pw.append("Ui Automation[eventTypes=" 249239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver + AccessibilityEvent.eventTypeToString(mEventTypes)); 250239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver pw.append(", notificationTimeout=" + mNotificationTimeout); 251239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver pw.append("]"); 252239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver } 253239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver } 254239677da55db6d9bfe4775afe60d24d2a2140684Phil Weaver 255015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver // Since this isn't really an accessibility service, several methods are just stubbed here. 256015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 257015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public boolean setSoftKeyboardShowMode(int mode) { 258015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return false; 259015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 260015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 261015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 262015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public boolean isAccessibilityButtonAvailable() { 263015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return false; 264015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 265015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 266015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 267015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public void disableSelf() {} 268015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 269015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 270015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public void onServiceConnected(ComponentName componentName, IBinder service) {} 271015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 272015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 273015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public void onServiceDisconnected(ComponentName componentName) {} 274015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 275015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 276015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public boolean isCapturingFingerprintGestures() { 277015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver return false; 278015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 279015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 280015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 281015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public void onFingerprintGestureDetectionActiveChanged(boolean active) {} 282015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver 283015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver @Override 284015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver public void onFingerprintGesture(int gesture) {} 285015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver } 286015847aa4f5ba31d6a4fd6695202ae60aaec926aPhil Weaver} 287