From 6299a9a4e4fd421aadbdd3e93a15eca4e6ddd1ec Mon Sep 17 00:00:00 2001 From: Mathias Boulay Date: Sun, 6 Aug 2023 17:02:14 +0200 Subject: [PATCH] Refactor: Make the interface filters easier to extend --- .../fragments/SearchModFragment.java | 13 ++++--- .../modloaders/modpacks/ModItemAdapter.java | 5 ++- .../modloaders/modpacks/api/ModpackApi.java | 24 ++++++------- .../modloaders/modpacks/api/ModrinthApi.java | 36 ++++++++++++------- .../modloaders/modpacks/models/ModDetail.java | 5 ++- .../modpacks/models/SearchFilters.java | 13 +++++++ 6 files changed, 61 insertions(+), 35 deletions(-) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/models/SearchFilters.java 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 7a8addeeb..0cb0b6595 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 @@ -3,11 +3,9 @@ package net.kdt.pojavlaunch.fragments; import android.os.Bundle; import android.util.Log; import android.view.View; -import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -22,6 +20,7 @@ import net.kdt.pojavlaunch.modloaders.modpacks.ModItemAdapter; import net.kdt.pojavlaunch.modloaders.modpacks.api.ModpackApi; import net.kdt.pojavlaunch.modloaders.modpacks.api.ModrinthApi; import net.kdt.pojavlaunch.modloaders.modpacks.models.ModItem; +import net.kdt.pojavlaunch.modloaders.modpacks.models.SearchFilters; import net.kdt.pojavlaunch.profiles.VersionSelectorDialog; import java.util.Arrays; @@ -37,11 +36,15 @@ public class SearchModFragment extends Fragment { private ModpackApi modpackApi; + private SearchFilters mSearchFilters; + public SearchModFragment(){ super(R.layout.fragment_mod_search); modpackApi = new ModrinthApi(); mModItemAdapter = new ModItemAdapter(modpackApi); + mSearchFilters = new SearchFilters(); + mSearchFilters.isModpack = true; } @Override @@ -54,18 +57,18 @@ public class SearchModFragment extends Fragment { mRecyclerview.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerview.setAdapter(mModItemAdapter); - - mSelectedVersion.setText("1.12.2"); // Setup the expendable list behavior mSelectVersionButton.setOnClickListener(v -> VersionSelectorDialog.open(v.getContext(), true, (id, snapshot)->{ mSelectedVersion.setText(id); + mSearchFilters.mcVersion = id; })); mSearchEditText.setOnEditorActionListener((v, actionId, event) -> { PojavApplication.sExecutorService.execute(new Runnable() { @Override public void run() { - ModItem[] items = modpackApi.searchMod(true, mSelectedVersion.getText().toString(), mSearchEditText.getText().toString()); + mSearchFilters.name = mSearchEditText.getText().toString(); + ModItem[] items = modpackApi.searchMod(mSearchFilters); Log.d(SearchModFragment.class.toString(), Arrays.toString(items)); Tools.runOnUiThread(() -> mModItemAdapter.setModItems(items, mSelectedVersion.getText().toString())); } 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 7d1f84f32..12728fefa 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 @@ -55,8 +55,7 @@ public class ModItemAdapter extends RecyclerView.Adapter { - mModDetail = mModpackApi.getModDetails(mModItem, mTargetMcVersion); + mModDetail = mModpackApi.getModDetails(mModItem); System.out.println(mModDetail); Tools.runOnUiThread(() -> setStateDetailed(mModDetail)); }); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModpackApi.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModpackApi.java index ec9c192a1..5443da46f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModpackApi.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModpackApi.java @@ -4,38 +4,37 @@ package net.kdt.pojavlaunch.modloaders.modpacks.api; import net.kdt.pojavlaunch.PojavApplication; import net.kdt.pojavlaunch.modloaders.modpacks.models.ModDetail; import net.kdt.pojavlaunch.modloaders.modpacks.models.ModItem; +import net.kdt.pojavlaunch.modloaders.modpacks.models.SearchFilters; import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper; +import org.jetbrains.annotations.Nullable; + /** * */ public interface ModpackApi { /** - * @param searchModpack Whether we are searching mod or modpacks - * @param minecraftVersion The minecraft version we want - * @param name The name of the mod(pack) + * @param searchFilters Filters * @return A list of mod items */ - ModItem[] searchMod(boolean searchModpack, String minecraftVersion, String name); + ModItem[] searchMod(SearchFilters searchFilters); /** * Fetch the mod details * @param item The moditem that was selected - * @param targetMcVersion The desired version * @return Detailed data about a mod(pack) */ - ModDetail getModDetails(ModItem item, String targetMcVersion); + ModDetail getModDetails(ModItem item); /** * Download and install the mod(pack) * @param modDetail The mod detail data - * @param versionUrl The version that has been selected by the user - * @param mcVersion The selected mc version + * @param selectedVersion The selected version */ - default void handleInstallation(ModDetail modDetail, String versionUrl, String mcVersion) { + default void handleInstallation(ModDetail modDetail, int selectedVersion) { PojavApplication.sExecutorService.execute(() -> { - installMod(modDetail, versionUrl, mcVersion); + installMod(modDetail, selectedVersion); }); } @@ -44,8 +43,7 @@ public interface ModpackApi { * May require the download of additional files. * May requires launching the installation of a modloader * @param modDetail The mod detail data - * @param versionUrl The version that has been selected by the user - * @param mcVersion The selected mc version + * @param selectedVersion The selected version */ - void installMod(ModDetail modDetail, String versionUrl, String mcVersion); + void installMod(ModDetail modDetail, int selectedVersion); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModrinthApi.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModrinthApi.java index d0e84baed..8d4b8c615 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModrinthApi.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/modpacks/api/ModrinthApi.java @@ -10,6 +10,7 @@ import net.kdt.pojavlaunch.modloaders.modpacks.models.ModDetail; import net.kdt.pojavlaunch.modloaders.modpacks.models.ModItem; import net.kdt.pojavlaunch.modloaders.modpacks.models.ModrinthIndex; import net.kdt.pojavlaunch.modloaders.modpacks.models.Constants; +import net.kdt.pojavlaunch.modloaders.modpacks.models.SearchFilters; import net.kdt.pojavlaunch.utils.DownloadUtils; import net.kdt.pojavlaunch.utils.FileUtils; import net.kdt.pojavlaunch.value.launcherprofiles.LauncherProfiles; @@ -27,14 +28,18 @@ public class ModrinthApi implements ModpackApi { } @Override - public ModItem[] searchMod(boolean searchModpack, String minecraftVersion, String name) { + public ModItem[] searchMod(SearchFilters searchFilters) { HashMap params = new HashMap<>(); - params.put("facets", String.format("[[\"project_type:%s\"],[\"versions:%s\"]]", - searchModpack ? "modpack" : "mod", - minecraftVersion - )); - params.put("query", name); + // Build the facets filters + StringBuilder facetString = new StringBuilder(); + facetString.append("["); + facetString.append(String.format("[\"project_type:%s\"]", searchFilters.isModpack ? "modpack" : "mod")); + if(searchFilters.mcVersion != null && !searchFilters.mcVersion.isEmpty()) + facetString.append(String.format(",[\"versions:%s\"]", searchFilters.mcVersion)); + facetString.append("]"); + params.put("facets", facetString.toString()); + params.put("query", searchFilters.name); JsonObject response = mApiHandler.get("search", params, JsonObject.class); JsonArray responseHits = response.getAsJsonArray("hits"); @@ -56,26 +61,31 @@ public class ModrinthApi implements ModpackApi { } @Override - public ModDetail getModDetails(ModItem item, String targetMcVersion) { - HashMap queryParams = new HashMap<>(); - queryParams.put("game_versions", String.format("[\"%s\"]", targetMcVersion)); - JsonArray response = mApiHandler.get(String.format("project/%s/version", item.id), queryParams, JsonArray.class); + public ModDetail getModDetails(ModItem item) { + + JsonArray response = mApiHandler.get(String.format("project/%s/version", item.id), JsonArray.class); System.out.println(response.toString()); String[] names = new String[response.size()]; + String[] mcNames = new String[response.size()]; String[] urls = new String[response.size()]; for (int i=0; i