Extracted "BrowseFragment" from "BrowseActivity". Now the fun begins...

This commit is contained in:
casey langen 2019-02-13 21:49:03 -08:00
parent fe10253ee5
commit 7a214fe113
5 changed files with 160 additions and 118 deletions

View File

@ -3,108 +3,57 @@ package io.casey.musikcube.remote.ui.browse.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.design.widget.TabLayout
import android.support.v4.view.ViewPager
import android.view.Menu
import android.view.View
import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.ui.browse.adapter.BrowseFragmentAdapter
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.IFabConsumer
import io.casey.musikcube.remote.ui.shared.activity.IFilterable
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
import io.casey.musikcube.remote.ui.shared.extension.initSearchMenu
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
class BrowseActivity: BaseActivity(), IFilterable {
private lateinit var transport: TransportFragment
private lateinit var pager: ViewPager
private lateinit var tabs: TabLayout
private lateinit var fab: FloatingActionButton
private lateinit var adapter: BrowseFragmentAdapter
class BrowseActivity: BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.browse_activity)
adapter = BrowseFragmentAdapter(this, supportFragmentManager)
pager = findViewById(R.id.view_pager)
pager.adapter = adapter
pager.currentItem = adapter.indexOf(extras.getString(EXTRA_INITIAL_CATEGORY_TYPE))
tabs = findViewById(R.id.tab_layout)
tabs.setupWithViewPager(pager)
fab = findViewById(R.id.fab)
fab.setOnClickListener {
(adapter.fragmentAt(pager.currentItem) as? IFabConsumer)?.onFabPress(fab)
if (savedInstanceState == null) {
createFragments()
}
when (savedInstanceState == null) {
true -> createFragments()
else -> restoreFragments()
}
transport.modelChangedListener = {
adapter.onTransportChanged()
}
pager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
}
override fun onPageScrolled(pos: Int, offset: Float, offsetPixels: Int) {
}
override fun onPageSelected(pos: Int) {
adapter.fragmentAt(pos)?.let {
when (it is IFabConsumer) {
true -> {
when (it.fabVisible) {
true -> fab.show()
false -> fab.hide()
}
}
false -> fab.hide()
}
findFragment<TransportFragment>(TransportFragment.TAG).modelChangedListener = {
supportFragmentManager.fragments.forEach {
if (it is ITransportObserver) {
it.onTransportChanged()
}
}
})
}
enableUpNavigation()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
return initSearchMenu(menu, this)
}
override fun setFilter(filter: String) {
adapter.filter = filter
}
private fun createFragments() {
transport = TransportFragment.create()
supportFragmentManager
.beginTransaction()
.add(R.id.transport_container, transport, TransportFragment.TAG)
.add(
R.id.content_container,
BrowseFragment.create(extras),
BrowseFragment.TAG)
.add(
R.id.transport_container,
TransportFragment.create(),
TransportFragment.TAG)
.commit()
}
private fun restoreFragments() {
transport = findFragment(TransportFragment.TAG)
supportFragmentManager.executePendingTransactions()
}
companion object {
private const val EXTRA_INITIAL_CATEGORY_TYPE = "extra_initial_category_type"
fun getStartIntent(context: Context,
initialCategoryType: String = ""): Intent =
Intent(context, BrowseActivity::class.java).apply {
putExtra(EXTRA_INITIAL_CATEGORY_TYPE, initialCategoryType)
putExtra(Browse.Extras.INITIAL_CATEGORY_TYPE, initialCategoryType)
}
}
}

View File

@ -0,0 +1,7 @@
package io.casey.musikcube.remote.ui.browse.constant
object Browse {
object Extras {
const val INITIAL_CATEGORY_TYPE = "extra_initial_category_type"
}
}

View File

@ -0,0 +1,80 @@
package io.casey.musikcube.remote.ui.browse.fragment
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.design.widget.TabLayout
import android.support.v4.view.ViewPager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.ui.browse.adapter.BrowseFragmentAdapter
import io.casey.musikcube.remote.ui.browse.constant.Browse
import io.casey.musikcube.remote.ui.shared.activity.IFabConsumer
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.initToolbarIfNecessary
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
class BrowseFragment: BaseFragment(), ITransportObserver, IFilterable, ITitleProvider {
private lateinit var adapter: BrowseFragmentAdapter
override val title: String
get() = getString(R.string.app_name)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(R.layout.browse_fragment, container, false).apply {
adapter = BrowseFragmentAdapter(appCompatActivity, childFragmentManager)
val pager = findViewById<ViewPager>(R.id.view_pager)
pager.adapter = adapter
pager.currentItem = adapter.indexOf(extras.getString(Browse.Extras.INITIAL_CATEGORY_TYPE))
val tabs = findViewById<TabLayout>(R.id.tab_layout)
tabs.setupWithViewPager(pager)
val fab = findViewById<FloatingActionButton>(R.id.fab)
fab.setOnClickListener {
(adapter.fragmentAt(pager.currentItem) as? IFabConsumer)?.onFabPress(fab)
}
pager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
}
override fun onPageScrolled(pos: Int, offset: Float, offsetPixels: Int) {
}
override fun onPageSelected(pos: Int) {
adapter.fragmentAt(pos)?.let {
when (it is IFabConsumer) {
true -> {
when (it.fabVisible) {
true -> fab.show()
false -> fab.hide()
}
}
false -> fab.hide()
}
}
}
})
initToolbarIfNecessary(appCompatActivity, this)
}
override fun onTransportChanged() =
adapter.onTransportChanged()
override fun setFilter(filter: String) {
adapter.filter = filter
}
companion object {
const val TAG = "BrowseFragment"
fun create(extras: Bundle): BrowseFragment =
BrowseFragment().apply { arguments = extras }
}
}

View File

@ -1,58 +1,15 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.CoordinatorLayout
<FrameLayout
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways|snap" />
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_primary" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
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/view_pager"
app:layout_anchorGravity="bottom|right"
app:backgroundTint="@color/color_primary"
app:fabSize="mini"
app:rippleColor="?colorAccent"/>
</android.support.design.widget.CoordinatorLayout>
android:layout_weight="1.0" />
<FrameLayout
android:id="@+id/transport_container"

View File

@ -0,0 +1,49 @@
<?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_width="match_parent"
android:layout_height="match_parent" >
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways|snap" />
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_primary" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
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/view_pager"
app:layout_anchorGravity="bottom|right"
app:backgroundTint="@color/color_primary"
app:fabSize="mini"
app:rippleColor="?colorAccent"/>
</android.support.design.widget.CoordinatorLayout>