Быстрое создание информационного виджета на JavaScript

    Современные мобильные телефоны имеют большие экраны. Совершенно естественно желание использовать часть места для отображения какой-нибудь важной актуальной информации. Андроид даже имеет специальную сущность для этого, которая называется AppWidget (виджет). С помощью виджетов прямо на рабочем столе телефона или планшета кроме иконок приложений можно отображать прогноз погоды, баланс счета телефона, ближайшие события, избранные контакты — да почти что угодно, поскольку данные для виджетов предоставляются приложениями.

    Мне очень нравится эта возможность Андроида (кстати, интересно, а на других платформах есть что-нибудь подобное?). Я ею пользуюсь с самого начала. Вот только есть некоторая категория программ, предоставляющих виджеты, в которой мне всё время чего-то нее хватало. Я сейчас имею в виду программы, отображающие на экране актуальный баланс телефона. Таких программ много. Для получения текущего баланса некоторые делают USSD или SMS запрос, а другие используют автоматизированную сервисную службу для управления абонентом своим тарифом через интернет, такие как ИССА у МТС или сервис гид у Мегафон. Мне больше нравится вторая разновидность, потому что через интернет службу можно получить информацию по нескольким разным телефонам, а по смс или USSD только по телефону, с которого осуществляется запрос. Ну а для планшетов без телефонии первый способ вообще закрыт.

    В общем, перепробовал я множество таких программ, некоторые были лучше, чем другие, но показывали они не всегда то, что мне хотелось (до последнего времени я пользовался balance by). Например, мне хотелось видеть, сколько трафика осталось на моем телефоне, сколько на модеме. Это же так просто — вот она эта информация, на сайте же! Если берется информация о балансе оттуда, то почему не взять информацию о трафике? Если бы можно было бы для этого написать только регулярное выражение, я бы давно сделал это. Но приходилось только ждать обновления программы. А обновления выходили, обновлялась куча других операторов, но нужного мне индикатора трафика не появилось. Кроме того, так и не нашел программу, которая бы сохраняла динамику изменения баланса, чтобы можно было оперативно посмотреть, в какой момент вдруг начали списываться лишние деньги. А с мт тарификацией такое вполне может случиться.

    Далее моё решение проблемы...

    Поскольку мне хотелось исследовать Андроид, я решил написать свою такую программу. Но сразу избавиться от основного, на мой взгляд, недостатка существующих программ. Весь набор поддерживаемых сотовых операторов и других учетных записей, баланс в которых надо смотреть, должен быть вынесен из программы в подключаемые модули. И модули эти должны быть написаны не на сложной Java, а на простом JavaScript. Уже в процессе разработки я осознал, что это открывает более широкие возможности. Можно совершенно не ограничиваться сотовыми операторами и интернет провайдерами. Можно выводить на экран практически любую информацию, которая представляется в численном или текстовом виде. Например, очень просто делаются курсы валют и отслеживание почтовых отправлений EMS.

    Программу я назвал AnyBalance. А плагины к ней AnyBalance провайдерами. Я хотел бы, чтобы AnyBalance провайдеры были open source, чтобы те, кого не устраивает функционал какого-нибудь провайдера, могли легко его дополнить. Ну или попросить об этом друга, знающего Javascript. Для этой цели я создал проект на Google code, и разместил там документацию и примеры. Призываю хабрасообщество взглянуть и оценить мой труд. И по возможности добавить в него своего оператора :) Когда будет написано побольше AnyBalance провайдеров, в AnyBalance появится возможность искать и добавлять провайдеры прямо из репозитория. Сама программа доступна из Андроид Маркета. В ней есть несколько работающих провайдеров, таких как Мегафон Москва, Курсы валют, отслеживание EMS отправлений и пара провайдеров для получения баланса игровой валюты из игр. Исходники всех провайдеров в репозитории.

    Очень много информации о том, как делаются провайдеры, написано на странице проекта на google code. Я здесь вкратце расскажу.

    Каждый провайдер декларирует набор счетчиков, которые он представляет, а также содержит Javascript, который эти счетчики получает. При обновлении виджета AnyBalance создает WebView, в котором запускается функция main провайдера. Результаты (значения счетчиков) сохраняются AnyBalance для показа на виджетах, построения графиков и статистики. Собственно, сам провайдер чрезвычайно прост. Его функция сводится только к получению актуальных значений счетчиков.

    Чрезвычайно простой классический пример — Hello world.

    А вот как полученные данные должны выглядеть, определяет уже пользователь. Во-первых, пользователь может выбрать, какие счетчики показывать, а какие нет. Во-вторых он выбирает вид виджета. Сейчас в AnyBalance есть три вида виджетов — два вида для числовых значений и один для текстовых. Пользователь может выбрать, какие счетчики показывать в каких полях виджета.

    AnyBalance обладает и возможностью показывать графики и статистику, чего мне так не хватало в других программах. Вот пример, как это выглядит.



    В настоящее время я полностью перешел на AnyBalance. Надеюсь, она придется про вкусу и вам, и поможет кроме отображения баланса решить давно назревшую проблему по отображению, например, количества голда в вов или наличия определенного товара в интернет прямо на экране телефона :) Буду также благодарен всем, кто добавит свои провайдеры в общий проект или доработает существующие.

    Также волнует вопрос насчет безопасности, можно ли написать зловредные провайдеры :). Все настройки аккаунтов хранятся в SharedPreferences, так что теоретически один провайдер может получить доступ к настройкам другого. Ещё не знаю как это исправить.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 18

      +24
        0
        Ну нравится мне этот шрифт, но не волнуйтесь, он только на моём телефоне :)
          0
          Не знал про такой сайт. Спасибо, порадовали.
          0
          Nice. Очень даже.
          Очень давно используем у себя на сервере набор php скриптов для вывода инфы откуда попало (балансы и т.д.), теперь появилась возможность засунуть это в виджет на андроид:)
          Немного непонятно зачем доступ к текущему местоположению и напрягло включенное автообновление в настройках (хотя на странице андроид.маркета оно выключено). Долго соображали как добавить провайдера (кстати, нельзя будет сделать что бы можно было добавлять не из файла, а сразу скачивать по ссылке?), лучше бы был более очевидный пункт, чем меню в субменю.
          Хотелось бы чуть больше настроек по дизайну (проще всего если бы была возможность сделать так, что бы виджет в одном из вариантов отображал не счетчики как таковые, а чистый хтмл?).
          Запрос данных раз в 5 минут минималка, хотелось бы видеть минуту, иногда это нужно. В идеале вообще push иметь. Интернет сейчас у многих безлимит на мобиле, так что частота обновлений инета много не испортит.
          А так — шикарно, одно из немногих приложений, которое позволяет безнапряжно выводить нужную инфу, даже если инфа хитрая и труднодоступная.
            0
            Доступ к текущему положению для Flurry. Поскольку это первое мое андроид приложение, мне интересна статистика. Мне также интересна возможность Flurry собирать данные об ошибках, чтобы их оперативно исправлять.

            Насчет автообновления я не знаю, я ничего специально не настраивал. Я думал, это только локально в телефоне ставится.

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

            С чистым хмтл облом, я и хотел так сделать изначально. Но WebView в фоновом режиме html не рендерит :(. Если у кого есть идеи, как это можно сделать, то с удовольствием.

            Частоту обновлений минуту добавлю, но просто батарейка быстро будет садиться, да и сайт может тормозить больше минуты, с которого счетчики получаются. Мегафон вон у меня как-то две минуты висел, я уж думал, сломался. Ан нет, тормозил просто.
              0
              а, насчет автообновления. Там, наверное, разночтение. Внутри программы это не обновление программы, а периодическое обновление информации на виджетах (refresh в английской версии). Надо будет подумать надо недвусмысленным переводом. :)
                0
                > С чистым хтмл облом
                Печально. А перенос строк хотя бы?:)

                И еще — можно сделать древовидную информацию? Т.е. на виджете показывается верхний уровень, если жмешь виджет — в приложении показывается второй уровень, жмешь в приложении на пункт 2 уровня — выводится третий и так далее? Тут смысл в том, что бы все это загружалось за один раз с сайта, а потом можно было бы никуда не коннектясь побегать по подробностям.

                И виджеты хотелось бы видеть покрупнее, 4х1 особенно, потому что емс в 2х1 и тем более 1х1 тупо не влезает.
                  0
                  Перенос строк работает в текстовом виджете (посылки EMS). Даже на скриншоте видно, что у него переносы строк.

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

                  Виджеты добавлю побольше, а вообще, начиная с версии 3.0 андроид позволяет их растягивать. Для версий ниже 3 есть, например, ADW Launcher (у меня он на скриншоте как раз), который тоже даёт возможность виджеты растянуть на нужный размер.

                    0
                    Кстати, оказывается есть возможность выводить в счетчике html, хоть и очень ограниченно. Картинки не поддерживаются. Я добавил новый тип счетчика — html и обновил программу. Список поддерживаемых тэгов тут: commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html. Пример EMS обновлен тоже.
                    0
                    интересное приложение, но если бы в комплекте с ним шли бы готовые плагины для основных операторов — количество пользователей было бы больше раз эдак в 100. или 1000.
                      0
                      Да, конечно, занимаюсь этим. Кстати, можете помочь с добавлением своего оператора? :)
                        0
                        попробую разобраться, у меня мтс. но не обещаю — мне сейчас физически не очень сподручно, печатаю одним пальцем, лежа в больничной койке
                  0
                  По поводу SharedPreferences — можно просто создать для каждого профиля свой файл SP и открывать их в MODE_PRIVATE

                  А как вы JavaScript в виджетах исполняете?
                    0
                    Так и делаю. Но внутри приложения они же все доступны. Теоретически один джаваскрипт может прочитать настройки другого.

                    JavaScript гружу в фоне в WebView и там исполняю.
                    0
                    Может, что-то не то делаю… но хоть убей — не могу найти, как добавить виджет на рабочий стол… в списке виджетов даже после перезагрузки он не появился. В настройках, там где выключаются виджеты — ни одна галочка не стоит.
                      0
                      Хм, не должно быть такого. У меня были проблемы с появлением виджетов в списке на планшете, то есть Android 3.0+. Причем не только с моей программой, а со всеми. Там приходилось несколько раз перегружаться, чтобы они там появились, закономерность не нашел пока. У вас какое устройство и андроид?
                        0
                        LG P500, Android 2.3, Go Launcher. Не знаю, может в лончере дело, но у меня сейчас другого нет, да и с другими виджетами не было проблем.
                          0
                          Разобрался. У меня стоит Modinstall Location и приложение установилось на SD-карту. И виджет не показывался. Перенёс на телефон — заработало. Извините, за беспокойство :)

                    Only users with full accounts can post comments. Log in, please.