From d9db108a3194c25214961bdfecb2f188f1052806 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Fri, 23 Nov 2018 22:57:21 +0800 Subject: [PATCH] Use flag instead of accountId to store selected account Mentioned in #488 --- .../org/jackhuang/hmcl/setting/Accounts.java | 30 ++++++------- .../org/jackhuang/hmcl/setting/Config.java | 15 ------- .../hmcl/setting/ConfigUpgrader.java | 45 ++++++++++++------- 3 files changed, 43 insertions(+), 47 deletions(-) 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 b0a81bbcc..befd09941 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -97,10 +97,6 @@ public final class Accounts { throw new IllegalArgumentException("Failed to determine account type: " + account); } - static String accountId(Account account) { - return account.getUsername() + ":" + account.getCharacter(); - } - private static ObservableList accounts = observableArrayList(account -> new Observable[] { account }); private static ReadOnlyListWrapper accountsWrapper = new ReadOnlyListWrapper<>(Accounts.class, "accounts", accounts); @@ -135,7 +131,7 @@ public final class Accounts { // selection is valid, store it if (!initialized) return; - config().setSelectedAccount(selected == null ? "" : accountId(selected)); + updateAccountStorages(); } }; @@ -148,9 +144,12 @@ public final class Accounts { accounts.addListener(onInvalidating(Accounts::updateAccountStorages)); } - static Map getAccountStorage(Account account) { + private static Map getAccountStorage(Account account) { Map storage = account.toStorage(); storage.put("type", getLoginType(getAccountFactory(account))); + if (account == selectedAccount.get()) { + storage.put("selected", true); + } return storage; } @@ -185,27 +184,26 @@ public final class Accounts { return; } accounts.add(account); + + if (Boolean.TRUE.equals(storage.get("selected"))) { + selectedAccount.set(account); + } }); initialized = true; config().getAuthlibInjectorServers().addListener(onInvalidating(Accounts::removeDanglingAuthlibInjectorAccounts)); - // load selected account - Account selected = accounts.stream() - .filter(it -> accountId(it).equals(config().getSelectedAccount())) - .findFirst() - .orElse(null); - selectedAccount.set(selected); - - Schedulers.io().schedule(() -> { - if (selected != null) + Account selected = selectedAccount.get(); + if (selected != null) { + Schedulers.io().schedule(() -> { try { selected.logIn(); } catch (AuthenticationException e) { LOG.log(Level.WARNING, "Failed to log " + selected + " in", e); } - }); + }); + } } public static ObservableList getAccounts() { 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 55bb73898..ca0dce598 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -120,9 +120,6 @@ public final class Config implements Cloneable, Observable { @SerializedName("accounts") private ObservableList> accountStorages = FXCollections.observableArrayList(); - @SerializedName("selectedAccount") - private StringProperty selectedAccount = new SimpleStringProperty(""); - @SerializedName("fontFamily") private StringProperty fontFamily = new SimpleStringProperty("Consolas"); @@ -371,18 +368,6 @@ public final class Config implements Cloneable, Observable { return accountStorages; } - 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(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java index d1d987cb7..4e624ad09 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java @@ -17,13 +17,8 @@ */ package org.jackhuang.hmcl.setting; -import org.jackhuang.hmcl.auth.offline.OfflineAccount; -import org.jackhuang.hmcl.auth.offline.OfflineAccountFactory; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.gson.UUIDTypeAdapter; - -import java.util.LinkedList; -import java.util.List; +import java.util.HashMap; import java.util.Map; import static org.jackhuang.hmcl.util.Lang.tryCast; @@ -67,20 +62,21 @@ final class ConfigUpgrader { // Convert OfflineAccounts whose stored uuid is important. tryCast(rawJson.get("auth"), Map.class).ifPresent(auth -> { tryCast(auth.get("offline"), Map.class).ifPresent(offline -> { - List accounts = new LinkedList<>(); + String selected = rawJson.containsKey("selectedAccount") ? null + : tryCast(offline.get("IAuthenticator_UserName"), String.class).orElse(null); + tryCast(offline.get("uuidMap"), Map.class).ifPresent(uuidMap -> { ((Map) uuidMap).forEach((key, value) -> { - OfflineAccount account = OfflineAccountFactory.INSTANCE.create((String) key, UUIDTypeAdapter.fromString((String) value)); - accounts.add(account); - deserialized.getAccountStorages().add(Accounts.getAccountStorage(account)); + Map storage = new HashMap<>(); + storage.put("type", "offline"); + storage.put("username", key); + storage.put("uuid", value); + if (key.equals(selected)) { + storage.put("selected", true); + } + deserialized.getAccountStorages().add(storage); }); }); - - tryCast(offline.get("IAuthenticator_UserName"), String.class).ifPresent(selected -> { - if (!rawJson.containsKey("selectedAccount")) - accounts.stream().filter(account -> selected.equals(account.getUsername())).findAny().ifPresent(account -> - deserialized.setSelectedAccount(Accounts.accountId(account))); - }); }); }); } @@ -112,5 +108,22 @@ final class ConfigUpgrader { } }); } + + tryCast(rawJson.get("selectedAccount"), String.class) + .ifPresent(selected -> { + deserialized.getAccountStorages().stream() + .filter(storage -> { + Object type = storage.get("type"); + if ("offline".equals(type)) { + return selected.equals(storage.get("username") + ":" + storage.get("username")); + } else if ("yggdrasil".equals(type) || "authlibInjector".equals(type)) { + return selected.equals(storage.get("username") + ":" + storage.get("displayName")); + } else { + return false; + } + }) + .findFirst() + .ifPresent(storage -> storage.put("selected", true)); + }); } }