diff options
author | jovanak <jovanak@google.com> | 2018-06-22 17:23:43 -0700 |
---|---|---|
committer | jovanak <jovanak@google.com> | 2018-06-25 12:34:52 -0700 |
commit | 32c0c703325c07bca115bfd17a5620989f03e6d0 (patch) | |
tree | 89772dacaf60589fc3bb83a195b3e900c0369d2d /car-lib | |
parent | 5748e3e9174c05dc2c44ff667cc4f3cca100238d (diff) | |
download | Car-32c0c703325c07bca115bfd17a5620989f03e6d0.tar.gz |
Enables registering/unregistering multiple update listeners.
Change-Id: I8c59dd8bb675644f4c7bc0e4488a3c3576b01631
Fixes: 110708099
Test: atest CarUserManagerHelperTest
Diffstat (limited to 'car-lib')
-rw-r--r-- | car-lib/src/android/car/user/CarUserManagerHelper.java | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/car-lib/src/android/car/user/CarUserManagerHelper.java b/car-lib/src/android/car/user/CarUserManagerHelper.java index a0f4e15d7b..5eb572ff09 100644 --- a/car-lib/src/android/car/user/CarUserManagerHelper.java +++ b/car-lib/src/android/car/user/CarUserManagerHelper.java @@ -34,11 +34,11 @@ import android.os.UserManager; import android.provider.Settings; import android.util.Log; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.UserIcons; import com.google.android.collect.Sets; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -68,15 +68,23 @@ public class CarUserManagerHelper { private final ActivityManager mActivityManager; private int mLastActiveUser = UserHandle.USER_SYSTEM; private Bitmap mDefaultGuestUserIcon; - private OnUsersUpdateListener mUpdateListener; + private ArrayList<OnUsersUpdateListener> mUpdateListeners; private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - mUpdateListener.onUsersUpdate(); + ArrayList<OnUsersUpdateListener> copyOfUpdateListeners; + synchronized (mUpdateListeners) { + copyOfUpdateListeners = new ArrayList(mUpdateListeners); + } + + for (OnUsersUpdateListener listener : copyOfUpdateListeners) { + listener.onUsersUpdate(); + } } }; public CarUserManagerHelper(Context context) { + mUpdateListeners = new ArrayList<>(); mContext = context.getApplicationContext(); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); @@ -85,24 +93,42 @@ public class CarUserManagerHelper { /** * Registers a listener for updates to all users - removing, adding users or changing user info. * - * <p> Best practise is to keep one listener per helper. - * * @param listener Instance of {@link OnUsersUpdateListener}. */ public void registerOnUsersUpdateListener(OnUsersUpdateListener listener) { - if (mUpdateListener != null) { - unregisterOnUsersUpdateListener(); + if (listener == null) { + return; } - mUpdateListener = listener; - registerReceiver(); + synchronized (mUpdateListeners) { + if (mUpdateListeners.isEmpty()) { + // First listener being added, register receiver. + registerReceiver(); + } + + if (!mUpdateListeners.contains(listener)) { + mUpdateListeners.add(listener); + } + } } /** - * Unregisters on user update listener by unregistering {@code BroadcastReceiver}. + * Unregisters on user update listener. + * Unregisters {@code BroadcastReceiver} if no listeners remain. + * + * @param listener Instance of {@link OnUsersUpdateListener} to unregister. */ - public void unregisterOnUsersUpdateListener() { - unregisterReceiver(); + public void unregisterOnUsersUpdateListener(OnUsersUpdateListener listener) { + synchronized (mUpdateListeners) { + if (mUpdateListeners.contains(listener)) { + mUpdateListeners.remove(listener); + + if (mUpdateListeners.isEmpty()) { + // No more listeners, unregister broadcast receiver. + unregisterReceiver(); + } + } + } } /** |