diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/FullscreenBottomSheetDialog.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/FullscreenBottomSheetDialog.kt index 4735f76..bd6f66d 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/FullscreenBottomSheetDialog.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/FullscreenBottomSheetDialog.kt @@ -1,78 +1,24 @@ package ru.touchin.roboswag.mvi_arch.core import android.app.Dialog -import android.content.Context -import android.os.Bundle import android.os.Parcelable -import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.FrameLayout -import androidx.activity.OnBackPressedCallback import androidx.annotation.LayoutRes -import androidx.annotation.MainThread -import androidx.core.os.bundleOf -import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import ru.touchin.mvi_arch.R import ru.touchin.roboswag.components.utils.setResizableListener -import ru.touchin.roboswag.mvi_arch.di.ViewModelAssistedFactory -import ru.touchin.roboswag.mvi_arch.di.ViewModelFactory import ru.touchin.roboswag.mvi_arch.marker.ViewAction import ru.touchin.roboswag.mvi_arch.marker.ViewState -import javax.inject.Inject abstract class FullscreenBottomSheetDialog( - @LayoutRes private val layoutId: Int -) : BottomSheetDialogFragment(), IMvi + @LayoutRes layoutId: Int +) : MviBottomSheet(layoutId) where NavArgs : Parcelable, Action : ViewAction, State : ViewState, VM : MviViewModel { - @Inject - lateinit var viewModelMap: MutableMap, ViewModelAssistedFactory> - - protected lateinit var state: NavArgs - protected var bottomSheet: FrameLayout? = null - protected abstract fun injectDependencies() - - @MainThread - protected inline fun viewModel(): Lazy = - lazy { - val fragmentArguments = arguments ?: bundleOf() - - ViewModelProvider( - viewModelStore, - ViewModelFactory(viewModelMap, this, fragmentArguments) - ).get(ViewModel::class.java) - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setStyle(STYLE_NORMAL, R.style.RoundedCornersBottomSheetDialogTheme) - (savedInstanceState ?: arguments)?.getParcelable(MviFragment.INIT_ARGS_KEY)?.let { savedState -> - state = savedState - } - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - inflater.inflate(layoutId, container, false) - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - viewModel.state.observe(viewLifecycleOwner, Observer(this::renderState)) - } - - override fun onAttach(context: Context) { - super.onAttach(context) - injectDependencies() - } - override fun onStart() { super.onStart() @@ -80,21 +26,8 @@ abstract class FullscreenBottomSheetDialog( bottomSheet?.layoutParams?.height = ViewGroup.LayoutParams.MATCH_PARENT } - override fun addOnBackPressedCallback(action: Action) { - requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - dispatchAction(action) - } - }) - } - override fun setupDialog(dialog: Dialog, style: Int) { dialog.setResizableListener() } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putParcelable(MviFragment.INIT_ARGS_KEY, state) - } - } diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviBottomSheet.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviBottomSheet.kt new file mode 100644 index 0000000..b1ec18b --- /dev/null +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviBottomSheet.kt @@ -0,0 +1,84 @@ +package ru.touchin.roboswag.mvi_arch.core + +import android.content.Context +import android.os.Bundle +import android.os.Parcelable +import android.view.LayoutInflater +import android.view.View +import androidx.lifecycle.Observer +import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback +import androidx.annotation.LayoutRes +import androidx.annotation.MainThread +import androidx.core.os.bundleOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import ru.touchin.mvi_arch.R +import ru.touchin.roboswag.mvi_arch.di.ViewModelAssistedFactory +import ru.touchin.roboswag.mvi_arch.di.ViewModelFactory +import ru.touchin.roboswag.mvi_arch.marker.ViewAction +import ru.touchin.roboswag.mvi_arch.marker.ViewState +import javax.inject.Inject + +abstract class MviBottomSheet( + @LayoutRes private val layoutId: Int +) : BottomSheetDialogFragment(), IMvi + where NavArgs : Parcelable, + Action : ViewAction, + State : ViewState, + VM : MviViewModel { + + @Inject + lateinit var viewModelMap: MutableMap, ViewModelAssistedFactory> + + protected lateinit var state: NavArgs + + protected abstract fun injectDependencies() + + @MainThread + protected inline fun viewModel(): Lazy = + lazy { + val fragmentArguments = arguments ?: bundleOf() + + ViewModelProvider( + viewModelStore, + ViewModelFactory(viewModelMap, this, fragmentArguments) + ).get(ViewModel::class.java) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NORMAL, R.style.RoundedCornersBottomSheetDialogTheme) + (savedInstanceState ?: arguments)?.getParcelable(MviFragment.INIT_ARGS_KEY)?.let { savedState -> + state = savedState + } + } + + override fun onAttach(context: Context) { + super.onAttach(context) + injectDependencies() + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = + inflater.inflate(layoutId, container, false) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + viewModel.state.observe(viewLifecycleOwner, Observer(this::renderState)) + } + + override fun addOnBackPressedCallback(action: Action) { + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + dispatchAction(action) + } + }) + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putParcelable(MviFragment.INIT_ARGS_KEY, state) + } + +}