Let the contrast API support multiple users

With CL, UiModeManagerService will use one remoteCallbackList per user,
instead of a global remoteCallbackList

Bug: 279431842
Test: atest UiModeManagerTest
Change-Id: Iaebb53b50bd29ca7e9ceae096d159aab5ff41c7e
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 7c32627..55e805a 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -28,6 +28,7 @@
 import static android.app.UiModeManager.PROJECTION_TYPE_AUTOMOTIVE;
 import static android.app.UiModeManager.PROJECTION_TYPE_NONE;
 import static android.os.UserHandle.USER_SYSTEM;
+import static android.os.UserHandle.getCallingUserId;
 import static android.provider.Settings.Secure.CONTRAST_LEVEL;
 import static android.util.TimeUtils.isTimeBetween;
 
@@ -199,8 +200,8 @@
     private PowerManagerInternal mLocalPowerManager;
 
     @GuardedBy("mLock")
-    private final RemoteCallbackList<IUiModeManagerCallback> mUiModeManagerCallbacks =
-            new RemoteCallbackList<IUiModeManagerCallback>();
+    private final SparseArray<RemoteCallbackList<IUiModeManagerCallback>> mUiModeManagerCallbacks =
+            new SparseArray<>();
 
     @GuardedBy("mLock")
     @Nullable
@@ -371,8 +372,9 @@
             synchronized (mLock) {
                 if (updateContrastLocked()) {
                     float contrast = getContrastLocked();
-                    mUiModeManagerCallbacks.broadcast(ignoreRemoteException(callback ->
-                            callback.notifyContrastChanged(contrast)));
+                    mUiModeManagerCallbacks.get(mCurrentUser, new RemoteCallbackList<>())
+                            .broadcast(ignoreRemoteException(
+                                    callback -> callback.notifyContrastChanged(contrast)));
                 }
             }
         }
@@ -664,8 +666,12 @@
     private final IUiModeManager.Stub mService = new IUiModeManager.Stub() {
         @Override
         public void addCallback(IUiModeManagerCallback callback) {
+            int userId = getCallingUserId();
             synchronized (mLock) {
-                mUiModeManagerCallbacks.register(callback);
+                if (!mUiModeManagerCallbacks.contains(userId)) {
+                    mUiModeManagerCallbacks.put(userId, new RemoteCallbackList<>());
+                }
+                mUiModeManagerCallbacks.get(userId).register(callback);
             }
         }