chore(tv): guard text input diagnostics

This commit is contained in:
edde746
2026-05-21 00:42:19 +02:00
parent 0582ab2947
commit f4c83bedc0
6 changed files with 38 additions and 24 deletions
@@ -41,6 +41,7 @@ class MainActivity : FlutterActivity() {
companion object {
private const val TAG = "MainActivity"
private const val TEXT_INPUT_DIAGNOSTICS_ENABLED = false
var usingSkia = false
}
@@ -54,6 +55,12 @@ class MainActivity : FlutterActivity() {
private var watchNextPlugin: WatchNextPlugin? = null
private var nativeTextInputFocused = false
private inline fun logTextInputDiag(message: () -> String) {
if (TEXT_INPUT_DIAGNOSTICS_ENABLED) {
Log.i(TAG, "TextInputDiag ${message()}")
}
}
// Auto PiP state
private var autoPipReady = false
private var autoPipWidth: Int = 16
@@ -118,7 +125,7 @@ class MainActivity : FlutterActivity() {
private fun shouldForwardDpadBeforeIme(): Boolean {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
val forward = !nativeTextInputFocused && !isImeVisible() && !imm.isAcceptingText
Log.i(TAG, "TextInputDiag shouldForwardDpadBeforeIme=$forward ${describeImeState()}")
logTextInputDiag { "shouldForwardDpadBeforeIme=$forward ${describeImeState()}" }
return forward
}
@@ -184,7 +191,7 @@ class MainActivity : FlutterActivity() {
val wrapper = object : FrameLayout(this) {
override fun dispatchKeyEventPreIme(event: KeyEvent): Boolean {
if (isDpadKeyCode(event.keyCode)) {
Log.i(TAG, "TextInputDiag preIme received ${describeKeyEvent(event)} ${describeImeState()}")
logTextInputDiag { "preIme received ${describeKeyEvent(event)} ${describeImeState()}" }
}
when (event.keyCode) {
KeyEvent.KEYCODE_DPAD_UP,
@@ -193,16 +200,16 @@ class MainActivity : FlutterActivity() {
KeyEvent.KEYCODE_DPAD_RIGHT,
KeyEvent.KEYCODE_DPAD_CENTER -> {
if (shouldForwardDpadBeforeIme()) {
Log.i(TAG, "TextInputDiag preIme forwarding-to-Flutter-and-consuming ${describeKeyEvent(event)}")
logTextInputDiag { "preIme forwarding-to-Flutter-and-consuming ${describeKeyEvent(event)}" }
super.dispatchKeyEvent(event)
return true
}
Log.i(TAG, "TextInputDiag preIme letting-IME-handle ${describeKeyEvent(event)}")
logTextInputDiag { "preIme letting-IME-handle ${describeKeyEvent(event)}" }
}
}
val handled = super.dispatchKeyEventPreIme(event)
if (isDpadKeyCode(event.keyCode)) {
Log.i(TAG, "TextInputDiag preIme superResult=$handled ${describeKeyEvent(event)} ${describeImeState()}")
logTextInputDiag { "preIme superResult=$handled ${describeKeyEvent(event)} ${describeImeState()}" }
}
return handled
}
@@ -232,11 +239,13 @@ class MainActivity : FlutterActivity() {
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if (isDpadKeyCode(event.keyCode)) {
Log.i(TAG, "TextInputDiag activity.dispatchKeyEvent before ${describeKeyEvent(event)} ${describeImeState()}")
logTextInputDiag { "activity.dispatchKeyEvent before ${describeKeyEvent(event)} ${describeImeState()}" }
}
val handled = super.dispatchKeyEvent(event)
if (isDpadKeyCode(event.keyCode)) {
Log.i(TAG, "TextInputDiag activity.dispatchKeyEvent after handled=$handled ${describeKeyEvent(event)} ${describeImeState()}")
logTextInputDiag {
"activity.dispatchKeyEvent after handled=$handled ${describeKeyEvent(event)} ${describeImeState()}"
}
}
return handled
}
@@ -339,10 +348,9 @@ class MainActivity : FlutterActivity() {
"setNativeTextInputFocused" -> {
val oldValue = nativeTextInputFocused
nativeTextInputFocused = call.arguments as? Boolean ?: false
Log.i(
TAG,
"TextInputDiag methodChannel setNativeTextInputFocused old=$oldValue new=$nativeTextInputFocused ${describeImeState()}"
)
logTextInputDiag {
"methodChannel setNativeTextInputFocused old=$oldValue new=$nativeTextInputFocused ${describeImeState()}"
}
result.success(null)
}
else -> result.notImplemented()
+2 -3
View File
@@ -4,8 +4,8 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../services/gamepad_service.dart';
import '../utils/app_logger.dart';
import '../utils/platform_detector.dart';
import '../utils/text_input_diagnostics.dart';
import '../widgets/tv_virtual_keyboard.dart';
import 'dpad_navigator.dart';
@@ -19,8 +19,7 @@ String _describeTextInputKey(KeyEvent event) {
}
void _logTvTextInput(String message) {
if (!PlatformDetector.isTV()) return;
appLogger.i('TextInputDiag FlutterTextField: $message');
TextInputDiagnostics.log('FlutterTextField', message);
}
class _NativeTvTextInputFocusBridge {
+2 -4
View File
@@ -4,8 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../widgets/clickable_cursor.dart';
import '../utils/app_logger.dart';
import '../utils/platform_detector.dart';
import '../utils/text_input_diagnostics.dart';
import 'dpad_navigator.dart';
import 'focus_theme.dart';
import 'input_mode_tracker.dart';
@@ -17,8 +16,7 @@ String _describeFocusableKey(KeyEvent event) {
}
void _logFocusableWrapper(String message) {
if (!PlatformDetector.isTV()) return;
appLogger.i('TextInputDiag FocusableWrapper: $message');
TextInputDiagnostics.log('FocusableWrapper', message);
}
/// A wrapper widget that makes its child focusable with D-pad navigation support.
+2 -2
View File
@@ -12,6 +12,7 @@ import 'package:window_manager/window_manager.dart';
import '../utils/app_logger.dart';
import '../utils/key_event_simulator.dart' as key_sim;
import '../utils/platform_detector.dart';
import '../utils/text_input_diagnostics.dart';
String _describeGamepadKeyEvent(KeyEvent event) {
return 'type=${event.runtimeType} logical=${event.logicalKey.keyLabel}/${event.logicalKey.keyId} '
@@ -27,8 +28,7 @@ String _describeGamepadAxis(GamepadAxisEvent event) {
}
void _logGamepadDiag(String message) {
if (!PlatformDetector.isTV()) return;
appLogger.i('TextInputDiag GamepadService: $message');
TextInputDiagnostics.log('GamepadService', message);
}
/// Suppresses synthetic gamepad key events when the OS has just delivered an
+2 -4
View File
@@ -4,8 +4,7 @@ import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'app_logger.dart';
import 'platform_detector.dart';
import 'text_input_diagnostics.dart';
String _describeSimulatedKey(KeyEvent event) {
return 'type=${event.runtimeType} logical=${event.logicalKey.keyLabel}/${event.logicalKey.keyId} '
@@ -13,8 +12,7 @@ String _describeSimulatedKey(KeyEvent event) {
}
void _logKeySimulator(String message) {
if (!PlatformDetector.isTV()) return;
appLogger.i('TextInputDiag KeySimulator: $message');
TextInputDiagnostics.log('KeySimulator', message);
}
/// Shared utility for simulating key press events through the focus tree.
+11
View File
@@ -0,0 +1,11 @@
import 'app_logger.dart';
import 'platform_detector.dart';
class TextInputDiagnostics {
static bool enabled = false;
static void log(String source, String message) {
if (!enabled || !PlatformDetector.isTV()) return;
appLogger.i('TextInputDiag $source: $message');
}
}