112 lines
3.9 KiB
TypeScript
112 lines
3.9 KiB
TypeScript
import { DeviceDriver } from '../../drivers/types';
|
|
import { sleep, waitForSource } from './element.helper';
|
|
import { scrollToAndTap } from './device-settings.helper';
|
|
|
|
export interface TimerConfig {
|
|
time?: string;
|
|
repeat?: string[];
|
|
action?: string;
|
|
}
|
|
|
|
export async function navigateToTimerPage(driver: DeviceDriver): Promise<boolean> {
|
|
return await scrollToAndTap(driver, 'Schedules');
|
|
}
|
|
|
|
export async function addTimer(driver: DeviceDriver, config: TimerConfig = {}): Promise<boolean> {
|
|
if (driver.platform === 'android') {
|
|
const addEl = await driver.findElementRaw('-android uiautomator', 'new UiSelector().text("Add")');
|
|
if (!addEl) return false;
|
|
await driver.tapElement(addEl);
|
|
await sleep(3000);
|
|
} else {
|
|
const addEl = await driver.findElementRaw('name', 'Add');
|
|
if (!addEl) return false;
|
|
await driver.tapElement(addEl);
|
|
await waitForSource(driver, 'At Time', 5000);
|
|
}
|
|
|
|
const source = await driver.getSource();
|
|
if (!source.includes('At Time') && !source.includes('Save')) return false;
|
|
|
|
// Save with defaults (Only once + Turn off)
|
|
if (driver.platform === 'android') {
|
|
const saveEl = await driver.findElementRaw('-android uiautomator', 'new UiSelector().text("Save")');
|
|
if (!saveEl) return false;
|
|
await driver.tapElement(saveEl);
|
|
} else {
|
|
const saveEl = await driver.findElementRaw('name', 'Save');
|
|
if (!saveEl) return false;
|
|
await driver.tapElement(saveEl);
|
|
}
|
|
await sleep(3000);
|
|
return true;
|
|
}
|
|
|
|
export async function deleteAllTimers(driver: DeviceDriver): Promise<boolean> {
|
|
if (driver.platform === 'android') {
|
|
const topRight = await driver.findElementRaw('id', 'com.theswitchbot.switchbot:id/top_bar_right_icon');
|
|
if (!topRight) return false;
|
|
await driver.tapElement(topRight);
|
|
await sleep(2000);
|
|
|
|
let deleteEl = await driver.findElementRaw('-android uiautomator', 'new UiSelector().text("Delete")');
|
|
if (!deleteEl) {
|
|
await driver.tapElement(topRight);
|
|
await sleep(2000);
|
|
deleteEl = await driver.findElementRaw('-android uiautomator', 'new UiSelector().text("Delete")');
|
|
}
|
|
if (!deleteEl) return false;
|
|
await driver.tapElement(deleteEl);
|
|
await sleep(1000);
|
|
|
|
const selectAll = await driver.findElementRaw('-android uiautomator', 'new UiSelector().text("Select All")');
|
|
if (selectAll) {
|
|
await driver.tapElement(selectAll);
|
|
await sleep(500);
|
|
}
|
|
|
|
deleteEl = await driver.findElementRaw('-android uiautomator', 'new UiSelector().text("Delete")');
|
|
if (!deleteEl) return false;
|
|
await driver.tapElement(deleteEl);
|
|
await sleep(1500);
|
|
|
|
const okEl = await driver.findElementRaw('-android uiautomator', 'new UiSelector().text("OK")');
|
|
if (okEl) await driver.tapElement(okEl);
|
|
await sleep(2000);
|
|
|
|
const source = await driver.getSource();
|
|
return source.includes("haven't set any schedules") || source.includes('Tap Add below');
|
|
}
|
|
|
|
// iOS
|
|
await driver.tap(362, 69);
|
|
await sleep(1500);
|
|
|
|
let deleteEl = await driver.findElementRaw('name', 'Delete');
|
|
if (!deleteEl) return false;
|
|
await driver.tapElement(deleteEl);
|
|
await sleep(1500);
|
|
|
|
deleteEl = await driver.findElementRaw('name', 'Delete');
|
|
if (deleteEl) await driver.tapElement(deleteEl);
|
|
await sleep(1500);
|
|
|
|
const confirmEl = await driver.findElementRaw('name', 'Confirm');
|
|
if (confirmEl) await driver.tapElement(confirmEl);
|
|
await sleep(2000);
|
|
|
|
const source = await driver.getSource();
|
|
return source.includes("haven't set any schedules") || source.includes('Tap Add below');
|
|
}
|
|
|
|
export async function getTimerCount(driver: DeviceDriver): Promise<number> {
|
|
const source = await driver.getSource();
|
|
if (source.includes("haven't set any schedules") || source.includes('Tap Add below')) return 0;
|
|
if (driver.platform === 'android') {
|
|
const matches = source.match(/text="Only once"/g);
|
|
return matches ? matches.length : 0;
|
|
}
|
|
const matches = source.match(/name="Only once"/g);
|
|
return matches ? matches.length : 0;
|
|
}
|