mirror of
https://github.com/clangen/musikcube.git
synced 2025-03-29 19:20:28 +00:00
Added AlbumBrowseFragment. Next up: TrackListFragment.
This commit is contained in:
parent
6aae748205
commit
8f63cdf7a2
@ -2,6 +2,7 @@ package io.casey.musikcube.remote.injection
|
||||
|
||||
import dagger.Component
|
||||
import io.casey.musikcube.remote.ui.albums.activity.AlbumBrowseActivity
|
||||
import io.casey.musikcube.remote.ui.albums.fragment.AlbumBrowseFragment
|
||||
import io.casey.musikcube.remote.ui.browse.activity.BrowseActivity
|
||||
import io.casey.musikcube.remote.ui.category.activity.AllCategoriesActivity
|
||||
import io.casey.musikcube.remote.ui.category.activity.CategoryBrowseActivity
|
||||
@ -19,6 +20,7 @@ import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
||||
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
||||
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
||||
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
||||
import io.casey.musikcube.remote.ui.tracks.fragment.TrackListFragment
|
||||
|
||||
@ViewScope
|
||||
@Component(dependencies = arrayOf(AppComponent::class))
|
||||
@ -37,7 +39,9 @@ interface ViewComponent {
|
||||
fun inject(activity: TrackListActivity)
|
||||
|
||||
fun inject(fragment: BaseFragment)
|
||||
fun inject(fragment: AlbumBrowseFragment)
|
||||
fun inject(fragment: CategoryBrowseFragment)
|
||||
fun inject(fragment: TrackListFragment)
|
||||
|
||||
fun inject(view: EmptyListView)
|
||||
fun inject(view: MainMetadataView)
|
||||
|
@ -4,152 +4,62 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.Menu
|
||||
import android.view.View
|
||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||
import io.casey.musikcube.remote.R
|
||||
import io.casey.musikcube.remote.service.websocket.Messages
|
||||
import io.casey.musikcube.remote.service.websocket.model.IAlbum
|
||||
import io.casey.musikcube.remote.service.websocket.model.ICategoryValue
|
||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
||||
import io.casey.musikcube.remote.ui.albums.adapter.AlbumBrowseAdapter
|
||||
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
||||
import io.casey.musikcube.remote.ui.shared.activity.Filterable
|
||||
import io.casey.musikcube.remote.ui.shared.extension.*
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
|
||||
import io.casey.musikcube.remote.ui.albums.constant.Album
|
||||
import io.casey.musikcube.remote.ui.albums.fragment.AlbumBrowseFragment
|
||||
import io.casey.musikcube.remote.ui.shared.activity.FragmentActivityWithTransport
|
||||
import io.casey.musikcube.remote.ui.shared.extension.EXTRA_ACTIVITY_TITLE
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
||||
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
||||
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
||||
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
||||
import io.casey.musikcube.remote.util.Debouncer
|
||||
import io.casey.musikcube.remote.util.Strings
|
||||
import io.reactivex.rxkotlin.subscribeBy
|
||||
|
||||
class AlbumBrowseActivity : BaseActivity(), Filterable {
|
||||
private var categoryName: String = ""
|
||||
private var categoryId: Long = 0
|
||||
private var lastFilter = ""
|
||||
private lateinit var adapter: AlbumBrowseAdapter
|
||||
class AlbumBrowseActivity : FragmentActivityWithTransport() {
|
||||
private lateinit var playback: PlaybackMixin
|
||||
private lateinit var data: DataProviderMixin
|
||||
private lateinit var transport: TransportFragment
|
||||
private lateinit var emptyView: EmptyListView
|
||||
|
||||
private val albums
|
||||
get() = content as AlbumBrowseFragment
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
component.inject(this)
|
||||
data = mixin(DataProviderMixin())
|
||||
playback = mixin(PlaybackMixin())
|
||||
mixin(ItemContextMenuMixin(this))
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
}
|
||||
|
||||
categoryName = intent.getStringExtra(EXTRA_CATEGORY_NAME) ?: ""
|
||||
categoryId = intent.getLongExtra(EXTRA_CATEGORY_ID, categoryId)
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean = albums.createOptionsMenu(menu)
|
||||
override fun setFilter(filter: String) = albums.setFilter(filter)
|
||||
override fun onTransportChanged() = albums.notifyTransportChanged()
|
||||
override val contentFragmentTag: String = AlbumBrowseFragment.TAG
|
||||
|
||||
setContentView(R.layout.recycler_view_activity)
|
||||
|
||||
setTitleFromIntent(R.string.albums_title)
|
||||
enableUpNavigation()
|
||||
|
||||
adapter = AlbumBrowseAdapter(eventListener, playback, prefs)
|
||||
|
||||
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
|
||||
setupDefaultRecyclerView(recyclerView, adapter)
|
||||
|
||||
emptyView = findViewById(R.id.empty_list_view)
|
||||
emptyView.capability = EmptyListView.Capability.OnlineOnly
|
||||
emptyView.emptyMessage = getString(R.string.empty_no_items_format, getString(R.string.browse_type_albums))
|
||||
emptyView.alternateView = recyclerView
|
||||
|
||||
transport = addTransportFragment {
|
||||
adapter.notifyDataSetChanged()
|
||||
override fun createContentFragment(): BaseFragment =
|
||||
(intent.extras ?: Bundle()).run {
|
||||
AlbumBrowseFragment.create(
|
||||
getString(Album.Extra.CATEGORY_NAME, ""),
|
||||
getLong(Album.Extra.CATEGORY_ID, -1))
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
initObservables()
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
initSearchMenu(menu, this)
|
||||
return true
|
||||
}
|
||||
|
||||
override fun setFilter(filter: String) {
|
||||
if (filter != lastFilter) {
|
||||
lastFilter = filter
|
||||
filterDebouncer.call(filter)
|
||||
}
|
||||
}
|
||||
|
||||
private fun initObservables() =
|
||||
disposables.add(data.provider.observeState().subscribeBy(
|
||||
onNext = { state ->
|
||||
if (state.first == IDataProvider.State.Connected) {
|
||||
requery()
|
||||
}
|
||||
else {
|
||||
emptyView.update(state.first, adapter.itemCount)
|
||||
}
|
||||
},
|
||||
onError = {
|
||||
}))
|
||||
|
||||
private fun requery() =
|
||||
@Suppress("unused")
|
||||
data.provider.getAlbumsForCategory(categoryName, categoryId, lastFilter)
|
||||
.subscribeBy(
|
||||
onNext = { albumList ->
|
||||
adapter.setModel(albumList)
|
||||
emptyView.update(data.provider.state, adapter.itemCount)
|
||||
},
|
||||
onError = {
|
||||
})
|
||||
|
||||
private val filterDebouncer = object : Debouncer<String>(350) {
|
||||
override fun onDebounced(last: String?) {
|
||||
if (!paused) {
|
||||
requery()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private val eventListener = object: AlbumBrowseAdapter.EventListener {
|
||||
override fun onItemClicked(album: IAlbum) =
|
||||
startActivity(TrackListActivity.getStartIntent(
|
||||
this@AlbumBrowseActivity, Messages.Category.ALBUM, album.id, album.value))
|
||||
|
||||
override fun onActionClicked(view: View, album: IAlbum) {
|
||||
mixin(ItemContextMenuMixin::class.java)?.showForCategory(album, view)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val EXTRA_CATEGORY_NAME = "extra_category_name"
|
||||
private const val EXTRA_CATEGORY_ID = "extra_category_id"
|
||||
|
||||
fun getStartIntent(context: Context): Intent =
|
||||
Intent(context, AlbumBrowseActivity::class.java)
|
||||
|
||||
fun getStartIntent(context: Context, categoryName: String, categoryId: Long): Intent {
|
||||
return Intent(context, AlbumBrowseActivity::class.java)
|
||||
.putExtra(EXTRA_CATEGORY_NAME, categoryName)
|
||||
.putExtra(EXTRA_CATEGORY_ID, categoryId)
|
||||
.putExtra(Album.Extra.CATEGORY_NAME, categoryName)
|
||||
.putExtra(Album.Extra.CATEGORY_ID, categoryId)
|
||||
}
|
||||
|
||||
fun getStartIntent(context: Context, categoryName: String, categoryId: Long, categoryValue: String): Intent {
|
||||
val intent = getStartIntent(context, categoryName, categoryId)
|
||||
|
||||
if (Strings.notEmpty(categoryValue)) {
|
||||
intent.putExtra(
|
||||
EXTRA_ACTIVITY_TITLE,
|
||||
context.getString(R.string.albums_by_title, categoryValue))
|
||||
fun getStartIntent(context: Context, categoryName: String, categoryId: Long, categoryValue: String): Intent =
|
||||
getStartIntent(context, categoryName, categoryId).apply {
|
||||
if (Strings.notEmpty(categoryValue)) {
|
||||
putExtra(EXTRA_ACTIVITY_TITLE, context.getString(R.string.albums_by_title, categoryValue))
|
||||
}
|
||||
}
|
||||
|
||||
return intent
|
||||
}
|
||||
|
||||
fun getStartIntent(context: Context, categoryName: String, categoryValue: ICategoryValue): Intent =
|
||||
getStartIntent(context, categoryName, categoryValue.id, categoryValue.value)
|
||||
}
|
||||
|
@ -0,0 +1,8 @@
|
||||
package io.casey.musikcube.remote.ui.albums.constant
|
||||
|
||||
object Album {
|
||||
object Extra {
|
||||
const val CATEGORY_NAME = "extra_category_name"
|
||||
const val CATEGORY_ID = "extra_category_id"
|
||||
}
|
||||
}
|
@ -0,0 +1,134 @@
|
||||
package io.casey.musikcube.remote.ui.albums.fragment
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.Menu
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
|
||||
import io.casey.musikcube.remote.R
|
||||
import io.casey.musikcube.remote.service.websocket.Messages
|
||||
import io.casey.musikcube.remote.service.websocket.model.IAlbum
|
||||
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
|
||||
import io.casey.musikcube.remote.ui.albums.adapter.AlbumBrowseAdapter
|
||||
import io.casey.musikcube.remote.ui.albums.constant.Album
|
||||
import io.casey.musikcube.remote.ui.shared.activity.Filterable
|
||||
import io.casey.musikcube.remote.ui.shared.activity.TitleProvider
|
||||
import io.casey.musikcube.remote.ui.shared.extension.initSearchMenu
|
||||
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
|
||||
import io.casey.musikcube.remote.ui.shared.mixin.ItemContextMenuMixin
|
||||
import io.casey.musikcube.remote.ui.shared.mixin.PlaybackMixin
|
||||
import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
||||
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
||||
import io.casey.musikcube.remote.util.Debouncer
|
||||
import io.reactivex.rxkotlin.subscribeBy
|
||||
|
||||
class AlbumBrowseFragment: BaseFragment(), Filterable, TitleProvider {
|
||||
private var categoryName: String = ""
|
||||
private var categoryId: Long = 0
|
||||
private var lastFilter = ""
|
||||
private lateinit var adapter: AlbumBrowseAdapter
|
||||
private lateinit var playback: PlaybackMixin
|
||||
private lateinit var data: DataProviderMixin
|
||||
private lateinit var emptyView: EmptyListView
|
||||
|
||||
override val title: String
|
||||
get() = app.getString(R.string.albums_title)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
component.inject(this)
|
||||
data = mixin(DataProviderMixin())
|
||||
playback = mixin(PlaybackMixin())
|
||||
mixin(ItemContextMenuMixin(appCompatActivity))
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
(arguments as Bundle).run {
|
||||
categoryName = getString(Album.Extra.CATEGORY_NAME) ?: ""
|
||||
categoryId = getLong(Album.Extra.CATEGORY_ID, categoryId)
|
||||
}
|
||||
|
||||
adapter = AlbumBrowseAdapter(eventListener, playback, prefs)
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
|
||||
inflater.inflate(R.layout.recycler_view_fragment, container, false).apply {
|
||||
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
|
||||
setupDefaultRecyclerView(recyclerView, adapter)
|
||||
|
||||
emptyView = findViewById(R.id.empty_list_view)
|
||||
emptyView.capability = EmptyListView.Capability.OnlineOnly
|
||||
emptyView.emptyMessage = getString(R.string.empty_no_items_format, getString(R.string.browse_type_albums))
|
||||
emptyView.alternateView = recyclerView
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
initObservables()
|
||||
}
|
||||
|
||||
override fun setFilter(filter: String) {
|
||||
if (filter != lastFilter) {
|
||||
lastFilter = filter
|
||||
filterDebouncer.call(filter)
|
||||
}
|
||||
}
|
||||
|
||||
fun createOptionsMenu(menu: Menu): Boolean = initSearchMenu(menu, this)
|
||||
fun notifyTransportChanged() = adapter.notifyDataSetChanged()
|
||||
|
||||
private fun initObservables() =
|
||||
disposables.add(data.provider.observeState().subscribeBy(
|
||||
onNext = { state ->
|
||||
if (state.first == IDataProvider.State.Connected) {
|
||||
requery()
|
||||
}
|
||||
else {
|
||||
emptyView.update(state.first, adapter.itemCount)
|
||||
}
|
||||
},
|
||||
onError = {
|
||||
}))
|
||||
|
||||
private fun requery() =
|
||||
@Suppress("unused")
|
||||
data.provider.getAlbumsForCategory(categoryName, categoryId, lastFilter)
|
||||
.subscribeBy(
|
||||
onNext = { albumList ->
|
||||
adapter.setModel(albumList)
|
||||
emptyView.update(data.provider.state, adapter.itemCount)
|
||||
},
|
||||
onError = {
|
||||
})
|
||||
|
||||
private val filterDebouncer = object : Debouncer<String>(350) {
|
||||
override fun onDebounced(last: String?) {
|
||||
if (!paused) {
|
||||
requery()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private val eventListener = object: AlbumBrowseAdapter.EventListener {
|
||||
override fun onItemClicked(album: IAlbum) =
|
||||
startActivity(TrackListActivity.getStartIntent(
|
||||
appCompatActivity, Messages.Category.ALBUM, album.id, album.value))
|
||||
|
||||
override fun onActionClicked(view: View, album: IAlbum) {
|
||||
mixin(ItemContextMenuMixin::class.java)?.showForCategory(album, view)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "AlbumBrowseFragment"
|
||||
fun create(categoryName: String, categoryId: Long): AlbumBrowseFragment =
|
||||
AlbumBrowseFragment().apply {
|
||||
arguments = Bundle().apply {
|
||||
putString(Album.Extra.CATEGORY_NAME, categoryName)
|
||||
putLong(Album.Extra.CATEGORY_ID, categoryId)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ import android.support.v4.view.ViewPager
|
||||
import io.casey.musikcube.remote.R
|
||||
import io.casey.musikcube.remote.ui.browse.adapter.BrowseFragmentAdapter
|
||||
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
||||
import io.casey.musikcube.remote.ui.shared.extension.enableUpNavigation
|
||||
import io.casey.musikcube.remote.ui.shared.extension.findFragment
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
|
||||
|
||||
@ -36,6 +37,8 @@ class BrowseActivity: BaseActivity() {
|
||||
transport.modelChangedListener = {
|
||||
// content.notifyTransportChanged()
|
||||
}
|
||||
|
||||
enableUpNavigation()
|
||||
}
|
||||
|
||||
// override fun onCreateOptionsMenu(menu: Menu): Boolean = content.createOptionsMenu(menu)
|
||||
|
@ -8,49 +8,31 @@ import io.casey.musikcube.remote.R
|
||||
import io.casey.musikcube.remote.ui.category.constant.Category
|
||||
import io.casey.musikcube.remote.ui.category.constant.NavigationType
|
||||
import io.casey.musikcube.remote.ui.category.fragment.CategoryBrowseFragment
|
||||
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
|
||||
import io.casey.musikcube.remote.ui.shared.activity.Filterable
|
||||
import io.casey.musikcube.remote.ui.shared.extension.findFragment
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
|
||||
import io.casey.musikcube.remote.ui.shared.activity.FragmentActivityWithTransport
|
||||
import io.casey.musikcube.remote.ui.shared.extension.enableUpNavigation
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||
import io.casey.musikcube.remote.service.websocket.WebSocketService.State as SocketState
|
||||
|
||||
class CategoryBrowseActivity : BaseActivity(), Filterable {
|
||||
private lateinit var content: CategoryBrowseFragment
|
||||
private lateinit var transport: TransportFragment
|
||||
class CategoryBrowseActivity: FragmentActivityWithTransport() {
|
||||
private val category
|
||||
get() = content as CategoryBrowseFragment
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
setContentView(R.layout.fragment_with_transport_activity)
|
||||
enableUpNavigation()
|
||||
}
|
||||
|
||||
when (savedInstanceState == null) {
|
||||
true -> createFragments()
|
||||
else -> restoreFragments()
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean = category.createOptionsMenu(menu)
|
||||
override fun setFilter(filter: String) = category.setFilter(filter)
|
||||
override fun onTransportChanged() = category.notifyTransportChanged()
|
||||
override val contentFragmentTag: String = CategoryBrowseFragment.TAG
|
||||
|
||||
override fun createContentFragment(): BaseFragment =
|
||||
(intent.extras ?: Bundle()).run {
|
||||
CategoryBrowseFragment.create(intent)
|
||||
}
|
||||
|
||||
transport.modelChangedListener = {
|
||||
content.notifyTransportChanged()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean = content.createOptionsMenu(menu)
|
||||
override fun setFilter(filter: String) = content.setFilter(filter)
|
||||
|
||||
private fun createFragments() {
|
||||
content = CategoryBrowseFragment.create(intent)
|
||||
transport = TransportFragment.create()
|
||||
supportFragmentManager
|
||||
.beginTransaction()
|
||||
.add(R.id.content_container, content, CategoryBrowseFragment.TAG)
|
||||
.add(R.id.transport_container, transport, TransportFragment.TAG)
|
||||
.commit()
|
||||
}
|
||||
|
||||
private fun restoreFragments() {
|
||||
transport = findFragment(TransportFragment.TAG)
|
||||
content = findFragment(CategoryBrowseFragment.TAG)
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun getStartIntent(context: Context,
|
||||
category: String,
|
||||
|
@ -18,6 +18,7 @@ import io.casey.musikcube.remote.ui.category.adapter.CategoryBrowseAdapter
|
||||
import io.casey.musikcube.remote.ui.category.constant.Category
|
||||
import io.casey.musikcube.remote.ui.category.constant.NavigationType
|
||||
import io.casey.musikcube.remote.ui.shared.activity.Filterable
|
||||
import io.casey.musikcube.remote.ui.shared.activity.TitleProvider
|
||||
import io.casey.musikcube.remote.ui.shared.extension.EXTRA_ACTIVITY_TITLE
|
||||
import io.casey.musikcube.remote.ui.shared.extension.initSearchMenu
|
||||
import io.casey.musikcube.remote.ui.shared.extension.setFabVisible
|
||||
@ -30,9 +31,8 @@ import io.casey.musikcube.remote.ui.shared.view.EmptyListView
|
||||
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
|
||||
import io.casey.musikcube.remote.util.Debouncer
|
||||
import io.reactivex.rxkotlin.subscribeBy
|
||||
import java.lang.IllegalArgumentException
|
||||
|
||||
class CategoryBrowseFragment: BaseFragment(), Filterable {
|
||||
class CategoryBrowseFragment: BaseFragment(), Filterable, TitleProvider {
|
||||
private lateinit var adapter: CategoryBrowseAdapter
|
||||
private var navigationType: NavigationType = NavigationType.Tracks
|
||||
private var lastFilter: String? = null
|
||||
@ -44,7 +44,7 @@ class CategoryBrowseFragment: BaseFragment(), Filterable {
|
||||
private lateinit var data: DataProviderMixin
|
||||
private lateinit var playback: PlaybackMixin
|
||||
|
||||
val title: String
|
||||
override val title: String
|
||||
get() {
|
||||
Category.NAME_TO_TITLE[category]?.let {
|
||||
return getString(it)
|
||||
@ -53,18 +53,20 @@ class CategoryBrowseFragment: BaseFragment(), Filterable {
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
component.inject(this)
|
||||
data = mixin(DataProviderMixin())
|
||||
playback = mixin(PlaybackMixin())
|
||||
mixin(ItemContextMenuMixin(appCompatActivity, contextMenuListener))
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
(arguments as Bundle).run {
|
||||
category = getString(Category.Extra.CATEGORY, "")
|
||||
predicateType = getString(Category.Extra.PREDICATE_TYPE, "")
|
||||
predicateId = getLong(Category.Extra.PREDICATE_ID, -1)
|
||||
navigationType = NavigationType.get(getInt(Category.Extra.NAVIGATION_TYPE, NavigationType.Albums.ordinal))
|
||||
}
|
||||
|
||||
val args = arguments as Bundle
|
||||
category = args.getString(Category.Extra.CATEGORY, "")
|
||||
predicateType = args.getString(Category.Extra.PREDICATE_TYPE, "")
|
||||
predicateId = args.getLong(Category.Extra.PREDICATE_ID, -1)
|
||||
navigationType = NavigationType.get(args.getInt(Category.Extra.NAVIGATION_TYPE, NavigationType.Albums.ordinal))
|
||||
adapter = CategoryBrowseAdapter(adapterListener, playback, navigationType, category, prefs)
|
||||
}
|
||||
|
||||
@ -112,7 +114,7 @@ class CategoryBrowseFragment: BaseFragment(), Filterable {
|
||||
fun notifyTransportChanged() =
|
||||
adapter.notifyDataSetChanged()
|
||||
|
||||
private fun initObservers() {
|
||||
private fun initObservers() =
|
||||
disposables.add(data.provider.observeState().subscribeBy(
|
||||
onNext = { states ->
|
||||
when (states.first) {
|
||||
@ -128,7 +130,6 @@ class CategoryBrowseFragment: BaseFragment(), Filterable {
|
||||
},
|
||||
onError = {
|
||||
}))
|
||||
}
|
||||
|
||||
private val categoryTypeString: String
|
||||
get() {
|
||||
|
@ -0,0 +1,73 @@
|
||||
package io.casey.musikcube.remote.ui.shared.activity
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.Menu
|
||||
import io.casey.musikcube.remote.R
|
||||
import io.casey.musikcube.remote.ui.shared.extension.enableUpNavigation
|
||||
import io.casey.musikcube.remote.ui.shared.extension.findFragment
|
||||
import io.casey.musikcube.remote.ui.shared.extension.setTitleFromIntent
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
|
||||
|
||||
abstract class FragmentActivityWithTransport: BaseActivity(), Filterable {
|
||||
protected lateinit var transport: TransportFragment
|
||||
protected lateinit var content: BaseFragment
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.fragment_with_transport_activity)
|
||||
enableUpNavigation()
|
||||
}
|
||||
|
||||
override fun onPostCreate(savedInstanceState: Bundle?) {
|
||||
super.onPostCreate(savedInstanceState)
|
||||
|
||||
when (savedInstanceState == null) {
|
||||
true -> createFragments()
|
||||
else -> restoreFragments()
|
||||
}
|
||||
|
||||
transport.modelChangedListener = {
|
||||
onTransportChanged()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
(content as? TitleProvider)?.run {
|
||||
setTitleFromIntent(this.title)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean =
|
||||
(content as? MenuProvider)?.run {
|
||||
return this.createOptionsMenu(menu)
|
||||
} ?: false
|
||||
|
||||
override fun setFilter(filter: String) =
|
||||
(content as? Filterable)?.run {
|
||||
setFilter(filter)
|
||||
} ?: Unit
|
||||
|
||||
protected abstract fun createContentFragment(): BaseFragment
|
||||
protected abstract val contentFragmentTag: String
|
||||
|
||||
protected open fun onTransportChanged() {
|
||||
|
||||
}
|
||||
|
||||
private fun createFragments() {
|
||||
content = createContentFragment()
|
||||
transport = TransportFragment.create()
|
||||
supportFragmentManager
|
||||
.beginTransaction()
|
||||
.add(R.id.content_container, content, contentFragmentTag)
|
||||
.add(R.id.transport_container, transport, TransportFragment.TAG)
|
||||
.commit()
|
||||
}
|
||||
|
||||
private fun restoreFragments() {
|
||||
transport = findFragment(TransportFragment.TAG)
|
||||
content = findFragment(contentFragmentTag)
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package io.casey.musikcube.remote.ui.shared.activity
|
||||
|
||||
import android.view.Menu
|
||||
|
||||
interface MenuProvider {
|
||||
fun createOptionsMenu(menu: Menu): Boolean
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package io.casey.musikcube.remote.ui.shared.activity
|
||||
|
||||
interface TitleProvider {
|
||||
val title: String
|
||||
}
|
@ -112,7 +112,7 @@ fun BaseFragment.setFabVisible(visible: Boolean, fab: View, recyclerView: Recycl
|
||||
this.appCompatActivity.setFabVisible(visible, fab, recyclerView)
|
||||
}
|
||||
|
||||
fun AppCompatActivity.initSearchMenu(menu: Menu, filterable: Filterable?) {
|
||||
fun AppCompatActivity.initSearchMenu(menu: Menu, filterable: Filterable?): Boolean {
|
||||
this.menuInflater.inflate(R.menu.search_menu, menu)
|
||||
|
||||
val searchMenuItem = menu.findItem(R.id.action_search)
|
||||
@ -141,11 +141,12 @@ fun AppCompatActivity.initSearchMenu(menu: Menu, filterable: Filterable?) {
|
||||
|
||||
searchView.setSearchableInfo(searchableInfo)
|
||||
searchView.setIconifiedByDefault(true)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
fun Fragment.initSearchMenu(menu: Menu, filterable: Filterable?) {
|
||||
fun Fragment.initSearchMenu(menu: Menu, filterable: Filterable?): Boolean =
|
||||
(activity as AppCompatActivity).initSearchMenu(menu, filterable)
|
||||
}
|
||||
|
||||
fun CheckBox.setCheckWithoutEvent(checked: Boolean,
|
||||
listener: (CompoundButton, Boolean) -> Unit) {
|
||||
|
@ -5,6 +5,7 @@ import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.graphics.ComposePathEffect
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.support.v4.app.Fragment
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import io.casey.musikcube.remote.Application
|
||||
@ -19,6 +20,7 @@ import io.reactivex.disposables.CompositeDisposable
|
||||
|
||||
open class BaseFragment: Fragment(), ViewModel.Provider {
|
||||
private val mixins = MixinSet()
|
||||
private val handler = Handler()
|
||||
protected lateinit var prefs: SharedPreferences
|
||||
protected val component: ViewComponent =
|
||||
DaggerViewComponent.builder()
|
||||
@ -35,6 +37,11 @@ open class BaseFragment: Fragment(), ViewModel.Provider {
|
||||
super.onCreate(savedInstanceState)
|
||||
mixins.onCreate(savedInstanceState ?: Bundle())
|
||||
prefs = Application.instance.getSharedPreferences(Prefs.NAME, Context.MODE_PRIVATE)
|
||||
handler.post { onPostCreate(savedInstanceState) }
|
||||
}
|
||||
|
||||
open fun onPostCreate(savedInstanceState: Bundle?) {
|
||||
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
|
@ -0,0 +1,11 @@
|
||||
package io.casey.musikcube.remote.ui.tracks.fragment
|
||||
|
||||
import android.os.Bundle
|
||||
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
|
||||
|
||||
class TrackListFragment: BaseFragment() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
component.inject(this)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user