cargo-bubba 0.1.0

cargo subcommand for the Bubba mobile framework
//! `cargo bubba run` — build and launch on an Android device or emulator.

use anyhow::{bail, Context, Result};
use colored::Colorize;
use std::process::Command;

pub fn run(target: &str, device: Option<&str>) -> Result<()> {
    // First build
    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
        );
    }

    // Find adb
    let adb = which::which("adb").context(
        "adb not found. Install Android Platform Tools and ensure `adb` is in your PATH."
    )?;

    // Check for connected devices
    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) // skip "List of devices attached"
        .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"
        );
    }

    // Install
    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());

    // Launch
    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());

    // Stream logs
    Command::new(&adb)
        .args(["logcat", "-s", "Bubba:D", "AndroidRuntime:E"])
        .status()?;

    Ok(())
}