From 90b10084ce535a96142193e6e9b86f2abfb48c76 Mon Sep 17 00:00:00 2001 From: Mathias Boulay Date: Tue, 15 Aug 2023 19:51:36 +0200 Subject: [PATCH] Feat[UI]: moditem states are now pretty --- .../fragments/SearchModFragment.java | 4 +- .../modloaders/modpacks/ModItemAdapter.java | 60 ++++++++++++++----- .../src/main/res/layout/view_mod.xml | 39 ++++++------ .../src/main/res/layout/view_mod_extended.xml | 11 +++- 4 files changed, 75 insertions(+), 39 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 0b17421c9..0371b4bdd 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 @@ -53,13 +53,15 @@ public class SearchModFragment extends Fragment { public SearchModFragment(){ super(R.layout.fragment_mod_search); modpackApi = new CurseforgeApi(); - mModItemAdapter = new ModItemAdapter(modpackApi); mSearchFilters = new SearchFilters(); mSearchFilters.isModpack = true; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + // You can only access resources after attaching to current context + mModItemAdapter = new ModItemAdapter(getResources(), modpackApi); + mSearchEditText = view.findViewById(R.id.search_mod_edittext); mSearchProgressBar = view.findViewById(R.id.search_mod_progressbar); mSelectedVersion = view.findViewById(R.id.search_mod_selected_mc_version_textview); 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 aa2cc0a57..4d35f469f 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 @@ -1,6 +1,7 @@ package net.kdt.pojavlaunch.modloaders.modpacks; import android.annotation.SuppressLint; +import android.content.res.Resources; import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; @@ -12,6 +13,9 @@ import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.graphics.drawable.RoundedBitmapDrawable; +import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; import androidx.recyclerview.widget.RecyclerView; import com.kdt.SimpleArrayAdapter; @@ -34,6 +38,9 @@ public class ModItemAdapter extends RecyclerView.Adapter mExtensionFuture; private Bitmap mThumbnailBitmap; private ImageReceiver mImageReceiver; + + /* Used to display available versions of the mod(pack) */ + private SimpleArrayAdapter mVersionAdapter = new SimpleArrayAdapter<>(null); + public ViewHolder(View view) { super(view); @@ -61,17 +72,14 @@ public class ModItemAdapter extends RecyclerView.Adapter { - mModpackApi.handleInstallation( - mExtendedButton.getContext().getApplicationContext(), - mModDetail, - mExtendedSpinner.getSelectedItemPosition()); - - //TODO do something ! - }); + mExtendedButton.setOnClickListener(v1 -> mModpackApi.handleInstallation( + mExtendedButton.getContext().getApplicationContext(), + mModDetail, + mExtendedSpinner.getSelectedItemPosition())); + mExtendedSpinner.setAdapter(mVersionAdapter); } else { - if(isExtended()) mExtendedLayout.setVisibility(View.GONE); - else mExtendedLayout.setVisibility(View.VISIBLE); + if(isExtended()) closeDetailedView(); + else openDetailedView(); } if(isExtended() && mModDetail == null && mExtensionFuture == null) { // only reload if no reloads are in progress @@ -140,36 +148,57 @@ public class ModItemAdapter extends RecyclerView.Adapter{ mImageReceiver = null; mThumbnailBitmap = bm; - mIconView.setImageBitmap(bm); + RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(mIconView.getResources(), bm); + drawable.setCornerRadius(mCornerDimensionCache * bm.getHeight()); + mIconView.setImageDrawable(drawable); }; mIconCache.getImage(mImageReceiver, mModItem.getIconCacheTag(), mModItem.imageUrl); mTitle.setText(item.title); mDescription.setText(item.description); if(hasExtended()){ - mExtendedLayout.setVisibility(View.GONE); + closeDetailedView(); } } /** Display extended info/interaction about a modpack */ private void setStateDetailed(ModDetail detailedItem) { - mExtendedLayout.setVisibility(View.VISIBLE); + if(detailedItem != null) { mExtendedButton.setEnabled(true); mExtendedErrorTextView.setVisibility(View.GONE); - mExtendedSpinner.setAdapter(new SimpleArrayAdapter<>(Arrays.asList(detailedItem.versionNames))); + mVersionAdapter.setObjects(Arrays.asList(detailedItem.versionNames)); + mExtendedSpinner.setAdapter(mVersionAdapter); } else { + closeDetailedView(); mExtendedButton.setEnabled(false); mExtendedErrorTextView.setVisibility(View.VISIBLE); mExtendedSpinner.setAdapter(null); + mVersionAdapter.setObjects(null); } + } + private void openDetailedView(){ + mExtendedLayout.setVisibility(View.VISIBLE); + mDescription.setMaxLines(99); + mExtendedLayout.post(() -> { + // We need to align to the longer section + ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) mExtendedLayout.getLayoutParams(); + params.topToBottom = mDescription.getBottom() > mIconView.getBottom() ? R.id.mod_body_textview : R.id.mod_thumbnail_imageview; + mExtendedLayout.setLayoutParams(params); + }); + } + + private void closeDetailedView(){ + mExtendedLayout.setVisibility(View.GONE); + mDescription.setMaxLines(3); } private void setDetailedStateDefault() { mExtendedButton.setEnabled(false); mExtendedSpinner.setAdapter(null); mExtendedErrorTextView.setVisibility(View.GONE); + openDetailedView(); } private boolean hasExtended(){ @@ -182,7 +211,8 @@ public class ModItemAdapter extends RecyclerView.Adapter + android:ellipsize="end" + android:maxLines="3" + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="@+id/mod_title_textview" + app:layout_constraintTop_toBottomOf="@+id/mod_title_textview" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintVertical_bias="0.0" + tools:text="Feed the beast - Reforged is a machine and magic focused modpack, with no respect for the minimum requirements of minecraft. Very long text" /> -