Test routing changed callback when first audio device is selected.

As routed device may not be the same as the preferred device, it may
cause routing changed callback test failure if it check the routed
device is the same as preferred device. Instead, it is more robust to
test if the callback is triggered or not when there is routing changed
event.

Bug: 126787597
Test: run RoutingTest
Merged-In: I8b247d91e49b2c099c2cdd06ea0a99ddd37daa03
Change-Id: I8b247d91e49b2c099c2cdd06ea0a99ddd37daa03
diff --git a/tests/tests/media/src/android/media/cts/RoutingTest.java b/tests/tests/media/src/android/media/cts/RoutingTest.java
index 28d9564..e1765d8 100644
--- a/tests/tests/media/src/android/media/cts/RoutingTest.java
+++ b/tests/tests/media/src/android/media/cts/RoutingTest.java
@@ -71,9 +71,12 @@
     private static final Set<Integer> AVAILABLE_INPUT_DEVICES_TYPE = new HashSet<>(
         Arrays.asList(AudioDeviceInfo.TYPE_BUILTIN_MIC));
 
+    private boolean mRoutingChanged;
     private AudioManager mAudioManager;
     private CountDownLatch mRoutingChangedLatch;
     private File mOutFile;
+    private Looper mRoutingChangedLooper;
+    private Object mRoutingChangedLock = new Object();
 
     @Override
     protected void setUp() throws Exception {
@@ -556,6 +559,10 @@
             if (mRoutingChangedLatch != null) {
                 mRoutingChangedLatch.countDown();
             }
+            synchronized (mRoutingChangedLock) {
+                mRoutingChanged = true;
+                mRoutingChangedLock.notify();
+            }
         }
     }
 
@@ -563,7 +570,7 @@
         final int resid = R.raw.testmp3_2;
         MediaPlayer mediaPlayer = MediaPlayer.create(mContext, resid);
         mediaPlayer.setAudioAttributes(
-            new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build());
+                new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build());
         mediaPlayer.start();
         return mediaPlayer;
     }
@@ -653,54 +660,41 @@
         }
     }
 
-    public void test_MediaPlayer_RoutingChangedCallback() {
+    public void test_MediaPlayer_RoutingChangedCallback() throws Exception {
         if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) {
             // Can't do it so skip this test
             return;
         }
 
-        MediaPlayer mediaPlayer = allocMediaPlayer();
-        AudioRoutingListener listener = new AudioRoutingListener();
-        mediaPlayer.addOnRoutingChangedListener(listener, null);
-
-        AudioDeviceInfo[] deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
-        if (deviceList.length < 2) {
-            // The available output device is less than 2, we can't switch output device.
-            return;
-        }
-        Set<Integer> testedDeviceTypes = new HashSet<>();
-        for (AudioDeviceInfo device : deviceList) {
-            final int deviceType = device.getType();
-            if (testedDeviceTypes.contains(deviceType)) {
-                // b/122478352 setPreferredDevice can not differentiate devices with same type.
-                continue;
+        mRoutingChanged = false;
+        mRoutingChangedLooper = null;
+        // Create MediaPlayer in another thread to make sure there is a looper active for events.
+        Thread t = new Thread() {
+            @Override
+            public void run() {
+                Looper.prepare();
+                // Keep looper to terminate when the test is finished.
+                mRoutingChangedLooper = Looper.myLooper();
+                AudioRoutingListener listener = new AudioRoutingListener();
+                MediaPlayer mediaPlayer = allocMediaPlayer();
+                mediaPlayer.addOnRoutingChangedListener(listener, null);
+                Looper.loop();
+                mediaPlayer.removeOnRoutingChangedListener(listener);
+                mediaPlayer.stop();
+                mediaPlayer.release();
             }
-            testedDeviceTypes.add(deviceType);
-            assertTrue(mediaPlayer.setPreferredDevice(device));
-            boolean routingChanged = false;
-            for (int i = 0; i < MAX_WAITING_ROUTING_CHANGED_COUNT; i++) {
-                // Create a new CountDownLatch in case it is triggered by previous routing change.
-                mRoutingChangedLatch = new CountDownLatch(1);
-                try {
-                    mRoutingChangedLatch.await(WAIT_ROUTING_CHANGE_TIME_MS, TimeUnit.MILLISECONDS);
-                } catch (InterruptedException e) {
-                }
-                AudioDeviceInfo routedDevice = mediaPlayer.getRoutedDevice();
-                if (routedDevice == null) {
-                    continue;
-                }
-                if (routedDevice.getId() == device.getId()) {
-                    routingChanged = true;
-                    break;
-                }
-            }
-            assertTrue("Switching to device " + device.getType() + " failed",
-                    routingChanged);
+        };
+        t.start();
+        synchronized (mRoutingChangedLock) {
+            mRoutingChangedLock.wait(WAIT_ROUTING_CHANGE_TIME_MS
+                    * MAX_WAITING_ROUTING_CHANGED_COUNT);
         }
-
-        mediaPlayer.removeOnRoutingChangedListener(listener);
-        mediaPlayer.stop();
-        mediaPlayer.release();
+        if (mRoutingChangedLooper != null) {
+            mRoutingChangedLooper.quitSafely();
+            mRoutingChangedLooper = null;
+        }
+        t.join();
+        assertTrue("Routing changed callback has not been called", mRoutingChanged);
     }
 
     public void test_mediaPlayer_incallMusicRoutingPermissions() {