summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl68
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityServiceConnectionImpl.java23
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java63
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java27
-rw-r--r--services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java49
-rw-r--r--services/accessibility/java/com/android/server/accessibility/UiAutomationManager.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java22
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/ProxyManagerTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java4
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);