From 55499b52e616a251c18abd9b13ab5339abb66950 Mon Sep 17 00:00:00 2001 From: Duy Tran Khanh Date: Wed, 16 Jun 2021 15:18:06 +0700 Subject: [PATCH] Prepare for version list filtering --- .../java/net/kdt/pojavlaunch/PLaunchApp.java | 34 ++------ .../java/net/kdt/pojavlaunch/uikit/UIKit.java | 4 +- Makefile | 1 + Natives/LauncherViewController.m | 77 +++++++++++++------ Natives/input_bridge_v3.c | 11 ++- 5 files changed, 68 insertions(+), 59 deletions(-) diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java index 4c8a58cb..ef1723f4 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java @@ -14,7 +14,6 @@ import net.kdt.pojavlaunch.value.*; public class PLaunchApp { private static float currProgress, maxProgress; - public static JMinecraftVersionList mVersionList; public static volatile JMinecraftVersionList.Version mVersion; public static boolean mIsAssetsProcessing = false; @@ -57,7 +56,7 @@ public class PLaunchApp { } } - public static void installMinecraft() { + public static void installMinecraft(final String versionPath) { new Thread(() -> { currProgress = 0; @@ -95,19 +94,9 @@ public class PLaunchApp { JAssets assets = null; - UIKit.updateProgressSafe(0, "Downloading version list"); - try { - mVersionList = Tools.GLOBAL_GSON.fromJson(DownloadUtils.downloadString("https://launchermeta.mojang.com/mc/game/version_manifest.json"), JMinecraftVersionList.class); - } catch (IOException e) { - UIKit.updateProgressSafe(0, "Error: " + e.getMessage()); - e.printStackTrace(); - } - - verInfo = findVersion(mcver); - if (verInfo.url != null && !new File(verJsonDir).exists() && mVersionList != null) { - // mVersionList != null is for checking if user have network connection + if (versionPath.startsWith("http") && !new File(verJsonDir).exists()) { UIKit.updateProgressSafe(0, "Downloading " + mcver + ".json"); - Tools.downloadFile(verInfo.url, verJsonDir); + Tools.downloadFile(versionPath, verJsonDir); } mVersion = verInfo = Tools.getVersionInfo(mcver); @@ -186,7 +175,7 @@ public class PLaunchApp { public static void downloadAssets(final JAssets assets, String assetsVersion, final File outputDir) throws IOException { ArrayBlockingQueue workQueue = new ArrayBlockingQueue<>(100); RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy(); - final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 40, 500, TimeUnit.SECONDS, workQueue, handler); + final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 50, 100, TimeUnit.SECONDS, workQueue, handler); File hasDownloadedFile = new File(outputDir, "downloaded/" + assetsVersion + ".downloaded"); if (!hasDownloadedFile.exists()) { @@ -214,6 +203,8 @@ public class PLaunchApp { }); } + threadPoolExecutor.shutdown(); + while (!threadPoolExecutor.isTerminated()) { } hasDownloadedFile.getParentFile().mkdirs(); hasDownloadedFile.createNewFile(); System.out.println("Assets end time: " + System.currentTimeMillis()); @@ -246,17 +237,4 @@ public class PLaunchApp { DownloadUtils.downloadFile(MINECRAFT_RES + assetPath, outFile); } } - - private static JMinecraftVersionList.Version findVersion(String version) { - if (mVersionList != null) { - for (JMinecraftVersionList.Version valueVer: mVersionList.versions) { - if (valueVer.id.equals(version)) { - return valueVer; - } - } - } - - // Custom version, inherits from base. - return Tools.getVersionInfo(version); - } } diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java index 5d89b2a7..65330c2b 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java @@ -11,8 +11,8 @@ public class UIKit { private static int guiScale; - public static void callback_LauncherViewController_installMinecraft() { - PLaunchApp.installMinecraft(); + public static void callback_LauncherViewController_installMinecraft(String versionPath) { + PLaunchApp.installMinecraft(versionPath); } public static void callback_SurfaceViewController_launchMinecraft(int width, int height) { diff --git a/Makefile b/Makefile index a2044f87..75646a03 100644 --- a/Makefile +++ b/Makefile @@ -160,6 +160,7 @@ deploy: echo 'If you specified a different port for your device to listen for SSH connections, you need to run '\''export DEVICE_PORT='\'' as well.'; \ fi; \ elif [ '$(IOS)' = '1' ]; then \ + sudo cp JavaApp/local_out/launcher.jar /Applications/PojavLauncher.app/libs/launcher.jar; \ sudo cp Natives/PojavLauncher /Applications/PojavLauncher.app/PojavLauncher; \ sudo cp Natives/libpojavexec.dylib /Applications/PojavLauncher.app/Frameworks/libpojavexec.dylib; \ sudo killall PojavLauncher; \ diff --git a/Natives/LauncherViewController.m b/Natives/LauncherViewController.m index 47af49f7..9e7f2003 100644 --- a/Natives/LauncherViewController.m +++ b/Natives/LauncherViewController.m @@ -12,7 +12,7 @@ @implementation LauncherViewController -NSMutableArray* versionList; +NSArray* versionList; UIPickerView* versionPickerView; UITextField* versionTextField; @@ -93,6 +93,27 @@ UITextField* versionTextField; [scrollView addSubview:install_progress_text]; } +- (void)fetchLocalVersionList:(NSMutableArray *)finalVersionList withPreviousIndex:(int)index +{ + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSString *versionPath = @"/var/mobile/Documents/minecraft/versions/"; + NSArray *localVersionList = [fileManager contentsOfDirectoryAtPath:versionPath error:Nil]; + for (NSString *versionId in localVersionList) { + NSString *localPath = [versionPath stringByAppendingString:versionId]; + BOOL isDir; + [fileManager fileExistsAtPath:localPath isDirectory:&isDir]; + if (isDir && ! [versionList containsObject:versionId]) { + [finalVersionList addObject:versionId]; + + if ([versionTextField.text isEqualToString:versionId]) { + [versionPickerView selectRow:index inComponent:0 animated:NO]; + } + } + + index++; + } +} + - (void)fetchVersionList { NSURLSession *session = [NSURLSession sharedSession]; @@ -116,35 +137,19 @@ UITextField* versionTextField; NSArray *remoteVersionList = [jsonArray valueForKey:@"versions"]; assert(remoteVersionList != nil); dispatch_async(dispatch_get_main_queue(), ^{ - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSString *versionPath = @"/var/mobile/Documents/minecraft/versions/"; - NSArray *localVersionList = [fileManager contentsOfDirectoryAtPath:versionPath error:Nil]; - - versionList = [[NSMutableArray alloc] init]; + NSMutableArray *finalVersionList = [[NSMutableArray alloc] init]; int i = 0; for (NSDictionary *versionInfo in remoteVersionList) { NSString *versionId = [versionInfo valueForKey:@"id"]; - [versionList addObject:versionId]; + [finalVersionList addObject:versionInfo]; if ([versionTextField.text isEqualToString:versionId]) { [versionPickerView selectRow:i inComponent:0 animated:NO]; } i++; } - - for (NSString *versionId in localVersionList) { - NSString *localPath = [versionPath stringByAppendingString:versionId]; - BOOL isDir; - [fileManager fileExistsAtPath:localPath isDirectory:&isDir]; - if (isDir && ! [versionList containsObject:versionId]) { - [versionList addObject:versionId]; - - if ([versionTextField.text isEqualToString:versionId]) { - [versionPickerView selectRow:i inComponent:0 animated:NO]; - } - } - - i++; - } + [self fetchLocalVersionList:finalVersionList withPreviousIndex:i]; + + versionList = [finalVersionList copy]; [versionPickerView reloadAllComponents]; }); @@ -153,6 +158,14 @@ UITextField* versionTextField; NSString *err_msg = [jsonArray valueForKey:@"errorMessage"]; NSLog(@"Warning: failed to fetch version list: %@: %@", err_title, err_msg); } + dispatch_async(dispatch_get_main_queue(), ^{ + if (versionList == nil) { // no internet connection + NSMutableArray *finalVersionList = [[NSMutableArray alloc] init]; + [self fetchLocalVersionList:finalVersionList withPreviousIndex:0]; + versionList = [finalVersionList copy]; + [versionPickerView reloadAllComponents]; + } + }); }]; [postDataTask resume]; } @@ -165,12 +178,21 @@ UITextField* versionTextField; - (void)launchMinecraft:(id)sender { [(UIButton*) sender setEnabled:NO]; - callback_LauncherViewController_installMinecraft(); + + NSObject *object = [versionList objectAtIndex:[versionPickerView selectedRowInComponent:0]]; + NSString *result; + if ([object isKindOfClass:[NSString class]]) { + result = (NSString*) object; + } else { + result = [object valueForKey:@"url"]; + } + + callback_LauncherViewController_installMinecraft([result UTF8String]); } #pragma mark - UIPickerView stuff - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { - versionTextField.text = [versionList objectAtIndex:row]; + versionTextField.text = [self pickerView:pickerView titleForRow:row forComponent:component]; [versionTextField.text writeToFile:@"/var/mobile/Documents/minecraft/config_ver.txt" atomically:NO encoding:NSUTF8StringEncoding error:nil]; } @@ -183,7 +205,12 @@ UITextField* versionTextField; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - return [versionList objectAtIndex:row]; + NSObject *object = [versionList objectAtIndex:row]; + if ([object isKindOfClass:[NSString class]]) { + return (NSString*) object; + } else { + return [object valueForKey:@"id"]; + } } - (void)versionClosePicker { diff --git a/Natives/input_bridge_v3.c b/Natives/input_bridge_v3.c index 884d7cd6..892437fc 100644 --- a/Natives/input_bridge_v3.c +++ b/Natives/input_bridge_v3.c @@ -154,7 +154,7 @@ void closeGLFWWindow() { exit(-1); } -void callback_LauncherViewController_installMinecraft() { +void callback_LauncherViewController_installMinecraft(char* versionPath) { // Because UI init after JVM init, this should not be null assert(runtimeJNIEnvPtr_JRE != NULL); @@ -162,12 +162,15 @@ void callback_LauncherViewController_installMinecraft() { uikitBridgeClass = (*runtimeJNIEnvPtr_JRE)->FindClass(runtimeJNIEnvPtr_JRE, "net/kdt/pojavlaunch/uikit/UIKit"); assert(uikitBridgeClass != NULL); } - - jmethodID method = (*runtimeJNIEnvPtr_JRE)->GetStaticMethodID(runtimeJNIEnvPtr_JRE, uikitBridgeClass, "callback_LauncherViewController_installMinecraft", "()V"); + + jstring versionPathStr = (*runtimeJNIEnvPtr_JRE)->NewStringUTF(runtimeJNIEnvPtr_JRE, versionPath); + + jmethodID method = (*runtimeJNIEnvPtr_JRE)->GetStaticMethodID(runtimeJNIEnvPtr_JRE, uikitBridgeClass, "callback_LauncherViewController_installMinecraft", "(Ljava/lang/String;)V"); assert(method != NULL); (*runtimeJNIEnvPtr_JRE)->CallStaticVoidMethod( runtimeJNIEnvPtr_JRE, - uikitBridgeClass, method + uikitBridgeClass, method, + versionPathStr ); }