Skip to content

Commit 9bc13f4

Browse files
committed
Multithreaded downloading, fix various download bugs
1 parent ac719f8 commit 9bc13f4

8 files changed

Lines changed: 174 additions & 164 deletions

File tree

src/main/java/pojlib/API.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import pojlib.account.MinecraftAccount;
1515
import pojlib.util.JREUtils;
1616
import pojlib.util.Logger;
17+
import pojlib.util.download.DownloadManager;
1718
import pojlib.util.json.MinecraftInstances;
1819
import pojlib.util.Constants;
1920
import pojlib.account.LoginHelper;
@@ -33,11 +34,8 @@ public class API {
3334
public static String model = "Quest";
3435
private static boolean hasQueried = false;
3536
private static JsonObject initialResponse;
36-
public static boolean finishedDownloading = true;
3737
public static boolean ignoreInstanceName;
3838
public static boolean customRAMValue = false;
39-
public static double downloadStatus = 0;
40-
public static String currentDownload = "";
4139
public static String profileImage;
4240
public static String profileName;
4341
public static String profileUUID;
@@ -65,6 +63,14 @@ public static void addExtraProject(MinecraftInstances instances, MinecraftInstan
6563
InstanceHandler.addExtraProject(instances, instance, name, fileName, version, url, type);
6664
}
6765

66+
public static boolean isDownloadsCompleted() {
67+
return DownloadManager.downloadsCompleted();
68+
}
69+
70+
public static float getDownloadPercentage() {
71+
return DownloadManager.getPercentComplete();
72+
}
73+
6874
/**
6975
* Check if an instance has a mod
7076
*
@@ -168,6 +174,7 @@ public static MinecraftInstances.Instance createNewInstance(Activity activity, M
168174
public static void prelaunch(Activity activity, MinecraftInstances instances, MinecraftInstances.Instance instance) {
169175
gameReady = false;
170176
instance.updateMods(instances);
177+
DownloadManager.reset();
171178
if (hasConnection(activity)) {
172179
try {
173180
JREUtils.prelaunchCheck(activity, instance);

src/main/java/pojlib/APIHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public static String[] getQCSupportedVersions(Context ctx) {
116116
File versionsJson = new File(Constants.USER_HOME + "/supportedVersions.json");
117117
if(API.hasConnection(ctx)) {
118118
try {
119-
DownloadUtils.downloadFile(SUPPORTED_VERSIONS, versionsJson, new DownloadManager(1));
119+
DownloadUtils.downloadFile(SUPPORTED_VERSIONS, versionsJson);
120120
} catch (IOException e) {
121121
Logger.getInstance().appendToLog("Error while grabbing supported versions!\n" + e);
122122
}

src/main/java/pojlib/InstanceHandler.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import java.util.Arrays;
1818
import java.util.Locale;
1919
import java.util.Optional;
20+
import java.util.concurrent.CompletableFuture;
21+
import java.util.concurrent.ExecutionException;
22+
import java.util.concurrent.Future;
2023
import java.util.function.Consumer;
2124

2225
import pojlib.account.MinecraftAccount;
@@ -28,6 +31,7 @@
2831
import pojlib.util.Constants;
2932
import pojlib.util.FileUtil;
3033
import pojlib.util.VLoader;
34+
import pojlib.util.download.DownloadManager;
3135
import pojlib.util.json.MinecraftInstances;
3236
import pojlib.util.json.ModsJson;
3337
import pojlib.util.json.ProjectInfo;
@@ -41,7 +45,6 @@ public class InstanceHandler {
4145
public static final String DEV_MODS = "https://raw.githubusercontent.com/QuestCraftPlusPlus/Pojlib/refs/heads/QuestCraft-6.0.0/devmods.json";
4246

4347
public static MinecraftInstances.Instance create(Activity activity, MinecraftInstances instances, String instanceName, String userHome, String modLoader, String mrpackFilePath, String imageURL) {
44-
API.finishedDownloading = false;
4548
File mrpackJson = new File(Constants.USER_HOME + "/instances/" + instanceName.toLowerCase(Locale.ROOT).replaceAll(" ", "_") + "/setup/modrinth.index.json");
4649

4750
mrpackJson.getParentFile().mkdirs();
@@ -55,7 +58,6 @@ public static MinecraftInstances.Instance create(Activity activity, MinecraftIns
5558
}
5659

5760
return create(activity, instances, instanceName, userHome, false, index.dependencies.minecraft, modLoader, imageURL, (instance) -> {
58-
API.finishedDownloading = false;
5961
if (instance.extProjects == null) {
6062
instance.extProjects = new ProjectInfo[0];
6163
}
@@ -107,15 +109,13 @@ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOEx
107109
} catch (IOException e) {
108110
throw new RuntimeException(e);
109111
}
110-
API.finishedDownloading = false;
111112
instance.updateMods(instances);
112113
GsonUtils.objectToJsonFile(userHome + "/instances.json", instances);
113114
});
114115
}
115116

116117
//creates a new instance of a minecraft version, install game + mod loader, stores non login related launch info to json
117118
public static MinecraftInstances.Instance create(Activity activity, MinecraftInstances instances, String instanceName, String gameDir, boolean useDefaultMods, String minecraftVersion, String modLoader, String imageURL, Consumer<MinecraftInstances.Instance> postInstall) {
118-
API.finishedDownloading = false;
119119
File instancesFile = new File(gameDir + "/instances.json");
120120
if (instancesFile.exists()) {
121121
for (MinecraftInstances.Instance instance : instances.instances) {
@@ -175,18 +175,22 @@ public static MinecraftInstances.Instance create(Activity activity, MinecraftIns
175175
instances1.add(instance);
176176
instances.instances = instances1.toArray(new MinecraftInstances.Instance[0]);
177177

178-
new Thread(() -> {
178+
CompletableFuture.supplyAsync(() ->
179+
{
179180
try {
180-
String clientClasspath = Installer.installClient(minecraftVersionInfo, gameDir);
181-
String minecraftClasspath = Installer.installLibraries(minecraftVersionInfo, gameDir);
182-
String modLoaderClasspath = Installer.installLibraries(finalModLoaderVersionInfo, gameDir);
181+
CompletableFuture<String> clientClasspath = Installer.installClient(minecraftVersionInfo, gameDir);
182+
CompletableFuture<String> minecraftClasspath = Installer.installLibraries(minecraftVersionInfo, gameDir);
183+
CompletableFuture<String> modLoaderClasspath = Installer.installLibraries(finalModLoaderVersionInfo, gameDir);
183184
String lwjgl = UnityPlayerActivity.installLWJGL(activity);
184185

185-
instance.classpath = clientClasspath + File.pathSeparator + minecraftClasspath + File.pathSeparator + modLoaderClasspath + File.pathSeparator + lwjgl;
186+
CompletableFuture<Void> installFuture = CompletableFuture.allOf(clientClasspath, minecraftClasspath, modLoaderClasspath);
187+
installFuture.get();
186188

187-
instance.assetsDir = Installer.installAssets(minecraftVersionInfo, gameDir);
189+
instance.classpath = clientClasspath.get() + File.pathSeparator + minecraftClasspath.get() + File.pathSeparator + modLoaderClasspath.get() + File.pathSeparator + lwjgl;
190+
191+
instance.assetsDir = Installer.installAssets(minecraftVersionInfo, gameDir).get();
188192
Installer.moveLocalAssets(activity, instance);
189-
} catch (IOException e) {
193+
} catch (IOException | ExecutionException | InterruptedException e) {
190194
e.printStackTrace();
191195
}
192196
instance.assetIndex = minecraftVersionInfo.assetIndex.id;
@@ -198,9 +202,10 @@ public static MinecraftInstances.Instance create(Activity activity, MinecraftIns
198202
if(postInstall != null)
199203
postInstall.accept(instance);
200204

201-
API.finishedDownloading = true;
205+
DownloadManager.reset();
202206
Logger.getInstance().appendToLog("Finished Creating Instance!");
203-
}).start();
207+
return null;
208+
});
204209

205210
return instance;
206211
}

0 commit comments

Comments
 (0)