From e513156c6f2d6641958856ac8e33c489ad9a1f08 Mon Sep 17 00:00:00 2001 From: artdeell Date: Mon, 21 Aug 2023 17:22:46 +0300 Subject: [PATCH] Feat[modpack]: disable the "Install" button when tasks are ongoing --- .../fragments/SearchModFragment.java | 10 +++-- .../modloaders/modpacks/ModItemAdapter.java | 37 ++++++++++++++++--- .../modloaders/modpacks/api/ModpackApi.java | 13 ++++--- 3 files changed, 45 insertions(+), 15 deletions(-) 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 1036fb9af..ace5d14af 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 @@ -1,12 +1,9 @@ package net.kdt.pojavlaunch.fragments; import android.content.Context; -import android.content.DialogInterface; import android.content.res.ColorStateList; import android.graphics.Color; import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.EditText; @@ -28,6 +25,7 @@ import net.kdt.pojavlaunch.modloaders.modpacks.api.CommonApi; import net.kdt.pojavlaunch.modloaders.modpacks.api.ModpackApi; import net.kdt.pojavlaunch.modloaders.modpacks.models.SearchFilters; import net.kdt.pojavlaunch.profiles.VersionSelectorDialog; +import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper; public class SearchModFragment extends Fragment implements ModItemAdapter.SearchResultCallback { @@ -70,6 +68,7 @@ public class SearchModFragment extends Fragment implements ModItemAdapter.Search public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { // You can only access resources after attaching to current context mModItemAdapter = new ModItemAdapter(getResources(), modpackApi, this); + ProgressKeeper.addTaskCountListener(mModItemAdapter); mOverlayTopCache = getResources().getDimension(R.dimen.fragment_padding_medium); mOverlay = view.findViewById(R.id.search_mod_overlay); @@ -106,6 +105,7 @@ public class SearchModFragment extends Fragment implements ModItemAdapter.Search @Override public void onDestroyView() { super.onDestroyView(); + ProgressKeeper.removeTaskCountListener(mModItemAdapter); mRecyclerview.removeOnScrollListener(mOverlayPositionListener); } @@ -142,6 +142,10 @@ public class SearchModFragment extends Fragment implements ModItemAdapter.Search Button mSelectVersionButton = dialog.findViewById(R.id.search_mod_mc_version_button); Button mApplyButton = dialog.findViewById(R.id.search_mod_apply_filters); + assert mSelectVersionButton != null; + assert mSelectedVersion != null; + assert mApplyButton != null; + // Setup the expendable list behavior mSelectVersionButton.setOnClickListener(v -> VersionSelectorDialog.open(v.getContext(), true, (id, snapshot)-> mSelectedVersion.setText(id))); 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 b5a13cd6c..5eab19ab0 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 @@ -31,18 +31,23 @@ 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.modloaders.modpacks.models.SearchResult; +import net.kdt.pojavlaunch.progresskeeper.TaskCountListener; import java.util.Arrays; import java.util.Collections; +import java.util.Set; +import java.util.WeakHashMap; import java.util.concurrent.Future; -public class ModItemAdapter extends RecyclerView.Adapter { +public class ModItemAdapter extends RecyclerView.Adapter implements TaskCountListener { private static final ModItem[] MOD_ITEMS_EMPTY = new ModItem[0]; private static final int VIEW_TYPE_MOD_ITEM = 0; private static final int VIEW_TYPE_LOADING = 1; /* Used when versions haven't loaded yet, default text to reduce layout shifting */ private final SimpleArrayAdapter mLoadingAdapter = new SimpleArrayAdapter<>(Collections.singletonList("Loading")); + /* This my seem horribly inefficient but it is in fact the most efficient way without effectively writing a weak collection from scratch */ + private final Set mViewHolderSet = Collections.newSetFromMap(new WeakHashMap<>()); private final ModIconCache mIconCache = new ModIconCache(); private final SearchResultCallback mSearchResultCallback; private ModItem[] mModItems; @@ -55,6 +60,7 @@ public class ModItemAdapter extends RecyclerView.Adapter{ + mTasksRunning = taskCount != 0; + for(ViewHolder viewHolder : mViewHolderSet) { + viewHolder.updateInstallButtonState(); + } + }); + } /** @@ -144,13 +159,14 @@ public class ModItemAdapter extends RecyclerView.Adapter mExtensionFuture; private Bitmap mThumbnailBitmap; private ImageReceiver mImageReceiver; + private boolean mInstallEnabled; /* Used to display available versions of the mod(pack) */ private final SimpleArrayAdapter mVersionAdapter = new SimpleArrayAdapter<>(null); public ViewHolder(View view) { super(view); - + mViewHolderSet.add(this); view.setOnClickListener(v -> { if(!hasExtended()){ // Inflate the ViewStub @@ -252,15 +268,14 @@ public class ModItemAdapter extends RecyclerView.Adapter { ModLoader loaderInfo = installMod(modDetail, selectedVersion); if (loaderInfo == null) return;