Add MviKeyboardResizableFragment
This commit is contained in:
parent
b15356f672
commit
4732a67738
|
|
@ -6,6 +6,7 @@ dependencies {
|
||||||
implementation project(":lifecycle")
|
implementation project(":lifecycle")
|
||||||
implementation project(":kotlin-extensions")
|
implementation project(":kotlin-extensions")
|
||||||
implementation project(":logging")
|
implementation project(":logging")
|
||||||
|
implementation project(":utils")
|
||||||
|
|
||||||
implementation("androidx.core:core-ktx")
|
implementation("androidx.core:core-ktx")
|
||||||
implementation("androidx.appcompat:appcompat")
|
implementation("androidx.appcompat:appcompat")
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ import androidx.annotation.LayoutRes
|
||||||
import androidx.annotation.MainThread
|
import androidx.annotation.MainThread
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentActivity
|
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
|
@ -18,6 +17,7 @@ import ru.touchin.roboswag.mvi_arch.di.ViewModelAssistedFactory
|
||||||
import ru.touchin.roboswag.mvi_arch.di.ViewModelFactory
|
import ru.touchin.roboswag.mvi_arch.di.ViewModelFactory
|
||||||
import ru.touchin.roboswag.mvi_arch.marker.ViewAction
|
import ru.touchin.roboswag.mvi_arch.marker.ViewAction
|
||||||
import ru.touchin.roboswag.mvi_arch.marker.ViewState
|
import ru.touchin.roboswag.mvi_arch.marker.ViewState
|
||||||
|
import ru.touchin.roboswag.navigation_base.activities.BaseActivity
|
||||||
import ru.touchin.roboswag.navigation_base.fragments.BaseFragment
|
import ru.touchin.roboswag.navigation_base.fragments.BaseFragment
|
||||||
import ru.touchin.roboswag.navigation_base.fragments.EmptyState
|
import ru.touchin.roboswag.navigation_base.fragments.EmptyState
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
@ -48,7 +48,7 @@ import javax.inject.Inject
|
||||||
abstract class MviFragment<NavArgs, State, Action, VM>(
|
abstract class MviFragment<NavArgs, State, Action, VM>(
|
||||||
@LayoutRes layout: Int,
|
@LayoutRes layout: Int,
|
||||||
navArgs: NavArgs = EmptyState as NavArgs
|
navArgs: NavArgs = EmptyState as NavArgs
|
||||||
) : BaseFragment<FragmentActivity>(layout)
|
) : BaseFragment<BaseActivity>(layout)
|
||||||
where NavArgs : Parcelable,
|
where NavArgs : Parcelable,
|
||||||
State : ViewState,
|
State : ViewState,
|
||||||
Action : ViewAction,
|
Action : ViewAction,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
package ru.touchin.roboswag.mvi_arch.core
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Parcelable
|
||||||
|
import android.view.View
|
||||||
|
import androidx.annotation.LayoutRes
|
||||||
|
import androidx.lifecycle.LifecycleObserver
|
||||||
|
import ru.touchin.roboswag.components.utils.hideSoftInput
|
||||||
|
import ru.touchin.roboswag.mvi_arch.marker.ViewAction
|
||||||
|
import ru.touchin.roboswag.mvi_arch.marker.ViewState
|
||||||
|
import ru.touchin.roboswag.navigation_base.activities.OnBackPressedListener
|
||||||
|
import ru.touchin.roboswag.navigation_base.keyboard_resizeable.KeyboardBehaviorDetector
|
||||||
|
|
||||||
|
abstract class MviKeyboardResizableFragment<NavArgs, State, Action, VM>(
|
||||||
|
@LayoutRes layout: Int
|
||||||
|
) : MviFragment<NavArgs, State, Action, VM>(layout)
|
||||||
|
where NavArgs : Parcelable,
|
||||||
|
State : ViewState,
|
||||||
|
Action : ViewAction,
|
||||||
|
VM : MviViewModel<NavArgs, Action, State> {
|
||||||
|
|
||||||
|
private var isKeyboardVisible: Boolean = false
|
||||||
|
|
||||||
|
private val keyboardHideListener = OnBackPressedListener {
|
||||||
|
if (isKeyboardVisible) {
|
||||||
|
activity.hideSoftInput()
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var isHideKeyboardOnBackEnabled = false
|
||||||
|
|
||||||
|
protected open fun onKeyboardShow(diff: Int = 0) {}
|
||||||
|
|
||||||
|
protected open fun onKeyboardHide() {}
|
||||||
|
|
||||||
|
protected fun hideKeyboardOnBackPressed() {
|
||||||
|
isHideKeyboardOnBackEnabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
activity.keyboardBehaviorDetector = KeyboardBehaviorDetector(activity)
|
||||||
|
|
||||||
|
view.requestApplyInsets()
|
||||||
|
lifecycle.addObserver(activity.keyboardBehaviorDetector as LifecycleObserver)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
if (isHideKeyboardOnBackEnabled) activity.addOnBackPressedListener(keyboardHideListener)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
notifyKeyboardHidden()
|
||||||
|
if (isHideKeyboardOnBackEnabled) activity.removeOnBackPressedListener(keyboardHideListener)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStart() {
|
||||||
|
super.onStart()
|
||||||
|
activity.keyboardBehaviorDetector?.apply {
|
||||||
|
keyboardHideListener = {
|
||||||
|
if (isKeyboardVisible) {
|
||||||
|
onKeyboardHide()
|
||||||
|
}
|
||||||
|
isKeyboardVisible = false
|
||||||
|
}
|
||||||
|
keyboardShowListener = { diff ->
|
||||||
|
onKeyboardShow(diff)
|
||||||
|
isKeyboardVisible = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStop() {
|
||||||
|
super.onStop()
|
||||||
|
activity.keyboardBehaviorDetector?.apply {
|
||||||
|
keyboardHideListener = null
|
||||||
|
keyboardShowListener = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notifyKeyboardHidden() {
|
||||||
|
if (isKeyboardVisible) onKeyboardHide()
|
||||||
|
isKeyboardVisible = false
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue