From 36d2ea15eb6e3cd0f3198403e9baad09923ee00a Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Thu, 9 Mar 2023 12:32:09 -0800 Subject: Minor improvements on a11y and instrumentation classes: - Added more logs. - Removed unused class attributes. Test: atest CtsUiAutomationTestCases Bug: 271166949 Bug: 271188189 Fixes: 272615026 Change-Id: I3faba4105f66082dac844bb05003b3062f1b37b0 --- .../accessibilityservice/AccessibilityService.java | 4 +-- core/java/android/app/UiAutomation.java | 38 ++++++++++++++++++++-- core/java/android/app/UiAutomationConnection.java | 1 + .../view/accessibility/AccessibilityRecord.java | 1 + .../server/accessibility/UiAutomationManager.java | 13 +++----- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 3615435b7d75..08a1af47ee64 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -2878,9 +2878,7 @@ public abstract class AccessibilityService extends Service { public IAccessibilityServiceClientWrapper(Context context, Looper looper, Callbacks callback) { - mCallback = callback; - mContext = context; - mExecutor = new HandlerExecutor(new Handler(looper)); + this(context, new HandlerExecutor(new Handler(looper)), callback); } public void init(IAccessibilityServiceConnection connection, int connectionId, diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java index 86f6a93ede1e..658e08444006 100644 --- a/core/java/android/app/UiAutomation.java +++ b/core/java/android/app/UiAutomation.java @@ -46,6 +46,7 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; import android.util.ArraySet; +import android.util.DebugUtils; import android.util.Log; import android.util.SparseArray; import android.view.Display; @@ -111,6 +112,7 @@ public final class UiAutomation { private static final String LOG_TAG = UiAutomation.class.getSimpleName(); private static final boolean DEBUG = false; + private static final boolean VERBOSE = false; private static final int CONNECTION_ID_UNDEFINED = -1; @@ -321,11 +323,18 @@ public final class UiAutomation { * @hide */ public void connectWithTimeout(int flags, long timeoutMillis) throws TimeoutException { + if (DEBUG) { + Log.d(LOG_TAG, "connectWithTimeout: user=" + Process.myUserHandle().getIdentifier() + + ", flags=" + DebugUtils.flagsToString(UiAutomation.class, "FLAG_", flags) + + ", timeout=" + timeoutMillis + "ms"); + } synchronized (mLock) { throwIfConnectedLocked(); if (mConnectionState == ConnectionState.CONNECTING) { + if (DEBUG) Log.d(LOG_TAG, "already connecting"); return; } + if (DEBUG) Log.d(LOG_TAG, "setting state to CONNECTING"); mConnectionState = ConnectionState.CONNECTING; mRemoteCallbackThread = new HandlerThread("UiAutomation"); mRemoteCallbackThread.start(); @@ -341,6 +350,7 @@ public final class UiAutomation { // If UiAutomation is not allowed to use the accessibility subsystem, the // connection state should keep disconnected and not to start the client connection. if (!useAccessibility()) { + if (DEBUG) Log.d(LOG_TAG, "setting state to DISCONNECTED"); mConnectionState = ConnectionState.DISCONNECTED; return; } @@ -357,6 +367,7 @@ public final class UiAutomation { final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis; final long remainingTimeMillis = timeoutMillis - elapsedTimeMillis; if (remainingTimeMillis <= 0) { + if (DEBUG) Log.d(LOG_TAG, "setting state to FAILED"); mConnectionState = ConnectionState.FAILED; throw new TimeoutException("Timeout while connecting " + this); } @@ -1367,7 +1378,8 @@ public final class UiAutomation { UserHandle userHandle) { try { if (DEBUG) { - Log.i(LOG_TAG, "Granting runtime permission"); + Log.i(LOG_TAG, "Granting runtime permission (" + permission + ") to package " + + packageName + " on user " + userHandle); } // Calling out without a lock held. mUiAutomationConnection.grantRuntimePermission(packageName, @@ -1592,7 +1604,7 @@ public final class UiAutomation { private class IAccessibilityServiceClientImpl extends IAccessibilityServiceClientWrapper { public IAccessibilityServiceClientImpl(Looper looper, int generationId) { - super(null, looper, new Callbacks() { + super(/* context= */ null, looper, new Callbacks() { private final int mGenerationId = generationId; /** @@ -1606,10 +1618,21 @@ public final class UiAutomation { @Override public void init(int connectionId, IBinder windowToken) { + if (DEBUG) { + Log.d(LOG_TAG, "init(): connectionId=" + connectionId + ", windowToken=" + + windowToken + ", user=" + Process.myUserHandle() + + ", mGenerationId=" + mGenerationId + + ", UiAutomation.mGenerationId=" + + UiAutomation.this.mGenerationId); + } synchronized (mLock) { if (isGenerationChangedLocked()) { + if (DEBUG) { + Log.d(LOG_TAG, "init(): returning because generation id changed"); + } return; } + if (DEBUG) Log.d(LOG_TAG, "setting state to CONNECTED"); mConnectionState = ConnectionState.CONNECTED; mConnectionId = connectionId; mLock.notifyAll(); @@ -1662,9 +1685,20 @@ public final class UiAutomation { @Override public void onAccessibilityEvent(AccessibilityEvent event) { + if (VERBOSE) { + Log.v(LOG_TAG, "onAccessibilityEvent(" + Process.myUserHandle() + "): " + + event); + } + final OnAccessibilityEventListener listener; synchronized (mLock) { if (isGenerationChangedLocked()) { + if (VERBOSE) { + Log.v(LOG_TAG, "onAccessibilityEvent(): returning because " + + "generation id changed (from " + + UiAutomation.this.mGenerationId + " to " + + mGenerationId + ")"); + } return; } // It is not guaranteed that the accessibility framework sends events by the diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java index 3a32f2362c0d..13e800e38cca 100644 --- a/core/java/android/app/UiAutomationConnection.java +++ b/core/java/android/app/UiAutomationConnection.java @@ -103,6 +103,7 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public UiAutomationConnection() { + Log.d(TAG, "Created on user " + Process.myUserHandle()); } @Override diff --git a/core/java/android/view/accessibility/AccessibilityRecord.java b/core/java/android/view/accessibility/AccessibilityRecord.java index 38b564ade07d..d69c781a6ac9 100644 --- a/core/java/android/view/accessibility/AccessibilityRecord.java +++ b/core/java/android/view/accessibility/AccessibilityRecord.java @@ -976,6 +976,7 @@ public class AccessibilityRecord { append(builder, "AddedCount", mAddedCount); append(builder, "RemovedCount", mRemovedCount); append(builder, "ParcelableData", mParcelableData); + append(builder, "DisplayId", mSourceDisplayId); builder.append(" ]"); return builder; } diff --git a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java index 2188b99a3d83..2f3e4c075a5d 100644 --- a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java @@ -24,6 +24,7 @@ import android.annotation.Nullable; import android.app.UiAutomation; import android.content.ComponentName; import android.content.Context; +import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.IBinder.DeathRecipient; @@ -34,6 +35,7 @@ import android.view.Display; import android.view.accessibility.AccessibilityEvent; import com.android.internal.util.DumpUtils; +import com.android.server.utils.Slogf; import com.android.server.wm.WindowManagerInternal; import java.io.FileDescriptor; @@ -51,12 +53,8 @@ class UiAutomationManager { private UiAutomationService mUiAutomationService; - private AccessibilityServiceInfo mUiAutomationServiceInfo; - private AbstractAccessibilityServiceConnection.SystemSupport mSystemSupport; - private AccessibilityTrace mTrace; - private int mUiAutomationFlags; UiAutomationManager(Object lock) { @@ -97,9 +95,10 @@ class UiAutomationManager { WindowManagerInternal windowManagerInternal, SystemActionPerformer systemActionPerformer, AccessibilityWindowManager awm, int flags) { + accessibilityServiceInfo.setComponentName(COMPONENT_NAME); + Slogf.i(LOG_TAG, "Registering UiTestAutomationService (id=%s) when called by user %d", + accessibilityServiceInfo.getId(), Binder.getCallingUserHandle().getIdentifier()); synchronized (mLock) { - accessibilityServiceInfo.setComponentName(COMPONENT_NAME); - if (mUiAutomationService != null) { throw new IllegalStateException( "UiAutomationService " + mUiAutomationService.mServiceInterface @@ -116,7 +115,6 @@ class UiAutomationManager { mUiAutomationFlags = flags; mSystemSupport = systemSupport; - mTrace = trace; // Ignore registering UiAutomation if it is not allowed to use the accessibility // subsystem. if (!useAccessibility()) { @@ -126,7 +124,6 @@ class UiAutomationManager { mainHandler, mLock, securityPolicy, systemSupport, trace, windowManagerInternal, systemActionPerformer, awm); mUiAutomationServiceOwner = owner; - mUiAutomationServiceInfo = accessibilityServiceInfo; mUiAutomationService.mServiceInterface = serviceClient; try { mUiAutomationService.mServiceInterface.asBinder().linkToDeath(mUiAutomationService, -- cgit v1.2.3-59-g8ed1b