From cd2e4df2a875275e7cbb15be9f7e3654bb8a64c2 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Wed, 10 Dec 2025 20:09:48 +0100 Subject: [PATCH] v1.1.10: Fix keyboard opening on navigation in Android TV - Added ExcludeFocus and readOnly: !_isEditing to _TVTextField - Prevents keyboard from opening during D-pad navigation - Ensures keyboard only opens when strictly intended by _activateInput --- .../iptv/screens/mobile_playlist_screen.dart | 38 ++++++++++--------- .../iptv/widgets/mobile_settings_tab.dart | 2 +- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/lib/mobile/features/iptv/screens/mobile_playlist_screen.dart b/lib/mobile/features/iptv/screens/mobile_playlist_screen.dart index dc23025..e26f565 100644 --- a/lib/mobile/features/iptv/screens/mobile_playlist_screen.dart +++ b/lib/mobile/features/iptv/screens/mobile_playlist_screen.dart @@ -626,23 +626,26 @@ class _TVTextFieldState extends State<_TVTextField> { border: isFocused ? Border.all(color: AppColors.primary, width: 2) : null, borderRadius: BorderRadius.circular(4), ), - child: TextField( - controller: widget.controller, - focusNode: _inputFocus, - obscureText: widget.obscureText, - keyboardType: widget.keyboardType, - textInputAction: widget.textAction, - onSubmitted: (_) { - setState(() => _isEditing = false); - // Give focus back to nav node first so we can move to next - _navFocus.requestFocus(); - widget.onSubmitted?.call(); - }, - style: const TextStyle(color: AppColors.textPrimary), - // Important: Disable standard focus behavior to prevent keyboard popup - // unless we explicitly requested it via _activateInput - canRequestFocus: _isEditing, - decoration: InputDecoration( + // Ignore standard focus traversal to child, only allow programatic focus + child: ExcludeFocus( + excluding: !_isEditing, + child: TextField( + controller: widget.controller, + focusNode: _inputFocus, + // Prevent keyboard if somehow focused while not editing + readOnly: !_isEditing, + showCursor: _isEditing, + obscureText: widget.obscureText, + keyboardType: widget.keyboardType, + textInputAction: widget.textAction, + onSubmitted: (_) { + setState(() => _isEditing = false); + // Give focus back to nav node first so we can move to next + _navFocus.requestFocus(); + widget.onSubmitted?.call(); + }, + style: const TextStyle(color: AppColors.textPrimary), + decoration: InputDecoration( labelText: widget.label, hintText: widget.hint, prefixIcon: Icon(widget.icon, color: isFocused ? AppColors.primary : AppColors.textSecondary), @@ -658,6 +661,7 @@ class _TVTextFieldState extends State<_TVTextField> { ), ), ), + ), ); } ), diff --git a/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart b/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart index a9a26e4..c6d1b7c 100644 --- a/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart @@ -108,7 +108,7 @@ class _MobileSettingsTabState extends ConsumerState { ), SizedBox(height: 4), Text( - 'Version 1.1.9', + 'Version 1.1.10', style: TextStyle( fontSize: 13, color: AppColors.textSecondary,