From 2adc410ef81bc5641a8517000cfeeaaf2df3f1eb Mon Sep 17 00:00:00 2001 From: artdeell Date: Wed, 30 Jun 2021 17:24:27 +0300 Subject: [PATCH] [EXPERIMENTAL] New assets downloader --- .../tasks/MinecraftDownloaderTask.java | 108 +++++++++++------- 1 file changed, 69 insertions(+), 39 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java index 3c99f26dd..d947d7de7 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java @@ -14,6 +14,8 @@ import net.kdt.pojavlaunch.prefs.*; import net.kdt.pojavlaunch.utils.*; import net.kdt.pojavlaunch.value.*; import org.apache.commons.io.*; + +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; public class MinecraftDownloaderTask extends AsyncTask @@ -280,8 +282,7 @@ public class MinecraftDownloaderTask extends AsyncTask workQueue = new ArrayBlockingQueue<>(100); - RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy(); - final ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 50, 100, TimeUnit.SECONDS, workQueue, handler); - - File hasDownloadedFile = new File(outputDir, "downloaded/" + assetsVersion + ".downloaded"); - if (!hasDownloadedFile.exists()) { + LinkedBlockingQueue workQueue = new LinkedBlockingQueue<>(); + final ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 50, 500, TimeUnit.MILLISECONDS, workQueue); + mActivity.mIsAssetsProcessing = true; + //File hasDownloadedFile = new File(outputDir, "downloaded/" + assetsVersion + ".downloaded"); + //if (!hasDownloadedFile.exists()) { System.out.println("Assets begin time: " + System.currentTimeMillis()); Map assetsObjects = assets.objects; - mActivity.mLaunchProgress.setMax(assetsObjects.size()); - zeroProgress(); - AtomicInteger downloaded = new AtomicInteger(0); + int assetsSizeBytes=0; + AtomicInteger downloadedSize = new AtomicInteger(0); + AtomicBoolean localInterrupt = new AtomicBoolean(false); File objectsDir = new File(outputDir, "objects"); - for (JAssetInfo asset : assetsObjects.values()) { - executor.execute(() -> { - if (!mActivity.mIsAssetsProcessing) { - executor.shutdownNow(); - return; - } - - try { - if(!assets.map_to_resources) downloadAsset(asset, objectsDir); - else downloadAssetMapped(asset,(assetsObjects.keySet().toArray(new String[0])[downloaded.get()]),outputDir); - } catch (IOException e) { - e.printStackTrace(); - mActivity.mIsAssetsProcessing = false; - } - downloaded.incrementAndGet(); - }); + zeroProgress(); + for(String assetKey : assetsObjects.keySet()) { + JAssetInfo asset = assetsObjects.get(assetKey); + assetsSizeBytes+=asset.size; + String assetPath = asset.hash.substring(0, 2) + "/" + asset.hash; + File outFile = assets.map_to_resources?new File(objectsDir,"/"+assetKey):new File(objectsDir, assetPath); + boolean isSHAFailure = false; + if(outFile.exists() && LauncherPreferences.PREF_CHECK_LIBRARY_SHA?(isSHAFailure = Tools.compareSHA1(outFile,asset.hash)):true) { + downloadedSize.addAndGet(asset.size); + }else{ + if(isSHAFailure)publishProgress("0",mActivity.getString(R.string.dl_library_sha_fail,assetKey)); + executor.execute(()->{ + try { + if (!assets.map_to_resources) { + downloadAsset(asset, objectsDir, downloadedSize); + } else { + downloadAssetMapped(asset, assetKey, outputDir, downloadedSize); + } + }catch (IOException e) { + e.printStackTrace(); + localInterrupt.set(true); + } + }); + } } + mActivity.mLaunchProgress.setMax(assetsSizeBytes); executor.shutdown(); - while (!executor.isTerminated()) { } - hasDownloadedFile.getParentFile().mkdirs(); - hasDownloadedFile.createNewFile(); + try { + int prevDLSize=0; + while ((!executor.awaitTermination(250, TimeUnit.MILLISECONDS))&&(!localInterrupt.get())&&mActivity.mIsAssetsProcessing) { + int DLSize = downloadedSize.get(); + publishProgress(Integer.toString(DLSize-prevDLSize),null,""); + publishDownloadProgress("assets", DLSize, assetsSizeBytes); + prevDLSize = downloadedSize.get(); + } + executor.shutdownNow(); + while (!executor.awaitTermination(250, TimeUnit.MILLISECONDS)) {} + System.out.println("Fully shut down!"); + }catch(InterruptedException e) { + e.printStackTrace(); + } System.out.println("Assets end time: " + System.currentTimeMillis()); - } + //} } private JMinecraftVersionList.Version findVersion(String version) {