diff options
11 files changed, 244 insertions, 35 deletions
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl index dc5c7f694c58..713d8e5dd12f 100644 --- a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl +++ b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl @@ -43,131 +43,189 @@ import android.window.ScreenCapture; */ interface IAccessibilityServiceConnection { + @RequiresNoPermission void setServiceInfo(in AccessibilityServiceInfo info); + @RequiresNoPermission void setAttributionTag(in String attributionTag); + @RequiresNoPermission String[] findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, long accessibilityNodeId, int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, long threadId, in Bundle arguments); + @RequiresNoPermission String[] findAccessibilityNodeInfosByText(int accessibilityWindowId, long accessibilityNodeId, String text, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); + @RequiresNoPermission String[] findAccessibilityNodeInfosByViewId(int accessibilityWindowId, long accessibilityNodeId, String viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); + @RequiresNoPermission String[] findFocus(int accessibilityWindowId, long accessibilityNodeId, int focusType, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); + @RequiresNoPermission String[] focusSearch(int accessibilityWindowId, long accessibilityNodeId, int direction, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); + @RequiresNoPermission boolean performAccessibilityAction(int accessibilityWindowId, long accessibilityNodeId, int action, in Bundle arguments, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); + @RequiresNoPermission AccessibilityWindowInfo getWindow(int windowId); + @RequiresNoPermission AccessibilityWindowInfo.WindowListSparseArray getWindows(); + @RequiresNoPermission AccessibilityServiceInfo getServiceInfo(); + @RequiresNoPermission boolean performGlobalAction(int action); + + @RequiresNoPermission List<AccessibilityNodeInfo.AccessibilityAction> getSystemActions(); + @RequiresNoPermission void disableSelf(); + @RequiresNoPermission oneway void setOnKeyEventResult(boolean handled, int sequence); + @RequiresNoPermission MagnificationConfig getMagnificationConfig(int displayId); + @RequiresNoPermission float getMagnificationScale(int displayId); + @RequiresNoPermission float getMagnificationCenterX(int displayId); + @RequiresNoPermission float getMagnificationCenterY(int displayId); + @RequiresNoPermission Region getMagnificationRegion(int displayId); + @RequiresNoPermission Region getCurrentMagnificationRegion(int displayId); + @RequiresNoPermission boolean resetMagnification(int displayId, boolean animate); + @RequiresNoPermission boolean resetCurrentMagnification(int displayId, boolean animate); + @RequiresNoPermission boolean setMagnificationConfig(int displayId, in MagnificationConfig config, boolean animate); + @RequiresNoPermission void setMagnificationCallbackEnabled(int displayId, boolean enabled); + @RequiresNoPermission boolean setSoftKeyboardShowMode(int showMode); + @RequiresNoPermission int getSoftKeyboardShowMode(); + @RequiresNoPermission void setSoftKeyboardCallbackEnabled(boolean enabled); - boolean switchToInputMethod(String imeId); + @RequiresNoPermission + boolean switchToInputMethod(String imeId); - int setInputMethodEnabled(String imeId, boolean enabled); + @RequiresNoPermission + int setInputMethodEnabled(String imeId, boolean enabled); + @RequiresNoPermission boolean isAccessibilityButtonAvailable(); + @RequiresNoPermission void sendGesture(int sequence, in ParceledListSlice gestureSteps); + @RequiresNoPermission void dispatchGesture(int sequence, in ParceledListSlice gestureSteps, int displayId); + @RequiresNoPermission boolean isFingerprintGestureDetectionAvailable(); + @RequiresNoPermission IBinder getOverlayWindowToken(int displayid); + @RequiresNoPermission int getWindowIdForLeashToken(IBinder token); + @RequiresNoPermission void takeScreenshot(int displayId, in RemoteCallback callback); + @RequiresNoPermission void takeScreenshotOfWindow(int accessibilityWindowId, int interactionId, in ScreenCapture.ScreenCaptureListener listener, IAccessibilityInteractionConnectionCallback callback); + @RequiresNoPermission void setGestureDetectionPassthroughRegion(int displayId, in Region region); + @RequiresNoPermission void setTouchExplorationPassthroughRegion(int displayId, in Region region); + @RequiresNoPermission void setFocusAppearance(int strokeWidth, int color); + @RequiresNoPermission void setCacheEnabled(boolean enabled); + @RequiresNoPermission oneway void logTrace(long timestamp, String where, long loggingTypes, String callingParams, int processId, long threadId, int callingUid, in Bundle serializedCallingStackInBundle); + @RequiresNoPermission void setServiceDetectsGesturesEnabled(int displayId, boolean mode); + @RequiresNoPermission void requestTouchExploration(int displayId); + @RequiresNoPermission void requestDragging(int displayId, int pointerId); + @RequiresNoPermission void requestDelegating(int displayId); + @RequiresNoPermission void onDoubleTap(int displayId); + @RequiresNoPermission void onDoubleTapAndHold(int displayId); + @RequiresNoPermission void setAnimationScale(float scale); + @RequiresNoPermission void setInstalledAndEnabledServices(in List<AccessibilityServiceInfo> infos); - List<AccessibilityServiceInfo> getInstalledAndEnabledServices(); + @RequiresNoPermission + List<AccessibilityServiceInfo> getInstalledAndEnabledServices(); + + @RequiresNoPermission void attachAccessibilityOverlayToDisplay(int interactionId, int displayId, in SurfaceControl sc, IAccessibilityInteractionConnectionCallback callback); + @RequiresNoPermission void attachAccessibilityOverlayToWindow(int interactionId, int accessibilityWindowId, in SurfaceControl sc, IAccessibilityInteractionConnectionCallback callback); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)") + @EnforcePermission("BLUETOOTH_CONNECT") void connectBluetoothBrailleDisplay(in String bluetoothAddress, in IBrailleDisplayController controller); + + @RequiresNoPermission void connectUsbBrailleDisplay(in UsbDevice usbDevice, in IBrailleDisplayController controller); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY)") + @EnforcePermission("MANAGE_ACCESSIBILITY") void setTestBrailleDisplayData(in List<Bundle> brailleDisplays); }
\ No newline at end of file diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java index 0b0fd66f0744..b5c264c4ae5e 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java @@ -21,7 +21,9 @@ import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.IAccessibilityServiceConnection; import android.accessibilityservice.IBrailleDisplayController; import android.accessibilityservice.MagnificationConfig; +import android.annotation.EnforcePermission; import android.annotation.NonNull; +import android.annotation.RequiresNoPermission; import android.content.pm.ParceledListSlice; import android.graphics.Region; import android.hardware.usb.UsbDevice; @@ -216,16 +218,19 @@ public class AccessibilityServiceConnectionImpl extends IAccessibilityServiceCon public void setAnimationScale(float scale) {} + @RequiresNoPermission @Override public void setInstalledAndEnabledServices(List<AccessibilityServiceInfo> infos) throws RemoteException { } + @RequiresNoPermission @Override public List<AccessibilityServiceInfo> getInstalledAndEnabledServices() throws RemoteException { return null; } + @RequiresNoPermission @Override public void attachAccessibilityOverlayToDisplay( int interactionId, @@ -233,6 +238,7 @@ public class AccessibilityServiceConnectionImpl extends IAccessibilityServiceCon SurfaceControl sc, IAccessibilityInteractionConnectionCallback callback) {} + @RequiresNoPermission @Override public void attachAccessibilityOverlayToWindow( int interactionId, @@ -240,14 +246,21 @@ public class AccessibilityServiceConnectionImpl extends IAccessibilityServiceCon SurfaceControl sc, IAccessibilityInteractionConnectionCallback callback) {} + @EnforcePermission(android.Manifest.permission.BLUETOOTH_CONNECT) @Override - public void connectBluetoothBrailleDisplay(String bluetoothAddress, - IBrailleDisplayController controller) {} + public void connectBluetoothBrailleDisplay( + String bluetoothAddress, IBrailleDisplayController controller) { + connectBluetoothBrailleDisplay_enforcePermission(); + } + @RequiresNoPermission @Override - public void connectUsbBrailleDisplay(UsbDevice usbDevice, - IBrailleDisplayController controller) {} + public void connectUsbBrailleDisplay( + UsbDevice usbDevice, IBrailleDisplayController controller) {} + @EnforcePermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) @Override - public void setTestBrailleDisplayData(List<Bundle> brailleDisplays) {} + public void setTestBrailleDisplayData(List<Bundle> brailleDisplays) { + setTestBrailleDisplayData_enforcePermission(); + } } diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index 8a699ef39280..42f168bb4a6b 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -44,10 +44,12 @@ import android.accessibilityservice.IAccessibilityServiceClient; import android.accessibilityservice.IAccessibilityServiceConnection; import android.accessibilityservice.IBrailleDisplayController; import android.accessibilityservice.MagnificationConfig; +import android.annotation.EnforcePermission; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SuppressLint; +import android.annotation.PermissionManuallyEnforced; +import android.annotation.RequiresNoPermission; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; @@ -68,6 +70,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.PermissionEnforcer; import android.os.PowerManager; import android.os.RemoteCallback; import android.os.RemoteException; @@ -121,7 +124,6 @@ import java.util.Set; * This class represents an accessibility client - either an AccessibilityService or a UiAutomation. * It is responsible for behavior common to both types of clients. */ -@SuppressWarnings("MissingPermissionAnnotation") abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServiceConnection.Stub implements ServiceConnection, IBinder.DeathRecipient, KeyEventDispatcher.KeyEventFilter, FingerprintGestureDispatcher.FingerprintGestureClient { @@ -339,6 +341,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ AccessibilityTrace trace, WindowManagerInternal windowManagerInternal, SystemActionPerformer systemActionPerfomer, AccessibilityWindowManager a11yWindowManager) { + super(PermissionEnforcer.fromContext(context)); mContext = context; mWindowManagerService = windowManagerInternal; mId = id; @@ -469,6 +472,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return (mEventTypes != 0 && mService != null); } + @RequiresNoPermission @Override public void setOnKeyEventResult(boolean handled, int sequence) { if (svcConnTracingEnabled()) { @@ -482,6 +486,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public AccessibilityServiceInfo getServiceInfo() { if (svcConnTracingEnabled()) { @@ -501,6 +506,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ : AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) | mEventTypes; } + @RequiresNoPermission @Override public void setServiceInfo(AccessibilityServiceInfo info) { if (svcConnTracingEnabled()) { @@ -536,16 +542,19 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void setInstalledAndEnabledServices(List<AccessibilityServiceInfo> infos) { return; } + @RequiresNoPermission @Override public List<AccessibilityServiceInfo> getInstalledAndEnabledServices() { return null; } + @RequiresNoPermission @Override public void setAttributionTag(String attributionTag) { mAttributionTag = attributionTag; @@ -558,6 +567,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ protected abstract boolean hasRightsToCurrentUserLocked(); @Nullable + @RequiresNoPermission @Override public AccessibilityWindowInfo.WindowListSparseArray getWindows() { if (svcConnTracingEnabled()) { @@ -606,6 +616,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ mDisplayTypes = displayTypes; } + @RequiresNoPermission @Override public AccessibilityWindowInfo getWindow(int windowId) { if (svcConnTracingEnabled()) { @@ -646,6 +657,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public String[] findAccessibilityNodeInfosByViewId(int accessibilityWindowId, long accessibilityNodeId, String viewIdResName, int interactionId, @@ -722,6 +734,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return null; } + @RequiresNoPermission @Override public String[] findAccessibilityNodeInfosByText(int accessibilityWindowId, long accessibilityNodeId, String text, int interactionId, @@ -797,6 +810,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return null; } + @RequiresNoPermission @Override public String[] findAccessibilityNodeInfoByAccessibilityId( int accessibilityWindowId, long accessibilityNodeId, int interactionId, @@ -875,6 +889,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return null; } + @RequiresNoPermission @Override public String[] findFocus(int accessibilityWindowId, long accessibilityNodeId, int focusType, int interactionId, @@ -952,6 +967,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return null; } + @RequiresNoPermission @Override public String[] focusSearch(int accessibilityWindowId, long accessibilityNodeId, int direction, int interactionId, @@ -1028,6 +1044,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return null; } + @RequiresNoPermission @Override public void sendGesture(int sequence, ParceledListSlice gestureSteps) { if (svcConnTracingEnabled()) { @@ -1036,6 +1053,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void dispatchGesture(int sequence, ParceledListSlice gestureSteps, int displayId) { if (svcConnTracingEnabled()) { @@ -1044,6 +1062,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public boolean performAccessibilityAction(int accessibilityWindowId, long accessibilityNodeId, int action, Bundle arguments, int interactionId, @@ -1075,6 +1094,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ action, arguments, interactionId, callback, mFetchFlags, interrogatingTid); } + @RequiresNoPermission @Override public boolean performGlobalAction(int action) { if (svcConnTracingEnabled()) { @@ -1093,6 +1113,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public @NonNull List<AccessibilityNodeInfo.AccessibilityAction> getSystemActions() { if (svcConnTracingEnabled()) { @@ -1111,6 +1132,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public boolean isFingerprintGestureDetectionAvailable() { if (svcConnTracingEnabled()) { @@ -1133,6 +1155,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } @Nullable + @RequiresNoPermission @Override public MagnificationConfig getMagnificationConfig(int displayId) { if (svcConnTracingEnabled()) { @@ -1151,6 +1174,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public float getMagnificationScale(int displayId) { if (svcConnTracingEnabled()) { @@ -1169,6 +1193,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public Region getMagnificationRegion(int displayId) { if (svcConnTracingEnabled()) { @@ -1193,6 +1218,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } + @RequiresNoPermission @Override public Region getCurrentMagnificationRegion(int displayId) { if (svcConnTracingEnabled()) { @@ -1216,6 +1242,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public float getMagnificationCenterX(int displayId) { if (svcConnTracingEnabled()) { @@ -1237,6 +1264,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public float getMagnificationCenterY(int displayId) { if (svcConnTracingEnabled()) { @@ -1258,6 +1286,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public boolean resetMagnification(int displayId, boolean animate) { if (svcConnTracingEnabled()) { @@ -1282,6 +1311,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public boolean resetCurrentMagnification(int displayId, boolean animate) { if (svcConnTracingEnabled()) { @@ -1307,6 +1337,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public boolean setMagnificationConfig(int displayId, @NonNull MagnificationConfig config, boolean animate) { @@ -1333,6 +1364,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void setMagnificationCallbackEnabled(int displayId, boolean enabled) { if (svcConnTracingEnabled()) { @@ -1351,6 +1383,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return mInvocationHandler.isMagnificationCallbackEnabled(displayId); } + @RequiresNoPermission @Override public void setSoftKeyboardCallbackEnabled(boolean enabled) { if (svcConnTracingEnabled()) { @@ -1364,6 +1397,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void takeScreenshotOfWindow(int accessibilityWindowId, int interactionId, ScreenCapture.ScreenCaptureListener listener, @@ -1414,6 +1448,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void takeScreenshot(int displayId, RemoteCallback callback) { if (svcConnTracingEnabled()) { @@ -1553,6 +1588,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } @Override + @PermissionManuallyEnforced public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; synchronized (mLock) { @@ -1649,6 +1685,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ * @param displayId The id of the logical display that was added. * @return window token. */ + @RequiresNoPermission @Override public IBinder getOverlayWindowToken(int displayId) { if (svcConnTracingEnabled()) { @@ -1670,6 +1707,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ * @param token The token * @return window id */ + @RequiresNoPermission @Override public int getWindowIdForLeashToken(@NonNull IBinder token) { if (svcConnTracingEnabled()) { @@ -2523,6 +2561,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return mSendMotionEvents; } + @RequiresNoPermission @Override public void setGestureDetectionPassthroughRegion(int displayId, Region region) { if (svcConnTracingEnabled()) { @@ -2537,6 +2576,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void setTouchExplorationPassthroughRegion(int displayId, Region region) { if (svcConnTracingEnabled()) { @@ -2551,6 +2591,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void setFocusAppearance(int strokeWidth, int color) { if (svcConnTracingEnabled()) { @@ -2558,6 +2599,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void setCacheEnabled(boolean enabled) { if (svcConnTracingEnabled()) { @@ -2574,6 +2616,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void logTrace(long timestamp, String where, long loggingTypes, String callingParams, int processId, long threadId, int callingUid, Bundle callingStack) { @@ -2629,6 +2672,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ mTrace.logTrace(TRACE_WM + "." + methodName, FLAGS_WINDOW_MANAGER_INTERNAL, params); } + @RequiresNoPermission @Override public void setServiceDetectsGesturesEnabled(int displayId, boolean mode) { final long identity = Binder.clearCallingIdentity(); @@ -2647,6 +2691,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ return false; } + @RequiresNoPermission @Override public void requestTouchExploration(int displayId) { final long identity = Binder.clearCallingIdentity(); @@ -2657,6 +2702,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void requestDragging(int displayId, int pointerId) { final long identity = Binder.clearCallingIdentity(); @@ -2667,6 +2713,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void requestDelegating(int displayId) { final long identity = Binder.clearCallingIdentity(); @@ -2677,6 +2724,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void onDoubleTap(int displayId) { final long identity = Binder.clearCallingIdentity(); @@ -2687,6 +2735,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void onDoubleTapAndHold(int displayId) { final long identity = Binder.clearCallingIdentity(); @@ -2700,6 +2749,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ /** * Sets the scaling factor for animations. */ + @RequiresNoPermission @Override public void setAnimationScale(float scale) { final long identity = Binder.clearCallingIdentity(); @@ -2717,6 +2767,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void attachAccessibilityOverlayToDisplay( int interactionId, @@ -2733,6 +2784,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } } + @RequiresNoPermission @Override public void attachAccessibilityOverlayToWindow( int interactionId, @@ -2779,12 +2831,14 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } @Override - @SuppressLint("AndroidFrameworkRequiresPermission") // Unsupported in Abstract class + @EnforcePermission(android.Manifest.permission.BLUETOOTH_CONNECT) public void connectBluetoothBrailleDisplay(String bluetoothAddress, IBrailleDisplayController controller) { + connectBluetoothBrailleDisplay_enforcePermission(); throw new UnsupportedOperationException(); } + @RequiresNoPermission @Override public void connectUsbBrailleDisplay(UsbDevice usbDevice, IBrailleDisplayController controller) { @@ -2792,8 +2846,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } @Override - @SuppressLint("AndroidFrameworkRequiresPermission") // Unsupported in Abstract class + @EnforcePermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void setTestBrailleDisplayData(List<Bundle> brailleDisplays) { + setTestBrailleDisplayData_enforcePermission(); throw new UnsupportedOperationException(); } } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java index 1f65e15c1bff..786d167af5de 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java @@ -30,10 +30,10 @@ import android.accessibilityservice.BrailleDisplayController; import android.accessibilityservice.IAccessibilityServiceClient; import android.accessibilityservice.IBrailleDisplayController; import android.accessibilityservice.TouchInteractionController; +import android.annotation.EnforcePermission; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.RequiresPermission; -import android.annotation.SuppressLint; +import android.annotation.RequiresNoPermission; import android.annotation.UserIdInt; import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; @@ -79,7 +79,6 @@ import java.util.Set; * passed to the service it represents as soon it is bound. It also serves as the * connection for the service. */ -@SuppressWarnings("MissingPermissionAnnotation") class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnection { private static final String LOG_TAG = "AccessibilityServiceConnection"; @@ -110,6 +109,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect mUserId = userId; } + @RequiresNoPermission @Override public void sessionCreated(IAccessibilityInputMethodSession session, int id) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "ASC.sessionCreated"); @@ -196,6 +196,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect return mSecurityPolicy.canRetrieveWindowContentLocked(this) && mRetrieveInteractiveWindows; } + @RequiresNoPermission @Override public void disableSelf() { if (svcConnTracingEnabled()) { @@ -253,6 +254,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect } } + @RequiresNoPermission @Override public AccessibilityServiceInfo getServiceInfo() { return mAccessibilityServiceInfo; @@ -330,6 +332,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect return false; } + @RequiresNoPermission @Override public boolean setSoftKeyboardShowMode(int showMode) { if (svcConnTracingEnabled()) { @@ -351,6 +354,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect } } + @RequiresNoPermission @Override public int getSoftKeyboardShowMode() { if (svcConnTracingEnabled()) { @@ -365,6 +369,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect } } + @RequiresNoPermission @Override public boolean switchToInputMethod(String imeId) { if (svcConnTracingEnabled()) { @@ -386,6 +391,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect return result; } + @RequiresNoPermission @Override @AccessibilityService.SoftKeyboardController.EnableImeResult public int setInputMethodEnabled(String imeId, boolean enabled) throws SecurityException { @@ -421,6 +427,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect return ENABLE_IME_FAIL_UNKNOWN; } + @RequiresNoPermission @Override public boolean isAccessibilityButtonAvailable() { if (svcConnTracingEnabled()) { @@ -535,6 +542,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect } } + @RequiresNoPermission @Override public void dispatchGesture(int sequence, ParceledListSlice gestureSteps, int displayId) { synchronized (mLock) { @@ -569,6 +577,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect } } + @RequiresNoPermission @Override public void setFocusAppearance(int strokeWidth, int color) { AccessibilityUserState userState = mUserStateWeakReference.get(); @@ -683,16 +692,15 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect * {@link android.bluetooth.BluetoothDevice#getAddress()}. */ @Override - @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT) + @EnforcePermission(Manifest.permission.BLUETOOTH_CONNECT) public void connectBluetoothBrailleDisplay( @NonNull String bluetoothAddress, @NonNull IBrailleDisplayController controller) { + connectBluetoothBrailleDisplay_enforcePermission(); if (!android.view.accessibility.Flags.brailleDisplayHid()) { throw new IllegalStateException("Flag BRAILLE_DISPLAY_HID not enabled"); } Objects.requireNonNull(bluetoothAddress); Objects.requireNonNull(controller); - mContext.enforceCallingPermission(Manifest.permission.BLUETOOTH_CONNECT, - "Missing BLUETOOTH_CONNECT permission"); if (!BluetoothAdapter.checkBluetoothAddress(bluetoothAddress)) { throw new IllegalArgumentException( bluetoothAddress + " is not a valid Bluetooth address"); @@ -728,7 +736,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect * * <p>The caller package must already have USB permission for this {@link UsbDevice}. */ - @SuppressLint("MissingPermission") // system_server has the required MANAGE_USB permission + @RequiresNoPermission @Override @NonNull public void connectUsbBrailleDisplay(@NonNull UsbDevice usbDevice, @@ -783,11 +791,10 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect } @Override - @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) + @EnforcePermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void setTestBrailleDisplayData(List<Bundle> brailleDisplays) { + setTestBrailleDisplayData_enforcePermission(); // Enforce that this TestApi is only called by trusted (test) callers. - mContext.enforceCallingPermission(Manifest.permission.MANAGE_ACCESSIBILITY, - "Missing MANAGE_ACCESSIBILITY permission"); mTestBrailleDisplays = brailleDisplays; } diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java index b77b2bef57a2..4cb3d247edb0 100644 --- a/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java @@ -24,6 +24,8 @@ import android.accessibilityservice.AccessibilityTrace; import android.accessibilityservice.IAccessibilityServiceClient; import android.accessibilityservice.MagnificationConfig; import android.annotation.NonNull; +import android.annotation.PermissionManuallyEnforced; +import android.annotation.RequiresNoPermission; import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; @@ -64,7 +66,6 @@ import java.util.Set; * * TODO(241429275): Initialize this when a proxy is registered. */ -@SuppressWarnings("MissingPermissionAnnotation") public class ProxyAccessibilityServiceConnection extends AccessibilityServiceConnection { private static final String LOG_TAG = "ProxyAccessibilityServiceConnection"; @@ -125,6 +126,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon * * @param infos the list of enabled and installed services. */ + @RequiresNoPermission @Override public void setInstalledAndEnabledServices(@NonNull List<AccessibilityServiceInfo> infos) { final long identity = Binder.clearCallingIdentity(); @@ -215,6 +217,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } } + @RequiresNoPermission @Override @NonNull public List<AccessibilityServiceInfo> getInstalledAndEnabledServices() { @@ -224,6 +227,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } } + @RequiresNoPermission @Override public AccessibilityWindowInfo.WindowListSparseArray getWindows() { final AccessibilityWindowInfo.WindowListSparseArray allWindows = super.getWindows(); @@ -235,6 +239,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon return displayWindows; } + @RequiresNoPermission @Override public void setFocusAppearance(int strokeWidth, int color) { synchronized (mLock) { @@ -272,6 +277,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon return mFocusColor; } + @RequiresNoPermission @Override int resolveAccessibilityWindowIdForFindFocusLocked(int windowId, int focusType) { if (windowId == AccessibilityWindowInfo.ANY_WINDOW_ID) { @@ -314,12 +320,14 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need fingerprint hardware */ + @RequiresNoPermission @Override public boolean isCapturingFingerprintGestures() throws UnsupportedOperationException { throw new UnsupportedOperationException("isCapturingFingerprintGestures is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need fingerprint hardware */ + @RequiresNoPermission @Override public void onFingerprintGestureDetectionActiveChanged(boolean active) throws UnsupportedOperationException { @@ -328,12 +336,14 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need fingerprint hardware */ + @RequiresNoPermission @Override public void onFingerprintGesture(int gesture) throws UnsupportedOperationException { throw new UnsupportedOperationException("onFingerprintGesture is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need fingerprint hardware */ + @RequiresNoPermission @Override public boolean isFingerprintGestureDetectionAvailable() throws UnsupportedOperationException { throw new UnsupportedOperationException("isFingerprintGestureDetectionAvailable is not" @@ -341,6 +351,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy is not a Service */ + @RequiresNoPermission @Override public void onServiceConnected(ComponentName name, IBinder service) throws UnsupportedOperationException { @@ -349,6 +360,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy is not a Service */ + @RequiresNoPermission @Override public void onServiceDisconnected(ComponentName name) throws UnsupportedOperationException { @@ -357,6 +369,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon /** @throws UnsupportedOperationException since a proxy should use * setInstalledAndEnabledServices*/ + @RequiresNoPermission @Override public void setServiceInfo(AccessibilityServiceInfo info) throws UnsupportedOperationException { @@ -365,6 +378,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy should use A11yManager#unregister */ + @RequiresNoPermission @Override public void disableSelf() throws UnsupportedOperationException { // A proxy uses A11yManager#unregister to turn itself off. @@ -372,12 +386,14 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not have global system access */ + @RequiresNoPermission @Override public boolean performGlobalAction(int action) throws UnsupportedOperationException { throw new UnsupportedOperationException("performGlobalAction is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need key events */ + @RequiresNoPermission @Override public void setOnKeyEventResult(boolean handled, int sequence) throws UnsupportedOperationException { @@ -385,6 +401,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not have global system access */ + @RequiresNoPermission @Override public @NonNull List<AccessibilityNodeInfo.AccessibilityAction> getSystemActions() throws UnsupportedOperationException { @@ -393,6 +410,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon /** @throws UnsupportedOperationException since a proxy does not need magnification */ @Nullable + @RequiresNoPermission @Override public MagnificationConfig getMagnificationConfig(int displayId) throws UnsupportedOperationException { @@ -400,30 +418,35 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public float getMagnificationScale(int displayId) throws UnsupportedOperationException { throw new UnsupportedOperationException("getMagnificationScale is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public float getMagnificationCenterX(int displayId) throws UnsupportedOperationException { throw new UnsupportedOperationException("getMagnificationCenterX is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public float getMagnificationCenterY(int displayId) throws UnsupportedOperationException { throw new UnsupportedOperationException("getMagnificationCenterY is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public Region getMagnificationRegion(int displayId) throws UnsupportedOperationException { throw new UnsupportedOperationException("getMagnificationRegion is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public Region getCurrentMagnificationRegion(int displayId) throws UnsupportedOperationException { @@ -431,6 +454,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public boolean resetMagnification(int displayId, boolean animate) throws UnsupportedOperationException { @@ -438,6 +462,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public boolean resetCurrentMagnification(int displayId, boolean animate) throws UnsupportedOperationException { @@ -445,6 +470,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public boolean setMagnificationConfig(int displayId, @androidx.annotation.NonNull MagnificationConfig config, boolean animate) @@ -453,6 +479,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public void setMagnificationCallbackEnabled(int displayId, boolean enabled) throws UnsupportedOperationException { @@ -460,24 +487,28 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need magnification */ + @RequiresNoPermission @Override public boolean isMagnificationCallbackEnabled(int displayId) { throw new UnsupportedOperationException("isMagnificationCallbackEnabled is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need IME access*/ + @RequiresNoPermission @Override public boolean setSoftKeyboardShowMode(int showMode) throws UnsupportedOperationException { throw new UnsupportedOperationException("setSoftKeyboardShowMode is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need IME access */ + @RequiresNoPermission @Override public int getSoftKeyboardShowMode() throws UnsupportedOperationException { throw new UnsupportedOperationException("getSoftKeyboardShowMode is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need IME access */ + @RequiresNoPermission @Override public void setSoftKeyboardCallbackEnabled(boolean enabled) throws UnsupportedOperationException { @@ -485,12 +516,14 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need IME access */ + @RequiresNoPermission @Override public boolean switchToInputMethod(String imeId) throws UnsupportedOperationException { throw new UnsupportedOperationException("switchToInputMethod is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need IME access */ + @RequiresNoPermission @Override public int setInputMethodEnabled(String imeId, boolean enabled) throws UnsupportedOperationException { @@ -498,12 +531,14 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need access to the shortcut */ + @RequiresNoPermission @Override public boolean isAccessibilityButtonAvailable() throws UnsupportedOperationException { throw new UnsupportedOperationException("isAccessibilityButtonAvailable is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need gestures/input access */ + @RequiresNoPermission @Override public void sendGesture(int sequence, ParceledListSlice gestureSteps) throws UnsupportedOperationException { @@ -511,6 +546,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need gestures/input access */ + @RequiresNoPermission @Override public void dispatchGesture(int sequence, ParceledListSlice gestureSteps, int displayId) throws UnsupportedOperationException { @@ -518,6 +554,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need access to screenshots */ + @RequiresNoPermission @Override public void takeScreenshot(int displayId, RemoteCallback callback) throws UnsupportedOperationException { @@ -525,6 +562,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need gestures/input access */ + @RequiresNoPermission @Override public void setGestureDetectionPassthroughRegion(int displayId, Region region) throws UnsupportedOperationException { @@ -533,6 +571,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need gestures/input access */ + @RequiresNoPermission @Override public void setTouchExplorationPassthroughRegion(int displayId, Region region) throws UnsupportedOperationException { @@ -541,6 +580,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need gestures/input access */ + @RequiresNoPermission @Override public void setServiceDetectsGesturesEnabled(int displayId, boolean mode) throws UnsupportedOperationException { @@ -549,36 +589,42 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } /** @throws UnsupportedOperationException since a proxy does not need touch input access */ + @RequiresNoPermission @Override public void requestTouchExploration(int displayId) throws UnsupportedOperationException { throw new UnsupportedOperationException("requestTouchExploration is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need touch input access */ + @RequiresNoPermission @Override public void requestDragging(int displayId, int pointerId) throws UnsupportedOperationException { throw new UnsupportedOperationException("requestDragging is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need touch input access */ + @RequiresNoPermission @Override public void requestDelegating(int displayId) throws UnsupportedOperationException { throw new UnsupportedOperationException("requestDelegating is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need touch input access */ + @RequiresNoPermission @Override public void onDoubleTap(int displayId) throws UnsupportedOperationException { throw new UnsupportedOperationException("onDoubleTap is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need touch input access */ + @RequiresNoPermission @Override public void onDoubleTapAndHold(int displayId) throws UnsupportedOperationException { throw new UnsupportedOperationException("onDoubleTapAndHold is not supported"); } /** @throws UnsupportedOperationException since a proxy does not need touch input access */ + @RequiresNoPermission @Override public void setAnimationScale(float scale) throws UnsupportedOperationException { throw new UnsupportedOperationException("setAnimationScale is not supported"); @@ -615,6 +661,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon return updated; } + @PermissionManuallyEnforced @Override public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; diff --git a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java index aad9e24ee8cc..63a183d506f8 100644 --- a/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java @@ -21,6 +21,8 @@ import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityTrace; import android.accessibilityservice.IAccessibilityServiceClient; import android.annotation.Nullable; +import android.annotation.PermissionManuallyEnforced; +import android.annotation.RequiresNoPermission; import android.app.UiAutomation; import android.content.ComponentName; import android.content.Context; @@ -242,7 +244,6 @@ class UiAutomationManager { } } - @SuppressWarnings("MissingPermissionAnnotation") private class UiAutomationService extends AbstractAccessibilityServiceConnection { private final Handler mMainHandler; @@ -318,6 +319,7 @@ class UiAutomationManager { return true; } + @PermissionManuallyEnforced @Override public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; @@ -330,31 +332,37 @@ class UiAutomationManager { } // Since this isn't really an accessibility service, several methods are just stubbed here. + @RequiresNoPermission @Override public boolean setSoftKeyboardShowMode(int mode) { return false; } + @RequiresNoPermission @Override public int getSoftKeyboardShowMode() { return 0; } + @RequiresNoPermission @Override public boolean switchToInputMethod(String imeId) { return false; } + @RequiresNoPermission @Override public int setInputMethodEnabled(String imeId, boolean enabled) { return AccessibilityService.SoftKeyboardController.ENABLE_IME_FAIL_UNKNOWN; } + @RequiresNoPermission @Override public boolean isAccessibilityButtonAvailable() { return false; } + @RequiresNoPermission @Override public void disableSelf() {} @@ -375,6 +383,7 @@ class UiAutomationManager { @Override public void onFingerprintGesture(int gesture) {} + @RequiresNoPermission @Override public void takeScreenshot(int displayId, RemoteCallback callback) {} } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java index 16d05b157727..6e6d5a870031 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java @@ -89,6 +89,7 @@ import android.os.PowerManager; import android.os.Process; import android.os.RemoteCallback; import android.os.RemoteException; +import android.os.test.FakePermissionEnforcer; import android.util.Pair; import android.view.Display; import android.view.KeyEvent; @@ -181,6 +182,7 @@ public class AbstractAccessibilityServiceConnectionTest { @Mock private FingerprintGestureDispatcher mMockFingerprintGestureDispatcher; @Mock private MagnificationProcessor mMockMagnificationProcessor; @Mock private RemoteCallback.OnResultListener mMockListener; + FakePermissionEnforcer mFakePermissionEnforcer = new FakePermissionEnforcer(); @Before public void setup() { @@ -198,6 +200,8 @@ public class AbstractAccessibilityServiceConnectionTest { PowerManager powerManager = new PowerManager(mMockContext, mMockIPowerManager, mMockIThermalService, mHandler); when(mMockContext.getSystemService(Context.POWER_SERVICE)).thenReturn(powerManager); + when(mMockContext.getSystemService(Context.PERMISSION_ENFORCER_SERVICE)) + .thenReturn(mFakePermissionEnforcer); when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockPackageManager.hasSystemFeature(FEATURE_FINGERPRINT)).thenReturn(true); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java index cda8b01afceb..c4946f0b221e 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java @@ -26,7 +26,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.notNull; -import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -56,6 +55,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; +import android.os.test.FakePermissionEnforcer; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; @@ -82,7 +82,6 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; - /** * Tests for AccessibilityServiceConnection */ @@ -130,6 +129,7 @@ public class AccessibilityServiceConnectionTest { IBrailleDisplayController mMockBrailleDisplayController; @Mock MotionEventInjector mMockMotionEventInjector; + FakePermissionEnforcer mFakePermissionEnforcer = new FakePermissionEnforcer(); MessageCapturingHandler mHandler = new MessageCapturingHandler(null); @@ -151,12 +151,14 @@ public class AccessibilityServiceConnectionTest { when(mMockA11yTrace.isA11yTracingEnabled()).thenReturn(false); when(mMockContext.getSystemService(Context.DISPLAY_SERVICE)) .thenReturn(new DisplayManager(mMockContext)); + when(mMockContext.getSystemService(Context.PERMISSION_ENFORCER_SERVICE)) + .thenReturn(mFakePermissionEnforcer); mConnection = new AccessibilityServiceConnection(mMockUserState, mMockContext, - COMPONENT_NAME, mServiceInfo, SERVICE_ID, mHandler, new Object(), - mMockSecurityPolicy, mMockSystemSupport, mMockA11yTrace, - mMockWindowManagerInternal, mMockSystemActionPerformer, - mMockA11yWindowManager, mMockActivityTaskManagerInternal); + COMPONENT_NAME, mServiceInfo, SERVICE_ID, mHandler, new Object(), + mMockSecurityPolicy, mMockSystemSupport, mMockA11yTrace, + mMockWindowManagerInternal, mMockSystemActionPerformer, + mMockA11yWindowManager, mMockActivityTaskManagerInternal); when(mMockSecurityPolicy.canPerformGestures(mConnection)).thenReturn(true); when(mMockSecurityPolicy.checkAccessibilityAccess(mConnection)).thenReturn(true); } @@ -317,6 +319,8 @@ public class AccessibilityServiceConnectionTest { @Test @RequiresFlagsEnabled(android.view.accessibility.Flags.FLAG_BRAILLE_DISPLAY_HID) public void connectBluetoothBrailleDisplay() throws Exception { + mFakePermissionEnforcer.grant(Manifest.permission.BLUETOOTH_CONNECT); + mFakePermissionEnforcer.grant(Manifest.permission.MANAGE_ACCESSIBILITY); final String macAddress = "00:11:22:33:AA:BB"; final byte[] descriptor = {0x05, 0x41}; Bundle bd = new Bundle(); @@ -338,9 +342,6 @@ public class AccessibilityServiceConnectionTest { @Test @RequiresFlagsEnabled(android.view.accessibility.Flags.FLAG_BRAILLE_DISPLAY_HID) public void connectBluetoothBrailleDisplay_throwsForMissingBluetoothConnectPermission() { - doThrow(SecurityException.class).when(mMockContext) - .enforceCallingPermission(eq(Manifest.permission.BLUETOOTH_CONNECT), any()); - assertThrows(SecurityException.class, () -> mConnection.connectBluetoothBrailleDisplay("unused", mMockBrailleDisplayController)); @@ -349,6 +350,7 @@ public class AccessibilityServiceConnectionTest { @Test @RequiresFlagsEnabled(android.view.accessibility.Flags.FLAG_BRAILLE_DISPLAY_HID) public void connectBluetoothBrailleDisplay_throwsForNullMacAddress() { + mFakePermissionEnforcer.grant(Manifest.permission.BLUETOOTH_CONNECT); assertThrows(NullPointerException.class, () -> mConnection.connectBluetoothBrailleDisplay(null, mMockBrailleDisplayController)); @@ -357,6 +359,7 @@ public class AccessibilityServiceConnectionTest { @Test @RequiresFlagsEnabled(android.view.accessibility.Flags.FLAG_BRAILLE_DISPLAY_HID) public void connectBluetoothBrailleDisplay_throwsForMisformattedMacAddress() { + mFakePermissionEnforcer.grant(Manifest.permission.BLUETOOTH_CONNECT); assertThrows(IllegalArgumentException.class, () -> mConnection.connectBluetoothBrailleDisplay("12:34", mMockBrailleDisplayController)); @@ -365,6 +368,7 @@ public class AccessibilityServiceConnectionTest { @Test @RequiresFlagsEnabled(android.view.accessibility.Flags.FLAG_BRAILLE_DISPLAY_HID) public void connectUsbBrailleDisplay() throws Exception { + mFakePermissionEnforcer.grant(Manifest.permission.MANAGE_ACCESSIBILITY); final String serialNumber = "myUsbDevice"; final byte[] descriptor = {0x05, 0x41}; Bundle bd = new Bundle(); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java index 3d0db71ba17f..c0e5f760d05c 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java @@ -38,6 +38,7 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.os.Handler; +import android.os.test.FakePermissionEnforcer; import android.view.accessibility.AccessibilityEvent; import com.android.server.wm.WindowManagerInternal; @@ -79,6 +80,7 @@ public class ProxyAccessibilityServiceConnectionTest { AccessibilityTrace mMockA11yTrace; @Mock WindowManagerInternal mMockWindowManagerInternal; + FakePermissionEnforcer mFakePermissionEnforcer = new FakePermissionEnforcer(); ProxyAccessibilityServiceConnection mProxyConnection; AccessibilityServiceInfo mAccessibilityServiceInfo; private int mFocusStrokeWidthDefaultValue; @@ -90,6 +92,8 @@ public class ProxyAccessibilityServiceConnectionTest { MockitoAnnotations.initMocks(this); when(mMockContext.getResources()).thenReturn(resources); when(mMockSecurityPolicy.checkAccessibilityAccess(any())).thenReturn(true); + when(mMockContext.getSystemService(Context.PERMISSION_ENFORCER_SERVICE)) + .thenReturn(mFakePermissionEnforcer); mAccessibilityServiceInfo = new AccessibilityServiceInfo(); mProxyConnection = new ProxyAccessibilityServiceConnection(mMockContext, COMPONENT_NAME, diff --git a/services/tests/servicestests/src/com/android/server/accessibility/ProxyManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/ProxyManagerTest.java index f1b356a2a0dc..52b33db556e6 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/ProxyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/ProxyManagerTest.java @@ -50,6 +50,7 @@ import android.graphics.Region; import android.os.IBinder; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.os.test.FakePermissionEnforcer; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; @@ -113,6 +114,7 @@ public class ProxyManagerTest { @Mock private IBinder mMockServiceAsBinder; @Mock private VirtualDeviceManagerInternal mMockVirtualDeviceManagerInternal; @Mock private IVirtualDeviceManager mMockIVirtualDeviceManager; + FakePermissionEnforcer mFakePermissionEnforcer = new FakePermissionEnforcer(); private int mFocusStrokeWidthDefaultValue; private int mFocusColorDefaultValue; @@ -132,6 +134,8 @@ public class ProxyManagerTest { when(mMockContext.getMainExecutor()) .thenReturn(InstrumentationRegistry.getTargetContext().getMainExecutor()); + when(mMockContext.getSystemService(Context.PERMISSION_ENFORCER_SERVICE)) + .thenReturn(mFakePermissionEnforcer); when(mMockVirtualDeviceManagerInternal.getDeviceIdsForUid(anyInt())).thenReturn( new ArraySet(Set.of(DEVICE_ID))); LocalServices.removeServiceForTest(VirtualDeviceManagerInternal.class); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java index 95a1f5a8a52f..e24592e556ea 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java @@ -39,6 +39,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.hardware.display.DisplayManager; import android.os.IBinder; +import android.os.test.FakePermissionEnforcer; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.view.WindowManager; @@ -80,12 +81,15 @@ public class UiAutomationManagerTest { @Mock IBinder mMockOwner; @Mock IAccessibilityServiceClient mMockAccessibilityServiceClient; @Mock IBinder mMockServiceAsBinder; + FakePermissionEnforcer mFakePermissionEnforcer = new FakePermissionEnforcer(); @Before public void setup() { MockitoAnnotations.initMocks(this); when(mMockSystemSupport.getKeyEventDispatcher()).thenReturn(mock(KeyEventDispatcher.class)); + when(mMockContext.getSystemService(Context.PERMISSION_ENFORCER_SERVICE)) + .thenReturn(mFakePermissionEnforcer); when(mMockServiceInfo.getResolveInfo()).thenReturn(mMockResolveInfo); mMockResolveInfo.serviceInfo = mock(ServiceInfo.class); |