package de.dal33t.powerfolder.ui.util.update;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import de.dal33t.powerfolder.ConfigurationEntry;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.ui.PFUIComponent;
import de.dal33t.powerfolder.PreferencesEntry;
import de.dal33t.powerfolder.ui.dialog.DownloadUpdateDialog;
import de.dal33t.powerfolder.ui.util.UIUtil;
import de.dal33t.powerfolder.util.BrowserLauncher;
import de.dal33t.powerfolder.util.Translation;
import de.dal33t.powerfolder.util.os.OSUtil;
import de.dal33t.powerfolder.ui.dialog.DialogFactory;
import de.dal33t.powerfolder.ui.dialog.GenericDialogType;
import de.dal33t.powerfolder.util.update.UpdaterEvent;
import de.dal33t.powerfolder.util.update.UpdaterHandler;
public class UIUpdateHandler extends PFUIComponent implements UpdaterHandler {
private static volatile boolean updateDialogOpen = false;
private Object option;
public UIUpdateHandler(Controller controller) {
super(controller);
}
public void newReleaseAvailable(UpdaterEvent event) {
// Wait for ui to open
getController().waitForUIOpen();
final String text = Translation.getTranslation(
"dialog.update_check.text", Controller.PROGRAM_VERSION, event
.getNewReleaseVersion());
final List<String> options = new ArrayList<String>(4);
String downloadAndUpdateSilent = Translation
.getTranslation("dialog.update_check.downloadAndUpdateSilent");
String downloadAndUpdate = Translation
.getTranslation("dialog.update_check.downloadAndUpdate");
String gotoHomepage = Translation
.getTranslation("dialog.update_check.gotoHomepage");
String nothingNeverAsk = Translation
.getTranslation("dialog.update_check.nothingNeverAsk");
boolean allowSilent = ConfigurationEntry.UPDATE_SILENT_ALLOWED
.getValueBoolean(getController());
if (allowSilent
&& ConfigurationEntry.AUTO_UPDATE.getValueBoolean(getController()))
{
// Directly update
option = downloadAndUpdateSilent;
} else {
if (OSUtil.isWindowsSystem()) {
options.add(downloadAndUpdate);
if (allowSilent) {
options.add(downloadAndUpdateSilent);
}
}
options.add(gotoHomepage);
options.add(nothingNeverAsk);
updateDialogOpen = true;
try {
UIUtil.invokeAndWaitInEDT(new Runnable() {
public void run() {
option = JOptionPane.showInputDialog(getParentFrame(),
text, Translation
.getTranslation("dialog.update_check.title"),
JOptionPane.OK_CANCEL_OPTION, null, options
.toArray(), options.get(0));
}
});
} catch (InterruptedException ex) {
logFiner(ex);
return;
}
updateDialogOpen = false;
}
if (option == downloadAndUpdate || option == downloadAndUpdateSilent) {
boolean updateSilently = option == downloadAndUpdateSilent;
URL releaseURL = event.getNewWindowsExeURL();
if (releaseURL == null) {
return;
}
getController().getUIController().closePreferencesDialog();
DownloadUpdateDialog dlDiag = new DownloadUpdateDialog(
getController(), event.getNewReleaseVersion());
dlDiag.openInEDT();
boolean success = event.getUpdater().downloadAndUpdate(releaseURL,
dlDiag.getStreamCallback(), updateSilently) != null;
dlDiag.close();
if (!success) {
try {
UIUtil.invokeAndWaitInEDT(new Runnable() {
public void run() {
// Show warning.
DialogFactory
.genericDialog(
getController(),
Translation
.getTranslation("dialog.update_check.failed.title"),
Translation
.getTranslation("dialog.update_check.failed.text"),
GenericDialogType.WARN);
}
});
} catch (InterruptedException ex) {
logFiner(ex);
}
}
} else if (option == gotoHomepage) {
try {
// Open explorer
BrowserLauncher.openURL(ConfigurationEntry.PROVIDER_URL
.getValue(getController()));
} catch (IOException e) {
logFiner(e);
}
} else if (option == nothingNeverAsk) {
// Never ask again
PreferencesEntry.CHECK_UPDATE.setValue(getController(), false);
}
}
public void noNewReleaseAvailable(UpdaterEvent event) {
// Do nothing
}
public boolean shouldCheckForNewVersion() {
return !updateDialogOpen
&& PreferencesEntry.CHECK_UPDATE.getValueBoolean(getController());
}
/**
* Retrieves the Frame that is the current parent
*
* @return Parent JFrame
*/
protected JFrame getParentFrame() {
return getUIController().getMainFrame().getUIComponent();
}
}