From 1e6695bbd44433564d42e20447aadf57c8d1b08e Mon Sep 17 00:00:00 2001 From: Phil Weaver Date: Tue, 16 Aug 2016 15:10:01 -0700 Subject: [PATCH] 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 --- .../AccessibilityManagerService.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 99f14d7c4c001..8f4fbc22147e4 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -278,6 +278,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) {