From 94539ad77bbd08e692a0aebccebf6c07a51fb28c Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Tue, 26 Jan 2021 12:07:34 +0800 Subject: [PATCH] feat: progress bar indicating Microsoft login page loading progress --- .../java/org/jackhuang/hmcl/Launcher.java | 7 ++--- .../java/org/jackhuang/hmcl/ui/WebStage.java | 26 ++++++++++++++++++- .../account/MicrosoftAccountLoginStage.java | 4 +++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index 01c7a9866..219c62ada 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -33,9 +33,7 @@ import org.jackhuang.hmcl.util.platform.OperatingSystem; import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLClassLoader; +import java.net.*; import java.nio.file.Paths; import java.util.LinkedList; import java.util.List; @@ -47,11 +45,14 @@ import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class Launcher extends Application { + public static final CookieManager COOKIE_MANAGER = new CookieManager(); @Override public void start(Stage primaryStage) { Thread.currentThread().setUncaughtExceptionHandler(CRASH_REPORTER); + CookieHandler.setDefault(COOKIE_MANAGER); + try { try { ConfigHolder.init(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java index 8babba79f..6710ef836 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java @@ -17,7 +17,11 @@ */ package org.jackhuang.hmcl.ui; +import com.jfoenix.controls.JFXProgressBar; +import javafx.beans.binding.Bindings; import javafx.scene.Scene; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.StackPane; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; @@ -26,6 +30,8 @@ import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.FXUtils.newImage; public class WebStage extends Stage { + protected final StackPane pane = new StackPane(); + protected final JFXProgressBar progressBar = new JFXProgressBar(); protected final WebView webView = new WebView(); protected final WebEngine webEngine = webView.getEngine(); @@ -34,10 +40,28 @@ public class WebStage extends Stage { } public WebStage(int width, int height) { - setScene(new Scene(webView, width, height)); + setScene(new Scene(pane, width, height)); getScene().getStylesheets().addAll(config().getTheme().getStylesheets()); getIcons().add(newImage("/assets/img/icon.png")); webView.setContextMenuEnabled(false); + progressBar.progressProperty().bind(webView.getEngine().getLoadWorker().progressProperty()); + + progressBar.visibleProperty().bind(Bindings.createBooleanBinding(() -> { + switch (webView.getEngine().getLoadWorker().getState()) { + case SUCCEEDED: + case FAILED: + case CANCELLED: + return false; + default: + return true; + } + }, webEngine.getLoadWorker().stateProperty())); + + BorderPane borderPane = new BorderPane(); + borderPane.setPickOnBounds(false); + borderPane.setTop(progressBar); + progressBar.prefWidthProperty().bind(borderPane.widthProperty()); + pane.getChildren().setAll(webView, borderPane); } public WebView getWebView() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/MicrosoftAccountLoginStage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/MicrosoftAccountLoginStage.java index cb2e52c0e..35dcbb8b3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/MicrosoftAccountLoginStage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/MicrosoftAccountLoginStage.java @@ -25,6 +25,8 @@ import org.jackhuang.hmcl.ui.WebStage; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; +import static org.jackhuang.hmcl.Launcher.COOKIE_MANAGER; + public class MicrosoftAccountLoginStage extends WebStage implements MicrosoftService.WebViewCallback { public static final MicrosoftAccountLoginStage INSTANCE = new MicrosoftAccountLoginStage(); @@ -58,6 +60,8 @@ public class MicrosoftAccountLoginStage extends WebStage implements MicrosoftSer @Override public CompletableFuture show(MicrosoftService service, Predicate urlTester, String initialURL) { Platform.runLater(() -> { + COOKIE_MANAGER.getCookieStore().removeAll(); + webEngine.load(initialURL); show(); });