pub mod connection;
use adb_client::server::ADBServer;
use adb_client::ADBDeviceExt;
use anyhow::{Context, Result};
use std::sync::Mutex;
static TARGET_DEVICE: Mutex<Option<String>> = Mutex::new(None);
pub fn set_target_device(device: Option<String>) {
*TARGET_DEVICE.lock().unwrap_or_else(|e| e.into_inner()) = device;
}
pub fn server() -> Result<ADBServer> {
let server = ADBServer::default();
Ok(server)
}
fn get_target_device(server: &mut ADBServer) -> Result<adb_client::server_device::ADBServerDevice> {
let serial = TARGET_DEVICE
.lock()
.unwrap_or_else(|e| e.into_inner())
.clone();
match serial {
Some(ref s) => server.get_device_by_name(s).with_context(|| {
format!("Device '{s}' not found. Check serial with `adbridge devices`.")
}),
None => server
.get_device()
.context("No device connected. Is a device/emulator attached via ADB?"),
}
}
pub fn shell(command: &str) -> Result<Vec<u8>> {
let mut server = server()?;
let mut device = get_target_device(&mut server)?;
let mut output = Vec::new();
device
.shell_command(&command, Some(&mut output), None)
.context("Failed to execute shell command on device")?;
Ok(output)
}
pub fn shell_str(command: &str) -> Result<String> {
let output = shell(command)?;
Ok(String::from_utf8_lossy(&output).to_string())
}
pub fn shell_on(serial: &str, command: &str) -> Result<Vec<u8>> {
let mut server = server()?;
let mut device = server.get_device_by_name(serial).with_context(|| {
format!("Device '{serial}' not found. Check serial with `adbridge devices`.")
})?;
let mut output = Vec::new();
device
.shell_command(&command, Some(&mut output), None)
.context("Failed to execute shell command on device")?;
Ok(output)
}
pub fn shell_str_on(serial: &str, command: &str) -> Result<String> {
let output = shell_on(serial, command)?;
Ok(String::from_utf8_lossy(&output).to_string())
}