diff --git a/android/src/workspace/tiles/VncTile.tsx b/android/src/workspace/tiles/VncTile.tsx index b1b4c67..ab538b0 100644 --- a/android/src/workspace/tiles/VncTile.tsx +++ b/android/src/workspace/tiles/VncTile.tsx @@ -11,7 +11,7 @@ */ import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { NativeSyntheticEvent, ScrollView, StyleSheet, Text, TextInput, TextInputChangeEventData, TextInputKeyPressEventData, TouchableOpacity, View } from 'react-native'; +import { Keyboard, NativeSyntheticEvent, ScrollView, StyleSheet, Text, TextInput, TextInputChangeEventData, TextInputKeyPressEventData, TouchableOpacity, View } from 'react-native'; import { WebView, WebViewMessageEvent } from 'react-native-webview'; import desktop from '../../services/desktop'; import { NOVNC_HTML } from '../assets/novncHtml'; @@ -58,6 +58,16 @@ const VncTile: React.FC = ({ projectId, focused, port = 5901 }) => { return () => teardown(); }, [focused, teardown]); + // Button-Zustand an die ECHTE Tastatur-Sichtbarkeit koppeln: Androids + // Zurueck-Taste blendet die Tastatur aus, ohne den TextInput zu blurren — + // ueber keyboardDidHide setzen wir das ⌨-Symbol trotzdem zurueck. + useEffect(() => { + if (!focused) return; + const show = Keyboard.addListener('keyboardDidShow', () => setKbdOn(true)); + const hide = Keyboard.addListener('keyboardDidHide', () => setKbdOn(false)); + return () => { show.remove(); hide.remove(); }; + }, [focused]); + const ctl = useCallback((fn: string) => { webRef.current?.injectJavaScript(`window.ariaVncCtl && window.ariaVncCtl.${fn}(); true;`); }, []); @@ -99,11 +109,13 @@ const VncTile: React.FC = ({ projectId, focused, port = 5901 }) => { else webRef.current?.injectJavaScript(`window.ariaVncKey && window.ariaVncKey.char(${cp}); true;`); }, [activeMods, sendCombo, clearMods]); - // Tastatur ein-/ausblenden: echtes RN- fokussieren → Android oeffnet - // die Software-Tastatur zuverlaessig (anders als ein verstecktes WebView-Feld). + // Tastatur ein-/ausblenden. Oeffnen: blur→focus erzwingt das Aufklappen auch + // dann, wenn der TextInput noch fokussiert ist (Tastatur per Zurueck-Taste + // versteckt). Schliessen: Keyboard.dismiss(); den Button-Zustand setzt der + // keyboardDidShow/Hide-Listener — nicht hier —, damit er nie „haengen" bleibt. const toggleKbd = useCallback(() => { - if (kbdOn) { kbdRef.current?.blur(); setKbdOn(false); } - else { setKbdOn(true); setTimeout(() => kbdRef.current?.focus(), 0); } + if (kbdOn) { Keyboard.dismiss(); } + else { kbdRef.current?.blur(); setTimeout(() => kbdRef.current?.focus(), 30); } }, [kbdOn]); // Druckbare Zeichen: Prefix-Diff des (wachsenden) Feldes → nur neu Getipptes an @@ -182,7 +194,6 @@ const VncTile: React.FC = ({ projectId, focused, port = 5901 }) => { onChange={onKbdChange} onKeyPress={onKbdKeyPress} onSubmitEditing={() => pressKey(KEYSYM.Enter)} - onBlur={() => setKbdOn(false)} keyboardType="visible-password" returnKeyType="send" autoCapitalize="none"