CustomAppsAdapter.kt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package com.sduduzog.slimlauncher.adapters
  2. import android.annotation.SuppressLint
  3. import android.view.LayoutInflater
  4. import android.view.MotionEvent
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import android.widget.ImageView
  8. import android.widget.TextView
  9. import androidx.recyclerview.widget.ItemTouchHelper
  10. import androidx.recyclerview.widget.RecyclerView
  11. import com.sduduzog.slimlauncher.R
  12. import com.sduduzog.slimlauncher.data.model.HomeApp
  13. import com.sduduzog.slimlauncher.utils.OnItemActionListener
  14. import com.sduduzog.slimlauncher.utils.OnShitDoneToAppsListener
  15. class CustomAppsAdapter(private val listener: OnShitDoneToAppsListener) : RecyclerView.Adapter<CustomAppsAdapter.ViewHolder>(), OnItemActionListener {
  16. private var apps: MutableList<HomeApp> = mutableListOf()
  17. private lateinit var touchHelper: ItemTouchHelper
  18. override fun getItemCount(): Int = apps.size
  19. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
  20. val view = LayoutInflater.from(parent.context).inflate(R.layout.customise_apps_fragment_list_item, parent, false)
  21. return ViewHolder(view)
  22. }
  23. @SuppressLint("ClickableViewAccessibility")
  24. override fun onBindViewHolder(holder: ViewHolder, position: Int) {
  25. val item = apps[position]
  26. holder.appName.text = item.appName
  27. holder.dragHandle.setOnTouchListener { _, motionEvent ->
  28. if (motionEvent.actionMasked == MotionEvent.ACTION_DOWN) {
  29. touchHelper.startDrag(holder)
  30. }
  31. false
  32. }
  33. holder.menuIcon.setOnClickListener {
  34. listener.onAppMenuClicked(it, item)
  35. }
  36. }
  37. fun setItems(apps: List<HomeApp>) {
  38. this.apps = sanitiseIndexes(apps) as MutableList<HomeApp>
  39. notifyDataSetChanged()
  40. }
  41. private fun sanitiseIndexes(apps: List<HomeApp>): List<HomeApp> {
  42. for (i in apps.indices) {
  43. apps[i].sortingIndex = i
  44. }
  45. return apps
  46. }
  47. fun setItemTouchHelper(touchHelper: ItemTouchHelper) {
  48. this.touchHelper = touchHelper
  49. }
  50. override fun onViewMoved(oldPosition: Int, newPosition: Int): Boolean {
  51. if ((oldPosition < apps.size) and (newPosition < apps.size)) {
  52. val app1 = apps[oldPosition]
  53. val app2 = apps[newPosition]
  54. app1.sortingIndex = newPosition
  55. app2.sortingIndex = oldPosition
  56. apps[oldPosition] = app2
  57. apps[newPosition] = app1
  58. notifyItemMoved(oldPosition, newPosition)
  59. return true
  60. }
  61. return false
  62. }
  63. override fun onViewIdle() {
  64. listener.onAppsUpdated(apps)
  65. }
  66. override fun onViewSwiped(position: Int) {
  67. // Do nothing. We are under attack!
  68. }
  69. inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
  70. val dragHandle: TextView = itemView.findViewById(R.id.ca_list_item_drag_handle)
  71. val appName: TextView = itemView.findViewById(R.id.ca_list_item_app_name)
  72. val menuIcon: ImageView = itemView.findViewById(R.id.ca_list_item_more_icon)
  73. override fun toString(): String {
  74. return super.toString() + " '${appName.text}'"
  75. }
  76. }
  77. }