pub struct AndroidDeviceControl { /* private fields */ }Expand description
Android DeviceControl, over adb.
Where a capability has no Android primitive, the method says so and
names the alternative rather than succeeding quietly. smix-adb’s
errors are translated by adb_to_simctl_err.
Implementations§
Source§impl AndroidDeviceControl
impl AndroidDeviceControl
pub fn new() -> Self
Sourcepub fn with_client(client: AdbClient) -> Self
pub fn with_client(client: AdbClient) -> Self
Construct with an existing AdbClient (tests / non-PATH adb).
Trait Implementations§
Source§impl Default for AndroidDeviceControl
impl Default for AndroidDeviceControl
Source§impl DeviceControl for AndroidDeviceControl
impl DeviceControl for AndroidDeviceControl
Source§fn start_recording<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
output_path: &'life2 Path,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn start_recording<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
output_path: &'life2 Path,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Start adb shell screenrecord.
Unlike iOS, the recorder runs on the device and writes there, so the
file only reaches output_path when Self::stop_recording pulls it.
Android caps this at 180 seconds — screenrecord --time-limit
documents 180 as “Default / maximum”, a ceiling rather than a default
that can be raised. simctl recordVideo has no such limit. Past the
cap the recorder exits on its own, and stop_recording pulls whatever
it managed to write.
fn launch<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<u32, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn launch_with_args<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
args: &'life3 [String],
activity: Option<&'life4 str>,
) -> Pin<Box<dyn Future<Output = Result<u32, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
fn launch_with_args<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
args: &'life3 [String],
activity: Option<&'life4 str>,
) -> Pin<Box<dyn Future<Output = Result<u32, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
Launch with process arguments, and on Android with an explicit
entry point. Read more
Source§fn set_animations_quiet<'life0, 'life1, 'async_trait>(
&'life0 self,
serial: &'life1 str,
quiet: bool,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn set_animations_quiet<'life0, 'life1, 'async_trait>(
&'life0 self,
serial: &'life1 str,
quiet: bool,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Push the device’s animations as low as this platform allows,
then read the settings back and refuse if they did not take. Read more
fn terminate<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn install<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
app_path: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn uninstall<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn keychain_reset<'life0, 'life1, 'async_trait>(
&'life0 self,
_serial: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn privacy_reset_all<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn privacy_reset_all<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Revoke every privacy permission the app has been granted. Read more
Source§fn clear_app_sandbox<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn clear_app_sandbox<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Wipe the app’s persisted data without uninstalling it, so the
test binding survives. Read more
fn open_url<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
url: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn send_push<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_serial: &'life1 str,
_bundle_id: &'life2 str,
_apns_json_path: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn screenshot<'life0, 'life1, 'async_trait>(
&'life0 self,
serial: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn pasteboard_set<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_serial: &'life1 str,
_text: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn pasteboard_get<'life0, 'life1, 'async_trait>(
&'life0 self,
_serial: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<String, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn add_media<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
paths: &'life2 [String],
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn location_set<'life0, 'life1, 'async_trait>(
&'life0 self,
serial: &'life1 str,
lat: f64,
lon: f64,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn location_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
points: &'life2 [(f64, f64)],
speed_mps: Option<f64>,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn set_permission<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
serial: &'life1 str,
bundle_id: &'life2 str,
permission: Permission,
action: PermissionAction,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn stop_recording<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(), DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn as_ios_simctl(&self) -> Option<&SimctlClient>
fn as_ios_simctl(&self) -> Option<&SimctlClient>
iOS-only escape hatch: downcast to
&SimctlClient for legacy
App::simctl() API surface. Android impl returns None.Source§fn user_defaults_delete<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_udid: &'life1 str,
_bundle_id: &'life2 str,
_key: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<bool, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn user_defaults_delete<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_udid: &'life1 str,
_bundle_id: &'life2 str,
_key: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<bool, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Delete a single key from the target app’s persisted
user-defaults / preferences store. iOS:
simctl spawn defaults delete <bundle> <key> (NSUserDefaults via the sim’s cfprefsd).
Returns Ok(true) when the key existed, Ok(false) when
already absent (both are the “ensure absent” target state). Read moreSource§fn capture_bgra<'life0, 'life1, 'async_trait>(
&'life0 self,
udid: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<CapturedFrame, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn capture_bgra<'life0, 'life1, 'async_trait>(
&'life0 self,
udid: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<CapturedFrame, DeviceControlError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Capture a frame preferring the fast raw-BGRA path (iOS: resident
IOSurface host, ~0.3 ms, skips the PNG encode+decode round-trip for
diff-loop consumers). The default impl wraps
screenshot
as a PNG frame, so backends without a direct path (Android) keep
working unchanged. Read moreAuto Trait Implementations§
impl !Freeze for AndroidDeviceControl
impl !RefUnwindSafe for AndroidDeviceControl
impl !UnwindSafe for AndroidDeviceControl
impl Send for AndroidDeviceControl
impl Sync for AndroidDeviceControl
impl Unpin for AndroidDeviceControl
impl UnsafeUnpin for AndroidDeviceControl
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more