summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Prigogin <sprigogin@google.com>2022-08-16 12:28:58 -0700
committerTreeHugger Robot <treehugger-gerrit@google.com>2022-08-17 18:22:47 +0000
commita7fd14e3beccf613519809993993f439245a5fe2 (patch)
tree3aaac123a0bc578f098fda13d86c1f95c3aa2e21
parentee687c06ae2cca8a21a3f275b411b3a893c50b18 (diff)
downloadidea-a7fd14e3beccf613519809993993f439245a5fe2.tar.gz
Update running emulator catalog before querying it
Test: existing Bug: N/A Change-Id: Ie2cfd579f5d70aeccb2a4fd99fc9ec9daf4861a1
-rw-r--r--emulator/src/com/android/tools/idea/emulator/EmulatorToolWindowManager.kt2
-rw-r--r--emulator/src/com/android/tools/idea/emulator/EmulatorUtils.kt31
2 files changed, 32 insertions, 1 deletions
diff --git a/emulator/src/com/android/tools/idea/emulator/EmulatorToolWindowManager.kt b/emulator/src/com/android/tools/idea/emulator/EmulatorToolWindowManager.kt
index 703e07aa63f..f61c3918000 100644
--- a/emulator/src/com/android/tools/idea/emulator/EmulatorToolWindowManager.kt
+++ b/emulator/src/com/android/tools/idea/emulator/EmulatorToolWindowManager.kt
@@ -651,7 +651,7 @@ internal class EmulatorToolWindowManager private constructor(
if (!StudioFlags.DEVICE_MIRRORING_STANDALONE_EMULATORS.get()) {
return null
}
- val emulators = RunningEmulatorCatalog.getInstance().emulators
+ val emulators = RunningEmulatorCatalog.getInstance().updateNow().suspendingGet()
val emulator = emulators.find { "emulator-${it.emulatorId.serialPort}" == deviceSerialNumber }
if (emulator == null || emulator.emulatorId.isEmbedded) {
return null
diff --git a/emulator/src/com/android/tools/idea/emulator/EmulatorUtils.kt b/emulator/src/com/android/tools/idea/emulator/EmulatorUtils.kt
index 05baff8c3c2..178cc075d73 100644
--- a/emulator/src/com/android/tools/idea/emulator/EmulatorUtils.kt
+++ b/emulator/src/com/android/tools/idea/emulator/EmulatorUtils.kt
@@ -19,15 +19,21 @@ import com.android.annotations.concurrency.UiThread
import com.android.emulator.control.KeyboardEvent
import com.android.emulator.control.KeyboardEvent.KeyEventType
import com.android.emulator.control.ThemingStyle
+import com.google.common.util.concurrent.ListenableFuture
import com.intellij.ide.ui.LafManager
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ex.ProjectEx
+import com.intellij.util.concurrency.SameThreadExecutor
+import kotlinx.coroutines.cancelFutureOnCancellation
+import kotlinx.coroutines.suspendCancellableCoroutine
import java.awt.Container
import java.awt.Dimension
import java.awt.Point
+import kotlin.coroutines.resume
+import kotlin.coroutines.resumeWithException
import kotlin.math.abs
import kotlin.math.ceil
import kotlin.math.min
@@ -53,6 +59,31 @@ internal fun invokeLaterInAnyModalityState(@UiThread action: () -> Unit) {
}
/**
+ * Coroutine-friendly version of [ListenableFuture.get].
+ */
+suspend fun <T> ListenableFuture<T>.suspendingGet(): T {
+ if (isDone) {
+ @Suppress("BlockingMethodInNonBlockingContext")
+ return get()
+ }
+
+ return suspendCancellableCoroutine { continuation ->
+ continuation.cancelFutureOnCancellation(this)
+ val listener = Runnable {
+ val value = try {
+ get()
+ }
+ catch (e: Throwable) {
+ continuation.resumeWithException(e)
+ return@Runnable
+ }
+ continuation.resume(value)
+ }
+ addListener(listener, SameThreadExecutor.INSTANCE)
+ }
+}
+
+/**
* Creates a [KeyboardEvent] for the given hardware key.
* Key names are defined in https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values.
*/