1import chalk from 'chalk';
2
3import * as Log from '../../log';
4
5/** An abstract class for interacting with a native device. */
6export abstract class DeviceManager<IDevice> {
7  constructor(public device: IDevice) {}
8
9  abstract get name(): string;
10
11  abstract get identifier(): string;
12
13  logOpeningUrl(url: string) {
14    Log.log(chalk`\u203A Opening {underline ${url}} on {bold ${this.name}}`);
15  }
16
17  abstract startAsync(): Promise<IDevice>;
18
19  abstract getAppVersionAsync(applicationId: string): Promise<string | null>;
20
21  abstract installAppAsync(binaryPath: string): Promise<void>;
22
23  abstract uninstallAppAsync(applicationId: string): Promise<void>;
24
25  abstract isAppInstalledAsync(applicationId: string): Promise<boolean>;
26
27  abstract openUrlAsync(url: string): Promise<void>;
28
29  abstract activateWindowAsync(): Promise<void>;
30
31  abstract ensureExpoGoAsync(sdkVersion?: string): Promise<boolean>;
32}
33