summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jinsong Mu <jinsong@google.com> 2015-12-14 15:58:41 -0800
committer Jinsong Mu <jinsong@google.com> 2016-01-20 21:56:50 -0800
commita9e7a3bbe859a8416e54be28bd1f055df60074e5 (patch)
tree2ab6c5453f8b055abb0cc36f3203ca39d32d0297
parent6a13e3be66340c8f408f985219450fec30bbea41 (diff)
Accessibility services can turn themselves off b/22514381
Added disableSelf() method to AccessibilityService This newly added api used used in https://googleplex-android-review.git.corp.google.com/#/c/833857/ Change-Id: I5fe60181058ef90dd496318cf270e0825bcc411a
-rw-r--r--api/current.txt1
-rw-r--r--api/system-current.txt1
-rw-r--r--api/test-current.txt1
-rw-r--r--core/java/android/accessibilityservice/AccessibilityService.java16
-rw-r--r--core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl2
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java18
6 files changed, 39 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt
index e75ab1c608d3..684a097524fd 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2612,6 +2612,7 @@ package android.accessibilityservice {
public abstract class AccessibilityService extends android.app.Service {
ctor public AccessibilityService();
+ method public final void disableSelf();
method public final boolean dispatchGesture(android.accessibilityservice.GestureDescription, android.accessibilityservice.AccessibilityService.GestureResultCallback, android.os.Handler);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
diff --git a/api/system-current.txt b/api/system-current.txt
index 49ff9482a262..469d03e18b92 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -2714,6 +2714,7 @@ package android.accessibilityservice {
public abstract class AccessibilityService extends android.app.Service {
ctor public AccessibilityService();
+ method public final void disableSelf();
method public final boolean dispatchGesture(android.accessibilityservice.GestureDescription, android.accessibilityservice.AccessibilityService.GestureResultCallback, android.os.Handler);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
diff --git a/api/test-current.txt b/api/test-current.txt
index 68f8a41a38fc..d04b543e7e88 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -2612,6 +2612,7 @@ package android.accessibilityservice {
public abstract class AccessibilityService extends android.app.Service {
ctor public AccessibilityService();
+ method public final void disableSelf();
method public final boolean dispatchGesture(android.accessibilityservice.GestureDescription, android.accessibilityservice.AccessibilityService.GestureResultCallback, android.os.Handler);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 3293c264974a..8bc17f8d15eb 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -541,6 +541,22 @@ public abstract class AccessibilityService extends Service {
}
/**
+ * This method allows accessibility service turn itself off
+ * and the service will become disabled from the Settings.
+ */
+ public final void disableSelf() {
+ final IAccessibilityServiceConnection connection =
+ AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
+ if (connection != null) {
+ try {
+ connection.disableSelf();
+ } catch (RemoteException re) {
+ throw new RuntimeException(re);
+ }
+ }
+ }
+
+ /**
* Returns the magnification controller, which may be used to query and
* modify the state of display magnification.
* <p>
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
index a65b87b7b0c8..e58ef2fec010 100644
--- a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
+++ b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
@@ -65,6 +65,8 @@ interface IAccessibilityServiceConnection {
boolean performGlobalAction(int action);
+ oneway void disableSelf();
+
oneway void setOnKeyEventResult(boolean handled, int sequence);
float getMagnificationScale();
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 28aeef7c6a2f..dbbb1895d1da 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -2179,6 +2179,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
return true;
}
+ @Override
+ public void disableSelf() {
+ synchronized(mLock) {
+ UserState userState = getUserStateLocked(mUserId);
+ if (userState.mEnabledServices.remove(mComponentName)) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ persistComponentNamesToSettingLocked(
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ userState.mEnabledServices, mUserId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ onUserStateChangedLocked(userState);
+ }
+ }
+ }
+
public boolean canReceiveEventsLocked() {
return (mEventTypes != 0 && mFeedbackType != 0 && mService != null);
}