Added AlbumBrowseFragment. Next up: TrackListFragment.

This commit is contained in:
casey langen 2019-02-10 00:36:31 -08:00
parent 6aae748205
commit 8f63cdf7a2
13 changed files with 310 additions and 164 deletions

View File

@ -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)

View File

@ -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)
}

View File

@ -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"
}
}

View File

@ -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)
}
}
}
}

View File

@ -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)

View File

@ -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,

View File

@ -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() {

View File

@ -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)
}
}

View File

@ -0,0 +1,7 @@
package io.casey.musikcube.remote.ui.shared.activity
import android.view.Menu
interface MenuProvider {
fun createOptionsMenu(menu: Menu): Boolean
}

View File

@ -0,0 +1,5 @@
package io.casey.musikcube.remote.ui.shared.activity
interface TitleProvider {
val title: String
}

View File

@ -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) {

View File

@ -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() {

View File

@ -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)
}
}