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 { return await scrollToAndTap(driver, 'Schedules'); } export async function addTimer(driver: DeviceDriver, config: TimerConfig = {}): Promise { 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 { 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 { 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; }