Add MviKeyboardResizableFragment
This commit is contained in:
parent
b15356f672
commit
4732a67738
|
|
@ -6,6 +6,7 @@ dependencies {
|
|||
implementation project(":lifecycle")
|
||||
implementation project(":kotlin-extensions")
|
||||
implementation project(":logging")
|
||||
implementation project(":utils")
|
||||
|
||||
implementation("androidx.core:core-ktx")
|
||||
implementation("androidx.appcompat:appcompat")
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import androidx.annotation.LayoutRes
|
|||
import androidx.annotation.MainThread
|
||||
import androidx.core.os.bundleOf
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModel
|
||||
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.marker.ViewAction
|
||||
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.EmptyState
|
||||
import javax.inject.Inject
|
||||
|
|
@ -48,7 +48,7 @@ import javax.inject.Inject
|
|||
abstract class MviFragment<NavArgs, State, Action, VM>(
|
||||
@LayoutRes layout: Int,
|
||||
navArgs: NavArgs = EmptyState as NavArgs
|
||||
) : BaseFragment<FragmentActivity>(layout)
|
||||
) : BaseFragment<BaseActivity>(layout)
|
||||
where NavArgs : Parcelable,
|
||||
State : ViewState,
|
||||
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