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.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() {
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();
}
}

View File

@ -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?

View File

@ -40,89 +40,32 @@ 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() {
LOGGER.info("beta:" + XMLController.isUseBeta() + "; checking for updates ...");
Platform.runLater(() -> {
settingsViewController.getUpdateBtn().setText(XMLController.getLocalBundle().getString("updateBtnChecking"));
});
try {
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();
for(JsonValue objectIt : objectArray) {
if(objectIt.asObject().getBoolean("prerelease", false) == XMLController.isUseBeta()) {
// we found the needed release either beta or not
object = objectIt;
objectAsset = objectIt.asObject().get("assets").asArray().get(0).asObject();
break;
}
}
updateBuildNumber = Integer.parseInt(object.asObject().getString("tag_name", ""));
updateName = object.asObject().getString("name", "");
updateChanges = object.asObject().getString("body", "");
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", "");
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!
@ -140,10 +83,53 @@ public class UpdateController implements Runnable {
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);
});
}
};
Thread t = new Thread(run);
t.start();
}
}
public static boolean isUpdateAvailable() {
LOGGER.info("beta:" + XMLController.isUseBeta() + "; checking for updates ...");
String apiOutput = "";
try {
URL giteaApiUrl = new URL(giteaApiRelease);
BufferedReader ina = new BufferedReader(new InputStreamReader(giteaApiUrl.openStream()));
apiOutput = ina.readLine();
ina.close();
} catch (Exception e) {
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
object = objectIt;
objectAsset = objectIt.asObject().get("assets").asArray().get(0).asObject();
break;
}
}
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);
return Integer.parseInt(Main.buildNumber) < updateBuildNumber;
}
}