2015-11-01

О мобильном

А давайте немного похвастаюсь своими мобильными приложениями. Я ведь, помимо прочего, пописываю свободные программы под Android. И немного рассказывал об этом на прошлом Droidсon в Москве.
Всё началось во времена первого айфона. Упоротые гики привозили эти самые айфоны из Штатов. А я ждал. Я не хотел доверяться Эпл, мне не нравилось уже тогда заметное их стремление подсадить пользователей исключительно на их продукцию. И тут появился Андроид. В лице HTC Hero. Это был практически первый гуглофон, доступный в широкой продаже, и даже официально в России. И я понял, что это тот айфон, который мне нужен. А когда приобрёл его, внезапно понял, что под него можно писать программы. И начал писать программы.
Welcome to Omsk
Пытаюсь вспомнить, с какой программы всё началось, и не могу. Наверное, всё же с погоды. Ну не было в раннем Андроиде нормальных погодных приложений и виджетов. А захотелось видеть хотя бы температуру воздуха в родном городе. Тем более, что была, и до сих пор здравствует знаменитая Муха. Это датчик температуры в центре Омска, с 2003 года публикующий показания (и графики) в интернетах.
Так возникла омскопогодная программа. Началась она с виджета на рабочий стол. Но Боря вдруг спросил: "А можно эту температуру вывести в строке состояния сверху экрана?". Так и родилась гениальнейшая идея: показывать температуру в строке состояния. Ныне эта идея так или иначе реализована во всех приличных погодных программах.
Реализация идеи встретила серьезное сопротивление со стороны Android SDK. Дело в том, что Андроид не позволяет рисовать что попало в строке состояния. Там могут выводиться только картинки-ресурсы, уже вкомпилированные в приложение. Хорошо, впрочем, что саму картинку можно выбирать. Вот так и получилось решение: включить в приложение картинки с показаниями температуры от -50 до +100 градусов (для Цельсия и Фаренгейта).
Потом в омскопогодную программу добавились графики температуры с той же Мухи. А потом я решил, что Омском ограничиваться не стоит и начал делать всепогодную программу. Поддержку омскопогодной программы я забросил, но девятьсот шестьдесят шесть каких-то чудаков до сих пор ею пользуются.
OpenWeatherMap
Всепогодной программе нужен был источник погоды во всех городах, а не только в Омске. И у Гугла он был. Помните iGoogle? Такая кастомизируемая стартовая страница с разными виджетам. Был там и виджет погоды. И данные он запрашивал во вполне понятном XML. Хороший был источник данных, но, раз уж был неофициальным, тихо, но заметно, умер. Пришлось в срочном порядке искать альтернативу. И единственным открытым и бесплатным погодным API оказался OpenWeatherMap.
OpenWeatherMap в ту пору только зарождался. Не было рекламы на страницах. Не было платных тарифов и ограничений в количестве запросов. Не раздавали API key. Пожалуй, я даже немного приложил руку к их развитию. Как минимум одно минорное обновление API было выпущено для исправления багов, которые нашёл я.
В общем, за неделю по вечерам была создана новая реализация запрашивателя погоды, и всепогодное приложение продолжило работать.
Другой челлендж во всепогодной программе случился с теми самыми картинками-иконками для циферок температуры. Еще на заре Андроида оказалось, что у HTC в Sense строка состояния вверху экрана — чёрная, а у обычного Андроида — белая. Потом она и у Андроида стала чёрная. А с приходом Ice Cream Sandwich еще и поменялся масштаб отображения иконок.
Для разных случаев, в зависимости от модели устройства или хотелок юзера нужны были разные иконки. А набор из 150 иконок занимал порядочный мегабайт. Для устройств времен HTC Hero — весьма много.
Поэтому я решил делать всепогодное приложение расширяемым. И подключать различные шкурки с разными иконками. Родился целый API по взаимодействию основного кода, который отвечал за своевременное обновление погоды, и шкурок, которые отвечали за отображение.
Сам я написал и поддерживаю пять шкурок. И была надежда, что кто-то захочет написать ещё. С другими цветами цифр, с виджетом, а не уведомлением, ещё с чем-нибудь. Но никто так и не написал. А сейчас наличие этих пяти шкурок смотрится странным, весь этот пяток мегабайт уже не стыдно просто включить в одно приложение.
Android MicroSD
Пожалуй, исторически второй программкой, но самой популярной из моих программок стала сдкартопосылательная программа. С ума сойти, её скачали более трёх миллионов восьмисот тысяч раз, и активно пользуются более четырёхсот тысяч человек. Почуяв успех, я впилил туда донейт в один бакс. Просто возможность дать мне доллар, если программа понравится. Без рекламы, без смс, без ограничения функционала без оплаты. И платят, что-то около сотни в месяц выходит.
А идея была простая. В то время не было Гуглофоточек. И встроенная в телефон Галерея, для просмотра нафотканного, оставляла желать лучшего. Она не умела организовывать фотографии, но умела отображать фото из разных папок на файловой системе как альбомы. Приходилось раскидывать файлы по папочкам в неуклюжих на тот момент файловых менеджерах, где было неудобно фоточки смотреть. А потом смотреть в Галерее, где неудобно было их раскидывать. Захотелось упростить задачу.
После изучения предметной области оказалось, что штука «Послать на» (она же «Share to» или «Send to») в Андроид — достаточно универсальна. Это стандартный Интент, который используется везде и всюду, и может пересылать абсолютно любой файл, а не только картинки. Идея расширилась: позволять пересылать любые файлы из любых приложений в любую папку на файловой системе.
Конечно, это можно было сделать в файловом менеджере. Но — гораздо дольше. Смотрите: надо найти файл, надо его выделить, надо вырезать или скопировать его, выбрав пункт меню, надо найти папку, куда его положить, надо снова выбрать пункт меню для вставки. А я придумал, как короче: нужно файл «послать на» SD карту, выбрать папки (а так как папки с прошлого раза запоминаются, то в 95% случаев этот шаг можно пропустить), нажать «скопировать» или «переместить». В два раза меньше действий.
Идея простая. И мне непонятно, почему до сих пор, аж уже в шестом Андроиде, это не стало функцией системы. Сейчас частично этот функционал встраивают в некоторые файловые менеджеры, но универсальности моей программы ещё никто не переплюнул.
Впрочем, в систему это не встроили, потому что незачем простому юзеру знать про какие-то там файловые системы.
Раньше на Андроиде не было доступных пользователю файлов на самом телефоне. Надо было обязательно вставлять SD карту, куда и кидались файлы тех же фоточек. Потому приложение и называется «Отправить на SD карту». Потом от SD карты отказались, и эмулируемая файлопомойка перекочевала в сам девайс. Потом некоторые производители вернулись к SD карте. И в Андроиде оказалось две файлопомойки. Где-то в этот момент, в Kit Kat, Гугль сделали мне подлянку. Внезапно оказалось, что приложения, честно запросившие пермишены на полный доступ на запись к общей файлопомойке, не могут в эту файлопомойку писать. А могут писать только в тот специально отведенный уголочек, в подпапку Android\<имя пакета приложения>, который аккуратно подчищается после удаления приложения.
Вроде как производители неправильно поняли Гугль. Имелось в виду, что все приложения имеют доступ на запись в свой приватный уголочек, а те, которые запросят пермишен на запись в файлопомойку (т.е. и моя сдкартопосылательная программа), должны по-прежнему иметь возможность писать куда угодно. Не знаю, кто кого как понял, но до сих пор я вижу на устройствах то невозможность писать на SD карту, то невозможность писать во внутреннюю память. Что попало. Понятно, что невозможность писать в произвольный каталог файловой системы делает мою программу полностью бесполезной. Файловые менеджеры тоже от этой глупости страдают. Хотя предустановленные файловые менеджеры магическим образом могут писать куда угодно.
Hacking Android
Получается, у меня какой-то талант натыкаться на какие-то мелкие недочеты в системе и затыкать их своими программами. Чтобы сделать мелкие вещи более удобными. Таких программ у меня много.
Продолжение следует.