diff --git a/app/src/main/java/com/rosetta/messenger/MainActivity.kt b/app/src/main/java/com/rosetta/messenger/MainActivity.kt index 666ac1a..62972e7 100644 --- a/app/src/main/java/com/rosetta/messenger/MainActivity.kt +++ b/app/src/main/java/com/rosetta/messenger/MainActivity.kt @@ -20,7 +20,12 @@ import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.platform.LocalView import androidx.core.content.ContextCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.FragmentActivity import androidx.lifecycle.lifecycleScope import com.google.firebase.FirebaseApp @@ -586,6 +591,9 @@ fun MainScreen( // Load username AND name from AccountManager (persisted in DataStore) val context = LocalContext.current + val keyboardController = LocalSoftwareKeyboardController.current + val focusManager = LocalFocusManager.current + val rootView = LocalView.current val callScope = rememberCoroutineScope() val callUiState by CallManager.state.collectAsState() var pendingOutgoingCall by remember { mutableStateOf(null) } @@ -757,6 +765,20 @@ fun MainScreen( CallManager.bindAccount(accountPublicKey) } + LaunchedEffect(callUiState.isVisible) { + if (callUiState.isVisible) { + keyboardController?.hide() + focusManager.clearFocus(force = true) + + // Fallback for cases where IME survives focus reset due to window transitions. + val activity = rootView.context as? android.app.Activity + activity?.window?.let { window -> + WindowCompat.getInsetsController(window, rootView) + ?.hide(WindowInsetsCompat.Type.ime()) + } + } + } + LaunchedEffect(accountPublicKey, reloadTrigger) { if (accountPublicKey.isNotBlank()) { val accountManager = AccountManager(context)