Update InstallerItem.java

This commit is contained in:
Tungstend 2024-02-07 15:13:18 +08:00
parent 6ce47d8330
commit d6aec5b3c4
1 changed files with 51 additions and 47 deletions

View File

@ -21,6 +21,7 @@ import androidx.appcompat.widget.LinearLayoutCompat;
import com.tungsten.fcl.R; import com.tungsten.fcl.R;
import com.tungsten.fcl.util.AndroidUtils; import com.tungsten.fcl.util.AndroidUtils;
import com.tungsten.fclcore.download.LibraryAnalyzer; import com.tungsten.fclcore.download.LibraryAnalyzer;
import com.tungsten.fclcore.fakefx.beans.InvalidationListener;
import com.tungsten.fclcore.fakefx.beans.binding.Bindings; import com.tungsten.fclcore.fakefx.beans.binding.Bindings;
import com.tungsten.fclcore.fakefx.beans.property.BooleanProperty; import com.tungsten.fclcore.fakefx.beans.property.BooleanProperty;
import com.tungsten.fclcore.fakefx.beans.property.ObjectProperty; import com.tungsten.fclcore.fakefx.beans.property.ObjectProperty;
@ -36,6 +37,11 @@ import com.tungsten.fcllibrary.component.view.FCLLinearLayout;
import com.tungsten.fcllibrary.component.view.FCLTextView; import com.tungsten.fcllibrary.component.view.FCLTextView;
import com.tungsten.fcllibrary.util.ConvertUtils; import com.tungsten.fcllibrary.util.ConvertUtils;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class InstallerItem { public class InstallerItem {
private final Context context; private final Context context;
@ -118,6 +124,32 @@ public class InstallerItem {
private final InstallerItem[] libraries; private final InstallerItem[] libraries;
private final HashMap<InstallerItem, Set<InstallerItem>> incompatibleMap = new HashMap<>();
private Set<InstallerItem> getIncompatibles(InstallerItem item) {
return incompatibleMap.computeIfAbsent(item, it -> new HashSet<>());
}
private void addIncompatibles(InstallerItem item, InstallerItem... others) {
Set<InstallerItem> set = getIncompatibles(item);
for (InstallerItem other : others) {
set.add(other);
getIncompatibles(other).add(item);
}
}
private void mutualIncompatible(InstallerItem... items) {
for (InstallerItem item : items) {
Set<InstallerItem> set = getIncompatibles(item);
for (InstallerItem item2 : items) {
if (item2 != item) {
set.add(item2);
}
}
}
}
public InstallerItemGroup(Context context, String gameVersion) { public InstallerItemGroup(Context context, String gameVersion) {
this.context = context; this.context = context;
@ -130,44 +162,28 @@ public class InstallerItem {
quilt = new InstallerItem(context, QUILT); quilt = new InstallerItem(context, QUILT);
quiltApi = new InstallerItem(context, QUILT_API); quiltApi = new InstallerItem(context, QUILT_API);
forge.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> { mutualIncompatible(forge, fabric, quilt, neoForge, liteLoader);
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId(); addIncompatibles(optiFine, fabric, quilt, neoForge);
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId(); addIncompatibles(fabricApi, forge, quilt, quiltApi, neoForge, liteLoader, optiFine);
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId(); addIncompatibles(quiltApi, forge, fabric, fabricApi, neoForge, liteLoader, optiFine);
return null;
}, fabric.libraryVersion, quilt.libraryVersion, neoForge.libraryVersion));
neoForge.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> { InvalidationListener listener = o -> {
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId(); for (Map.Entry<InstallerItem, Set<InstallerItem>> entry : incompatibleMap.entrySet()) {
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId(); InstallerItem item = entry.getKey();
if (forge.libraryVersion.get() != null) return FORGE.getPatchId();
return null;
}, fabric.libraryVersion, quilt.libraryVersion, forge.libraryVersion));
liteLoader.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> { String incompatibleId = null;
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId(); for (InstallerItem other : entry.getValue()) {
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId(); if (other.libraryVersion.get() != null) {
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId(); incompatibleId = other.id;
return null; break;
}, fabric.libraryVersion, quilt.libraryVersion, neoForge.libraryVersion)); }
}
optiFine.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> { item.incompatibleLibraryName.set(incompatibleId);
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId(); }
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId(); };
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId(); for (InstallerItem item : incompatibleMap.keySet()) {
return null; item.libraryVersion.addListener(listener);
}, fabric.libraryVersion, quilt.libraryVersion, neoForge.libraryVersion));
for (InstallerItem fabric : new InstallerItem[] { fabric, fabricApi }) {
fabric.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> {
if (forge.libraryVersion.get() != null) return FORGE.getPatchId();
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId();
if (liteLoader.libraryVersion.get() != null) return LITELOADER.getPatchId();
if (optiFine.libraryVersion.get() != null) return OPTIFINE.getPatchId();
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId();
if (quiltApi.libraryVersion.get() != null) return QUILT_API.getPatchId();
return null;
}, forge.libraryVersion, neoForge.libraryVersion, liteLoader.libraryVersion, optiFine.libraryVersion, quilt.libraryVersion, quiltApi.libraryVersion));
} }
fabricApi.dependencyName.bind(Bindings.createStringBinding(() -> { fabricApi.dependencyName.bind(Bindings.createStringBinding(() -> {
@ -175,18 +191,6 @@ public class InstallerItem {
else return null; else return null;
}, fabric.libraryVersion)); }, fabric.libraryVersion));
for (InstallerItem quilt : new InstallerItem[] { quilt, quiltApi }) {
quilt.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> {
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId();
if (fabricApi.libraryVersion.get() != null) return FABRIC_API.getPatchId();
if (forge.libraryVersion.get() != null) return FORGE.getPatchId();
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId();
if (liteLoader.libraryVersion.get() != null) return LITELOADER.getPatchId();
if (optiFine.libraryVersion.get() != null) return OPTIFINE.getPatchId();
return null;
}, fabric.libraryVersion, fabricApi.libraryVersion, forge.libraryVersion, neoForge.libraryVersion, liteLoader.libraryVersion, optiFine.libraryVersion));
}
quiltApi.dependencyName.bind(Bindings.createStringBinding(() -> { quiltApi.dependencyName.bind(Bindings.createStringBinding(() -> {
if (quilt.libraryVersion.get() == null) return QUILT.getPatchId(); if (quilt.libraryVersion.get() == null) return QUILT.getPatchId();
else return null; else return null;