NoMan: Refresh ManagedServices on user switch

Fix a bug where ManagedServices didn't unbind from obsolete and
bind to new services after switching the current user.

Bug: 17477093
Change-Id: Ica28978a01f84ba17bdd93e2feaf68547e837bcc
This commit is contained in:
Christoph Studer
2014-09-12 14:45:59 +02:00
parent 6658b159db
commit b53dfd4fae
2 changed files with 20 additions and 0 deletions

View File

@@ -87,6 +87,10 @@ abstract public class ManagedServices {
// Just the packages from mEnabledServicesForCurrentProfiles
private ArraySet<String> mEnabledServicesPackageNames = new ArraySet<String>();
// Kept to de-dupe user change events (experienced after boot, when we receive a settings and a
// user change).
private int[] mLastSeenProfileIds;
public ManagedServices(Context context, Handler handler, Object mutex,
UserProfiles userProfiles) {
mContext = context;
@@ -159,6 +163,15 @@ abstract public class ManagedServices {
}
}
public void onUserSwitched() {
if (DEBUG) Slog.d(TAG, "onUserSwitched");
if (Arrays.equals(mLastSeenProfileIds, mUserProfiles.getCurrentProfileIds())) {
if (DEBUG) Slog.d(TAG, "Current profile IDs didn't change, skipping rebindServices().");
return;
}
rebindServices();
}
public ManagedServiceInfo checkServiceTokenLocked(IInterface service) {
checkNotNull(service);
final IBinder token = service.asBinder();
@@ -321,6 +334,8 @@ abstract public class ManagedServices {
registerService(component, userIds[i]);
}
}
mLastSeenProfileIds = mUserProfiles.getCurrentProfileIds();
}
/**
@@ -523,6 +538,8 @@ abstract public class ManagedServices {
private void update(Uri uri) {
if (uri == null || mSecureSettingsUri.equals(uri)) {
if (DEBUG) Slog.d(TAG, "Setting changed: mSecureSettingsUri=" + mSecureSettingsUri +
" / uri=" + uri);
rebindServices();
}
}

View File

@@ -718,6 +718,9 @@ public class NotificationManagerService extends SystemService {
// reload per-user settings
mSettingsObserver.update(null);
mUserProfiles.updateCache(context);
// Refresh managed services
mConditionProviders.onUserSwitched();
mListeners.onUserSwitched();
} else if (action.equals(Intent.ACTION_USER_ADDED)) {
mUserProfiles.updateCache(context);
}