package cn.eeepay.agent_home.view
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.*
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager.widget.ViewPager
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import cn.eeepay.agent_home.adapter.FragmentAdapter
import cn.eeepay.agent_home.view.EditConfig.DESIGN_WIDTH
import cn.eeepay.lib_core.base.BaseApplication.Companion.application
import cn.eeepay.lib_core.utils.MMKVUtils.clearAll
import cn.eeepay.lib_data.constants.EditConfig
import com.ashokvarma.bottomnavigation.BottomNavigationBar
import com.ashokvarma.bottomnavigation.BottomNavigationItem
import java.util.*
class DataSource {
var fragment: MutableList<Fragment> = arrayListOf()
var tabTitles: MutableList<String> = arrayListOf()
var icon: MutableList<Int> = arrayListOf()
}
class ViewPagerConfig(var fm: FragmentManager? = null, var bindViewPager: ViewPager? = null, var viewPageChangeListener: ExtViewPageChangeListener.() -> Unit = {})
class ExtTabSelectedListener : BottomNavigationBar.OnTabSelectedListener {
private var onTabSelectedFun: ((Int) -> Unit)? = null
private var onTabUnselectedFun: ((Int) -> Unit)? = null
private var onTabReselectedFun: ((Int) -> Unit)? = null
fun setTabSelectedFun(block: (Int) -> Unit) {
onTabSelectedFun = block
}
fun setTabUnselectedFun(block: (Int) -> Unit) {
onTabUnselectedFun = block
}
fun setTabReselectedFun(block: (Int) -> Unit) {
onTabReselectedFun = block
}
override fun onTabSelected(position: Int) {
onTabSelectedFun?.let { it(position) }
}
override fun onTabUnselected(position: Int) {
onTabUnselectedFun?.let { it(position) }
}
override fun onTabReselected(position: Int) {
onTabReselectedFun?.let { it(position) }
}
}
class ExtViewPage2ChangeCallback : ViewPager2.OnPageChangeCallback() {
private var onPageSelectedFun: ((Int) -> Unit)? = null
private var onPageScrolledFun: ((Int, Float, Int) -> Unit)? = null
private var onPageScrollStateChangedFun: ((Int) -> Unit)? = null
fun setonPageSelectedFun(block: (Int) -> Unit) {
this.onPageSelectedFun = block
}
fun setonPageScrolledFun(block: (Int, Float, Int) -> Unit) {
this.onPageScrolledFun = block
}
fun setonPageScrollStateChangedFun(block: (Int) -> Unit) {
this.onPageScrollStateChangedFun = block
}
override fun onPageSelected(position: Int) {
onPageSelectedFun?.let { it(position) }
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
onPageScrolledFun?.let { it(position, positionOffset, positionOffsetPixels) }
}
override fun onPageScrollStateChanged(state: Int) {
onPageScrollStateChangedFun?.let { it(state) }
}
}
class ExtViewPageChangeListener : ViewPager.OnPageChangeListener {
private var onPageScrolledFun: ((Int, Float, Int) -> Unit)? = null
private var onPageSelectedFun: ((Int) -> Unit)? = null
private var onPageScrollStateChangedFun: ((Int) -> Unit)? = null
fun setOnPageScrolledFun(block: (Int, Float, Int) -> Unit) {
onPageScrolledFun = block
}
fun setOnPageSelectedFun(block: (Int) -> Unit) {
onPageSelectedFun = block
}
fun setOnPageScrollStateChangedFun(block: (Int) -> Unit) {
onPageScrollStateChangedFun = block
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
onPageScrolledFun?.let { it(position, positionOffset, positionOffsetPixels) }
}
override fun onPageSelected(position: Int) {
onPageSelectedFun?.let { it(position) }
}
override fun onPageScrollStateChanged(state: Int) {
onPageScrollStateChangedFun?.let { it(state) }
}
}
class ViewPageAdapter(fm: FragmentManager?, private var mFragments: List<Fragment>, private val mTitles: List<String>) : FragmentStatePagerAdapter(fm!!, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItem(position: Int): Fragment {
return mFragments[position]
}
override fun getCount(): Int {
return mFragments.size
}
override fun getPageTitle(position: Int): CharSequence {
return mTitles[position]
}
}
class ViewPage2Adapter(fm: FragmentManager, private var mFragments: List<Fragment>, lifecycle: Lifecycle) : FragmentStateAdapter(fm, lifecycle) {
override fun getItemCount(): Int = mFragments.size
override fun createFragment(position: Int): Fragment = mFragments[position]
}
private val dataSourceMap = WeakHashMap<BottomNavigationBar, DataSource>()
var BottomNavigationBar.dataSourceEtx: DataSource
set(value) {
dataSourceMap[this] = value
}
get(): DataSource {
return dataSourceMap[this] ?: DataSource().apply {
dataSourceMap[this@dataSourceEtx] = this
}
}
fun BottomNavigationBar.bottomNavigationBarHelper(dataSource: DataSource.() -> Unit, option: BottomNavigationBar.() -> Unit = {}, tabSelectedListener: ExtTabSelectedListener.() -> Unit): BottomNavigationBar {
dataSourceEtx = DataSource().apply(dataSource)
val listener = ExtTabSelectedListener().apply {
tabSelectedListener()
}
apply {
clearAll()
setMode(BottomNavigationBar.MODE_FIXED)
setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC)
dataSourceEtx.fragment.forEachIndexed { index, _ ->
addItem(BottomNavigationItem(dataSourceEtx.icon.elementAtOrElse(index) { 0 }, dataSourceEtx.tabTitles.elementAtOrElse(index) { "" }))
}
setFirstSelectedPosition(0)
elevation = 0.0F
option.invoke(this)
initialise()
setTabSelectedListener(listener)
}
return this
}
fun BottomNavigationBar.setUpWithViewPager(act: FragmentActivity? = null, bindViewPager: ViewPager? = null, viewPageChangeListener: ExtViewPageChangeListener.() -> Unit = {}) {
act ?: return
val listener = ExtViewPageChangeListener().apply {
viewPageChangeListener()
}
bindViewPager?.apply {
offscreenPageLimit = dataSourceEtx.fragment.size - 1
adapter = ViewPageAdapter(act.supportFragmentManager, dataSourceEtx.fragment, dataSourceEtx.tabTitles)
setOnPageChangeListener(listener)
}
}
fun BottomNavigationBar.setUpWithViewPager2(act: FragmentActivity? = null, bindViewPager: ViewPager2? = null, viewPage2ChangeListener: ExtViewPage2ChangeCallback.() -> Unit = {}) {
act ?: return
val listener = ExtViewPage2ChangeCallback().apply {
viewPage2ChangeListener()
}
bindViewPager?.apply {
offscreenPageLimit = dataSourceEtx.fragment.size - 1
adapter = ViewPage2Adapter(act.supportFragmentManager, dataSourceEtx.fragment, act.lifecycle)
registerOnPageChangeCallback(listener)
}
}
val Int.w: Int
get() = (this * application.resources.displayMetrics.widthPixels / DESIGN_WIDTH.toFloat()).toInt()
val Float.dp: Int
get() = (this * application.resources.displayMetrics.density + 0.5f).toInt()
val Int.dp: Int
get() = (this * application.resources.displayMetrics.density + 0.5f).toInt()
object EditConfig {
const val DESIGN_WIDTH = 375
}