Bunch of annoying book keeping for title overrides and options menu

creation. Not sure it's worth all this complexity, but we'll see...
This commit is contained in:
casey langen 2019-02-13 21:27:06 -08:00
parent 47953697ff
commit fe10253ee5
14 changed files with 139 additions and 103 deletions

View File

@ -9,11 +9,11 @@ import io.casey.musikcube.remote.service.websocket.model.ICategoryValue
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.extension.EXTRA_TITLE_OVERRIDE
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
import io.casey.musikcube.remote.util.Strings
class AlbumBrowseActivity : FragmentActivityWithTransport() {
class AlbumBrowseActivity: FragmentActivityWithTransport() {
private val albums
get() = content as AlbumBrowseFragment
@ -42,7 +42,7 @@ class AlbumBrowseActivity : FragmentActivityWithTransport() {
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))
putExtra(EXTRA_TITLE_OVERRIDE, context.getString(R.string.albums_by_title, categoryValue))
}
}

View File

@ -15,10 +15,7 @@ import io.casey.musikcube.remote.ui.albums.constant.Album
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.extension.getLayoutId
import io.casey.musikcube.remote.ui.shared.extension.initSearchMenu
import io.casey.musikcube.remote.ui.shared.extension.initToolbarIfNecessary
import io.casey.musikcube.remote.ui.shared.extension.setupDefaultRecyclerView
import io.casey.musikcube.remote.ui.shared.extension.*
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
@ -38,7 +35,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
private lateinit var emptyView: EmptyListView
override val title: String
get() = app.getString(R.string.albums_title)
get() = getTitleOverride(app.getString(R.string.albums_title))
override fun onCreate(savedInstanceState: Bundle?) {
component.inject(this)
@ -66,7 +63,7 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo
emptyView.emptyMessage = getString(R.string.empty_no_items_format, getString(R.string.browse_type_albums))
emptyView.alternateView = recyclerView
initToolbarIfNecessary(this)
initToolbarIfNecessary(appCompatActivity, this)
}
override fun onResume() {

View File

@ -47,9 +47,9 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
override val title: String
get() {
Category.NAME_TO_TITLE[category]?.let {
return getString(it)
return getTitleOverride(getString(it))
}
return Category.toDisplayString(app, category)
return getTitleOverride(Category.toDisplayString(app, category))
}
override fun onCreate(savedInstanceState: Bundle?) {
@ -82,7 +82,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
emptyView.alternateView = recyclerView
setupDefaultRecyclerView(recyclerView, adapter)
initToolbarIfNecessary(this)
initToolbarIfNecessary(appCompatActivity, this)
}
override fun onFabPress(fab: FloatingActionButton) {
@ -187,10 +187,10 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
}
private fun navigateToAlbums(entry: ICategoryValue) =
startActivity(AlbumBrowseActivity.getStartIntent(appCompatActivity, category, entry))
startActivity(AlbumBrowseActivity.getStartIntent(appCompatActivity, category, entry))
private fun navigateToTracks(entry: ICategoryValue) =
startActivity(TrackListActivity.getStartIntent(appCompatActivity, category, entry.id, entry.value))
startActivity(TrackListActivity.getStartIntent(appCompatActivity, category, entry.id, entry.value))
private fun navigateToSelect(id: Long, name: String) =
appCompatActivity.run {
@ -230,7 +230,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
val format = Category.NAME_TO_RELATED_TITLE[category]
when (format) {
null -> throw IllegalArgumentException("unknown category $category")
else -> putString(EXTRA_ACTIVITY_TITLE, context.getString(format, predicateValue))
else -> putString(EXTRA_TITLE_OVERRIDE, context.getString(format, predicateValue))
}
}
}

View File

@ -5,9 +5,7 @@ import android.support.design.widget.FloatingActionButton
import android.view.Menu
import android.view.MenuItem
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.extension.*
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
@ -91,6 +89,8 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
private fun createFragments() {
content = createContentFragment()
.withToolbar()
.withTitleOverride(this)
transport = TransportFragment.create()
supportFragmentManager
.beginTransaction()

View File

@ -30,7 +30,7 @@ import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
import io.casey.musikcube.remote.util.Strings
const val EXTRA_ACTIVITY_TITLE = "extra_title"
const val EXTRA_TITLE_OVERRIDE = "extra_title_override"
const val EXTRA_WITH_TOOLBAR = "extra_with_toolbar"
const val EXTRA_WITH_FRAGMENT_TOOLBAR = "extra_with_fragment_toolbar"
@ -94,10 +94,18 @@ fun AppCompatActivity.setTitleFromIntent(defaultId: Int) =
this.setTitleFromIntent(getString(defaultId))
fun AppCompatActivity.setTitleFromIntent(defaultTitle: String) {
val title = this.intent.getStringExtra(EXTRA_ACTIVITY_TITLE)
val title = this.intent.getStringExtra(EXTRA_TITLE_OVERRIDE)
this.title = if (Strings.notEmpty(title)) title else defaultTitle
}
fun BaseFragment.getTitleOverride(defaultId: Int): String =
this.getTitleOverride(getString(defaultId))
fun BaseFragment.getTitleOverride(defaultTitle: String): String {
val title = this.extras.getString(EXTRA_TITLE_OVERRIDE) ?: ""
return if (Strings.notEmpty(title)) title else defaultTitle
}
fun AppCompatActivity.initSearchMenu(menu: Menu, filterable: IFilterable?): Boolean {
this.menuInflater.inflate(R.menu.search_menu, menu)
@ -134,12 +142,12 @@ fun AppCompatActivity.initSearchMenu(menu: Menu, filterable: IFilterable?): Bool
fun Fragment.initSearchMenu(menu: Menu, filterable: IFilterable?): Boolean =
(activity as AppCompatActivity).initSearchMenu(menu, filterable)
fun Toolbar.initSearchMenu(filterable: IFilterable?): Boolean =
(context as AppCompatActivity).initSearchMenu(this.menu, filterable)
fun Toolbar.initSearchMenu(activity: AppCompatActivity, filterable: IFilterable?): Boolean =
activity.initSearchMenu(this.menu, filterable)
fun Toolbar.setTitleFromIntent(defaultTitle: String) {
val extras = (context as? AppCompatActivity)?.intent?.extras ?: Bundle()
val title = extras.getString(EXTRA_ACTIVITY_TITLE)
val title = extras.getString(EXTRA_TITLE_OVERRIDE)
this.title = if (Strings.notEmpty(title)) title else defaultTitle
}
@ -295,11 +303,26 @@ inline fun <reified T: BaseFragment> T.withToolbar(): T {
return this
}
fun BaseFragment.initToolbarIfNecessary(view: View) {
inline fun <reified T: BaseFragment> T.withTitleOverride(activity: AppCompatActivity): T {
activity.intent?.getStringExtra(EXTRA_TITLE_OVERRIDE)?.let {
if (it.isNotEmpty()) {
if (this.arguments == null) {
this.arguments = Bundle()
}
this.extras.putString(EXTRA_TITLE_OVERRIDE, it)
}
}
return this
}
fun BaseFragment.initToolbarIfNecessary(activity: AppCompatActivity, view: View, searchMenu: Boolean = true) {
view.findViewById<Toolbar>(R.id.toolbar)?.let {
it.navigationIcon = appCompatActivity.getDrawable(R.drawable.ic_back)
it.setNavigationOnClickListener { appCompatActivity.finish() }
it.initSearchMenu(this as? IFilterable)
if (searchMenu) {
it.initSearchMenu(activity, this as? IFilterable)
}
if (this is IMenuProvider) {
this.createOptionsMenu(it.menu)
it.setOnMenuItemClickListener {
@ -311,8 +334,8 @@ fun BaseFragment.initToolbarIfNecessary(view: View) {
fun BaseFragment.getLayoutId(): Int =
when (this.extras.getBoolean(EXTRA_WITH_TOOLBAR)) {
true -> R.layout.recycler_view_activity
else -> R.layout.recycler_view_fragment
true -> R.layout.recycler_view_with_empty_state_and_toolbar_and_fab
else -> R.layout.recycler_view_with_empty_state
}
fun Intent.withFragmentToolbar(): Intent {

View File

@ -28,7 +28,7 @@ class TransportFragment: BaseFragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
{
this.rootView = inflater.inflate(R.layout.fragment_transport, container, false)
this.rootView = inflater.inflate(R.layout.transport_fragment, container, false)
bindEventHandlers()
rebindUi()
return this.rootView

View File

@ -7,12 +7,11 @@ import android.view.MenuItem
import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
import io.casey.musikcube.remote.ui.shared.activity.FragmentActivityWithTransport
import io.casey.musikcube.remote.ui.shared.activity.IFilterable
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
import io.casey.musikcube.remote.ui.tracks.constant.Track
import io.casey.musikcube.remote.ui.tracks.fragment.TrackListFragment
class TrackListActivity : FragmentActivityWithTransport(), IFilterable {
class TrackListActivity: FragmentActivityWithTransport() {
private val tracks
get() = content as TrackListFragment

View File

@ -105,7 +105,7 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
adapter = TrackListAdapter(tracks, eventListener, playback, prefs)
setupDefaultRecyclerView(recyclerView, adapter)
initToolbarIfNecessary(this)
initToolbarIfNecessary(appCompatActivity, this, searchMenu = false)
emptyView = findViewById(R.id.empty_list_view)
@ -118,8 +118,27 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
tracks.setOnMetadataLoadedListener(slidingWindowListener)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == Track.RequestCode.EDIT_PLAYLIST && resultCode == AppCompatActivity.RESULT_OK && data != null) {
val playlistName = data.getStringExtra(EditPlaylistActivity.EXTRA_PLAYLIST_NAME) ?: ""
val playlistId = data.getLongExtra(EditPlaylistActivity.EXTRA_PLAYLIST_ID, -1L)
if (categoryType != Metadata.Category.PLAYLISTS || playlistId != this.categoryId) {
showSnackbar(
appCompatActivity.findViewById(android.R.id.content),
getString(R.string.playlist_edit_save_success, playlistName),
buttonText = getString(R.string.button_view),
buttonCb = {
startActivity(TrackListActivity.getStartIntent(
appCompatActivity, Metadata.Category.PLAYLISTS, playlistId, playlistName))
})
}
}
super.onActivityResult(requestCode, resultCode, data)
}
override val title: String
get() = getString(titleId)
get() = getTitleOverride(getString(titleId))
override fun setFilter(filter: String) {
lastFilter = filter
@ -148,25 +167,6 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
else -> false
}
fun activityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == Track.RequestCode.EDIT_PLAYLIST && resultCode == AppCompatActivity.RESULT_OK && data != null) {
val playlistName = data.getStringExtra(EditPlaylistActivity.EXTRA_PLAYLIST_NAME) ?: ""
val playlistId = data.getLongExtra(EditPlaylistActivity.EXTRA_PLAYLIST_ID, -1L)
if (categoryType != Metadata.Category.PLAYLISTS || playlistId != this.categoryId) {
showSnackbar(
appCompatActivity.findViewById(android.R.id.content),
getString(R.string.playlist_edit_save_success, playlistName),
buttonText = getString(R.string.button_view),
buttonCb = {
startActivity(TrackListActivity.getStartIntent(
appCompatActivity, Metadata.Category.PLAYLISTS, playlistId, playlistName))
})
}
}
super.onActivityResult(requestCode, resultCode, data)
}
override fun onTransportChanged() {
adapter.notifyDataSetChanged()
}
@ -282,7 +282,7 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
putString(Track.Extra.CATEGORY_VALUE, categoryValue)
if (Strings.notEmpty(categoryValue)) {
putString(
EXTRA_ACTIVITY_TITLE,
EXTRA_TITLE_OVERRIDE,
context.getString(R.string.songs_from_category, categoryValue))
}
}

View File

@ -1,40 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
android:layout_weight="1"
<FrameLayout
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="0dp">
<include layout="@layout/toolbar" />
<FrameLayout
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_gravity="bottom|right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_padding"
android:src="@drawable/ic_fab_add"
android:scaleType="center"
android:elevation="6dp"
android:visibility="gone"
app:layout_anchor="@id/content_container"
app:layout_anchorGravity="bottom|right"
app:backgroundTint="@color/color_primary"
app:fabSize="mini"
app:rippleColor="?colorAccent"/>
</android.support.design.widget.CoordinatorLayout>
android:layout_height="0dp"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/transport_container"

View File

@ -30,20 +30,9 @@
android:visibility="invisible"/>
<android.support.design.widget.FloatingActionButton
style="@style/FAB"
android:id="@+id/fab"
android:layout_gravity="bottom|right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_padding"
android:src="@drawable/ic_fab_add"
android:scaleType="center"
android:elevation="6dp"
android:visibility="gone"
app:layout_anchor="@id/recycler_view"
app:layout_anchorGravity="bottom|right"
app:backgroundTint="@color/color_primary"
app:fabSize="mini"
app:rippleColor="?colorAccent"/>
app:layout_anchor="@id/recycler_view" />
</android.support.design.widget.CoordinatorLayout>

View File

@ -3,16 +3,14 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
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"
app:fastScrollAutoHide="true"
app:fastScrollAutoHideDelay="1500"
app:fastScrollThumbInactiveColor="@color/color_primary_dark"
app:fastScrollThumbColor="@color/color_accent" />
android:layout_height="match_parent" />
<io.casey.musikcube.remote.ui.shared.view.EmptyListView
android:id="@+id/empty_list_view"

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_width="match_parent">
<include layout="@layout/toolbar" />
<FrameLayout
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
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" />
<io.casey.musikcube.remote.ui.shared.view.EmptyListView
android:id="@+id/empty_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible" />
</FrameLayout>
<android.support.design.widget.FloatingActionButton
style="@style/FAB"
android:id="@+id/fab"
app:layout_anchor="@id/content_container" />
</android.support.design.widget.CoordinatorLayout>

View File

@ -46,7 +46,6 @@
</LinearLayout>
<android.support.v4.widget.Space
android:layout_width="0dp"
android:layout_height="2dp"/>
@ -88,5 +87,4 @@
</FrameLayout>
</LinearLayout>

View File

@ -87,4 +87,26 @@
<item name="android:shadowRadius">3</item>
</style>
<style name="FAB">
<item name="android:layout_gravity">bottom|right</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_margin">@dimen/fab_padding</item>
<item name="android:src">@drawable/ic_fab_add</item>
<item name="android:scaleType">center</item>
<item name="android:elevation">6dp</item>
<item name="android:visibility">gone</item>
<item name="layout_anchorGravity">bottom|right</item>
<item name="backgroundTint">@color/color_primary</item>
<item name="fabSize">mini</item>
<item name="rippleColor">?colorAccent</item>
</style>
<style name="RecyclerView">
<item name="fastScrollAutoHide">true</item>
<item name="fastScrollAutoHideDelay">1500</item>
<item name="fastScrollThumbInactiveColor">@color/color_primary_dark</item>
<item name="fastScrollThumbColor">@color/color_accent</item>
</style>
</resources>