From 7073a358ebb82a5b7d0ba9c668981b440eaa7e60 Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Mon, 24 Apr 2023 20:27:32 +0200 Subject: [PATCH] added swipe to delete for cookies and command templates items --- .../ytdlnis/adapter/CookieAdapter.kt | 3 - .../ytdlnis/adapter/TemplatesAdapter.kt | 4 - .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 103 ++++++++---------- .../ui/more/CommandTemplatesActivity.kt | 63 +++++++++++ .../ytdlnis/ui/more/CookiesActivity.kt | 65 +++++++++++ 5 files changed, 173 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt index 3e7ec1c5..a29a2329 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt @@ -50,9 +50,6 @@ class CookieAdapter(onItemClickListener: OnItemClickListener, activity: Activity onItemClickListener.onItemClick(item!!) } - card.setOnLongClickListener { - onItemClickListener.onDelete(item!!); true - } } interface OnItemClickListener { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt index 245d09f7..976d54f8 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt @@ -55,10 +55,6 @@ class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activ card.setOnClickListener { onItemClickListener.onItemClick(item!!, position) } - - card.setOnLongClickListener { - onItemClickListener.onDelete(item!!); true - } } interface OnItemClickListener { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt index bd25f043..19170657 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -7,34 +7,26 @@ import android.content.Context.CLIPBOARD_SERVICE import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable -import android.graphics.drawable.RippleDrawable import android.os.Bundle import android.os.Handler import android.os.Looper import android.text.Editable -import android.util.DisplayMetrics import android.util.Log import android.view.* import android.view.View.* import android.widget.* import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode -import androidx.appcompat.view.StandaloneActionMode import androidx.constraintlayout.widget.ConstraintLayout import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.children import androidx.core.view.forEach -import androidx.core.widget.addTextChangedListener import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.deniscerri.ytdlnis.App import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.adapter.HomeAdapter @@ -87,6 +79,8 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi private var layoutinflater: LayoutInflater? = null private var shimmerCards: ShimmerFrameLayout? = null private var searchBar: SearchBar? = null + private var searchView: SearchView? = null + private var linkYouCopied: ConstraintLayout? = null private var queriesChipGroup: ChipGroup? = null private var recyclerView: RecyclerView? = null private var uiHandler: Handler? = null @@ -130,6 +124,8 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi //initViews shimmerCards = view.findViewById(R.id.shimmer_results_framelayout) searchBar = view.findViewById(R.id.search_bar) + searchView = view.findViewById(R.id.search_view) + linkYouCopied = searchView?.findViewById(R.id.link_you_copied) appBarLayout = view.findViewById(R.id.home_appbarlayout) queriesChipGroup = view.findViewById(R.id.queries) searchSuggestions = view.findViewById(R.id.search_suggestions_scroll_view) @@ -206,19 +202,20 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi override fun onResume() { super.onResume() resultViewModel.checkTrending() + if (searchView?.currentTransitionState == SearchView.TransitionState.SHOWN){ + updateSearchViewItems(searchView?.editText?.text, linkYouCopied) + } } @SuppressLint("ClickableViewAccessibility") private fun initMenu() { - val searchView = requireView().findViewById(R.id.search_view) val queriesConstraint = requireView().findViewById(R.id.queries_constraint) val queriesInitStartBtn = queriesConstraint.findViewById(R.id.init_search_query) val isRightToLeft = resources.getBoolean(R.bool.is_right_to_left) infoUtil = InfoUtil(requireContext()) - val linkYouCopied = searchView.findViewById(R.id.link_you_copied) - searchView.addTransitionListener { view, previousState, newState -> + searchView!!.addTransitionListener { _, _, newState -> if (newState == SearchView.TransitionState.SHOWN) { try{ val clipboard = @@ -227,11 +224,11 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi "(https?://(?:www\\.|(?!www))[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|www\\.[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|https?://(?:www\\.|(?!www))[a-zA-Z\\d]+\\.\\S{2,}|www\\.[a-zA-Z\\d]+\\.\\S{2,})".toRegex() val clip = clipboard.primaryClip!!.getItemAt(0).text if (regex.containsMatchIn(clip.toString())) { - linkYouCopied.visibility = VISIBLE - val textView = linkYouCopied.findViewById(R.id.suggestion_text) + linkYouCopied!!.visibility = VISIBLE + val textView = linkYouCopied!!.findViewById(R.id.suggestion_text) textView.text = getString(R.string.link_you_copied) textView.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_language, 0, 0, 0) - val mb = linkYouCopied.findViewById(R.id.set_search_query_button) + val mb = linkYouCopied!!.findViewById(R.id.set_search_query_button) mb.setImageResource(R.drawable.ic_plus) mb.setOnClickListener { @@ -247,31 +244,31 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } if (queriesChipGroup!!.childCount == 0) queriesConstraint.visibility = GONE else queriesConstraint.visibility = VISIBLE - searchView.editText.setText("") - linkYouCopied.visibility = GONE + searchView!!.editText.setText("") + linkYouCopied!!.visibility = GONE } textView.setOnClickListener { - searchView.setText(clip.toString()) - initSearch(searchView) + searchView!!.setText(clip.toString()) + initSearch(searchView!!) } }else{ - linkYouCopied.visibility = GONE + linkYouCopied!!.visibility = GONE } - updateSearchViewItems(searchView.editText.text, searchView, linkYouCopied) + updateSearchViewItems(searchView!!.editText.text, linkYouCopied) }catch (e: Exception){ e.printStackTrace() - linkYouCopied.visibility = GONE + linkYouCopied!!.visibility = GONE } } } - searchView.editText.doAfterTextChanged { - if (searchView.currentTransitionState != SearchView.TransitionState.SHOWN) return@doAfterTextChanged - updateSearchViewItems(it, searchView, linkYouCopied) + searchView!!.editText.doAfterTextChanged { + if (searchView!!.currentTransitionState != SearchView.TransitionState.SHOWN) return@doAfterTextChanged + updateSearchViewItems(it, linkYouCopied) } - searchView.editText.setOnTouchListener(OnTouchListener { v, event -> + searchView!!.editText.setOnTouchListener(OnTouchListener { v, event -> try{ val drawableLeft = 0 val drawableTop = 1 @@ -279,14 +276,14 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi val drawableBottom = 3 if (event.action == MotionEvent.ACTION_UP) { if ( - (isRightToLeft && (event.x < (searchView.editText.left - searchView.editText.compoundDrawables[drawableLeft].bounds.width()))) || - (!isRightToLeft && (event.x > (searchView.editText.right - searchView.editText.compoundDrawables[drawableRight].bounds.width()))) + (isRightToLeft && (event.x < (searchView!!.editText.left - searchView!!.editText.compoundDrawables[drawableLeft].bounds.width()))) || + (!isRightToLeft && (event.x > (searchView!!.editText.right - searchView!!.editText.compoundDrawables[drawableRight].bounds.width()))) ){ - val present = queriesChipGroup!!.children.firstOrNull { (it as Chip).text.toString() == searchView.editText.text.toString() } + val present = queriesChipGroup!!.children.firstOrNull { (it as Chip).text.toString() == searchView!!.editText.text.toString() } if (present == null) { val chip = layoutinflater!!.inflate(R.layout.input_chip, queriesChipGroup, false) as Chip - chip.text = searchView.editText.text + chip.text = searchView!!.editText.text chip.chipBackgroundColor = ColorStateList.valueOf(MaterialColors.getColor(requireContext(), R.attr.colorSecondaryContainer, Color.BLACK)) chip.setOnClickListener { queriesChipGroup!!.removeView(chip) @@ -295,7 +292,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } if (queriesChipGroup!!.childCount == 0) queriesConstraint.visibility = GONE else queriesConstraint.visibility = VISIBLE - searchView.editText.setText("") + searchView!!.editText.setText("") return@OnTouchListener true } @@ -304,8 +301,8 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi false }) - searchView.editText.setOnEditorActionListener { textView, i, keyEvent -> - initSearch(searchView) + searchView!!.editText.setOnEditorActionListener { _, _, _ -> + initSearch(searchView!!) true } @@ -314,7 +311,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi R.id.delete_results -> { resultViewModel.getTrending() selectedObjects = ArrayList() - searchBar!!.setText("") + searchBar!!.text = "" downloadAllFabCoordinator!!.visibility = GONE downloadFabs!!.visibility = GONE } @@ -328,15 +325,15 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi queriesChipGroup!!.addOnLayoutChangeListener { view, i, i2, i3, i4, i5, i6, i7, i8 -> if (queriesChipGroup!!.childCount == 0) queriesConstraint.visibility = GONE else queriesConstraint.visibility = VISIBLE - searchView.editText.setText("") + searchView!!.editText.setText("") } queriesInitStartBtn.setOnClickListener { - initSearch(searchView) + initSearch(searchView!!) } } - private fun updateSearchViewItems(it: Editable?, searchView: SearchView, linkYouCopied: View?){ + private fun updateSearchViewItems(it: Editable?, linkYouCopied: View?){ lifecycleScope.launch { searchSuggestionsLinearLayout!!.removeAllViews() searchHistoryLinearLayout!!.removeAllViews() @@ -345,10 +342,10 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi searchHistoryLinearLayout!!.visibility = GONE linkYouCopied!!.visibility = GONE - if (searchView.editText.text.isEmpty()){ - searchView.editText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0) + if (searchView!!.editText.text.isEmpty()){ + searchView!!.editText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0) }else{ - searchView.editText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_plus, 0) + searchView!!.editText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_plus, 0) } val suggestions = withContext(Dispatchers.IO){ if (it!!.isEmpty()) { @@ -371,8 +368,8 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi ) } textView.setOnClickListener { - searchView.setText(textView.text) - initSearch(searchView) + searchView!!.setText(textView.text) + initSearch(searchView!!) } textView.setOnLongClickListener { val deleteDialog = MaterialAlertDialogBuilder(requireContext()) @@ -388,8 +385,8 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi val mb = v.findViewById(R.id.set_search_query_button) mb.setOnClickListener { - searchView.setText(textView.text) - searchView.editText.setSelection(searchView.editText.length()) + searchView!!.setText(textView.text) + searchView!!.editText.setSelection(searchView!!.editText.length()) } } searchHistoryLinearLayout!!.visibility = VISIBLE @@ -408,13 +405,13 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi ) } textView.setOnClickListener { - searchView.setText(textView.text) - initSearch(searchView) + searchView!!.setText(textView.text) + initSearch(searchView!!) } val mb = v.findViewById(R.id.set_search_query_button) mb.setOnClickListener { - searchView.setText(textView.text) - searchView.editText.setSelection(searchView.editText.length()) + searchView!!.setText(textView.text) + searchView!!.editText.setSelection(searchView!!.editText.length()) } } searchSuggestionsLinearLayout!!.visibility = VISIBLE @@ -442,7 +439,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi if (queryList.isEmpty()) return if (queryList.size == 1){ - searchBar!!.setText(searchView.text) + searchBar!!.text = searchView.text } searchView.hide() @@ -466,16 +463,6 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi (searchBar!!.parent as AppBarLayout).setExpanded(true, true) } - private fun findVideo(url: String): ResultItem? { - for (i in resultsList!!.indices) { - val v = resultsList!![i] - if (v!!.url == url) { - return v - } - } - return null - } - @SuppressLint("ResourceType") override fun onButtonClick(videoURL: String, type: DownloadViewModel.Type?) { Log.e(TAG, type.toString() + " " + videoURL) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesActivity.kt index 594d28f9..588beea3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesActivity.kt @@ -2,12 +2,15 @@ package com.deniscerri.ytdlnis.ui.more import android.content.Context import android.content.DialogInterface +import android.graphics.Canvas +import android.graphics.Color import android.os.Bundle import android.view.MenuItem import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R @@ -20,6 +23,7 @@ import com.deniscerri.ytdlnis.util.UiUtil import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.chip.Chip import com.google.android.material.dialog.MaterialAlertDialogBuilder +import it.xabaras.android.recyclerview.swipedecorator.RecyclerViewSwipeDecorator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -31,12 +35,14 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis private lateinit var topAppBar: MaterialToolbar private lateinit var commandTemplateViewModel: CommandTemplateViewModel private lateinit var uiUtil: UiUtil + private lateinit var templatesList: List var context: Context? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_command_templates) context = baseContext + templatesList = listOf() topAppBar = findViewById(R.id.logs_toolbar) topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } @@ -49,11 +55,14 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis recyclerView = findViewById(R.id.template_recyclerview) recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = templatesAdapter + val itemTouchHelper = ItemTouchHelper(simpleCallback) + itemTouchHelper.attachToRecyclerView(recyclerView) uiUtil = UiUtil(FileUtil()) commandTemplateViewModel = ViewModelProvider(this)[CommandTemplateViewModel::class.java] commandTemplateViewModel.items.observe(this) { + templatesList = it templatesAdapter.submitList(it) } initMenu() @@ -117,4 +126,58 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis } deleteDialog.show() } + + private var simpleCallback: ItemTouchHelper.SimpleCallback = + object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT ) { + override fun onMove(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder + ): Boolean { + return false + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + val position = viewHolder.bindingAdapterPosition + when (direction) { + ItemTouchHelper.LEFT -> { + val deletedItem = templatesList[position] + templatesAdapter.notifyItemChanged(position) + onDelete(deletedItem) + } + + } + } + + override fun onChildDraw( + c: Canvas, + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + dX: Float, + dY: Float, + actionState: Int, + isCurrentlyActive: Boolean + ) { + RecyclerViewSwipeDecorator.Builder( + context, + c, + recyclerView, + viewHolder, + dX, + dY, + actionState, + isCurrentlyActive + ) + .addSwipeLeftBackgroundColor(Color.RED) + .addSwipeLeftActionIcon(R.drawable.baseline_delete_24) + .create() + .decorate() + super.onChildDraw( + c, + recyclerView, + viewHolder, + dX, + dY, + actionState, + isCurrentlyActive + ) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesActivity.kt index dd4d6988..d6b0a6ee 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesActivity.kt @@ -3,6 +3,8 @@ package com.deniscerri.ytdlnis.ui.more import android.content.Context import android.content.DialogInterface import android.content.Intent +import android.graphics.Canvas +import android.graphics.Color import android.os.Bundle import android.view.MenuItem import android.view.inputmethod.InputMethodManager @@ -12,6 +14,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.widget.doOnTextChanged import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R @@ -19,11 +22,14 @@ import com.deniscerri.ytdlnis.adapter.CookieAdapter import com.deniscerri.ytdlnis.database.models.CookieItem import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel import com.deniscerri.ytdlnis.ui.BaseActivity +import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.UiUtil import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.chip.Chip +import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder +import it.xabaras.android.recyclerview.swipedecorator.RecyclerViewSwipeDecorator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.File @@ -35,6 +41,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { private lateinit var topAppBar: MaterialToolbar private lateinit var cookiesViewModel: CookieViewModel private lateinit var uiUtil: UiUtil + private lateinit var cookiesList: List var context: Context? = null public override fun onCreate(savedInstanceState: Bundle?) { @@ -44,6 +51,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { topAppBar = findViewById(R.id.logs_toolbar) topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } + cookiesList = listOf() listAdapter = CookieAdapter( @@ -53,11 +61,14 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { recyclerView = findViewById(R.id.template_recyclerview) recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = listAdapter + val itemTouchHelper = ItemTouchHelper(simpleCallback) + itemTouchHelper.attachToRecyclerView(recyclerView) uiUtil = UiUtil(FileUtil()) cookiesViewModel = ViewModelProvider(this)[CookieViewModel::class.java] cookiesViewModel.items.observe(this) { + cookiesList = it listAdapter.submitList(it) } initMenu() @@ -155,4 +166,58 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { } deleteDialog.show() } + + private var simpleCallback: ItemTouchHelper.SimpleCallback = + object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT ) { + override fun onMove(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder + ): Boolean { + return false + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + val position = viewHolder.bindingAdapterPosition + when (direction) { + ItemTouchHelper.LEFT -> { + val deletedItem = cookiesList[position] + listAdapter.notifyItemChanged(position) + onDelete(deletedItem) + } + + } + } + + override fun onChildDraw( + c: Canvas, + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + dX: Float, + dY: Float, + actionState: Int, + isCurrentlyActive: Boolean + ) { + RecyclerViewSwipeDecorator.Builder( + context, + c, + recyclerView, + viewHolder, + dX, + dY, + actionState, + isCurrentlyActive + ) + .addSwipeLeftBackgroundColor(Color.RED) + .addSwipeLeftActionIcon(R.drawable.baseline_delete_24) + .create() + .decorate() + super.onChildDraw( + c, + recyclerView, + viewHolder, + dX, + dY, + actionState, + isCurrentlyActive + ) + } + } } \ No newline at end of file