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 000000000..2e19dc710 Binary files /dev/null and b/app_pojavlauncher/src/main/res/drawable/ic_curseforge.png differ 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 000000000..0d7b08659 Binary files /dev/null and b/app_pojavlauncher/src/main/res/drawable/ic_modrinth.png differ 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 @@