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

View File

@ -18,7 +18,6 @@ class AlbumBrowseActivity: FragmentActivityWithTransport() {
get() = content as AlbumBrowseFragment get() = content as AlbumBrowseFragment
override fun onCreateOptionsMenu(menu: Menu): Boolean = albums.createOptionsMenu(menu) override fun onCreateOptionsMenu(menu: Menu): Boolean = albums.createOptionsMenu(menu)
override fun setFilter(filter: String) = albums.setFilter(filter)
override fun onTransportChanged() = albums.onTransportChanged() override fun onTransportChanged() = albums.onTransportChanged()
override val contentFragmentTag: String = AlbumBrowseFragment.TAG 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.content.Context
import android.os.Bundle import android.os.Bundle
import android.support.v4.view.ViewCompat
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.View 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.ITitleProvider
import io.casey.musikcube.remote.ui.shared.activity.ITransportObserver 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.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.fragment.BaseFragment
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin 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.ItemContextMenuMixin
@ -57,8 +59,6 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(this.getLayoutId(), container, false).apply { inflater.inflate(this.getLayoutId(), container, false).apply {
ViewCompat.setElevation(this, extras.elevation)
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view) val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
setupDefaultRecyclerView(recyclerView, adapter) setupDefaultRecyclerView(recyclerView, adapter)
@ -66,8 +66,6 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
emptyView.capability = EmptyListView.Capability.OnlineOnly emptyView.capability = EmptyListView.Capability.OnlineOnly
emptyView.emptyMessage = getString(R.string.empty_no_items_format, getString(R.string.browse_type_albums)) emptyView.emptyMessage = getString(R.string.empty_no_items_format, getString(R.string.browse_type_albums))
emptyView.alternateView = recyclerView emptyView.alternateView = recyclerView
initToolbarIfNecessary(appCompatActivity, this)
} }
override fun setFilter(filter: String) { override fun setFilter(filter: String) {
@ -83,7 +81,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
override fun onTransportChanged() = override fun onTransportChanged() =
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
override fun initObservables() { override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy( disposables.add(data.provider.observeState().subscribeBy(
onNext = { state -> onNext = { state ->
if (state.first == IDataProvider.State.Connected) { 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.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle 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.R
import io.casey.musikcube.remote.ui.browse.constant.Browse import io.casey.musikcube.remote.ui.browse.constant.Browse
import io.casey.musikcube.remote.ui.browse.fragment.BrowseFragment 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.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.activity.ITransportObserver
import io.casey.musikcube.remote.ui.shared.extension.enableUpNavigation 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.findFragment
@ -37,19 +34,6 @@ class BrowseActivity: BaseActivity() {
enableUpNavigation() enableUpNavigation()
} }
override fun onBackPressed() {
(top as? IBackHandler)?.let {
if (it.onBackPressed()) {
return
}
}
when {
fm.backStackEntryCount > 1 -> fm.popBackStack()
else -> super.onBackPressed()
}
}
private fun createFragments() { private fun createFragments() {
supportFragmentManager supportFragmentManager
.beginTransaction() .beginTransaction()
@ -68,25 +52,11 @@ class BrowseActivity: BaseActivity() {
supportFragmentManager.executePendingTransactions() supportFragmentManager.executePendingTransactions()
} }
private val top: Fragment? companion object {
get() { fun getStartIntent(context: Context,
return when { initialCategoryType: String = ""): Intent =
fm.backStackEntryCount == 0 -> Intent(context, BrowseActivity::class.java).apply {
fm.findFragmentByTag(BrowseFragment.TAG) putExtra(Browse.Extras.INITIAL_CATEGORY_TYPE, initialCategoryType)
else -> fm.findFragmentByTag(
fm.getBackStackEntryAt(fm.backStackEntryCount - 1).name)
} }
} }
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) showFabIfNecessary(pager.currentItem)
} }

View File

@ -2,69 +2,17 @@ package io.casey.musikcube.remote.ui.category.activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import io.casey.musikcube.remote.ui.category.fragment.AllCategoriesFragment
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView import io.casey.musikcube.remote.ui.shared.activity.FragmentActivityWithTransport
import io.casey.musikcube.remote.R import io.casey.musikcube.remote.ui.shared.extension.withToolbar
import io.casey.musikcube.remote.service.websocket.model.IDataProvider import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
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
class AllCategoriesActivity: BaseActivity() { class AllCategoriesActivity: FragmentActivityWithTransport() {
private lateinit var data: DataProviderMixin override fun createContentFragment(): BaseFragment =
private lateinit var adapter: AllCategoriesAdapter AllCategoriesFragment().withToolbar()
override fun onCreate(savedInstanceState: Bundle?) { override val contentFragmentTag: String =
component.inject(this) AllCategoriesFragment.TAG
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))
}
}
companion object { companion object {
fun getStartIntent(context: Context): Intent { fun getStartIntent(context: Context): Intent {

View File

@ -16,7 +16,6 @@ class CategoryBrowseActivity: FragmentActivityWithTransport() {
get() = content as CategoryBrowseFragment get() = content as CategoryBrowseFragment
override fun onCreateOptionsMenu(menu: Menu): Boolean = category.createOptionsMenu(menu) override fun onCreateOptionsMenu(menu: Menu): Boolean = category.createOptionsMenu(menu)
override fun setFilter(filter: String) = category.setFilter(filter)
override fun onTransportChanged() = category.onTransportChanged() override fun onTransportChanged() = category.onTransportChanged()
override val contentFragmentTag: String = CategoryBrowseFragment.TAG 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.content.Intent
import android.os.Bundle import android.os.Bundle
import android.support.design.widget.FloatingActionButton import android.support.design.widget.FloatingActionButton
import android.support.v4.view.ViewCompat
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.View 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.ITitleProvider
import io.casey.musikcube.remote.ui.shared.activity.ITransportObserver 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.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.fragment.BaseFragment
import io.casey.musikcube.remote.ui.shared.mixin.DataProviderMixin 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.ItemContextMenuMixin
@ -75,10 +77,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(this.getLayoutId(), container, false).apply { inflater.inflate(this.getLayoutId(), container, false).apply {
ViewCompat.setElevation(this, extras.elevation)
this@CategoryBrowseFragment.rootView = this this@CategoryBrowseFragment.rootView = this
val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view) val recyclerView = findViewById<FastScrollRecyclerView>(R.id.recycler_view)
emptyView = findViewById(R.id.empty_list_view) emptyView = findViewById(R.id.empty_list_view)
@ -87,7 +86,6 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
emptyView.alternateView = recyclerView emptyView.alternateView = recyclerView
setupDefaultRecyclerView(recyclerView, adapter) setupDefaultRecyclerView(recyclerView, adapter)
initToolbarIfNecessary(appCompatActivity, this)
} }
override fun onFabPress(fab: FloatingActionButton) { override fun onFabPress(fab: FloatingActionButton) {
@ -113,7 +111,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
override fun onTransportChanged() = override fun onTransportChanged() =
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
override fun initObservables() { override fun onInitObservables() {
disposables.add(data.provider.observeState().subscribeBy( disposables.add(data.provider.observeState().subscribeBy(
onNext = { states -> onNext = { states ->
when (states.first) { 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.WebSocketService
import io.casey.musikcube.remote.service.websocket.model.IDataProvider import io.casey.musikcube.remote.service.websocket.model.IDataProvider
import io.casey.musikcube.remote.ui.albums.activity.AlbumBrowseActivity 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.activity.CategoryBrowseActivity
import io.casey.musikcube.remote.ui.category.constant.NavigationType 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.fragment.InvalidPasswordDialogFragment
import io.casey.musikcube.remote.ui.home.view.MainMetadataView import io.casey.musikcube.remote.ui.home.view.MainMetadataView
import io.casey.musikcube.remote.ui.navigation.Navigate 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.RemoteSettingsActivity
import io.casey.musikcube.remote.ui.settings.activity.SettingsActivity import io.casey.musikcube.remote.ui.settings.activity.SettingsActivity
import io.casey.musikcube.remote.ui.settings.constants.Prefs import io.casey.musikcube.remote.ui.settings.constants.Prefs
@ -177,7 +175,7 @@ class MainActivity : BaseActivity() {
} }
R.id.action_categories -> { R.id.action_categories -> {
startActivity(AllCategoriesActivity.getStartIntent(this)) Navigate.toAllCategories(this)
return true return true
} }
@ -300,11 +298,9 @@ class MainActivity : BaseActivity() {
} }
findViewById<View>(R.id.button_play_pause).setOnClickListener { findViewById<View>(R.id.button_play_pause).setOnClickListener {
if (playback.service.state === PlaybackState.Stopped) { when (playback.service.state === PlaybackState.Stopped) {
playback.service.playAll() true -> playback.service.playAll()
} else -> playback.service.pauseOrResume()
else {
playback.service.pauseOrResume()
} }
} }
@ -370,8 +366,15 @@ class MainActivity : BaseActivity() {
} }
findViewById<View>(R.id.metadata_container).setOnClickListener { findViewById<View>(R.id.metadata_container).setOnClickListener {
if (playback.service.queueCount > 0) { when (playback.service.queueCount > 0) {
navigateToPlayQueue() 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() { private fun navigateToPlayQueue() {
startActivity(PlayQueueActivity.getStartIntent( Navigate.toPlayQueue(playback.service.queuePosition, this)
this@MainActivity, playback.service.queuePosition))
} }
private fun scheduleUpdateTime(immediate: Boolean) { 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.app.ActivityOptionsCompat
import android.support.v4.util.Pair import android.support.v4.util.Pair
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.view.View
import io.casey.musikcube.remote.R import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
import io.casey.musikcube.remote.service.websocket.model.IAlbum 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.activity.AlbumBrowseActivity
import io.casey.musikcube.remote.ui.albums.fragment.AlbumBrowseFragment 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.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.activity.CategoryBrowseActivity
import io.casey.musikcube.remote.ui.category.constant.NavigationType import io.casey.musikcube.remote.ui.category.constant.NavigationType
import io.casey.musikcube.remote.ui.category.fragment.CategoryBrowseFragment import io.casey.musikcube.remote.ui.category.fragment.CategoryBrowseFragment
@ -37,14 +36,16 @@ object Navigate {
initialCategoryType: String = "") = initialCategoryType: String = "") =
activity.startActivity( activity.startActivity(
BrowseActivity.getStartIntent(activity, initialCategoryType), BrowseActivity.getStartIntent(activity, initialCategoryType),
when (activity is MainActivity) { createMainTransition(activity))
true -> ActivityOptionsCompat.makeSceneTransitionAnimation(
activity, /*
Pair(activity.findViewById(R.id.PlayControls), "play_controls_transition"), *
// Pair(activity.findViewById(R.id.button_play_queue), "play_queue_transition"), * list of categories
Pair(activity.findViewById(R.id.toolbar), "toolbar_transition")).toBundle() *
false -> Bundle() */
})
fun toAllCategories(activity: AppCompatActivity) =
activity.startActivity(AllCategoriesActivity.getStartIntent(activity))
/* /*
* *
@ -137,6 +138,19 @@ object Navigate {
.getStartIntent(activity, targetType, sourceType, sourceId, sourceValue)) .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 * playlist-related
@ -216,4 +230,23 @@ object Navigate {
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) .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 = override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(this.getLayoutId(), container, false).apply { inflater.inflate(this.getLayoutId(), container, false).apply {
ViewCompat.setElevation(this, extras.elevation)
val queryFactory = playback.service.playlistQueryFactory val queryFactory = playback.service.playlistQueryFactory
offlineQueue = playback.service.playlistQueryFactory.offline() offlineQueue = playback.service.playlistQueryFactory.offline()
@ -58,7 +56,6 @@ class PlayQueueFragment: BaseFragment(), ITitleProvider {
adapter = PlayQueueAdapter(tracks, playback, prefs, adapterListener) adapter = PlayQueueAdapter(tracks, playback, prefs, adapterListener)
setupDefaultRecyclerView(recyclerView, adapter) setupDefaultRecyclerView(recyclerView, adapter)
initToolbarIfNecessary(appCompatActivity, this, searchMenu = false)
emptyView = findViewById(R.id.empty_list_view) emptyView = findViewById(R.id.empty_list_view)
emptyView.capability = EmptyListView.Capability.OfflineOk 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( disposables.add(data.provider.observeState().subscribeBy(
onNext = { states -> onNext = { states ->
if (states.first == IDataProvider.State.Connected) { if (states.first == IDataProvider.State.Connected) {

View File

@ -5,6 +5,8 @@ import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.media.AudioManager import android.media.AudioManager
import android.os.Bundle import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.view.KeyEvent import android.view.KeyEvent
import android.view.MenuItem 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.framework.ViewModel
import io.casey.musikcube.remote.injection.DaggerViewComponent import io.casey.musikcube.remote.injection.DaggerViewComponent
import io.casey.musikcube.remote.injection.ViewComponent 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.navigation.Transition
import io.casey.musikcube.remote.ui.settings.constants.Prefs import io.casey.musikcube.remote.ui.settings.constants.Prefs
import io.casey.musikcube.remote.ui.shared.extension.* import io.casey.musikcube.remote.ui.shared.extension.*
@ -94,6 +97,20 @@ abstract class BaseActivity : AppCompatActivity(), ViewModel.Provider, Runner.Ta
mixins.onDestroy() 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 { override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (mixin(PlaybackMixin::class.java)?.onKeyDown(keyCode) == true) { if (mixin(PlaybackMixin::class.java)?.onKeyDown(keyCode) == true) {
return true return true
@ -144,6 +161,20 @@ abstract class BaseActivity : AppCompatActivity(), ViewModel.Provider, Runner.Ta
toolbar?.let { setSupportActionBar(it) } 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 open val transitionType = Transition.Horizontal
protected val extras: Bundle 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.BaseFragment
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable { abstract class FragmentActivityWithTransport: BaseActivity() {
private var transport: TransportFragment? = null private var transport: TransportFragment? = null
protected lateinit var content: BaseFragment protected lateinit var content: BaseFragment
@ -76,11 +76,6 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }
override fun setFilter(filter: String) =
(content as? IFilterable)?.run {
setFilter(filter)
} ?: Unit
override val transitionType: Transition override val transitionType: Transition
get() = extras.transitionType get() = extras.transitionType
@ -93,13 +88,18 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
private fun createFragments() { private fun createFragments() {
content = createContentFragment() content = createContentFragment()
.withToolbar().withTitleOverride(this) .withToolbar()
.withTitleOverride(this)
.pushTo(R.id.content_container)
supportFragmentManager.beginTransaction().apply { supportFragmentManager.beginTransaction().apply {
add(R.id.content_container, content, contentFragmentTag) add(R.id.content_container, content, contentFragmentTag)
if (!withoutTransport) { if (!withoutTransport) {
transport = TransportFragment.create().apply { transport = TransportFragment
add(R.id.transport_container, this, TransportFragment.TAG) .create()
} .pushTo(R.id.content_container)
.apply {
add(R.id.transport_container, this, TransportFragment.TAG)
}
} }
commit() commit()
} }

View File

@ -286,7 +286,7 @@ fun BaseFragment.pushWithToolbar(
} }
inline fun <reified T: BaseFragment> T.withToolbar(): T { 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 return this
} }
@ -323,7 +323,7 @@ fun BaseFragment.initToolbarIfNecessary(activity: AppCompatActivity, view: View,
fun BaseFragment.getLayoutId(): Int = fun BaseFragment.getLayoutId(): Int =
when (this.extras.getBoolean(Shared.Extra.WITH_TOOLBAR)) { when (this.extras.getBoolean(Shared.Extra.WITH_TOOLBAR)) {
true -> R.layout.recycler_view_with_empty_state_and_toolbar_and_fab 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 { 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.Bundle
import android.os.Handler import android.os.Handler
import android.support.v4.app.Fragment import android.support.v4.app.Fragment
import android.support.v4.view.ViewCompat
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar import android.support.v7.widget.Toolbar
import android.view.View 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.IBackHandler
import io.casey.musikcube.remote.ui.shared.activity.ITitleProvider 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.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.extension.setTitleFromIntent
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
@ -43,20 +46,20 @@ open class BaseFragment: Fragment(), ViewModel.Provider, IBackHandler {
private set(value) { private set(value) {
field = value field = value
when (field) { when (field) {
true -> destroyObservables() true -> onDestroyObservables()
false -> initObservables() false -> onInitObservables()
} }
} }
protected var disposables = CompositeDisposable() protected var disposables = CompositeDisposable()
private set private set
private fun destroyObservables() { private fun onDestroyObservables() {
disposables.dispose() disposables.dispose()
disposables = CompositeDisposable() disposables = CompositeDisposable()
} }
protected open fun initObservables() { protected open fun onInitObservables() {
/* for subclass use */ /* for subclass use */
} }
@ -67,6 +70,12 @@ open class BaseFragment: Fragment(), ViewModel.Provider, IBackHandler {
handler.post { onPostCreate(savedInstanceState) } 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?) { open fun onPostCreate(savedInstanceState: Bundle?) {
} }
@ -84,7 +93,7 @@ open class BaseFragment: Fragment(), ViewModel.Provider, IBackHandler {
toolbar?.setTitleFromIntent(title) toolbar?.setTitleFromIntent(title)
} }
if (!animating) { if (!animating) {
initObservables() onInitObservables()
} }
} }

View File

@ -50,7 +50,10 @@ class EmptyListView : FrameLayout {
var alternateView: View? = null var alternateView: View? = null
set(value) { set(value) {
field = 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 var emptyMessage: String
@ -77,7 +80,10 @@ class EmptyListView : FrameLayout {
emptyContainer?.setVisible(!showOfflineContainer) 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) { fun update(state: IDataProvider.State, count: Int) {
@ -96,7 +102,10 @@ class EmptyListView : FrameLayout {
emptyContainer?.setVisible(!showOfflineContainer) 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() { private fun initialize() {

View File

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

View File

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

View File

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

View File

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

View File

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