diff options
| -rw-r--r-- | api/system-current.txt | 9 | ||||
| -rw-r--r-- | api/test-current.txt | 12 | ||||
| -rw-r--r-- | core/java/android/provider/Settings.java | 1 | ||||
| -rw-r--r-- | core/java/android/view/accessibility/AccessibilityManager.java | 33 | ||||
| -rw-r--r-- | core/java/android/view/accessibility/IAccessibilityManager.aidl | 5 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 5 | ||||
| -rw-r--r-- | data/etc/privapp-permissions-platform.xml | 1 | ||||
| -rw-r--r-- | services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java | 19 |
8 files changed, 82 insertions, 3 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 7f5833022004..0d7cad12bd73 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -93,6 +93,7 @@ package android { field public static final java.lang.String LOCATION_HARDWARE = "android.permission.LOCATION_HARDWARE"; field public static final java.lang.String LOCK_DEVICE = "android.permission.LOCK_DEVICE"; field public static final java.lang.String LOOP_RADIO = "android.permission.LOOP_RADIO"; + field public static final java.lang.String MANAGE_ACCESSIBILITY = "android.permission.MANAGE_ACCESSIBILITY"; field public static final java.lang.String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS"; field public static final java.lang.String MANAGE_APP_OPS_RESTRICTIONS = "android.permission.MANAGE_APP_OPS_RESTRICTIONS"; field public static final java.lang.String MANAGE_APP_TOKENS = "android.permission.MANAGE_APP_TOKENS"; @@ -6830,6 +6831,14 @@ package android.view { } +package android.view.accessibility { + + public final class AccessibilityManager { + method public void performAccessibilityShortcut(); + } + +} + package android.webkit { public abstract class CookieManager { diff --git a/api/test-current.txt b/api/test-current.txt index 8f08c7108721..d453395fe9cd 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -960,6 +960,7 @@ package android.provider { public static final class Settings.Secure extends android.provider.Settings.NameValueTable { field public static final java.lang.String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled"; + field public static final java.lang.String ACCESSIBILITY_SHORTCUT_TARGET_SERVICE = "accessibility_shortcut_target_service"; field public static final java.lang.String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification"; field public static final java.lang.String AUTOFILL_SERVICE = "autofill_service"; field public static final java.lang.String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count"; @@ -1611,6 +1612,17 @@ package android.view { package android.view.accessibility { + public final class AccessibilityManager { + method public void addAccessibilityServicesStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, android.os.Handler); + method public java.lang.String getAccessibilityShortcutService(); + method public void performAccessibilityShortcut(); + method public void removeAccessibilityServicesStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener); + } + + public static abstract interface AccessibilityManager.AccessibilityServicesStateChangeListener { + method public abstract void onAccessibilityServicesStateChanged(android.view.accessibility.AccessibilityManager); + } + public class AccessibilityNodeInfo implements android.os.Parcelable { method public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger); method public void writeToParcelNoRecycle(android.os.Parcel, int); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 45e634385104..cba0a5083349 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6038,6 +6038,7 @@ public final class Settings { * shortcut. Must be its flattened {@link ComponentName}. * @hide */ + @TestApi public static final String ACCESSIBILITY_SHORTCUT_TARGET_SERVICE = "accessibility_shortcut_target_service"; diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index e88682ea6287..a7d0cfbde1d5 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -23,8 +23,11 @@ import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityServiceInfo.FeedbackType; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.SdkConstant; +import android.annotation.SystemApi; import android.annotation.SystemService; +import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -204,6 +207,7 @@ public final class AccessibilityManager { * * @hide */ + @TestApi public interface AccessibilityServicesStateChangeListener { /** @@ -778,6 +782,7 @@ public final class AccessibilityManager { * for a callback on the process's main handler. * @hide */ + @TestApi public void addAccessibilityServicesStateChangeListener( @NonNull AccessibilityServicesStateChangeListener listener, @Nullable Handler handler) { synchronized (mLock) { @@ -793,6 +798,7 @@ public final class AccessibilityManager { * * @hide */ + @TestApi public void removeAccessibilityServicesStateChangeListener( @NonNull AccessibilityServicesStateChangeListener listener) { synchronized (mLock) { @@ -1056,6 +1062,9 @@ public final class AccessibilityManager { * * @hide */ + @SystemApi + @TestApi + @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut() { final IAccessibilityManager service; synchronized (mLock) { @@ -1139,6 +1148,30 @@ public final class AccessibilityManager { } } + /** + * Get the component name of the service currently assigned to the accessibility shortcut. + * + * @return The flattened component name + * @hide + */ + @TestApi + @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) + @Nullable + public String getAccessibilityShortcutService() { + final IAccessibilityManager service; + synchronized (mLock) { + service = getServiceLocked(); + } + if (service != null) { + try { + return service.getAccessibilityShortcutService(); + } catch (RemoteException re) { + re.rethrowFromSystemServer(); + } + } + return null; + } + private IAccessibilityManager getServiceLocked() { if (mService == null) { tryConnectToServiceLocked(null); diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl index 3e2ef186f793..61a8a1da2b42 100644 --- a/core/java/android/view/accessibility/IAccessibilityManager.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl @@ -67,9 +67,12 @@ interface IAccessibilityManager { void notifyAccessibilityButtonVisibilityChanged(boolean available); - // Requires WRITE_SECURE_SETTINGS + // Requires Manifest.permission.MANAGE_ACCESSIBILITY void performAccessibilityShortcut(); + // Requires Manifest.permission.MANAGE_ACCESSIBILITY + String getAccessibilityShortcutService(); + // System process only boolean sendFingerprintGesture(int gestureKeyCode); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index cd6bf666b5a1..e728eadfc40f 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4199,6 +4199,11 @@ <permission android:name="android.permission.READ_CLIPBOARD_IN_BACKGROUND" android:protectionLevel="signature" /> + <!-- @SystemApi Allows modifying accessibility state. + @hide --> + <permission android:name="android.permission.MANAGE_ACCESSIBILITY" + android:protectionLevel="signature|setup" /> + <application android:process="system" android:persistent="true" android:hasCode="false" diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 28e92dbe264a..8964ee3046f5 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -313,6 +313,7 @@ applications that come with the platform <permission name="android.permission.INSTALL_PACKAGES"/> <permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.LOCAL_MAC_ADDRESS"/> + <permission name="android.permission.MANAGE_ACCESSIBILITY"/> <permission name="android.permission.MANAGE_ACTIVITY_STACKS"/> <permission name="android.permission.MANAGE_DEVICE_ADMINS"/> <permission name="android.permission.MANAGE_USB"/> diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index fbceade2341f..097405af0222 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2068,7 +2068,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub && componentNameToEnable.equals(userState.mServiceToEnableWithShortcut)) { return false; } + userState.mServiceToEnableWithShortcut = componentNameToEnable; + scheduleNotifyClientsOfServicesStateChange(userState); return true; } @@ -2343,10 +2345,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub @Override public void performAccessibilityShortcut() { if ((UserHandle.getAppId(Binder.getCallingUid()) != Process.SYSTEM_UID) - && (mContext.checkCallingPermission(Manifest.permission.WRITE_SECURE_SETTINGS) + && (mContext.checkCallingPermission(Manifest.permission.MANAGE_ACCESSIBILITY) != PackageManager.PERMISSION_GRANTED)) { throw new SecurityException( - "performAccessibilityShortcut requires the WRITE_SECURE_SETTINGS permission"); + "performAccessibilityShortcut requires the MANAGE_ACCESSIBILITY permission"); } final Map<ComponentName, ToggleableFrameworkFeatureInfo> frameworkFeatureMap = AccessibilityShortcutController.getFrameworkShortcutFeaturesMap(); @@ -2381,6 +2383,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } }; + @Override + public String getAccessibilityShortcutService() { + if (mContext.checkCallingPermission(Manifest.permission.MANAGE_ACCESSIBILITY) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException( + "getAccessibilityShortcutService requires the MANAGE_ACCESSIBILITY permission"); + } + synchronized(mLock) { + final UserState userState = getUserStateLocked(mCurrentUserId); + return userState.mServiceToEnableWithShortcut.flattenToString(); + } + } + /** * Enables accessibility service specified by {@param componentName} for the {@param userId}. */ |