В Android-проекте Авито все точки входа в экраны наследуются от базовых сущностей, таких как BaseActivity, BaseFragment и других, поэтому обработки WindowInsets мы решили добавить именно в эти базовые сущности, чтобы они по дефолту применились для всех экранов.
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { v, insets ->...}}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets ->...}}
abstract class BaseActivity : AppCompatActivity() {override fun setTheme(theme: Resources.Theme?) {super.setTheme(theme)overrideSystemBarsColors()}override fun setTheme(resId: Int) {super.setTheme(resId)overrideSystemBarsColors()}private fun overrideSystemBarsColors() {window.apply {statusBarColor = Color.TRANSPARENTnavigationBarColor = Color.TRANSPARENT}}}
fun View.handleImeInsetIfNeeded() {var originalPaddingBottom: Int? = nullViewCompat.setWindowInsetsAnimationCallback(this,object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) {override fun onStart(animation: WindowInsetsAnimationCompat,bounds: WindowInsetsAnimationCompat.BoundsCompat): WindowInsetsAnimationCompat.BoundsCompat {// Эта функция вызывается в начале анимации и уже после применения системных инсетов,// поэтому оригинальный паддинг сохраняем тут единожды,// чтобы при скрытии клавиатуры его восстановитьif (originalPaddingBottom == null) {originalPaddingBottom = this@handleImeInsetIfNeeded.paddingBottom}return bounds}override fun onProgress(insets: WindowInsetsCompat,runningAnimations: MutableList<WindowInsetsAnimationCompat>): WindowInsetsCompat {// Если нет анимации клавиатуры, выйти из методаrunningAnimations.find { it.typeMask and WindowInsetsCompat.Type.ime() != 0 }?: return insets// Берем инсет клавиатуры на данном шаге анимацииval imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottomthis@handleImeInsetIfNeeded.updatePadding(// Берем максимальное от оригинального паддинга или клавиатуры,// чтобы при скрытии клавиатуры выставленный ранее паддинг системных панелей не занулилсяbottom = max(imeHeight, originalPaddingBottom ?: 0),)return insets}})