use droidrun_core::driver::android::AndroidDriver;
use droidrun_core::driver::DeviceDriver;
use droidrun_core::ui::filter::ConciseFilter;
use droidrun_core::ui::formatter::IndexedFormatter;
use droidrun_core::ui::provider::AndroidStateProvider;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter("info")
.with_target(false)
.init();
let mut driver = AndroidDriver::new(None, true);
driver.connect().await?;
driver.press_key(3).await?;
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
let provider = AndroidStateProvider::new(ConciseFilter, IndexedFormatter, false);
let state = provider.get_state(&driver).await?;
println!("Screen: {}x{}", state.screen.width, state.screen.height);
println!("Elements: {}", state.elements.len());
println!("Focused: '{}'", state.focused_text);
println!("\nPhone state:");
println!(" App: {} ({})", state.phone_state.current_app, state.phone_state.package_name);
println!(" Editable: {}", state.phone_state.is_editable);
println!("\n{}", state.formatted_text);
println!("\n--- Element Details ---");
let indices = state.all_indices();
for &idx in indices.iter().take(5) {
if let Some(elem) = state.get_element(idx) {
println!(
" [{}] {} '{}' bounds=({})",
idx, elem.class_name, elem.text, elem.bounds,
);
}
}
if let Some(first_idx) = indices.first() {
match state.get_element_coords(*first_idx) {
Ok((x, y)) => println!("\nElement {first_idx} center: ({x}, {y})"),
Err(e) => println!("\nElement {first_idx} coords error: {e}"),
}
}
if let Some(first_idx) = indices.first() {
match state.get_clear_point(*first_idx) {
Ok((x, y)) => println!("Element {first_idx} clear tap point: ({x}, {y})"),
Err(e) => println!("Element {first_idx} clear point error: {e}"),
}
}
Ok(())
}