Open artists and albums in search results.
This commit is contained in:
parent
cf4cd16bed
commit
98b2b31e20
|
@ -6,7 +6,11 @@ import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.github.apognu.otter.R
|
import com.github.apognu.otter.R
|
||||||
import com.github.apognu.otter.adapters.SearchAdapter
|
import com.github.apognu.otter.adapters.SearchAdapter
|
||||||
|
import com.github.apognu.otter.fragments.AlbumsFragment
|
||||||
|
import com.github.apognu.otter.fragments.ArtistsFragment
|
||||||
import com.github.apognu.otter.repositories.*
|
import com.github.apognu.otter.repositories.*
|
||||||
|
import com.github.apognu.otter.utils.Album
|
||||||
|
import com.github.apognu.otter.utils.Artist
|
||||||
import com.github.apognu.otter.utils.untilNetwork
|
import com.github.apognu.otter.utils.untilNetwork
|
||||||
import kotlinx.android.synthetic.main.activity_search.*
|
import kotlinx.android.synthetic.main.activity_search.*
|
||||||
import java.net.URLEncoder
|
import java.net.URLEncoder
|
||||||
|
@ -26,7 +30,7 @@ class SearchActivity : AppCompatActivity() {
|
||||||
|
|
||||||
setContentView(R.layout.activity_search)
|
setContentView(R.layout.activity_search)
|
||||||
|
|
||||||
adapter = SearchAdapter(this, FavoriteListener()).also {
|
adapter = SearchAdapter(this, SearchResultClickListener(), FavoriteListener()).also {
|
||||||
results.layoutManager = LinearLayoutManager(this)
|
results.layoutManager = LinearLayoutManager(this)
|
||||||
results.adapter = it
|
results.adapter = it
|
||||||
}
|
}
|
||||||
|
@ -95,6 +99,16 @@ class SearchActivity : AppCompatActivity() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inner class SearchResultClickListener : SearchAdapter.OnSearchResultClickListener {
|
||||||
|
override fun onArtistClick(holder: View?, artist: Artist) {
|
||||||
|
ArtistsFragment.openAlbums(this@SearchActivity, artist)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onAlbumClick(holder: View?, album: Album) {
|
||||||
|
AlbumsFragment.openTracks(this@SearchActivity, album)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inner class FavoriteListener : SearchAdapter.OnFavoriteListener {
|
inner class FavoriteListener : SearchAdapter.OnFavoriteListener {
|
||||||
override fun onToggleFavorite(id: Int, state: Boolean) {
|
override fun onToggleFavorite(id: Int, state: Boolean) {
|
||||||
when (state) {
|
when (state) {
|
||||||
|
|
|
@ -145,7 +145,7 @@ class PlaylistTracksAdapter(private val context: Context?, private val favoriteL
|
||||||
CommandBus.send(Command.MoveFromQueue(oldPosition, newPosition))
|
CommandBus.send(Command.MoveFromQueue(oldPosition, newPosition))
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class ViewHolder(view: View, val context: Context?) : RecyclerView.ViewHolder(view), View.OnClickListener {
|
inner class ViewHolder(view: View, val context: Context?) : RecyclerView.ViewHolder(view), View.OnClickListener {
|
||||||
val handle = view.handle
|
val handle = view.handle
|
||||||
val cover = view.cover
|
val cover = view.cover
|
||||||
val title = view.title
|
val title = view.title
|
||||||
|
|
|
@ -16,7 +16,12 @@ import com.squareup.picasso.Picasso
|
||||||
import jp.wasabeef.picasso.transformations.RoundedCornersTransformation
|
import jp.wasabeef.picasso.transformations.RoundedCornersTransformation
|
||||||
import kotlinx.android.synthetic.main.row_track.view.*
|
import kotlinx.android.synthetic.main.row_track.view.*
|
||||||
|
|
||||||
class SearchAdapter(private val context: Context?, private val favoriteListener: OnFavoriteListener? = null) : RecyclerView.Adapter<SearchAdapter.ViewHolder>() {
|
class SearchAdapter(private val context: Context?, private val listener: OnSearchResultClickListener? = null, private val favoriteListener: OnFavoriteListener? = null) : RecyclerView.Adapter<SearchAdapter.ViewHolder>() {
|
||||||
|
interface OnSearchResultClickListener {
|
||||||
|
fun onArtistClick(holder: View?, artist: Artist)
|
||||||
|
fun onAlbumClick(holder: View?, album: Album)
|
||||||
|
}
|
||||||
|
|
||||||
interface OnFavoriteListener {
|
interface OnFavoriteListener {
|
||||||
fun onToggleFavorite(id: Int, state: Boolean)
|
fun onToggleFavorite(id: Int, state: Boolean)
|
||||||
}
|
}
|
||||||
|
@ -188,6 +193,18 @@ class SearchAdapter(private val context: Context?, private val favoriteListener:
|
||||||
|
|
||||||
override fun onClick(view: View?) {
|
override fun onClick(view: View?) {
|
||||||
when (getItemViewType(layoutPosition)) {
|
when (getItemViewType(layoutPosition)) {
|
||||||
|
ResultType.Artist.ordinal -> {
|
||||||
|
val position = layoutPosition - 1
|
||||||
|
|
||||||
|
listener?.onArtistClick(view, artists[position])
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultType.Album.ordinal -> {
|
||||||
|
val position = layoutPosition - artists.size - 2
|
||||||
|
|
||||||
|
listener?.onAlbumClick(view, albums[position])
|
||||||
|
}
|
||||||
|
|
||||||
ResultType.Track.ordinal -> {
|
ResultType.Track.ordinal -> {
|
||||||
val position = layoutPosition - artists.size - albums.size - SECTION_COUNT
|
val position = layoutPosition - artists.size - albums.size - SECTION_COUNT
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import android.util.DisplayMetrics
|
||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.animation.AccelerateDecelerateInterpolator
|
import android.view.animation.AccelerateDecelerateInterpolator
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.graphics.drawable.toDrawable
|
import androidx.core.graphics.drawable.toDrawable
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
|
@ -60,7 +61,9 @@ class AlbumsFragment : FunkwhaleFragment<Album, AlbumsAdapter>() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(context as? AppCompatActivity)?.let { activity ->
|
||||||
val fragment = TracksFragment.new(album).apply {
|
val fragment = TracksFragment.new(album).apply {
|
||||||
enterTransition = Slide().apply {
|
enterTransition = Slide().apply {
|
||||||
duration = AppContext.TRANSITION_DURATION
|
duration = AppContext.TRANSITION_DURATION
|
||||||
|
|
|
@ -4,6 +4,7 @@ import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.animation.AccelerateDecelerateInterpolator
|
import android.view.animation.AccelerateDecelerateInterpolator
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.transition.Fade
|
import androidx.transition.Fade
|
||||||
|
@ -36,7 +37,9 @@ class ArtistsFragment : FunkwhaleFragment<Artist, ArtistsAdapter>() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(context as? AppCompatActivity)?.let { activity ->
|
||||||
val fragment = AlbumsFragment.new(artist, art).apply {
|
val fragment = AlbumsFragment.new(artist, art).apply {
|
||||||
enterTransition = Slide().apply {
|
enterTransition = Slide().apply {
|
||||||
duration = AppContext.TRANSITION_DURATION
|
duration = AppContext.TRANSITION_DURATION
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
style="@style/AppTheme.Fragment"
|
style="@style/AppTheme.Fragment"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/colorSurface"
|
||||||
android:transitionGroup="true">
|
android:transitionGroup="true">
|
||||||
|
|
||||||
<androidx.core.widget.NestedScrollView
|
<androidx.core.widget.NestedScrollView
|
||||||
|
|
|
@ -1,71 +1,89 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
android:orientation="vertical"
|
|
||||||
tools:context=".activities.SearchActivity">
|
|
||||||
|
|
||||||
<androidx.cardview.widget.CardView
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_margin="8dp"
|
|
||||||
android:elevation="4dp">
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.SearchView
|
|
||||||
android:id="@+id/search"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:iconifiedByDefault="false"
|
|
||||||
app:queryBackground="@android:color/transparent"
|
|
||||||
app:queryHint="@string/search_placeholder" />
|
|
||||||
|
|
||||||
</androidx.cardview.widget.CardView>
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/search_spinner"
|
|
||||||
android:layout_width="32dp"
|
|
||||||
android:layout_height="32dp"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:indeterminate="true"
|
|
||||||
android:visibility="gone" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/search_empty"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:drawableTop="@drawable/ottericon"
|
|
||||||
android:drawablePadding="16dp"
|
|
||||||
android:drawableTint="#525252"
|
|
||||||
android:text="@string/search_welcome"
|
|
||||||
android:textAlignment="center"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/search_no_results"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:drawableTop="@drawable/ottericon"
|
|
||||||
android:drawablePadding="16dp"
|
|
||||||
android:drawableTint="#525252"
|
|
||||||
android:text="@string/search_no_results"
|
|
||||||
android:textAlignment="center"
|
|
||||||
android:textSize="14sp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/results"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:itemCount="10"
|
android:orientation="vertical"
|
||||||
tools:listitem="@layout/row_track" />
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:context=".activities.SearchActivity">
|
||||||
|
|
||||||
</LinearLayout>
|
<androidx.cardview.widget.CardView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:elevation="4dp">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.SearchView
|
||||||
|
android:id="@+id/search"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:iconifiedByDefault="false"
|
||||||
|
app:queryBackground="@android:color/transparent"
|
||||||
|
app:queryHint="@string/search_placeholder" />
|
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/search_spinner"
|
||||||
|
android:layout_width="32dp"
|
||||||
|
android:layout_height="32dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/search_empty"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:drawableTop="@drawable/ottericon"
|
||||||
|
android:drawablePadding="16dp"
|
||||||
|
android:drawableTint="#525252"
|
||||||
|
android:text="@string/search_welcome"
|
||||||
|
android:textAlignment="center"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/search_no_results"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:drawableTop="@drawable/ottericon"
|
||||||
|
android:drawablePadding="16dp"
|
||||||
|
android:drawableTint="#525252"
|
||||||
|
android:text="@string/search_no_results"
|
||||||
|
android:textAlignment="center"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/results"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:itemCount="10"
|
||||||
|
tools:listitem="@layout/row_track" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -6,6 +6,9 @@
|
||||||
style="@style/AppTheme.Fragment"
|
style="@style/AppTheme.Fragment"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/colorSurface"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
android:transitionGroup="true">
|
android:transitionGroup="true">
|
||||||
|
|
||||||
<androidx.core.widget.NestedScrollView
|
<androidx.core.widget.NestedScrollView
|
||||||
|
|
Loading…
Reference in New Issue