четверг, 22 марта 2012 г.

Формат счетчика временной интервал


Если требуется указать, как должен отображаться счетчик временного интервала (типа time_interval), то можно указать формат его отображения. Формат задаётся строкой с подстановками, вида:
  <counter name="time_interval" type="time_interval" format="{@H}:{@min}:{@s}"/>
Возможные варианты мер времени(указано минимальное и полное название меры):
  • mil (millis) - миллисекунды
  • s (seconds) - секунды
  • min (minutes) -
  • h (hours) - часы
  • d (days) - дни (каждый день считается равным 24 часам)
  • w (weeks) - недели (равна 7 дней)
  • mo (months) - месяцы (равен 30 дней)
  • y (years) - года (равен 365 дней, равен 12 месяцев)
В подстановке можно указывать и минимальное, и максимальное имя меры.
Заметьте, что временной интервал не привязан к календарю, а потому не учитывает ни переходы на летнее\зимнее время, ни разное число дней в разных месяцах, ни високосные года. Точное представление временного интервала задаётся использованием часов, минут, секунд и миллисекунд, остальные меры приблизительные.
Если в подстановке мера указана заглавными буквами, то в неё будет подставлено значение временного интервала целиком в этой мере. Например, {@H} - количество целых часов в интервале, {@MO} - количество целых месяцев в интервале (приблизительно, но с учетом, что в году 12 месяцев).
Если в подстановке мера указана строчными буквами, то вместо неё будет подставлено значение интервала в этой мере, сверх его значения в более старшей мере. Например, {@min} отобразит, сколько в интервале целых минут сверх целых часов. {@mo} - сколько в интервале месяцев сверх целых годов.
Для каждой меры установлены следующие более старшие меры:
  • millis > seconds
  • seconds > minutes
  • minutes > hours
  • hours > days
  • days > years
  • weeks > years
  • months > years
Если установленное по умолчанию старшинство мер не подходит, то можно явно его установить. Например, {@weeks>months} означает число недель сверх целых месяцев, {@days>weeks>years} означает число дней после целого числа недель, прошедших с начала года.
Примечание: Месяцы обрабатываются несколько особенно. Дело в том, что запись {@months} всегда эквивалентна {@months>years}. То есть, несмотря на то, что месяц считается равным 30 дней, в году ровно 12 месяцев. То есть, в 10 годах 120 месяцев, а не 121 (то есть 365*10/30). Такие сложности возникают потому, что временной интервал не привязан к календарю.
Примеры:
{@H}:{@min}:{@s} - часы:минуты:секунды
{@D}д,{@h}:{@min}:{@s} - дни,часы:минуты:секунды
{@Y} лет {@mo} мес. - лет, месяцев

Обработка XML


Если провайдер, баланс которого вы хотите получить, поддерживает XML - это удивительное везение. И грех его не использовать. Потому что обработка XML в AnyBalance приносит только удовольствие, ибо может быть произведена с использованием JQuery.

Подробности

Рассмотрим получение значений счетчиков из XML на примере получения баланса игровой валюты в игре Повелители. Эта игра имеет API, при запросе которого возвращается XML, содержащий в том числе и значения счетчиков игровой валюты.
Полный исходный код провайдера находится в репозитории. Здесь я приведу только код получения счетчиков (полная версия в main.js).
Во-первых, в манифесте надо подключить JQuery. Можно, конечно, просто включить её в список файлов провайдера наравне с main.js. Но в данном случае это не требуется, потому что JQuery используется для внутренних нужд AnyBalance и поэтому уже доступна вашему провайдеру.
Для использования JQuery в манифесте необходимо написать:
<js>api:jquery.min.js</js> <!-- Используем библиотеку, которая и так входит в AnyBalance -->
Префикс api: указывает, что этот файл уже находится в AnyBalance и не поставляется вместе с провайдером.
После этого к моменту вызова функции main() JQuery уже будет загружена и её можно будет использовать. С помощью JQuery можно получать значения провайдеров, используя механизм селекторов (аналогично XPath):
        //Получаем xml
        var info = AnyBalance.requestPost('http://dgame.ru/api.php', {
                selfid: userid,
                key: apikey,
                type: 'person',
                id: userid
        });
        
        var xmlDoc = $.parseXML(info),
          $xml = $(xmlDoc);
        
        var $leader = $xml.find('maoli>team>disciples>d[leader="1"]');
        if(!$leader.size())
                throw new AnyBalance.Error("Ошибка: не найден лидер команды!");
        
        if(AnyBalance.isAvailable('cash')){
                result.cash = parseInt($leader.find('cash').text())/10000; //Сводим к золоту
        }
                
        if(AnyBalance.isAvailable('diamond')){
                result.diamond = parseInt($leader.find('diamond').text())/100; // Потому что они в сотых долях
        }

Если бы все провайдеры предоставляли свои счетчики в XML, то не было бы проблем...

Другие примеры

Отладка провайдеров


Процесс разработки всегда связан с отладкой. С провайдерами для AnyBalance всё то же самое. В процессе написания провайдера его может понадобиться много раз загружать на телефон, устанавливать и проверять. В Android не выше Gingerbread при подсоединении телефона в качестве USB диска сам телефон карточку видеть перестаёт, то есть, чтобы запустить провайдер, приходится присоединять телефон для копирования, а потом отсоединять для того, чтобы провайдер установить в AnyBalance. Далее представлены полезные техники, которые могут облегчить этот процесс.

Черновая отладка провайдера c помощью расширения Google Chrome

С помощью расширения AnyBalanceDebugger для браузера Google Chrome можно проводить предварительную отладку JavaScriptпровайдеров. При этом средствами Google Chrome можно даже пошагово отлаживать код провайдеров, а также просматривать их внутренние переменные в процессе выполнения. Несмотря на то, что это очень удобно, среда Google Chrome не в точности повторяет среду выполнения провайдров в AnyBalance. Поэтому после отладки работы провайдера в Google Chrome необходимо провести чистовую отладку непосредственно в AnyBalance. Подробнее об AnyBalanceDebugger смотрите здесь.

Избавление от необходимости монтировать USB диск

Самое сложное это как раз монтирование-размонтирование диска, потому что это длительная процедура. А после отсоединения диска Android ещё любит запустить процесс сканирования карточки для обнаружения новых медиа-файлов, что безбожно тормозит. Поэтому первым делом стоит избавиться от необходимости монтировать USB диск для записи на телефон.

Использование WiFi

Для этого есть несколько возможностей. Самая простая - это установить на телефон, например, SwiFtp. Эта программа позволяет копировать файлы на ваш телефон по WiFi (если ваш компьютер и телефон подсоединяются к одному WiFi-роутеру). Установив и настроив эту программу, вы можете копировать провайдеры прямо в папку /sdcard/Download и без задержки устанавливать и запускать его.

Использование Dropbox

Если использовать WiFi по какой-либо причине не получается, то можно воспользоваться облачными сервисами, например, Dropbox. Для этого будет необходимо установить клиент Dropbox на компьютер и на телефон. После настройки программы можно будет на компьютере кидать новый провайдер в ту папку, которая синхронизируется с облаком, а в мобильной версии экспортировать этот файл в папку /sdcard/AnyBalance или /sdcard/Download на телефоне. К сожалению, в мобильной версии 2.0.1 есть недоработка: недостаточно произвести обновление (Refresh) файлов - в этом случае лишь обновляется информация о файлах, но не сами файлы, и экспортируется старая версия. Я обошел эту проблему так: нажимал на нужный файл провайдера, он загружался с сервера и далее либо предлагался выбор, какой программой его запустить, либо запускалась программа, связанная с архивами. Я возвращался в Dropbox и вот после этого экспорт проходил успешно.

Использование Android SDK

Если оба предыдущих варианта не подошли, то можно копировать файлы на телефон с помощью Android SDK. Для этого на телефоне необходимо включить USB Debugging (Settings > Applications > Development и включаем USB Debugging), а затем подсоединяем телефон к компьютеру USB-кабелем. Для корректной работы USB Debugging может понадобиться установка USB драйверов для вашего телефона. За драйверами обращайтесь на сайт производителя вашего телефона.
В состав Android SDK входит утилита ADB. С её помощью можно многое делать с Android устройством, в частности, копировать файлы.
  • Установите Android SDK, как описано здесь (достаточно 1 и 2 шага)
  • Подсоедините телефон с включенным USB Debugging
  • запустите из командной строки adb devices (программа adb.exe находится в папке android-sdk/platform-tools)
  • если ваш телефон присутствует в списке подключенных устройств, то можно на него что-нибудь скопировать :)
  • для копирования используйте команду (вместо provider.zip укажите название файла вашего провайдера)
  •   adb push provider.zip /sdcard/Download/provider.zip
  • файл скопируется на телефон и его сразу можно будет установить в AnyBalance.
Для удобства можно написать .bat файл, сжимающий файлы провайдера в .zip и посылающий его на телефон "одним нажатием".

Использование эмулятора

Можно также отлаживать провайдеры не на реальном телефоне, а на эмуляторе, который входит в состав Android SDK. Чтобы создать эмулятор, нужно выполнить шаг 4 установки Android SDK. При выборе платформ для эмулятора укажите Android 2.1, он тормозит меньше других :) . После того, как платформа скачалась, запускайте программу android-sdk/AVD Manager.exe, создавайте и запускайте эмулятор на основе Android 2.1. Когда эмулятор запустится, он будет виден adb как обычный телефон, и на него точно так же можно будет копировать файлы. На эмуляторе нет Android Market, поэтому для установки на него AnyBalance скачайте apk отсюда и установите на эмулятор командой (вместо AnyBalance-375.apk подставьте путь к скачанному вами apk)
  adb install -r AnyBalance-375.apk

Отладочные сообщения

Чтобы вы понимали, что именно в провайдере пошло не так, он может сообщать о проблемах и своём внутреннем состоянии с помощью функции AnyBalance.trace(). Выведенная этой функцией информация сохраняется в логе аккаунта в AnyBalance (пример лога). Для этого в AnyBalance надо вызвать контекстное меню аккаунта длинным нажатием и выбрать пункт "Показать последний лог". Сохраняется только последний лог запроса провайдером информации.

Отдельная среда разработки провайдеров

Конечно, удобно было бы иметь отдельную среду разработки провайдеров, не завязанную на телефон. Надеюсь, в будущем она появится. Но пока придется довольствоваться способами, описанными выше...

Что такое AnyBalance


AnyBalance - приложение для Андроид, которое умеет показывать на экране виджеты с практически любой информацией (чаще в виде счетчиков, числовых индикаторов).
Информация получается через интернет специальными плагинами (AnyBalanceproviders), написанными на JavaScript. Такой провайдер легко написать самому, если вы знакомы с JavaScript. В первую очередь используется для показа баланса телефона с сайта телефонного провайдера.

Где скачать

Приложение доступно в Андроид Маркете: https://market.android.com/details?id=com.dukei.android.apps.anybalance В его составе идет несколько провайдеров, если нужно больше, стоит обратиться к репозиторию.

Подробнее о провайдерах

AnyBalance провайдеры - небольшие плагины, написанные на JavaScript, которые предоставляют данные в AnyBalance для показа и статистики.

Документация


Примеры


Участие


Вопросы

Если у вас возникли вопросы по работе с AnyBalance, пожалуйста, не стесняйтесь задавать их в группе обсуждения AnyBalance providers group

HTML виджет

HTML виджет - отличная возможность показать информацию на виджете так, как этого хочется именно вам.


HTML виджет предназначен для отображения счетчиков с высокой степенью персонализации, то есть, можно достаточно произвольно настраивать цвет, размер, расположение различных счетчиков и их комбинаций на виджете. Для этого в виджете есть настройка HTML шаблона.
Чтобы выбрать HTML виджет, надо при добавлении нового виджета в качестве типа виджета выбрать "Универсальный HTML".
Шаблон выглядит примерно так:
  <big>(@1)</big><br/>
  <small>(@1*m) / (@1*d)</small>
При этом посередине виджета будет показано значение счетчика номер 1, а под ним изменение этого счетчика за месяц и за день.

Подробности

Виджет поддерживает не все тэги HTML. Список поддерживаемых тэгов: <b>, <big>, <blockquote>, <br>, <cite>, <dfn>, <em>, <font size="..." color="..." face="...">, <h1>, <h2>, <h3>, <h4>, <h5>, <h6>, <i>, <p>, <small>, <strike>, <strong>, <sub>, <sup>, <tt>, <u>. Кроме того, очень ограниченно поддерживается тэг <table>, с помощью которого счетчики можно отображать в горизонтальной строке.
<table> может содержать только одну строку и не более 7 ячеек. Содержимое ячеек будет выравнено по центру ячейки.
Места, в которых необходимо отображать счетчики помечаются маркерами вида (@N), где N - номер настроенного в виджете счетчика от 0 до 6 (при настройке виджета пользователь имеет возможность указать счетчик, который должен отображаться для каждого номера 0-6). При этом для ячеек таблицы <td> предусмотрен нестандартный атрибут ifavailable="N,M,...", который позволяет не отображать ячейку, если пользователь не настроил ни один из указанных в значении атрибута счетчиков.
Изменения счетчика номер N помечаются маркерами вида (@NxT), где x - тип изменения, а T - период времени, за которое накапливается изменение.
Типы изменений:
  • * - все изменения,
  • - - только изменения в сторону уменьшения (например, когда интересны только траты со счета, а не пополнения),
  • + - только изменения в сторону увеличения (например, когда интересны только пополнения счета, а не траты с него).
Периоды времени:
  • l - изменения с момента последнего запроса значения счетчика
  • d - изменения с начала дня
  • w - изменения с начала недели
  • m - изменения с начала месяца
  • y - изменения с начала года
Например, (@3+y) означает сумму всех увеличений счетчика номер 3 с начала года, а (@5-l) означает уменьшение счетчика номер 5 с момента последнего запроса.

Редактор шаблона

На телефоне редактировать шаблон не очень удобно, гораздо удобнее сделать шаблон для себя в редакторе, а потом перенести его в телефон. Ниже представлен редактор, который позволяет редактировать шаблон и предварительно просматривать результат, а затем закодировать его в QR код, который может быть считан AnyBalance. Редактор доступен здесь.

AnyBalance v.1.3.460

В этой версии существенно улучшена стабильность, а также появилась возможность обновлять аккаунты после исходящего СМС.

Новая версия в Android Market.