diff --git a/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java index 2aba921..65e6090 100644 --- a/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java +++ b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java @@ -52,8 +52,8 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.ScrollPane; -import javafx.scene.effect.BoxBlur; import javafx.scene.control.ScrollPane.ScrollBarPolicy; +import javafx.scene.effect.BoxBlur; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.FlowPane; @@ -95,7 +95,6 @@ public class MainWindowController { private static MainWindowController instance = null; private DBController dbController; - private UpdateController updateController; private XMLController xmlController; private Stage primaryStage; private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName()); @@ -337,18 +336,10 @@ public class MainWindowController { // if AutoUpdate, then check for updates private void checkAutoUpdate() { + LOGGER.info("AutoUpdate: looking for updates on startup ..."); - if (XMLController.isAutoUpdate()) { - try { - LOGGER.info("AutoUpdate: looking for updates on startup ..."); - updateController = new UpdateController(settingsViewController); // TODO this is will crash - Thread updateThread = new Thread(updateController); - updateThread.setName("Updater"); - updateThread.start(); - updateThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + if (XMLController.isAutoUpdate() && UpdateController.isUpdateAvailable()) { + UpdateController.update(); } } diff --git a/src/main/java/kellerkinder/HomeFlix/application/SettingsView.java b/src/main/java/kellerkinder/HomeFlix/application/SettingsView.java index d1062a6..6a5aa61 100644 --- a/src/main/java/kellerkinder/HomeFlix/application/SettingsView.java +++ b/src/main/java/kellerkinder/HomeFlix/application/SettingsView.java @@ -47,9 +47,9 @@ import javafx.fxml.FXML; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; +import javafx.scene.control.ScrollPane.ScrollBarPolicy; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; -import javafx.scene.control.ScrollPane.ScrollBarPolicy; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.stage.DirectoryChooser; @@ -206,9 +206,16 @@ public class SettingsView { @FXML private void updateBtnAction(ActionEvent event) { - Thread updateThread = new Thread(new UpdateController(this)); - updateThread.setName("Updater"); - updateThread.start(); + + + new UpdateController(); + if (UpdateController.isUpdateAvailable()) { + updateBtn.setText(XMLController.getLocalBundle().getString("updateBtnUpdateAvailable")); + UpdateController.update(); + } else { + updateBtn.setText(XMLController.getLocalBundle().getString("updateBtnNoUpdateAvailable")); + } + } /** TODO can this be done async? diff --git a/src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java b/src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java index ace49cd..7e1cf2c 100644 --- a/src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java +++ b/src/main/java/kellerkinder/HomeFlix/controller/UpdateController.java @@ -40,58 +40,79 @@ import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; -import javafx.application.Platform; import kellerkinder.HomeFlix.application.Main; -import kellerkinder.HomeFlix.application.SettingsView; -public class UpdateController implements Runnable { +public class UpdateController { - private SettingsView settingsViewController; - private int updateBuildNumber; // tag_name from gitea - private String apiOutput; + private static int updateBuildNumber; // tag_name from gitea @SuppressWarnings("unused") - private String updateName; + private static String updateName; @SuppressWarnings("unused") - private String updateChanges; - private String browserDownloadUrl; // update download link - private String giteaApiRelease = "https://git.mosad.xyz/api/v1/repos/Seil0/Project-HomeFlix/releases"; - private URL giteaApiUrl; + private static String updateChanges; + private static String browserDownloadUrl; // update download link + private static final String giteaApiRelease = "https://git.mosad.xyz/api/v1/repos/Seil0/Project-HomeFlix/releases"; private static final Logger LOGGER = LogManager.getLogger(UpdateController.class.getName()); /** * updater for Project HomeFlix based on cemu_UIs, checks for Updates and download it - * @param mwc the MainWindowController object - * @param buildNumber the buildNumber of the used HomeFlix version - * @param useBeta if the updater should query the beta channel */ - public UpdateController(SettingsView svc) { - settingsViewController = svc; + public UpdateController() { + } - @Override - public void run() { + public static void update() { + if (browserDownloadUrl != null) { + LOGGER.info("download link: " + browserDownloadUrl); + + Runnable run = () -> { + try { + // open new HTTP connection, ProgressMonitorInputStream for downloading the data + // FIXME the download progress dialog is not showing! + HttpURLConnection connection = (HttpURLConnection) new URL(browserDownloadUrl).openConnection(); + ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", connection.getInputStream()); + ProgressMonitor pm = pmis.getProgressMonitor(); + pm.setMillisToDecideToPopup(0); + pm.setMillisToPopup(0); + pm.setMinimum(0);// set beginning of the progress bar to 0 + pm.setMaximum(connection.getContentLength());// set the end to the file length + FileUtils.copyInputStreamToFile(pmis, new File("ProjectHomeFlix_update.jar")); // download update + LOGGER.info("update download successful, restarting ..."); + org.apache.commons.io.FileUtils.copyFile(new File("ProjectHomeFlix_update.jar"), new File("ProjectHomeFlix.jar")); + org.apache.commons.io.FileUtils.deleteQuietly(new File("ProjectHomeFlix_update.jar")); // delete update + new ProcessBuilder("java", "-jar", "ProjectHomeFlix.jar").start(); // start the new application + System.exit(0); // close the current application + } catch (IOException e) { + LOGGER.info("could not download update files", e); + } + }; + + Thread t = new Thread(run); + t.start(); + + } + } + + + public static boolean isUpdateAvailable() { LOGGER.info("beta:" + XMLController.isUseBeta() + "; checking for updates ..."); - Platform.runLater(() -> { - settingsViewController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnChecking")); - }); + String apiOutput = ""; try { - giteaApiUrl = new URL(giteaApiRelease); + URL giteaApiUrl = new URL(giteaApiRelease); BufferedReader ina = new BufferedReader(new InputStreamReader(giteaApiUrl.openStream())); apiOutput = ina.readLine(); ina.close(); } catch (Exception e) { - Platform.runLater(() -> { LOGGER.error("could not check update version", e); - }); } JsonArray objectArray = Json.parse("{\"items\": " + apiOutput + "}").asObject().get("items").asArray(); JsonValue object = objectArray.get(0).asObject(); // set to the latest release as default JsonObject objectAsset = object.asObject().get("assets").asArray().get(0).asObject(); + // TODO rework stream() for(JsonValue objectIt : objectArray) { if(objectIt.asObject().getBoolean("prerelease", false) == XMLController.isUseBeta()) { // we found the needed release either beta or not @@ -104,46 +125,11 @@ public class UpdateController implements Runnable { updateBuildNumber = Integer.parseInt(object.asObject().getString("tag_name", "")); updateName = object.asObject().getString("name", ""); updateChanges = object.asObject().getString("body", ""); + browserDownloadUrl = objectAsset.getString("browser_download_url", ""); LOGGER.info("Build: " + Main.buildNumber + ", Update: " + updateBuildNumber); - /** - * Compare the program BuildNumber with the current BuildNumber - * if buildNumber < updateBuildNumber then perform a update - */ - if (Integer.parseInt(Main.buildNumber) >= updateBuildNumber) { - Platform.runLater(() -> { - settingsViewController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnNoUpdateAvailable")); - }); - LOGGER.info("no update available"); - } else { - Platform.runLater(() -> { - settingsViewController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnUpdateAvailable")); - }); - LOGGER.info("update available"); - browserDownloadUrl = objectAsset.getString("browser_download_url", ""); - LOGGER.info("download link: " + browserDownloadUrl); - try { - // open new HTTP connection, ProgressMonitorInputStream for downloading the data - // FIXME the download progress dialog is not showing! - HttpURLConnection connection = (HttpURLConnection) new URL(browserDownloadUrl).openConnection(); - ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, "Downloading...", connection.getInputStream()); - ProgressMonitor pm = pmis.getProgressMonitor(); - pm.setMillisToDecideToPopup(0); - pm.setMillisToPopup(0); - pm.setMinimum(0);// set beginning of the progress bar to 0 - pm.setMaximum(connection.getContentLength());// set the end to the file length - FileUtils.copyInputStreamToFile(pmis, new File("ProjectHomeFlix_update.jar")); // download update - LOGGER.info("update download successful, restarting ..."); - org.apache.commons.io.FileUtils.copyFile(new File("ProjectHomeFlix_update.jar"), new File("ProjectHomeFlix.jar")); - org.apache.commons.io.FileUtils.deleteQuietly(new File("ProjectHomeFlix_update.jar")); // delete update - new ProcessBuilder("java", "-jar", "ProjectHomeFlix.jar").start(); // start the new application - System.exit(0); // close the current application - } catch (IOException e) { - Platform.runLater(() -> { - LOGGER.info("could not download update files", e); - }); - } - } + return Integer.parseInt(Main.buildNumber) < updateBuildNumber; + } }