use anyhow::{bail, Context, Result};
use colored::Colorize;
use std::process::Command;
pub fn run(target: &str, device: Option<&str>) -> Result<()> {
crate::build::run(target, false, "dist")?;
let apk = "dist/app-debug.apk";
if !std::path::Path::new(apk).exists() {
bail!(
"APK not found at `{}`. Build may have failed — check output above.",
apk
);
}
let adb = which::which("adb").context(
"adb not found. Install Android Platform Tools and ensure `adb` is in your PATH."
)?;
let devices_out = Command::new(&adb).args(["devices"]).output()?;
let devices_str = String::from_utf8_lossy(&devices_out.stdout);
let connected: Vec<&str> = devices_str
.lines()
.skip(1) .filter(|l| l.contains("device") && !l.contains("offline"))
.collect();
if connected.is_empty() {
bail!(
"No Android device or emulator connected.\n\n\
Start an emulator: emulator -avd Pixel_7_API_34\n\
Or connect device: adb devices"
);
}
println!("{} Installing APK…", "→".cyan());
let mut install_args = vec!["install", "-r", apk];
let device_arg;
if let Some(d) = device {
device_arg = format!("-s {}", d);
install_args.insert(0, &device_arg);
}
let status = Command::new(&adb)
.args(&install_args)
.status()
.context("Failed to invoke adb install")?;
if !status.success() {
bail!("adb install failed. Try: adb uninstall rs.bubba.app && cargo bubba run");
}
println!(" {} APK installed", "✓".green());
println!("{} Launching app…", "→".cyan());
Command::new(&adb)
.args(["shell", "am", "start", "-n",
"rs.bubba.app/rs.bubba.BubbaActivity"])
.status()?;
println!("{} App launched! Streaming logcat (Ctrl+C to stop)…\n", "✓".green().bold());
Command::new(&adb)
.args(["logcat", "-s", "Bubba:D", "AndroidRuntime:E"])
.status()?;
Ok(())
}