From e7b6ec740a9d2ebe6e4010ce5870cabd972af881 Mon Sep 17 00:00:00 2001 From: Rinat Nurmukhametov Date: Mon, 16 Aug 2021 13:30:21 +0300 Subject: [PATCH 1/5] add mvi interface to mvi fragment --- .../ru/touchin/roboswag/mvi_arch/core/IMvi.kt | 80 +++++++++++++++++++ .../roboswag/mvi_arch/core/MviFragment.kt | 65 +-------------- 2 files changed, 82 insertions(+), 63 deletions(-) create mode 100644 mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt new file mode 100644 index 0000000..e30d1ed --- /dev/null +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt @@ -0,0 +1,80 @@ +package ru.touchin.roboswag.mvi_arch.core + +import android.os.Parcelable +import android.view.View +import ru.touchin.extensions.setOnRippleClickListener +import ru.touchin.roboswag.mvi_arch.marker.ViewAction +import ru.touchin.roboswag.mvi_arch.marker.ViewState + +/** + * Interface with the main MVI methods and fields + */ +interface IMvi + where NavArgs : Parcelable, + State : ViewState, + Action : ViewAction, + VM : MviViewModel { + + /** + * Use [viewModel] extension to get an instance of your view model class. + */ + val viewModel: VM + + /** + * Use this method to subscribe on view state changes. + * + * You should render view state here. + * + * Must not be called before [onAttach] and after [onDetach]. + */ + fun renderState(viewState: State) {} + + /** + * Use this method to dispatch view actions to view model. + */ + fun dispatchAction(actionProvider: () -> Action) { + viewModel.dispatchAction(actionProvider.invoke()) + } + + /** + * Use this method to dispatch view actions to view model. + */ + fun dispatchAction(action: Action) { + viewModel.dispatchAction(action) + } + + fun addOnBackPressedCallback(actionProvider: () -> Action) { + addOnBackPressedCallback(actionProvider.invoke()) + } + + fun addOnBackPressedCallback(action: Action) + + /** + * Simple extension for dispatching view events to view model with on click. + */ + fun View.dispatchActionOnClick(actionProvider: () -> Action) { + setOnClickListener { dispatchAction(actionProvider) } + } + + /** + * Simple extension for dispatching view events to view model with on click. + */ + fun View.dispatchActionOnClick(action: Action) { + setOnClickListener { dispatchAction(action) } + } + + /** + * Simple extension for dispatching view events to view model with on ripple click. + */ + fun View.dispatchActionOnRippleClick(actionProvider: () -> Action) { + setOnRippleClickListener { dispatchAction(actionProvider) } + } + + /** + * Simple extension for dispatching view events to view model with on ripple click. + */ + fun View.dispatchActionOnRippleClick(action: Action) { + setOnRippleClickListener { dispatchAction(action) } + } + +} \ No newline at end of file diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt index 2399f4d..d89714f 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt @@ -12,7 +12,6 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import ru.touchin.extensions.setOnRippleClickListener import ru.touchin.roboswag.mvi_arch.di.ViewModelAssistedFactory import ru.touchin.roboswag.mvi_arch.di.ViewModelFactory import ru.touchin.roboswag.mvi_arch.marker.ViewAction @@ -47,7 +46,7 @@ import javax.inject.Inject */ abstract class MviFragment( @LayoutRes layout: Int -) : BaseFragment(layout) +) : BaseFragment(layout), IMvi where NavArgs : Parcelable, State : ViewState, Action : ViewAction, @@ -57,11 +56,6 @@ abstract class MviFragment( const val INIT_ARGS_KEY = "INIT_ARGS" } - /** - * Use [viewModel] extension to get an instance of your view model class. - */ - protected abstract val viewModel: VM - /** * Used for smooth view model injection to this class. */ @@ -86,34 +80,7 @@ abstract class MviFragment( viewModel.state.observe(viewLifecycleOwner, Observer(this::renderState)) } - /** - * Use this method to subscribe on view state changes. - * - * You should render view state here. - * - * Must not be called before [onAttach] and after [onDetach]. - */ - protected open fun renderState(viewState: State) {} - - /** - * Use this method to dispatch view actions to view model. - */ - protected fun dispatchAction(actionProvider: () -> Action) { - viewModel.dispatchAction(actionProvider.invoke()) - } - - /** - * Use this method to dispatch view actions to view model. - */ - protected fun dispatchAction(action: Action) { - viewModel.dispatchAction(action) - } - - protected fun addOnBackPressedCallback(actionProvider: () -> Action) { - addOnBackPressedCallback(actionProvider.invoke()) - } - - protected fun addOnBackPressedCallback(action: Action) { + override fun addOnBackPressedCallback(action: Action) { requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { dispatchAction(action) @@ -137,32 +104,4 @@ abstract class MviFragment( ).get(ViewModel::class.java) } - /** - * Simple extension for dispatching view events to view model with on click. - */ - protected fun View.dispatchActionOnClick(actionProvider: () -> Action) { - setOnClickListener { dispatchAction(actionProvider) } - } - - /** - * Simple extension for dispatching view events to view model with on click. - */ - protected fun View.dispatchActionOnClick(action: Action) { - setOnClickListener { dispatchAction(action) } - } - - /** - * Simple extension for dispatching view events to view model with on ripple click. - */ - protected fun View.dispatchActionOnRippleClick(actionProvider: () -> Action) { - setOnRippleClickListener { dispatchAction(actionProvider) } - } - - /** - * Simple extension for dispatching view events to view model with on ripple click. - */ - protected fun View.dispatchActionOnRippleClick(action: Action) { - setOnRippleClickListener { dispatchAction(action) } - } - } From 1a63c13680b29562d8b797152f80bdf5bf2ac92f Mon Sep 17 00:00:00 2001 From: Rinat Nurmukhametov Date: Mon, 16 Aug 2021 14:40:12 +0300 Subject: [PATCH 2/5] changed the location of the parameters --- .../main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt index e30d1ed..44a2125 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt @@ -9,11 +9,8 @@ import ru.touchin.roboswag.mvi_arch.marker.ViewState /** * Interface with the main MVI methods and fields */ -interface IMvi - where NavArgs : Parcelable, - State : ViewState, - Action : ViewAction, - VM : MviViewModel { +interface IMvi + where VM : MviViewModel { /** * Use [viewModel] extension to get an instance of your view model class. From e97d8dcafbced9ea7c37a2354cae37362c12b84a Mon Sep 17 00:00:00 2001 From: Rinat Nurmukhametov Date: Mon, 16 Aug 2021 15:11:55 +0300 Subject: [PATCH 3/5] return generic style --- .../main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt | 7 +++++-- .../java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt index 44a2125..3fdc70f 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt @@ -9,8 +9,11 @@ import ru.touchin.roboswag.mvi_arch.marker.ViewState /** * Interface with the main MVI methods and fields */ -interface IMvi - where VM : MviViewModel { +interface IMvi + where NavArgs : Parcelable, + State : ViewState, + Action : ViewAction, + VM : MviViewModel { /** * Use [viewModel] extension to get an instance of your view model class. diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt index e57a4e5..6cc9fc5 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt @@ -46,7 +46,7 @@ import javax.inject.Inject */ abstract class MviFragment( @LayoutRes layout: Int -) : BaseFragment(layout), IMvi +) : BaseFragment(layout), IMvi where NavArgs : Parcelable, State : ViewState, Action : ViewAction, From ac42f0322e3c02b6e1fd44777c68555e6b71bedd Mon Sep 17 00:00:00 2001 From: Rinat Nurmukhametov Date: Mon, 16 Aug 2021 15:20:09 +0300 Subject: [PATCH 4/5] add new line --- .../src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt index 3fdc70f..67e8776 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt @@ -77,4 +77,4 @@ interface IMvi setOnRippleClickListener { dispatchAction(action) } } -} \ No newline at end of file +} From 020b112f881830d35a158c9f6f1ea0863a1bcb6b Mon Sep 17 00:00:00 2001 From: Rinat Nurmukhametov Date: Tue, 17 Aug 2021 00:10:29 +0300 Subject: [PATCH 5/5] returned location --- .../src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt | 2 +- .../main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt index 67e8776..265a339 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/IMvi.kt @@ -9,7 +9,7 @@ import ru.touchin.roboswag.mvi_arch.marker.ViewState /** * Interface with the main MVI methods and fields */ -interface IMvi +interface IMvi where NavArgs : Parcelable, State : ViewState, Action : ViewAction, diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt index 6cc9fc5..e57a4e5 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviFragment.kt @@ -46,7 +46,7 @@ import javax.inject.Inject */ abstract class MviFragment( @LayoutRes layout: Int -) : BaseFragment(layout), IMvi +) : BaseFragment(layout), IMvi where NavArgs : Parcelable, State : ViewState, Action : ViewAction,