From 17cce29c00c8673ade0ff7edd50c965a7f8998fa Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 16 Aug 2023 11:17:04 +0300 Subject: [PATCH] Asynchronous CommonApi implementation + modpack source icons --- .../fragments/SearchModFragment.java | 3 +- .../modloaders/modpacks/ModItemAdapter.java | 16 +++- .../modloaders/modpacks/api/CommonApi.java | 80 ++++++++++++------ .../src/main/res/drawable/ic_curseforge.png | Bin 0 -> 5502 bytes .../src/main/res/drawable/ic_modrinth.png | Bin 0 -> 6229 bytes .../src/main/res/layout/view_mod.xml | 8 +- 6 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 app_pojavlauncher/src/main/res/drawable/ic_curseforge.png create mode 100644 app_pojavlauncher/src/main/res/drawable/ic_modrinth.png diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/SearchModFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/SearchModFragment.java index 0371b4bdd..835ba06d1 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/SearchModFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/SearchModFragment.java @@ -21,6 +21,7 @@ import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.Tools; import net.kdt.pojavlaunch.modloaders.modpacks.ModItemAdapter; import net.kdt.pojavlaunch.modloaders.modpacks.SelfReferencingFuture; +import net.kdt.pojavlaunch.modloaders.modpacks.api.CommonApi; import net.kdt.pojavlaunch.modloaders.modpacks.api.CurseforgeApi; import net.kdt.pojavlaunch.modloaders.modpacks.api.ModpackApi; import net.kdt.pojavlaunch.modloaders.modpacks.api.ModrinthApi; @@ -52,7 +53,7 @@ public class SearchModFragment extends Fragment { public SearchModFragment(){ super(R.layout.fragment_mod_search); - modpackApi = new CurseforgeApi(); + modpackApi = new CommonApi(); mSearchFilters = new SearchFilters(); mSearchFilters.isModpack = true; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/ModItemAdapter.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/ModItemAdapter.java index 4d35f469f..074552199 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/ModItemAdapter.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/ModItemAdapter.java @@ -26,6 +26,7 @@ import net.kdt.pojavlaunch.Tools; import net.kdt.pojavlaunch.modloaders.modpacks.api.ModpackApi; import net.kdt.pojavlaunch.modloaders.modpacks.imagecache.ImageReceiver; import net.kdt.pojavlaunch.modloaders.modpacks.imagecache.ModIconCache; +import net.kdt.pojavlaunch.modloaders.modpacks.models.Constants; import net.kdt.pojavlaunch.modloaders.modpacks.models.ModDetail; import net.kdt.pojavlaunch.modloaders.modpacks.models.ModItem; @@ -49,7 +50,7 @@ public class ModItemAdapter extends RecyclerView.Adapter[] futures = new Future[mModpackApis.length]; + for(int i = 0; i < mModpackApis.length; i++) { + futures[i] = PojavApplication.sExecutorService.submit(new ApiDownloadTask(i, searchFilters)); + } + if(Thread.interrupted()) { + cancelAllFutures(futures); + return null; + } + for(int i = 0; i < mModpackApis.length; i++) { + try { + items[i] = (ModItem[]) futures[i].get(); + totalSize += items[i].length; + }catch (Exception e) { + cancelAllFutures(futures); + e.printStackTrace(); + return null; + } } - // Then build an array with all the mods ModItem[] concatenatedItems = new ModItem[totalSize]; int copyOffset = 0; @@ -39,31 +50,52 @@ public class CommonApi implements ModpackApi { System.arraycopy(apiItems, 0, concatenatedItems, copyOffset, apiItems.length); copyOffset += apiItems.length; } - + if(Thread.interrupted()) return null; + Arrays.sort(concatenatedItems, (modItem, t1) -> modItem.title.compareToIgnoreCase(t1.title)); + if(Thread.interrupted()) return null; return concatenatedItems; } @Override public ModDetail getModDetails(ModItem item) { - switch (item.apiSource) { - case Constants.SOURCE_MODRINTH: - return mModrinthApi.getModDetails(item); - case Constants.SOURCE_CURSEFORGE: - return mCurseforgeApi.getModDetails(item); - default: - throw new UnsupportedOperationException("Unknown API source: " + item.apiSource); - } + return getModpackApi(item.apiSource).getModDetails(item); } @Override public ModLoader installMod(ModDetail modDetail, int selectedVersion) { - switch (modDetail.apiSource) { + return getModpackApi(modDetail.apiSource).installMod(modDetail, selectedVersion); + } + + private @NonNull ModpackApi getModpackApi(int apiSource) { + switch (apiSource) { case Constants.SOURCE_MODRINTH: - return mModrinthApi.installMod(modDetail, selectedVersion); + return mModrinthApi; case Constants.SOURCE_CURSEFORGE: - return mCurseforgeApi.installMod(modDetail, selectedVersion); + return mCurseforgeApi; default: - throw new UnsupportedOperationException("Unknown API source: " + modDetail.apiSource); + throw new UnsupportedOperationException("Unknown API source: " + apiSource); + } + } + + private void cancelAllFutures(Future[] futures) { + for(Future future : futures) { + if(future == null) continue; + future.cancel(true); + } + } + + private class ApiDownloadTask implements Callable { + private final int mModApi; + private final SearchFilters mSearchFilters; + + private ApiDownloadTask(int modApi, SearchFilters searchFilters) { + this.mModApi = modApi; + this.mSearchFilters = searchFilters; + } + + @Override + public ModItem[] call() { + return mModpackApis[mModApi].searchMod(mSearchFilters); } } } diff --git a/app_pojavlauncher/src/main/res/drawable/ic_curseforge.png b/app_pojavlauncher/src/main/res/drawable/ic_curseforge.png new file mode 100644 index 0000000000000000000000000000000000000000..2e19dc7107f0610c7a6a9b200031a9f19ff7a5ea GIT binary patch literal 5502 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 O5$qr?b6?=1jK2Xw;ZY_4 literal 0 HcmV?d00001 diff --git a/app_pojavlauncher/src/main/res/drawable/ic_modrinth.png b/app_pojavlauncher/src/main/res/drawable/ic_modrinth.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7b086592b5a5a68e7787dd662d76324f8ce136 GIT binary patch literal 6229 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 literal 0 HcmV?d00001 diff --git a/app_pojavlauncher/src/main/res/layout/view_mod.xml b/app_pojavlauncher/src/main/res/layout/view_mod.xml index ba93cd96e..434c82893 100644 --- a/app_pojavlauncher/src/main/res/layout/view_mod.xml +++ b/app_pojavlauncher/src/main/res/layout/view_mod.xml @@ -24,10 +24,12 @@