From 5cf6ef88a6e3e2d275f30371d975ed76ed9913b7 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Mon, 9 Jul 2018 21:22:06 +0800 Subject: [PATCH 01/20] Let Account implement Observable --- .../java/org/jackhuang/hmcl/auth/Account.java | 27 +++++++- .../hmcl/auth/yggdrasil/YggdrasilAccount.java | 1 + .../jackhuang/hmcl/util/ObservableHelper.java | 65 +++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/util/ObservableHelper.java diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java index 8eaf538cd..585f45e80 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java @@ -17,8 +17,13 @@ */ package org.jackhuang.hmcl.auth; +import org.jackhuang.hmcl.util.ObservableHelper; import org.jackhuang.hmcl.util.ToStringBuilder; +import javafx.application.Platform; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; + import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -27,7 +32,7 @@ import java.util.UUID; * * @author huangyuhui */ -public abstract class Account { +public abstract class Account implements Observable { /** * @return the name of the account who owns the character @@ -66,6 +71,26 @@ public abstract class Account { public abstract void clearCache(); + private ObservableHelper helper = new ObservableHelper(this); + + @Override + public void addListener(InvalidationListener listener) { + helper.addListener(listener); + } + + @Override + public void removeListener(InvalidationListener listener) { + helper.removeListener(listener); + } + + /** + * Called when the account has changed. + * This method can be called from any thread. + */ + protected void invalidate() { + Platform.runLater(helper::invalidate); + } + @Override public String toString() { return new ToStringBuilder(this) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java index 112bdfc3c..4d47c1f8f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java @@ -114,6 +114,7 @@ public class YggdrasilAccount extends Account { } this.characterUUID = this.session.getSelectedProfile().getId(); + invalidate(); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ObservableHelper.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ObservableHelper.java new file mode 100644 index 000000000..c4b8e3dd9 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ObservableHelper.java @@ -0,0 +1,65 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.util; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; + +/** + * Helper class for implementing {@link Observable}. + * + * @author yushijinhun + */ +public class ObservableHelper implements Observable, InvalidationListener { + + private List listeners = new CopyOnWriteArrayList<>(); + private Observable source; + + public ObservableHelper(Observable source) { + this.source = source; + } + + /** + * This method can be called from any thread. + */ + @Override + public void addListener(InvalidationListener listener) { + listeners.add(listener); + } + + /** + * This method can be called from any thread. + */ + @Override + public void removeListener(InvalidationListener listener) { + listeners.remove(listener); + } + + public void invalidate() { + listeners.forEach(it -> it.invalidated(source)); + } + + @Override + public void invalidated(Observable observable) { + this.invalidate(); + } + +} From b0d71a5511522770e6acf32c834d8d566011cfb8 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Mon, 9 Jul 2018 21:58:18 +0800 Subject: [PATCH 02/20] Let Config implement Observable --- .../org/jackhuang/hmcl/setting/Config.java | 46 ++++++++++++++++++- .../jackhuang/hmcl/util/ObservableHelper.java | 4 ++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java index 3e2727be6..d5b3082d3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -18,8 +18,10 @@ package org.jackhuang.hmcl.setting; import java.io.File; +import java.lang.reflect.Modifier; import java.util.Map; import java.util.TreeMap; +import java.util.stream.Stream; import org.hildan.fxgson.creators.ObservableListCreator; import org.hildan.fxgson.creators.ObservableMapCreator; @@ -28,12 +30,15 @@ import org.hildan.fxgson.factories.JavaFxPropertyTypeAdapterFactory; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; import org.jackhuang.hmcl.util.FileTypeAdapter; +import org.jackhuang.hmcl.util.ObservableHelper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; import com.google.gson.annotations.SerializedName; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; import javafx.beans.property.IntegerProperty; @@ -47,7 +52,7 @@ import javafx.collections.ObservableList; import javafx.collections.ObservableMap; import javafx.collections.ObservableSet; -public final class Config implements Cloneable { +public final class Config implements Cloneable, Observable { private static final Gson CONFIG_GSON = new GsonBuilder() .registerTypeAdapter(VersionSetting.class, VersionSetting.Serializer.INSTANCE) @@ -61,7 +66,11 @@ public final class Config implements Cloneable { .create(); public static Config fromJson(String json) throws JsonParseException { - return CONFIG_GSON.fromJson(json, Config.class); + Config instance = CONFIG_GSON.fromJson(json, Config.class); + // Gson will replace the property fields (even they are final!) + // So we have to add the listeners again after deserialization + instance.addListenerToProperties(); + return instance; } @SerializedName("last") @@ -129,6 +138,39 @@ public final class Config implements Cloneable { public final ObservableList authlibInjectorServers = FXCollections.observableArrayList(); + private transient ObservableHelper helper = new ObservableHelper(this); + + public Config() { + addListenerToProperties(); + } + + private void addListenerToProperties() { + Stream.of(getClass().getFields()) + .filter(it -> { + int modifiers = it.getModifiers(); + return Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers); + }) + .filter(it -> Observable.class.isAssignableFrom(it.getType())) + .map(it -> { + try { + return (Observable) it.get(this); + } catch (IllegalAccessException e) { + throw new IllegalStateException("Failed to get my own properties"); + } + }) + .forEach(helper::receiveUpdatesFrom); + } + + @Override + public void addListener(InvalidationListener listener) { + helper.addListener(listener); + } + + @Override + public void removeListener(InvalidationListener listener) { + helper.removeListener(listener); + } + public String toJson() { return CONFIG_GSON.toJson(this); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ObservableHelper.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ObservableHelper.java index c4b8e3dd9..ba5a9a882 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ObservableHelper.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ObservableHelper.java @@ -62,4 +62,8 @@ public class ObservableHelper implements Observable, InvalidationListener { this.invalidate(); } + public void receiveUpdatesFrom(Observable observable) { + observable.removeListener(this); // remove the previously added listener(if any) + observable.addListener(this); + } } From fac62a8d24169c76c3179531c20a7253d66b89cf Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 10 Jul 2018 17:39:21 +0800 Subject: [PATCH 03/20] Replace save() with observer pattern --- .../org/jackhuang/hmcl/setting/Settings.java | 65 +++++++++---------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 378f25ade..9bbadfdeb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.setting; +import javafx.beans.InvalidationListener; import javafx.beans.property.ObjectProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ObservableValue; @@ -55,6 +56,16 @@ public class Settings { private final boolean firstLaunch; + private InvalidationListener accountChangeListener = + source -> ConfigHolder.CONFIG.accounts.setAll( + accounts.values().stream() + .map(account -> { + Map storage = account.toStorage(); + storage.put("type", Accounts.getAccountType(account)); + return storage; + }) + .collect(toList())); + private Settings() { firstLaunch = ConfigHolder.CONFIG.firstLaunch.get(); ConfigHolder.CONFIG.firstLaunch.set(false); @@ -80,6 +91,7 @@ public class Settings { } accounts.put(Accounts.getAccountId(account), account); + account.addListener(accountChangeListener); } ConfigHolder.CONFIG.authlibInjectorServers.addListener(onInvalidating(this::removeDanglingAuthlibInjectorAccounts)); @@ -90,22 +102,18 @@ public class Settings { save(); - for (Map.Entry entry2 : getProfileMap().entrySet()) { - entry2.getValue().setName(entry2.getKey()); - entry2.getValue().nameProperty().setChangedListener(this::profileNameChanged); - entry2.getValue().addPropertyChangedListener(e -> save()); + for (Map.Entry profileEntry : getProfileMap().entrySet()) { + profileEntry.getValue().setName(profileEntry.getKey()); + profileEntry.getValue().nameProperty().setChangedListener(this::profileNameChanged); + profileEntry.getValue().addPropertyChangedListener(e -> save()); } Lang.ignoringException(() -> Runtime.getRuntime().addShutdownHook(new Thread(this::save))); + + ConfigHolder.CONFIG.addListener(source -> save()); } - public void save() { - ConfigHolder.CONFIG.accounts.clear(); - for (Account account : accounts.values()) { - Map storage = account.toStorage(); - storage.put("type", Accounts.getAccountType(account)); - ConfigHolder.CONFIG.accounts.add(storage); - } + private void save() { ConfigHolder.saveConfig(ConfigHolder.CONFIG); } @@ -119,7 +127,6 @@ public class Settings { super.invalidated(); ConfigHolder.CONFIG.commonDirectory.set(get()); - save(); } }; @@ -144,7 +151,6 @@ public class Settings { public void setLocale(Locales.SupportedLocale locale) { this.locale = locale; ConfigHolder.CONFIG.localization.set(Locales.getNameByLocale(locale)); - save(); } private Proxy proxy = Proxy.NO_PROXY; @@ -162,7 +168,6 @@ public class Settings { public void setProxyType(Proxy.Type proxyType) { this.proxyType = proxyType; ConfigHolder.CONFIG.proxyType.set(Proxies.PROXIES.indexOf(proxyType)); - save(); loadProxy(); } @@ -172,7 +177,6 @@ public class Settings { public void setProxyHost(String proxyHost) { ConfigHolder.CONFIG.proxyHost.set(proxyHost); - save(); } public String getProxyPort() { @@ -181,7 +185,6 @@ public class Settings { public void setProxyPort(String proxyPort) { ConfigHolder.CONFIG.proxyPort.set(proxyPort); - save(); } public String getProxyUser() { @@ -190,7 +193,6 @@ public class Settings { public void setProxyUser(String proxyUser) { ConfigHolder.CONFIG.proxyUser.set(proxyUser); - save(); } public String getProxyPass() { @@ -199,7 +201,6 @@ public class Settings { public void setProxyPass(String proxyPass) { ConfigHolder.CONFIG.proxyPass.set(proxyPass); - save(); } public boolean hasProxy() { @@ -208,7 +209,6 @@ public class Settings { public void setHasProxy(boolean hasProxy) { ConfigHolder.CONFIG.hasProxy.set(hasProxy); - save(); } public boolean hasProxyAuth() { @@ -217,7 +217,6 @@ public class Settings { public void setHasProxyAuth(boolean hasProxyAuth) { ConfigHolder.CONFIG.hasProxyAuth.set(hasProxyAuth); - save(); } private void loadProxy() { @@ -253,7 +252,6 @@ public class Settings { public void setFont(Font font) { ConfigHolder.CONFIG.fontFamily.set(font.getFamily()); ConfigHolder.CONFIG.fontSize.set(font.getSize()); - save(); } public int getLogLines() { @@ -262,7 +260,6 @@ public class Settings { public void setLogLines(int logLines) { ConfigHolder.CONFIG.logLines.set(logLines); - save(); } /**************************************** @@ -295,7 +292,6 @@ public class Settings { if (index == -1) throw new IllegalArgumentException("Unknown download provider: " + downloadProvider); ConfigHolder.CONFIG.downloadType.set(index); - save(); } /**************************************** @@ -325,7 +321,6 @@ public class Settings { super.invalidated(); ConfigHolder.CONFIG.selectedAccount.set(getValue() == null ? "" : Accounts.getAccountId(getValue())); - save(); } }; @@ -343,6 +338,9 @@ public class Settings { public void addAccount(Account account) { accounts.put(Accounts.getAccountId(account), account); + account.addListener(accountChangeListener); + accountChangeListener.invalidated(account); + onAccountLoading(); EventBus.EVENT_BUS.fireEvent(new AccountAddedEvent(this, account)); @@ -357,14 +355,20 @@ public class Settings { } public void deleteAccount(String name, String character) { - accounts.remove(Accounts.getAccountId(name, character)); + Account removed = accounts.remove(Accounts.getAccountId(name, character)); + if (removed != null) { + removed.removeListener(accountChangeListener); + accountChangeListener.invalidated(removed); - onAccountLoading(); - selectedAccount.get(); + onAccountLoading(); + selectedAccount.get(); + } } public void deleteAccount(Account account) { accounts.remove(Accounts.getAccountId(account)); + account.removeListener(accountChangeListener); + accountChangeListener.invalidated(account); onAccountLoading(); selectedAccount.get(); @@ -380,7 +384,6 @@ public class Settings { super.invalidated(); ConfigHolder.CONFIG.backgroundImage.set(get()); - save(); } }; @@ -402,7 +405,6 @@ public class Settings { super.invalidated(); ConfigHolder.CONFIG.backgroundImageType.set(get().ordinal()); - save(); } }; @@ -428,7 +430,6 @@ public class Settings { super.invalidated(); ConfigHolder.CONFIG.theme.set(get().getName().toLowerCase()); - save(); } }; @@ -454,7 +455,6 @@ public class Settings { if (!hasProfile(ConfigHolder.CONFIG.selectedProfile.get())) { getProfileMap().keySet().stream().findFirst().ifPresent(selectedProfile -> { ConfigHolder.CONFIG.selectedProfile.set(selectedProfile); - save(); }); Schedulers.computation().schedule(this::onProfileChanged); } @@ -464,7 +464,6 @@ public class Settings { public void setSelectedProfile(Profile selectedProfile) { if (hasProfile(selectedProfile.getName()) && !Objects.equals(selectedProfile.getName(), ConfigHolder.CONFIG.selectedProfile.get())) { ConfigHolder.CONFIG.selectedProfile.set(selectedProfile.getName()); - save(); Schedulers.computation().schedule(this::onProfileChanged); } } @@ -496,8 +495,6 @@ public class Settings { Schedulers.computation().schedule(this::onProfileLoading); ver.nameProperty().setChangedListener(this::profileNameChanged); - - save(); } public void deleteProfile(Profile profile) { From 6d83fd9903fd78e5b2d45dc5ff68cbe52c248985 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 17:12:25 +0800 Subject: [PATCH 04/20] Remove simple properties in Settings --- .../hmcl/game/HMCLGameDownloadTask.java | 4 +- .../hmcl/game/HMCLGameRepository.java | 6 +- .../org/jackhuang/hmcl/setting/Settings.java | 86 ++----------------- .../hmcl/setting/VersionSetting.java | 8 +- .../org/jackhuang/hmcl/ui/SettingsPage.java | 29 +++---- 5 files changed, 30 insertions(+), 103 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java index e1402d55e..fc7273edf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java @@ -17,8 +17,8 @@ */ package org.jackhuang.hmcl.game; +import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.Profile; -import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck; import org.jackhuang.hmcl.task.Task; @@ -58,7 +58,7 @@ public class HMCLGameDownloadTask extends Task { public void execute() { File jar = profile.getRepository().getVersionJar(version); - File cache = new File(Settings.INSTANCE.getCommonPath(), "jars/" + gameVersion + ".jar"); + File cache = new File(ConfigHolder.CONFIG.commonDirectory.get(), "jars/" + gameVersion + ".jar"); if (cache.exists()) try { FileUtils.copyFile(cache, jar); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 2b242795e..c2ad1907e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -22,9 +22,9 @@ import com.google.gson.GsonBuilder; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; import org.jackhuang.hmcl.event.RefreshingVersionsEvent; +import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.EnumGameDirectory; import org.jackhuang.hmcl.setting.Profile; -import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.setting.VersionSetting; import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.Logging; @@ -60,7 +60,7 @@ public class HMCLGameRepository extends DefaultGameRepository { if (useSelf(version, assetId)) return super.getAssetDirectory(version, assetId); else - return new File(Settings.INSTANCE.getCommonPath(), "assets"); + return new File(ConfigHolder.CONFIG.commonDirectory.get(), "assets"); } @Override @@ -85,7 +85,7 @@ public class HMCLGameRepository extends DefaultGameRepository { if (self.exists() || vs.isNoCommon()) return self; else - return new File(Settings.INSTANCE.getCommonPath(), "libraries/" + lib.getPath()); + return new File(ConfigHolder.CONFIG.commonDirectory.get(), "libraries/" + lib.getPath()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 9bbadfdeb..9b1e0dcee 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -19,7 +19,6 @@ package org.jackhuang.hmcl.setting; import javafx.beans.InvalidationListener; import javafx.beans.property.ObjectProperty; -import javafx.beans.property.StringProperty; import javafx.beans.value.ObservableValue; import javafx.scene.text.Font; @@ -121,27 +120,6 @@ public class Settings { return firstLaunch; } - private final StringProperty commonPath = new ImmediateStringProperty(this, "commonPath", ConfigHolder.CONFIG.commonDirectory.get()) { - @Override - public void invalidated() { - super.invalidated(); - - ConfigHolder.CONFIG.commonDirectory.set(get()); - } - }; - - public String getCommonPath() { - return commonPath.get(); - } - - public StringProperty commonPathProperty() { - return commonPath; - } - - public void setCommonPath(String commonPath) { - this.commonPath.set(commonPath); - } - private Locales.SupportedLocale locale = Locales.getLocaleByName(ConfigHolder.CONFIG.localization.get()); public Locales.SupportedLocale getLocale() { @@ -171,67 +149,19 @@ public class Settings { loadProxy(); } - public String getProxyHost() { - return ConfigHolder.CONFIG.proxyHost.get(); - } - - public void setProxyHost(String proxyHost) { - ConfigHolder.CONFIG.proxyHost.set(proxyHost); - } - - public String getProxyPort() { - return ConfigHolder.CONFIG.proxyPort.get(); - } - - public void setProxyPort(String proxyPort) { - ConfigHolder.CONFIG.proxyPort.set(proxyPort); - } - - public String getProxyUser() { - return ConfigHolder.CONFIG.proxyUser.get(); - } - - public void setProxyUser(String proxyUser) { - ConfigHolder.CONFIG.proxyUser.set(proxyUser); - } - - public String getProxyPass() { - return ConfigHolder.CONFIG.proxyPass.get(); - } - - public void setProxyPass(String proxyPass) { - ConfigHolder.CONFIG.proxyPass.set(proxyPass); - } - - public boolean hasProxy() { - return ConfigHolder.CONFIG.hasProxy.get(); - } - - public void setHasProxy(boolean hasProxy) { - ConfigHolder.CONFIG.hasProxy.set(hasProxy); - } - - public boolean hasProxyAuth() { - return ConfigHolder.CONFIG.hasProxyAuth.get(); - } - - public void setHasProxyAuth(boolean hasProxyAuth) { - ConfigHolder.CONFIG.hasProxyAuth.set(hasProxyAuth); - } - private void loadProxy() { - String host = getProxyHost(); - Integer port = Lang.toIntOrNull(getProxyPort()); - if (!hasProxy() || StringUtils.isBlank(host) || port == null || getProxyType() == Proxy.Type.DIRECT) + String host = ConfigHolder.CONFIG.proxyHost.get(); + Integer port = Lang.toIntOrNull(ConfigHolder.CONFIG.proxyPort.get()); + if (!ConfigHolder.CONFIG.hasProxy.get() || StringUtils.isBlank(host) || port == null || getProxyType() == Proxy.Type.DIRECT) proxy = Proxy.NO_PROXY; else { - System.setProperty("http.proxyHost", getProxyHost()); - System.setProperty("http.proxyPort", getProxyPort()); + System.setProperty("http.proxyHost", ConfigHolder.CONFIG.proxyHost.get()); + System.setProperty("http.proxyPort", ConfigHolder.CONFIG.proxyPort.get()); proxy = new Proxy(proxyType, new InetSocketAddress(host, port)); - String user = getProxyUser(); - String pass = getProxyPass(); - if (hasProxyAuth() && StringUtils.isNotBlank(user) && StringUtils.isNotBlank(pass)) { + String user = ConfigHolder.CONFIG.proxyUser.get(); + String pass = ConfigHolder.CONFIG.proxyPass.get(); + if (ConfigHolder.CONFIG.hasProxyAuth.get() && StringUtils.isNotBlank(user) && StringUtils.isNotBlank(pass)) { System.setProperty("http.proxyUser", user); System.setProperty("http.proxyPassword", pass); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java index 9b9ab8c45..562d448c0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java @@ -517,10 +517,10 @@ public final class VersionSetting { .setFullscreen(isFullscreen()) .setServerIp(getServerIp()) .setWrapper(getWrapper()) - .setProxyHost(Settings.INSTANCE.getProxyHost()) - .setProxyPort(Settings.INSTANCE.getProxyPort()) - .setProxyUser(Settings.INSTANCE.getProxyUser()) - .setProxyPass(Settings.INSTANCE.getProxyPass()) + .setProxyHost(ConfigHolder.CONFIG.proxyHost.get()) + .setProxyPort(ConfigHolder.CONFIG.proxyPort.get()) + .setProxyUser(ConfigHolder.CONFIG.proxyUser.get()) + .setProxyPass(ConfigHolder.CONFIG.proxyPass.get()) .setPrecalledCommand(getPreLaunchCommand()) .setNoGeneratedJVMArgs(isNoJVMArgs()) .create(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index a691adc87..c1d1e1860 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -20,7 +20,6 @@ package org.jackhuang.hmcl.ui; import com.jfoenix.controls.*; import com.jfoenix.effects.JFXDepthManager; import javafx.application.Platform; -import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; @@ -48,9 +47,7 @@ import org.jackhuang.hmcl.util.i18n.Locales; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.net.Proxy; -import java.util.Arrays; import java.util.Collections; -import java.util.stream.Collectors; public final class SettingsPage extends StackPane implements DecoratorPage { private final StringProperty title = new SimpleStringProperty(this, "title", i18n("settings.launcher")); @@ -107,17 +104,17 @@ public final class SettingsPage extends StackPane implements DecoratorPage { FXUtils.smoothScrolling(scroll); - txtProxyHost.setText(Settings.INSTANCE.getProxyHost()); - txtProxyHost.textProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setProxyHost(newValue)); + txtProxyHost.setText(ConfigHolder.CONFIG.proxyHost.get()); + txtProxyHost.textProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyHost.set(newValue)); - txtProxyPort.setText(Settings.INSTANCE.getProxyPort()); - txtProxyPort.textProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setProxyPort(newValue)); + txtProxyPort.setText(ConfigHolder.CONFIG.proxyPort.get()); + txtProxyPort.textProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyPort.set(newValue)); - txtProxyUsername.setText(Settings.INSTANCE.getProxyUser()); - txtProxyUsername.textProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setProxyUser(newValue)); + txtProxyUsername.setText(ConfigHolder.CONFIG.proxyUser.get()); + txtProxyUsername.textProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyUser.set(newValue)); - txtProxyPassword.setText(Settings.INSTANCE.getProxyPass()); - txtProxyPassword.textProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setProxyPass(newValue)); + txtProxyPassword.setText(ConfigHolder.CONFIG.proxyPass.get()); + txtProxyPassword.textProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyPass.set(newValue)); cboDownloadSource.getSelectionModel().select(DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(Settings.INSTANCE.getDownloadProvider())); cboDownloadSource.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setDownloadProvider(DownloadProviders.getDownloadProvider(newValue.intValue()))); @@ -163,23 +160,23 @@ public final class SettingsPage extends StackPane implements DecoratorPage { ToggleGroup hasProxyGroup = new ToggleGroup(); chkNoProxy.setToggleGroup(hasProxyGroup); chkManualProxy.setToggleGroup(hasProxyGroup); - if (!Settings.INSTANCE.hasProxy()) + if (!ConfigHolder.CONFIG.hasProxy.get()) chkNoProxy.setSelected(true); else chkManualProxy.setSelected(true); proxyPane.disableProperty().bind(chkNoProxy.selectedProperty()); hasProxyGroup.selectedToggleProperty().addListener((a, b, newValue) -> - Settings.INSTANCE.setHasProxy(newValue != chkNoProxy)); + ConfigHolder.CONFIG.hasProxy.set(newValue != chkNoProxy)); proxyConfigurationGroup.selectedToggleProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setProxyType((Proxy.Type) newValue.getUserData())); - chkProxyAuthentication.setSelected(Settings.INSTANCE.hasProxyAuth()); - chkProxyAuthentication.selectedProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setHasProxyAuth(newValue)); + chkProxyAuthentication.setSelected(ConfigHolder.CONFIG.hasProxyAuth.get()); + chkProxyAuthentication.selectedProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.hasProxyAuth.set(newValue)); authPane.disableProperty().bind(chkProxyAuthentication.selectedProperty().not()); - fileCommonLocation.pathProperty().bindBidirectional(Settings.INSTANCE.commonPathProperty()); + fileCommonLocation.pathProperty().bindBidirectional(ConfigHolder.CONFIG.commonDirectory); FXUtils.installTooltip(btnUpdate, i18n("update.tooltip")); checkUpdate(); From bbbe3726f212065957e386b3320271ea5953ca24 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 18:11:25 +0800 Subject: [PATCH 05/20] Remove backgroundImageProperty --- .../org/jackhuang/hmcl/setting/Settings.java | 21 ------------------- .../java/org/jackhuang/hmcl/ui/Decorator.java | 3 ++- .../org/jackhuang/hmcl/ui/SettingsPage.java | 7 ++++--- 3 files changed, 6 insertions(+), 25 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 9b1e0dcee..9b53af874 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -308,27 +308,6 @@ public class Settings { * BACKGROUND * ****************************************/ - private final ImmediateStringProperty backgroundImage = new ImmediateStringProperty(this, "backgroundImage", ConfigHolder.CONFIG.backgroundImage.get()) { - @Override - public void invalidated() { - super.invalidated(); - - ConfigHolder.CONFIG.backgroundImage.set(get()); - } - }; - - public String getBackgroundImage() { - return backgroundImage.get(); - } - - public ImmediateStringProperty backgroundImageProperty() { - return backgroundImage; - } - - public void setBackgroundImage(String backgroundImage) { - this.backgroundImage.set(backgroundImage); - } - private final ImmediateObjectProperty backgroundImageType = new ImmediateObjectProperty(this, "backgroundImageType", EnumBackgroundImage.indexOf(ConfigHolder.CONFIG.backgroundImageType.get())) { @Override public void invalidated() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index 41695e1cb..bb1bab43c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -55,6 +55,7 @@ import javafx.stage.StageStyle; import javafx.util.Duration; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorDnD; +import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.EnumBackgroundImage; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.setting.Theme; @@ -222,7 +223,7 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza if (Settings.INSTANCE.getBackgroundImageType() == EnumBackgroundImage.DEFAULT) background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ""); else - background = searchBackgroundImage(new Image("/assets/img/background.jpg"), Settings.INSTANCE.getBackgroundImage()); + background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ConfigHolder.CONFIG.backgroundImage.get()); drawerWrapper.setBackground(new Background(new BackgroundImage(background, BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT, new BackgroundSize(800, 480, false, false, true, true)))); } catch (IllegalArgumentException ignore) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index c1d1e1860..ca21a4272 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -44,6 +44,7 @@ import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.i18n.Locales; +import static org.jackhuang.hmcl.ui.FXUtils.onInvalidating; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.net.Proxy; @@ -186,12 +187,12 @@ public final class SettingsPage extends StackPane implements DecoratorPage { backgroundItem.createChildren(i18n("launcher.background.default"), EnumBackgroundImage.DEFAULT) )); - FXUtils.bindString(backgroundItem.getTxtCustom(), Settings.INSTANCE.backgroundImageProperty()); + FXUtils.bindString(backgroundItem.getTxtCustom(), ConfigHolder.CONFIG.backgroundImage); backgroundItem.setCustomUserData(EnumBackgroundImage.CUSTOM); backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == Settings.INSTANCE.getBackgroundImageType()).findFirst().ifPresent(it -> it.setSelected(true)); - Settings.INSTANCE.backgroundImageProperty().setChangedListener(it -> initBackgroundItemSubtitle()); + ConfigHolder.CONFIG.backgroundImage.addListener(onInvalidating(this::initBackgroundItemSubtitle)); Settings.INSTANCE.backgroundImageTypeProperty().setChangedListener(it -> initBackgroundItemSubtitle()); initBackgroundItemSubtitle(); @@ -218,7 +219,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { backgroundItem.setSubtitle(i18n("launcher.background.default")); break; case CUSTOM: - backgroundItem.setSubtitle(Settings.INSTANCE.getBackgroundImage()); + backgroundItem.setSubtitle(ConfigHolder.CONFIG.backgroundImage.get()); break; } } From 846f383f7b0aa6853bc8c7516d329c25cfb0052e Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 18:48:53 +0800 Subject: [PATCH 06/20] Remove backgroundImageTypeProperty --- .../org/jackhuang/hmcl/setting/Config.java | 6 +- .../org/jackhuang/hmcl/setting/Settings.java | 25 -------- .../java/org/jackhuang/hmcl/ui/Decorator.java | 2 +- .../org/jackhuang/hmcl/ui/SettingsPage.java | 8 +-- .../hmcl/util/EnumOrdinalDeserializer.java | 63 +++++++++++++++++++ 5 files changed, 73 insertions(+), 31 deletions(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/util/EnumOrdinalDeserializer.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java index d5b3082d3..6231714a4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -29,6 +29,7 @@ import org.hildan.fxgson.creators.ObservableSetCreator; import org.hildan.fxgson.factories.JavaFxPropertyTypeAdapterFactory; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; +import org.jackhuang.hmcl.util.EnumOrdinalDeserializer; import org.jackhuang.hmcl.util.FileTypeAdapter; import org.jackhuang.hmcl.util.ObservableHelper; @@ -42,9 +43,11 @@ import javafx.beans.Observable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; import javafx.beans.property.IntegerProperty; +import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; @@ -62,6 +65,7 @@ public final class Config implements Cloneable, Observable { .registerTypeAdapter(ObservableSet.class, new ObservableSetCreator()) .registerTypeAdapter(ObservableMap.class, new ObservableMapCreator()) .registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true)) + .registerTypeAdapter(EnumBackgroundImage.class, new EnumOrdinalDeserializer<>(EnumBackgroundImage.class)) // backward compatibility for backgroundType .setPrettyPrinting() .create(); @@ -77,7 +81,7 @@ public final class Config implements Cloneable, Observable { public final StringProperty selectedProfile = new SimpleStringProperty(""); @SerializedName("backgroundType") - public final IntegerProperty backgroundImageType = new SimpleIntegerProperty(0); + public final ObjectProperty backgroundImageType = new SimpleObjectProperty<>(EnumBackgroundImage.DEFAULT); @SerializedName("bgpath") public final StringProperty backgroundImage = new SimpleStringProperty(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 9b53af874..3ff7b0022 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -304,31 +304,6 @@ public class Settings { selectedAccount.get(); } - /**************************************** - * BACKGROUND * - ****************************************/ - - private final ImmediateObjectProperty backgroundImageType = new ImmediateObjectProperty(this, "backgroundImageType", EnumBackgroundImage.indexOf(ConfigHolder.CONFIG.backgroundImageType.get())) { - @Override - public void invalidated() { - super.invalidated(); - - ConfigHolder.CONFIG.backgroundImageType.set(get().ordinal()); - } - }; - - public EnumBackgroundImage getBackgroundImageType() { - return backgroundImageType.get(); - } - - public ImmediateObjectProperty backgroundImageTypeProperty() { - return backgroundImageType; - } - - public void setBackgroundImageType(EnumBackgroundImage backgroundImageType) { - this.backgroundImageType.set(backgroundImageType); - } - /**************************************** * THEME * ****************************************/ diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index bb1bab43c..ef6f0a767 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -220,7 +220,7 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza try { Image background; - if (Settings.INSTANCE.getBackgroundImageType() == EnumBackgroundImage.DEFAULT) + if (ConfigHolder.CONFIG.backgroundImageType.get() == EnumBackgroundImage.DEFAULT) background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ""); else background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ConfigHolder.CONFIG.backgroundImage.get()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index ca21a4272..2d547d118 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -190,14 +190,14 @@ public final class SettingsPage extends StackPane implements DecoratorPage { FXUtils.bindString(backgroundItem.getTxtCustom(), ConfigHolder.CONFIG.backgroundImage); backgroundItem.setCustomUserData(EnumBackgroundImage.CUSTOM); - backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == Settings.INSTANCE.getBackgroundImageType()).findFirst().ifPresent(it -> it.setSelected(true)); + backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == ConfigHolder.CONFIG.backgroundImageType.get()).findFirst().ifPresent(it -> it.setSelected(true)); ConfigHolder.CONFIG.backgroundImage.addListener(onInvalidating(this::initBackgroundItemSubtitle)); - Settings.INSTANCE.backgroundImageTypeProperty().setChangedListener(it -> initBackgroundItemSubtitle()); + ConfigHolder.CONFIG.backgroundImageType.addListener(onInvalidating(this::initBackgroundItemSubtitle)); initBackgroundItemSubtitle(); backgroundItem.setToggleSelectedListener(newValue -> - Settings.INSTANCE.setBackgroundImageType((EnumBackgroundImage) newValue.getUserData())); + ConfigHolder.CONFIG.backgroundImageType.set((EnumBackgroundImage) newValue.getUserData())); // theme JFXColorPicker picker = new JFXColorPicker(Color.web(Settings.INSTANCE.getTheme().getColor()), null); @@ -214,7 +214,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { } private void initBackgroundItemSubtitle() { - switch (Settings.INSTANCE.getBackgroundImageType()) { + switch (ConfigHolder.CONFIG.backgroundImageType.get()) { case DEFAULT: backgroundItem.setSubtitle(i18n("launcher.background.default")); break; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/EnumOrdinalDeserializer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/EnumOrdinalDeserializer.java new file mode 100644 index 000000000..e1c3cc95b --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/EnumOrdinalDeserializer.java @@ -0,0 +1,63 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.util; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.annotations.SerializedName; + +/** + * A deserializer that supports deserializing strings and **numbers** into enums. + * + * @author yushijinhun + */ +public class EnumOrdinalDeserializer> implements JsonDeserializer { + + private Map mapping = new HashMap<>(); + + public EnumOrdinalDeserializer(Class enumClass) { + for (T constant : enumClass.getEnumConstants()) { + mapping.put(String.valueOf(constant.ordinal()), constant); + String name = constant.name(); + try { + SerializedName annotation = enumClass.getField(name).getAnnotation(SerializedName.class); + if (annotation != null) { + name = annotation.value(); + for (String alternate : annotation.alternate()) { + mapping.put(alternate, constant); + } + } + } catch (NoSuchFieldException e) { + throw new AssertionError(e); + } + mapping.put(name, constant); + } + } + + @Override + public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + return mapping.get(json.getAsString()); + } + +} From a6a1755feebde56a1621d32430222c19fcd255f7 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 18:56:07 +0800 Subject: [PATCH 07/20] Remove getRawConfig --- HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java | 4 ---- .../org/jackhuang/hmcl/ui/export/ExportWizardProvider.java | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 3ff7b0022..ec0026fbd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -423,8 +423,4 @@ public class Settings { public void onAccountLoading() { EventBus.EVENT_BUS.fireEvent(new AccountLoadingEvent(this, getAccounts())); } - - public Config getRawConfig() { - return ConfigHolder.CONFIG.clone(); - } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java index 9e8730110..8e1aa4933 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java @@ -81,7 +81,7 @@ public final class ExportWizardProvider implements WizardProvider { boolean flag = true; try (ZipEngine zip = new ZipEngine(modpackFile)) { - Config config = Settings.INSTANCE.getRawConfig(); + Config config = ConfigHolder.CONFIG.clone(); config.hasProxy.set(false); config.selectedProfile.set(""); From 8e0559fb3b6e07d18f2e3528b7a5b11a22dd29d7 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 19:24:53 +0800 Subject: [PATCH 08/20] Remove proxyType --- .../org/jackhuang/hmcl/setting/Config.java | 4 ++- .../org/jackhuang/hmcl/setting/Proxies.java | 36 ------------------- .../org/jackhuang/hmcl/setting/Settings.java | 16 ++------- .../org/jackhuang/hmcl/ui/SettingsPage.java | 4 +-- 4 files changed, 7 insertions(+), 53 deletions(-) delete mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/setting/Proxies.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java index 6231714a4..960c314a3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -19,6 +19,7 @@ package org.jackhuang.hmcl.setting; import java.io.File; import java.lang.reflect.Modifier; +import java.net.Proxy; import java.util.Map; import java.util.TreeMap; import java.util.stream.Stream; @@ -66,6 +67,7 @@ public final class Config implements Cloneable, Observable { .registerTypeAdapter(ObservableMap.class, new ObservableMapCreator()) .registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true)) .registerTypeAdapter(EnumBackgroundImage.class, new EnumOrdinalDeserializer<>(EnumBackgroundImage.class)) // backward compatibility for backgroundType + .registerTypeAdapter(Proxy.Type.class, new EnumOrdinalDeserializer<>(Proxy.Type.class)) // backward compatibility for hasProxy .setPrettyPrinting() .create(); @@ -96,7 +98,7 @@ public final class Config implements Cloneable, Observable { public final BooleanProperty hasProxyAuth = new SimpleBooleanProperty(); @SerializedName("proxyType") - public final IntegerProperty proxyType = new SimpleIntegerProperty(); + public final ObjectProperty proxyType = new SimpleObjectProperty<>(Proxy.Type.DIRECT); @SerializedName("proxyHost") public final StringProperty proxyHost = new SimpleStringProperty(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Proxies.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Proxies.java deleted file mode 100644 index 919351d30..000000000 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Proxies.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2018 huangyuhui - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hmcl.setting; - -import org.jackhuang.hmcl.util.Lang; - -import java.net.Proxy; -import java.util.List; - -/** - * @author huangyuhui - */ -public final class Proxies { - private Proxies() {} - - public static final List PROXIES = Lang.immutableListOf(Proxy.Type.DIRECT, Proxy.Type.HTTP, Proxy.Type.SOCKS); - - public static Proxy.Type getProxyType(int index) { - return Lang.get(PROXIES, index).orElse(null); - } -} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index ec0026fbd..b06ed7848 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -137,27 +137,15 @@ public class Settings { return proxy; } - private Proxy.Type proxyType = Proxies.getProxyType(ConfigHolder.CONFIG.proxyType.get()); - - public Proxy.Type getProxyType() { - return proxyType; - } - - public void setProxyType(Proxy.Type proxyType) { - this.proxyType = proxyType; - ConfigHolder.CONFIG.proxyType.set(Proxies.PROXIES.indexOf(proxyType)); - loadProxy(); - } - private void loadProxy() { String host = ConfigHolder.CONFIG.proxyHost.get(); Integer port = Lang.toIntOrNull(ConfigHolder.CONFIG.proxyPort.get()); - if (!ConfigHolder.CONFIG.hasProxy.get() || StringUtils.isBlank(host) || port == null || getProxyType() == Proxy.Type.DIRECT) + if (!ConfigHolder.CONFIG.hasProxy.get() || StringUtils.isBlank(host) || port == null || ConfigHolder.CONFIG.proxyType.get() == Proxy.Type.DIRECT) proxy = Proxy.NO_PROXY; else { System.setProperty("http.proxyHost", ConfigHolder.CONFIG.proxyHost.get()); System.setProperty("http.proxyPort", ConfigHolder.CONFIG.proxyPort.get()); - proxy = new Proxy(proxyType, new InetSocketAddress(host, port)); + proxy = new Proxy(ConfigHolder.CONFIG.proxyType.get(), new InetSocketAddress(host, port)); String user = ConfigHolder.CONFIG.proxyUser.get(); String pass = ConfigHolder.CONFIG.proxyPass.get(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index 2d547d118..e496a2bac 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -155,7 +155,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { chkProxySocks.setToggleGroup(proxyConfigurationGroup); for (Toggle toggle : proxyConfigurationGroup.getToggles()) - if (toggle.getUserData() == Settings.INSTANCE.getProxyType()) + if (toggle.getUserData() == ConfigHolder.CONFIG.proxyType.get()) toggle.setSelected(true); ToggleGroup hasProxyGroup = new ToggleGroup(); @@ -171,7 +171,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { ConfigHolder.CONFIG.hasProxy.set(newValue != chkNoProxy)); proxyConfigurationGroup.selectedToggleProperty().addListener((a, b, newValue) -> - Settings.INSTANCE.setProxyType((Proxy.Type) newValue.getUserData())); + ConfigHolder.CONFIG.proxyType.set((Proxy.Type) newValue.getUserData())); chkProxyAuthentication.setSelected(ConfigHolder.CONFIG.hasProxyAuth.get()); chkProxyAuthentication.selectedProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.hasProxyAuth.set(newValue)); From 5642c579a401599b12a4153cff9a26a712050edd Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 21:00:05 +0800 Subject: [PATCH 09/20] Add ProxyManager --- .../jackhuang/hmcl/game/AccountHelper.java | 5 +- .../org/jackhuang/hmcl/setting/Profile.java | 2 +- .../jackhuang/hmcl/setting/ProxyManager.java | 137 ++++++++++++++++++ .../org/jackhuang/hmcl/setting/Settings.java | 40 +---- .../org/jackhuang/hmcl/ui/AddAccountPane.java | 5 +- 5 files changed, 146 insertions(+), 43 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java index 7bc572bd2..1ef663c39 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java @@ -24,6 +24,7 @@ import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.yggdrasil.GameProfile; import org.jackhuang.hmcl.auth.yggdrasil.Texture; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; +import org.jackhuang.hmcl.setting.ProxyManager; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Scheduler; @@ -55,7 +56,7 @@ public final class AccountHelper { } public static Task loadSkinAsync(YggdrasilAccount account) { - return loadSkinAsync(account, Settings.INSTANCE.getProxy()); + return loadSkinAsync(account, ProxyManager.getProxy()); } public static Task loadSkinAsync(YggdrasilAccount account, Proxy proxy) { @@ -63,7 +64,7 @@ public final class AccountHelper { } public static Task refreshSkinAsync(YggdrasilAccount account) { - return refreshSkinAsync(account, Settings.INSTANCE.getProxy()); + return refreshSkinAsync(account, ProxyManager.getProxy()); } public static Task refreshSkinAsync(YggdrasilAccount account, Proxy proxy) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java index 0c44eb222..8ffd57580 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java @@ -122,7 +122,7 @@ public final class Profile { } public HMCLDependencyManager getDependency() { - return new HMCLDependencyManager(this, Settings.INSTANCE.getDownloadProvider(), Settings.INSTANCE.getProxy()); + return new HMCLDependencyManager(this, Settings.INSTANCE.getDownloadProvider(), ProxyManager.getProxy()); } public VersionSetting getVersionSetting(String id) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java new file mode 100644 index 000000000..32976e604 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java @@ -0,0 +1,137 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.setting; + +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.Proxy.Type; + +import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.StringUtils; + +import javafx.beans.InvalidationListener; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.ObjectBinding; + +public final class ProxyManager { + private ProxyManager() { + } + + public static final ObjectBinding proxyProperty = Bindings.createObjectBinding( + () -> { + String host = ConfigHolder.CONFIG.proxyHost.get(); + Integer port = Lang.toIntOrNull(ConfigHolder.CONFIG.proxyPort.get()); + if (!ConfigHolder.CONFIG.hasProxy.get() || StringUtils.isBlank(host) || port == null || ConfigHolder.CONFIG.proxyType.get() == Proxy.Type.DIRECT) { + return Proxy.NO_PROXY; + } else { + return new Proxy(ConfigHolder.CONFIG.proxyType.get(), new InetSocketAddress(host, port)); + } + }, + ConfigHolder.CONFIG.proxyType, + ConfigHolder.CONFIG.proxyHost, + ConfigHolder.CONFIG.proxyPort, + ConfigHolder.CONFIG.hasProxy); + + public static Proxy getProxy() { + return proxyProperty.get(); + } + + static { + initProxy(); + } + + private static void initProxy() { + proxyProperty.addListener(observable -> updateSystemProxy()); + + InvalidationListener onProxyAuthChanged = observable -> updateSystemProxyAuthentication(); + ConfigHolder.CONFIG.proxyUser.addListener(onProxyAuthChanged); + ConfigHolder.CONFIG.proxyPass.addListener(onProxyAuthChanged); + ConfigHolder.CONFIG.hasProxyAuth.addListener(onProxyAuthChanged); + ConfigHolder.CONFIG.hasProxy.addListener(onProxyAuthChanged); + ConfigHolder.CONFIG.proxyType.addListener(onProxyAuthChanged); + + updateSystemProxy(); + updateSystemProxyAuthentication(); + } + + private static void updateSystemProxy() { + Proxy proxy = proxyProperty.get(); + if (proxy.type() == Proxy.Type.DIRECT) { + System.clearProperty("http.proxyHost"); + System.clearProperty("http.proxyPort"); + System.clearProperty("https.proxyHost"); + System.clearProperty("https.proxyPort"); + System.clearProperty("socksProxyHost"); + System.clearProperty("socksProxyPort"); + } else { + InetSocketAddress address = (InetSocketAddress) proxy.address(); + String host = address.getHostString(); + String port = String.valueOf(address.getPort()); + if (proxy.type() == Type.HTTP) { + System.clearProperty("socksProxyHost"); + System.clearProperty("socksProxyPort"); + System.setProperty("http.proxyHost", host); + System.setProperty("http.proxyPort", port); + System.setProperty("https.proxyHost", host); + System.setProperty("https.proxyPort", port); + } else if (proxy.type() == Type.SOCKS) { + System.clearProperty("http.proxyHost"); + System.clearProperty("http.proxyPort"); + System.clearProperty("https.proxyHost"); + System.clearProperty("https.proxyPort"); + System.setProperty("socksProxyHost", host); + System.setProperty("socksProxyPort", port); + } + } + + } + + private static void updateSystemProxyAuthentication() { + String username = ConfigHolder.CONFIG.proxyUser.get(); + String password = ConfigHolder.CONFIG.proxyPass.get(); + Proxy.Type proxyType = ConfigHolder.CONFIG.proxyType.get(); + if (ConfigHolder.CONFIG.hasProxy.get() && + ConfigHolder.CONFIG.hasProxyAuth.get() && + proxyType != Proxy.Type.DIRECT && + username != null && + password != null) { + if (proxyType == Proxy.Type.HTTP) { + System.setProperty("http.proxyUser", username); + System.setProperty("http.proxyPassword", password); + System.setProperty("https.proxyUser", username); + System.setProperty("https.proxyPassword", password); + System.clearProperty("java.net.socks.username"); + System.clearProperty("java.net.socks.password"); + } else if (proxyType == Proxy.Type.SOCKS) { + System.setProperty("java.net.socks.username", username); + System.setProperty("java.net.socks.password", password); + System.clearProperty("http.proxyUser"); + System.clearProperty("http.proxyPassword"); + System.clearProperty("https.proxyUser"); + System.clearProperty("https.proxyPassword"); + } + } else { + System.clearProperty("http.proxyUser"); + System.clearProperty("http.proxyPassword"); + System.clearProperty("https.proxyUser"); + System.clearProperty("https.proxyPassword"); + System.clearProperty("java.net.socks.username"); + System.clearProperty("java.net.socks.password"); + } + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index b06ed7848..ef90e9b18 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -33,10 +33,6 @@ import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.util.*; import org.jackhuang.hmcl.util.i18n.Locales; -import java.net.Authenticator; -import java.net.InetSocketAddress; -import java.net.PasswordAuthentication; -import java.net.Proxy; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; @@ -69,7 +65,7 @@ public class Settings { firstLaunch = ConfigHolder.CONFIG.firstLaunch.get(); ConfigHolder.CONFIG.firstLaunch.set(false); - loadProxy(); + ProxyManager.getProxy(); // init ProxyManager for (Iterator> iterator = ConfigHolder.CONFIG.accounts.iterator(); iterator.hasNext();) { Map settings = iterator.next(); @@ -82,7 +78,7 @@ public class Settings { Account account; try { - account = factory.fromStorage(settings, getProxy()); + account = factory.fromStorage(settings, ProxyManager.getProxy()); } catch (Exception e) { LOG.log(Level.WARNING, "Malformed account storage, removing: " + settings, e); iterator.remove(); @@ -131,38 +127,6 @@ public class Settings { ConfigHolder.CONFIG.localization.set(Locales.getNameByLocale(locale)); } - private Proxy proxy = Proxy.NO_PROXY; - - public Proxy getProxy() { - return proxy; - } - - private void loadProxy() { - String host = ConfigHolder.CONFIG.proxyHost.get(); - Integer port = Lang.toIntOrNull(ConfigHolder.CONFIG.proxyPort.get()); - if (!ConfigHolder.CONFIG.hasProxy.get() || StringUtils.isBlank(host) || port == null || ConfigHolder.CONFIG.proxyType.get() == Proxy.Type.DIRECT) - proxy = Proxy.NO_PROXY; - else { - System.setProperty("http.proxyHost", ConfigHolder.CONFIG.proxyHost.get()); - System.setProperty("http.proxyPort", ConfigHolder.CONFIG.proxyPort.get()); - proxy = new Proxy(ConfigHolder.CONFIG.proxyType.get(), new InetSocketAddress(host, port)); - - String user = ConfigHolder.CONFIG.proxyUser.get(); - String pass = ConfigHolder.CONFIG.proxyPass.get(); - if (ConfigHolder.CONFIG.hasProxyAuth.get() && StringUtils.isNotBlank(user) && StringUtils.isNotBlank(pass)) { - System.setProperty("http.proxyUser", user); - System.setProperty("http.proxyPassword", pass); - - Authenticator.setDefault(new Authenticator() { - @Override - public PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(user, pass.toCharArray()); - } - }); - } - } - } - public Font getFont() { return Font.font(ConfigHolder.CONFIG.fontFamily.get(), ConfigHolder.CONFIG.fontSize.get()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index 65f83b772..92830186e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -42,6 +42,7 @@ import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; import org.jackhuang.hmcl.game.AccountHelper; import org.jackhuang.hmcl.setting.Accounts; import org.jackhuang.hmcl.setting.ConfigHolder; +import org.jackhuang.hmcl.setting.ProxyManager; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; @@ -151,7 +152,7 @@ public class AddAccountPane extends StackPane { lblCreationWarning.setText(""); setDisable(true); - Task.ofResult("create_account", () -> factory.create(new Selector(), username, password, addtionalData, Settings.INSTANCE.getProxy())) + Task.ofResult("create_account", () -> factory.create(new Selector(), username, password, addtionalData, ProxyManager.getProxy())) .finalized(Schedulers.javafx(), variables -> { Settings.INSTANCE.addAccount(variables.get("create_account")); acceptPane.hideSpinner(); @@ -211,7 +212,7 @@ public class AddAccountPane extends StackPane { for (GameProfile profile : names) { Image image; try { - image = AccountHelper.getSkinImmediately(yggdrasilAccount, profile, 4, Settings.INSTANCE.getProxy()); + image = AccountHelper.getSkinImmediately(yggdrasilAccount, profile, 4, ProxyManager.getProxy()); } catch (Exception e) { Logging.LOG.log(Level.WARNING, "Failed to get skin for " + profile.getName(), e); image = null; From 985a4f07e0a9aec174255dcf460d539dee1ca49f Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 21:25:44 +0800 Subject: [PATCH 10/20] Use Authenticator to set proxy username/password --- .../jackhuang/hmcl/setting/ProxyManager.java | 61 ++++++------------- 1 file changed, 17 insertions(+), 44 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java index 32976e604..8d797db05 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java @@ -17,14 +17,15 @@ */ package org.jackhuang.hmcl.setting; +import java.net.Authenticator; import java.net.InetSocketAddress; +import java.net.PasswordAuthentication; import java.net.Proxy; import java.net.Proxy.Type; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; -import javafx.beans.InvalidationListener; import javafx.beans.binding.Bindings; import javafx.beans.binding.ObjectBinding; @@ -58,15 +59,22 @@ public final class ProxyManager { private static void initProxy() { proxyProperty.addListener(observable -> updateSystemProxy()); - InvalidationListener onProxyAuthChanged = observable -> updateSystemProxyAuthentication(); - ConfigHolder.CONFIG.proxyUser.addListener(onProxyAuthChanged); - ConfigHolder.CONFIG.proxyPass.addListener(onProxyAuthChanged); - ConfigHolder.CONFIG.hasProxyAuth.addListener(onProxyAuthChanged); - ConfigHolder.CONFIG.hasProxy.addListener(onProxyAuthChanged); - ConfigHolder.CONFIG.proxyType.addListener(onProxyAuthChanged); - updateSystemProxy(); - updateSystemProxyAuthentication(); + + Authenticator.setDefault(new Authenticator() { + + @Override + protected PasswordAuthentication getPasswordAuthentication() { + if (ConfigHolder.CONFIG.hasProxyAuth.get()) { + String username = ConfigHolder.CONFIG.proxyUser.get(); + String password = ConfigHolder.CONFIG.proxyPass.get(); + if (username != null && password != null) { + return new PasswordAuthentication(username, password.toCharArray()); + } + } + return null; + } + }); } private static void updateSystemProxy() { @@ -98,40 +106,5 @@ public final class ProxyManager { System.setProperty("socksProxyPort", port); } } - - } - - private static void updateSystemProxyAuthentication() { - String username = ConfigHolder.CONFIG.proxyUser.get(); - String password = ConfigHolder.CONFIG.proxyPass.get(); - Proxy.Type proxyType = ConfigHolder.CONFIG.proxyType.get(); - if (ConfigHolder.CONFIG.hasProxy.get() && - ConfigHolder.CONFIG.hasProxyAuth.get() && - proxyType != Proxy.Type.DIRECT && - username != null && - password != null) { - if (proxyType == Proxy.Type.HTTP) { - System.setProperty("http.proxyUser", username); - System.setProperty("http.proxyPassword", password); - System.setProperty("https.proxyUser", username); - System.setProperty("https.proxyPassword", password); - System.clearProperty("java.net.socks.username"); - System.clearProperty("java.net.socks.password"); - } else if (proxyType == Proxy.Type.SOCKS) { - System.setProperty("java.net.socks.username", username); - System.setProperty("java.net.socks.password", password); - System.clearProperty("http.proxyUser"); - System.clearProperty("http.proxyPassword"); - System.clearProperty("https.proxyUser"); - System.clearProperty("https.proxyPassword"); - } - } else { - System.clearProperty("http.proxyUser"); - System.clearProperty("http.proxyPassword"); - System.clearProperty("https.proxyUser"); - System.clearProperty("https.proxyPassword"); - System.clearProperty("java.net.socks.username"); - System.clearProperty("java.net.socks.password"); - } } } From ea6108dca7875cdd6c01296e393a79a5641c7547 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 21:36:10 +0800 Subject: [PATCH 11/20] Use bindBidirectional --- .../org/jackhuang/hmcl/ui/SettingsPage.java | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index e496a2bac..b00f1c892 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -105,17 +105,10 @@ public final class SettingsPage extends StackPane implements DecoratorPage { FXUtils.smoothScrolling(scroll); - txtProxyHost.setText(ConfigHolder.CONFIG.proxyHost.get()); - txtProxyHost.textProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyHost.set(newValue)); - - txtProxyPort.setText(ConfigHolder.CONFIG.proxyPort.get()); - txtProxyPort.textProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyPort.set(newValue)); - - txtProxyUsername.setText(ConfigHolder.CONFIG.proxyUser.get()); - txtProxyUsername.textProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyUser.set(newValue)); - - txtProxyPassword.setText(ConfigHolder.CONFIG.proxyPass.get()); - txtProxyPassword.textProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyPass.set(newValue)); + txtProxyHost.textProperty().bindBidirectional(ConfigHolder.CONFIG.proxyHost); + txtProxyPort.textProperty().bindBidirectional(ConfigHolder.CONFIG.proxyPort); + txtProxyUsername.textProperty().bindBidirectional(ConfigHolder.CONFIG.proxyUser); + txtProxyPassword.textProperty().bindBidirectional(ConfigHolder.CONFIG.proxyPass); cboDownloadSource.getSelectionModel().select(DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(Settings.INSTANCE.getDownloadProvider())); cboDownloadSource.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setDownloadProvider(DownloadProviders.getDownloadProvider(newValue.intValue()))); @@ -173,8 +166,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { proxyConfigurationGroup.selectedToggleProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.proxyType.set((Proxy.Type) newValue.getUserData())); - chkProxyAuthentication.setSelected(ConfigHolder.CONFIG.hasProxyAuth.get()); - chkProxyAuthentication.selectedProperty().addListener((a, b, newValue) -> ConfigHolder.CONFIG.hasProxyAuth.set(newValue)); + chkProxyAuthentication.selectedProperty().bindBidirectional(ConfigHolder.CONFIG.hasProxyAuth); authPane.disableProperty().bind(chkProxyAuthentication.selectedProperty().not()); fileCommonLocation.pathProperty().bindBidirectional(ConfigHolder.CONFIG.commonDirectory); From 8236f613e002863813d3382a4f40e375a44785b8 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 23:12:46 +0800 Subject: [PATCH 12/20] Use static import for ConfigHolder.CONFIG --- .../hmcl/game/HMCLGameDownloadTask.java | 5 +- .../hmcl/game/HMCLGameRepository.java | 7 ++- .../org/jackhuang/hmcl/setting/Accounts.java | 5 +- .../jackhuang/hmcl/setting/ProxyManager.java | 24 ++++---- .../org/jackhuang/hmcl/setting/Settings.java | 55 ++++++++++--------- .../hmcl/setting/VersionSetting.java | 10 ++-- .../org/jackhuang/hmcl/ui/AddAccountPane.java | 4 +- .../hmcl/ui/AddAuthlibInjectorServerPane.java | 7 ++- .../hmcl/ui/AuthlibInjectorServersPage.java | 9 +-- .../java/org/jackhuang/hmcl/ui/Decorator.java | 7 ++- .../org/jackhuang/hmcl/ui/SettingsPage.java | 35 ++++++------ 11 files changed, 90 insertions(+), 78 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java index fc7273edf..ad3217fad 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java @@ -17,7 +17,6 @@ */ package org.jackhuang.hmcl.game; -import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck; @@ -32,6 +31,8 @@ import java.util.LinkedList; import java.util.List; import java.util.logging.Level; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + /** * @author huangyuhui */ @@ -58,7 +59,7 @@ public class HMCLGameDownloadTask extends Task { public void execute() { File jar = profile.getRepository().getVersionJar(version); - File cache = new File(ConfigHolder.CONFIG.commonDirectory.get(), "jars/" + gameVersion + ".jar"); + File cache = new File(CONFIG.commonDirectory.get(), "jars/" + gameVersion + ".jar"); if (cache.exists()) try { FileUtils.copyFile(cache, jar); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index c2ad1907e..37867a3da 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -22,7 +22,6 @@ import com.google.gson.GsonBuilder; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; import org.jackhuang.hmcl.event.RefreshingVersionsEvent; -import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.EnumGameDirectory; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.VersionSetting; @@ -34,6 +33,8 @@ import java.io.IOException; import java.util.*; import java.util.logging.Level; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + public class HMCLGameRepository extends DefaultGameRepository { private final Profile profile; private final Map versionSettings = new HashMap<>(); @@ -60,7 +61,7 @@ public class HMCLGameRepository extends DefaultGameRepository { if (useSelf(version, assetId)) return super.getAssetDirectory(version, assetId); else - return new File(ConfigHolder.CONFIG.commonDirectory.get(), "assets"); + return new File(CONFIG.commonDirectory.get(), "assets"); } @Override @@ -85,7 +86,7 @@ public class HMCLGameRepository extends DefaultGameRepository { if (self.exists() || vs.isNoCommon()) return self; else - return new File(ConfigHolder.CONFIG.commonDirectory.get(), "libraries/" + lib.getPath()); + return new File(CONFIG.commonDirectory.get(), "libraries/" + lib.getPath()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index 453306eb2..30d16ca3b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.util.Map; import java.util.logging.Level; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.Pair.pair; @@ -71,7 +72,7 @@ public final class Accounts { } private static AuthlibInjectorServer getOrCreateAuthlibInjectorServer(String url) { - return ConfigHolder.CONFIG.authlibInjectorServers.stream() + return CONFIG.authlibInjectorServers.stream() .filter(server -> url.equals(server.getUrl())) .findFirst() .orElseGet(() -> { @@ -85,7 +86,7 @@ public final class Accounts { LOG.log(Level.WARNING, "Failed to migrate authlib injector server " + url, e); } - ConfigHolder.CONFIG.authlibInjectorServers.add(server); + CONFIG.authlibInjectorServers.add(server); return server; }); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java index 8d797db05..5f4687a29 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java @@ -17,6 +17,8 @@ */ package org.jackhuang.hmcl.setting; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + import java.net.Authenticator; import java.net.InetSocketAddress; import java.net.PasswordAuthentication; @@ -35,18 +37,18 @@ public final class ProxyManager { public static final ObjectBinding proxyProperty = Bindings.createObjectBinding( () -> { - String host = ConfigHolder.CONFIG.proxyHost.get(); - Integer port = Lang.toIntOrNull(ConfigHolder.CONFIG.proxyPort.get()); - if (!ConfigHolder.CONFIG.hasProxy.get() || StringUtils.isBlank(host) || port == null || ConfigHolder.CONFIG.proxyType.get() == Proxy.Type.DIRECT) { + String host = CONFIG.proxyHost.get(); + Integer port = Lang.toIntOrNull(CONFIG.proxyPort.get()); + if (!CONFIG.hasProxy.get() || StringUtils.isBlank(host) || port == null || CONFIG.proxyType.get() == Proxy.Type.DIRECT) { return Proxy.NO_PROXY; } else { - return new Proxy(ConfigHolder.CONFIG.proxyType.get(), new InetSocketAddress(host, port)); + return new Proxy(CONFIG.proxyType.get(), new InetSocketAddress(host, port)); } }, - ConfigHolder.CONFIG.proxyType, - ConfigHolder.CONFIG.proxyHost, - ConfigHolder.CONFIG.proxyPort, - ConfigHolder.CONFIG.hasProxy); + CONFIG.proxyType, + CONFIG.proxyHost, + CONFIG.proxyPort, + CONFIG.hasProxy); public static Proxy getProxy() { return proxyProperty.get(); @@ -65,9 +67,9 @@ public final class ProxyManager { @Override protected PasswordAuthentication getPasswordAuthentication() { - if (ConfigHolder.CONFIG.hasProxyAuth.get()) { - String username = ConfigHolder.CONFIG.proxyUser.get(); - String password = ConfigHolder.CONFIG.proxyPass.get(); + if (CONFIG.hasProxyAuth.get()) { + String username = CONFIG.proxyUser.get(); + String password = CONFIG.proxyPass.get(); if (username != null && password != null) { return new PasswordAuthentication(username, password.toCharArray()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index ef90e9b18..9ff4d67a2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -39,6 +39,7 @@ import java.util.logging.Level; import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; import static org.jackhuang.hmcl.ui.FXUtils.onInvalidating; import static org.jackhuang.hmcl.util.Lang.tryCast; import static org.jackhuang.hmcl.util.Logging.LOG; @@ -52,7 +53,7 @@ public class Settings { private final boolean firstLaunch; private InvalidationListener accountChangeListener = - source -> ConfigHolder.CONFIG.accounts.setAll( + source -> CONFIG.accounts.setAll( accounts.values().stream() .map(account -> { Map storage = account.toStorage(); @@ -62,12 +63,12 @@ public class Settings { .collect(toList())); private Settings() { - firstLaunch = ConfigHolder.CONFIG.firstLaunch.get(); - ConfigHolder.CONFIG.firstLaunch.set(false); + firstLaunch = CONFIG.firstLaunch.get(); + CONFIG.firstLaunch.set(false); ProxyManager.getProxy(); // init ProxyManager - for (Iterator> iterator = ConfigHolder.CONFIG.accounts.iterator(); iterator.hasNext();) { + for (Iterator> iterator = CONFIG.accounts.iterator(); iterator.hasNext();) { Map settings = iterator.next(); AccountFactory factory = Accounts.ACCOUNT_FACTORY.get(tryCast(settings.get("type"), String.class).orElse("")); if (factory == null) { @@ -89,9 +90,9 @@ public class Settings { account.addListener(accountChangeListener); } - ConfigHolder.CONFIG.authlibInjectorServers.addListener(onInvalidating(this::removeDanglingAuthlibInjectorAccounts)); + CONFIG.authlibInjectorServers.addListener(onInvalidating(this::removeDanglingAuthlibInjectorAccounts)); - this.selectedAccount.set(accounts.get(ConfigHolder.CONFIG.selectedAccount.get())); + this.selectedAccount.set(accounts.get(CONFIG.selectedAccount.get())); checkProfileMap(); @@ -105,18 +106,18 @@ public class Settings { Lang.ignoringException(() -> Runtime.getRuntime().addShutdownHook(new Thread(this::save))); - ConfigHolder.CONFIG.addListener(source -> save()); + CONFIG.addListener(source -> save()); } private void save() { - ConfigHolder.saveConfig(ConfigHolder.CONFIG); + ConfigHolder.saveConfig(CONFIG); } public boolean isFirstLaunch() { return firstLaunch; } - private Locales.SupportedLocale locale = Locales.getLocaleByName(ConfigHolder.CONFIG.localization.get()); + private Locales.SupportedLocale locale = Locales.getLocaleByName(CONFIG.localization.get()); public Locales.SupportedLocale getLocale() { return locale; @@ -124,24 +125,24 @@ public class Settings { public void setLocale(Locales.SupportedLocale locale) { this.locale = locale; - ConfigHolder.CONFIG.localization.set(Locales.getNameByLocale(locale)); + CONFIG.localization.set(Locales.getNameByLocale(locale)); } public Font getFont() { - return Font.font(ConfigHolder.CONFIG.fontFamily.get(), ConfigHolder.CONFIG.fontSize.get()); + return Font.font(CONFIG.fontFamily.get(), CONFIG.fontSize.get()); } public void setFont(Font font) { - ConfigHolder.CONFIG.fontFamily.set(font.getFamily()); - ConfigHolder.CONFIG.fontSize.set(font.getSize()); + CONFIG.fontFamily.set(font.getFamily()); + CONFIG.fontSize.set(font.getSize()); } public int getLogLines() { - return Math.max(ConfigHolder.CONFIG.logLines.get(), 100); + return Math.max(CONFIG.logLines.get(), 100); } public void setLogLines(int logLines) { - ConfigHolder.CONFIG.logLines.set(logLines); + CONFIG.logLines.set(logLines); } /**************************************** @@ -156,7 +157,7 @@ public class Settings { private void removeDanglingAuthlibInjectorAccounts() { accounts.values().stream() .filter(AuthlibInjectorAccount.class::isInstance) - .filter(it -> !ConfigHolder.CONFIG.authlibInjectorServers.contains(((AuthlibInjectorAccount) it).getServer())) + .filter(it -> !CONFIG.authlibInjectorServers.contains(((AuthlibInjectorAccount) it).getServer())) .collect(toList()) .forEach(this::deleteAccount); } @@ -166,14 +167,14 @@ public class Settings { ****************************************/ public DownloadProvider getDownloadProvider() { - return DownloadProviders.getDownloadProvider(ConfigHolder.CONFIG.downloadType.get()); + return DownloadProviders.getDownloadProvider(CONFIG.downloadType.get()); } public void setDownloadProvider(DownloadProvider downloadProvider) { int index = DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(downloadProvider); if (index == -1) throw new IllegalArgumentException("Unknown download provider: " + downloadProvider); - ConfigHolder.CONFIG.downloadType.set(index); + CONFIG.downloadType.set(index); } /**************************************** @@ -202,7 +203,7 @@ public class Settings { public void invalidated() { super.invalidated(); - ConfigHolder.CONFIG.selectedAccount.set(getValue() == null ? "" : Accounts.getAccountId(getValue())); + CONFIG.selectedAccount.set(getValue() == null ? "" : Accounts.getAccountId(getValue())); } }; @@ -260,12 +261,12 @@ public class Settings { * THEME * ****************************************/ - private final ImmediateObjectProperty theme = new ImmediateObjectProperty(this, "theme", Theme.getTheme(ConfigHolder.CONFIG.theme.get()).orElse(Theme.BLUE)) { + private final ImmediateObjectProperty theme = new ImmediateObjectProperty(this, "theme", Theme.getTheme(CONFIG.theme.get()).orElse(Theme.BLUE)) { @Override public void invalidated() { super.invalidated(); - ConfigHolder.CONFIG.theme.set(get().getName().toLowerCase()); + CONFIG.theme.set(get().getName().toLowerCase()); } }; @@ -288,18 +289,18 @@ public class Settings { public Profile getSelectedProfile() { checkProfileMap(); - if (!hasProfile(ConfigHolder.CONFIG.selectedProfile.get())) { + if (!hasProfile(CONFIG.selectedProfile.get())) { getProfileMap().keySet().stream().findFirst().ifPresent(selectedProfile -> { - ConfigHolder.CONFIG.selectedProfile.set(selectedProfile); + CONFIG.selectedProfile.set(selectedProfile); }); Schedulers.computation().schedule(this::onProfileChanged); } - return getProfile(ConfigHolder.CONFIG.selectedProfile.get()); + return getProfile(CONFIG.selectedProfile.get()); } public void setSelectedProfile(Profile selectedProfile) { - if (hasProfile(selectedProfile.getName()) && !Objects.equals(selectedProfile.getName(), ConfigHolder.CONFIG.selectedProfile.get())) { - ConfigHolder.CONFIG.selectedProfile.set(selectedProfile.getName()); + if (hasProfile(selectedProfile.getName()) && !Objects.equals(selectedProfile.getName(), CONFIG.selectedProfile.get())) { + CONFIG.selectedProfile.set(selectedProfile.getName()); Schedulers.computation().schedule(this::onProfileChanged); } } @@ -316,7 +317,7 @@ public class Settings { } public Map getProfileMap() { - return ConfigHolder.CONFIG.configurations; + return CONFIG.configurations; } public Collection getProfiles() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java index 562d448c0..8fb343cc9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java @@ -30,6 +30,8 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + /** * * @author huangyuhui @@ -517,10 +519,10 @@ public final class VersionSetting { .setFullscreen(isFullscreen()) .setServerIp(getServerIp()) .setWrapper(getWrapper()) - .setProxyHost(ConfigHolder.CONFIG.proxyHost.get()) - .setProxyPort(ConfigHolder.CONFIG.proxyPort.get()) - .setProxyUser(ConfigHolder.CONFIG.proxyUser.get()) - .setProxyPass(ConfigHolder.CONFIG.proxyPass.get()) + .setProxyHost(CONFIG.proxyHost.get()) + .setProxyPort(CONFIG.proxyPort.get()) + .setProxyUser(CONFIG.proxyUser.get()) + .setProxyPass(CONFIG.proxyPass.get()) .setPrecalledCommand(getPreLaunchCommand()) .setNoGeneratedJVMArgs(isNoJVMArgs()) .create(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index 92830186e..ce5e13d0c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -41,7 +41,6 @@ import org.jackhuang.hmcl.auth.yggdrasil.RemoteAuthenticationException; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; import org.jackhuang.hmcl.game.AccountHelper; import org.jackhuang.hmcl.setting.Accounts; -import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.ProxyManager; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Schedulers; @@ -53,6 +52,7 @@ import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.Logging; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; import static org.jackhuang.hmcl.ui.FXUtils.jfxListCellFactory; import static org.jackhuang.hmcl.ui.FXUtils.onInvalidating; import static org.jackhuang.hmcl.ui.FXUtils.stringConverter; @@ -82,7 +82,7 @@ public class AddAccountPane extends StackPane { cboServers.setCellFactory(jfxListCellFactory(server -> new TwoLineListItem(server.getName(), server.getUrl()))); cboServers.setConverter(stringConverter(AuthlibInjectorServer::getName)); - Bindings.bindContent(cboServers.getItems(), ConfigHolder.CONFIG.authlibInjectorServers); + Bindings.bindContent(cboServers.getItems(), CONFIG.authlibInjectorServers); cboServers.getItems().addListener(onInvalidating(this::selectDefaultServer)); selectDefaultServer(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java index 66d4a4fa9..c723348b1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java @@ -22,7 +22,6 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.IOException; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; -import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.animation.ContainerAnimations; @@ -40,6 +39,8 @@ import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + public class AddAuthlibInjectorServerPane extends StackPane { @FXML private StackPane addServerContainer; @@ -132,8 +133,8 @@ public class AddAuthlibInjectorServerPane extends StackPane { @FXML private void onAddFinish() { - if (!ConfigHolder.CONFIG.authlibInjectorServers.contains(serverBeingAdded)) { - ConfigHolder.CONFIG.authlibInjectorServers.add(serverBeingAdded); + if (!CONFIG.authlibInjectorServers.contains(serverBeingAdded)) { + CONFIG.authlibInjectorServers.add(serverBeingAdded); } fireEvent(new DialogCloseEvent()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java index e2fae365a..ddaeb113e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java @@ -22,7 +22,6 @@ import static org.jackhuang.hmcl.ui.FXUtils.loadFXML; import static org.jackhuang.hmcl.ui.FXUtils.smoothScrolling; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; -import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import javafx.beans.InvalidationListener; @@ -34,6 +33,8 @@ import javafx.scene.control.ScrollPane; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + public class AuthlibInjectorServersPage extends StackPane implements DecoratorPage { private final StringProperty title = new SimpleStringProperty(this, "title", i18n("account.injector.manage.title")); @@ -48,15 +49,15 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa smoothScrolling(scrollPane); serversListener = observable -> updateServersList(); - ConfigHolder.CONFIG.authlibInjectorServers.addListener(new WeakInvalidationListener(serversListener)); + CONFIG.authlibInjectorServers.addListener(new WeakInvalidationListener(serversListener)); updateServersList(); } private void updateServersList() { listPane.getChildren().setAll( - ConfigHolder.CONFIG.authlibInjectorServers.stream() + CONFIG.authlibInjectorServers.stream() .map(server -> new AuthlibInjectorServerItem(server, - item -> ConfigHolder.CONFIG.authlibInjectorServers.remove(item.getServer()))) + item -> CONFIG.authlibInjectorServers.remove(item.getServer()))) .collect(toList())); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index ef6f0a767..4595550e0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -55,7 +55,6 @@ import javafx.stage.StageStyle; import javafx.util.Duration; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorDnD; -import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.EnumBackgroundImage; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.setting.Theme; @@ -77,6 +76,8 @@ import java.util.Queue; import java.util.Random; import java.util.concurrent.ConcurrentLinkedQueue; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + public final class Decorator extends StackPane implements TaskExecutorDialogWizardDisplayer { private static final SVGGlyph minus = Lang.apply(new SVGGlyph(0, "MINUS", "M804.571 420.571v109.714q0 22.857-16 38.857t-38.857 16h-694.857q-22.857 0-38.857-16t-16-38.857v-109.714q0-22.857 16-38.857t38.857-16h694.857q22.857 0 38.857 16t16 38.857z", Color.WHITE), glyph -> { glyph.setSize(12, 2); glyph.setTranslateY(4); }); @@ -220,10 +221,10 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza try { Image background; - if (ConfigHolder.CONFIG.backgroundImageType.get() == EnumBackgroundImage.DEFAULT) + if (CONFIG.backgroundImageType.get() == EnumBackgroundImage.DEFAULT) background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ""); else - background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ConfigHolder.CONFIG.backgroundImage.get()); + background = searchBackgroundImage(new Image("/assets/img/background.jpg"), CONFIG.backgroundImage.get()); drawerWrapper.setBackground(new Background(new BackgroundImage(background, BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT, new BackgroundSize(800, 480, false, false, true, true)))); } catch (IllegalArgumentException ignore) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index b00f1c892..7123bd80e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -44,6 +44,7 @@ import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.i18n.Locales; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; import static org.jackhuang.hmcl.ui.FXUtils.onInvalidating; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -105,10 +106,10 @@ public final class SettingsPage extends StackPane implements DecoratorPage { FXUtils.smoothScrolling(scroll); - txtProxyHost.textProperty().bindBidirectional(ConfigHolder.CONFIG.proxyHost); - txtProxyPort.textProperty().bindBidirectional(ConfigHolder.CONFIG.proxyPort); - txtProxyUsername.textProperty().bindBidirectional(ConfigHolder.CONFIG.proxyUser); - txtProxyPassword.textProperty().bindBidirectional(ConfigHolder.CONFIG.proxyPass); + txtProxyHost.textProperty().bindBidirectional(CONFIG.proxyHost); + txtProxyPort.textProperty().bindBidirectional(CONFIG.proxyPort); + txtProxyUsername.textProperty().bindBidirectional(CONFIG.proxyUser); + txtProxyPassword.textProperty().bindBidirectional(CONFIG.proxyPass); cboDownloadSource.getSelectionModel().select(DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(Settings.INSTANCE.getDownloadProvider())); cboDownloadSource.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setDownloadProvider(DownloadProviders.getDownloadProvider(newValue.intValue()))); @@ -148,28 +149,28 @@ public final class SettingsPage extends StackPane implements DecoratorPage { chkProxySocks.setToggleGroup(proxyConfigurationGroup); for (Toggle toggle : proxyConfigurationGroup.getToggles()) - if (toggle.getUserData() == ConfigHolder.CONFIG.proxyType.get()) + if (toggle.getUserData() == CONFIG.proxyType.get()) toggle.setSelected(true); ToggleGroup hasProxyGroup = new ToggleGroup(); chkNoProxy.setToggleGroup(hasProxyGroup); chkManualProxy.setToggleGroup(hasProxyGroup); - if (!ConfigHolder.CONFIG.hasProxy.get()) + if (!CONFIG.hasProxy.get()) chkNoProxy.setSelected(true); else chkManualProxy.setSelected(true); proxyPane.disableProperty().bind(chkNoProxy.selectedProperty()); hasProxyGroup.selectedToggleProperty().addListener((a, b, newValue) -> - ConfigHolder.CONFIG.hasProxy.set(newValue != chkNoProxy)); + CONFIG.hasProxy.set(newValue != chkNoProxy)); proxyConfigurationGroup.selectedToggleProperty().addListener((a, b, newValue) -> - ConfigHolder.CONFIG.proxyType.set((Proxy.Type) newValue.getUserData())); + CONFIG.proxyType.set((Proxy.Type) newValue.getUserData())); - chkProxyAuthentication.selectedProperty().bindBidirectional(ConfigHolder.CONFIG.hasProxyAuth); + chkProxyAuthentication.selectedProperty().bindBidirectional(CONFIG.hasProxyAuth); authPane.disableProperty().bind(chkProxyAuthentication.selectedProperty().not()); - fileCommonLocation.pathProperty().bindBidirectional(ConfigHolder.CONFIG.commonDirectory); + fileCommonLocation.pathProperty().bindBidirectional(CONFIG.commonDirectory); FXUtils.installTooltip(btnUpdate, i18n("update.tooltip")); checkUpdate(); @@ -179,17 +180,17 @@ public final class SettingsPage extends StackPane implements DecoratorPage { backgroundItem.createChildren(i18n("launcher.background.default"), EnumBackgroundImage.DEFAULT) )); - FXUtils.bindString(backgroundItem.getTxtCustom(), ConfigHolder.CONFIG.backgroundImage); + FXUtils.bindString(backgroundItem.getTxtCustom(), CONFIG.backgroundImage); backgroundItem.setCustomUserData(EnumBackgroundImage.CUSTOM); - backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == ConfigHolder.CONFIG.backgroundImageType.get()).findFirst().ifPresent(it -> it.setSelected(true)); + backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == CONFIG.backgroundImageType.get()).findFirst().ifPresent(it -> it.setSelected(true)); - ConfigHolder.CONFIG.backgroundImage.addListener(onInvalidating(this::initBackgroundItemSubtitle)); - ConfigHolder.CONFIG.backgroundImageType.addListener(onInvalidating(this::initBackgroundItemSubtitle)); + CONFIG.backgroundImage.addListener(onInvalidating(this::initBackgroundItemSubtitle)); + CONFIG.backgroundImageType.addListener(onInvalidating(this::initBackgroundItemSubtitle)); initBackgroundItemSubtitle(); backgroundItem.setToggleSelectedListener(newValue -> - ConfigHolder.CONFIG.backgroundImageType.set((EnumBackgroundImage) newValue.getUserData())); + CONFIG.backgroundImageType.set((EnumBackgroundImage) newValue.getUserData())); // theme JFXColorPicker picker = new JFXColorPicker(Color.web(Settings.INSTANCE.getTheme().getColor()), null); @@ -206,12 +207,12 @@ public final class SettingsPage extends StackPane implements DecoratorPage { } private void initBackgroundItemSubtitle() { - switch (ConfigHolder.CONFIG.backgroundImageType.get()) { + switch (CONFIG.backgroundImageType.get()) { case DEFAULT: backgroundItem.setSubtitle(i18n("launcher.background.default")); break; case CUSTOM: - backgroundItem.setSubtitle(ConfigHolder.CONFIG.backgroundImage.get()); + backgroundItem.setSubtitle(CONFIG.backgroundImage.get()); break; } } From 3e8c8afcd11c5da01c7bd6a6310c4ea8e6e1a766 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 18 Jul 2018 10:45:48 +0800 Subject: [PATCH 13/20] Add get/set/property methods for Config --- .../hmcl/game/HMCLGameDownloadTask.java | 2 +- .../hmcl/game/HMCLGameRepository.java | 4 +- .../org/jackhuang/hmcl/setting/Accounts.java | 4 +- .../org/jackhuang/hmcl/setting/Config.java | 291 ++++++++++++++++-- .../jackhuang/hmcl/setting/ProxyManager.java | 22 +- .../org/jackhuang/hmcl/setting/Settings.java | 50 +-- .../hmcl/setting/VersionSetting.java | 8 +- .../org/jackhuang/hmcl/ui/AddAccountPane.java | 2 +- .../hmcl/ui/AddAuthlibInjectorServerPane.java | 4 +- .../hmcl/ui/AuthlibInjectorServersPage.java | 6 +- .../java/org/jackhuang/hmcl/ui/Decorator.java | 4 +- .../org/jackhuang/hmcl/ui/SettingsPage.java | 34 +- .../hmcl/ui/export/ExportWizardProvider.java | 21 +- 13 files changed, 347 insertions(+), 105 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java index ad3217fad..7a7f2e31c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java @@ -59,7 +59,7 @@ public class HMCLGameDownloadTask extends Task { public void execute() { File jar = profile.getRepository().getVersionJar(version); - File cache = new File(CONFIG.commonDirectory.get(), "jars/" + gameVersion + ".jar"); + File cache = new File(CONFIG.getCommonDirectory(), "jars/" + gameVersion + ".jar"); if (cache.exists()) try { FileUtils.copyFile(cache, jar); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 37867a3da..2aff2a527 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -61,7 +61,7 @@ public class HMCLGameRepository extends DefaultGameRepository { if (useSelf(version, assetId)) return super.getAssetDirectory(version, assetId); else - return new File(CONFIG.commonDirectory.get(), "assets"); + return new File(CONFIG.getCommonDirectory(), "assets"); } @Override @@ -86,7 +86,7 @@ public class HMCLGameRepository extends DefaultGameRepository { if (self.exists() || vs.isNoCommon()) return self; else - return new File(CONFIG.commonDirectory.get(), "libraries/" + lib.getPath()); + return new File(CONFIG.getCommonDirectory(), "libraries/" + lib.getPath()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index 30d16ca3b..427b8de49 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -72,7 +72,7 @@ public final class Accounts { } private static AuthlibInjectorServer getOrCreateAuthlibInjectorServer(String url) { - return CONFIG.authlibInjectorServers.stream() + return CONFIG.getAuthlibInjectorServers().stream() .filter(server -> url.equals(server.getUrl())) .findFirst() .orElseGet(() -> { @@ -86,7 +86,7 @@ public final class Accounts { LOG.log(Level.WARNING, "Failed to migrate authlib injector server " + url, e); } - CONFIG.authlibInjectorServers.add(server); + CONFIG.getAuthlibInjectorServers().add(server); return server; }); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java index 960c314a3..6c0b60e8d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -80,69 +80,70 @@ public final class Config implements Cloneable, Observable { } @SerializedName("last") - public final StringProperty selectedProfile = new SimpleStringProperty(""); + private StringProperty selectedProfile = new SimpleStringProperty(""); @SerializedName("backgroundType") - public final ObjectProperty backgroundImageType = new SimpleObjectProperty<>(EnumBackgroundImage.DEFAULT); + private ObjectProperty backgroundImageType = new SimpleObjectProperty<>(EnumBackgroundImage.DEFAULT); @SerializedName("bgpath") - public final StringProperty backgroundImage = new SimpleStringProperty(); + private StringProperty backgroundImage = new SimpleStringProperty(); @SerializedName("commonpath") - public final StringProperty commonDirectory = new SimpleStringProperty(Launcher.MINECRAFT_DIRECTORY.getAbsolutePath()); + private StringProperty commonDirectory = new SimpleStringProperty(Launcher.MINECRAFT_DIRECTORY.getAbsolutePath()); @SerializedName("hasProxy") - public final BooleanProperty hasProxy = new SimpleBooleanProperty(); + private BooleanProperty hasProxy = new SimpleBooleanProperty(); @SerializedName("hasProxyAuth") - public final BooleanProperty hasProxyAuth = new SimpleBooleanProperty(); + private BooleanProperty hasProxyAuth = new SimpleBooleanProperty(); @SerializedName("proxyType") - public final ObjectProperty proxyType = new SimpleObjectProperty<>(Proxy.Type.DIRECT); + private ObjectProperty proxyType = new SimpleObjectProperty<>(Proxy.Type.DIRECT); @SerializedName("proxyHost") - public final StringProperty proxyHost = new SimpleStringProperty(); + private StringProperty proxyHost = new SimpleStringProperty(); @SerializedName("proxyPort") - public final StringProperty proxyPort = new SimpleStringProperty(); + private StringProperty proxyPort = new SimpleStringProperty(); @SerializedName("proxyUserName") - public final StringProperty proxyUser = new SimpleStringProperty(); + private StringProperty proxyUser = new SimpleStringProperty(); @SerializedName("proxyPassword") - public final StringProperty proxyPass = new SimpleStringProperty(); + private StringProperty proxyPass = new SimpleStringProperty(); @SerializedName("theme") - public final StringProperty theme = new SimpleStringProperty(); + private StringProperty theme = new SimpleStringProperty(); @SerializedName("localization") - public final StringProperty localization = new SimpleStringProperty(); + private StringProperty localization = new SimpleStringProperty(); @SerializedName("downloadtype") - public final IntegerProperty downloadType = new SimpleIntegerProperty(1); + private IntegerProperty downloadType = new SimpleIntegerProperty(1); @SerializedName("configurations") - public final ObservableMap configurations = FXCollections.observableMap(new TreeMap<>()); + private ObservableMap configurations = FXCollections.observableMap(new TreeMap<>()); @SerializedName("accounts") - public final ObservableList> accounts = FXCollections.observableArrayList(); + private ObservableList> accounts = FXCollections.observableArrayList(); @SerializedName("selectedAccount") - public final StringProperty selectedAccount = new SimpleStringProperty(""); + private StringProperty selectedAccount = new SimpleStringProperty(""); @SerializedName("fontFamily") - public final StringProperty fontFamily = new SimpleStringProperty("Consolas"); + private StringProperty fontFamily = new SimpleStringProperty("Consolas"); @SerializedName("fontSize") - public final DoubleProperty fontSize = new SimpleDoubleProperty(12); + private DoubleProperty fontSize = new SimpleDoubleProperty(12); @SerializedName("logLines") - public final IntegerProperty logLines = new SimpleIntegerProperty(100); + private IntegerProperty logLines = new SimpleIntegerProperty(100); @SerializedName("firstLaunch") - public final BooleanProperty firstLaunch = new SimpleBooleanProperty(true); + private BooleanProperty firstLaunch = new SimpleBooleanProperty(true); - public final ObservableList authlibInjectorServers = FXCollections.observableArrayList(); + @SerializedName("authlibInjectorServers") + private ObservableList authlibInjectorServers = FXCollections.observableArrayList(); private transient ObservableHelper helper = new ObservableHelper(this); @@ -151,10 +152,10 @@ public final class Config implements Cloneable, Observable { } private void addListenerToProperties() { - Stream.of(getClass().getFields()) + Stream.of(getClass().getDeclaredFields()) .filter(it -> { int modifiers = it.getModifiers(); - return Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers); + return !Modifier.isTransient(modifiers) && !Modifier.isStatic(modifiers); }) .filter(it -> Observable.class.isAssignableFrom(it.getType())) .map(it -> { @@ -185,4 +186,246 @@ public final class Config implements Cloneable, Observable { public Config clone() { return fromJson(this.toJson()); } + + // Getters & Setters & Properties + public String getSelectedProfile() { + return selectedProfile.get(); + } + + public void setSelectedProfile(String selectedProfile) { + this.selectedProfile.set(selectedProfile); + } + + public StringProperty selectedProfileProperty() { + return selectedProfile; + } + + public EnumBackgroundImage getBackgroundImageType() { + return backgroundImageType.get(); + } + + public void setBackgroundImageType(EnumBackgroundImage backgroundImageType) { + this.backgroundImageType.set(backgroundImageType); + } + + public ObjectProperty backgroundImageTypeProperty() { + return backgroundImageType; + } + + public String getBackgroundImage() { + return backgroundImage.get(); + } + + public void setBackgroundImage(String backgroundImage) { + this.backgroundImage.set(backgroundImage); + } + + public StringProperty backgroundImageProperty() { + return backgroundImage; + } + + public String getCommonDirectory() { + return commonDirectory.get(); + } + + public void setCommonDirectory(String commonDirectory) { + this.commonDirectory.set(commonDirectory); + } + + public StringProperty commonDirectoryProperty() { + return commonDirectory; + } + + public boolean hasProxy() { + return hasProxy.get(); + } + + public void setHasProxy(boolean hasProxy) { + this.hasProxy.set(hasProxy); + } + + public BooleanProperty hasProxyProperty() { + return hasProxy; + } + + public boolean hasProxyAuth() { + return hasProxyAuth.get(); + } + + public void setHasProxyAuth(boolean hasProxyAuth) { + this.hasProxyAuth.set(hasProxyAuth); + } + + public BooleanProperty hasProxyAuthProperty() { + return hasProxyAuth; + } + + public Proxy.Type getProxyType() { + return proxyType.get(); + } + + public void setProxyType(Proxy.Type proxyType) { + this.proxyType.set(proxyType); + } + + public ObjectProperty proxyTypeProperty() { + return proxyType; + } + + public String getProxyHost() { + return proxyHost.get(); + } + + public void setProxyHost(String proxyHost) { + this.proxyHost.set(proxyHost); + } + + public StringProperty proxyHostProperty() { + return proxyHost; + } + + public String getProxyPort() { + return proxyPort.get(); + } + + public void setProxyPort(String proxyPort) { + this.proxyPort.set(proxyPort); + } + + public StringProperty proxyPortProperty() { + return proxyPort; + } + + public String getProxyUser() { + return proxyUser.get(); + } + + public void setProxyUser(String proxyUser) { + this.proxyUser.set(proxyUser); + } + + public StringProperty proxyUserProperty() { + return proxyUser; + } + + public String getProxyPass() { + return proxyPass.get(); + } + + public void setProxyPass(String proxyPass) { + this.proxyPass.set(proxyPass); + } + + public StringProperty proxyPassProperty() { + return proxyPass; + } + + public String getTheme() { + return theme.get(); + } + + public void setTheme(String theme) { + this.theme.set(theme); + } + + public StringProperty themeProperty() { + return theme; + } + + public String getLocalization() { + return localization.get(); + } + + public void setLocalization(String localization) { + this.localization.set(localization); + } + + public StringProperty localizationProperty() { + return localization; + } + + public int getDownloadType() { + return downloadType.get(); + } + + public void setDownloadType(int downloadType) { + this.downloadType.set(downloadType); + } + + public IntegerProperty downloadTypeProperty() { + return downloadType; + } + + public ObservableMap getConfigurations() { + return configurations; + } + + public ObservableList> getAccounts() { + return accounts; + } + + public String getSelectedAccount() { + return selectedAccount.get(); + } + + public void setSelectedAccount(String selectedAccount) { + this.selectedAccount.set(selectedAccount); + } + + public StringProperty selectedAccountProperty() { + return selectedAccount; + } + + public String getFontFamily() { + return fontFamily.get(); + } + + public void setFontFamily(String fontFamily) { + this.fontFamily.set(fontFamily); + } + + public StringProperty fontFamilyProperty() { + return fontFamily; + } + + public double getFontSize() { + return fontSize.get(); + } + + public void setFontSize(double fontSize) { + this.fontSize.set(fontSize); + } + + public DoubleProperty fontSizeProperty() { + return fontSize; + } + + public int getLogLines() { + return logLines.get(); + } + + public void setLogLines(int logLines) { + this.logLines.set(logLines); + } + + public IntegerProperty logLinesProperty() { + return logLines; + } + + public boolean isFirstLaunch() { + return firstLaunch.get(); + } + + public void setFirstLaunch(boolean firstLaunch) { + this.firstLaunch.set(firstLaunch); + } + + public BooleanProperty firstLaunchProperty() { + return firstLaunch; + } + + public ObservableList getAuthlibInjectorServers() { + return authlibInjectorServers; + } + } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java index 5f4687a29..12822e15f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java @@ -37,18 +37,18 @@ public final class ProxyManager { public static final ObjectBinding proxyProperty = Bindings.createObjectBinding( () -> { - String host = CONFIG.proxyHost.get(); - Integer port = Lang.toIntOrNull(CONFIG.proxyPort.get()); - if (!CONFIG.hasProxy.get() || StringUtils.isBlank(host) || port == null || CONFIG.proxyType.get() == Proxy.Type.DIRECT) { + String host = CONFIG.getProxyHost(); + Integer port = Lang.toIntOrNull(CONFIG.getProxyPort()); + if (!CONFIG.hasProxy() || StringUtils.isBlank(host) || port == null || CONFIG.getProxyType() == Proxy.Type.DIRECT) { return Proxy.NO_PROXY; } else { - return new Proxy(CONFIG.proxyType.get(), new InetSocketAddress(host, port)); + return new Proxy(CONFIG.getProxyType(), new InetSocketAddress(host, port)); } }, - CONFIG.proxyType, - CONFIG.proxyHost, - CONFIG.proxyPort, - CONFIG.hasProxy); + CONFIG.proxyTypeProperty(), + CONFIG.proxyHostProperty(), + CONFIG.proxyPortProperty(), + CONFIG.hasProxyProperty()); public static Proxy getProxy() { return proxyProperty.get(); @@ -67,9 +67,9 @@ public final class ProxyManager { @Override protected PasswordAuthentication getPasswordAuthentication() { - if (CONFIG.hasProxyAuth.get()) { - String username = CONFIG.proxyUser.get(); - String password = CONFIG.proxyPass.get(); + if (CONFIG.hasProxyAuth()) { + String username = CONFIG.getProxyUser(); + String password = CONFIG.getProxyPass(); if (username != null && password != null) { return new PasswordAuthentication(username, password.toCharArray()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 9ff4d67a2..a375a8ee6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -53,7 +53,7 @@ public class Settings { private final boolean firstLaunch; private InvalidationListener accountChangeListener = - source -> CONFIG.accounts.setAll( + source -> CONFIG.getAccounts().setAll( accounts.values().stream() .map(account -> { Map storage = account.toStorage(); @@ -63,12 +63,12 @@ public class Settings { .collect(toList())); private Settings() { - firstLaunch = CONFIG.firstLaunch.get(); - CONFIG.firstLaunch.set(false); + firstLaunch = CONFIG.isFirstLaunch(); + CONFIG.setFirstLaunch(false); ProxyManager.getProxy(); // init ProxyManager - for (Iterator> iterator = CONFIG.accounts.iterator(); iterator.hasNext();) { + for (Iterator> iterator = CONFIG.getAccounts().iterator(); iterator.hasNext();) { Map settings = iterator.next(); AccountFactory factory = Accounts.ACCOUNT_FACTORY.get(tryCast(settings.get("type"), String.class).orElse("")); if (factory == null) { @@ -90,9 +90,9 @@ public class Settings { account.addListener(accountChangeListener); } - CONFIG.authlibInjectorServers.addListener(onInvalidating(this::removeDanglingAuthlibInjectorAccounts)); + CONFIG.getAuthlibInjectorServers().addListener(onInvalidating(this::removeDanglingAuthlibInjectorAccounts)); - this.selectedAccount.set(accounts.get(CONFIG.selectedAccount.get())); + this.selectedAccount.set(accounts.get(CONFIG.getSelectedAccount())); checkProfileMap(); @@ -117,7 +117,7 @@ public class Settings { return firstLaunch; } - private Locales.SupportedLocale locale = Locales.getLocaleByName(CONFIG.localization.get()); + private Locales.SupportedLocale locale = Locales.getLocaleByName(CONFIG.getLocalization()); public Locales.SupportedLocale getLocale() { return locale; @@ -125,24 +125,24 @@ public class Settings { public void setLocale(Locales.SupportedLocale locale) { this.locale = locale; - CONFIG.localization.set(Locales.getNameByLocale(locale)); + CONFIG.setLocalization(Locales.getNameByLocale(locale)); } public Font getFont() { - return Font.font(CONFIG.fontFamily.get(), CONFIG.fontSize.get()); + return Font.font(CONFIG.getFontFamily(), CONFIG.getFontSize()); } public void setFont(Font font) { - CONFIG.fontFamily.set(font.getFamily()); - CONFIG.fontSize.set(font.getSize()); + CONFIG.setFontFamily(font.getFamily()); + CONFIG.setFontSize(font.getSize()); } public int getLogLines() { - return Math.max(CONFIG.logLines.get(), 100); + return Math.max(CONFIG.getLogLines(), 100); } public void setLogLines(int logLines) { - CONFIG.logLines.set(logLines); + CONFIG.setLogLines(logLines); } /**************************************** @@ -157,7 +157,7 @@ public class Settings { private void removeDanglingAuthlibInjectorAccounts() { accounts.values().stream() .filter(AuthlibInjectorAccount.class::isInstance) - .filter(it -> !CONFIG.authlibInjectorServers.contains(((AuthlibInjectorAccount) it).getServer())) + .filter(it -> !CONFIG.getAuthlibInjectorServers().contains(((AuthlibInjectorAccount) it).getServer())) .collect(toList()) .forEach(this::deleteAccount); } @@ -167,14 +167,14 @@ public class Settings { ****************************************/ public DownloadProvider getDownloadProvider() { - return DownloadProviders.getDownloadProvider(CONFIG.downloadType.get()); + return DownloadProviders.getDownloadProvider(CONFIG.getDownloadType()); } public void setDownloadProvider(DownloadProvider downloadProvider) { int index = DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(downloadProvider); if (index == -1) throw new IllegalArgumentException("Unknown download provider: " + downloadProvider); - CONFIG.downloadType.set(index); + CONFIG.setDownloadType(index); } /**************************************** @@ -203,7 +203,7 @@ public class Settings { public void invalidated() { super.invalidated(); - CONFIG.selectedAccount.set(getValue() == null ? "" : Accounts.getAccountId(getValue())); + CONFIG.setSelectedAccount(getValue() == null ? "" : Accounts.getAccountId(getValue())); } }; @@ -261,12 +261,12 @@ public class Settings { * THEME * ****************************************/ - private final ImmediateObjectProperty theme = new ImmediateObjectProperty(this, "theme", Theme.getTheme(CONFIG.theme.get()).orElse(Theme.BLUE)) { + private final ImmediateObjectProperty theme = new ImmediateObjectProperty(this, "theme", Theme.getTheme(CONFIG.getTheme()).orElse(Theme.BLUE)) { @Override public void invalidated() { super.invalidated(); - CONFIG.theme.set(get().getName().toLowerCase()); + CONFIG.setTheme(get().getName().toLowerCase()); } }; @@ -289,18 +289,18 @@ public class Settings { public Profile getSelectedProfile() { checkProfileMap(); - if (!hasProfile(CONFIG.selectedProfile.get())) { + if (!hasProfile(CONFIG.getSelectedProfile())) { getProfileMap().keySet().stream().findFirst().ifPresent(selectedProfile -> { - CONFIG.selectedProfile.set(selectedProfile); + CONFIG.setSelectedProfile(selectedProfile); }); Schedulers.computation().schedule(this::onProfileChanged); } - return getProfile(CONFIG.selectedProfile.get()); + return getProfile(CONFIG.getSelectedProfile()); } public void setSelectedProfile(Profile selectedProfile) { - if (hasProfile(selectedProfile.getName()) && !Objects.equals(selectedProfile.getName(), CONFIG.selectedProfile.get())) { - CONFIG.selectedProfile.set(selectedProfile.getName()); + if (hasProfile(selectedProfile.getName()) && !Objects.equals(selectedProfile.getName(), CONFIG.getSelectedProfile())) { + CONFIG.setSelectedProfile(selectedProfile.getName()); Schedulers.computation().schedule(this::onProfileChanged); } } @@ -317,7 +317,7 @@ public class Settings { } public Map getProfileMap() { - return CONFIG.configurations; + return CONFIG.getConfigurations(); } public Collection getProfiles() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java index 8fb343cc9..c8e9ddf34 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java @@ -519,10 +519,10 @@ public final class VersionSetting { .setFullscreen(isFullscreen()) .setServerIp(getServerIp()) .setWrapper(getWrapper()) - .setProxyHost(CONFIG.proxyHost.get()) - .setProxyPort(CONFIG.proxyPort.get()) - .setProxyUser(CONFIG.proxyUser.get()) - .setProxyPass(CONFIG.proxyPass.get()) + .setProxyHost(CONFIG.getProxyHost()) + .setProxyPort(CONFIG.getProxyPort()) + .setProxyUser(CONFIG.getProxyUser()) + .setProxyPass(CONFIG.getProxyPass()) .setPrecalledCommand(getPreLaunchCommand()) .setNoGeneratedJVMArgs(isNoJVMArgs()) .create(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index ce5e13d0c..92bf69814 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -82,7 +82,7 @@ public class AddAccountPane extends StackPane { cboServers.setCellFactory(jfxListCellFactory(server -> new TwoLineListItem(server.getName(), server.getUrl()))); cboServers.setConverter(stringConverter(AuthlibInjectorServer::getName)); - Bindings.bindContent(cboServers.getItems(), CONFIG.authlibInjectorServers); + Bindings.bindContent(cboServers.getItems(), CONFIG.getAuthlibInjectorServers()); cboServers.getItems().addListener(onInvalidating(this::selectDefaultServer)); selectDefaultServer(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java index c723348b1..2fbf48b94 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java @@ -133,8 +133,8 @@ public class AddAuthlibInjectorServerPane extends StackPane { @FXML private void onAddFinish() { - if (!CONFIG.authlibInjectorServers.contains(serverBeingAdded)) { - CONFIG.authlibInjectorServers.add(serverBeingAdded); + if (!CONFIG.getAuthlibInjectorServers().contains(serverBeingAdded)) { + CONFIG.getAuthlibInjectorServers().add(serverBeingAdded); } fireEvent(new DialogCloseEvent()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java index ddaeb113e..3cdc611bb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java @@ -49,15 +49,15 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa smoothScrolling(scrollPane); serversListener = observable -> updateServersList(); - CONFIG.authlibInjectorServers.addListener(new WeakInvalidationListener(serversListener)); + CONFIG.getAuthlibInjectorServers().addListener(new WeakInvalidationListener(serversListener)); updateServersList(); } private void updateServersList() { listPane.getChildren().setAll( - CONFIG.authlibInjectorServers.stream() + CONFIG.getAuthlibInjectorServers().stream() .map(server -> new AuthlibInjectorServerItem(server, - item -> CONFIG.authlibInjectorServers.remove(item.getServer()))) + item -> CONFIG.getAuthlibInjectorServers().remove(item.getServer()))) .collect(toList())); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index 4595550e0..91bb9ae33 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -221,10 +221,10 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza try { Image background; - if (CONFIG.backgroundImageType.get() == EnumBackgroundImage.DEFAULT) + if (CONFIG.getBackgroundImageType() == EnumBackgroundImage.DEFAULT) background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ""); else - background = searchBackgroundImage(new Image("/assets/img/background.jpg"), CONFIG.backgroundImage.get()); + background = searchBackgroundImage(new Image("/assets/img/background.jpg"), CONFIG.getBackgroundImage()); drawerWrapper.setBackground(new Background(new BackgroundImage(background, BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT, new BackgroundSize(800, 480, false, false, true, true)))); } catch (IllegalArgumentException ignore) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index 7123bd80e..45f1b9126 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -106,10 +106,10 @@ public final class SettingsPage extends StackPane implements DecoratorPage { FXUtils.smoothScrolling(scroll); - txtProxyHost.textProperty().bindBidirectional(CONFIG.proxyHost); - txtProxyPort.textProperty().bindBidirectional(CONFIG.proxyPort); - txtProxyUsername.textProperty().bindBidirectional(CONFIG.proxyUser); - txtProxyPassword.textProperty().bindBidirectional(CONFIG.proxyPass); + txtProxyHost.textProperty().bindBidirectional(CONFIG.proxyHostProperty()); + txtProxyPort.textProperty().bindBidirectional(CONFIG.proxyPortProperty()); + txtProxyUsername.textProperty().bindBidirectional(CONFIG.proxyUserProperty()); + txtProxyPassword.textProperty().bindBidirectional(CONFIG.proxyPassProperty()); cboDownloadSource.getSelectionModel().select(DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(Settings.INSTANCE.getDownloadProvider())); cboDownloadSource.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setDownloadProvider(DownloadProviders.getDownloadProvider(newValue.intValue()))); @@ -149,28 +149,28 @@ public final class SettingsPage extends StackPane implements DecoratorPage { chkProxySocks.setToggleGroup(proxyConfigurationGroup); for (Toggle toggle : proxyConfigurationGroup.getToggles()) - if (toggle.getUserData() == CONFIG.proxyType.get()) + if (toggle.getUserData() == CONFIG.getProxyType()) toggle.setSelected(true); ToggleGroup hasProxyGroup = new ToggleGroup(); chkNoProxy.setToggleGroup(hasProxyGroup); chkManualProxy.setToggleGroup(hasProxyGroup); - if (!CONFIG.hasProxy.get()) + if (!CONFIG.hasProxy()) chkNoProxy.setSelected(true); else chkManualProxy.setSelected(true); proxyPane.disableProperty().bind(chkNoProxy.selectedProperty()); hasProxyGroup.selectedToggleProperty().addListener((a, b, newValue) -> - CONFIG.hasProxy.set(newValue != chkNoProxy)); + CONFIG.setHasProxy(newValue != chkNoProxy)); proxyConfigurationGroup.selectedToggleProperty().addListener((a, b, newValue) -> - CONFIG.proxyType.set((Proxy.Type) newValue.getUserData())); + CONFIG.setProxyType((Proxy.Type) newValue.getUserData())); - chkProxyAuthentication.selectedProperty().bindBidirectional(CONFIG.hasProxyAuth); + chkProxyAuthentication.selectedProperty().bindBidirectional(CONFIG.hasProxyAuthProperty()); authPane.disableProperty().bind(chkProxyAuthentication.selectedProperty().not()); - fileCommonLocation.pathProperty().bindBidirectional(CONFIG.commonDirectory); + fileCommonLocation.pathProperty().bindBidirectional(CONFIG.commonDirectoryProperty()); FXUtils.installTooltip(btnUpdate, i18n("update.tooltip")); checkUpdate(); @@ -180,17 +180,17 @@ public final class SettingsPage extends StackPane implements DecoratorPage { backgroundItem.createChildren(i18n("launcher.background.default"), EnumBackgroundImage.DEFAULT) )); - FXUtils.bindString(backgroundItem.getTxtCustom(), CONFIG.backgroundImage); + FXUtils.bindString(backgroundItem.getTxtCustom(), CONFIG.backgroundImageProperty()); backgroundItem.setCustomUserData(EnumBackgroundImage.CUSTOM); - backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == CONFIG.backgroundImageType.get()).findFirst().ifPresent(it -> it.setSelected(true)); + backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == CONFIG.getBackgroundImageType()).findFirst().ifPresent(it -> it.setSelected(true)); - CONFIG.backgroundImage.addListener(onInvalidating(this::initBackgroundItemSubtitle)); - CONFIG.backgroundImageType.addListener(onInvalidating(this::initBackgroundItemSubtitle)); + CONFIG.backgroundImageProperty().addListener(onInvalidating(this::initBackgroundItemSubtitle)); + CONFIG.backgroundImageTypeProperty().addListener(onInvalidating(this::initBackgroundItemSubtitle)); initBackgroundItemSubtitle(); backgroundItem.setToggleSelectedListener(newValue -> - CONFIG.backgroundImageType.set((EnumBackgroundImage) newValue.getUserData())); + CONFIG.setBackgroundImageType((EnumBackgroundImage) newValue.getUserData())); // theme JFXColorPicker picker = new JFXColorPicker(Color.web(Settings.INSTANCE.getTheme().getColor()), null); @@ -207,12 +207,12 @@ public final class SettingsPage extends StackPane implements DecoratorPage { } private void initBackgroundItemSubtitle() { - switch (CONFIG.backgroundImageType.get()) { + switch (CONFIG.getBackgroundImageType()) { case DEFAULT: backgroundItem.setSubtitle(i18n("launcher.background.default")); break; case CUSTOM: - backgroundItem.setSubtitle(CONFIG.backgroundImage.get()); + backgroundItem.setSubtitle(CONFIG.getBackgroundImage()); break; } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java index 8e1aa4933..65520fb8b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java @@ -25,7 +25,6 @@ import org.jackhuang.hmcl.mod.Modpack; import org.jackhuang.hmcl.setting.Config; import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.Profile; -import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; @@ -83,16 +82,16 @@ public final class ExportWizardProvider implements WizardProvider { try (ZipEngine zip = new ZipEngine(modpackFile)) { Config config = ConfigHolder.CONFIG.clone(); - config.hasProxy.set(false); - config.selectedProfile.set(""); - config.commonDirectory.set(null); - config.fontFamily.set("Consolas"); - config.fontSize.set(12); - config.localization.set(null); - config.accounts.clear(); - config.selectedAccount.set(""); - config.logLines.set(100); - config.configurations.clear(); + config.setHasProxy(false); + config.setSelectedProfile(""); + config.setCommonDirectory(null); + config.setFontFamily("Consolas"); + config.setFontSize(12); + config.setLocalization(null); + config.getAccounts().clear(); + config.setSelectedAccount(""); + config.setLogLines(100); + config.getConfigurations().clear(); zip.putTextFile(config.toJson(), ConfigHolder.CONFIG_FILENAME); zip.putFile(tempModpack, "modpack.zip"); From 141cda13f13f9a27747c52b1bba4c6a8e2c08cd0 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 18 Jul 2018 16:17:54 +0800 Subject: [PATCH 14/20] Add proxyProperty() --- .../main/java/org/jackhuang/hmcl/setting/ProxyManager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java index 12822e15f..8f8972ff5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java @@ -30,12 +30,13 @@ import org.jackhuang.hmcl.util.StringUtils; import javafx.beans.binding.Bindings; import javafx.beans.binding.ObjectBinding; +import javafx.beans.value.ObservableObjectValue; public final class ProxyManager { private ProxyManager() { } - public static final ObjectBinding proxyProperty = Bindings.createObjectBinding( + private static final ObjectBinding proxyProperty = Bindings.createObjectBinding( () -> { String host = CONFIG.getProxyHost(); Integer port = Lang.toIntOrNull(CONFIG.getProxyPort()); @@ -54,6 +55,10 @@ public final class ProxyManager { return proxyProperty.get(); } + public static ObservableObjectValue proxyProperty() { + return proxyProperty; + } + static { initProxy(); } From 2f6c7e1ce2c498b5577484c040a0a46e2bb43011 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 18 Jul 2018 16:21:18 +0800 Subject: [PATCH 15/20] Remove proxy from AccountFactory --- .../java/org/jackhuang/hmcl/setting/Settings.java | 2 +- .../java/org/jackhuang/hmcl/ui/AddAccountPane.java | 2 +- .../java/org/jackhuang/hmcl/auth/AccountBuilder.java | 9 +-------- .../java/org/jackhuang/hmcl/auth/AccountFactory.java | 5 ++--- .../AuthlibInjectorAccountFactory.java | 11 ++++------- .../hmcl/auth/offline/OfflineAccountFactory.java | 5 ++--- .../hmcl/auth/yggdrasil/YggdrasilAccountFactory.java | 11 ++++------- .../hmcl/auth/yggdrasil/YggdrasilService.java | 9 +-------- 8 files changed, 16 insertions(+), 38 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index a375a8ee6..c5d73164c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -79,7 +79,7 @@ public class Settings { Account account; try { - account = factory.fromStorage(settings, ProxyManager.getProxy()); + account = factory.fromStorage(settings); } catch (Exception e) { LOG.log(Level.WARNING, "Malformed account storage, removing: " + settings, e); iterator.remove(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index 92bf69814..50eba5f29 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -152,7 +152,7 @@ public class AddAccountPane extends StackPane { lblCreationWarning.setText(""); setDisable(true); - Task.ofResult("create_account", () -> factory.create(new Selector(), username, password, addtionalData, ProxyManager.getProxy())) + Task.ofResult("create_account", () -> factory.create(new Selector(), username, password, addtionalData)) .finalized(Schedulers.javafx(), variables -> { Settings.INSTANCE.addAccount(variables.get("create_account")); acceptPane.hideSpinner(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountBuilder.java index c9dbf3450..2e2ecfd93 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountBuilder.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountBuilder.java @@ -17,7 +17,6 @@ */ package org.jackhuang.hmcl.auth; -import java.net.Proxy; import java.util.Objects; public final class AccountBuilder { @@ -25,7 +24,6 @@ public final class AccountBuilder { private String username; private String password = null; private Object additionalData = null; - private Proxy proxy = Proxy.NO_PROXY; public AccountBuilder() { } @@ -50,12 +48,7 @@ public final class AccountBuilder { return this; } - public AccountBuilder setProxy(Proxy proxy) { - this.proxy = Objects.requireNonNull(proxy); - return this; - } - public T create(AccountFactory factory) throws AuthenticationException { - return factory.create(selector, Objects.requireNonNull(username), password, additionalData, proxy); + return factory.create(selector, Objects.requireNonNull(username), password, additionalData); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountFactory.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountFactory.java index 62f5fab78..65c4c0f27 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountFactory.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountFactory.java @@ -17,7 +17,6 @@ */ package org.jackhuang.hmcl.auth; -import java.net.Proxy; import java.util.Map; /** @@ -26,7 +25,7 @@ import java.util.Map; */ public abstract class AccountFactory { - public abstract T create(CharacterSelector selector, String username, String password, Object additionalData, Proxy proxy) throws AuthenticationException; + public abstract T create(CharacterSelector selector, String username, String password, Object additionalData) throws AuthenticationException; - public abstract T fromStorage(Map storage, Proxy proxy); + public abstract T fromStorage(Map storage); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java index 94b7587c0..d664d861b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java @@ -25,7 +25,6 @@ import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilSession; import org.jackhuang.hmcl.util.ExceptionalSupplier; import java.io.IOException; -import java.net.Proxy; import java.util.Map; import java.util.Objects; import java.util.function.Function; @@ -45,24 +44,22 @@ public class AuthlibInjectorAccountFactory extends AccountFactory storage, Proxy proxy) { + public AuthlibInjectorAccount fromStorage(Map storage) { Objects.requireNonNull(storage); - Objects.requireNonNull(proxy); YggdrasilSession session = YggdrasilSession.fromStorage(storage); @@ -73,7 +70,7 @@ public class AuthlibInjectorAccountFactory extends AccountFactory { } @Override - public OfflineAccount create(CharacterSelector selector, String username, String password, Object additionalData, Proxy proxy) { + public OfflineAccount create(CharacterSelector selector, String username, String password, Object additionalData) { return new OfflineAccount(username, getUUIDFromUserName(username)); } @Override - public OfflineAccount fromStorage(Map storage, Proxy proxy) { + public OfflineAccount fromStorage(Map storage) { String username = tryCast(storage.get("username"), String.class) .orElseThrow(() -> new IllegalStateException("Offline account configuration malformed.")); UUID uuid = tryCast(storage.get("uuid"), String.class) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccountFactory.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccountFactory.java index 3fb044793..77c557670 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccountFactory.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccountFactory.java @@ -22,7 +22,6 @@ import org.jackhuang.hmcl.auth.AuthenticationException; import org.jackhuang.hmcl.auth.CharacterSelector; import org.jackhuang.hmcl.util.UUIDTypeAdapter; -import java.net.Proxy; import java.util.Map; import java.util.Objects; import java.util.UUID; @@ -42,28 +41,26 @@ public class YggdrasilAccountFactory extends AccountFactory { } @Override - public YggdrasilAccount create(CharacterSelector selector, String username, String password, Object additionalData, Proxy proxy) throws AuthenticationException { + public YggdrasilAccount create(CharacterSelector selector, String username, String password, Object additionalData) throws AuthenticationException { Objects.requireNonNull(selector); Objects.requireNonNull(username); Objects.requireNonNull(password); - Objects.requireNonNull(proxy); - YggdrasilAccount account = new YggdrasilAccount(new YggdrasilService(provider, proxy), username, null, null); + YggdrasilAccount account = new YggdrasilAccount(new YggdrasilService(provider), username, null, null); account.logInWithPassword(password, selector); return account; } @Override - public YggdrasilAccount fromStorage(Map storage, Proxy proxy) { + public YggdrasilAccount fromStorage(Map storage) { Objects.requireNonNull(storage); - Objects.requireNonNull(proxy); YggdrasilSession session = YggdrasilSession.fromStorage(storage); String username = tryCast(storage.get("username"), String.class) .orElseThrow(() -> new IllegalArgumentException("storage does not have username")); - return new YggdrasilAccount(new YggdrasilService(provider, proxy), username, session.getSelectedProfile().getId(), session); + return new YggdrasilAccount(new YggdrasilService(provider), username, session.getSelectedProfile().getId(), session); } public static String randomToken() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java index 1f1c8cacd..a56483e46 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java @@ -9,7 +9,6 @@ import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.UUIDTypeAdapter; import java.io.IOException; -import java.net.Proxy; import java.net.URL; import java.util.*; @@ -21,15 +20,9 @@ import static org.jackhuang.hmcl.util.Pair.pair; public class YggdrasilService { private final YggdrasilProvider provider; - private final Proxy proxy; public YggdrasilService(YggdrasilProvider provider) { - this(provider, Proxy.NO_PROXY); - } - - public YggdrasilService(YggdrasilProvider provider, Proxy proxy) { this.provider = provider; - this.proxy = proxy; } public YggdrasilSession authenticate(String username, String password, String clientToken) throws AuthenticationException { @@ -155,7 +148,7 @@ public class YggdrasilService { private String request(URL url, Object payload) throws AuthenticationException { try { if (payload == null) - return NetworkUtils.doGet(url, proxy); + return NetworkUtils.doGet(url); else return NetworkUtils.doPost(url, payload instanceof String ? (String) payload : GSON.toJson(payload), "application/json"); } catch (IOException e) { From 06806bd3837c16e6602cb777101704db749021e8 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 18 Jul 2018 16:27:07 +0800 Subject: [PATCH 16/20] Remove proxy from FileDownloadTask/GetTask/NetworkUtils --- .../jackhuang/hmcl/game/AccountHelper.java | 4 ++-- .../hmcl/game/HMCLGameDownloadTask.java | 1 - .../hmcl/upgrade/AppDataUpgrader.java | 4 ++-- .../AuthlibInjectorDownloader.java | 3 +-- .../download/game/GameAssetDownloadTask.java | 2 +- .../game/GameAssetIndexDownloadTask.java | 2 +- .../hmcl/download/game/GameDownloadTask.java | 1 - .../game/GameLoggingDownloadTask.java | 2 +- .../download/game/LibraryDownloadTask.java | 4 ++-- .../game/VersionJsonDownloadTask.java | 3 +-- .../hmcl/mod/CurseCompletionTask.java | 4 ++-- .../jackhuang/hmcl/task/FileDownloadTask.java | 24 ++++--------------- .../java/org/jackhuang/hmcl/task/GetTask.java | 21 ++++++---------- .../org/jackhuang/hmcl/util/NetworkUtils.java | 24 +++++-------------- 14 files changed, 31 insertions(+), 68 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java index 1ef663c39..0a078f585 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java @@ -154,7 +154,7 @@ public final class AccountHelper { File file = getSkinFile(profile.getId()); if (!refresh && file.exists()) return; - new FileDownloadTask(NetworkUtils.toURL(url), file, proxy).run(); + new FileDownloadTask(NetworkUtils.toURL(url), file).run(); } private static void downloadSkin(YggdrasilAccount account, boolean refresh, Proxy proxy) throws Exception { @@ -167,7 +167,7 @@ public final class AccountHelper { File file = getSkinFile(account.getUUID()); if (!refresh && file.exists()) return; - new FileDownloadTask(NetworkUtils.toURL(url), file, proxy).run(); + new FileDownloadTask(NetworkUtils.toURL(url), file).run(); } public static Image scale(String url, double scaleRatio) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java index 7a7f2e31c..ce34357a3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java @@ -71,7 +71,6 @@ public class HMCLGameDownloadTask extends Task { dependencies.add(new FileDownloadTask( NetworkUtils.toURL(profile.getDependency().getDownloadProvider().injectURL(version.getDownloadInfo().getUrl())), cache, - profile.getDependency().getProxy(), new IntegrityCheck("SHA-1", version.getDownloadInfo().getSha1()) ).then(Task.of(v -> FileUtils.copyFile(cache, jar)))); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java index 1cd70a89b..bfd7af422 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java @@ -185,7 +185,7 @@ public class AppDataUpgrader extends IUpgrader { @Override public Collection getDependents() { - return Collections.singleton(new FileDownloadTask(downloadLink, tempFile, Proxy.NO_PROXY, new IntegrityCheck("SHA-1", hash))); + return Collections.singleton(new FileDownloadTask(downloadLink, tempFile, new IntegrityCheck("SHA-1", hash))); } @Override @@ -235,7 +235,7 @@ public class AppDataUpgrader extends IUpgrader { @Override public Collection getDependents() { - return Collections.singleton(new FileDownloadTask(downloadLink, tempFile, Proxy.NO_PROXY, new IntegrityCheck("SHA-1", hash))); + return Collections.singleton(new FileDownloadTask(downloadLink, tempFile, new IntegrityCheck("SHA-1", hash))); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorDownloader.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorDownloader.java index e7a657b62..40b03aa17 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorDownloader.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorDownloader.java @@ -20,7 +20,6 @@ package org.jackhuang.hmcl.auth.authlibinjector; import static org.jackhuang.hmcl.util.Logging.LOG; import java.io.IOException; -import java.net.Proxy; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; @@ -81,7 +80,7 @@ public class AuthlibInjectorDownloader { } try { - new FileDownloadTask(new URL(downloadProvider.get().injectURL(latest.downloadUrl)), artifactLocation.toFile(), Proxy.NO_PROXY, + new FileDownloadTask(new URL(downloadProvider.get().injectURL(latest.downloadUrl)), artifactLocation.toFile(), Optional.ofNullable(latest.checksums.get("sha256")) .map(checksum -> new IntegrityCheck("SHA-256", checksum)) .orElse(null)) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java index 8f95de725..e12f10c27 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java @@ -107,7 +107,7 @@ public final class GameAssetDownloadTask extends Task { flag = !file.exists(); } if (flag) { - FileDownloadTask task = new FileDownloadTask(NetworkUtils.toURL(url), file, dependencyManager.getProxy(), new IntegrityCheck("SHA-1", assetObject.getHash())); + FileDownloadTask task = new FileDownloadTask(NetworkUtils.toURL(url), file, new IntegrityCheck("SHA-1", assetObject.getHash())); task.setName(assetObject.getHash()); dependencies.add(task); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java index 9e1878024..12f7b66e6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java @@ -67,7 +67,7 @@ public final class GameAssetIndexDownloadTask extends Task { File assetIndexFile = dependencyManager.getGameRepository().getIndexFile(version.getId(), assetIndexInfo.getId()); dependencies.add(new FileDownloadTask( NetworkUtils.toURL(dependencyManager.getDownloadProvider().injectURL(assetIndexInfo.getUrl())), - assetIndexFile, dependencyManager.getProxy() + assetIndexFile )); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameDownloadTask.java index 9400f771f..7db56833c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameDownloadTask.java @@ -56,7 +56,6 @@ public final class GameDownloadTask extends Task { dependencies.add(new FileDownloadTask( NetworkUtils.toURL(dependencyManager.getDownloadProvider().injectURL(version.getDownloadInfo().getUrl())), jar, - dependencyManager.getProxy(), new IntegrityCheck("SHA-1", version.getDownloadInfo().getSha1()) )); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLoggingDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLoggingDownloadTask.java index 981de53f0..c5a80d545 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLoggingDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLoggingDownloadTask.java @@ -66,7 +66,7 @@ public final class GameLoggingDownloadTask extends Task { LoggingInfo logging = version.getLogging().get(DownloadType.CLIENT); File file = dependencyManager.getGameRepository().getLoggingObject(version.getId(), version.getAssetIndex().getId(), logging); if (!file.exists()) - dependencies.add(new FileDownloadTask(NetworkUtils.toURL(logging.getFile().getUrl()), file, dependencyManager.getProxy())); + dependencies.add(new FileDownloadTask(NetworkUtils.toURL(logging.getFile().getUrl()), file)); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java index e979f008f..67de5b5bf 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java @@ -43,13 +43,13 @@ public final class LibraryDownloadTask extends Task { xzFile = new File(file.getAbsoluteFile().getParentFile(), file.getName() + ".pack.xz"); xzTask = new FileDownloadTask(NetworkUtils.toURL(url + ".pack.xz"), - xzFile, dependencyManager.getProxy(), null, 1); + xzFile, null, 1); xzTask.setSignificance(TaskSignificance.MINOR); setSignificance(TaskSignificance.MODERATE); task = new FileDownloadTask(NetworkUtils.toURL(url), - file, dependencyManager.getProxy(), + file, library.getDownload().getSha1() != null ? new IntegrityCheck("SHA-1", library.getDownload().getSha1()) : null); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/VersionJsonDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/VersionJsonDownloadTask.java index ff660ba7d..061c393ca 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/VersionJsonDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/VersionJsonDownloadTask.java @@ -24,7 +24,6 @@ import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.NetworkUtils; -import java.net.Proxy; import java.util.Collection; import java.util.LinkedList; import java.util.List; @@ -66,7 +65,7 @@ public final class VersionJsonDownloadTask extends Task { RemoteVersion remoteVersion = gameVersionList.getVersions(gameVersion).stream().findFirst() .orElseThrow(() -> new IllegalStateException("Cannot find specific version " + gameVersion + " in remote repository")); String jsonURL = dependencyManager.getDownloadProvider().injectURL(remoteVersion.getUrl()); - dependencies.add(new GetTask(NetworkUtils.toURL(jsonURL), Proxy.NO_PROXY, ID)); + dependencies.add(new GetTask(NetworkUtils.toURL(jsonURL), ID)); } public static final String ID = "raw_version_json"; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/CurseCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/CurseCompletionTask.java index da7f1b355..b915d83bd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/CurseCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/CurseCompletionTask.java @@ -109,7 +109,7 @@ public final class CurseCompletionTask extends Task { updateProgress(finished.incrementAndGet(), manifest.getFiles().size()); if (StringUtils.isBlank(file.getFileName())) { try { - return file.withFileName(NetworkUtils.detectFileName(file.getUrl(), dependencyManager.getProxy())); + return file.withFileName(NetworkUtils.detectFileName(file.getUrl())); } catch (IOException ioe) { Logging.LOG.log(Level.WARNING, "Unable to fetch the file name of URL: " + file.getUrl(), ioe); flag.set(false); @@ -125,7 +125,7 @@ public final class CurseCompletionTask extends Task { if (StringUtils.isNotBlank(file.getFileName())) { File dest = new File(run, "mods/" + file.getFileName()); if (!dest.exists()) - dependencies.add(new FileDownloadTask(file.getUrl(), dest, dependencyManager.getProxy())); + dependencies.add(new FileDownloadTask(file.getUrl(), dest)); } // Let this task fail if the curse manifest has not been completed. diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java index 37f6aefc7..c3a5afe91 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java @@ -31,7 +31,6 @@ import java.io.InputStream; import java.io.RandomAccessFile; import java.math.BigInteger; import java.net.HttpURLConnection; -import java.net.Proxy; import java.net.URL; import java.security.MessageDigest; import java.util.logging.Level; @@ -79,7 +78,6 @@ public class FileDownloadTask extends Task { private final File file; private final IntegrityCheck integrityCheck; private final int retry; - private final Proxy proxy; private final EventManager> onFailed = new EventManager<>(); private RandomAccessFile rFile; private InputStream stream; @@ -89,26 +87,16 @@ public class FileDownloadTask extends Task { * @param file the location that download to. */ public FileDownloadTask(URL url, File file) { - this(url, file, Proxy.NO_PROXY); + this(url, file, null); } /** * @param url the URL of remote file. * @param file the location that download to. - * @param proxy the proxy. - */ - public FileDownloadTask(URL url, File file, Proxy proxy) { - this(url, file, proxy, null); - } - - /** - * @param url the URL of remote file. - * @param file the location that download to. - * @param proxy the proxy. * @param integrityCheck the integrity check to perform, null if no integrity check is to be performed */ - public FileDownloadTask(URL url, File file, Proxy proxy, IntegrityCheck integrityCheck) { - this(url, file, proxy, integrityCheck, 5); + public FileDownloadTask(URL url, File file, IntegrityCheck integrityCheck) { + this(url, file, integrityCheck, 5); } /** @@ -116,14 +104,12 @@ public class FileDownloadTask extends Task { * @param file the location that download to. * @param integrityCheck the integrity check to perform, null if no integrity check is to be performed * @param retry the times for retrying if downloading fails. - * @param proxy the proxy. */ - public FileDownloadTask(URL url, File file, Proxy proxy, IntegrityCheck integrityCheck, int retry) { + public FileDownloadTask(URL url, File file, IntegrityCheck integrityCheck, int retry) { this.url = url; this.file = file; this.integrityCheck = integrityCheck; this.retry = retry; - this.proxy = proxy; setName(file.getName()); } @@ -174,7 +160,7 @@ public class FileDownloadTask extends Task { try { updateProgress(0); - HttpURLConnection con = NetworkUtils.createConnection(url, proxy); + HttpURLConnection con = NetworkUtils.createConnection(url); con.connect(); if (con.getResponseCode() / 100 != 2) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java index 4e8ff1b70..c74b2fbf7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java @@ -25,7 +25,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; -import java.net.Proxy; import java.net.URL; import java.nio.charset.Charset; import java.util.logging.Level; @@ -41,30 +40,24 @@ public final class GetTask extends TaskResult { private final URL url; private final Charset charset; private final int retry; - private final Proxy proxy; private final String id; public GetTask(URL url) { - this(url, Proxy.NO_PROXY); + this(url, ID); } - public GetTask(URL url, Proxy proxy) { - this(url, proxy, ID); + public GetTask(URL url, String id) { + this(url, id, UTF_8); } - public GetTask(URL url, Proxy proxy, String id) { - this(url, proxy, id, UTF_8); + public GetTask(URL url, String id, Charset charset) { + this(url, id, charset, 5); } - public GetTask(URL url, Proxy proxy, String id, Charset charset) { - this(url, proxy, id, charset, 5); - } - - public GetTask(URL url, Proxy proxy, String id, Charset charset, int retry) { + public GetTask(URL url, String id, Charset charset, int retry) { this.url = url; this.charset = charset; this.retry = retry; - this.proxy = proxy; this.id = id; setName(url.toString()); @@ -88,7 +81,7 @@ public final class GetTask extends TaskResult { Logging.LOG.log(Level.WARNING, "Failed to download, repeat times: " + time); try { updateProgress(0); - HttpURLConnection conn = NetworkUtils.createConnection(url, proxy); + HttpURLConnection conn = NetworkUtils.createConnection(url); InputStream input = conn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[IOUtils.DEFAULT_BUFFER_SIZE]; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java index 8323e2586..91fecb24f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java @@ -48,8 +48,8 @@ public final class NetworkUtils { NetworkUtils.userAgentSupplier = Objects.requireNonNull(userAgentSupplier); } - public static HttpURLConnection createConnection(URL url, Proxy proxy) throws IOException { - HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy); + public static HttpURLConnection createConnection(URL url) throws IOException { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.setUseCaches(false); connection.setConnectTimeout(15000); @@ -59,11 +59,7 @@ public final class NetworkUtils { } public static String doGet(URL url) throws IOException { - return IOUtils.readFullyAsString(createConnection(url, Proxy.NO_PROXY).getInputStream()); - } - - public static String doGet(URL url, Proxy proxy) throws IOException { - return IOUtils.readFullyAsString(createConnection(url, proxy).getInputStream()); + return IOUtils.readFullyAsString(createConnection(url).getInputStream()); } public static String doPost(URL u, Map params) throws IOException { @@ -80,14 +76,10 @@ public final class NetworkUtils { return doPost(u, post, "application/x-www-form-urlencoded"); } - public static String doPost(URL u, String post, String contentType) throws IOException { - return doPost(u, post, contentType, Proxy.NO_PROXY); - } - - public static String doPost(URL url, String post, String contentType, Proxy proxy) throws IOException { + public static String doPost(URL url, String post, String contentType) throws IOException { byte[] bytes = post.getBytes(UTF_8); - HttpURLConnection con = createConnection(url, proxy); + HttpURLConnection con = createConnection(url); con.setRequestMethod("POST"); con.setDoOutput(true); con.setRequestProperty("Content-Type", contentType + "; charset=utf-8"); @@ -120,11 +112,7 @@ public final class NetworkUtils { } public static String detectFileName(URL url) throws IOException { - return detectFileName(url, Proxy.NO_PROXY); - } - - public static String detectFileName(URL url, Proxy proxy) throws IOException { - HttpURLConnection conn = createConnection(url, proxy); + HttpURLConnection conn = createConnection(url); conn.connect(); if (conn.getResponseCode() / 100 != 2) throw new IOException("Response code " + conn.getResponseCode()); From fe87a899c85330d057db85c30c2202d4322f1ff7 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 18 Jul 2018 16:32:11 +0800 Subject: [PATCH 17/20] Remove proxy from AccountHelper --- .../jackhuang/hmcl/game/AccountHelper.java | 38 ++++++------------- .../org/jackhuang/hmcl/ui/AddAccountPane.java | 3 +- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java index 0a078f585..d60284fa0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/AccountHelper.java @@ -24,7 +24,6 @@ import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.yggdrasil.GameProfile; import org.jackhuang.hmcl.auth.yggdrasil.Texture; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; -import org.jackhuang.hmcl.setting.ProxyManager; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Scheduler; @@ -34,7 +33,6 @@ import org.jackhuang.hmcl.ui.DialogController; import org.jackhuang.hmcl.util.NetworkUtils; import java.io.File; -import java.net.Proxy; import java.util.*; public final class AccountHelper { @@ -44,31 +42,19 @@ public final class AccountHelper { public static final File SKIN_DIR = new File(Launcher.HMCL_DIRECTORY, "skins"); public static void loadSkins() { - loadSkins(Proxy.NO_PROXY); - } - - public static void loadSkins(Proxy proxy) { for (Account account : Settings.INSTANCE.getAccounts()) { if (account instanceof YggdrasilAccount) { - new SkinLoadTask((YggdrasilAccount) account, proxy, false).start(); + new SkinLoadTask((YggdrasilAccount) account, false).start(); } } } public static Task loadSkinAsync(YggdrasilAccount account) { - return loadSkinAsync(account, ProxyManager.getProxy()); - } - - public static Task loadSkinAsync(YggdrasilAccount account, Proxy proxy) { - return new SkinLoadTask(account, proxy, false); + return new SkinLoadTask(account, false); } public static Task refreshSkinAsync(YggdrasilAccount account) { - return refreshSkinAsync(account, ProxyManager.getProxy()); - } - - public static Task refreshSkinAsync(YggdrasilAccount account, Proxy proxy) { - return new SkinLoadTask(account, proxy, true); + return new SkinLoadTask(account, true); } private static File getSkinFile(UUID uuid) { @@ -95,9 +81,9 @@ public final class AccountHelper { return getDefaultSkin(uuid, scaleRatio); } - public static Image getSkinImmediately(YggdrasilAccount account, GameProfile profile, double scaleRatio, Proxy proxy) throws Exception { + public static Image getSkinImmediately(YggdrasilAccount account, GameProfile profile, double scaleRatio) throws Exception { File file = getSkinFile(profile.getId()); - downloadSkin(account, profile, true, proxy); + downloadSkin(account, profile, true); if (!file.exists()) return getDefaultSkin(profile.getId(), scaleRatio); @@ -112,17 +98,15 @@ public final class AccountHelper { private static class SkinLoadTask extends Task { private final YggdrasilAccount account; - private final Proxy proxy; private final boolean refresh; private final List dependencies = new LinkedList<>(); - public SkinLoadTask(YggdrasilAccount account, Proxy proxy) { - this(account, proxy, false); + public SkinLoadTask(YggdrasilAccount account) { + this(account, false); } - public SkinLoadTask(YggdrasilAccount account, Proxy proxy, boolean refresh) { + public SkinLoadTask(YggdrasilAccount account, boolean refresh) { this.account = account; - this.proxy = proxy; this.refresh = refresh; } @@ -141,11 +125,11 @@ public final class AccountHelper { if (!account.isLoggedIn() && (account.getCharacter() == null || refresh)) DialogController.logIn(account); - downloadSkin(account, refresh, proxy); + downloadSkin(account, refresh); } } - private static void downloadSkin(YggdrasilAccount account, GameProfile profile, boolean refresh, Proxy proxy) throws Exception { + private static void downloadSkin(YggdrasilAccount account, GameProfile profile, boolean refresh) throws Exception { account.clearCache(); Optional texture = account.getSkin(profile); @@ -157,7 +141,7 @@ public final class AccountHelper { new FileDownloadTask(NetworkUtils.toURL(url), file).run(); } - private static void downloadSkin(YggdrasilAccount account, boolean refresh, Proxy proxy) throws Exception { + private static void downloadSkin(YggdrasilAccount account, boolean refresh) throws Exception { account.clearCache(); if (account.getCharacter() == null) return; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index 50eba5f29..f10c269fb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -41,7 +41,6 @@ import org.jackhuang.hmcl.auth.yggdrasil.RemoteAuthenticationException; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; import org.jackhuang.hmcl.game.AccountHelper; import org.jackhuang.hmcl.setting.Accounts; -import org.jackhuang.hmcl.setting.ProxyManager; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; @@ -212,7 +211,7 @@ public class AddAccountPane extends StackPane { for (GameProfile profile : names) { Image image; try { - image = AccountHelper.getSkinImmediately(yggdrasilAccount, profile, 4, ProxyManager.getProxy()); + image = AccountHelper.getSkinImmediately(yggdrasilAccount, profile, 4); } catch (Exception e) { Logging.LOG.log(Level.WARNING, "Failed to get skin for " + profile.getName(), e); image = null; From 486ca434ffeb51542fae57574a17db8680d74a7f Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 18 Jul 2018 16:33:47 +0800 Subject: [PATCH 18/20] Remove proxy HMCLDependencyManager --- .../jackhuang/hmcl/game/HMCLDependencyManager.java | 8 +------- .../java/org/jackhuang/hmcl/setting/Profile.java | 2 +- .../hmcl/download/DefaultDependencyManager.java | 13 ------------- .../jackhuang/hmcl/download/DependencyManager.java | 7 ------- 4 files changed, 2 insertions(+), 28 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLDependencyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLDependencyManager.java index 5c3e2093b..7c81dabd8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLDependencyManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLDependencyManager.java @@ -22,8 +22,6 @@ import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.GameBuilder; import org.jackhuang.hmcl.setting.Profile; -import java.net.Proxy; - /** * @author huangyuhui */ @@ -31,11 +29,7 @@ public class HMCLDependencyManager extends DefaultDependencyManager { private final Profile profile; public HMCLDependencyManager(Profile profile, DownloadProvider downloadProvider) { - this(profile, downloadProvider, Proxy.NO_PROXY); - } - - public HMCLDependencyManager(Profile profile, DownloadProvider downloadProvider, Proxy proxy) { - super(profile.getRepository(), downloadProvider, proxy); + super(profile.getRepository(), downloadProvider); this.profile = profile; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java index 8ffd57580..e6b134098 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java @@ -122,7 +122,7 @@ public final class Profile { } public HMCLDependencyManager getDependency() { - return new HMCLDependencyManager(this, Settings.INSTANCE.getDownloadProvider(), ProxyManager.getProxy()); + return new HMCLDependencyManager(this, Settings.INSTANCE.getDownloadProvider()); } public VersionSetting getVersionSetting(String id) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultDependencyManager.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultDependencyManager.java index f86b080e1..b1297fecc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultDependencyManager.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultDependencyManager.java @@ -29,8 +29,6 @@ import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.ParallelTask; import org.jackhuang.hmcl.task.Task; -import java.net.Proxy; - /** * Note: This class has no state. * @@ -40,16 +38,10 @@ public class DefaultDependencyManager extends AbstractDependencyManager { private final DefaultGameRepository repository; private final DownloadProvider downloadProvider; - private final Proxy proxy; public DefaultDependencyManager(DefaultGameRepository repository, DownloadProvider downloadProvider) { - this(repository, downloadProvider, Proxy.NO_PROXY); - } - - public DefaultDependencyManager(DefaultGameRepository repository, DownloadProvider downloadProvider, Proxy proxy) { this.repository = repository; this.downloadProvider = downloadProvider; - this.proxy = proxy; } @Override @@ -62,11 +54,6 @@ public class DefaultDependencyManager extends AbstractDependencyManager { return downloadProvider; } - @Override - public Proxy getProxy() { - return proxy; - } - @Override public GameBuilder gameBuilder() { return new DefaultGameBuilder(this); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DependencyManager.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DependencyManager.java index 830b90314..c3b00047b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DependencyManager.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DependencyManager.java @@ -21,8 +21,6 @@ import org.jackhuang.hmcl.game.GameRepository; import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.Task; -import java.net.Proxy; - /** * Do everything that will connect to Internet. * Downloading Minecraft files. @@ -36,11 +34,6 @@ public interface DependencyManager { */ GameRepository getGameRepository(); - /** - * The proxy that all network operations should go through. - */ - Proxy getProxy(); - /** * Check if the game is complete. * Check libraries, assets, logging files and so on. From ec41c13b454a286e8b890b1eb95db4fee051a985 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 18 Jul 2018 16:36:11 +0800 Subject: [PATCH 19/20] Update docs for tasks in org.jackhuang.hmcl.download.game --- .../org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java | 2 +- .../hmcl/download/game/GameAssetIndexDownloadTask.java | 2 +- .../org/jackhuang/hmcl/download/game/GameAssetRefreshTask.java | 2 +- .../org/jackhuang/hmcl/download/game/GameLibrariesTask.java | 2 +- .../jackhuang/hmcl/download/game/GameLoggingDownloadTask.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java index e12f10c27..d60ecc76a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java @@ -53,7 +53,7 @@ public final class GameAssetDownloadTask extends Task { /** * Constructor. * - * @param dependencyManager the dependency manager that can provides proxy settings and {@link org.jackhuang.hmcl.game.GameRepository} + * @param dependencyManager the dependency manager that can provides {@link org.jackhuang.hmcl.game.GameRepository} * @param version the resolved version */ public GameAssetDownloadTask(AbstractDependencyManager dependencyManager, Version version) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java index 12f7b66e6..0e05560f9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java @@ -44,7 +44,7 @@ public final class GameAssetIndexDownloadTask extends Task { /** * Constructor. * - * @param dependencyManager the dependency manager that can provides proxy settings and {@link org.jackhuang.hmcl.game.GameRepository} + * @param dependencyManager the dependency manager that can provides {@link org.jackhuang.hmcl.game.GameRepository} * @param version the resolved version */ public GameAssetIndexDownloadTask(AbstractDependencyManager dependencyManager, Version version) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetRefreshTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetRefreshTask.java index a7b34f51c..9b825a1d3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetRefreshTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetRefreshTask.java @@ -51,7 +51,7 @@ public final class GameAssetRefreshTask extends TaskResultresolved version */ public GameAssetRefreshTask(AbstractDependencyManager dependencyManager, Version version) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java index 46baf515c..b667a8e73 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java @@ -41,7 +41,7 @@ public final class GameLibrariesTask extends Task { /** * Constructor. * - * @param dependencyManager the dependency manager that can provides proxy settings and {@link org.jackhuang.hmcl.game.GameRepository} + * @param dependencyManager the dependency manager that can provides {@link org.jackhuang.hmcl.game.GameRepository} * @param version the resolved version */ public GameLibrariesTask(AbstractDependencyManager dependencyManager, Version version) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLoggingDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLoggingDownloadTask.java index c5a80d545..895191020 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLoggingDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLoggingDownloadTask.java @@ -44,7 +44,7 @@ public final class GameLoggingDownloadTask extends Task { /** * Constructor. * - * @param dependencyManager the dependency manager that can provides proxy settings and {@link org.jackhuang.hmcl.game.GameRepository} + * @param dependencyManager the dependency manager that can provides {@link org.jackhuang.hmcl.game.GameRepository} * @param version the resolved version */ public GameLoggingDownloadTask(DependencyManager dependencyManager, Version version) { From a64a51c7df6fe7f2de01a51a2500d1200665ebf5 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 18 Jul 2018 20:07:13 +0800 Subject: [PATCH 20/20] Refactor proxy UI --- .../org/jackhuang/hmcl/ui/SettingsPage.java | 71 +++++++++++-------- .../main/resources/assets/fxml/setting.fxml | 3 +- .../resources/assets/lang/I18N.properties | 3 +- .../resources/assets/lang/I18N_zh.properties | 5 +- .../assets/lang/I18N_zh_CN.properties | 5 +- 5 files changed, 46 insertions(+), 41 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index 45f1b9126..25a4aa39e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -20,6 +20,8 @@ package org.jackhuang.hmcl.ui; import com.jfoenix.controls.*; import com.jfoenix.effects.JFXDepthManager; import javafx.application.Platform; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; @@ -27,7 +29,6 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; -import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; @@ -50,6 +51,7 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.net.Proxy; import java.util.Collections; +import java.util.Objects; public final class SettingsPage extends StackPane implements DecoratorPage { private final StringProperty title = new SimpleStringProperty(this, "title", i18n("settings.launcher")); @@ -87,9 +89,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { @FXML private StackPane themeColorPickerContainer; @FXML - private JFXRadioButton chkNoProxy; - @FXML - private JFXRadioButton chkManualProxy; + private JFXCheckBox chkEnableProxy; @FXML private JFXRadioButton chkProxyHttp; @FXML @@ -106,11 +106,6 @@ public final class SettingsPage extends StackPane implements DecoratorPage { FXUtils.smoothScrolling(scroll); - txtProxyHost.textProperty().bindBidirectional(CONFIG.proxyHostProperty()); - txtProxyPort.textProperty().bindBidirectional(CONFIG.proxyPortProperty()); - txtProxyUsername.textProperty().bindBidirectional(CONFIG.proxyUserProperty()); - txtProxyPassword.textProperty().bindBidirectional(CONFIG.proxyPassProperty()); - cboDownloadSource.getSelectionModel().select(DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(Settings.INSTANCE.getDownloadProvider())); cboDownloadSource.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setDownloadProvider(DownloadProviders.getDownloadProvider(newValue.intValue()))); @@ -141,34 +136,48 @@ public final class SettingsPage extends StackPane implements DecoratorPage { cboLanguage.getSelectionModel().select(Locales.LOCALES.indexOf(Settings.INSTANCE.getLocale())); cboLanguage.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> Settings.INSTANCE.setLocale(Locales.getLocale(newValue.intValue()))); + // ==== Proxy ==== + txtProxyHost.textProperty().bindBidirectional(CONFIG.proxyHostProperty()); + txtProxyPort.textProperty().bindBidirectional(CONFIG.proxyPortProperty()); + txtProxyUsername.textProperty().bindBidirectional(CONFIG.proxyUserProperty()); + txtProxyPassword.textProperty().bindBidirectional(CONFIG.proxyPassProperty()); + + proxyPane.disableProperty().bind(chkEnableProxy.selectedProperty().not()); + authPane.disableProperty().bind(chkProxyAuthentication.selectedProperty().not()); + + chkEnableProxy.selectedProperty().bindBidirectional(CONFIG.hasProxyProperty()); + chkProxyAuthentication.selectedProperty().bindBidirectional(CONFIG.hasProxyAuthProperty()); + + ObjectProperty selectedProxyType = new SimpleObjectProperty(Proxy.Type.HTTP) { + { + invalidated(); + } + + @Override + protected void invalidated() { + Proxy.Type type = Objects.requireNonNull(get()); + if (type == Proxy.Type.DIRECT) { + set(Proxy.Type.HTTP); // HTTP by default + } else { + chkProxyHttp.setSelected(type == Proxy.Type.HTTP); + chkProxySocks.setSelected(type == Proxy.Type.SOCKS); + } + } + }; + selectedProxyType.bindBidirectional(CONFIG.proxyTypeProperty()); ToggleGroup proxyConfigurationGroup = new ToggleGroup(); chkProxyHttp.setUserData(Proxy.Type.HTTP); chkProxyHttp.setToggleGroup(proxyConfigurationGroup); chkProxySocks.setUserData(Proxy.Type.SOCKS); chkProxySocks.setToggleGroup(proxyConfigurationGroup); - - for (Toggle toggle : proxyConfigurationGroup.getToggles()) - if (toggle.getUserData() == CONFIG.getProxyType()) - toggle.setSelected(true); - - ToggleGroup hasProxyGroup = new ToggleGroup(); - chkNoProxy.setToggleGroup(hasProxyGroup); - chkManualProxy.setToggleGroup(hasProxyGroup); - if (!CONFIG.hasProxy()) - chkNoProxy.setSelected(true); - else - chkManualProxy.setSelected(true); - proxyPane.disableProperty().bind(chkNoProxy.selectedProperty()); - - hasProxyGroup.selectedToggleProperty().addListener((a, b, newValue) -> - CONFIG.setHasProxy(newValue != chkNoProxy)); - - proxyConfigurationGroup.selectedToggleProperty().addListener((a, b, newValue) -> - CONFIG.setProxyType((Proxy.Type) newValue.getUserData())); - - chkProxyAuthentication.selectedProperty().bindBidirectional(CONFIG.hasProxyAuthProperty()); - authPane.disableProperty().bind(chkProxyAuthentication.selectedProperty().not()); + proxyConfigurationGroup.getToggles().forEach( + toggle -> toggle.selectedProperty().addListener((observable, oldValue, newValue) -> { + if (newValue) { + selectedProxyType.set((Proxy.Type) toggle.getUserData()); + } + })); + // ==== fileCommonLocation.pathProperty().bindBidirectional(CONFIG.commonDirectoryProperty()); diff --git a/HMCL/src/main/resources/assets/fxml/setting.fxml b/HMCL/src/main/resources/assets/fxml/setting.fxml index 2fd147469..8b069368f 100644 --- a/HMCL/src/main/resources/assets/fxml/setting.fxml +++ b/HMCL/src/main/resources/assets/fxml/setting.fxml @@ -55,8 +55,7 @@ - - + diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 4ccdd815f..ada64ed98 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -288,8 +288,7 @@ settings.launcher.language=Language settings.launcher.log_font=Log Font settings.launcher.proxy=Proxy settings.launcher.proxy.authentication=Proxy Authentication -settings.launcher.proxy.no_proxy=No proxy -settings.launcher.proxy.has_proxy=Proxy configuration +settings.launcher.proxy.enable=Enable Proxy settings.launcher.proxy.host=Host settings.launcher.proxy.http=HTTP settings.launcher.proxy.password=Password diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 2d480d78f..706a9c5aa 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -287,9 +287,8 @@ settings.launcher.download_source=下載源 settings.launcher.language=語言 settings.launcher.log_font=日誌字體 settings.launcher.proxy=代理 -settings.launcher.proxy.authentication=代理賬戶 -settings.launcher.proxy.no_proxy=直連 -settings.launcher.proxy.has_proxy=啓用驗證 +settings.launcher.proxy.authentication=身份驗證 +settings.launcher.proxy.enable=启用代理 settings.launcher.proxy.host=主機 settings.launcher.proxy.http=HTTP settings.launcher.proxy.password=密碼 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 fe5751a81..f183968d6 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -287,9 +287,8 @@ settings.launcher.download_source=下载源 settings.launcher.language=语言 settings.launcher.log_font=日志字体 settings.launcher.proxy=代理 -settings.launcher.proxy.authentication=代理账户 -settings.launcher.proxy.no_proxy=直连 -settings.launcher.proxy.has_proxy=启用验证 +settings.launcher.proxy.authentication=身份验证 +settings.launcher.proxy.enable=启用代理 settings.launcher.proxy.host=主机 settings.launcher.proxy.http=HTTP settings.launcher.proxy.password=密码