Skip to content

Commit e04a605

Browse files
authored
Avoid duplicate expired credential notifications for Q (#4450)
1 parent 7cdfb6c commit e04a605

File tree

7 files changed

+37
-24
lines changed

7 files changed

+37
-24
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Amazon Q: Avoid duplicate credential expired notifications during startup"
4+
}

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanManager.kt

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
7474
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.promptReAuth
7575
import software.aws.toolkits.jetbrains.services.codewhisperer.util.runIfIdcConnectionOrTelemetryEnabled
7676
import software.aws.toolkits.jetbrains.utils.isQConnected
77+
import software.aws.toolkits.jetbrains.utils.isQExpired
7778
import software.aws.toolkits.jetbrains.utils.isRunningOnRemoteBackend
7879
import software.aws.toolkits.resources.message
7980
import software.aws.toolkits.telemetry.Result
@@ -114,7 +115,10 @@ class CodeWhispererCodeScanManager(val project: Project) {
114115

115116
private val isProjectScanInProgress = AtomicBoolean(false)
116117

118+
private val defaultScope = projectCoroutineScope(project)
119+
117120
private lateinit var codeScanJob: Job
121+
private lateinit var debouncedCodeScanJob: Job
118122

119123
/**
120124
* Returns true if the code scan is in progress.
@@ -142,15 +146,22 @@ class CodeWhispererCodeScanManager(val project: Project) {
142146
/**
143147
* Triggers a code scan and displays results in the new tab in problems view panel.
144148
*/
145-
fun runCodeScan(scope: CodeWhispererConstants.CodeAnalysisScope) {
149+
fun runCodeScan(scope: CodeWhispererConstants.CodeAnalysisScope, isPluginStarting: Boolean = false) {
146150
if (!isQConnected(project)) return
147151

148152
// Return if a scan is already in progress.
149153
if (isProjectScanInProgress() && scope == CodeWhispererConstants.CodeAnalysisScope.PROJECT) return
150-
if (promptReAuth(project)) {
154+
155+
val connectionExpired = if (isPluginStarting) {
156+
isQExpired(project)
157+
} else {
158+
promptReAuth(project)
159+
}
160+
if (connectionExpired) {
151161
isProjectScanInProgress.set(false)
152162
return
153163
}
164+
154165
// If scope is project
155166
if (scope == CodeWhispererConstants.CodeAnalysisScope.PROJECT) {
156167
// Prepare for a project code scan
@@ -169,26 +180,24 @@ class CodeWhispererCodeScanManager(val project: Project) {
169180
}
170181
}
171182

172-
private fun createDebouncedRunCodeScan(
173-
waitMs: Long = 300L,
174-
coroutineScope: CoroutineScope
175-
): (CodeWhispererConstants.CodeAnalysisScope) -> Unit {
176-
var debounceJob: Job? = null
177-
return { param: CodeWhispererConstants.CodeAnalysisScope ->
178-
debounceJob?.cancel()
179-
debounceJob = coroutineScope.launch {
180-
delay(waitMs)
181-
runCodeScan(param)
182-
}
183+
/**
184+
* Creates a debounced code scan job with a delay.
185+
*/
186+
fun createDebouncedRunCodeScan(
187+
scope: CodeWhispererConstants.CodeAnalysisScope,
188+
isPluginStarting: Boolean = false,
189+
waitMs: Long = CodeWhispererConstants.AUTO_SCAN_DEBOUNCE_DELAY_IN_SECONDS * 1000,
190+
coroutineScope: CoroutineScope = defaultScope
191+
) {
192+
if (this::debouncedCodeScanJob.isInitialized && debouncedCodeScanJob.isActive) {
193+
debouncedCodeScanJob.cancel()
194+
}
195+
debouncedCodeScanJob = coroutineScope.launch {
196+
delay(waitMs)
197+
runCodeScan(scope, isPluginStarting)
183198
}
184199
}
185200

186-
val defaultScope = projectCoroutineScope(project)
187-
val debouncedRunCodeScan = createDebouncedRunCodeScan(
188-
waitMs = CodeWhispererConstants.AUTO_SCAN_DEBOUNCE_DELAY_IN_SECONDS * 1000,
189-
coroutineScope = defaultScope
190-
)
191-
192201
fun stopCodeScan() {
193202
// Return if code scan job is not active.
194203
if (!codeScanJob.isActive) return

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/listeners/CodeWhispererCodeScanDocumentListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ internal class CodeWhispererCodeScanDocumentListener(val project: Project) : Doc
4040
scanManager.updateScanNodes(file)
4141

4242
if (editedTextRange.length > 0 && !CodeWhispererExplorerActionManager.getInstance().isMonthlyQuotaForCodeScansExceeded() && !isUserBuilderId(project)) {
43-
scanManager.debouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
43+
scanManager.createDebouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
4444
}
4545
}
4646

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/listeners/CodeWhispererCodeScanFileListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
1414
internal class CodeWhispererCodeScanFileListener(val project: Project) : EditorFactoryListener {
1515
override fun editorCreated(event: EditorFactoryEvent) {
1616
if (!CodeWhispererExplorerActionManager.getInstance().isMonthlyQuotaForCodeScansExceeded() && !isUserBuilderId(project)) {
17-
CodeWhispererCodeScanManager.getInstance(project).debouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
17+
CodeWhispererCodeScanManager.getInstance(project).createDebouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
1818
}
1919
}
2020
}

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/actions/ResumeCodeScans.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class ResumeCodeScans : DumbAwareAction(
2323
actionManager.setAutoCodeScan(project, true)
2424
// Run Proactive Code File Scan once toggle is enabled
2525
if (!actionManager.isMonthlyQuotaForCodeScansExceeded() && !isUserBuilderId(project)) {
26-
CodeWhispererCodeScanManager.getInstance(project).debouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
26+
CodeWhispererCodeScanManager.getInstance(project).createDebouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
2727
}
2828
}
2929
}

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/nodes/ResumeCodeScanNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class ResumeCodeScanNode(nodeProject: Project) : CodeWhispererActionNode(
2525

2626
// Run Proactive Code File Scan once toggle is enabled
2727
if (!actionManager.isMonthlyQuotaForCodeScansExceeded() && !isUserBuilderId(project)) {
28-
CodeWhispererCodeScanManager.getInstance(project).debouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
28+
CodeWhispererCodeScanManager.getInstance(project).createDebouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
2929
}
3030
}
3131
}

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/startup/CodeWhispererProjectStartupActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class CodeWhispererProjectStartupActivity : StartupActivity.DumbAware {
4949
scanManager.setEditorListeners()
5050
// Run Proactive Code File Scan and disabling Auto File Scan for Builder ID Users.
5151
if (!isUserBuilderId(project)) {
52-
scanManager.debouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
52+
scanManager.createDebouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE, isPluginStarting = true)
5353
}
5454

5555
// ---- Everything below will be triggered once after startup ----

0 commit comments

Comments
 (0)