summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/system-current.txt9
-rw-r--r--api/test-current.txt12
-rw-r--r--core/java/android/provider/Settings.java1
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java33
-rw-r--r--core/java/android/view/accessibility/IAccessibilityManager.aidl5
-rw-r--r--core/res/AndroidManifest.xml5
-rw-r--r--data/etc/privapp-permissions-platform.xml1
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java19
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}.
*/