Changed CarUserManager.addListener() to use an Executor.

Test: atest CtsCarTestCases:android.car.cts.CarUserManagerTest
Bug: 144120654
Bug: 146207078

Change-Id: I0c483dc64cfa59eee25fbb241d16dd69f3414968
diff --git a/tests/tests/car/src/android/car/cts/CarUserManagerTest.java b/tests/tests/car/src/android/car/cts/CarUserManagerTest.java
index b2e94e9..622fa28 100644
--- a/tests/tests/car/src/android/car/cts/CarUserManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarUserManagerTest.java
@@ -21,6 +21,8 @@
 import static com.android.compatibility.common.util.ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn;
 import static com.android.compatibility.common.util.ShellUtils.runShellCommand;
 
+import static com.google.common.truth.Truth.assertWithMessage;
+
 import static org.junit.Assert.fail;
 
 import static org.testng.Assert.assertThrows;
@@ -45,6 +47,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
@@ -73,6 +76,9 @@
     private static int sInitialUserId = UserHandle.myUserId();
     private static int sNewUserId = UserHandle.USER_NULL;
 
+    private final Executor mNoOpExecutor = (r) -> {};
+    private final UserLifecycleListener mNoOpListener = (e) -> {};
+
     @Override
     @Before
     public void setUp() throws Exception {
@@ -102,7 +108,8 @@
     public void testAddListener_noPermission() throws Exception {
         toggleInteractAcrossUsersPermission(false);
         try {
-            assertThrows(SecurityException.class, ()-> sCarUserManager.addListener((e) -> {}));
+            assertThrows(SecurityException.class,
+                    () -> sCarUserManager.addListener(mNoOpExecutor, mNoOpListener));
         } finally {
             toggleInteractAcrossUsersPermission(true);
         }
@@ -112,7 +119,8 @@
     public void testRemoveListener_noPermission() throws Exception {
         toggleInteractAcrossUsersPermission(false);
         try {
-            assertThrows(SecurityException.class, ()-> sCarUserManager.removeListener((e) -> {}));
+            assertThrows(SecurityException.class,
+                    ()-> sCarUserManager.removeListener(mNoOpListener));
         } finally {
             toggleInteractAcrossUsersPermission(true);
         }
@@ -171,7 +179,13 @@
             }
         };
         Log.d(TAG, "registering listener: " + listener);
-        sCarUserManager.addListener(listener);
+
+
+        AtomicBoolean executedRef = new AtomicBoolean();
+        sCarUserManager.addListener((r) -> {
+            executedRef.set(true);
+            r.run();
+        }, listener);
 
         // Switch while listener is registered
         switchUser(newUserId);
@@ -179,6 +193,9 @@
             fail("listener not called in " + SWITCH_TIMEOUT_USING_CHECK_MS + "ms");
         }
 
+        // Make sure it was executed in the proper threaqd
+        assertWithMessage("not executed on executor").that(executedRef.get()).isTrue();
+
          // Then switch back when it isn't
         // TODO(b/144120654): the current mechanism is not thread safe because if an event is
         // received before this line, it wouldn't be detected. But that's fine for now, as this test