Telegram Web
​​Podlodka Crossplatform Crew
#conference

Тут ребята из Podlodka сообщают, что совсем скоро состоится неделя первой конференции Podlodka Crossplatform Crew. Старт 14 декабря. Что там будет?

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

Никаких “Hello World!” на абстрактных примерах, только настоящий опыт внедрения и использования кроссплатформы в реальных проектах от топовых экспертов.

Тем, кто уже хорошо знаком с любой из платформ, неделя Crossplatform Crew будет особо полезна, потому что поможет понять, какая кроссплатформа лучше всего подойдет проекту, и подойдет ли вообще. В программе:

• интервью про кейсы внедрения Flutter, React Native, Kotlin Multiplatform Mobile в разных компаниях;
• воркшопы по интеграции разных технологий в существующий проект;
• рулетка кейсов и шоу “Прожарка”. Описывать бессмысленно – это надо видеть! 🤓

Подробное описание, спикеры и билеты доступны на сайте по выгодной цене.
Ну и традиционно, у моих подписчиков есть возможность выиграть один билет. Как и раньше, нужно просто оставить свой ник Telegram в форме. Форма открыта до 11 декабря, 13:00, розыгрыш будет в тот же день.

Если вы выиграете билет, но при этом вы уже купили один — то не переживайте, организаторы вернут вам деньги, так что затариться по выгодной цене лучше уже сейчас 🤓.
​​Kotlin Flow
#flow #kotlin #documentation

Совсем недавно Google добавили в раздел документации информацию про Kotlin Flow. Давайте посмотрим подробнее, что там есть.

Вначале описывается то, что из себя представляет Flow: по сути, это тип, который похож на Iterator, который также отдаёт последовательность данных, но при этом использует suspend-функции для работы. Работа любого Flow делится на этапы создания, обработки и получения данных.

Для создания Flow можно использовать специальный builder, в котором можно вызвать функцию emit для публикации данных во Flow. Есть также две особенности работы Flow, о которых надо помнить:
🔹Flow последователен, поэтому все вызываемые suspend-функции ждут результата выполнения друг друга.
🔹flow builder не может «емиттить» данные через другой CoroutineContext.
Описан также хороший пример для понимая работы Flow.

Дальше есть пример использования оператора map — как пример изменения данных, формируемых Flow.
Сразу за ним — использование оператора collect для получения данных.

📌Важно обратить внимание на использование оператора flowOn, так как он распространяет своё действие на операторы, написанные выше.

Не забыли упомянуть и про обработку исключений, используя оператор catch.

Подробнее можно почитать тут. Как по мне, получилась хорошая документация, описывающая базу для работы с Flow. Годно.✌🏻
​​Jetpack Compose и эквивалентные View
#compose #view #tips

При переходе на новую технологию или фреимворк, сложнее всего искать альтернативы уже знакомым конструкциям.
Для многих таким фреимворком сейчас может быть Jetpack Compose.

Тут @loskin поделился крутым ресурсом, который сопоставляет традиционные View с эквивалентами из Compose. Кроме этого, даст ещё и ссылку на пример из GitHub и на официальную документацию🔥.

А если перейти на начальную страницу, то можно найти подборку примеров приложений, использующих Jetpack Compose.

Даже если вы сейчас не пишите на Compose, то стоит сохранить сайт в закладки, так как в будущем он вам обязательно пригодится.
​​Подмена Runtime Permissions
#security #subscribers

Тут @vitach скинул свою статью, где описывает, как подменить Runtime Permissions на свежих версиях Android.

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

Идея заключается в наложении поверх этой системной Activity своей с флагом android:windowIsTranslucent=true, который позволяет делать Activityс прозрачным фоном, а также добавить парочку флагов, чтобы убрать фокус:

FLAG_NOT_FOCUSABLE — убирает возможность взаимодействия с методом ввода;
FLAG_NOT_TOUCH_MODAL — отправляет события touch за пределы нашего окна;
FLAG_NOT_TOUCHABLE — убирает возможность получать события касания.

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

Баг работает на версиях Android >= 7.1.1, так как до этой версии показывался диалог с предупреждением о перекрытии окна.

Ссылка на код тут, а статья с описанием тут. Ну и читайте внимальнее те разрешения, которые даёте установленным приложениям.🙄
​​Результаты конкурса Podlodka Crossplatform Crew
#конкурс

Итак, пришло время опубликовать результаты конкурса, который был описан тут.

В конкурсе приняло участие 15 человек, при помощи генератора случайных чисел был выбран победитель — @YakovlevAleksey, с чем я его поздравляю! 🎊

Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах!
​​Как использовать Ktor на сервере?
#ktor #kotlin #server

Странно видеть подобный заголовок на канале для Android-разработчиков. Ведь для нас создание сервера — это другой мир, в который не особо-то и хочется вникать. 😊
Для своих проектов можно использовать Firebase, но с ростом проекта он может стать дорогим. Можно выбрать другое решение — написать свой собственный сервер на всеми нами любимом Kotlin.

Есть библиотека Ktor, которая позволяет делать асинхронные запросы на клиенте и сервере, используя Kotlin и под капотом построенная на Coroutines. Звучит интересно, да и написать свой собственный сервер для своего приложения — тоже отличный вызов. 😎

Подробнее о том, как использовать этот подход можно почитать тут и тут.
Авторы рассказывают о том, как сделать первый проект, какие зависимости надо добавить, а также какой хостинг можно использовать для работы онлайн.
​​Jetpack Compose — Live coding сессия
#compose #youtube

Друзья, у меня для вас хорошая новость. Канал Android Live расширяется и переходит в том числе и на YouTube!

И первая трансляция будет связана с горячей темой — Jetpack Compose. 😎
Да-да, тот самый, новый фреимворк, который позволяет писать UI в декларативном виде и в будущем заменит текущий xml-подход.

Вы много читали о нём на канале, а может быть уже попробовали его в небольших проектах.
В любом случае у вас могли остаться вопросы, ответы на которые вы можете получить на стриме!

Гостем будет Григорьев Дмитрий — автор канала который целиком посвящён Jetpack Compose и имеет внушительный опыт написания приложений при помощи Jetpack Compose.

Вместе с ним мы сделаем простое приложение, где рассмотрим:
🔸 как лучше строить архитектуру;
🔸 как делать списки из разных типов view;
🔸 что делать с навигацией между разными экранами;
🔸 как сделать анимации;
🔸 что делать с текущими приложениями;
🔸 и много другое.

Уже сейчас вы можете дополнить трансляцию интересующими вас вопросамм, задав их в форме.

Стрим состоится 21 декабря в 18:30 по МСК. Ссылка на трансляцию появится позже, а пока можете подписаться на пока пустой канал Android Live, чтобы не пропустить новые видео. 🤓
Android Live 🤖 pinned «​​Jetpack Compose — Live coding сессия #compose #youtube Друзья, у меня для вас хорошая новость. Канал Android Live расширяется и переходит в том числе и на YouTube! И первая трансляция будет связана с горячей темой — Jetpack Compose. 😎 Да-да, тот самый…»
​​Room и опциональные параметры
#room

Есть достаточно интересная фича Room о которой не написано в документации, но которая может здорово облегчить жизнь разработчикам.
Думаю, причина заключается в том, что эта функция лишь косвенно связана с Room, а больше связана с написанием SQL-запросов. 🙂

Опытным путём получилось её найти, и спешу поделиться этим лайфхаком с вами.

Допустим, у вас в приложении есть список людей. При этом по умолчанию выводится полный список, но пользователь приложения может выбрать параметр с именем человека, и вам надо отфильтровать список по этому параметру.
В Kotlin у нас есть возможность использовать опциональные параметры для функции, и первое решение, которое приходит в голову — это написать запрос, используя их:

@Query("SELECT * FROM User WHERE name = :name")
fun getUsers(name: String? = null): List<User>

При такой записи параметр считается за часть запроса, и не передаёт name, в этом случае список будет пустым.
Но можно чуть-чуть поменять запрос, и всё работает корректно:

@Query("SELECT * FROM User WHERE (:name IS NULL OR name = :name)")
fun getUsers(name: String? = null): List<User>

При такой записи параметр name будет игнорироваться, если он будет null, и возвратится весь список, имеющийся в базе данных.
Особенно круто эта фича заходит, если фильтр состоит из нескольких полей (3 и более).

А какие у вас есть неочевидные кейсы при работе с Room?
​​​​Android Study Jams. Ещё митапы
#intro

В начале месяца я рассказывал вам о мероприятии для начинающих разработчиков — Android Study Jams, которое было организовано студенческим сообществом из Саратова и где я был спикером.

Мероприятие прошло хорошо, и у тех, кто хотел побывать на нём, но не смог, есть ещё целых два шанса прикоснуться к разработке под Android.

Первое мероприятие будет сегодня, 17 декабря в 17:30 по МСК. Зарегистрироваться можно тут, а организатором является DSC Брянск ✌️

А если у вас не получится присоединиться сегодня, или останутся вопросы по приложению, то есть шанс задать их завтра, 18 декабря в 18:30 по МСК. Детали тут, а организатором является DSC Воронеж.

Здорово, когда в разных городах создаются новые сообщества и организуются мероприятия, где с нуля можно попробовать технологии.
​​Почему Kotlin Synthetics Deprecated?
#kotlin

Несколько месяцев назад Android Kotlin Extensions Gradle плагин был помечен depricated. Он давал нам две классных фичи:
Synthetics — плагин, который позволяет заменить findViewById;
Parcelize — плагин, который позволяет создавать Parcelable при помощи одной аннотации, без использования boilerplate.

Parcelize никуда не уходит, а только перемещается в отдельный плагин kotlin-parcelize, а вот Synthetics уходит навсегда. Давайте посмотрим предпосылки, почему это произошло.

Но прежде рассмотрим все существующие подходы для поиска View.

1️⃣findViewById — функция, которая проходит по иерархии View и находит по идентификатору ту, которая необходима.
Имеет ряд существенных недостатоков:
метод поиска дорогой и разработчики часто используют этот метод повторно не задумываясь о последствиях производительности;
метод не null safe, то есть если в дереве не найдётся View с переданным идентификатором, то будет NullPointerException ;
нет кастования до требуемой View до Android API 26;
много boilerplate кода, особенно когда в классе много View.

Есть библиотека Butter Knife, которая заметно уменьшала количество кода, однако и сократила скорость сборки приложения, к тому же не решала ряд проблем. Сейчас она также depricated.

2️⃣Kotlin Synthetics — по сути вызывал описанный выше метод единожды и кэшировал полученные значения.
Из плюсов:
нет boilerplate кода, ведь всё что требуется — это настроить плагин в Gradle и использовать идентификаторы прямо из xml-файла;
type safety, то есть вам не надо делать никаких кастов.

Но давайте пройдёмся по недостаткам:
частично null safe. К счастью, если вы удалите какую-то view из xml, то в коде также будет подсветка удалённой View. Однако, если вы используете несколько конфигурационных файлов, то есть шанс нарваться на NullPointerException.
загрязнение namespaces. Если вы имеете несколько одинаковых идентификаторов в разных xml-файлах, то есть риск импортировать неверный файл и также получить NullPointerException.
работает только в Kotlin. Может быть не критичным для тех проектов, который написаны на Kotlin, но критично для тех, у кого есть Java.

Именно из-за описанных недостатков он и был помечен depricated.
Давайте обратимся к альтернативе. ⤵️

3️⃣View Binding — в целом, урощённая версия Data Binding, который по сути «биндится» только для ссылок на View, не связываясь с данными.
Плюсы:
нет boilerplate кода;
полностью null safe;
type safety;
нет влияния на build time в отличии от Data Binding;
поддерживается как в Java, так и в Kotlin

Отмечу один минус: чуть больше строк кода в сравнении с Kotlin Synthetics, ведь необходимо создать экземпляр переменной binding, которую придётся использовать потом повсюду.

Хотя я и сам очень любил Kotlin Synthetics, и мирился с его недостатками, но теперь придётся переезжать на View Binding. 🤔
Ссылка на документацию по инструменту тут.
​​Jetpack Compose — Live coding сессия
#compose #youtube

Друзья, уже сегодня, 21 декабря в 18:30 мы с вами погрузимся в мир Jetpack Compose и создадим рабочее приложение.

По ходу сессии вы сможете задать вопросы нашему гостю Григорьеву Дмитрию, автору канала Jetpack Compose.

Напоминаю, что мы с вами рассмотрим:🔹
🔹как лучше строить архитектуру;
🔹как делать списки из разных типов view;
🔹что делать с навигацией между разными экранами;
🔹как сделать анимации;
🔹что делать с текущими приложениями;
🔹и много другое.

Ссылка на трансляцию тут.
​​Быстрая настройка CI/CD для Android при помощи GitLab
#cicd

CI/CD — это инструмент, который позволяет автоматизировать повторяющиеся действия. Например, это может быть прогон тестов или загрузка билда в Slack, Firebase, а также анализ кода. Вариантов множество, но эти самые распространённые.

Даже если вы единственный человек в команде, то вам стоит настроить один раз CI/CD для однотипных действий.

Есть довольно много различных систем, но если вы используете в качестве git-системы GitLab, то можно использовать его систему для этих целей и не платить деньги за ещё один сервис.

Есть полезная статья, которая ответит на начальные вопросы, связанные с настройкой: создание билда, прогон тестов и загрузка в Slack. Выглядит действительно очень просто, поэтому нет смысла не начинать использовать полезный инструмент.🤓
​​Quick Guide для миграции приложений на Android 11
#tips

В этом году мы много писали о нововведениях, связанных с Android 11: поддержка 5G, notification chat bubble, notifications priority conversations, scoped storage, package visibility и другие.
Большинство приложений, в целом, готово и будут работать на свежей версии Android, однако стоит посмотреть, не было ли изменений в тех областях, на которые завязано ваше приложение.

Нашёл хороший чеклист, где описываются изменения в работе Android 11.
Тут есть как критичные изменения, такие как: foreground service type, one time permissions или scoped storage, или незначительные, например плавный показ клавиатуры в приложении или notification bubbles.

Детальнее можно почитать тут и быть уверенным, что приложение полностью готово к новой системе. 👌🏻
​​Прокачиваем Logcat в Android Studio
#tips

Android Studio имеет огромный набор инструментов, которыми мы не пользуемся. А некоторыми из них пользуемся так же, как они настроены по умолчанию, без тонкой надстройки для себя. К такому инструменту может относиться один из самых распространённых — Logcat.

Вот как его можно настроить:

1️⃣ Цветовая схема. Мы можем показать 5 различных типов сообщений в зависимости от их важности. По умолчанию все они выводятся белым и отличаются только префиксом в начале сообщения. Можно улучшить читаемость, настроив цвет текста для каждого типа. Для этого надо выбрать File > Settings > Editor > Colors Scheme > Android Logcat. Несколько хороших цветовых схем, одной из которых пользуюсь я тут.

2️⃣Формат вывода. По умолчанию, каждое сообщение содержит следующую информацию: дата и время, идентификатор процесса, package name, tag и сообщение. Часто нам не нужно столько информации, поэтому это также легко можно настроить и вывести только необходимую.

3️⃣Расположение Logcat. Изначально панель с логами выводится в самом низу, что в целом удобно для большинства разработчиков. Но если у вас широкий монитор, или их несколько, вы можете показывать эту панель в любом удобном месте, таким образом расширив окно для ввода кода.

Подробнее о настройках можно почитать тут.
​​Ресурсы с иконками
#tips

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

▪️Material Design Googleэтот ресурс содержит множество иконок в стиле Material от Google. Главной фишкой является несколько стилей одной и той же иконки: filled, outlined, rounded two-tone и sharp. Примерный аналог можно найти, используя набор иконок, встроенный в Android Studio, но тут их больше.

▪️Material Design Iconsресурс является альтернативной первому ресурсу, но главной фишкой тут является наличие иконок от сторонних дизайнеров, которые часто выглядят гораздо круче, чем стоковые.

▪️Feather Icons — хороший ресурс с набором outlined иконок, где главная фишка — настройка ширины обводки этой самой иконки.

▪️Boxicons — ещё один ресурс с набором нестандартных иконок: например, логотипами компаний. Их тут относительно немного, но может помочь, если нужна подобная иконка.

▪️IBM Iconsнабор иконок от IBM, где также можно найти любопытные иконки. Большинство из них выглядят не в Material стиле, но радует их большое разнообразие.
​​Touch Event Management
#subscribers

Тут @Vel_daN, один из подписчиков канала, написал отличную статью о взаимодействии с touch event. Мы не так часто используем эти функции напрямую и переопределяем этих слушателей у себя, однако это может быть полезно, если нужно взаимодействовать с несколькими View сразу.

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

У автора, кстати, много интересных статей про MotionLayout, а недавно появилась статья про работу с ConstraintLayout из кода.

Также мы многое обсуждаем в чате канала. Например, автору можно задавать свои вопросы и, возможно, они послужат идеями для следующих статей 😉.
​​Новый год 2021 🎄

Вот и подходит к концу 2020 год 🥳 Для многих он оказался непростым: самоизоляция, резкий переход на удалёнку, пандемия, отсутствие путешествий, да и общая обстановка была не очень позитивная. 🙄

Но он заканчивается, и я надеюсь, что будущий год принесёт больше позитива в нашу жизнь. Желаю всем нам набраться сил на этих каникулах, а потом заряженными и настроенными на позитив решить все сложные и интересные задачи, а также легко править can’t reproduce баги. 🤓

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

До новых встреч в 2021 году 💥
@al_gorshkov
​​Набор статей для разработчиков
#subscribers #compose

Тут @unniked поделился ссылкой на репозиторий, где сохраняет полезные статьи для Android-разработчиков.
Всё разделяется на несколько разделов: Java, Kotlin, UI, Architecture, Jetpack, NDK и многие другие. Статей много и каждый, вне зависимости от уровня знаний, найдет для себя что почитать. 🤓

Ну и отдельно автор выделяет всеми нами ожидаемый Jetpack Compose, где также собрано множество статей для любого уровня.

У многих сейчас неделя выходных, и это может быть отличной возможностью подтянуть свои знания по Android. ✌🏻
​​Где разработчики зарабатывают больше
#sites

Есть классный ресурс, о котором узнал только сегодня — это сервис Levels.fyi, который собирает актуальную информацию о зарплатах IT-специалистов.

Во-первых, можно узнать об уровнях разработчиков в известных компаниях. Не все знают, что уровни разработчиков — это не только стандартные Junior-Middle-Senior.

Во-вторых, множество удобных фильтров: по городу и стране, тегам, вакансии и т.д.

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

В целом, сервис больше ориентирован на зарубежный рынок, хотя и наши компании тоже встречаются. 🙃
2025/09/04 01:53:12
Back to Top
HTML Embed Code: