diff --git a/crates/core/src/firetv/mod.rs b/crates/core/src/firetv/mod.rs index 56f016e..ec0fa03 100644 --- a/crates/core/src/firetv/mod.rs +++ b/crates/core/src/firetv/mod.rs @@ -113,7 +113,10 @@ pub fn get_status(ip: &str) -> Result { }); } - let connected = connect(&target).unwrap_or(false); + let (connected, connection_error) = match connect(&target) { + Ok(connected) => (connected, None), + Err(error) => (false, Some(error)), + }; let screen_awake = if connected { screen_is_on(&target).ok() } else { @@ -126,6 +129,8 @@ pub fn get_status(ip: &str) -> Result { Some(false) => format!("Connected to Fire TV at {target}; screen appears asleep"), None => format!("Connected to Fire TV at {target}; power state unavailable"), } + } else if let Some(error) = connection_error { + fire_tv_connection_error_message(&target, &error) } else { fire_tv_unreachable_message(&target) }; @@ -311,6 +316,12 @@ fn fire_tv_unreachable_message(target: &str) -> String { ) } +fn fire_tv_connection_error_message(target: &str, error: &anyhow::Error) -> String { + format!( + "Could not connect to Fire TV at {target}. Check the IP address, network, and ADB debugging settings, then retry. Details: {error}" + ) +} + fn fire_tv_not_awake_message(target: &str) -> String { format!( "Fire TV at {target} did not wake after retries. Confirm the TV is powered on and still accepts ADB commands." @@ -599,6 +610,18 @@ mod tests { assert!(message.contains("debugging prompt")); } + #[test] + fn fire_tv_connection_error_message_preserves_the_root_cause() { + let message = fire_tv_connection_error_message( + "192.168.1.50:5555", + &anyhow!("adb connect timed out"), + ); + + assert!(message.contains("192.168.1.50:5555")); + assert!(message.contains("adb connect timed out")); + assert!(message.contains("ADB debugging")); + } + #[test] fn fire_tv_not_awake_message_lists_power_and_adb_steps() { let message = fire_tv_not_awake_message("192.168.1.50:5555");