summaryrefslogtreecommitdiff
path: root/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java')
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java113
1 files changed, 76 insertions, 37 deletions
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java
index d6e650ba..92104176 100644
--- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java
+++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java
@@ -2,6 +2,8 @@ package at.asit.pdfover.gui.utils;
import java.awt.Desktop;
import java.net.URI;
+import java.util.ArrayList;
+import java.util.function.Consumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -24,6 +26,72 @@ public final class UpdateCheckManager {
private static Thread updateCheckThread = null;
private static boolean needsCheck = false;
+ public enum Status { NOT_CHECKED, CHECKING, OUTDATED, UP_TO_DATE, FAILED };
+ private static Status currentStatus = Status.NOT_CHECKED;
+ public static Status getCurrentStatus() {
+ synchronized (UpdateCheckManager.class) {
+ return currentStatus;
+ }
+ }
+
+ private static ArrayList<Consumer<Status>> statusCallbacks = new ArrayList<>();
+ public static void registerStatusCallback(Consumer<Status> f) {
+ synchronized (UpdateCheckManager.class) {
+ statusCallbacks.add(f);
+ f.accept(currentStatus);
+ }
+ }
+
+ private static void setStatus(Status status) {
+ synchronized(UpdateCheckManager.class) {
+ currentStatus = status;
+ for (Consumer<Status> f : statusCallbacks)
+ f.accept(status);
+ }
+ }
+
+ private static String latestVersionNotified = null;
+ private static Status runCheck(Shell shell) {
+ HttpClient client = (HttpClient) BKUHelper.getHttpClient();
+ GetMethod method = new GetMethod(Constants.CURRENT_RELEASE_URL);
+ try {
+ client.executeMethod(method);
+ final String version = method.getResponseBodyAsString().trim();
+ if (!VersionComparator.before(Constants.APP_VERSION, version))
+ return Status.UP_TO_DATE;
+
+ if ((latestVersionNotified == null) || VersionComparator.before(latestVersionNotified, version)) {
+ latestVersionNotified = version;
+ // invoke GUI message in main thread
+ shell.getDisplay().asyncExec(() -> {
+ Dialog info = new Dialog(shell,
+ Messages.getString("version_check.UpdateTitle"),
+ String.format(Messages.getString("version_check.UpdateText"), version),
+ BUTTONS.OK_CANCEL, ICON.INFORMATION);
+
+ if (info.open() == SWT.OK)
+ {
+ if (Desktop.isDesktopSupported()) {
+ try {
+ Desktop.getDesktop().browse(new URI(Constants.UPDATE_URL));
+ } catch (Exception e) {
+ log.error("Error opening update location ", e);
+ }
+ } else {
+ log.info("SWT Desktop is not supported on this platform");
+ Program.launch(Constants.UPDATE_URL);
+ }
+ }
+ });
+ }
+
+ return Status.OUTDATED;
+ } catch (Exception e) {
+ log.error("Error downloading update information: ", e);
+ return Status.FAILED;
+ }
+ }
+
public static void checkNow(Shell shell) {
if (Constants.APP_VERSION == null)
return;
@@ -34,48 +102,19 @@ public final class UpdateCheckManager {
needsCheck = true;
updateCheckThread = new Thread(() -> {
+ synchronized(UpdateCheckManager.class) {
+ setStatus(Status.CHECKING);
+ }
while (true) {
+ Status status = runCheck(shell);
synchronized (UpdateCheckManager.class) {
- if (!needsCheck) {
+ if (!UpdateCheckManager.needsCheck) {
+ setStatus(status);
UpdateCheckManager.updateCheckThread = null;
return;
}
- needsCheck = false;
- }
- HttpClient client = (HttpClient) BKUHelper.getHttpClient();
- GetMethod method = new GetMethod(Constants.CURRENT_RELEASE_URL);
- try {
- client.executeMethod(method);
- final String version = method.getResponseBodyAsString().trim();
- if (!VersionComparator.before(Constants.APP_VERSION, version))
- return;
-
- // wait 500ms before invoke the GUI message, because GUI had to be started from
- // main thread
- try { Thread.sleep(500); } catch (InterruptedException e1) { }
- // invoke GUI message in main thread
- shell.getDisplay().asyncExec(() -> {
- Dialog info = new Dialog(shell,
- Messages.getString("version_check.UpdateTitle"),
- String.format(Messages.getString("version_check.UpdateText"), version),
- BUTTONS.OK_CANCEL, ICON.INFORMATION);
-
- if (info.open() == SWT.OK)
- {
- if (Desktop.isDesktopSupported()) {
- try {
- Desktop.getDesktop().browse(new URI(Constants.UPDATE_URL));
- } catch (Exception e) {
- log.error("Error opening update location ", e);
- }
- } else {
- log.info("SWT Desktop is not supported on this platform");
- Program.launch(Constants.UPDATE_URL);
- }
- }
- });
- } catch (Exception e) {
- log.error("Error downloading update information: ", e);
+ UpdateCheckManager.needsCheck = false;
+ setStatus(Status.CHECKING);
}
}
});