Temporarily replace ViewPager2 within ViewPager in favourites
parent
e7bd74429e
commit
83cf6aa997
@ -0,0 +1,30 @@
|
|||||||
|
package org.koitharu.kotatsu.core.ui.widgets
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.MotionEvent
|
||||||
|
import androidx.viewpager.widget.ViewPager
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
|
class EnhancedViewPager @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
) : ViewPager(context, attrs) {
|
||||||
|
|
||||||
|
var isUserInputEnabled: Boolean = true
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
if (!value) {
|
||||||
|
cancelPendingInputEvents()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTouchEvent(event: MotionEvent): Boolean {
|
||||||
|
return isUserInputEnabled && super.onTouchEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
|
||||||
|
return isUserInputEnabled && super.onInterceptTouchEvent(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,54 +1,33 @@
|
|||||||
package org.koitharu.kotatsu.favourites.ui.container
|
package org.koitharu.kotatsu.favourites.ui.container
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.recyclerview.widget.AdapterListUpdateCallback
|
import androidx.fragment.app.FragmentManager
|
||||||
import androidx.recyclerview.widget.AsyncDifferConfig
|
import androidx.fragment.app.FragmentStatePagerAdapter
|
||||||
import androidx.recyclerview.widget.AsyncListDiffer
|
|
||||||
import androidx.viewpager2.adapter.FragmentStateAdapter
|
|
||||||
import com.google.android.material.tabs.TabLayout
|
|
||||||
import com.google.android.material.tabs.TabLayoutMediator.TabConfigurationStrategy
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.asExecutor
|
|
||||||
import kotlinx.coroutines.flow.FlowCollector
|
import kotlinx.coroutines.flow.FlowCollector
|
||||||
import org.koitharu.kotatsu.core.util.ContinuationResumeRunnable
|
|
||||||
import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment
|
import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment
|
||||||
import org.koitharu.kotatsu.list.ui.ListModelDiffCallback
|
import org.koitharu.kotatsu.parsers.util.replaceWith
|
||||||
import kotlin.coroutines.suspendCoroutine
|
|
||||||
|
|
||||||
class FavouritesContainerAdapter(fragment: Fragment) :
|
@Suppress("DEPRECATION")
|
||||||
FragmentStateAdapter(fragment.childFragmentManager, fragment.viewLifecycleOwner.lifecycle),
|
class FavouritesContainerAdapter(
|
||||||
TabConfigurationStrategy,
|
fm: FragmentManager
|
||||||
|
) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT),
|
||||||
FlowCollector<List<FavouriteTabModel>> {
|
FlowCollector<List<FavouriteTabModel>> {
|
||||||
|
|
||||||
private val differ = AsyncListDiffer(
|
private val dataSet = ArrayList<FavouriteTabModel>()
|
||||||
AdapterListUpdateCallback(this),
|
|
||||||
AsyncDifferConfig.Builder(ListModelDiffCallback<FavouriteTabModel>())
|
|
||||||
.setBackgroundThreadExecutor(Dispatchers.Default.limitedParallelism(2).asExecutor())
|
|
||||||
.build(),
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun getItemCount(): Int = differ.currentList.size
|
override fun getCount(): Int = dataSet.size
|
||||||
|
|
||||||
override fun getItemId(position: Int): Long {
|
override fun getItem(position: Int): Fragment {
|
||||||
return differ.currentList[position].id
|
val item = dataSet[position]
|
||||||
}
|
|
||||||
|
|
||||||
override fun containsItem(itemId: Long): Boolean {
|
|
||||||
return differ.currentList.any { x -> x.id == itemId }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun createFragment(position: Int): Fragment {
|
|
||||||
val item = differ.currentList[position]
|
|
||||||
return FavouritesListFragment.newInstance(item.id)
|
return FavouritesListFragment.newInstance(item.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {
|
override fun getPageTitle(position: Int): CharSequence {
|
||||||
val item = differ.currentList[position]
|
return dataSet[position].title
|
||||||
tab.text = item.title
|
|
||||||
tab.tag = item
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun emit(value: List<FavouriteTabModel>) = suspendCoroutine { cont ->
|
override suspend fun emit(value: List<FavouriteTabModel>) {
|
||||||
differ.submitList(value, ContinuationResumeRunnable(cont))
|
dataSet.replaceWith(value)
|
||||||
|
notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,55 @@
|
|||||||
|
package org.koitharu.kotatsu.favourites.ui.container
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.recyclerview.widget.AdapterListUpdateCallback
|
||||||
|
import androidx.recyclerview.widget.AsyncDifferConfig
|
||||||
|
import androidx.recyclerview.widget.AsyncListDiffer
|
||||||
|
import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||||
|
import com.google.android.material.tabs.TabLayout
|
||||||
|
import com.google.android.material.tabs.TabLayoutMediator.TabConfigurationStrategy
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.asExecutor
|
||||||
|
import kotlinx.coroutines.flow.FlowCollector
|
||||||
|
import org.koitharu.kotatsu.core.util.ContinuationResumeRunnable
|
||||||
|
import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment
|
||||||
|
import org.koitharu.kotatsu.list.ui.ListModelDiffCallback
|
||||||
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
|
||||||
|
// FIXME migrate to ViewPager2 in FavouritesContainerFragment
|
||||||
|
class FavouritesContainerAdapter2(fragment: Fragment) :
|
||||||
|
FragmentStateAdapter(fragment.childFragmentManager, fragment.viewLifecycleOwner.lifecycle),
|
||||||
|
TabConfigurationStrategy,
|
||||||
|
FlowCollector<List<FavouriteTabModel>> {
|
||||||
|
|
||||||
|
private val differ = AsyncListDiffer(
|
||||||
|
AdapterListUpdateCallback(this),
|
||||||
|
AsyncDifferConfig.Builder(ListModelDiffCallback<FavouriteTabModel>())
|
||||||
|
.setBackgroundThreadExecutor(Dispatchers.Default.limitedParallelism(2).asExecutor())
|
||||||
|
.build(),
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = differ.currentList.size
|
||||||
|
|
||||||
|
override fun getItemId(position: Int): Long {
|
||||||
|
return differ.currentList[position].id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun containsItem(itemId: Long): Boolean {
|
||||||
|
return differ.currentList.any { x -> x.id == itemId }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createFragment(position: Int): Fragment {
|
||||||
|
val item = differ.currentList[position]
|
||||||
|
return FavouritesListFragment.newInstance(item.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {
|
||||||
|
val item = differ.currentList[position]
|
||||||
|
tab.text = item.title
|
||||||
|
tab.tag = item
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun emit(value: List<FavouriteTabModel>) = suspendCoroutine { cont ->
|
||||||
|
differ.submitList(value, ContinuationResumeRunnable(cont))
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
package org.koitharu.kotatsu.favourites.ui.container
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuInflater
|
||||||
|
import android.view.MenuItem
|
||||||
|
import androidx.core.view.MenuProvider
|
||||||
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity
|
||||||
|
|
||||||
|
class FavouritesContainerMenuProvider(
|
||||||
|
private val context: Context,
|
||||||
|
) : MenuProvider {
|
||||||
|
|
||||||
|
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
|
||||||
|
menuInflater.inflate(R.menu.opt_favourites_container, menu)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
|
||||||
|
when (menuItem.itemId) {
|
||||||
|
R.id.action_manage -> {
|
||||||
|
context.startActivity(FavouriteCategoriesActivity.newIntent(context))
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_manage"
|
||||||
|
android:orderInCategory="48"
|
||||||
|
android:title="@string/manage_favourites"
|
||||||
|
android:titleCondensed="@string/manage" />
|
||||||
|
|
||||||
|
</menu>
|
||||||
Loading…
Reference in New Issue