diff --git a/.changes/next-release/bugfix-bcf4a2c9-230b-440b-93ed-8b2fb96929be.json b/.changes/next-release/bugfix-bcf4a2c9-230b-440b-93ed-8b2fb96929be.json new file mode 100644 index 00000000000..2295d0e3a04 --- /dev/null +++ b/.changes/next-release/bugfix-bcf4a2c9-230b-440b-93ed-8b2fb96929be.json @@ -0,0 +1,4 @@ +{ + "type" : "bugfix", + "description" : "Fix an IDE deadlock that may occur while attempting to initialize Amazon Q UI elements (#4966)" +} \ No newline at end of file diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/status/CodeWhispererStatusBarWidget.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/status/CodeWhispererStatusBarWidget.kt index e3c789f2ead..747dd2a9ae8 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/status/CodeWhispererStatusBarWidget.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/status/CodeWhispererStatusBarWidget.kt @@ -19,6 +19,7 @@ import com.intellij.ui.AnimatedIcon import com.intellij.util.Consumer import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener +import software.aws.toolkits.jetbrains.core.credentials.profiles.ProfileWatcher import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener import software.aws.toolkits.jetbrains.services.amazonq.gettingstarted.QActionGroups.Q_SIGNED_OUT_ACTION_GROUP import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomizationListener @@ -104,11 +105,16 @@ class CodeWhispererStatusBarWidget(project: Project) : ) } - override fun getSelectedValue(): String = CodeWhispererModelConfigurator.getInstance().activeCustomization(project).let { - if (it == null) { - message("codewhisperer.statusbar.display_name") - } else { - "${message("codewhisperer.statusbar.display_name")} | ${it.name}" + override fun getSelectedValue(): String { + // HACK: Force ProfileWatcher to load under EDT so that ToolkitConnectionManager#activeConnectionForFeature does not deadlock while ProfileWatcher# + // is waiting for VFS events to propagate on EDT + ProfileWatcher.getInstance() + return CodeWhispererModelConfigurator.getInstance().activeCustomization(project).let { + if (it == null) { + message("codewhisperer.statusbar.display_name") + } else { + "${message("codewhisperer.statusbar.display_name")} | ${it.name}" + } } }