More de-jank and cleanups.

This commit is contained in:
casey langen 2019-02-18 01:16:12 -08:00
parent 16b55d140a
commit 4de7f0210b
22 changed files with 237 additions and 171 deletions

View File

@ -6,6 +6,7 @@ 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
import io.casey.musikcube.remote.ui.category.fragment.AllCategoriesFragment
import io.casey.musikcube.remote.ui.category.fragment.CategoryBrowseFragment
import io.casey.musikcube.remote.ui.home.activity.MainActivity
import io.casey.musikcube.remote.ui.home.view.MainMetadataView
@ -40,6 +41,7 @@ interface ViewComponent {
fun inject(activity: TrackListActivity)
fun inject(fragment: AlbumBrowseFragment)
fun inject(fragment: AllCategoriesFragment)
fun inject(fragment: BaseFragment)
fun inject(fragment: CategoryBrowseFragment)
fun inject(fragment: PlayQueueFragment)

View File

@ -18,7 +18,6 @@ class AlbumBrowseActivity: FragmentActivityWithTransport() {
get() = content as AlbumBrowseFragment
override fun onCreateOptionsMenu(menu: Menu): Boolean = albums.createOptionsMenu(menu)
override fun setFilter(filter: String) = albums.setFilter(filter)
override fun onTransportChanged() = albums.onTransportChanged()
override val contentFragmentTag: String = AlbumBrowseFragment.TAG

View File

@ -2,7 +2,6 @@ package io.casey.musikcube.remote.ui.albums.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.view.ViewCompat
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
@ -18,7 +17,10 @@ import io.casey.musikcube.remote.ui.shared.activity.IFilterable
import io.casey.musikcube.remote.ui.shared.activity.ITitleProvider
import io.casey.musikcube.remote.ui.shared.activity.ITransportObserver
import io.casey.musikcube.remote.ui.shared.constant.Shared
import io.casey.musikcube.remote.ui.shared.extension.*
import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
import io.casey.musikcube.remote.ui.shared.extension.getTitleOverride
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
@ -57,8 +59,6 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(this.getLayoutId(), container, false).apply {
ViewCompat.setElevation(this, extras.elevation)
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
setupDefaultRecyclerView(recyclerView, adapter)
@ -66,8 +66,6 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
emptyView.capability = EmptyListView.Capability.OnlineOnly
emptyView.emptyMessage = getString(R.string.empty_no_items_format, getString(R.string.browse_type_albums))
emptyView.alternateView = recyclerView
initToolbarIfNecessary(appCompatActivity, this)
}
override fun setFilter(filter: String) {
@ -83,7 +81,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
override fun onTransportChanged() =
adapter.notifyDataSetChanged()
override fun initObservables() {
override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { state ->
if (state.first == IDataProvider.State.Connected) {

View File

@ -3,13 +3,10 @@ package io.casey.musikcube.remote.ui.browse.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.ui.browse.constant.Browse
import io.casey.musikcube.remote.ui.browse.fragment.BrowseFragment
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
import io.casey.musikcube.remote.ui.shared.activity.IBackHandler
import io.casey.musikcube.remote.ui.shared.activity.ITransportObserver
import io.casey.musikcube.remote.ui.shared.extension.enableUpNavigation
import io.casey.musikcube.remote.ui.shared.extension.findFragment
@ -37,19 +34,6 @@ class BrowseActivity: BaseActivity() {
enableUpNavigation()
}
override fun onBackPressed() {
(top as? IBackHandler)?.let {
if (it.onBackPressed()) {
return
}
}
when {
fm.backStackEntryCount > 1 -> fm.popBackStack()
else -> super.onBackPressed()
}
}
private fun createFragments() {
supportFragmentManager
.beginTransaction()
@ -68,25 +52,11 @@ class BrowseActivity: BaseActivity() {
supportFragmentManager.executePendingTransactions()
}
private val top: Fragment?
get() {
return when {
fm.backStackEntryCount == 0 ->
fm.findFragmentByTag(BrowseFragment.TAG)
else -> fm.findFragmentByTag(
fm.getBackStackEntryAt(fm.backStackEntryCount - 1).name)
companion object {
fun getStartIntent(context: Context,
initialCategoryType: String = ""): Intent =
Intent(context, BrowseActivity::class.java).apply {
putExtra(Browse.Extras.INITIAL_CATEGORY_TYPE, initialCategoryType)
}
}
private val fm: FragmentManager
get() = supportFragmentManager
companion object {
fun getStartIntent(context: Context,
initialCategoryType: String = ""): Intent =
Intent(context, BrowseActivity::class.java).apply {
putExtra(Browse.Extras.INITIAL_CATEGORY_TYPE, initialCategoryType)
}
}
}
}

View File

@ -72,8 +72,6 @@ class BrowseFragment: BaseFragment(), ITransportObserver, IFilterable, ITitlePro
}
})
initToolbarIfNecessary(appCompatActivity, this)
showFabIfNecessary(pager.currentItem)
}

View File

@ -2,69 +2,17 @@ package io.casey.musikcube.remote.ui.category.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
import io.casey.musikcube.remote.ui.category.adapter.AllCategoriesAdapter
import io.casey.musikcube.remote.ui.shared.activity.BaseActivity
import io.casey.musikcube.remote.ui.shared.extension.addTransportFragment
import io.casey.musikcube.remote.ui.shared.extension.enableUpNavigation
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin
import io.reactivex.rxkotlin.subscribeBy
import io.casey.musikcube.remote.ui.category.fragment.AllCategoriesFragment
import io.casey.musikcube.remote.ui.shared.activity.FragmentActivityWithTransport
import io.casey.musikcube.remote.ui.shared.extension.withToolbar
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
class AllCategoriesActivity: BaseActivity() {
private lateinit var data: DataProviderMixin
private lateinit var adapter: AllCategoriesAdapter
class AllCategoriesActivity: FragmentActivityWithTransport() {
override fun createContentFragment(): BaseFragment =
AllCategoriesFragment().withToolbar()
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
super.onCreate(savedInstanceState)
setTitle(R.string.category_activity)
setContentView(R.layout.recycler_view_activity)
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
adapter = AllCategoriesAdapter(adapterListener)
setupDefaultRecyclerView(recyclerView, adapter)
enableUpNavigation()
addTransportFragment()
}
override fun onResume() {
super.onResume()
initObservers()
}
private fun requery() {
disposables.add(data.provider.listCategories().subscribeBy(
onNext = {
adapter.setModel(it)
},
onError = {
}))
}
private fun initObservers() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
if (states.first == IDataProvider.State.Connected) {
requery()
}
},
onError = {
}))
}
private val adapterListener = object:AllCategoriesAdapter.EventListener {
override fun onItemClicked(category: String) {
startActivity(CategoryBrowseActivity.getStartIntent(this@AllCategoriesActivity, category))
}
}
override val contentFragmentTag: String =
AllCategoriesFragment.TAG
companion object {
fun getStartIntent(context: Context): Intent {

View File

@ -16,7 +16,6 @@ class CategoryBrowseActivity: FragmentActivityWithTransport() {
get() = content as CategoryBrowseFragment
override fun onCreateOptionsMenu(menu: Menu): Boolean = category.createOptionsMenu(menu)
override fun setFilter(filter: String) = category.setFilter(filter)
override fun onTransportChanged() = category.onTransportChanged()
override val contentFragmentTag: String = CategoryBrowseFragment.TAG

View File

@ -0,0 +1,75 @@
package io.casey.musikcube.remote.ui.category.fragment
import android.os.Bundle
import android.view.LayoutInflater
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.model.IDataProvider
import io.casey.musikcube.remote.ui.category.adapter.AllCategoriesAdapter
import io.casey.musikcube.remote.ui.navigation.Navigate
import io.casey.musikcube.remote.ui.shared.activity.ITitleProvider
import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
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.reactivex.rxkotlin.subscribeBy
class AllCategoriesFragment: BaseFragment(), ITitleProvider {
private lateinit var data: DataProviderMixin
private lateinit var adapter: AllCategoriesAdapter
override val title: String
get() = getString(R.string.category_activity)
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
data = mixin(DataProviderMixin())
super.onCreate(savedInstanceState)
adapter = AllCategoriesAdapter(adapterListener)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(this.getLayoutId(), container, false).apply {
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
setupDefaultRecyclerView(recyclerView, adapter)
}
override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
if (states.first == IDataProvider.State.Connected) {
requery()
}
},
onError = {
}))
}
private fun requery() {
disposables.add(data.provider.listCategories().subscribeBy(
onNext = {
adapter.setModel(it)
},
onError = {
}))
}
private val adapterListener = object:AllCategoriesAdapter.EventListener {
override fun onItemClicked(category: String) =
Navigate.toCategoryList(
category,
appCompatActivity,
this@AllCategoriesFragment)
}
companion object {
const val TAG = "AllCategoriesFragment"
fun create(): AllCategoriesFragment = AllCategoriesFragment()
}
}

View File

@ -5,7 +5,6 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.v4.view.ViewCompat
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
@ -24,7 +23,10 @@ import io.casey.musikcube.remote.ui.shared.activity.IFilterable
import io.casey.musikcube.remote.ui.shared.activity.ITitleProvider
import io.casey.musikcube.remote.ui.shared.activity.ITransportObserver
import io.casey.musikcube.remote.ui.shared.constant.Shared
import io.casey.musikcube.remote.ui.shared.extension.*
import io.casey.musikcube.remote.ui.shared.extension.getLayoutId
import io.casey.musikcube.remote.ui.shared.extension.getTitleOverride
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
@ -75,10 +77,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(this.getLayoutId(), container, false).apply {
ViewCompat.setElevation(this, extras.elevation)
this@CategoryBrowseFragment.rootView = this
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
emptyView = findViewById(R.id.empty_list_view)
@ -87,7 +86,6 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
emptyView.alternateView = recyclerView
setupDefaultRecyclerView(recyclerView, adapter)
initToolbarIfNecessary(appCompatActivity, this)
}
override fun onFabPress(fab: FloatingActionButton) {
@ -113,7 +111,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
override fun onTransportChanged() =
adapter.notifyDataSetChanged()
override fun initObservables() {
override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
when (states.first) {

View File

@ -20,13 +20,11 @@ import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
import io.casey.musikcube.remote.service.websocket.WebSocketService
import io.casey.musikcube.remote.service.websocket.model.IDataProvider
import io.casey.musikcube.remote.ui.albums.activity.AlbumBrowseActivity
import io.casey.musikcube.remote.ui.category.activity.AllCategoriesActivity
import io.casey.musikcube.remote.ui.category.activity.CategoryBrowseActivity
import io.casey.musikcube.remote.ui.category.constant.NavigationType
import io.casey.musikcube.remote.ui.home.fragment.InvalidPasswordDialogFragment
import io.casey.musikcube.remote.ui.home.view.MainMetadataView
import io.casey.musikcube.remote.ui.navigation.Navigate
import io.casey.musikcube.remote.ui.playqueue.activity.PlayQueueActivity
import io.casey.musikcube.remote.ui.settings.activity.RemoteSettingsActivity
import io.casey.musikcube.remote.ui.settings.activity.SettingsActivity
import io.casey.musikcube.remote.ui.settings.constants.Prefs
@ -177,7 +175,7 @@ class MainActivity : BaseActivity() {
}
R.id.action_categories -> {
startActivity(AllCategoriesActivity.getStartIntent(this))
Navigate.toAllCategories(this)
return true
}
@ -300,11 +298,9 @@ class MainActivity : BaseActivity() {
}
findViewById<View>(R.id.button_play_pause).setOnClickListener {
if (playback.service.state === PlaybackState.Stopped) {
playback.service.playAll()
}
else {
playback.service.pauseOrResume()
when (playback.service.state === PlaybackState.Stopped) {
true -> playback.service.playAll()
else -> playback.service.pauseOrResume()
}
}
@ -370,8 +366,15 @@ class MainActivity : BaseActivity() {
}
findViewById<View>(R.id.metadata_container).setOnClickListener {
if (playback.service.queueCount > 0) {
navigateToPlayQueue()
when (playback.service.queueCount > 0) {
true -> navigateToPlayQueue()
else -> Navigate.toBrowse(this)
}
}
findViewById<View>(R.id.middle_container).setOnClickListener {
if (data.wss.state == WebSocketService.State.Connected) {
Navigate.toBrowse(this)
}
}
@ -484,8 +487,7 @@ class MainActivity : BaseActivity() {
}
private fun navigateToPlayQueue() {
startActivity(PlayQueueActivity.getStartIntent(
this@MainActivity, playback.service.queuePosition))
Navigate.toPlayQueue(playback.service.queuePosition, this)
}
private fun scheduleUpdateTime(immediate: Boolean) {

View File

@ -5,7 +5,6 @@ import android.os.Bundle
import android.support.v4.app.ActivityOptionsCompat
import android.support.v4.util.Pair
import android.support.v7.app.AppCompatActivity
import android.view.View
import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
import io.casey.musikcube.remote.service.websocket.model.IAlbum
@ -13,7 +12,7 @@ import io.casey.musikcube.remote.service.websocket.model.ICategoryValue
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.browse.constant.Browse
import io.casey.musikcube.remote.ui.category.activity.AllCategoriesActivity
import io.casey.musikcube.remote.ui.category.activity.CategoryBrowseActivity
import io.casey.musikcube.remote.ui.category.constant.NavigationType
import io.casey.musikcube.remote.ui.category.fragment.CategoryBrowseFragment
@ -37,14 +36,16 @@ object Navigate {
initialCategoryType: String = "") =
activity.startActivity(
BrowseActivity.getStartIntent(activity, initialCategoryType),
when (activity is MainActivity) {
true -> ActivityOptionsCompat.makeSceneTransitionAnimation(
activity,
Pair(activity.findViewById(R.id.PlayControls), "play_controls_transition"),
// Pair(activity.findViewById(R.id.button_play_queue), "play_queue_transition"),
Pair(activity.findViewById(R.id.toolbar), "toolbar_transition")).toBundle()
false -> Bundle()
})
createMainTransition(activity))
/*
*
* list of categories
*
*/
fun toAllCategories(activity: AppCompatActivity) =
activity.startActivity(AllCategoriesActivity.getStartIntent(activity))
/*
*
@ -137,6 +138,19 @@ object Navigate {
.getStartIntent(activity, targetType, sourceType, sourceId, sourceValue))
}
fun toCategoryList(targetType: String,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
when (fragment != null && fragment.pushContainerId > 0) {
true ->
fragment.pushWithToolbar(
fragment.pushContainerId,
"$targetType)",
CategoryBrowseFragment.create(activity, targetType))
false ->
activity.startActivity(CategoryBrowseActivity.getStartIntent(activity, targetType))
}
/*
*
* playlist-related
@ -216,4 +230,23 @@ object Navigate {
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP))
}
}
/*
*
* transition stuff
*
*/
private fun createMainTransition(activity: AppCompatActivity) =
when (activity is MainActivity) {
true ->
ActivityOptionsCompat.makeSceneTransitionAnimation(
activity,
Pair(activity.findViewById(R.id.PlayControls), "play_controls_transition"),
// Pair(activity.findViewById(R.id.middle_container), "middle_content_transition"),
// Pair(activity.findViewById(R.id.button_play_queue), "play_queue_transition"),
Pair(activity.findViewById(R.id.toolbar), "toolbar_transition")).toBundle()
false ->
Bundle()
}
}

View File

@ -46,8 +46,6 @@ class PlayQueueFragment: BaseFragment(), ITitleProvider {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(this.getLayoutId(), container, false).apply {
ViewCompat.setElevation(this, extras.elevation)
val queryFactory = playback.service.playlistQueryFactory
offlineQueue = playback.service.playlistQueryFactory.offline()
@ -58,7 +56,6 @@ class PlayQueueFragment: BaseFragment(), ITitleProvider {
adapter = PlayQueueAdapter(tracks, playback, prefs, adapterListener)
setupDefaultRecyclerView(recyclerView, adapter)
initToolbarIfNecessary(appCompatActivity, this, searchMenu = false)
emptyView = findViewById(R.id.empty_list_view)
emptyView.capability = EmptyListView.Capability.OfflineOk
@ -79,7 +76,7 @@ class PlayQueueFragment: BaseFragment(), ITitleProvider {
}
}
override fun initObservables() {
override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
if (states.first == IDataProvider.State.Connected) {

View File

@ -5,6 +5,8 @@ import android.content.Intent
import android.content.SharedPreferences
import android.media.AudioManager
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v7.app.AppCompatActivity
import android.view.KeyEvent
import android.view.MenuItem
@ -18,6 +20,7 @@ import io.casey.musikcube.remote.framework.MixinSet
import io.casey.musikcube.remote.framework.ViewModel
import io.casey.musikcube.remote.injection.DaggerViewComponent
import io.casey.musikcube.remote.injection.ViewComponent
import io.casey.musikcube.remote.ui.browse.fragment.BrowseFragment
import io.casey.musikcube.remote.ui.navigation.Transition
import io.casey.musikcube.remote.ui.settings.constants.Prefs
import io.casey.musikcube.remote.ui.shared.extension.*
@ -94,6 +97,20 @@ abstract class BaseActivity : AppCompatActivity(), ViewModel.Provider, Runner.Ta
mixins.onDestroy()
}
override fun onBackPressed() {
(top as? IBackHandler)?.let {
if (it.onBackPressed()) {
return
}
}
when {
fm.backStackEntryCount > 1 -> fm.popBackStack()
else -> super.onBackPressed()
}
}
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (mixin(PlaybackMixin::class.java)?.onKeyDown(keyCode) == true) {
return true
@ -144,6 +161,20 @@ abstract class BaseActivity : AppCompatActivity(), ViewModel.Provider, Runner.Ta
toolbar?.let { setSupportActionBar(it) }
}
protected val top: Fragment?
get() {
return when {
fm.backStackEntryCount == 0 ->
fm.findFragmentByTag(BrowseFragment.TAG)
else -> fm.findFragmentByTag(
fm.getBackStackEntryAt(fm.backStackEntryCount - 1).name)
}
}
protected val fm: FragmentManager
get() = supportFragmentManager
protected open val transitionType = Transition.Horizontal
protected val extras: Bundle

View File

@ -11,7 +11,7 @@ import io.casey.musikcube.remote.ui.shared.extension.*
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
abstract class FragmentActivityWithTransport: BaseActivity() {
private var transport: TransportFragment? = null
protected lateinit var content: BaseFragment
@ -76,11 +76,6 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
return super.onOptionsItemSelected(item)
}
override fun setFilter(filter: String) =
(content as? IFilterable)?.run {
setFilter(filter)
} ?: Unit
override val transitionType: Transition
get() = extras.transitionType
@ -93,13 +88,18 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
private fun createFragments() {
content = createContentFragment()
.withToolbar().withTitleOverride(this)
.withToolbar()
.withTitleOverride(this)
.pushTo(R.id.content_container)
supportFragmentManager.beginTransaction().apply {
add(R.id.content_container, content, contentFragmentTag)
if (!withoutTransport) {
transport = TransportFragment.create().apply {
add(R.id.transport_container, this, TransportFragment.TAG)
}
transport = TransportFragment
.create()
.pushTo(R.id.content_container)
.apply {
add(R.id.transport_container, this, TransportFragment.TAG)
}
}
commit()
}

View File

@ -286,7 +286,7 @@ fun BaseFragment.pushWithToolbar(
}
inline fun <reified T: BaseFragment> T.withToolbar(): T {
this.arguments?.putBoolean(Shared.Extra.WITH_TOOLBAR, true)
this.extras.putBoolean(Shared.Extra.WITH_TOOLBAR, true)
return this
}
@ -323,7 +323,7 @@ fun BaseFragment.initToolbarIfNecessary(activity: AppCompatActivity, view: View,
fun BaseFragment.getLayoutId(): Int =
when (this.extras.getBoolean(Shared.Extra.WITH_TOOLBAR)) {
true -> R.layout.recycler_view_with_empty_state_and_toolbar_and_fab
else -> R.layout.recycler_view_with_empty_state
false -> R.layout.recycler_view_with_empty_state
}
inline fun <reified T: BaseFragment> T.addElevation(fm: FragmentManager): T {

View File

@ -6,6 +6,7 @@ import android.content.SharedPreferences
import android.os.Bundle
import android.os.Handler
import android.support.v4.app.Fragment
import android.support.v4.view.ViewCompat
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.View
@ -23,6 +24,8 @@ import io.casey.musikcube.remote.ui.settings.constants.Prefs
import io.casey.musikcube.remote.ui.shared.activity.IBackHandler
import io.casey.musikcube.remote.ui.shared.activity.ITitleProvider
import io.casey.musikcube.remote.ui.shared.extension.collapseActionViewIfExpanded
import io.casey.musikcube.remote.ui.shared.extension.elevation
import io.casey.musikcube.remote.ui.shared.extension.initToolbarIfNecessary
import io.casey.musikcube.remote.ui.shared.extension.setTitleFromIntent
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
import io.reactivex.disposables.CompositeDisposable
@ -43,20 +46,20 @@ open class BaseFragment: Fragment(), ViewModel.Provider, IBackHandler {
private set(value) {
field = value
when (field) {
true -> destroyObservables()
false -> initObservables()
true -> onDestroyObservables()
false -> onInitObservables()
}
}
protected var disposables = CompositeDisposable()
private set
private fun destroyObservables() {
private fun onDestroyObservables() {
disposables.dispose()
disposables = CompositeDisposable()
}
protected open fun initObservables() {
protected open fun onInitObservables() {
/* for subclass use */
}
@ -67,6 +70,12 @@ open class BaseFragment: Fragment(), ViewModel.Provider, IBackHandler {
handler.post { onPostCreate(savedInstanceState) }
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
ViewCompat.setElevation(view, extras.elevation)
initToolbarIfNecessary(appCompatActivity, view)
}
open fun onPostCreate(savedInstanceState: Bundle?) {
}
@ -84,7 +93,7 @@ open class BaseFragment: Fragment(), ViewModel.Provider, IBackHandler {
toolbar?.setTitleFromIntent(title)
}
if (!animating) {
initObservables()
onInitObservables()
}
}

View File

@ -50,7 +50,10 @@ class EmptyListView : FrameLayout {
var alternateView: View? = null
set(value) {
field = value
alternateView?.visibility = if (visibility == View.GONE) View.VISIBLE else View.GONE
alternateView?.visibility = when (visibility == View.VISIBLE) {
true -> View.GONE
false -> View.VISIBLE
}
}
var emptyMessage: String
@ -77,7 +80,10 @@ class EmptyListView : FrameLayout {
emptyContainer?.setVisible(!showOfflineContainer)
}
alternateView?.visibility = if (visibility == View.GONE) View.VISIBLE else View.GONE
alternateView?.visibility = when (visibility == View.VISIBLE) {
true -> View.GONE
false -> View.VISIBLE
}
}
fun update(state: IDataProvider.State, count: Int) {
@ -96,7 +102,10 @@ class EmptyListView : FrameLayout {
emptyContainer?.setVisible(!showOfflineContainer)
}
alternateView?.visibility = if (visibility == View.INVISIBLE) View.VISIBLE else View.INVISIBLE
alternateView?.visibility = when (visibility == View.INVISIBLE) {
true -> View.VISIBLE
false -> View.INVISIBLE
}
}
private fun initialize() {

View File

@ -25,9 +25,7 @@ class TrackListActivity: FragmentActivityWithTransport() {
}
override fun createContentFragment(): BaseFragment = TrackListFragment.create(intent)
override val contentFragmentTag: String = TrackListFragment.TAG
override fun onTransportChanged() = tracks.onTransportChanged()
companion object {

View File

@ -3,7 +3,6 @@ package io.casey.musikcube.remote.ui.tracks.fragment
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.v4.view.ViewCompat
import android.support.v7.app.AppCompatActivity
import android.view.*
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
@ -81,7 +80,7 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
requeryIfViewingOfflineCache()
}
override fun initObservables() {
override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy(
onNext = { states ->
val shouldRequery =
@ -102,15 +101,12 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(this.getLayoutId(), container, false).apply {
ViewCompat.setElevation(this, extras.elevation)
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
tracks = DefaultSlidingWindow(recyclerView, data.provider, queryFactory)
adapter = TrackListAdapter(tracks, eventListener, playback, prefs)
setupDefaultRecyclerView(recyclerView, adapter)
initToolbarIfNecessary(appCompatActivity, this, searchMenu = false)
emptyView = findViewById(R.id.empty_list_view)

View File

@ -11,7 +11,7 @@
style="@style/RecyclerView"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"/>
<io.casey.musikcube.remote.ui.shared.view.EmptyListView
style="@style/EmptyView"

View File

@ -7,19 +7,22 @@
android:layout_width="match_parent"
android:background="@color/theme_background" >
<include layout="@layout/toolbar" />
<include
layout="@layout/toolbar"
android:transitionName="toolbar_transition" />
<FrameLayout
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transitionName="middle_content_transition"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
style="@style/RecyclerView"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"/>
<io.casey.musikcube.remote.ui.shared.view.EmptyListView
style="@style/EmptyView"

View File

@ -6,6 +6,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:transitionName="toolbar_transition"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<android.support.v7.widget.Toolbar