use droidrun_adb::AdbServer;
use droidrun_core::portal::client::PortalClient;
use droidrun_core::portal::manager::PortalManager;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter("info")
.with_target(false)
.init();
let server = AdbServer::default();
let device = server.device().await?;
println!("Device: {}", device.serial);
let packages = device.list_packages(&[]).await?;
let is_installed = packages.iter().any(|p| p == "com.droidrun.portal");
println!("Portal installed: {is_installed}");
if !is_installed {
println!("\nInstalling Portal APK...");
let manager = PortalManager::new(device.clone());
let sdk = device.shell("getprop ro.build.version.sdk").await?;
let sdk = sdk.trim();
println!("Device SDK: {sdk}");
manager.setup(sdk, true).await?;
println!("Portal setup complete!");
}
let mut client = PortalClient::new(device.clone(), true, 8080);
client.connect().await?;
let ping = client.ping().await?;
let method = ping.get("method").and_then(|v| v.as_str()).unwrap_or("?");
println!("\nPortal reachable via: {method}");
let version = client.get_version().await?;
println!("Portal version: {version}");
let png = client.take_screenshot(true).await?;
println!("Portal screenshot: {} bytes", png.len());
let state = client.get_state().await?;
let keys: Vec<&String> = state.as_object().map(|o| o.keys().collect()).unwrap_or_default();
println!("State keys: {keys:?}");
let apps = client.get_apps(false).await?;
println!("Apps (non-system): {}", apps.len());
for app in apps.iter().take(5) {
println!(" {} ({})", app.label, app.package);
}
let result = client.input_text("test input", false).await?;
println!("Input text result: {result}");
println!("\nRunning health check...");
let manager = PortalManager::new(device.clone());
let sdk = device.shell("getprop ro.build.version.sdk").await?;
match manager.ensure_ready(sdk.trim(), false).await {
Ok(()) => println!("Health check passed!"),
Err(e) => println!("Health check warning: {e} (portal may still work)"),
}
Ok(())
}