diff --git a/src/musikdroid/app/build.gradle b/src/musikdroid/app/build.gradle index bee46fa90..62273db9d 100644 --- a/src/musikdroid/app/build.gradle +++ b/src/musikdroid/app/build.gradle @@ -23,6 +23,11 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildTypes { release { minifyEnabled false @@ -88,7 +93,6 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.recyclerview:recyclerview:1.2.1' - implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01' implementation 'com.google.android.material:material:1.8.0-alpha02' implementation 'androidx.media:media:1.6.0' diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/browse/adapter/BrowseFragmentAdapter.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/browse/adapter/BrowseFragmentAdapter.kt index 52c65b273..a04a9ad00 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/browse/adapter/BrowseFragmentAdapter.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/browse/adapter/BrowseFragmentAdapter.kt @@ -1,8 +1,10 @@ package io.casey.musikcube.remote.ui.browse.adapter import android.content.Context +import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter import io.casey.musikcube.remote.R import io.casey.musikcube.remote.service.playback.impl.remote.Metadata import io.casey.musikcube.remote.ui.albums.fragment.AlbumBrowseFragment @@ -17,9 +19,9 @@ import io.casey.musikcube.remote.ui.tracks.fragment.TrackListFragment class BrowseFragmentAdapter(private val context: Context, private val playback: PlaybackMixin, - fragment: Fragment, + fm: FragmentManager, private val containerId: Int = -1) - : FragmentStateAdapter(fragment) + : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { private val fragments = mutableMapOf() @@ -50,16 +52,7 @@ class BrowseFragmentAdapter(private val context: Context, else -> 0 } - fun getPageTitle(position: Int): CharSequence = - context.getString(when (position) { - 0 -> R.string.button_artists - 1 -> R.string.button_albums - 2 -> R.string.button_tracks - 3 -> R.string.button_playlists - else -> R.string.button_offline - }) - - override fun createFragment(index: Int): Fragment { + override fun getItem(index: Int): Fragment { val fragment: BaseFragment = when (index) { 0 -> CategoryBrowseFragment.create( CategoryBrowseFragment.arguments(context, Metadata.Category.ALBUM_ARTIST)) @@ -70,14 +63,27 @@ class BrowseFragmentAdapter(private val context: Context, else -> TrackListFragment.create( TrackListFragment.arguments(context, Metadata.Category.OFFLINE)) } - fragment.pushTo(this.containerId) - (fragment as? IFilterable)?.setFilter(filter) - onFragmentInstantiated?.invoke(index) - fragments[index] = fragment - return fragment + return fragment.pushTo(this.containerId) } - override fun getItemCount(): Int { + override fun getPageTitle(position: Int): CharSequence = + context.getString(when (position) { + 0 -> R.string.button_artists + 1 -> R.string.button_albums + 2 -> R.string.button_tracks + 3 -> R.string.button_playlists + else -> R.string.button_offline + }) + + override fun getCount(): Int { return if (playback.streaming) 5 else 4 /* hide "offline" for remote playback */ } + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val result = super.instantiateItem(container, position) + fragments[position] = result as Fragment + (result as? IFilterable)?.setFilter(filter) + onFragmentInstantiated?.invoke(position) + return result + } } \ No newline at end of file diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/browse/fragment/BrowseFragment.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/browse/fragment/BrowseFragment.kt index 73f4cfd3e..10aefcb28 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/browse/fragment/BrowseFragment.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/browse/fragment/BrowseFragment.kt @@ -4,10 +4,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.viewpager2.widget.ViewPager2 +import androidx.viewpager.widget.ViewPager import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.tabs.TabLayout -import com.google.android.material.tabs.TabLayoutMediator import io.casey.musikcube.remote.R import io.casey.musikcube.remote.ui.browse.adapter.BrowseFragmentAdapter import io.casey.musikcube.remote.ui.browse.constant.Browse @@ -33,7 +32,7 @@ class BrowseFragment: BaseFragment(), ITransportObserver, IFilterable, ITitlePro override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.browse_fragment, container, false).apply { val fab = findViewById(R.id.fab) - val pager = findViewById(R.id.view_pager) + val pager = findViewById(R.id.view_pager) val tabs = findViewById(R.id.tab_layout) val showFabIfNecessary = { pos: Int -> @@ -57,7 +56,7 @@ class BrowseFragment: BaseFragment(), ITransportObserver, IFilterable, ITitlePro adapter = BrowseFragmentAdapter( appCompatActivity, playback, - this@BrowseFragment, + childFragmentManager, R.id.content_container) adapter.onFragmentInstantiated = { pos -> @@ -68,26 +67,23 @@ class BrowseFragment: BaseFragment(), ITransportObserver, IFilterable, ITitlePro pager.isSaveEnabled = false pager.adapter = adapter - pager.offscreenPageLimit = adapter.itemCount + pager.currentItem = adapter.indexOf(extras.getString(Browse.Extras.INITIAL_CATEGORY_TYPE)) - pager.registerOnPageChangeCallback(object: ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - showFabIfNecessary(position) + tabs.setupWithViewPager(pager) + + pager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled(pos: Int, offset: Float, offsetPixels: Int) { + } + + override fun onPageSelected(pos: Int) { + showFabIfNecessary(pos) } }) - TabLayoutMediator(tabs, pager, true) { tab, position -> - tab.text = adapter.getPageTitle(position) - }.attach() - - val initialIndex = adapter.indexOf( - extras.getString(Browse.Extras.INITIAL_CATEGORY_TYPE)) - - pager.setCurrentItem(initialIndex, false) - - pager.post { - showFabIfNecessary(pager.currentItem) - } + showFabIfNecessary(pager.currentItem) } override fun onTransportChanged() = diff --git a/src/musikdroid/app/src/main/res/layout/browse_fragment.xml b/src/musikdroid/app/src/main/res/layout/browse_fragment.xml index 09360d538..ae64a2f63 100644 --- a/src/musikdroid/app/src/main/res/layout/browse_fragment.xml +++ b/src/musikdroid/app/src/main/res/layout/browse_fragment.xml @@ -27,7 +27,7 @@ -