Scriptex — инструкция и справочник ================================== Scriptex позволяет запускать на Android скрипты на JavaScript: по событиям (загрузка системы, подключение зарядки или интернета, входящее SMS, встряхивание, расписание), по ярлыку на главном экране или по клику по виджету. Из скриптов можно управлять Wi-Fi и Bluetooth, работать с файлами, отправлять SMS, запрашивать интернет-страницы, показывать диалоги и выводить информацию на собственные виджеты. Текст собран из встроенной справки приложения (версия 2.2) и старой страницы программы на сайте. Что важно знать сегодня ----------------------- - Приложение рассчитано на Android 2.2–4.2. Android 14 и новее не установит его вовсе, а на других современных версиях часть методов (автономный режим, перехват SMS, управление Wi-Fi и Bluetooth) работать не будет. - Бесплатная версия запускает только первые 3 скрипта и позволяет создать до 7 событий. Полную версию сейчас не активировать: сервер регистрации на старом сайте и покупка через Google Play больше не работают. - Методы Scriptex.airplaneMode() и Scriptex.execAsRoot() требуют root. Как создать скрипт ------------------ Нажмите Меню → Создать и напишите скрипт на JavaScript. Кроме обычного JavaScript доступны встроенные методы Scriptex (см. ниже). Скрипты можно писать и на компьютере: это обычные текстовые файлы с расширением .sex в папке Scriptex/scripts на карте памяти. При первом запуске приложение кладёт туда несколько примеров. Важно: 1. Стандартные alert(), prompt() и confirm() не работают. Вместо них используйте Scriptex.alert(), Scriptex.prompt() и Scriptex.confirm(). 2. Если скрипт не работает, загляните в Лог: там сообщения об ошибках в скриптах. Файлы лога лежат в папке Scriptex/log. 3. По умолчанию скрипт может работать не дольше 180 секунд, после этого он закрывается принудительно. Изменить время можно через Scriptex.setScriptTimeout(). Как запустить скрипт -------------------- 1. По событию. На вкладке «События» добавьте событие и выберите скрипт. Доступные события: - единоразово (в заданное время); - периодически (каждые N секунд: 3600 — раз в час); - по расписанию; - при подключении зарядки; - при встряхивании (с настройкой чувствительности); - при загрузке системы; - при подключении к интернету; - при входящем SMS. К событию можно задать аргументы — строку, которая придёт в скрипт. 2. Ярлыком на главном экране (Создать ярлык в меню скрипта). 3. Кликом по виджету Scriptex (скрипт выбирается в настройках виджета). Информация о событии: Scriptex.event ------------------------------------ Когда скрипт запущен событием, в переменной Scriptex.event лежит объект с информацией о нём. Всегда есть поля name (системное имя события) и arguments (аргументы, заданные при создании события). Остальные поля зависят от события: Событие name Дополнительные поля ------------------------ ------------- -------------------------------- Единоразово time type = "once" Периодически time type = "periodically" По расписанию time type = "schedule" Зарядка AC connected — true при подключении, false при отключении Встряхивание shake Загрузка системы boot Подключение к интернету connection type, subtype, available, connected Входящее SMS IncomingSMS from, text, time, smsId Клик по виджету widget widget — ID виджета Ярлык Shortcut Например, так можно отличить загрузку системы от остальных событий: if (Scriptex.event.name == "boot") { ... } Входящее SMS после обработки всё равно попадёт во входящие, если не вызвать Scriptex.interceptSMS(). Виджеты ------- Добавьте виджет Scriptex на главный экран (есть размеры от 1×1 до 4×4). В настройках виджета виден его ID, по нажатию он копируется в буфер обмена. Там же задаются цвета, размеры текста, выравнивание и скрипт по клику. Содержимое виджета меняется из любого скрипта методом Scriptex.updateWidget(id, data), см. описание ниже. Методы Scriptex --------------- Аргументы в квадратных скобках необязательны. Диалоги и сообщения Scriptex.alert(message [, timeout]) Диалог с текстом и кнопкой «Ok». Возвращает 1, если нажата «Ok», -1 — если «Назад», -3 — по таймауту. timeout — через сколько секунд закрыть окно автоматически; по умолчанию равен значению Scriptex.setScriptTimeout(). Scriptex.confirm(message [, timeout]) Диалог с кнопками «Да» и «Нет». Возвращает 1 — «Да», 0 — «Нет», -1 — «Назад», -3 — таймаут. Scriptex.confirm2(message [, timeout]) Диалог с кнопками «Да», «Нет» и «Отмена». Возвращает 1 — «Да», 0 — «Нет», -2 — «Отмена», -1 — «Назад», -3 — таймаут. Scriptex.prompt(message [, text [, timeout]]) Диалог с полем ввода и кнопками «Ok» и «Отмена». text — текст в поле ввода по умолчанию. Возвращает введённый текст или null при отмене, «Назад» и таймауте. Scriptex.toast(message) Короткое всплывающее сообщение (Toast). Scriptex.trace(text) Записывает сообщение в LogCat с тегом «Scriptex.trace». Файлы Scriptex.readFile(path) Возвращает содержимое файла. Scriptex.writeFile(path, text, append) Записывает текст в файл. Если append = true, текст дописывается в конец, иначе файл перезаписывается. Возвращает true при успехе. Scriptex.fileExists(path) true, если файл или папка существует. Scriptex.fileSize(path) Размер файла в байтах. Scriptex.isDir(path) true, если путь — папка. Scriptex.listDir(path) Массив имён файлов в папке. Scriptex.makeDir(path) Создаёт папку. path — полный путь вместе с именем новой папки. Возвращает true при успехе. Scriptex.deleteFile(path) Удаляет файл или пустую папку. Возвращает true при успехе. Пути везде полные, например /mnt/sdcard/data.txt. Интернет Scriptex.requestGet(url) GET-запрос, возвращает текст ответа. Scriptex.requestPost(url, data) POST-запрос, data — объект с полями формы. Возвращает текст ответа. var html = Scriptex.requestPost("http://mysite.com/index.php", { "login": "mylogin", "password": "mypassword" }); Связь и SMS Scriptex.call(phone) Звонит на указанный номер. Scriptex.sendSMS(phone, message) Отправляет SMS. Возвращает true при успехе. Scriptex.interceptSMS() Вызывайте в скрипте, запущенном событием «Входящее SMS», чтобы система не обработала это SMS как обычно. Все входящие SMS пишутся в лог в папке Scriptex/log, лог ротируется раз в неделю. Scriptex.callHistory() История звонков: массив объектов с полями id, number, duration, date, type, new. Scriptex.getGSMCellId() ID текущей GSM-соты или -1 при ошибке. Wi-Fi, Bluetooth и режимы Scriptex.wifi(status) Включает (true) или выключает (false) Wi-Fi. Scriptex.wifiState() true, если Wi-Fi включён. Scriptex.wifiInfo() Информация о текущем Wi-Fi-подключении: объект с полями BSSID, IP, HiddenSSID, LinkSpeed, NetworkID, RSSI, MAC, SSID. Scriptex.bluetooth(status) Включает (true) или выключает (false) Bluetooth. Scriptex.bluetoothState() true, если Bluetooth включён. Scriptex.isBTConnected() Если Bluetooth подключён к другому устройству, возвращает массив [имя устройства, адрес], иначе null. var bt = Scriptex.isBTConnected(); if (bt == null) { Scriptex.alert("Bluetooth is not connected"); } else { Scriptex.alert("Bluetooth is connected to " + bt[0] + " (" + bt[1] + ")"); } Scriptex.airplaneMode(status) Включает (true) или выключает (false) автономный режим. Нужен root. Scriptex.airplaneModeState() true, если автономный режим включён. Scriptex.ringerMode(mode) Режим звонка: 0 — без звука, 1 — со звуком, 2 — вибро. Scriptex.playSound(path) Проигрывает звуковой файл. Система Scriptex.execAsRoot(commands) Выполняет команды от root. commands — массив строк. Возвращает true при успехе. Scriptex.wakeLock(state [, display]) true — будит устройство и не даёт ему уснуть, false — отпускает. Если display = true, включается и подсветка экрана. После Scriptex.wakeLock(true) обязательно вызовите Scriptex.wakeLock(false). Scriptex.setScriptTimeout(time) Максимальное время работы скрипта в секундах (по умолчанию 180). Виджеты Scriptex.updateWidget(id, data) Обновляет виджет с указанным ID (его видно в настройках виджета). data — объект, все поля необязательны: header текст заголовка; content текст тела, можно использовать HTML; script имя скрипта, который запустится по клику; arguments аргументы для этого скрипта; align выравнивание тела: "left" (по умолчанию), "right", "center"; bgcolor цвет фона; bcolor цвет рамки; htcolor цвет текста заголовка; tcolor цвет текста тела; htsize размер текста заголовка (число); tsize размер текста тела (число). Цвета — #RRGGBB, #AARRGGBB или названия: red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray, darkgray. Scriptex.updateWidget(15, { "header": "My widget", "content": "This is sample widget!" }); Примеры ------- AutoBT — включает Bluetooth вне дома и выключает дома, если он ни к чему не подключён (для громкой связи в машине). «Дом» определяется по GSM-сотам: var cells = [18110, 18111, 20012]; if (cells.indexOf(Scriptex.getGSMCellId()) == -1) { Scriptex.bluetooth(true); } else { if (!Scriptex.isBTConnected()) { Scriptex.bluetooth(false); } } Хранение данных: var path = '/mnt/sdcard/data.txt'; // Сохранение var info1 = {name: 'Milk', price: 1.15, count: 3}; Scriptex.writeFile(path, JSON.stringify(info1), false); // Чтение var json = Scriptex.readFile(path); if (json != null) { var info2 = JSON.parse(json); Scriptex.alert(info2['count'] + 'x ' + info2['name'] + ' $' + info2['price']); } Удаление всех пустых папок: var path = '/mnt/sdcard/'; var files = Scriptex.listDir(path); if (files != null) { for (var i = 0; i < files.length; i++) { if (Scriptex.isDir(path + files[i])) { Scriptex.deleteFile(path + files[i]); } } } Scriptex.toast('Done!'); Удаление папки со всем содержимым: function deleteDir(path) { var files = Scriptex.listDir(path); if (files != null) { for (var i = 0; i < files.length; i++) { if (Scriptex.isDir(path + files[i])) { deleteDir(path + files[i] + '/'); } else { Scriptex.deleteFile(path + files[i]); } } } Scriptex.deleteFile(path); } deleteDir('/mnt/sdcard/notEmptyFolder/'); Scriptex.toast('Done!'); Угадай число: function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } var number = Scriptex.prompt('Enter number between 1 and 10:'); if (number == null) { Scriptex.alert('Number does not entered!'); } else if (isNaN(number)) { Scriptex.alert('This is not a number!'); } else { var random = getRandom(1, 10); if (random == number) { Scriptex.alert('Excellent!'); } else { Scriptex.alert('Bad! I thought of the number ' + random); } } Дней до Нового года: function getDaysCount(year, month, day) { var now = new Date(); var date = new Date(year, month - 1, day); return Math.ceil((date - now) / 1000 / 60 / 60 / 24); } var now = new Date(); Scriptex.alert(getDaysCount(now.getFullYear(), 12, 31) + 1); Получение данных из интернета (первая новость из RSS): var xml = Scriptex.requestGet('http://news.yandex.ru/index.rss'); var regexp = new RegExp('[\\s\\S]+?([\\s\\S]+?)[\\s\\S]+?'); var matches = regexp.exec(xml); if (matches != null) { Scriptex.alert(matches[1]); } else { Scriptex.alert('Cannot load news'); } Переключатели: Scriptex.airplaneMode(!Scriptex.airplaneModeState()); // автономный режим Scriptex.bluetooth(!Scriptex.bluetoothState()); // Bluetooth Scriptex.wifi(!Scriptex.wifiState()); // Wi-Fi