summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Phil Weaver <pweaver@google.com> 2016-08-16 15:10:01 -0700
committer Phil Weaver <pweaver@google.com> 2016-08-16 16:51:45 -0700
commit1e6695bbd44433564d42e20447aadf57c8d1b08e (patch)
tree140cac00d5b89a940026eb0429f9369129262212
parent2a0e48aaf5fe309c3a4fd6ab761be8129e95f57a (diff)
Restart accessibility services after they update.
In ag/1273924, we stopped restarting services that were still bound. When the package changes, however, the system unbinds from a service and has no way to tell us that it is not going to restart it (as it would if the service crashed.) Now we listen for package updates and unbind affected services. The services will then be restarted as there will be enabled services that are no longer bound. Bug: 30866905 Change-Id: I375edfd6a37ed25f959ec354930cec8f288deb6b
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java25
1 files changed, 25 insertions, 0 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 99f14d7c4c00..8f4fbc22147e 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -279,6 +279,31 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
@Override
+ public void onPackageUpdateFinished(String packageName, int uid) {
+ // Unbind all services from this package, and then update the user state to
+ // re-bind new versions of them.
+ synchronized (mLock) {
+ final int userId = getChangingUserId();
+ if (userId != mCurrentUserId) {
+ return;
+ }
+ UserState userState = getUserStateLocked(userId);
+ boolean unboundAService = false;
+ for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
+ Service boundService = userState.mBoundServices.get(i);
+ String servicePkg = boundService.mComponentName.getPackageName();
+ if (servicePkg.equals(packageName)) {
+ boundService.unbindLocked();
+ unboundAService = true;
+ }
+ }
+ if (unboundAService) {
+ onUserStateChangedLocked(userState);
+ }
+ }
+ }
+
+ @Override
public void onPackageRemoved(String packageName, int uid) {
synchronized (mLock) {
final int userId = getChangingUserId();