Platform/plugins updates available notification: don't show same notification several...
authorIvan Chirkov <Ivan.Chirkov@jetbrains.com>
Thu, 3 Sep 2015 13:01:36 +0000 (15:01 +0200)
committerIvan Chirkov <Ivan.Chirkov@jetbrains.com>
Thu, 3 Sep 2015 13:05:06 +0000 (15:05 +0200)
platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.java

index 046225f408c6f14b59457a7f7f867cb12a80e6f1..6c037b1bc1dfc39d9a5d1c2fdd766afd5f0caff8 100644 (file)
@@ -74,6 +74,7 @@ public final class UpdateChecker {
   private static Set<String> ourDisabledToUpdatePlugins;
   private static final Map<String, String> ourAdditionalRequestOptions = ContainerUtil.newHashMap();
   private static final Map<String, PluginDownloader> ourUpdatedPlugins = ContainerUtil.newHashMap();
+  private static final Set<NotificationUniqueType> SHOWN_NOTIFICATION_TYPES = Collections.synchronizedSet(EnumSet.noneOf(NotificationUniqueType.class));
 
   private static class Holder {
     private static final String UPDATE_URL = ApplicationInfoEx.getInstanceEx().getUpdateUrls().getCheckingUrl();
@@ -404,7 +405,7 @@ public final class UpdateChecker {
       }
       else {
         String message = IdeBundle.message("updates.new.version.available", ApplicationNamesInfo.getInstance().getFullProductName());
-        showNotification(project, message, false, runnable);
+        showNotification(project, message, false, runnable, NotificationUniqueType.NEW_CHANNEL);
       }
     }
     else if (updatedChannel != null) {
@@ -420,7 +421,7 @@ public final class UpdateChecker {
       }
       else {
         String message = IdeBundle.message("updates.ready.message", ApplicationNamesInfo.getInstance().getFullProductName());
-        showNotification(project, message, false, runnable);
+        showNotification(project, message, false, runnable, NotificationUniqueType.UPDATE_IN_CHANNEL);
       }
     }
     else if (updatedPlugins != null && !updatedPlugins.isEmpty()) {
@@ -442,7 +443,7 @@ public final class UpdateChecker {
           }
         }, ", ");
         String message = IdeBundle.message("updates.plugins.ready.message", updatedPlugins.size(), plugins);
-        showNotification(project, message, false, runnable);
+        showNotification(project, message, false, runnable, NotificationUniqueType.PLUGINS_UPDATE);
       }
     }
     else if (alwaysShowResults) {
@@ -451,6 +452,20 @@ public final class UpdateChecker {
   }
 
   private static void showNotification(@Nullable Project project, String message, boolean error, @Nullable final Runnable runnable) {
+    showNotification(project, message, error, runnable, null);
+  }
+
+  private static void showNotification(@Nullable Project project,
+                                       String message,
+                                       boolean error,
+                                       @Nullable final Runnable runnable,
+                                       @Nullable final NotificationUniqueType notificationType) {
+    if (notificationType != null) {
+      if (!SHOWN_NOTIFICATION_TYPES.add(notificationType)) {
+        return;
+      }
+    }
+
     NotificationListener listener = null;
     if (runnable != null) {
       listener = new NotificationListener() {
@@ -464,7 +479,12 @@ public final class UpdateChecker {
 
     String title = IdeBundle.message("update.notifications.title");
     NotificationType type = error ? NotificationType.ERROR : NotificationType.INFORMATION;
-    NOTIFICATIONS.createNotification(title, XmlStringUtil.wrapInHtml(message), type, listener).notify(project);
+    NOTIFICATIONS.createNotification(title, XmlStringUtil.wrapInHtml(message), type, listener).whenExpired(new Runnable() {
+      @Override
+      public void run() {
+        SHOWN_NOTIFICATION_TYPES.remove(notificationType);
+      }
+    }).notify(project);
   }
 
   public static void addUpdateRequestParameter(@NotNull String name, @NotNull String value) {
@@ -646,4 +666,8 @@ public final class UpdateChecker {
       }
     }
   }
+
+  private enum NotificationUniqueType {
+    NEW_CHANNEL, UPDATE_IN_CHANNEL, PLUGINS_UPDATE
+  }
 }