понедельник, 23 апреля 2012 г.

Как было написано приложение "Где моя маршрутка?"

Предыстория

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

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

Чуть позже, пользователи получили возможность увидеть её в действии на сайте http://askcompany.com

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

От идеи к реализации

Изучил страницу (спасибо замечательному "Инструменту разработчика" в Google Chrome), запросил api-key для Yandex Map Kit и за вечер написал первую версию приложения  "Где моя маршрутка?".

Приложение работает также, как и веб-сервис. Добавляет пользовательские слои поверх Яндекс.Карт и обновляет информацию используя ajax-запросы к серверу.

"Война" с разработчиками сервиса

Сразу после того, как разместил приложение в Android Market (тогда он еще так назывался), разработчики сервиса изменили формат ответа. Пришлось обновлять программу.

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

Наверное, так совпало, но и на этом разработчики не остановились и стали требовать идентификатора сессии. Надо ли говорить, что и этот рубеж был преодолен успешно? :)

Реверсинг Yandex Map Kit

Yandex Map Kit для Android в текущей реализации не предусматривает создание пользовательского слоя, который бы отвечал за свою  отрисовку. Разместить ballon'ы или bitmap - пожалуйста, но и только.

Мне же хотелось иметь возможность отрисовки произвольной графики, например ориентированного по движению треугольника или ломаной линии для отображения маршрута.

Класс BallonOverlay в Yandex Map Kit наследуется от Overlay и использует для отрисовки списка OverlayItem реализацию интерфейса IRender.

Как точно это внутри работает помог понять Java Decompiler. Если посмотреть исходные тексты моего приложения, то можно увидеть, что в реализации BusOverlay используются члены a,b,c базового класса. Не совсем говорящие за себя названия, правда?

Также без реверсинга было тяжело понять, почему маршрут рисовался над автобусами независимо от того, в каком порядке были добавлены соответствующие слои. Оказалось, что перед отрисовкой происходит сортировка OverlayItem и для того, чтобы повлиять на ранжирование нужно использовать метод setPriority(int priority).

Последнее обновление

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

Кроме того, что сменили адрес, добавили новый функционал (просмотр автобусных остановок и просмотр сразу нескольких маршрутов). Сменить адрес в программе оказалось недостаточно, поменяли и способ получения идентификатора сессии. Исправил и снова опубликовал приложение в Google Play.

А теперь к главной причине написания этого поста. После последнего обновления решил выложить исходные тексты на GitHub http://github.com/moadib/PublicTransport

Комментариев нет:

Отправить комментарий