Skip to content

Commit a7c821a

Browse files
authored
Merge pull request #2720 from digma-ai/recent-activity-indicator
recent activity indicator Closes #2716
2 parents 1cd634d + 2f8e90a commit a7c821a

File tree

10 files changed

+88
-10
lines changed

10 files changed

+88
-10
lines changed

analytics-provider/src/test/java/org/digma/intellij/plugin/analytics/EnvironmentTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ class EnvironmentTests extends AbstractAnalyticsProviderTest {
1717
void getEnvironmentsTest() throws JsonProcessingException {
1818

1919
List<Env> expectedEnvs = new ArrayList<>();
20-
expectedEnvs.add(new Env("myid1", "myname1", EnvType.Public));
21-
expectedEnvs.add(new Env("myid2", "myname2", EnvType.Private));
20+
expectedEnvs.add(new Env("myid1", "myname1", EnvType.Public,new Date()));
21+
expectedEnvs.add(new Env("myid2", "myname2", EnvType.Private,new Date()));
2222
mockBackEnd.enqueue(new MockResponse()
2323
.setBody(objectMapper.writeValueAsString(expectedEnvs))
2424
.addHeader("Content-Type", "application/json"));
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package org.digma.intellij.plugin.model.rest.environment
22

33
import com.fasterxml.jackson.annotation.JsonCreator
4+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
45
import java.beans.ConstructorProperties
6+
import java.util.Date
57

68
enum class EnvType { Private, Public }
79

10+
@JsonIgnoreProperties(ignoreUnknown = true)
811
data class Env
912
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
10-
@ConstructorProperties("id", "name", "type")
13+
@ConstructorProperties("id", "name", "type", "lastActive")
1114
constructor(
1215
val id: String,
1316
val name: String,
1417
val type: EnvType,
18+
val lastActive: Date?
1519
)

src/main/kotlin/org/digma/intellij/plugin/ui/jcef/pluginapi/Command.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ const val CommandQueryName = "pluginCommand"
1010
abstract class Command {
1111

1212
enum class Commands(val commandName: String) {
13-
RECENT_ACTIVITY_BADGE("RecentActivityBadge");
13+
DUMMY_COMMAND("DummyCommand"); //just a dummy enum to satisfy the compiler
14+
//RecentActivityBadge is not in use; we do it from the plugin code, here just as an example
15+
//RECENT_ACTIVITY_BADGE("RecentActivityBadge");
1416

1517

1618
fun createInstance():Command{

src/main/kotlin/org/digma/intellij/plugin/ui/jcef/pluginapi/RecentActivityBadgeCommand.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.digma.intellij.plugin.ui.jcef.jsonToObject
99
import org.digma.intellij.plugin.ui.recentactivity.RecentActivityToolWindowIconChanger
1010
import java.beans.ConstructorProperties
1111

12+
//Not in use, we do it in the plugin, keep as an example
1213
class RecentActivityBadgeCommand : Command() {
1314

1415
private val logger = Logger.getInstance(this::class.java)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package org.digma.intellij.plugin.ui.recentactivity
22

3+
import com.intellij.openapi.project.Project
34
import org.digma.intellij.plugin.ui.jcef.BaseEnvJsTemplateBuilder
45

56

7+
private const val RECENT_EXPIRATION_LIMIT_MILLIS_PARAM_NAME = "RecentActivityExpirationLimit";
8+
69
class RecentActivityEnvJsTemplateBuilder(templatePath: String) : BaseEnvJsTemplateBuilder(templatePath) {
710

11+
override fun addAppSpecificEnvVariable(
12+
project: Project,
13+
data: MutableMap<String, Any>
14+
) {
15+
data[RECENT_EXPIRATION_LIMIT_MILLIS_PARAM_NAME] = RECENT_EXPIRATION_LIMIT_MILLIS
16+
}
817
}

src/main/kotlin/org/digma/intellij/plugin/ui/recentactivity/RecentActivityToolWindowIconChanger.kt

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,28 @@ package org.digma.intellij.plugin.ui.recentactivity
33
import com.intellij.execution.runners.ExecutionUtil
44
import com.intellij.openapi.components.Service
55
import com.intellij.openapi.components.service
6+
import com.intellij.openapi.diagnostic.Logger
67
import com.intellij.openapi.project.Project
78
import com.intellij.openapi.wm.ToolWindow
89
import com.intellij.openapi.wm.ToolWindowManager
910
import org.digma.intellij.plugin.PluginId
11+
import org.digma.intellij.plugin.analytics.ApiClientChangedEvent
12+
import org.digma.intellij.plugin.analytics.getAllEnvironments
13+
import org.digma.intellij.plugin.common.DisposableAdaptor
1014
import org.digma.intellij.plugin.common.EDT
15+
import org.digma.intellij.plugin.errorreporting.ErrorReporter
1116
import org.digma.intellij.plugin.icons.AppIcons
17+
import org.digma.intellij.plugin.log.Log
18+
import org.digma.intellij.plugin.scheduling.disposingPeriodicTask
19+
import java.util.Date
1220
import javax.swing.Icon
21+
import kotlin.time.Duration.Companion.seconds
1322

1423
//must be a singleton because it relies on null and non-null properties
1524
@Service(Service.Level.PROJECT)
16-
class RecentActivityToolWindowIconChanger(val project: Project) {
25+
class RecentActivityToolWindowIconChanger(val project: Project): DisposableAdaptor {
26+
27+
private val logger = Logger.getInstance(this::class.java)
1728

1829
private val defaultIcon = AppIcons.TOOL_WINDOW_OBSERVABILITY
1930
private var actualIcon: Icon? = null
@@ -26,15 +37,49 @@ class RecentActivityToolWindowIconChanger(val project: Project) {
2637
}
2738
}
2839

40+
init {
41+
val registered = disposingPeriodicTask("RecentActivityIconChanger",10.seconds.inWholeMilliseconds,10.seconds.inWholeMilliseconds,true){
42+
val environments = getAllEnvironments(project)
43+
val lastActiveTime: Date? = environments
44+
.filter { it.lastActive != null }
45+
.maxByOrNull { it.lastActive!! }
46+
?.lastActive
47+
48+
val isRecent = lastActiveTime?.let {
49+
val now = System.currentTimeMillis()
50+
now - it.time < RECENT_EXPIRATION_LIMIT_MILLIS
51+
} ?: false
52+
53+
if (isRecent){
54+
showBadge()
55+
}else{
56+
hideBadge()
57+
}
58+
}
59+
if (!registered){
60+
Log.log(logger::warn,"could not register recent activity icon changer scheduler")
61+
ErrorReporter.getInstance().reportError(project,"RecentActivityToolWindowIconChanger.scheduler","could not register recent activity icon changer scheduler",mapOf())
62+
}
63+
64+
65+
project.messageBus.connect(this)
66+
.subscribe(ApiClientChangedEvent.API_CLIENT_CHANGED_TOPIC, ApiClientChangedEvent {
67+
hideBadge()
68+
})
69+
}
70+
71+
2972
fun showBadge() {
3073

3174
val toolWindow = getToolWindow() ?: return
3275

3376
createBadgeIcon()
3477

3578
EDT.ensureEDT {
36-
badgeIcon?.let {
37-
toolWindow.setIcon(it)
79+
if (toolWindow.icon != badgeIcon) {
80+
badgeIcon?.let {
81+
toolWindow.setIcon(it)
82+
}
3883
}
3984
}
4085
}
@@ -58,7 +103,10 @@ class RecentActivityToolWindowIconChanger(val project: Project) {
58103
val toolWindow = getToolWindow() ?: return
59104

60105
EDT.ensureEDT {
61-
toolWindow.setIcon(actualIcon ?: defaultIcon)
106+
val icon = actualIcon ?: defaultIcon
107+
if (toolWindow.icon != icon) {
108+
toolWindow.setIcon(icon)
109+
}
62110
}
63111
}
64112

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.digma.intellij.plugin.ui.recentactivity
2+
3+
import com.intellij.openapi.project.Project
4+
import org.digma.intellij.plugin.startup.DigmaProjectActivity
5+
6+
class RecentActivityToolWindowIconChangerStarter: DigmaProjectActivity() {
7+
8+
override fun executeProjectStartup(project: Project) {
9+
RecentActivityToolWindowIconChanger.getInstance(project)
10+
}
11+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@
134134
implementation="org.digma.intellij.plugin.updates.ui.UIUpdateStarter"/>
135135
<postStartupActivity
136136
implementation="org.digma.intellij.plugin.analytics.BackendInfoHolderStarter"/>
137+
<postStartupActivity
138+
implementation="org.digma.intellij.plugin.ui.recentactivity.RecentActivityToolWindowIconChangerStarter"/>
137139

138140

139141
<errorHandler implementation="org.digma.intellij.plugin.ui.reports.DigmaErrorReportSubmitter"/>
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
@GLOBAL_ENV_VARS@
1+
@GLOBAL_ENV_VARS@
2+
window.recentActivityExpirationLimit = ${RecentActivityExpirationLimit};

ui-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12.0.0
1+
13.0.0

0 commit comments

Comments
 (0)