import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelProvider
import androidx.viewbinding.ViewBinding
import com.net.shop.R
import com.net.shop.utils.DialogUtils
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.net.shop.http.base.BaseViewModel
abstract class BaseBottomSheetDialogFragment<VB : ViewBinding>(val bindingBlock: (LayoutInflater, ViewGroup?, Boolean) -> VB) : BottomSheetDialogFragment(){
private lateinit var _binding: VB
protected val binding get() = _binding
fun <T : BaseViewModel> getViewModel(clz: Class<T>) = ViewModelProvider(this)[clz]
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.CustomBottomSheetDialogTheme)
}
override fun onStart() {
setup()
super.onStart()
val behavior = getBehavior()
if (behavior != null) {
behavior.isHideable = false
view?.postDelayed({ behavior.state = BottomSheetBehavior.STATE_EXPANDED }, 300)
}
getBehavior()?.setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, newState: Int) {
if(newState == BottomSheetBehavior.STATE_DRAGGING){
getBehavior()?.state = BottomSheetBehavior.STATE_EXPANDED
}
}
override fun onSlide(bottomSheet: View, slideOffset: Float) {
}
})
}
private fun setup() {
val behavior: BottomSheetBehavior<*>? = getBehavior()
behavior?.skipCollapsed = true
behavior?.peekHeight = 0
behavior?.isHideable = false
}
open fun getBehavior(): BottomSheetBehavior<*>? {
try {
return (dialog as? BottomSheetDialog)?.behavior
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = bindingBlock(inflater, container, false)
return _binding.root
}
private fun setWindowTransparent() {
val window = dialog?.window
val windowParams = window?.attributes
windowParams?.dimAmount = 0.0f
window?.attributes = windowParams
}
fun showDialog(clz: DialogFragment, tag: String) {
activity?.let {
if(!it.isFinishing && !it.isDestroyed){
DialogUtils.showDialog(clz, childFragmentManager, tag)
}
}
}
fun getActivity(block : (activity: FragmentActivity) -> Unit){
activity?.let { _act ->
if(!_act.isFinishing && !_act.isDestroyed){
block(_act)
}
}
}
}