diff options
| author | 2016-08-16 15:10:01 -0700 | |
|---|---|---|
| committer | 2016-08-16 16:51:45 -0700 | |
| commit | 1e6695bbd44433564d42e20447aadf57c8d1b08e (patch) | |
| tree | 140cac00d5b89a940026eb0429f9369129262212 | |
| parent | 2a0e48aaf5fe309c3a4fd6ab761be8129e95f57a (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.java | 25 | 
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();  |