/* * Copyright (c) 2019 Hemanth Savarala. * * Licensed under the GNU General Public License v3 * * This is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by * the Free Software Foundation either version 3 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * 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; 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 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; import com.google.android.material.checkbox.MaterialCheckBox; import java.util.List; public class CategoryInfoAdapter extends RecyclerView.Adapter implements SwipeAndDragHelper.ActionCompletionContract { private List categoryInfos; private 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; } } } return true; } static class ViewHolder extends RecyclerView.ViewHolder { private MaterialCheckBox checkBox; private View dragView; private 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); } } }