В e-Legion мы стараемся следить за всем, что происходит в мире разработки, и постоянно пробуем различные решения для наших проектов. За 8 лет на рынке разработки приложений мы брались за самые разнообразные проекты для различных платформ и о самых любопытных случаях старались рассказывать на Хабре.
Мы уже более 3-х лет работаем с Яндексом и за это время прониклись сервисами и всей экосистемой главного поиска страны. Поэтому, когда в октябре прошлого года был представлен SDK для Яндекс.Диска, нам стало интересно, что же он умеет, и мы решили разработать простое приложение «Фоторамка» для Android и Windows.
Идея приложения проста: вы загружаете фотографии на Яндекс.Диск, синхронизируете приложение со своим аккаунтом и получаете слайд-шоу. Чтобы поделиться фотографиями с друзьями и родителями, нужно просто настроить приложение на их девайсах и расшарить папку с фотографиями на Яндекс.Диске на их аккаунты. Фотографии автоматически появятся в «Фоторамке» на других девайсах. В общем, проще один раз попробовать.
Нашей целью было сделать простое и удобное приложение для легкого шеринга новых фотографий с друзьями и близкими, поэтому интерфейс программы сделан максимально простым и понятным. При первоначальном запуске показывается wizard, где пользователь может выбрать каталог для синхронизации и изменить некоторые стандартные настройки. После выбора папки для синхронизации, «Фоторамка» рекурсивно просматривает всю структуру каталога. Далее происходит фильтрация файлов и в кэш на устройстве пользователя загружаются только файлы изображений.
После завершения операции синхронизации, «Фоторамка» периодически опрашивает сервер для просмотра изменений в структуре каталогов или файлах. При обнаружении изменений повторно запускается механизм синхронизации. Если у пользователя отсутствует соединение с интернетом, то «Фоторамка» работает в оффлайн режиме — все функции за исключением синхронизации с сервером остаются в работе. Кстати, у приложения для Windows есть приятный бонус: возможность настраивать скринсейвер и автоматическую смену обоев рабочего стола. Это легко реализуется, изменив несколько параметров в реестре и вызвав WinAPI-функцию.
Windows
Windows-версия «Фоторамка» была написана на языке C# на платформе .NET Framework 4.0. Выбор не самой последней версии .NET Framework обусловлен поддержкой Windows XP.
Клиентское приложение построено на базе Windows Presentation Foundation (WPF), с использованием шаблона проектирования MVVM. Инсталлер «Фоторамки» написан с помощью наборов инструментов Windows Installer Xml (WiX).
Android
Android-приложение работает на версиях начиная с 2.3. Разрабатывая приложение «Фоторамка», мы решили попробовать реализовать для экрана «слайд-шоу», так называемый Immersive mode, который был представлен в версии Android 4.4 (подробнее про него можно прочитать здесь habrahabr.ru/post/200874/). Но нашей целью было сделать приложение, которое бы умело работать не только с версией 4.4. Спрятать и статусбар, и экранные кнопки можно было на прошлых версиях Android 4.x (так, как это реализовано в приложении YouTube на 4.3). При активном Immersive Mode на версии 4.4 тап по экрану вызывает TouchEvent, в то время как в полноэкранном режиме на версии 4.3 по первому тапу происходит выход из режима, и только второй тап уже дойдет до самой вьюшки, по которой нажимали. Перед нами стояла задача отловить тап по экрану и показать дополнительный слой поверх изображения, и поэтому нужно было отловить именно этот первый тап.
Чтобы узнать о выходе из полноэкранного режима на 4.3, нужно было вызвать getWindow().getDecorView() у активити и у полученной вьюшки поставить слушателя setOnSystemUiVisibilityChangeListener(...).
Но и с этим было не все так гладко. Метод onSystemUiVisibilityChange вызывался только спустя целую секунду после того, как мы тапнули и вышли из полноэкранного режима. Таким образом, пришлось отказаться от этой идеи полностью и скрыть экранные кнопки на девайсах с версиями до 4.4. В итоге, на четверках мы поставили флаги fullscreen и low_profile, а на остальных девайсах с 2.3 или 3.x — просто fullscreen.
SDK Яндекс.Диска
SDK для Windows написан на языке C# под .NET 4.0 и представляет из себя несколько проектов Visual Studio. Среди этих проектов есть примеры реализации собственного приложения под каждую из платформ. SDK без изменений подключается к разработке на Windows Phone 7.5 и выше, Windows Store и Silverlight 4 и выше приложений. Взглянув на пример проекта под Windows, нам не составило труда построить всю логику работы «Фоторамки» с Яндекс.Диском.
Аутентификация пользователя осуществляется по протоколу OAuth или с помощью Basic-аутентификации на выбор. Для синхронизации с сервером мы использовали GetListAsync и DownloadFileAsync. Видно, что все методы асинхронные, и это, несомненно, является плюсом.
Во время работы с Windows SDK мы обнаружили небольшую ошибку. Если на Яндекс.Диске находится файл размером более двух гигабайт, то метод GetListAsync не сможет вернуть список файлов из этой директории. В исходниках SDK быстро удалось обнаружить проблему: происходило превышение максимально допустимого значения для Int32. В результате, решение заняло не более пяти минут.
Под Android SDK представляет собой подключаемую библиотеку. Все её возможности подробно рассмотрены в примере приложения, который распространяется вместе с SDK в GitHub-репозитории. В нем же и показан самый оптимальный способ того, как в приложении реализовать авторизацию: сначала на устройстве ищется уже существующий аккаунт Яндекса, в который пользователь вошел через какое-либо из официальных приложений Яндекса, и если такой есть, то вход происходит через него. Если его нет, то следует отправить пользователя в браузер на страницу входа в аккаунт.
Для начала нужно создать OAuth приложение на соответствующей странице. Там же заполнить поле «Callback URI» каким-нибудь url, возврат на который после будем отлавливать в нашем приложении через intent-filter Activity авторизации. Таким образом, мы получаем access_token, который и потребуется для работы с SDK.
Для загрузки изображений в «Фоторамке» требовалось использовать метод API, позволяющий получать изображения в необходимом уменьшенном разрешении, соответствующем размеру экрана. К сожалению, доступ к этому методу в текущей версии SDK ещё не был реализован, так что пришлось немного подправить метод для загрузки файлов и добавить к нему возможность передавать дополнительный параметр «size».
Исходный код SDK можно скачать c GitHub по ссылкам для Windows и для Android.
Заключение
Вся разработка заняла чуть больше месяца. В итоге мы получили простое приложение, которое поможет быстро сделать слайд-шоу из ваших фотографий и поделиться им с вашими родными и друзьями.
Приложение уже вышло в стор, скачать его можно по ссылкам на странице описания проекта.
Будем рады вашему фидбеку и вопросам.
Автор: krokhmalyuk