TagРазработка

Realm: хитрости при сохранении данных сервера

Ситуация в следующем: приложение делает REST запрос на получение данных, сохраняет их в базе, каким-то образом модифицирует, затем снова их получает с сервера. Все довольно тривиально, казалось бы, если бы не одно «но» — где мои локальные изменения?

К сожалению, Realm не поддерживает обновление данных с пропуском конкретных полей, как это было сделано в реквесте на гитхабе проекта, например

But, what about a call to specify a list of the fields that one want to overwrite (or preserve)?
copyToRealmOrUpdateOverwritingFields("field1","field2")
copyToRealmOrUpdatePreservingFields("field1","field2")
copyToRealmOrUpdate(obj).preserve("field1","field2")

https://github.com/realm/realm-java/issues/2179

что было бы довольно удобно. Давайте рассмотрим на примерах. Представим, что у нас есть чат, в котором у сообщений есть флаг «прочитано». Наш REST интерфейс не возвращает об этом состоянии никаких данных и вся информация о том, было ли сообщение прочитано или нет, хранится только локально. Continue reading

Android: логгирование и отправка результатов на почту

Привет.

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

Одно дело — разработка, LogCat в Android Studio (если вы из любителей пожестче — можно распечатку в консоли смотреть с помощью adb), и совсем другое — ломать голову над вопросом почему у вас все работает на всем парке тестовых устройств, а пользователь жалуется на абсолютно обратную ситуацию. Коммуникация между разработчиком и конечным пользователем — это хорошо, но совсем другое — видеть своими глазами картинку происходящего (помните, как в матрице — для кого-то это зеленые иероглифы, а для кого-то — женщина в красном?)

Continue reading

Сборка библиотеки FFmpeg для Android приложения

Есть не так много библиотек, которые позволяют добавить функционал ffmpeg в ваше Android приложение. А если говорить про отсутствие в проекте NDK, то количество вариантов практически стремится к нулю. Я давно уже познакомился с ffmpeg-android, которую собственно и использую в приложении Selfie Timelapse App, однако все чаще и чаще приходилось сталкиваться с проблемой практически нулевой поддержки разработчиков.

Так, к примеру, ковыряться с библиотекой пришлось впервые, когда понял, что размер проекта меня не устраивает (чуть меньше 30 мегабайт). Оказалось, что в aar файл зашит скомпилированный ffmpeg для архитектур ARM и x86. Так как последних довольно мало (по крайней мере устройства на этой архитектуре мне лично не встречались), то я решил удалить ее поддержку из проекта.

Размер готового файла при этом стал колебаться в районе 20 мегабайт.

После появилось желание обновиться до последней версии ffmpeg (в библиотеке зашита версия 3.0.1). Пришлось очень сильно гуглить, чтобы получить приемлемый результат.

Continue reading

Как сделать электронную книгу из блога на LiveInternet.ru

Используя Android, саму площадку и Calibre для OS X.

Давайте начнем с того, что LiveInternet.ru — это мертвая площадка.

По крайней мере на основе информации, которой я владею. Все что я вижу там — это древний устаревший интерфейс с кучей рекламы и непонятными перспективами. Возможно, я не прав, может, кто-то активно пользуется этой платформой, а про всякие Medium, Golos.io и даже ЖЖ думает — вот людям заняться нечем, напридумывали разного.

С другой стороны, когда-то liveinternet.ru был довольно активной блог-платформой, так что вполне возможно, что у кого-то там хранится архив наивных мыслей, которые — вот внезапность — вдруг захотелось перечитать на сон грядущий. Имея в наличии такой же набор инструментов, что и я, можно эту хотелку реализовать.

Continue reading

Как подделать запрос с использованием CSRF токена для Instagram

Если вы увлекаетесь разработкой для Android и когда-то вам пришла в голову идея написать свое приложения для Instagram, то вы наверняка сталкивались с тем, что API, которое эта социальная сеть предоставляет своим разработчикам, отличается крайне скупыми ресурсами, и используя их сложно сделать приложение, от которого вообще возможна хоть какая-то польза. Получаемая информация от сервиса в основном крутится вокруг аккаунта, под которым произошла авторизация — последние посты, список тех, кто лайкнул пост, информация об отношениях между пользователями и проч., но никаких полезных действий — лайков, поисков по тегам и проч. произвести не получится.

С одной стороны, все логично и может быть легко объяснено. Это просто способ защиты соцсети от массовых накруток аккаунтов, от автоматизации процессов постинга и проч. Принимая это во внимание, можно предположить, что Instagram позиционирует себя как социальная сеть, все виды взаимодействия с которой могут быть произведены только вручную. К сожалению, это ограничивает многих, ведь помимо «незаконных» действий с инстаграмом можно было бы разрабатывать альтернативные клиенты для этой соцсети, ведь давно уже не секрет, что официальный (и единственный) клиент обладает рядом дико раздражающих минусов (плохо реализованный Material Design, например, или отсутствие ландшафтной ориентации на Android, или полное отсутствие версии для iPad и проч.).

Но, оставим позади все эти причины и поговорим о том, как эти ограничения можно обойти.

Continue reading

Periodic JobScheduler в Android Nougat

Буквально в одну строку — начиная с Nougat нужно пересмотреть использование периодических задач с использованием JobScheduler и вот почему: минимальное время повторения составляет 15 минут!

То есть если у вас есть необходимость в фоновом вызове некоторого кода чаще (например, для обновления UI виджете), придется отказаться от вызова setPeriodic.

Таким образом в моем рабочем проекте уже 3 (ТРИ!) имплементации для фоновых повторяющихся задач — для старых версий Android, от Lollipop до Android M, и дальше.

Связано это с оптимизацией работы батареи, правда на спинах разработчиков.

 

How to share story on Facebook on Android

Привет всем!

Facebook  прекращает поддержку Graph API v2.1 30 октября 2016 года, а это значит, что некоторые проекты, которые работают на этих механизмах, требуется переписать.

Несмотря на то, что лично я часто ругаю Facebook за крайне запутанный способ ведения документации (и вообще все, там абсолютно все запутано!), он предоставляет довольный мощный инструмент для всего, который порой, правда выглядит как наведения пушки на воробья.

В одном из проектов мне пришлось переписать полностью класс по работе с Facebook — начиная от авторизации (как мы помним, класс по работе с сессиями Session канул в лету), заканчивая шарингом историй. И если с первым пунктом никаких проблем особенно не возникло (достаточно просто следовать документации и у вас все получится), то со вторым пришлось немного повозиться.

Continue reading

Паттерны проектирования: строитель

С паттерном «Строитель» (хотя лично я никогда его так не называю — для меня он Builder) знакомы все, кто хоть немного продвинулся в изучении уроков на startandroid или других подобных (Александр  Климов, например). Лично я впервые с ним столкнулся в незапамятно далеких временах, когда изучал AlertDialog. Думаю, не я один такой.

Ладно, перейдя от знакомства с билдером к его непосредственному применению, мы перенесемся на некоторое время вперед. Ниже я покажу код, как я использую этот паттерн при вызове авторизации на удаленном сервере.

Итак, мой код изначально выглядел следующим образом
Continue reading

Laravel collections: изменить атрибут у элементов

Collections — это отличный инструмент для работы с коллекцией каких-либо данных (это может быть результат выборки Eloquent элементов, или массив объектов). Лично я его активно использовал для создания пагинации, а сегодня открыл для себя еще способ использования.

Итак, проблема заключалась в следующем: я получал из базы список дефолтных цен для товаров (таблица prices), и одновременно получал список измененных цен для них же в рамках конкретных акций. В силу построения архитектуры, я не мог получить эти данные через один SQL запрос (в моем случае — с помощью Eloquent Query Builder, если точнее). Отображать же пользователю нужно актуальные цены, а не дефолтные, поэтому я использовал получание этих значений через отдельный массив, ключом которого был guid цен.

Однако использование дополнительных массивов не «есть хорошо», поэтому мне стало интересно, есть ли в Laravel collections способ сделать код красивее. И оказалось, что решение есть!

Где «prices» — это стандартные цены (название, обычная цена и проч), а массив «currentPrices» — это актуальные цены. В blade шаблоне мне не приходится искать массив по ключу и обрабатывать ошибку если ключ не найден, теперь это делается по уму в контроллере.
 

Эмуляция медленного интернет соединения на реальном устройстве Android

Причины, по которым вам понадобилось узнать как ведет себя приложение, которое вы разрабатываете, на устройстве с медленным интернет соединением (3G, GPRS и проч.) могут быть известны только вам: если они у вас появились, значит, есть тому причины. А вот как с этой проблемой разобраться, я опишу ниже.

Прежде всего, надо уточнить, что данный способ работает на OS X.

Continue reading