From 02ea563a914ef392f1cda00cc68ea15f9f71cc72 Mon Sep 17 00:00:00 2001
From: tomikun <60690056+alexytomi@users.noreply.github.com>
Date: Wed, 22 Jul 2026 15:20:08 +0800
Subject: [PATCH] qol: Better loading bars for local modpack import
---
.../modpacks/api/ModpackInstaller.java | 34 +++++++++++++++++--
.../src/main/res/values/strings.xml | 4 +++
2 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModpackInstaller.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModpackInstaller.java
index 0c614b8ca..c4df13cf7 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModpackInstaller.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModpackInstaller.java
@@ -1,7 +1,9 @@
package net.kdt.pojavlaunch.modloaders.modpacks.api;
import android.app.Activity;
+import android.database.Cursor;
import android.net.Uri;
+import android.provider.OpenableColumns;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
@@ -85,6 +87,7 @@ public class ModpackInstaller {
}
public static ModLoader importModpack(Activity activity, Uri zipUri, InstallFunction installFunction) throws IOException, NoSuchAlgorithmException {
+ ProgressLayout.setProgress(ProgressLayout.INSTALL_MODPACK, 0, R.string.import_modpack_start);
String modrinthPackInfoFileName = "modrinth.index.json";
String curseforgePackInfoFileName = "manifest.json";
InputStream inputStream = null;
@@ -109,8 +112,24 @@ public class ModpackInstaller {
MessageDigest algorithm = MessageDigest.getInstance("SHA-1");
DigestInputStream hashingStream = new DigestInputStream(inputStream, algorithm);
- byte[] buffer = new byte[8192];
- while (hashingStream.read(buffer) != -1) {} // just read to update the digest
+ long fileSize = -1;
+ long readSize = 0;
+ try (Cursor returnCursor = activity.getContentResolver().query(zipUri, new String[]{OpenableColumns.SIZE}, null, null, null)) {
+ if (returnCursor != null && returnCursor.moveToFirst()) {
+ fileSize = returnCursor.getLong(0);
+ }
+ }
+
+ byte[] buffer = new byte[262144];
+ while (true) {
+ int n = hashingStream.read(buffer);
+ if (n == -1) break;
+ readSize += n;
+ String readMB = fileSize > 0 ? String.format(Locale.US, "%.2f", readSize / (1024.0 * 1024.0)) : "unknown";
+ String totalMB = fileSize > 0 ? String.format(Locale.US, "%.2f",fileSize / (1024.0 * 1024.0)) : "unknown";
+ int progress = fileSize > 0 ? (int) ((readSize * 100L) / fileSize) : 0;
+ ProgressLayout.setProgress(ProgressLayout.INSTALL_MODPACK, progress, R.string.import_modpack_hash, readMB, totalMB);
+ }
hashingStream.close();
byte[] digest = algorithm.digest();
StringBuilder sb = new StringBuilder(digest.length * 2);
@@ -119,6 +138,8 @@ public class ModpackInstaller {
}
String hash = sb.toString();
+ ProgressLayout.setProgress(ProgressLayout.INSTALL_MODPACK, 0, R.string.import_modpack_json);
+
// Parse the JSON to prepare for instance creation
JsonObject packInfoJson = JsonParser.parseString(jsonString.toString()).getAsJsonObject();
String modpackName;
@@ -136,16 +157,23 @@ public class ModpackInstaller {
modpackName = modpackName.trim().replaceAll("[\\\\/:*?\"<>| \\t\\n]", "_");
modpackName = modpackName + hash;
+
// Copy ZIP file to cache
if(modpackName == null) throw new IOException("Corrupt Modpack manifest file.");
File modpackFile = null;
modpackFile = new File(Tools.DIR_CACHE, modpackName + ".cf");
inputStream = activity.getContentResolver().openInputStream(zipUri);
FileOutputStream output = new FileOutputStream(modpackFile);
- byte[] b = new byte[4 * 1024];
+ byte[] b = new byte[262144];
int read;
+ int readTotal = 0;
while ((read = inputStream.read(b)) != -1) {
output.write(b, 0, read);
+ readTotal += read;
+ String readMB = fileSize > 0 ? String.format(Locale.US, "%.2f", readTotal / (1024.0 * 1024.0)) : "unknown";
+ String totalMB = fileSize > 0 ? String.format(Locale.US, "%.2f", fileSize / (1024.0 * 1024.0)) : "unknown";
+ int progress = fileSize > 0 ? (int) ((readTotal * 100L) / fileSize) : 0;
+ ProgressLayout.setProgress(ProgressLayout.INSTALL_MODPACK, progress, R.string.import_modpack_copy, readMB, totalMB);
}
output.flush();
diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml
index 8ac74bdcf..e37821156 100644
--- a/app_pojavlauncher/src/main/res/values/strings.xml
+++ b/app_pojavlauncher/src/main/res/values/strings.xml
@@ -513,5 +513,9 @@
Supported LWJGL3IFY versions
Broken LWJGL3ify versions (SDL)
Extracted new default controls into new_default.json. Try it out!
+ Importing modpack…
+ Hashing modpack file… (%s MB/ %s MB)
+ Reading modpack info…
+ Copying modpack file to cache… (%s MB/ %s MB)