RequestSongAdapter.kt 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package io.r_a_d.radio2.ui.songs.request
  2. import android.annotation.SuppressLint
  3. import android.os.Build
  4. import android.util.TypedValue
  5. import android.view.LayoutInflater
  6. import android.view.ViewGroup
  7. import android.widget.TextView
  8. import androidx.constraintlayout.widget.ConstraintLayout
  9. import androidx.core.widget.TextViewCompat
  10. import androidx.recyclerview.widget.RecyclerView
  11. import io.r_a_d.radio2.*
  12. import io.r_a_d.radio2.playerstore.Song
  13. import kotlinx.android.synthetic.main.request_song_view.view.*
  14. import android.view.View
  15. import kotlinx.android.synthetic.main.button_load_more.view.*
  16. import android.R.attr.name
  17. import android.text.method.TextKeyListener.clear
  18. import android.util.Log
  19. import java.util.*
  20. import kotlin.collections.ArrayList
  21. class RequestSongAdapter(private val dataSet: ArrayList<Song>
  22. /*,
  23. context: Context,
  24. resource: Int,
  25. objects: Array<out Song>*/
  26. ) : RecyclerView.Adapter<RequestSongAdapter.MyViewHolder>() /*ArrayAdapter<Song>(context, resource, objects)*/ {
  27. private val viewTypeCell = 1 // normal cell with song and request button
  28. private val viewTypeFooter = 2 // the bottom cell should be the "load more" button whenever needed
  29. // Provide a reference to the views for each data item
  30. // Complex data items may need more than one view per item, and
  31. // you provide access to all the views for a data item in a view holder.
  32. // Each data item is just a string in this case that is shown in a TextView.
  33. class MyViewHolder(view: ConstraintLayout) : RecyclerView.ViewHolder(view)
  34. // Create new views (invoked by the layout manager)
  35. override fun onCreateViewHolder(parent: ViewGroup,
  36. viewType: Int): MyViewHolder {
  37. // create a new view
  38. val view =
  39. if (viewType == viewTypeCell)
  40. LayoutInflater.from(parent.context).inflate(R.layout.request_song_view, parent, false) as ConstraintLayout
  41. else
  42. LayoutInflater.from(parent.context).inflate(R.layout.button_load_more, parent, false) as ConstraintLayout
  43. // set the view's size, margins, paddings and layout parameters
  44. //...
  45. return MyViewHolder(view)
  46. }
  47. // Replace the contents of a view (invoked by the layout manager)
  48. @SuppressLint("SetTextI18n")
  49. override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
  50. if (itemCount <= 1)
  51. {
  52. // in any case, if there's nothing, don't display the loadMore button!!
  53. holder.itemView.loadMoreButton.visibility = View.GONE
  54. return
  55. }
  56. if (holder.itemViewType == viewTypeFooter)
  57. {
  58. if (Requestor.instance.isLoadMoreVisible)
  59. holder.itemView.loadMoreButton.visibility = View.VISIBLE
  60. else
  61. holder.itemView.loadMoreButton.visibility = View.GONE
  62. holder.itemView.loadMoreButton.text = "Load more results"
  63. holder.itemView.loadMoreButton.setOnClickListener{
  64. Requestor.instance.loadMore()
  65. }
  66. return
  67. }
  68. val artist = holder.itemView.findViewById<TextView>(R.id.request_song_artist)
  69. val title = holder.itemView.findViewById<TextView>(R.id.request_song_title)
  70. val button = holder.itemView.request_button
  71. if (dataSet[position].isRequestable) {
  72. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) // for API21+ Material Design makes ripples on the button.
  73. button.supportBackgroundTintList = colorGreenList
  74. else // But on API20- no Material Design support, so we add some more color when clicked
  75. button.supportBackgroundTintList = colorGreenListCompat
  76. button.isEnabled = true
  77. button.isClickable = true
  78. button.setOnClickListener {
  79. Requestor.instance.request(dataSet[position].id)
  80. }
  81. } else {
  82. button.supportBackgroundTintList = colorRedList
  83. button.isEnabled = false
  84. button.isClickable = false
  85. }
  86. TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
  87. button,2, 24, 2, TypedValue.COMPLEX_UNIT_SP)
  88. artist.text = dataSet[position].artist.value
  89. title.text = dataSet[position].title.value
  90. }
  91. // Return the size of your dataset (invoked by the layout manager)
  92. override fun getItemCount() = dataSet.size + 1 // add 1 for the "Load more results" button
  93. override fun getItemViewType(position: Int): Int {
  94. return if (position == dataSet.size) viewTypeFooter else viewTypeCell
  95. }
  96. /*
  97. override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
  98. // create a new view
  99. val view = LayoutInflater.from(parent.context)
  100. .inflate(R.layout.song_view, parent, false) as ConstraintLayout
  101. }
  102. */
  103. // a filtering function. As naive as it could be, but it should work.
  104. private val dataSetOrig = ArrayList<Song>()
  105. init {
  106. dataSetOrig.addAll(dataSet)
  107. }
  108. fun filter(entry: String) {
  109. var text = entry
  110. dataSet.clear()
  111. Log.d(tag, "entering filter")
  112. if (text.isEmpty()) {
  113. dataSet.addAll(dataSetOrig)
  114. } else {
  115. text = text.toLowerCase(locale = Locale.ROOT)
  116. for (item in dataSetOrig) {
  117. Log.d(tag, "$text, ${item.artist.value!!.toLowerCase(locale = Locale.ROOT)}, ${item.title.value!!.toLowerCase(locale = Locale.ROOT)}")
  118. if (item.artist.value!!.toLowerCase(locale = Locale.ROOT).contains(text) ||
  119. item.title.value!!.toLowerCase(locale = Locale.ROOT).contains(text)) {
  120. dataSet.add(item)
  121. }
  122. }
  123. }
  124. notifyDataSetChanged()
  125. }
  126. }