Add MviKeyboardResizableFragment

This commit is contained in:
Kirill Nayduik 2021-07-02 11:31:08 +03:00
parent b15356f672
commit 4732a67738
3 changed files with 94 additions and 2 deletions

View File

@ -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")

View File

@ -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,

View File

@ -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
}
}