From 7a5f5bfe1fc61b8c150338c3c3825de218e10f05 Mon Sep 17 00:00:00 2001 From: amazing-username Date: Sun, 7 Apr 2019 14:04:26 -0400 Subject: [PATCH] Functionality to search songs is operational. Next step is to work on the styling of the searchbar. Currently it is barely visible due to the color and the sizing #44 --- .../mear/activities/SongViewActivity.kt | 35 +++++++-- .../example/mear/adapters/RecyclerAdapter.kt | 74 ++++++++++++++----- app/src/main/res/layout/content_song_view.xml | 9 +++ 3 files changed, 94 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/example/mear/activities/SongViewActivity.kt b/app/src/main/java/com/example/mear/activities/SongViewActivity.kt index ed8f7a7..fc6c01e 100644 --- a/app/src/main/java/com/example/mear/activities/SongViewActivity.kt +++ b/app/src/main/java/com/example/mear/activities/SongViewActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.support.annotation.RequiresApi import android.support.v7.widget.LinearLayoutManager import android.view.View +import android.widget.SearchView import java.lang.Exception import kotlinx.android.synthetic.main.activity_song_view.* @@ -14,6 +15,9 @@ import com.example.mear.adapters.RecyclerAdapter import com.example.mear.models.TrackItems import com.example.mear.R import com.example.mear.repositories.TrackRepository +import android.R as RDroid + + class SongViewActivity : BaseServiceActivity() { @@ -33,6 +37,7 @@ class SongViewActivity : BaseServiceActivity() { window.statusBarColor = resources.getColor(R.color.track_seek) doBindService() initializeAdapter() + initializeSongSearchListener() } catch (ex: Exception) { var exMsg = ex.message @@ -47,6 +52,10 @@ class SongViewActivity : BaseServiceActivity() { } + fun playTrack(trackItems: TrackItems) { + val id = trackItems.id + musicService!!.playTrack(id) + } @RequiresApi(Build.VERSION_CODES.N) private fun initializeAdapter() { @@ -58,10 +67,9 @@ class SongViewActivity : BaseServiceActivity() { adapter = RecyclerAdapter({trackItem: TrackItems -> playTrack(trackItem)}, trackListItems) adapter.configureActivity(this) + trackList.adapter = adapter - trackList.setOnClickListener { - val temp = "dddd" - } + trackList.setHasFixedSize(true) trackList.setItemViewCacheSize(20); trackList.setDrawingCacheEnabled(true); @@ -94,8 +102,23 @@ class SongViewActivity : BaseServiceActivity() { return trackItems!! } - fun playTrack(trackItems: TrackItems) { - val id = trackItems.id - musicService!!.playTrack(id) + private fun initializeSongSearchListener() { + songSearch.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String): Boolean { + try { + adapter.filter.filter(query) + } + catch (ex: Exception) { + val exMsg = ex.message + } + + return false + } + + override fun onQueryTextChange(newText: String): Boolean { + // TODO: Implement text change + return false + } + }) } } diff --git a/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt b/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt index 315bbdf..1c5978c 100644 --- a/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt +++ b/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt @@ -4,6 +4,8 @@ import android.app.Activity import android.support.v7.widget.RecyclerView import android.view.View import android.view.ViewGroup +import android.widget.Filter +import android.widget.Filterable import java.lang.Exception import kotlinx.android.synthetic.main.fragment_song_view.view.* @@ -16,26 +18,62 @@ import com.example.mear.models.TrackItems import com.example.mear.R -class RecyclerAdapter(val mOnClickListenerI: (TrackItems) -> Unit , private val trackItemsSourceInit: ArrayList) : - RecyclerView.Adapter() { +class RecyclerAdapter(val mOnClickListenerI: (TrackItems) -> Unit, + var trackItemsSourceInit: ArrayList): + RecyclerView.Adapter(), Filterable { - open interface trackItemClickListener{ - fun onClick(view: View) + var allTrackItems = trackItemsSourceInit + val adp = this + + override fun onBindViewHolder(holder: TrackItemsHolder, position: Int) { + val itemPhoto = trackItemsSourceInit!![position] + holder.bindTrackItems(itemPhoto, mOnClickListenerI) + } + + override fun onCreateViewHolder(parent: ViewGroup, position: Int): TrackItemsHolder { + val inflatedView = parent.inflate(R.layout.fragment_song_view, false) + return TrackItemsHolder(inflatedView) + } + + override fun getFilter(): Filter { + return object: Filter() { + override fun performFiltering(constraint: CharSequence?): FilterResults { + val fr = FilterResults() + + val sortedList = mutableListOf() + + for (trackItm in allTrackItems) { + if (trackItm.artistTitle.contains(constraint!!, true) || + trackItm.trackTitle.contains(constraint!!, true)) { + sortedList.add(trackItm) + } + } + + fr.count = sortedList.size + fr.values = sortedList + + return fr + } + + override fun publishResults(constraint: CharSequence?, results: FilterResults?) { + try { + val itms = results!!.values as ArrayList + + adp.trackItemsSourceInit = itms + } + catch (ex: Exception) { + val exMsg = ex.message + } + + adp.notifyDataSetChanged() + } + } } override fun getItemCount(): Int { return trackItemsSourceInit!!.size } - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - val itemPhoto = trackItemsSourceInit!![position] - (holder as TrackItemsHolder).bindTrackItems(itemPhoto, mOnClickListenerI) - } - - override fun onCreateViewHolder(parent: ViewGroup, position: Int): RecyclerView.ViewHolder { - val inflatedView = parent.inflate(R.layout.fragment_song_view, false) - return TrackItemsHolder(inflatedView) - } fun configureActivity(actvity: Activity) { } @@ -48,27 +86,27 @@ class RecyclerAdapter(val mOnClickListenerI: (TrackItems) -> Unit , private va private val imgHeight = 90 private var mBound = false - - fun bindTrackItems(trackItems: TrackItems, clickList: (TrackItems) -> Unit) { try { var context = view.context + this.trackItem = trackItems + view.trackTitle.text = trackItem!!.trackTitle view.trackArtist.text = trackItem!!.artistTitle + val id = trackItems.id var trackCoverPath = "${context.filesDir}/${Filenames.TRACK_COVERS}" trackCoverPath = "${trackCoverPath}${id}.bmp" + Picasso.get().load(trackCoverPath).into(view.trackCover) + view.setOnClickListener { clickList(trackItem!!) } } catch (ex:Exception) { val exMsg = ex.message } } - - companion object { - } } } \ No newline at end of file diff --git a/app/src/main/res/layout/content_song_view.xml b/app/src/main/res/layout/content_song_view.xml index 2742852..89a0a12 100644 --- a/app/src/main/res/layout/content_song_view.xml +++ b/app/src/main/res/layout/content_song_view.xml @@ -14,6 +14,15 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + +