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