/* * SKCraft Launcher * Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors * Please see LICENSE.txt for license information. */ package com.skcraft.launcher.update; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.skcraft.concurrency.ObservableFuture; import com.skcraft.launcher.Launcher; import com.skcraft.launcher.dialog.ProgressDialog; import com.skcraft.launcher.selfupdate.SelfUpdater; import com.skcraft.launcher.selfupdate.UpdateChecker; import com.skcraft.launcher.swing.SwingHelper; import com.skcraft.launcher.util.SharedLocale; import com.skcraft.launcher.util.SwingExecutor; import lombok.Getter; import javax.swing.*; import javax.swing.event.SwingPropertyChangeSupport; import java.awt.*; import java.beans.PropertyChangeListener; import java.io.File; import java.net.URL; public class UpdateManager { @Getter private final SwingPropertyChangeSupport propertySupport = new SwingPropertyChangeSupport(this); private final Launcher launcher; private URL pendingUpdateUrl; public UpdateManager(Launcher launcher) { this.launcher = launcher; } public void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } public boolean getPendingUpdate() { return pendingUpdateUrl != null; } public void checkForUpdate() { ListenableFuture<URL> future = launcher.getExecutor().submit(new UpdateChecker(launcher)); Futures.addCallback(future, new FutureCallback<URL>() { @Override public void onSuccess(URL result) { if (result != null) { requestUpdate(result); } } @Override public void onFailure(Throwable t) { } }, SwingExecutor.INSTANCE); } public void performUpdate(final Window window) { final URL url = pendingUpdateUrl; if (url != null) { SelfUpdater downloader = new SelfUpdater(launcher, url); ObservableFuture<File> future = new ObservableFuture<File>( launcher.getExecutor().submit(downloader), downloader); Futures.addCallback(future, new FutureCallback<File>() { @Override public void onSuccess(File result) { propertySupport.firePropertyChange("pendingUpdate", true, false); UpdateManager.this.pendingUpdateUrl = null; SwingHelper.showMessageDialog( window, SharedLocale.tr("launcher.selfUpdateComplete"), SharedLocale.tr("launcher.selfUpdateCompleteTitle"), null, JOptionPane.INFORMATION_MESSAGE); } @Override public void onFailure(Throwable t) { } }, SwingExecutor.INSTANCE); ProgressDialog.showProgress(window, future, SharedLocale.tr("launcher.selfUpdatingTitle"), SharedLocale.tr("launcher.selfUpdatingStatus")); SwingHelper.addErrorDialogCallback(window, future); } else { propertySupport.firePropertyChange("pendingUpdate", false, false); } } private void requestUpdate(URL url) { propertySupport.firePropertyChange("pendingUpdate", getPendingUpdate(), url != null); this.pendingUpdateUrl = url; } }