From 2055795c9992ef8d49694d89d725a0d79ffbabd3 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Thu, 30 Dec 2021 16:50:29 +0530 Subject: [PATCH] ViewBinding in some Adapter classes which are using one layout --- .../retromusic/adapter/CategoryInfoAdapter.kt | 227 ++++++++---------- .../monkey/retromusic/adapter/GenreAdapter.kt | 28 ++- .../monkey/retromusic/adapter/HomeAdapter.kt | 1 - .../adapter/backup/BackupAdapter.kt | 17 +- .../fragments/base/AbsRecyclerViewFragment.kt | 2 +- .../fragments/genres/GenresFragment.kt | 2 +- .../preferences/LibraryPreference.kt | 1 - app/src/main/res/layout/item_list_backup.xml | 3 +- 8 files changed, 131 insertions(+), 150 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.kt index 2354bb9af..0347d42b7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.kt @@ -11,134 +11,111 @@ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ +package code.name.monkey.retromusic.adapter -package code.name.monkey.retromusic.adapter; +import android.annotation.SuppressLint +import android.content.res.ColorStateList +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.databinding.PreferenceDialogLibraryCategoriesListitemBinding +import code.name.monkey.retromusic.model.CategoryInfo +import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.SwipeAndDragHelper +import code.name.monkey.retromusic.util.SwipeAndDragHelper.ActionCompletionContract -import android.annotation.SuppressLint; -import android.content.res.ColorStateList; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.checkbox.MaterialCheckBox; - -import java.util.List; - -import code.name.monkey.appthemehelper.ThemeStore; -import code.name.monkey.retromusic.R; -import code.name.monkey.retromusic.model.CategoryInfo; -import code.name.monkey.retromusic.util.SwipeAndDragHelper; - -public class CategoryInfoAdapter extends RecyclerView.Adapter - implements SwipeAndDragHelper.ActionCompletionContract { - - private List categoryInfos; - private final ItemTouchHelper touchHelper; - - public CategoryInfoAdapter() { - SwipeAndDragHelper swipeAndDragHelper = new SwipeAndDragHelper(this); - touchHelper = new ItemTouchHelper(swipeAndDragHelper); - } - - public void attachToRecyclerView(RecyclerView recyclerView) { - touchHelper.attachToRecyclerView(recyclerView); - } - - @NonNull - public List getCategoryInfos() { - return categoryInfos; - } - - public void setCategoryInfos(@NonNull List categoryInfos) { - this.categoryInfos = categoryInfos; - notifyDataSetChanged(); - } - - @Override - public int getItemCount() { - return categoryInfos.size(); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void onBindViewHolder(@NonNull CategoryInfoAdapter.ViewHolder holder, int position) { - CategoryInfo categoryInfo = categoryInfos.get(position); - - holder.checkBox.setChecked(categoryInfo.isVisible()); - holder.title.setText( - holder.title.getResources().getString(categoryInfo.getCategory().getStringRes())); - - holder.itemView.setOnClickListener( - v -> { - if (!(categoryInfo.isVisible() && isLastCheckedCategory(categoryInfo))) { - categoryInfo.setVisible(!categoryInfo.isVisible()); - holder.checkBox.setChecked(categoryInfo.isVisible()); - } else { - Toast.makeText( - holder.itemView.getContext(), - R.string.you_have_to_select_at_least_one_category, - Toast.LENGTH_SHORT) - .show(); - } - }); - - holder.dragView.setOnTouchListener( - (view, event) -> { - if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { - touchHelper.startDrag(holder); - } - return false; - }); - } - - @Override - @NonNull - public CategoryInfoAdapter.ViewHolder onCreateViewHolder( - @NonNull ViewGroup parent, int viewType) { - View view = - LayoutInflater.from(parent.getContext()) - .inflate(R.layout.preference_dialog_library_categories_listitem, parent, false); - return new ViewHolder(view); - } - - @Override - public void onViewMoved(int oldPosition, int newPosition) { - CategoryInfo categoryInfo = categoryInfos.get(oldPosition); - categoryInfos.remove(oldPosition); - categoryInfos.add(newPosition, categoryInfo); - notifyItemMoved(oldPosition, newPosition); - } - - private boolean isLastCheckedCategory(CategoryInfo categoryInfo) { - if (categoryInfo.isVisible()) { - for (CategoryInfo c : categoryInfos) { - if (c != categoryInfo && c.isVisible()) { - return false; +class CategoryInfoAdapter : RecyclerView.Adapter(), + ActionCompletionContract { + var categoryInfos: MutableList = + PreferenceUtil.libraryCategory.toMutableList() + @SuppressLint("NotifyDataSetChanged") + set(value) { + field = value + notifyDataSetChanged() } - } + private val touchHelper: ItemTouchHelper + fun attachToRecyclerView(recyclerView: RecyclerView?) { + touchHelper.attachToRecyclerView(recyclerView) } - return true; - } - static class ViewHolder extends RecyclerView.ViewHolder { - private final MaterialCheckBox checkBox; - private final View dragView; - private final TextView title; - - ViewHolder(View view) { - super(view); - checkBox = view.findViewById(R.id.checkbox); - checkBox.setButtonTintList( - ColorStateList.valueOf(ThemeStore.Companion.accentColor(checkBox.getContext()))); - title = view.findViewById(R.id.title); - dragView = view.findViewById(R.id.drag_view); + override fun getItemCount(): Int { + return categoryInfos.size } - } -} + + @SuppressLint("ClickableViewAccessibility") + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val categoryInfo = categoryInfos[position] + holder.binding.checkbox.isChecked = categoryInfo.visible + holder.binding.title.text = + holder.binding.title.resources.getString(categoryInfo.category.stringRes) + holder.itemView.setOnClickListener { + if (!(categoryInfo.visible && isLastCheckedCategory(categoryInfo))) { + categoryInfo.visible = !categoryInfo.visible + holder.binding.checkbox.isChecked = categoryInfo.visible + } else { + Toast.makeText( + holder.itemView.context, + R.string.you_have_to_select_at_least_one_category, + Toast.LENGTH_SHORT + ) + .show() + } + } + holder.binding.dragView.setOnTouchListener { _: View?, event: MotionEvent -> + if (event.actionMasked == MotionEvent.ACTION_DOWN) { + touchHelper.startDrag(holder) + } + false + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): ViewHolder { + return ViewHolder( + PreferenceDialogLibraryCategoriesListitemBinding.inflate( + LayoutInflater.from( + parent.context + ), parent, false + ) + ) + } + + override fun onViewMoved(oldPosition: Int, newPosition: Int) { + val categoryInfo = categoryInfos[oldPosition] + categoryInfos.removeAt(oldPosition) + categoryInfos.add(newPosition, categoryInfo) + notifyItemMoved(oldPosition, newPosition) + } + + private fun isLastCheckedCategory(categoryInfo: CategoryInfo): Boolean { + if (categoryInfo.visible) { + for (c in categoryInfos) { + if (c !== categoryInfo && c.visible) { + return false + } + } + } + return true + } + + class ViewHolder(val binding: PreferenceDialogLibraryCategoriesListitemBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.checkbox.buttonTintList = + ColorStateList.valueOf(accentColor(binding.checkbox.context)) + } + } + + init { + val swipeAndDragHelper = SwipeAndDragHelper(this) + touchHelper = ItemTouchHelper(swipeAndDragHelper) + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt index ea4e6e25e..383c19e26 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt @@ -14,6 +14,7 @@ */ package code.name.monkey.retromusic.adapter +import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -21,7 +22,7 @@ import android.view.ViewOutlineProvider import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.RecyclerView import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder +import code.name.monkey.retromusic.databinding.ItemGenreBinding import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroMusicColoredTarget @@ -38,7 +39,6 @@ import java.util.* class GenreAdapter( private val activity: FragmentActivity, var dataSet: List, - private val mItemLayoutRes: Int, private val listener: IGenreClickListener ) : RecyclerView.Adapter() { @@ -51,13 +51,13 @@ class GenreAdapter( } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(LayoutInflater.from(activity).inflate(mItemLayoutRes, parent, false)) + return ViewHolder(ItemGenreBinding.inflate(LayoutInflater.from(activity), parent, false)) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val genre = dataSet[position] - holder.title?.text = genre.name - holder.text?.text = String.format( + holder.binding.title.text = genre.name + holder.binding.text.text = String.format( Locale.getDefault(), "%d %s", genre.songCount, @@ -72,33 +72,39 @@ class GenreAdapter( .asBitmapPalette() .load(RetroGlideExtension.getSongModel(genreSong)) .songCoverOptions(genreSong) - .into(object : RetroMusicColoredTarget(holder.image!!) { + .into(object : RetroMusicColoredTarget(holder.binding.image) { override fun onColorReady(colors: MediaNotificationProcessor) { setColors(holder, colors) } }) // Just for a bit of shadow around image - holder.image?.outlineProvider = ViewOutlineProvider.BOUNDS + holder.binding.image.outlineProvider = ViewOutlineProvider.BOUNDS } private fun setColors(holder: ViewHolder, color: MediaNotificationProcessor) { - holder.imageContainerCard?.setCardBackgroundColor(color.backgroundColor) - holder.title?.setTextColor(color.primaryTextColor) - holder.text?.setTextColor(color.secondaryTextColor) + holder.binding.imageContainerCard.setCardBackgroundColor(color.backgroundColor) + holder.binding.title.setTextColor(color.primaryTextColor) + holder.binding.text.setTextColor(color.secondaryTextColor) } override fun getItemCount(): Int { return dataSet.size } + @SuppressLint("NotifyDataSetChanged") fun swapDataSet(list: List) { dataSet = list notifyDataSetChanged() } - inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { + inner class ViewHolder(val binding: ItemGenreBinding) : RecyclerView.ViewHolder(binding.root), + View.OnClickListener { override fun onClick(v: View?) { listener.onClickGenre(dataSet[layoutPosition], itemView) } + + init { + itemView.setOnClickListener(this) + } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt index 3e84aee43..35a2b2f88 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt @@ -248,7 +248,6 @@ class HomeAdapter( val genreAdapter = GenreAdapter( activity, home.arrayList as List, - R.layout.item_grid_genre, this@HomeAdapter ) recyclerView.apply { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/backup/BackupAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/backup/BackupAdapter.kt index b4a981731..adfcecf1b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/backup/BackupAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/backup/BackupAdapter.kt @@ -1,15 +1,14 @@ package code.name.monkey.retromusic.adapter.backup +import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.MenuItem -import android.view.View import android.view.ViewGroup -import android.widget.TextView -import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.PopupMenu import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.RecyclerView import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.databinding.ItemListBackupBinding import java.io.File @@ -21,27 +20,27 @@ class BackupAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return ViewHolder( - LayoutInflater.from(activity).inflate(R.layout.item_list_backup, parent, false) + ItemListBackupBinding.inflate(LayoutInflater.from(activity), parent, false) ) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.title.text = dataSet[position].nameWithoutExtension + holder.binding.title.text = dataSet[position].nameWithoutExtension } override fun getItemCount(): Int = dataSet.size + @SuppressLint("NotifyDataSetChanged") fun swapDataset(dataSet: List) { this.dataSet = ArrayList(dataSet) notifyDataSetChanged() } - inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - val title: TextView = itemView.findViewById(R.id.title) - val menu: AppCompatImageView = itemView.findViewById(R.id.menu) + inner class ViewHolder(val binding: ItemListBackupBinding) : + RecyclerView.ViewHolder(binding.root) { init { - menu.setOnClickListener { view -> + binding.menu.setOnClickListener { view -> val popupMenu = PopupMenu(activity, view) popupMenu.inflate(R.menu.menu_backup) popupMenu.setOnMenuItemClickListener { menuItem -> diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt index 06fac152b..979e3646a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt @@ -164,7 +164,7 @@ abstract class AbsRecyclerViewFragment, LM : Recycle if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) { binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height_expanded)) } else { - binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height)) + binding.recyclerView.updatePadding(bottom = dip(R.dimen.bottom_nav_height)) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt index 603717767..a1b6cdb63 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt @@ -62,7 +62,7 @@ GenresFragment : AbsRecyclerViewFragment(), override fun createAdapter(): GenreAdapter { val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet - return GenreAdapter(requireActivity(), dataSet, R.layout.item_genre, this) + return GenreAdapter(requireActivity(), dataSet, this) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt index 6f28e1ce1..9b6e19e11 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt @@ -55,7 +55,6 @@ class LibraryPreferenceDialog : DialogFragment() { .inflate(R.layout.preference_dialog_library_categories, null) val categoryAdapter = CategoryInfoAdapter() - categoryAdapter.categoryInfos = PreferenceUtil.libraryCategory val recyclerView = view.findViewById(R.id.recycler_view) recyclerView.layoutManager = LinearLayoutManager(activity) recyclerView.adapter = categoryAdapter diff --git a/app/src/main/res/layout/item_list_backup.xml b/app/src/main/res/layout/item_list_backup.xml index 79c78eac6..3cf09e0db 100644 --- a/app/src/main/res/layout/item_list_backup.xml +++ b/app/src/main/res/layout/item_list_backup.xml @@ -20,11 +20,12 @@ android:layout_height="40dp" android:layout_gravity="center_vertical" android:layout_marginStart="16dp" + android:padding="8dp" android:scaleType="centerCrop" + android:src="@drawable/ic_restore" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/title" app:layout_constraintStart_toStartOf="parent" - android:src="@drawable/ic_restore" app:layout_constraintTop_toTopOf="parent" />