Android Live 🤖 – Telegram
Android Live 🤖
5.29K subscribers
52 photos
1 video
800 links
Самые свежие новости, новинки и тренды Android от практикующего разработчика.


Автор: @al_gorshkov,
Чат: @android_live_chat
Личный блог: @al_gorshkov_blog

Рекламу не размещаю
Download Telegram
​​Firebase App Distribution
#разработка

Одним из способом доставки билда тестировщикам, является Firebase App Distribution. Это хороший и простой способ. И у него есть следующие преимущества:
• бесплатный;
• нет лимитов на размер файла приложения;
• работает и на iOS и на Android;
• можно добавлять группы тестировщиков;
• можно приглашать в тестирование по ссылке;
• добавление release notes к каждому билду;
• интеграция с Android Studio.

Для меня ключевым является последний пункт. Даже если у вас в проекте нет CI-системы, то вы легко можете выполнить одну gradle-команду, чтобы загрузить свежую версию приложения в Firebase с release notes и оповестить всех ваших тестировщиков.

Оповещением займется сам Firebase, а мы давайте посмотрим, как же получить release notes от HEAD в git до последнего тега. Пусть все коммиты с префиксом {ADD} — это наши release notes.
Для этого выполним команды:
1) def tagNumber = "git describe --abbrev=0 --tags".execute().text.trim() — вернёт там последий тэг
2) def releaseNotes = ("git --no-pager log ${tagNumber}...HEAD --no-merges --date-order --format=%s --grep {ADD}").execute().text.trim() — вернёт нам список коммитов с префиксом {ADD}
3) new File("release_notes.txt").text = releaseNotes — сохраним всё в файл

А дальше чуть-чуть настроим Firebase:

firebaseAppDistribution {
releaseNotesFile = project.rootProject.file('release_notes.txt')
}


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

Осталось только объединить описанные выше команды в одну при помощи gradle task, назовём её logs и выполним эти команды:

task getLogsAssembleAndDistributeQaRelease(type: GradleBuild) {
tasks = ['clean',
'logs',
'appDistributionUploadQaRelease']
}

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

На канале хочу запустить новую рубрику. Суть её состоит в том, чтобы брать интервью у разработчиков, живущих в других странах и городах.
Будем разговаривать про уровень жизни в стране, культурные привычки, наличие работы, насколько легко туда переехать, нравится ли жить там, сколько стоит жизнь, ну и самое важное — какой зарплатный уровень и налоги.
Получится обширная статья про страну, направленная на жизнь разработчика. Ну а цифры буду суммировать в табличку, чтобы сделать вывод: «Где же лучше жить разработчику?»

Скажите, насколько было бы вам интересно видеть эту рубрику? Какие страны хотелось бы видеть прежде всего и в каком формате?

Лично мне это кажется интересным, ведь информации из первых рук в Интернете не так много. Пишите в комментариях или мне в личку @al_gorshkov и, конечно, голосуйте реакциями. 🤓
Ого, понял, что идея с рубрикой вам зашла!

Особая благодарность подписчикам, которые написали мне в личку с предложением рассказать о своём городе. Если кто-то ещё хочет, но при этом стесняется — не надо переживать, пишите мне @al_gorshkov, уверен, что остальным будет интересно прочитать о вашем опыте.😌
Android Academy про Android 11
#конференции

Уже прошло пару месяцев с момента появления Android 11, но всё равно ещё есть доклады, которые рассказывают о новых фишках и деталях.

Ребята из Android Academy Global делают мероприятие, где будет 3 темы:

1️⃣ Jetpack Dagger Hilt, Мануэль Виво, Google
2️⃣ ActivityResultApi and AppStartUp Api, Алексей Быков, Revolut
3️⃣ Jetpack Paging 3, Дмитрий Мовчан, Revolut

Оно будет уже совсем скоро, 4 августа в 19:00 по Москве. А зарегистрироваться можно тут.
​​Оптимизация приложения для автозаполнения
#разработка

Совсем недавно, столкнулся с интересным, и на первый взгляд, странным багом. У одного пользователя приложения при вводе параметров в EditText появлялось всплывающее сообщение с выбором логина и пароля для входа в него (в приложение).
Пришлось капнуть в сторону решения этого бага, и выяснил одну деталь, которую я раньше игнорировал.

При создании нового EditText в xml, он предлагает ввести атрибут importantForAutofill. Чтобы убрать warning, можно просто игнорировать этот атрибут или добавить в EditText параметр tools:ignore="Autofill". В этом случае, вы уберёте warning, но сможете поймать похожий на мой баг.

Однако лучше не полениться и оптимизировать своё приложение для сервисов автозаполнения. 😊
Например, если вы не хотите, чтобы ваш EditText был доступен для заполнения, используйте в нём параметр android:importantForAutofill="no". Но, например, для ввода логина или пароля, можно поставить этот атрибут yes и добавить новый атрибут android:autofillHints="password" для паролей и android:autofillHints="emailAddress" для e-mail.

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

Подробнее про автозаполнение и доступны константы можно прочитать тут.
​​Жизнь в Израиле
#интервью #экспаты

Итак, начнём новую рубрику на канале!

Наш первый гость — это Андрей Раньков. Он проживает в Израиле, город Кфар-Саба (15 км от Тель-Авива) вместе с женой и двумя детьми. Андрей является Mobile Lead в компании Appcard.

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

Ссылка на форму, где можно задавать свои вопросы тут.

А если у вас есть предложения или вопросы по этому формату, или же вы проживаете в других странах и хотите поделиться опытом, то пишите мне @al_gorshkov.
​​Используйте In-App Review API для Google Play ревью
#разработка

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

Наконец-то Google даёт нам API для того, чтобы пользователь мог поставить оценку приложения прямо в нем. 👍🏻
Подробнее о том, как работает API можно почитать тут.

По сути, это API — часть Play Core Library, которая сделана для Java/Kotlin, C++ и Unity. Google подчёркивает, что важно определить, где в вашем приложении самое лучшее место для того, чтобы попросить пользователя оставить оценку.
​​Анимация как в Google почте
#разработка #статьи

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

В этой статье автор описывает, как сделать анимацию открытия почты приложения Google-почта. На мой взгляд, получилась приятная и ненавязчивая анимация, которую можно использовать в качестве основной при открытии экранов вашего приложения.
​​KotlinX Datetime
#разработка #библиотека

Совсем недавно разработчики из JetBrains анонсировали библиотеку для работы с датами kotlinx-datetime версии 0.1.

Это здорово, потому что до последнего момента не было возможности работать с датами напрямую из Kotlin. И если мы, как Android-разработчики, могли напрямую ссылаться на API java.time.*, то при работе с мультиплатформой такой возможности не было.

Более детально о работе с этой библиотекой можно прочесть тут
​​Давненько на канале не проводилось конкурсов. Это нужно срочно исправлять😉

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

Старт конкурса 19 августа в 18:00. Задачку, как всегда, можно будет решить в течении 48 часов.

В этот раз за призы отвечают ребята из команды Badoo.
И вас ждёт 3 призовых места:
🥇место — толстовка + сумка + мерч;
🥈 место — футболка + сумка + мерч;
🥉 место — сумка + мерч.

Кстати, команда Badoo Tech, ведёт интересный Telegram канал, где делится своим опытом. Подписан и давно читаю: @badoo_tech
​​Эти PIN-коды могут быть легко подобраны
#статьи

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

Мне кажется, что мало кто отдаёт себе отчёт, насколько безопасным является их код для разблокировки. Сегодня я хочу поделиться с вами исследованием, где публикуются списки небезопасных pin-кодов. Можно попробовать найти в нём свой собственный. 😏

Интересно, что исследователи пришли к выводу, что 6-значные коды фактически не увеличивают безопасность, так как в этом случае пользователи стараются вводить более простые коды: даты, запоминаемые коды или шаблоны клавиатуры.

Ссылка на исследование тут.
​​Бесконечная строка
#конкурс

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

Входные параметры
s — строка, которая становится бесконечной;
n — число-ограничитель до которого нужно посчитать количество символов a;

Выходные параметры
Целое число — количество символов a в этой строке.

Ограничения
1 <= s.length() <=100
1 <= n <=10^6

Пример входных данных
aba
10

Пример выходных данных
7

Объяснение
Строка aba, которая может повторяться бесконечно ограничивается числом 10 и превращается в abaabaabaa. И количество символов a в ней равно 7.

Шаблон на языке Kotlin.

Условия конкурса
1. Решения принимаются в течении 48 часов, то есть до 21 августа 2020 года, 18:00. Необходимо отправить только тело функции.

2. Отправить можно только одно решение.

3. Можно исправлять отправленное решение неограниченное количество раз. Принятым будет считаться решение, отправленное последним.

4. Победителем будет являться самое короткое тело функции func().

5. В подсчете количества символов учитывается только тело функции. Например, в примере return 0; количество символов равняется 9. Это и определяет длину решения.

6. Переименовывать функцию нельзя, как и изменять входные параметры. Убирать return также запрещается.

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

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

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

Также, если кто-то хочет помочь в проверке решений при помощи тестов, то пишите мне.

Решение нужно отправить в форму. Желаю всем удачи!
​​Распознавание рисунков при помощи ML Kit
#статьи #разработка

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

Автор рассматривает Digital Ink Recognition API из ML Kit, которое распознаёт написанный вручную текст или изображение с экрана. По его словам, результаты довольно точные.

Любопытно, что приложение также может работать оффлайн, правда при этом надо скачать модель в виде 20 мегабайт.

Описание того, как сделать такое приложение и ссылка на готовое можно найти тут.
​​Результаты конкурса «​​Бесконечная строка»
#конкурс

Итак, самое время подвести итог нашего конкурса.
В этот раз в конкурсе участвовало 65 решений. Довольно много было и решений, которые не удовлетворяли условиям конкурса: присутствовали и удаления return из функции, и ошибки каста Long в Int.
Такие решения не прошли отбор, так как условия чётко оговаривали правила того, что нельзя никак менять параметры функции, равно как и удалять return. 😊

В результате победили решения, которые имели 52 символа:

1) return(0..n-1).count{s[it.toInt()%s.length]=='a'}*1L@Namolem
2) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L@amihusb
3) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L@luckycactus

Так как решения участников имеют однинаковую длину, то рандомное распределение призов выглядит следующим образом:
1) толстовка + сумка + мерч — достаются номеру 3, или @luckycactus
2) футболка + сумка + мерч — достаются номеру 2, или @amihusb
3) сумка + мерч — достаются номеру 1, или @Namolem

Ссылка на видео с рандомным распределением тут.

Спасибо команде Badoo на отличный мерч и призы.
Кроме того, отдельное спасибо @g_apollo и @KoteykaEvil за помощь в проверке заданий.

Также благодарю всех кто участвовал в конкурсе! И поздравляю победителей! 😎

Конкурс далеко не последний, поэтому вновь спрашиваю вас: какие призы вам были бы наиболее интересны при проведении подобных конкурсов? Напишите, пожалуйста, мне.
​​Android Lint Framework — введение
#разработка #статьи

Android Studio даёт довольно много инструментов для того, чтобы писать качественный код. Одним из таких является Lint: IDE подсказывает вам о каких-то неточностях в вашем коде и распространённых багах, к которым можем привести этот код.

Однако самым главным преимуществом является то, что каждый сам может написать свои правила для кода. 😎 Автор этой статьи описывает шаги для написания своего lint-правила:

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

Также есть неплохой репозиторий от Uber, где содержится целый набор lint-проверок.
​​Как писать быстрые layouts
#разработка #статьи

Каким-бы функциональным и красивым не было приложение, мало кто из разработчиков хотел бы получить отзывы о том, что приложение работает медленно на устройстве пользователя.
Порой не просто сделать своё приложение «летающим» на всех устройствах, так как даже интерфейс системы работает с лагами на некоторых девайсах.

Но всё равно нужно держать в голове следующий момент: большинство устройсв сегодня имеют частоту обновления экрана в 60 fps, то есть на отрисовку одного кадра у нас есть 1/60 ≈ 16 миллисекунд. Для того, чтобы добиться этого результата у нас есть несколько инструментов и советов.

1) Используйте средства для диагностики проблем с layouts: Layout Inspector, Systrace, Android Profiler. Каждая из них достойна отдельного поста, поэтому пока только ссылки в документации.

2) Переиспользование layouts с merge.
Вынесение layout в xml и использование его при помощи include — довольно распространённая практика. Однако, многие забывают, что вместо корневого layout можно написать merge, который уберёт лишний уровень вложенности.

3) Используйте подходящий родительский layout.
Для этого пользуйтесь следующим правилом: для сложной верстки — ConstraintLayout, для вертикальных или горизонтальных последовательных элементов — LinearLayout, для расположения элементов одного над другим — FrameLayout.

4) Используйте ViewStub.
ViewStub — это хорошая альтернатива, когда вам нужно показать тяжёлый layout на экране или сделать этот показ отложенным. Он быстро рендерится и легко применяется, поэтому не забывайте про этот инструмент.

Подробнее про эти советы можно почитать тут.
​​Jetpack Compose теперь в Alpha
#разработка #опрос

Сегодня вышла Alpha версия фреимворка Jetpack Compose.
Финальную версию обещают к 2021 году, ну а пока у нас есть:

🔹анимации;
🔹поддержка Constraint Layout;
🔹жесты;
🔹совместимость с текущими проектами и View;
🔹preview в Android Studio;
🔹и другие изменения.

Обновление довольно глобальное, с нетерпением жду beta версию. 😎
Примеры приложений уже есть тут, знаменитый Sunflower и новый для меня Tivi.

Подробнее про изменения можно почитать тут.

Ждёте Jetpack Compose?
​​Constraint Layout 2.0
#разработка #статьи #конференции

Constraint Layout — один из самых популярных компонентов Jetpack. И не зря: это отличный способ построения сложной вёрстки, причём для этого можно использовать только встроенный редактор (хотя иногда удобнее пописать код).

Совсем недавно ConstraintLayout 2.0 перешёл в релизную стадию, и теперь его можно смело затягивать в проект. Давайте же поговорим, что там появилось нового в отличии от первой версии.

🔹Flow — это «виртуальный» layout, который позволяет соединять view в цепочки, которые могут переходить на следующую строку при недостатке места. Очень полезная штука, особенно когда вы не знаете, насколько широкими и разными будут компоненты у вас на экране, но вам обязательно нужно показать их все. Так как это виртуальный layout, то он не добавляет новых view в иерархию, а просто содержит в себе несколько свойств для перечисленных ссылок на view. Почитать побольше об этом компоненте можно тут

🔹Layer — это так же «виртуальный» layout, который позволяет применять какие-то трансформации для view сразу для всей группы. Например, если вы хотите применить анимацию перемещения для большого числа view, то можно просто перечислить их в отдельный layer и применить анимацию только для layer.

🔹Motion Layout — наверное, одна из самых ожидаемых фич. Он позволяет создавать фактически любые анимации довольно простым и удобным способом благодяря встроенному в Android Studio редактору.

В одном пункте об этой фиче не расскажешь, но тут очень кстати ребята из Android Academy Minsk организуют митап, который рассказывает про Motion Layout и как его применять.
Пройдёт он 3 сентября в 19:00 по МСК. На митапе мы узнаем что такое MotionLayout и какие проблемы он может решать, изучим базовые вещи для анимаций а также пошагово в конце получим готовый экран Логина/Регистрации. Ссылка на регистрацию тут, а само мероприятие онлайн и бесплатно.

А почитать чуть-чуть больше об описанных изменениях можно в этой статье.
Ещё немного о Jetpack Compose
#конференции

Ребята из Android Academy Global организуют митап, который посвящён теме Jetpach Compose. Доклады довольно крутые, учитывая свежесть технологии:

1) Jetpack Compose and MVI — Артур Бадретдинов, Squire Technologies. Доклад будет о том, как связать паттерн MVI и свежий Jetpack Compose. Посмотрим на примеры реализации и как это будет работать в связке.

2) Easing In and Out with Jetpack Compose — Артем Нестеренко, Loóna Inc. Новый подход даёт нам возможность легче создавать анимации. Также посмотрим на примеры кода и узнаем, каково же это писать анимации в декларативном стиле.

Мероприятие будет уже завтра, 01.09.2020 в 19:00, оно будет онлайн и бесплатно.
Ссылка на регистрацию тут, а ссылка на YouTube прилетит прям перед началом😎.
​​Kotlin Multiplatform Mobile теперь в Alpha
#разработка

Сегодня команда JetBrains анонсировала альфа версию Kotlin Multiplatform Mobile! Это SDK, который позволяет писать бизнес-логику приложений сразу под 2 платформы. 👍🏻 Альфа версия включает в себя также и плагин для Android Studio, который позволяет писать такие проекты.

Уже есть примеры приложений, которые использовали у себя KMM:

Quizlet мигрировали бизнес-слой с JavaScript на KMM и значительно улучшили производительность как Android, так и iOS приложений;

Fastwork начали использовать KMM для шаринга бизнес-логики и API для нескольких команд разработки;

Yandex.Disk начали экспериментировать с небольшой фичи, после чего переписали всю синхронизацию данных на KMM.

Больше информации и полный текст анонса можно почитать тут.

Что-то конец лета выдал нам кучу новинок и теперь не знаешь даже, за что ухватиться в первую очередь 😄
​​Зачем использовать Material Design тему?
#разработка #статьи

Любое Android-приложение соседствует с множеством других установленных приложений. Именно поэтому одним из принципов Material Design — это: «Все приложения должны иметь схожее поведение в рамках одной операционной системы».

Чтобы этого достичь, Google рекомендует использовать Material Design Components. Кроме этого, есть MaterialComponents Theme для приложения.

Давайте рассмотрим, почему вам стоит использовать именно её вместо AppCompat или стандартной библиотеки.

1️⃣Поддержка большего числа компонентов. MDC даёт довольно большое количество стандартных компонентов для показа, а также «расширяет» возможности текущих.
Например, MaterialButton предлагает гораздо больше стандартных стилей, чем обычный Button.

2️⃣Material Theming — это способ, который позволяет правильно кастомизировать приложение конкретно под ваш дизайн.
При помощи MDC можно настраивать цвета, тип шрифта, форму для приложения и использовать их при помощи атрибутов.

3️⃣Темная тема. Поддержка тёмной темы — это распространённая фича в приложении.
MDC позволяет настраивать этот паттерн из коробки, учитывая настройки пользователя в системе.

4️⃣Material Motion. MDC предлагает целый раздел о том, как должны быть устроены переходы между экранами. Их не очень сложно применить в проект, но при этом само приложение выглядит гораздо живее.

5️⃣Jetpack Compose. Уже не в первый, и далеко не в последний раз мы будем говорим об этом новом фреимворке. MDC уже готовит свою кодовую базу для перехода с Compose в будущем, что существенно ускорит миграцию нам.

В целом, переход на Material Theme довольно прост и даёт преимущества. На него стоит перейти только ради стилей для стандартных виджетов, которые особенно круто выглядят на последних версиях Android.

Подробнее про эти преимущества можно почитать в этой статье.