diff options
author | Sergey Prigogin <sprigogin@google.com> | 2022-08-16 12:28:58 -0700 |
---|---|---|
committer | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-08-17 18:22:47 +0000 |
commit | a7fd14e3beccf613519809993993f439245a5fe2 (patch) | |
tree | 3aaac123a0bc578f098fda13d86c1f95c3aa2e21 | |
parent | ee687c06ae2cca8a21a3f275b411b3a893c50b18 (diff) | |
download | idea-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.kt | 2 | ||||
-rw-r--r-- | emulator/src/com/android/tools/idea/emulator/EmulatorUtils.kt | 31 |
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. */ |