reworked the UpdateController

This commit is contained in:
Jannik 2019-06-27 13:30:44 +02:00
parent d8062513e9
commit 75a80535a7
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
3 changed files with 63 additions and 79 deletions

View File

@ -52,8 +52,8 @@ import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.ScrollPane; import javafx.scene.control.ScrollPane;
import javafx.scene.effect.BoxBlur;
import javafx.scene.control.ScrollPane.ScrollBarPolicy; import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.effect.BoxBlur;
import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.FlowPane; import javafx.scene.layout.FlowPane;
@ -95,7 +95,6 @@ public class MainWindowController {
private static MainWindowController instance = null; private static MainWindowController instance = null;
private DBController dbController; private DBController dbController;
private UpdateController updateController;
private XMLController xmlController; private XMLController xmlController;
private Stage primaryStage; private Stage primaryStage;
private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName()); private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName());
@ -337,18 +336,10 @@ public class MainWindowController {
// if AutoUpdate, then check for updates // if AutoUpdate, then check for updates
private void checkAutoUpdate() { private void checkAutoUpdate() {
LOGGER.info("AutoUpdate: looking for updates on startup ...");
if (XMLController.isAutoUpdate()) { if (XMLController.isAutoUpdate() && UpdateController.isUpdateAvailable()) {
try { UpdateController.update();
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();
}
} }
} }

View File

@ -47,9 +47,9 @@ import javafx.fxml.FXML;
import javafx.scene.control.ChoiceBox; import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane; import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView; import javafx.scene.control.TableView;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.stage.DirectoryChooser; import javafx.stage.DirectoryChooser;
@ -206,9 +206,16 @@ public class SettingsView {
@FXML @FXML
private void updateBtnAction(ActionEvent event) { 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? /** TODO can this be done async?

View File

@ -40,58 +40,79 @@ import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue; import com.eclipsesource.json.JsonValue;
import javafx.application.Platform;
import kellerkinder.HomeFlix.application.Main; import kellerkinder.HomeFlix.application.Main;
import kellerkinder.HomeFlix.application.SettingsView;
public class UpdateController implements Runnable { public class UpdateController {
private SettingsView settingsViewController; private static int updateBuildNumber; // tag_name from gitea
private int updateBuildNumber; // tag_name from gitea
private String apiOutput;
@SuppressWarnings("unused") @SuppressWarnings("unused")
private String updateName; private static String updateName;
@SuppressWarnings("unused") @SuppressWarnings("unused")
private String updateChanges; private static String updateChanges;
private String browserDownloadUrl; // update download link private static String browserDownloadUrl; // update download link
private String giteaApiRelease = "https://git.mosad.xyz/api/v1/repos/Seil0/Project-HomeFlix/releases"; private static final String giteaApiRelease = "https://git.mosad.xyz/api/v1/repos/Seil0/Project-HomeFlix/releases";
private URL giteaApiUrl;
private static final Logger LOGGER = LogManager.getLogger(UpdateController.class.getName()); private static final Logger LOGGER = LogManager.getLogger(UpdateController.class.getName());
/** /**
* updater for Project HomeFlix based on cemu_UIs, checks for Updates and download it * 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) { public UpdateController() {
settingsViewController = svc;
} }
@Override public static void update() {
public void run() { 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 ..."); LOGGER.info("beta:" + XMLController.isUseBeta() + "; checking for updates ...");
Platform.runLater(() -> { String apiOutput = "";
settingsViewController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnChecking"));
});
try { try {
giteaApiUrl = new URL(giteaApiRelease); URL giteaApiUrl = new URL(giteaApiRelease);
BufferedReader ina = new BufferedReader(new InputStreamReader(giteaApiUrl.openStream())); BufferedReader ina = new BufferedReader(new InputStreamReader(giteaApiUrl.openStream()));
apiOutput = ina.readLine(); apiOutput = ina.readLine();
ina.close(); ina.close();
} catch (Exception e) { } catch (Exception e) {
Platform.runLater(() -> {
LOGGER.error("could not check update version", e); LOGGER.error("could not check update version", e);
});
} }
JsonArray objectArray = Json.parse("{\"items\": " + apiOutput + "}").asObject().get("items").asArray(); JsonArray objectArray = Json.parse("{\"items\": " + apiOutput + "}").asObject().get("items").asArray();
JsonValue object = objectArray.get(0).asObject(); // set to the latest release as default JsonValue object = objectArray.get(0).asObject(); // set to the latest release as default
JsonObject objectAsset = object.asObject().get("assets").asArray().get(0).asObject(); JsonObject objectAsset = object.asObject().get("assets").asArray().get(0).asObject();
// TODO rework stream()
for(JsonValue objectIt : objectArray) { for(JsonValue objectIt : objectArray) {
if(objectIt.asObject().getBoolean("prerelease", false) == XMLController.isUseBeta()) { if(objectIt.asObject().getBoolean("prerelease", false) == XMLController.isUseBeta()) {
// we found the needed release either beta or not // 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", "")); updateBuildNumber = Integer.parseInt(object.asObject().getString("tag_name", ""));
updateName = object.asObject().getString("name", ""); updateName = object.asObject().getString("name", "");
updateChanges = object.asObject().getString("body", ""); updateChanges = object.asObject().getString("body", "");
browserDownloadUrl = objectAsset.getString("browser_download_url", "");
LOGGER.info("Build: " + Main.buildNumber + ", Update: " + updateBuildNumber); LOGGER.info("Build: " + Main.buildNumber + ", Update: " + updateBuildNumber);
/** return Integer.parseInt(Main.buildNumber) < 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);
});
}
}
} }
} }