Merge "Rebind managed services more" into nyc-dev

This commit is contained in:
Julia Reynolds
2016-03-16 14:08:19 +00:00
committed by Android (Google) Code Review
2 changed files with 54 additions and 29 deletions

View File

@@ -238,7 +238,7 @@ abstract public class ManagedServices {
rebuildRestoredPackages();
}
// make sure we're still bound to any of our services who may have just upgraded
rebindServices();
rebindServices(false);
}
}
@@ -249,13 +249,13 @@ abstract public class ManagedServices {
if (DEBUG) Slog.d(TAG, "Current profile IDs didn't change, skipping rebindServices().");
return;
}
rebindServices();
rebindServices(true);
}
public void onUserUnlocked(int user) {
if (DEBUG) Slog.d(TAG, "onUserUnlocked u=" + user);
rebuildRestoredPackages();
rebindServices();
rebindServices(false);
}
public ManagedServiceInfo getServiceFromTokenLocked(IInterface service) {
@@ -543,7 +543,7 @@ abstract public class ManagedServices {
* Called whenever packages change, the user switches, or the secure setting
* is altered. (For example in response to USER_SWITCHED in our broadcast receiver)
*/
private void rebindServices() {
private void rebindServices(boolean forceRebind) {
if (DEBUG) Slog.d(TAG, "rebindServices");
final int[] userIds = mUserProfiles.getCurrentProfileIds();
final int nUserIds = userIds.length;
@@ -559,15 +559,15 @@ abstract public class ManagedServices {
final SparseArray<Set<ComponentName>> toAdd = new SparseArray<>();
synchronized (mMutex) {
// Potentially unbind automatically bound services, retain system services.
// Rebind to non-system services if user switched
for (ManagedServiceInfo service : mServices) {
if (!service.isSystem && !service.isGuest(this)) {
removableBoundServices.add(service);
}
}
final ArraySet<ComponentName> newEnabled = new ArraySet<>();
final ArraySet<String> newPackages = new ArraySet<>();
mEnabledServicesForCurrentProfiles.clear();
mEnabledServicesPackageNames.clear();
for (int i = 0; i < nUserIds; ++i) {
// decode the list of components
@@ -591,15 +591,13 @@ abstract public class ManagedServices {
toAdd.put(userIds[i], add);
newEnabled.addAll(userComponents);
mEnabledServicesForCurrentProfiles.addAll(userComponents);
for (int j = 0; j < userComponents.size(); j++) {
final ComponentName component = userComponents.valueAt(j);
newPackages.add(component.getPackageName());
mEnabledServicesPackageNames.add(component.getPackageName());
}
}
mEnabledServicesForCurrentProfiles = newEnabled;
mEnabledServicesPackageNames = newPackages;
}
for (ManagedServiceInfo info : removableBoundServices) {
@@ -607,11 +605,11 @@ abstract public class ManagedServices {
final int oldUser = info.userid;
final Set<ComponentName> allowedComponents = toAdd.get(info.userid);
if (allowedComponents != null) {
if (allowedComponents.contains(component)) {
if (allowedComponents.contains(component) && !forceRebind) {
// Already bound, don't need to bind again.
allowedComponents.remove(component);
} else {
// No longer allowed to be bound.
// No longer allowed to be bound, or must rebind.
Slog.v(TAG, "disabling " + getCaption() + " for user "
+ oldUser + ": " + component);
unregisterService(component, oldUser);
@@ -622,8 +620,7 @@ abstract public class ManagedServices {
for (int i = 0; i < nUserIds; ++i) {
final Set<ComponentName> add = toAdd.get(userIds[i]);
for (ComponentName component : add) {
Slog.v(TAG, "enabling " + getCaption() + " for user " + userIds[i] + ": "
+ component);
Slog.v(TAG, "enabling " + getCaption() + " for " + userIds[i] + ": " + component);
registerService(component, userIds[i]);
}
}
@@ -859,7 +856,7 @@ abstract public class ManagedServices {
if (uri == null || mSecureSettingsUri.equals(uri)) {
if (DEBUG) Slog.d(TAG, "Setting changed: mSecureSettingsUri=" + mSecureSettingsUri +
" / uri=" + uri);
rebindServices();
rebindServices(false);
rebuildRestoredPackages();
}
}

View File

@@ -156,6 +156,7 @@ import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -948,19 +949,7 @@ public class NotificationManagerService extends SystemService {
// This is a MangedServices object that keeps track of the ranker.
mRankerServices = new NotificationRankers();
// Find the updatable ranker and register it.
Set<ComponentName> rankerComponents = mRankerServices.queryPackageForServices(
mRankerServicePackageName, UserHandle.USER_SYSTEM, null);
Iterator<ComponentName> iterator = rankerComponents.iterator();
if (iterator.hasNext()) {
ComponentName rankerComponent = iterator.next();
if (iterator.hasNext()) {
Slog.e(TAG, "found multiple ranker services:" + rankerComponents);
} else {
mRankerServices.registerSystemService(rankerComponent, UserHandle.USER_SYSTEM);
}
} else {
Slog.w(TAG, "could not start ranker service: none found");
}
mRankerServices.registerRanker();
mStatusBar = getLocalService(StatusBarManagerInternal.class);
if (mStatusBar != null) {
@@ -3585,6 +3574,45 @@ public class NotificationManagerService extends SystemService {
public boolean isEnabled() {
return !mServices.isEmpty();
}
@Override
public void onUserSwitched(int user) {
for (ManagedServiceInfo info : mServices) {
unregisterService(info.service, info.userid);
}
registerRanker();
}
@Override
public void onPackagesChanged(boolean queryReplace, String[] pkgList) {
if (DEBUG) Slog.d(TAG, "onPackagesChanged queryReplace=" + queryReplace
+ " pkgList=" + (pkgList == null ? null : Arrays.asList(pkgList)));
if (pkgList != null && (pkgList.length > 0)) {
for (String pkgName : pkgList) {
if (mRankerServicePackageName.equals(pkgName)) {
registerRanker();
}
}
}
}
protected void registerRanker() {
// Find the updatable ranker and register it.
Set<ComponentName> rankerComponents = queryPackageForServices(
mRankerServicePackageName, UserHandle.USER_SYSTEM, null);
Iterator<ComponentName> iterator = rankerComponents.iterator();
if (iterator.hasNext()) {
ComponentName rankerComponent = iterator.next();
if (iterator.hasNext()) {
Slog.e(TAG, "found multiple ranker services:" + rankerComponents);
} else {
registerSystemService(rankerComponent, UserHandle.USER_SYSTEM);
}
} else {
Slog.w(TAG, "could not start ranker service: none found");
}
}
}
public class NotificationListeners extends ManagedServices {