Set deviceState before notifying about added devices

To match ddmlib behavior in `AdbLibIDeviceManager`, query
device state so that it can be set on `IDevice` before notifying
listeners about `addedDevices`.

Test: updated
Bug: 293350579
Change-Id: I9827375b7bb17758bffad9e6e5a4844173a97c3a
diff --git a/adblib-ddmlibcompatibility/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManager.kt b/adblib-ddmlibcompatibility/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManager.kt
index c63d4fc..15bbb00 100644
--- a/adblib-ddmlibcompatibility/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManager.kt
+++ b/adblib-ddmlibcompatibility/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManager.kt
@@ -89,19 +89,32 @@
                     initialDeviceListDone = true
 
                     if (addedIDevices.isNotEmpty()) {
+                        //Set current deviceState before triggering `iDeviceManagerListener.addedDevices`
+                        for (addedConnectedDevice in added) {
+                            val iDevice = deviceMap.getValue(addedConnectedDevice)
+                            iDevice.deviceState =
+                                addedConnectedDevice.deviceInfoFlow.value.deviceState
+                        }
                         postAndWaitForCompletion(scope, "devices added") {
                             iDeviceManagerListener.addedDevices(addedIDevices)
                         }
+
                         for (addedConnectedDevice in added) {
                             val iDevice = deviceMap.getValue(addedConnectedDevice)
                             addedConnectedDevice.scope.launch {
                                 addedConnectedDevice.deviceInfoFlow.map { it.deviceState }.collect {
-                                    iDevice.deviceState = it
-                                    // Match ddmlib behavior by not triggering device state change
-                                    // event for a `DISCONNECTED` device state value.
-                                    if (it != DeviceState.DISCONNECTED) {
-                                        postAndWaitForCompletion(scope, "device state changed") {
-                                            iDeviceManagerListener.deviceStateChanged(iDevice)
+                                    if (iDevice.deviceState != it) {
+                                        iDevice.deviceState = it
+
+                                        // Match ddmlib behavior by not triggering device state
+                                        // change event for a `DISCONNECTED` device state value.
+                                        if (it != DeviceState.DISCONNECTED) {
+                                            postAndWaitForCompletion(
+                                                scope,
+                                                "device state changed"
+                                            ) {
+                                                iDeviceManagerListener.deviceStateChanged(iDevice)
+                                            }
                                         }
                                     }
                                 }
diff --git a/adblib-ddmlibcompatibility/test/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManagerTest.kt b/adblib-ddmlibcompatibility/test/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManagerTest.kt
index 827c5ee..ab80025 100644
--- a/adblib-ddmlibcompatibility/test/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManagerTest.kt
+++ b/adblib-ddmlibcompatibility/test/src/com/android/adblib/ddmlibcompatibility/AdbLibIDeviceManagerTest.kt
@@ -12,6 +12,7 @@
 import kotlinx.coroutines.delay
 import org.junit.Assert.assertArrayEquals
 import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
 import org.junit.Rule
 import org.junit.Test
@@ -73,13 +74,17 @@
             "sdk",
             DeviceState.HostConnectionType.USB
         )
-        fakeDevice.deviceStatus = DeviceState.DeviceStatus.ONLINE
+        fakeDevice.deviceStatus = DeviceState.DeviceStatus.FASTBOOTD
 
         // Act / Assert
-        yieldUntil { deviceManager.devices.size == 1 && iDeviceManagerListener.events.size == 2 }
-        // Delay a little to check that no other state change events are being triggered
+        yieldUntil { deviceManager.devices.size == 1 }
+        // Wait a little for the `IDeviceManagerListener` events to get processed
         delay(100)
-        assertEquals(2, iDeviceManagerListener.events.size)
+        assertFalse(deviceManager.devices[0].isOnline)
+
+        fakeDevice.deviceStatus = DeviceState.DeviceStatus.ONLINE
+        // Wait a little for the `IDeviceManagerListener` events to get processed
+        delay(100)
         assertTrue(deviceManager.devices[0].isOnline)
         assertArrayEquals(
             arrayOf(
@@ -111,7 +116,9 @@
         fakeDevice.deviceStatus = DeviceState.DeviceStatus.ONLINE
 
         // Act / Assert
-        yieldUntil { deviceManager.devices.size == 1 && iDeviceManagerListener.events.size == 2 }
+        yieldUntil { deviceManager.devices.size == 1 }
+        // Wait a little for the `IDeviceManagerListener` events to get processed
+        delay(100)
         val device = deviceManager.devices[0]
         assertTrue(device.isOnline)
 
@@ -123,15 +130,11 @@
         assertArrayEquals(
             arrayOf(
                 TestIDeviceManagerListener.EventType.Added,
-                TestIDeviceManagerListener.EventType.StateChanged,
                 TestIDeviceManagerListener.EventType.Removed
             ), iDeviceManagerListener.events.toTypedArray()
         )
         // Assert that `DISCONNECTED` device state changed event didn't trigger
-        assertArrayEquals(
-            arrayOf(IDevice.DeviceState.ONLINE),
-            iDeviceManagerListener.deviceStateChangedValues.toTypedArray()
-        )
+        assertTrue(iDeviceManagerListener.deviceStateChangedValues.isEmpty())
     }
 
     @Test
@@ -158,7 +161,6 @@
             @WorkerThread
             override fun deviceStateChanged(device: IDevice) {
                 Thread.sleep(1)
-                println(device.isOnline)
                 synchronized(lock) {
                     totalCalls++
                     concurrentCalls++