diff --git a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java
index a29a06e59..e2e423f84 100644
--- a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java
+++ b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java
@@ -68,9 +68,9 @@ public class UpdateChecker {
private void checkSucceeded(WorkerStateEvent event) {
String latestVersion = updateCheckerService.getValue();
LOG.info("Current version: {}, latest version: {}", getCurrentVersion(), latestVersion);
- state.set(UpdateCheckState.CHECK_SUCCESSFUL);
updateCheckTimeProperty.set(LocalDateTime.now());
latestVersionProperty.set(latestVersion);
+ state.set(UpdateCheckState.CHECK_SUCCESSFUL);
}
private void checkFailed(WorkerStateEvent event) {
diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java
index 479a2d860..2dcbd6095 100644
--- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java
+++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java
@@ -46,7 +46,7 @@ public class MainWindowTitleController implements FxController {
this.appWindows = appWindows;
this.trayMenuInitialized = trayMenu.isInitialized();
this.updateChecker = updateChecker;
- this.updateAvailable = updateChecker.latestVersionProperty().isNotNull();
+ this.updateAvailable = updateChecker.updateCheckStateProperty().isEqualTo(UpdateChecker.UpdateCheckState.CHECK_SUCCESSFUL).and(updateChecker.latestVersionProperty().isNotEqualTo(updateChecker.getCurrentVersion()));
this.licenseHolder = licenseHolder;
this.settings = settings;
this.showMinimizeButton = Bindings.createBooleanBinding(this::isShowMinimizeButton, settings.showMinimizeButton, settings.showTrayIcon);
diff --git a/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java b/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java
index fb5fd964c..57ebc9706 100644
--- a/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java
+++ b/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java
@@ -8,6 +8,7 @@ import org.cryptomator.ui.controls.FormattedLabel;
import org.cryptomator.ui.fxapp.UpdateChecker;
import javax.inject.Inject;
+import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
@@ -17,13 +18,17 @@ import javafx.beans.property.ReadOnlyStringProperty;
import javafx.fxml.FXML;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ContentDisplay;
+import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
+import javafx.util.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Comparator;
import java.util.Locale;
+
+
@PreferencesScoped
public class UpdatesPreferencesController implements FxController {
@@ -46,6 +51,7 @@ public class UpdatesPreferencesController implements FxController {
public FormattedLabel updateCheckDateFormattedLabel;
public HBox checkFailedHBox;
public FormattedLabel latestVersionFormattedLabel;
+ public Label upToDateLabel;
@Inject
UpdatesPreferencesController(Application application, Environment environment, Settings settings, UpdateChecker updateChecker) {
@@ -73,11 +79,28 @@ public class UpdatesPreferencesController implements FxController {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.getDefault());
updateCheckDateFormattedLabel.arg1Property().bind(Bindings.createStringBinding(() -> (updateCheckDateProperty.get() != null) ? updateCheckDateProperty.get().format(formatter) : "-", updateCheckDateProperty));
- checkFailedHBox.managedProperty().bind(updateCheckStateProperty.isEqualTo(UpdateChecker.UpdateCheckState.CHECK_FAILED));
- checkFailedHBox.visibleProperty().bind(updateCheckStateProperty.isEqualTo(UpdateChecker.UpdateCheckState.CHECK_FAILED));
+ BooleanBinding isUpdateCheckFailed = updateCheckStateProperty.isEqualTo(UpdateChecker.UpdateCheckState.CHECK_FAILED);
+ checkFailedHBox.managedProperty().bind(isUpdateCheckFailed);
+ checkFailedHBox.visibleProperty().bind(isUpdateCheckFailed);
latestVersionFormattedLabel.arg1Property().bind(Bindings.createStringBinding(() -> (latestVersion.get() != null) ? latestVersion.get() : "-", latestVersion));
+ BooleanBinding isUpdateSuccessfulAndCurrent = updateCheckStateProperty.isEqualTo(UpdateChecker.UpdateCheckState.CHECK_SUCCESSFUL)
+ .and(latestVersion.isEqualTo(currentVersion));
+
+ updateCheckStateProperty.addListener((_, _, _) -> {
+ if (isUpdateSuccessfulAndCurrent.get()) {
+ upToDateLabel.setVisible(true);
+ upToDateLabel.setManaged(true);
+
+ PauseTransition delay = new PauseTransition(Duration.seconds(5));
+ delay.setOnFinished(_ -> {
+ upToDateLabel.setVisible(false);
+ upToDateLabel.setManaged(false);
+ });
+ delay.play();
+ }
+ });
}
@FXML
diff --git a/src/main/resources/fxml/preferences_updates.fxml b/src/main/resources/fxml/preferences_updates.fxml
index ef037580f..3db4824f5 100644
--- a/src/main/resources/fxml/preferences_updates.fxml
+++ b/src/main/resources/fxml/preferences_updates.fxml
@@ -42,6 +42,11 @@
+
diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties
index 0a4c795a0..96b49d119 100644
--- a/src/main/resources/i18n/strings.properties
+++ b/src/main/resources/i18n/strings.properties
@@ -324,6 +324,7 @@ preferences.updates.checkNowBtn=Check Now
preferences.updates.updateAvailable=Update to version %s available.
preferences.updates.lastUpdateCheck=The last update check was performed on: %s
preferences.updates.checkFailed=Check failed
+preferences.updates.upToDate=Cryptomator is up-to-date.
## Contribution
preferences.contribute=Support Us