diff options
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.java | 113 |
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); } } }); |