feat: Add account initialization in ProtocolManager and enhance keyboard handling on screen exit
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package com.rosetta.messenger.ui.components
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
@@ -38,10 +39,29 @@ class KeyboardManager(
|
||||
private val context: Context
|
||||
) {
|
||||
/**
|
||||
* Скрыть клавиатуру мгновенно (WindowInsetsController - API 30+)
|
||||
* 🔥 Скрыть клавиатуру СИНХРОННО и МГНОВЕННО
|
||||
* Использует InputMethodManager - самый надёжный способ
|
||||
*/
|
||||
fun hideNow() {
|
||||
// 1. Убираем фокус с текущего view
|
||||
view.clearFocus()
|
||||
|
||||
// 2. InputMethodManager - синхронное скрытие
|
||||
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
|
||||
imm?.hideSoftInputFromWindow(view.windowToken, 0)
|
||||
|
||||
// 3. WindowInsetsController как backup
|
||||
try {
|
||||
ViewCompat.getWindowInsetsController(view)?.hide(WindowInsetsCompat.Type.ime())
|
||||
} catch (e: Exception) {
|
||||
// Ignore
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Скрыть клавиатуру (асинхронно через WindowInsetsController)
|
||||
*/
|
||||
fun hide() {
|
||||
// WindowInsetsController - самый быстрый способ (API 30+)
|
||||
ViewCompat.getWindowInsetsController(view)?.hide(WindowInsetsCompat.Type.ime())
|
||||
}
|
||||
|
||||
@@ -86,6 +106,8 @@ fun rememberKeyboardController(): KeyboardManager {
|
||||
/**
|
||||
* 🔥 Автоматически скрывает клавиатуру при выходе с экрана (onDispose)
|
||||
*
|
||||
* ВАЖНО: Это backup. Основное скрытие должно быть в hideKeyboardAndBack()
|
||||
*
|
||||
* Добавьте в начало любого Composable экрана с клавиатурой:
|
||||
* ```kotlin
|
||||
* @Composable
|
||||
@@ -99,14 +121,11 @@ fun rememberKeyboardController(): KeyboardManager {
|
||||
@Composable
|
||||
fun HideKeyboardOnDispose() {
|
||||
val keyboard = rememberKeyboardController()
|
||||
val keyboardController = LocalSoftwareKeyboardController.current
|
||||
|
||||
DisposableEffect(Unit) {
|
||||
onDispose {
|
||||
// WindowInsetsController - мгновенное скрытие
|
||||
keyboard.hide()
|
||||
// Fallback для Compose
|
||||
keyboardController?.hide()
|
||||
// Backup скрытие при dispose
|
||||
keyboard.hideNow()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -120,17 +139,14 @@ fun HideKeyboardOnDispose() {
|
||||
@Composable
|
||||
fun HideKeyboardAndClearFocusOnDispose() {
|
||||
val keyboard = rememberKeyboardController()
|
||||
val keyboardController = LocalSoftwareKeyboardController.current
|
||||
val focusManager = LocalFocusManager.current
|
||||
|
||||
DisposableEffect(Unit) {
|
||||
onDispose {
|
||||
// Сбрасываем фокус
|
||||
focusManager.clearFocus(force = true)
|
||||
// WindowInsetsController - мгновенное скрытие
|
||||
keyboard.hide()
|
||||
// Fallback для Compose
|
||||
keyboardController?.hide()
|
||||
// Мгновенное скрытие
|
||||
keyboard.hideNow()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user