void (Project project, BuildNumber current) { if (ExternalUpdateManager.ACTUAL != ExternalUpdateManager.SNAP) return; PropertiesComponent properties = PropertiesComponent.getInstance(); BuildNumber previous = BuildNumber.fromString(properties.getValue(PREVIOUS_BUILD_NUMBER_PROPERTY)); properties.setValue(PREVIOUS_BUILD_NUMBER_PROPERTY, current.asString()); if (previous == null || current.equals(previous)) return; String blogPost = null; Product product = loadProductData(); if (product != null) { blogPost = product.getChannels().stream() .flatMap(channel -> channel.getBuilds().stream()) .filter(build -> current.equals(build.getNumber())) .findFirst().map(BuildInfo::getBlogPost).orElse(null); } String title = IdeBundle.message("updates.notification.title", ApplicationNamesInfo.getInstance().getFullProductName()); String message = IdeBundle.message("update.snap.message"); var notification = UpdateChecker.getNotificationGroupForIdeUpdateResults() .createNotification(title, message, NotificationType.INFORMATION) .setDisplayId("ide.updated.by.snap"); if (blogPost != null) { var url = StringUtil.escapeXmlEntities(blogPost); notification.addAction(NotificationAction.createSimpleExpiring(IdeBundle.message("update.snap.blog.post.action"), () -> BrowserUtil.browse(url))); } notification.notify(project); }