diff options
author | jovanak | 2018-06-22 19:23:43 -0500 |
---|---|---|
committer | jovanak | 2018-06-25 14:34:52 -0500 |
commit | 32c0c703325c07bca115bfd17a5620989f03e6d0 (patch) | |
tree | 89772dacaf60589fc3bb83a195b3e900c0369d2d /car-lib | |
parent | 5748e3e9174c05dc2c44ff667cc4f3cca100238d (diff) | |
download | platform-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.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 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; | |||
34 | import android.provider.Settings; | 34 | import android.provider.Settings; |
35 | import android.util.Log; | 35 | import android.util.Log; |
36 | 36 | ||
37 | import com.android.internal.annotations.VisibleForTesting; | ||
38 | import com.android.internal.util.UserIcons; | 37 | import com.android.internal.util.UserIcons; |
39 | 38 | ||
40 | import com.google.android.collect.Sets; | 39 | import com.google.android.collect.Sets; |
41 | 40 | ||
41 | import java.util.ArrayList; | ||
42 | import java.util.Iterator; | 42 | import java.util.Iterator; |
43 | import java.util.List; | 43 | import java.util.List; |
44 | import java.util.Set; | 44 | import 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 | /** |