FavoritesFragment.kt 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package io.r_a_d.radio2.ui.songs.request
  2. import android.os.Build
  3. import android.os.Bundle
  4. import android.util.Log
  5. import android.view.LayoutInflater
  6. import android.view.View
  7. import android.view.ViewGroup
  8. import android.widget.SearchView
  9. import android.widget.TextView
  10. import androidx.appcompat.widget.AppCompatButton
  11. import androidx.fragment.app.Fragment
  12. import androidx.lifecycle.Observer
  13. import androidx.recyclerview.widget.LinearLayoutManager
  14. import androidx.recyclerview.widget.RecyclerView
  15. import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
  16. import io.r_a_d.radio2.*
  17. class FavoritesFragment : Fragment() {
  18. private lateinit var recyclerView: RecyclerView
  19. private lateinit var viewAdapter: RecyclerView.Adapter<*>
  20. private lateinit var viewManager: RecyclerView.LayoutManager
  21. private lateinit var searchView: SearchView
  22. private lateinit var root: View
  23. private lateinit var recyclerSwipe: SwipeRefreshLayout
  24. private val favoritesSongObserver : Observer<Boolean> = Observer {
  25. viewAdapter.notifyDataSetChanged()
  26. createView(isCallback = true) // force-re-create the view, but do not call again the initFavorites (avoid callback loop)
  27. recyclerSwipe.isRefreshing = false // disable refreshing animation. Needs to be done manually...
  28. }
  29. override fun onCreateView(
  30. inflater: LayoutInflater,
  31. container: ViewGroup?,
  32. savedInstanceState: Bundle?
  33. ): View? {
  34. super.onCreateView(inflater, container, savedInstanceState)
  35. root = inflater.inflate(R.layout.fragment_request, container, false)
  36. return createView()
  37. }
  38. private fun createView(isCallback: Boolean = false) : View?
  39. {
  40. viewAdapter = RequestSongAdapter(Requestor.instance.favoritesSongArray)
  41. val listener : SearchView.OnQueryTextListener = object : SearchView.OnQueryTextListener{
  42. override fun onQueryTextSubmit(query: String?): Boolean {
  43. // do nothing
  44. return true
  45. }
  46. override fun onQueryTextChange(newText: String?): Boolean {
  47. (viewAdapter as RequestSongAdapter).filter(newText ?: "")
  48. return true
  49. }
  50. }
  51. searchView = root.findViewById(R.id.searchBox)
  52. searchView.queryHint = "Search filter..."
  53. searchView.setOnQueryTextListener(listener)
  54. viewManager = LinearLayoutManager(context)
  55. recyclerView = root.findViewById<RecyclerView>(R.id.request_recycler).apply {
  56. // use this setting to improve performance if you know that changes
  57. // in content do not change the layout size of the RecyclerView
  58. setHasFixedSize(true)
  59. // use a linear layout manager
  60. layoutManager = viewManager
  61. // specify an viewAdapter (see also next example)
  62. adapter = viewAdapter
  63. }
  64. val noUserNameText : TextView = root.findViewById(R.id.noUserNameText)
  65. recyclerSwipe = root.findViewById(R.id.recyclerSwipe) as SwipeRefreshLayout
  66. recyclerSwipe.setOnRefreshListener {
  67. val userName1 = preferenceStore.getString("userName", null)
  68. Log.d(tag,"userName = $userName1")
  69. if (userName1 != null && !userName1.isBlank())
  70. {
  71. noUserNameText.visibility = View.GONE
  72. Requestor.instance.initFavorites()
  73. } else {
  74. noUserNameText.visibility = View.VISIBLE
  75. recyclerSwipe.isRefreshing = false
  76. }
  77. }
  78. val userName1 = preferenceStore.getString("userName", null)
  79. Log.d(tag,"userName = $userName1")
  80. if (userName1 != null && !userName1.isBlank())
  81. {
  82. noUserNameText.visibility = View.GONE
  83. if (!isCallback) // avoid callback loop if called from the Observer.
  84. Requestor.instance.initFavorites()
  85. } else {
  86. noUserNameText.visibility = View.VISIBLE
  87. recyclerSwipe.isRefreshing = false
  88. }
  89. val raFButton : AppCompatButton = root.findViewById(R.id.ra_f_button)
  90. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) // for API21+ Material Design makes ripples on the button.
  91. raFButton.supportBackgroundTintList = colorGreenList
  92. else // But on API20- no Material Design support, so we add some more color when clicked
  93. raFButton.supportBackgroundTintList = colorGreenListCompat
  94. raFButton.isEnabled = true
  95. raFButton.isClickable = true
  96. raFButton.setOnClickListener {
  97. val s = Requestor.instance.raF()
  98. Requestor.instance.snackBarText.value = ""
  99. Requestor.instance.addRequestMeta = "Request: ${s.artist.value} - ${s.title.value}\n"
  100. Requestor.instance.request(s.id)
  101. }
  102. raFButton.visibility = View.VISIBLE
  103. Requestor.instance.isFavoritesUpdated.observe(viewLifecycleOwner, favoritesSongObserver)
  104. return root
  105. }
  106. companion object {
  107. @JvmStatic
  108. fun newInstance() = FavoritesFragment()
  109. }
  110. }