diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java index ee8ea5593cf..a357415ad4a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java @@ -37,10 +37,7 @@ import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.ui.construct.MessageDialogPane.MessageType; -import org.jackhuang.hmcl.upgrade.RemoteVersion; -import org.jackhuang.hmcl.upgrade.UpdateChannel; -import org.jackhuang.hmcl.upgrade.UpdateChecker; -import org.jackhuang.hmcl.upgrade.UpdateHandler; +import org.jackhuang.hmcl.upgrade.*; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.i18n.I18n; @@ -113,7 +110,7 @@ protected int getTrailingTextIndex() { final StringProperty lblUpdateSubProperty = updatePane.subtitleProperty(); - { + if (IntegrityChecker.DISABLE_SELF_INTEGRITY_CHECK || IntegrityChecker.isSelfVerified()) { updateListener = any -> { boolean outdated = UpdateChecker.isOutdated(); @@ -125,6 +122,10 @@ protected int getTrailingTextIndex() { lblUpdateSubProperty.set(i18n("update.newest_version", UpdateChecker.getLatestVersion().version())); } else if (UpdateChecker.isCheckingUpdate()) { lblUpdateSubProperty.set(i18n("update.checking")); + } else if (UpdateChecker.errorProperty().get() != null) { + Throwable t = UpdateChecker.errorProperty().get(); + String msg = t.getClass().getSimpleName() + ": " + t.getLocalizedMessage(); + lblUpdateSubProperty.set(i18n("update.check_failed", msg)); } else { lblUpdateSubProperty.set(i18n("update.latest")); } @@ -132,7 +133,13 @@ protected int getTrailingTextIndex() { UpdateChecker.latestVersionProperty().addListener(new WeakInvalidationListener(updateListener)); UpdateChecker.outdatedProperty().addListener(new WeakInvalidationListener(updateListener)); UpdateChecker.checkingUpdateProperty().addListener(new WeakInvalidationListener(updateListener)); + UpdateChecker.errorProperty().addListener(new WeakInvalidationListener(updateListener)); updateListener.invalidated(null); + } else { + updateButton.setVisible(false); + updateButton.setManaged(false); + lblUpdateSubProperty.set(i18n("update.unverified")); + updateListener = null; } updatePaneList.getContent().add(updatePane); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java index 3db51606969..a603170def6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java @@ -54,6 +54,7 @@ private UpdateChecker() { }, latestVersion); private static final ReadOnlyBooleanWrapper checkingUpdate = new ReadOnlyBooleanWrapper(false); + private static final ReadOnlyObjectWrapper error = new ReadOnlyObjectWrapper<>(); public static void init() { requestCheckUpdate(UpdateChannel.getChannel(), settings().acceptPreviewUpdateProperty().get()); @@ -83,6 +84,10 @@ public static ReadOnlyBooleanProperty checkingUpdateProperty() { return checkingUpdate.getReadOnlyProperty(); } + public static ReadOnlyObjectProperty errorProperty() { + return error.getReadOnlyProperty(); + } + private static RemoteVersion checkUpdate(UpdateChannel channel, boolean preview) throws IOException { if (!IntegrityChecker.DISABLE_SELF_INTEGRITY_CHECK && !IntegrityChecker.isSelfVerified()) { throw new IOException("Self verification failed"); @@ -109,16 +114,22 @@ public static void requestCheckUpdate(UpdateChannel channel, boolean preview) { thread(() -> { RemoteVersion result = null; + Throwable t = null; try { result = checkUpdate(channel, preview); LOG.info("Latest version (" + channel + ", preview=" + preview + ") is " + result); } catch (Throwable e) { + t = e; LOG.warning("Failed to check for update", e); } + Throwable throwable = t; RemoteVersion finalResult = result; Platform.runLater(() -> { - if (finalResult != null) { + if (throwable != null) { + error.set(throwable); + } else { + error.set(null); latestVersion.set(finalResult); } checkingUpdate.set(false); diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 199d231bf9c..32a9ba94fa2 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1784,6 +1784,7 @@ update.channel.nightly.hint=You are currently using a Nightly channel build of t update.channel.nightly.title=Nightly Channel Notice update.channel.stable=Stable update.checking=Checking for updates +update.check_failed=Failed to check for update. %s update.disable_auto_show_update_dialog=Do not show update dialog automatically update.disable_auto_show_update_dialog.subtitle=Enable this option to prevent HMCL from automatically showing the update dialog. update.failed=Failed to update @@ -1798,6 +1799,7 @@ update.no_browser=Cannot open in system browser. But we copied the link to your update.tooltip=Update update.preview=Preview HMCL releases early update.preview.subtitle=Enable this option to receive new versions of HMCL early for testing before their official release. +update.unverified=Update unavailable due to this launcher instance not verified version=Games version.name=Instance Name diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 9e571a5b40c..e74c28d73a8 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1571,6 +1571,7 @@ update.channel.nightly.hint=你正在使用 HMCL 預覽版。預覽版更新較 update.channel.nightly.title=預覽版提示 update.channel.stable=穩定版 update.checking=正在檢查更新 +update.check_failed=檢查更新失敗 %s update.disable_auto_show_update_dialog=不自動顯示更新彈窗 update.disable_auto_show_update_dialog.subtitle=啟用此選項,HMCL 將不會自動彈出更新彈窗。 update.failed=更新失敗 @@ -1585,6 +1586,7 @@ update.no_browser=無法開啟瀏覽器。網址已經複製到剪貼簿了, update.tooltip=更新 update.preview=提前測試 HMCL 預覽版本 update.preview.subtitle=啟用此選項,你將可以提前取得 HMCL 的新版本,以便在正式發布前進行測試。 +update.unverified=更新不可用,因為無法驗證此啟動器例項完整性 version=遊戲 version.name=遊戲實例名稱 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 3f339510c78..5786b052e82 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1576,6 +1576,7 @@ update.channel.nightly.hint=你正在使用 HMCL 预览版。预览版更新较 update.channel.nightly.title=预览版提示 update.channel.stable=稳定版 update.checking=正在检查更新 +update.check_failed=检查更新失败 %s update.disable_auto_show_update_dialog=不自动显示更新弹窗 update.disable_auto_show_update_dialog.subtitle=启用此选项,HMCL 将不会自动弹出更新弹窗。 update.failed=更新失败 @@ -1590,6 +1591,7 @@ update.no_browser=无法打开浏览器。网址已经复制到剪贴板,你 update.tooltip=更新 update.preview=提前预览 HMCL 版本 update.preview.subtitle=启用此选项,你将可以提前获取 HMCL 的新版本,以便在正式发布前进行测试。 +update.unverified=更新不可用,因为无法验证此启动器实例完整性 version=游戏 version.name=游戏实例名称