added swipe to delete for cookies and command templates items

This commit is contained in:
deniscerri 2023-04-24 20:27:32 +02:00
parent d6c5e6b692
commit 7073a358eb
No known key found for this signature in database
GPG key ID: 95C43D517D830350
5 changed files with 173 additions and 65 deletions

View file

@ -50,9 +50,6 @@ class CookieAdapter(onItemClickListener: OnItemClickListener, activity: Activity
onItemClickListener.onItemClick(item!!)
}
card.setOnLongClickListener {
onItemClickListener.onDelete(item!!); true
}
}
interface OnItemClickListener {

View file

@ -55,10 +55,6 @@ class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activ
card.setOnClickListener {
onItemClickListener.onItemClick(item!!, position)
}
card.setOnLongClickListener {
onItemClickListener.onDelete(item!!); true
}
}
interface OnItemClickListener {

View file

@ -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<ConstraintLayout>(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<SearchView>(R.id.search_view)
val queriesConstraint = requireView().findViewById<ConstraintLayout>(R.id.queries_constraint)
val queriesInitStartBtn = queriesConstraint.findViewById<MaterialButton>(R.id.init_search_query)
val isRightToLeft = resources.getBoolean(R.bool.is_right_to_left)
infoUtil = InfoUtil(requireContext())
val linkYouCopied = searchView.findViewById<ConstraintLayout>(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<TextView>(R.id.suggestion_text)
linkYouCopied!!.visibility = VISIBLE
val textView = linkYouCopied!!.findViewById<TextView>(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<ImageButton>(R.id.set_search_query_button)
val mb = linkYouCopied!!.findViewById<ImageButton>(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<ImageButton>(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<ImageButton>(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)

View file

@ -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<CommandTemplate>
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
)
}
}
}

View file

@ -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<CookieItem>
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
)
}
}
}