summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjovanak2018-06-22 19:23:43 -0500
committerjovanak2018-06-25 14:34:52 -0500
commit32c0c703325c07bca115bfd17a5620989f03e6d0 (patch)
tree89772dacaf60589fc3bb83a195b3e900c0369d2d /car-lib
parent5748e3e9174c05dc2c44ff667cc4f3cca100238d (diff)
downloadplatform-packages-services-car-32c0c703325c07bca115bfd17a5620989f03e6d0.tar.gz
platform-packages-services-car-32c0c703325c07bca115bfd17a5620989f03e6d0.tar.xz
platform-packages-services-car-32c0c703325c07bca115bfd17a5620989f03e6d0.zip
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.java50
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 a0f4e15d..5eb572ff 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;
34import android.provider.Settings; 34import android.provider.Settings;
35import android.util.Log; 35import android.util.Log;
36 36
37import com.android.internal.annotations.VisibleForTesting;
38import com.android.internal.util.UserIcons; 37import com.android.internal.util.UserIcons;
39 38
40import com.google.android.collect.Sets; 39import com.google.android.collect.Sets;
41 40
41import java.util.ArrayList;
42import java.util.Iterator; 42import java.util.Iterator;
43import java.util.List; 43import java.util.List;
44import java.util.Set; 44import java.util.Set;
@@ -68,15 +68,23 @@ public class CarUserManagerHelper {
68 private final ActivityManager mActivityManager; 68 private final ActivityManager mActivityManager;
69 private int mLastActiveUser = UserHandle.USER_SYSTEM; 69 private int mLastActiveUser = UserHandle.USER_SYSTEM;
70 private Bitmap mDefaultGuestUserIcon; 70 private Bitmap mDefaultGuestUserIcon;
71 private OnUsersUpdateListener mUpdateListener; 71 private ArrayList<OnUsersUpdateListener> mUpdateListeners;
72 private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() { 72 private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
73 @Override 73 @Override
74 public void onReceive(Context context, Intent intent) { 74 public void onReceive(Context context, Intent intent) {
75 mUpdateListener.onUsersUpdate(); 75 ArrayList<OnUsersUpdateListener> copyOfUpdateListeners;
76 synchronized (mUpdateListeners) {
77 copyOfUpdateListeners = new ArrayList(mUpdateListeners);
78 }
79
80 for (OnUsersUpdateListener listener : copyOfUpdateListeners) {
81 listener.onUsersUpdate();
82 }
76 } 83 }
77 }; 84 };
78 85
79 public CarUserManagerHelper(Context context) { 86 public CarUserManagerHelper(Context context) {
87 mUpdateListeners = new ArrayList<>();
80 mContext = context.getApplicationContext(); 88 mContext = context.getApplicationContext();
81 mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 89 mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
82 mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); 90 mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
@@ -85,24 +93,42 @@ public class CarUserManagerHelper {
85 /** 93 /**
86 * Registers a listener for updates to all users - removing, adding users or changing user info. 94 * Registers a listener for updates to all users - removing, adding users or changing user info.
87 * 95 *
88 * <p> Best practise is to keep one listener per helper.
89 *
90 * @param listener Instance of {@link OnUsersUpdateListener}. 96 * @param listener Instance of {@link OnUsersUpdateListener}.
91 */ 97 */
92 public void registerOnUsersUpdateListener(OnUsersUpdateListener listener) { 98 public void registerOnUsersUpdateListener(OnUsersUpdateListener listener) {
93 if (mUpdateListener != null) { 99 if (listener == null) {
94 unregisterOnUsersUpdateListener(); 100 return;
95 } 101 }
96 102
97 mUpdateListener = listener; 103 synchronized (mUpdateListeners) {
98 registerReceiver(); 104 if (mUpdateListeners.isEmpty()) {
105 // First listener being added, register receiver.
106 registerReceiver();
107 }
108
109 if (!mUpdateListeners.contains(listener)) {
110 mUpdateListeners.add(listener);
111 }
112 }
99 } 113 }
100 114
101 /** 115 /**
102 * Unregisters on user update listener by unregistering {@code BroadcastReceiver}. 116 * Unregisters on user update listener.
117 * Unregisters {@code BroadcastReceiver} if no listeners remain.
118 *
119 * @param listener Instance of {@link OnUsersUpdateListener} to unregister.
103 */ 120 */
104 public void unregisterOnUsersUpdateListener() { 121 public void unregisterOnUsersUpdateListener(OnUsersUpdateListener listener) {
105 unregisterReceiver(); 122 synchronized (mUpdateListeners) {
123 if (mUpdateListeners.contains(listener)) {
124 mUpdateListeners.remove(listener);
125
126 if (mUpdateListeners.isEmpty()) {
127 // No more listeners, unregister broadcast receiver.
128 unregisterReceiver();
129 }
130 }
131 }
106 } 132 }
107 133
108 /** 134 /**