Android Good Reads @droidgr Channel on Telegram

Android Good Reads

@droidgr


Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

Автор канала: @Lamprof

Размещение рекламы: @tanyasanovna

Android Good Reads (Russian)

Добро пожаловать в канал "Android Good Reads"! Здесь вы найдете самые интересные статьи, видео и новости, связанные с разработкой приложений для Android. Мы тщательно отбираем материалы и публикуем не более трех новостей в день, чтобы предоставить вам только самую актуальную и полезную информацию.

Автором канала является @Lamprof, опытный специалист в области мобильной разработки. Его знания и опыт помогут вам быть в курсе всех последних трендов и технологий в мире Android.

Если вы хотите разместить свою рекламу на нашем канале, обратитесь к @tanyasanovna. Мы предоставляем уникальную возможность продвижения вашего продукта среди нашей целевой аудитории. Присоединяйтесь к нам сегодня и станьте частью сообщества Android разработчиков!

Android Good Reads

09 Dec, 09:46


MVI + Jetpack Compose что и как!

Внутри статьи немного теории о том как устроен MVI (Model - View - Intent) и как он работает.

👉 Hilt, KSP, Room и ViewModel как основа для проекта
👉 Compose навигация

Справедливо заметили, что при таком подходе, ViewModel должна отвечать только за управление состоянием, а разруливание корутин должно уйти на слой ниже, в репозиторий.

Финальный вид приложения можно посмотреть на GitHub

Android Good Reads

03 Dec, 14:23


JetBrains исследует возможность добавить Hot Reload в Compose
https://github.com/JetBrains/compose-hot-reload (404 ⭐️)

Мультиплатформа тоже поддерживается, судя по всему. Для сборки используеть отдельная версия официальных плагинов (2.1.0-firework.31) и сам плагин для hot-reload

5 минутное видео с демонстрацией от одного из разработчиков

Android Good Reads

03 Dec, 09:59


И еще раз про Guard Conditions

👉 Как включить:
1) Проверяем что стоит галочка напротив Enable K2 mode в IDE
2) Добавляем compileOptions

kotlin {
compilerOptions {
freeCompilerArgs.add("-Xwhen-guards")
}
}


👉 Без guard conditions:

when (response) {
is HttpResult.Success -> println("Success")
is HttpResult.Failed -> {
if (response.statusCode == 503) {
println("Maintenance")
} else {
println("Failed with code ${response.statusCode}")
}
}
}


👉 С guard conditions:

when (response) {
is HttpResult.Success -> println("Success")
is HttpResult.Failed if response.statusCode == 503 -> println("Maintenance")
is HttpResult.Failed -> println("Failed with code ${response.statusCode}")
}

Android Good Reads

02 Dec, 06:41


Ультимативный гайд по написанию чисто кода на Jetpack Compose

Тут приведу основные идеи для @Composable функции, а то как надо и как не надо можно увидеть внутри статьи:

👉 Именование функций должно быть в PascalCase
👉 Последовательность параметров
Официальная рекомендация Android: Обязательные параметры -> Modifier -> необязательные параметры -> Вложенная @Composable
Более удобная версия: Modifier -> входные данные -> UI параметры -> калбеки -> Вложенная @Composable
👉 Либо возвращаем значение из @Composable, либо что-то рисуем. Но не одновременно
👉 У каждой функции не более 1 лайаута и при этом она должна быть независимой от места вызова
👉 Каждая функция должна содержать единственный Modifier со стандартным значением
👉 Старайтесь не держать собственное состояние внутри каждой @Composable функции
👉 Используйте отступы предоставляемые через Scaffold

Примеры как надо и как не надо читаем тут

Android Good Reads

01 Dec, 07:02


👨‍💻 Пропала мотивация решать литкод каждый день? Тогда на декабрь забирайте Advent Of Code от Kotlin!
Хорошая тренировка вместо одинаковых задач на литкоде. А если ваши знакомые хотят попробовать Kotlin, то и отличный интенсив для них

Решаете свой advent of code и хотите посоревноваться? Кидайте ссылки в комменты!

Android Good Reads

28 Nov, 12:32


А вот и релиз!
Кратко:

👉 Новые экспериментальные фичи. Guard условие в when, break и continue не только для своего скоупа. Разбирали частично ---> тут
👉 Обновили K2 компилятор и сделали ряд улучшенией в kapt
👉 Для KMM стабилизировали Gradle DSL, много улучшений для Kotlin/Native, Kotlin/Wasm
👉 Поддержка последних версий Android Gradle Plugin
👉 Обновили документацию

Полный список изменений тут
А еще сегодня (28.11) в 7 вечера будет прямая трансляция с разработчиками на тему этого обновления тут

Android Good Reads

28 Nov, 06:44


Полезная библиотека этой недели - https://strikt.io/ (563 ⭐️)
Устали от assertTrue(true == true)? Тогда strikt может упростить вам жизнь!

Примеры:
// Flexible assertions about collections
val subject = listOf("Eris", "Thor", "Anubis", "Ra")
expectThat(subject)
.contains("Eris", "Thor", "Anubis")

// “Narrow” the assertion to elements or ranges
expectThat(subject)[0].isEqualTo("Eris")

// Make grouping assertions
val subject = Deity.values().map { it.toString() }
expectThat(subject)
.isNotEmpty()
.any { startsWith("E") }

// Custom assertions are extension functions
fun Assertion.Builder<LocalDate>.isStTibsDay() =
assert("is St. Tib's Day") {
when (MonthDay.from(it)) {
MonthDay.of(2, 29) -> pass()
else -> fail()
}
}
expectThat(LocalDate.of(2020, 2, 29)).isStTibsDay()


Сильно гибче стандартного функционала. Работает с JUnit5, Minutest и Spek

Android Good Reads

27 Nov, 07:55


Касательно Android 16 DP1, это ведь первый релиз по новой системе ускоренных релизов, верно?

Согласно плану, нас ждёт много нового в средине и в конце года. Новое API и новые Deprecated 😅. Заранее предупреждают, что лучше настроить CI так, чтобы она гоняла тесты на разных API levels. Кстати, а какой targetSdk у вас сейчас в проекте, следуете рекомендациям от гугла?

Android Good Reads

26 Nov, 06:44


Тестируйте умнее, а не усерднее
Google обновили документацию по тестированию приложений

👉 Акцент на продуктивности разработки. Пишем тесты пропорционально пирамиде тестирования, не переусердствуем с частотой запуска тестов. Все ради минимизации стоимости запуска и написания тестов. Если вы все еще плаваете в терминологии и не отличаете где интеграционные, а где Unit тесты, то внутри есть примеры
👉 Дополнили рекомендации по популярным ныне видам тестирования: Скриншот тестирование (недавно разбирали тут), тестирование производительности
👉 Новый термин для UI тестов, не делающих скриншоты, - поведенческое тестирование
👉 Несколько рекомендаций для больших тестов и robolectric
👉 В связи с распространение Foldable девайсов с нестандартным разрешением. Рекомендации по их тестированию, а так же инструменты которые вам в этом помогут

Android Good Reads

22 Nov, 07:31


Kotlin 2.1.0-RC2

Внутри много доработок, но самая важная для меня - стабильная работа в xCode 16+. Я, по-глупости, обновился на macOS Sequoia месяц назад, что потянуло за собой новый xCode, и iOS сборка нашего KMM проекта сломалась на моей ноутбуке.

Да, всегда можно указать xCode через xcodes в командной строке, но потеря возможности манипулировать нативной частью приложения сильно ограничивала меня. Beta версии 2.1.0 продолжили сыпать ошибками в наш проект, а вот RC2 наконец-таки решил все проблемы и все стало как раньше!

Вывод: Не забывайте отключать автообновления 😅

Android Good Reads

21 Nov, 09:02


Ищем автора эталонного кода! 💎

Если вы уверены, что вашему коду подходит звание «Эталонный», а вам — звание «Автор самого красивого кода», то приглашаем принять участие в Конкурсе красоты кода 2.0 и выиграть классные призы от Сбера: iPhone 16 и умную колонку SberBoom.

Опытные эксперты определят победителей в пяти категориях: Backend, Frontend, DevOps, AI и Mobile, — а награждение пройдёт на ключевом IT-событии HighLoad в Москве, 2 и 3 декабря.

Больше 40 участников прошлого конкурса стали частью команды Сбера. Возможно, следующим станете именно вы — переходите по ссылке и изучайте подробности!

Android Good Reads

20 Nov, 10:04


Android 16 Preview BAKLAVA

Вроде, только-только Android 15 проводили в релиз, а уже выходит следующая версия. План такой: Превью сегодня ➡️ Бета в Январе ➡️Стабильная бета в Марте ➡️ релиз по готовности (Июнь)

👉 Изменения в API можно глянуть тут
👉 Внутри релиза теперь есть разделение на минорный и мажорный:

val minorSdkVersion = Build.getMinorSdkVersion(VERSION_CODES_FULL.BAKLAVA)

👉 Новый встроенный photo picker.
👉 Немного интеграции с Health Connect
👉 Privacy Sandbox

По ощущениям, работы, с релизом Privacy Sandbox, прибавится у всех Android разработчиков. А вы что думаете?

Android Good Reads

19 Nov, 06:45


Как лямды ломают хэширование в data class

Надеюсь, вы не кладете лямды напрямую в data class, а если кладете, то делаете это правильно!


val detective1 = DetectiveDataClass(
name = "Sherlock",
age = 40,
alias = "Holmes",
onDetectiveAlert = { println("Elementary!") }
)

val detective2 = DetectiveDataClass(
name = "Sherlock",
age = 40,
alias = "Holmes",
onDetectiveAlert = { println("Elementary!") }
)

println(detective1 == detective2)
// false, хотя ожидается true

println(detective1.hashCode() == detective2.hashCode())
// false, хотя ожидается true

Сравнивая два одинаковых data class’а, получаем неожиданный результат

А исправить можно вот так:
👉 Переопределяем equals и hashCode для этого класса. Не оптимально
👉 Используем method reference

val detective1 = DetectiveDataClass(
name = "Sherlock",
age = 40,
alias = "Holmes",
onDetectiveAlert = ::alertFunction
)

👉 Используем интерфейс и передаем полноценный объект внутрь

Лучше всего, конечно, вынести лямду куда подальше от data class

Android Good Reads

14 Nov, 10:17


PDD - Preview Driven Development

👉 Snapshot Testing лежит в основе. Есть много инструментов помогающих в реализации, начиная от встроенных, заканчивая paparazzi и облачными решениями
👉 Запускаем каждый отдельный экран или часть, как Сomposable функци в превью внутри нашего окружения. Автор мокает весь уровень данных, что позволяет включить в тестирование viewModel и увидеть реально возможное поведение приложения
👉 В каждом пулреквесте вы видите какие части приложения были затронуты вашими изменениями
👉 Для автоматизации сразу же предлагается Github Action и Gradle плагин с глубокой интеграцией в один из облачных инструментов

Еще чуть чуть про PDD было вот тут и на Droidcon тут

Android Good Reads

13 Nov, 09:31


🚀 Следующая версия Android Studio это Meerkat
Основные фичи все еще не заявлены, но уже есть ряд исправлений по сравнению с предыдущими версиями

Android Good Reads

11 Nov, 15:02


React Native + общение = Meetup

20 ноября в 19:00 приходи на React Native Meetup от команды Купер.тех.      

🔥 Интеграция карт 2ГИС в мобильное приложение. Сергей Курочкин, руководитель отдела мобильной разработки в Купере.   

🔥 Code split push — релизим RN-приложение каждый день. Евгений Прокопьев, руководитель подгруппы мобильной разработки продуктовых систем в Купере.   

🔥 Уведомления в приложении Купера. Георгий Мишин, руководитель группы мобильной разработки платформы в Купере.   

Регистрируйся, чтобы попасть в офлайн или не пропустить ссылку на трансляцию!

Реклама. ООО «ИНСТАМАРТ СЕРВИС», ИНН: 9705118142. Ерид: LjN8KTHe2

Android Good Reads

11 Nov, 06:41


Kotlin Multiplatform Roadmap 2025

Дорожная карта на 2025 год. Как будет развиваться мультиплатформа:
👉 В Compose Multiplatform будет упор на интеграцию Jetpack Compose, улучшение перфоманса iOS. Стабилизация и доведение до релизного состояния таких фичей как навигация, управление ресурсами и переводы, а так же accessibility!
👉 Kotlin-to-Swift экспорт, вместо существующего проблемного Kotlin-to-Objective-C . Первую публичную версию ожидаем в 2025 году.
👉 Больше интеграций с Android Studio для удобной работы. Обещают отдельную KMP IDE базирующуюся на существующей IDE Fleet. Очень хочется попробовать, мы в команде иногда используем Fleet, но не как полноценную IDE, а как вспомогательный инструмент
👉 Развитие экосистемы библиотек для KMP. Очень схоже с тем, чем планирует заниматься и Kotlin команда
👉 Amper и его улучшения, как инструмента для сборки. Пока что выглядит сыро, но обещают ряд доработок в особенности для Compose Multiplatform. Gradle, конечно, плох, а bazel сложен для малых команд, но это вдоль и поперек исследованные инструменты. Amper будет сложно конкурировать, но некоторые сценарии просто невозможно реализовать без глубокой интеграции в KMP (ex. Фуллстак приложение на KMP с бекендом)
👉 Продолжат работать над Gradle и другими инструментами для сборки приложений. Обещают упрощение подключения зависимостей для KMP проектов

Android Good Reads

08 Nov, 06:34


Параметризированные Android тесты с Burst 2.0

👉 Писать параметризированные тесты проще и аккуратнее
👉 Android и мультиплатформа поддерживаются из коробки
👉 Проще запускать на большом количестве устройств, решены проблемы с TestParameterInjector
😡 К сожалению, фреймворк не очень хорошо работает с Android Studio, что может осложнить взаимодействие с ним
🤨 Минимальная версия Kotlin 2.0.21, которая прокидывается транзитивно

Пример:
@Test
fun drinkSoda(
soda: String = burstValues("Pepsi", "Coke"),
ice: Boolean,
distribution: Distribution,
) {
...
}


⭐️ 113+ https://github.com/cashapp/burst

Android Good Reads

07 Nov, 17:10


Что влияет на доход от рекламной монетизации приложения?

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

Например, в Рекламной сети Яндекса — свыше 300 000 рекламодателей из 30 индустрий. А точность таргетинга определяется более чем 1000 факторами подбора рекламы.

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

РСЯ поддерживает приложения на iOS, Android, Flutter, Unity и React Native. Сейчас к рекламной сети подключены свыше 15 000 приложений.

Узнать больше о РСЯ и начать зарабатывать на показах рекламы можно по ссылке.

Android Good Reads

06 Nov, 15:07


Онлайн-интенсив «Мобильная разработка на Android: от основ до готового продукта» от НИУ ВШЭ

Присоединяйтесь к интенсиву по разработке мобильных приложений под Android от Центра непрерывного образования факультета компьютерных наук НИУ ВШЭ: за три занятия вы освоите базовый синтаксис языка Kotlin, принципы объектно-ориентированного программирования, особенности платформы Android и создадите свое первое мобильное приложение для перевода текста.

В программе:
- Лекции и мастер-классы: основы языка Kotlin и системы Android, создание пользовательского интерфейса с использованием Jetpack Compose, работа с сетью и локальным хранилищем
- Практика: задания с автоматической проверкой на Stepik после каждого занятия для закрепления навыков
- Проект для портфолио: создание своего первого мобильного приложения

Спикер: Юрий Вараксин, ведущий разработчик MD Audit (ГК Softline) и автор курса «Android-разработчик на Kotlin».

Онлайн-интенсив будет проходить с 11 по 21 ноября. Участие бесплатное для всех желающих, необходимо предварительно пройти регистрацию.

Зарегистрироваться

Реклама: Федеральное государственное автономное образовательное учреждение высшего образования «Национальный исследовательский университет «Высшая школа экономики».
Erid:2SDnjbrv6HR

Android Good Reads

04 Nov, 09:03


Koin Annotations 1.4 в Compose Multiplatform

Зачем использвать:

👉 Код чище: аннотации обеспечивают декларативный и краткий способ определения зависимостей
👉 Поддержка IDE: проще навигация по коду и рефакторинг
👉 Проверка во время компиляции: более раннее обнаружение проблем с внедрением зависимостей (Немного жертвуем скоростью сборки)
👉 Убираем обслуживающий код: KSP автоматически генерирует необходимые extension функции
👉 Multiplatform поддерживается!

Документация: https://insert-koin.io/docs/reference/koin-annotations/start/
Выглядит хорошей возможностью для масштабирования koin как DI в проекте

Android Good Reads

30 Oct, 07:16


⭐️ А вот и порт easycrop для Compose Multiplatform подъехал! В своей статье автор делится мотивацией и проделанными изменениями. Удобная работа с изображением на всех платформах!

Автор просит об обратной связи по поводу статьи и библиотеки. Не стесняйтесь задавать вопросы в комментариях!

Android Good Reads

29 Oct, 12:40


По мере роста проекта возникает всё больше и больше проблем с производительностью UI. Что-то мы отлавливаем автоматически на пулреквестах, что то по репортам пользователей. О том как от релиза к релизу найти снижение производительности в Compose элементах и пишет автор статьи

👉 Берем Macrobenchmark (запуск сценариев), Perfetto (анализ и визуализация трассировок) и Diffetto (сравнения трассировок и определение что за элемент деградировал)

👉 Последовательно перекладываем данные из инструмента в инструмент и находим источник. В статье пример на маленьком приложении со сценарием замедления и тем как смотреть метрики

👉 В больших проектах множество @Composable элементов, тут то Diffeto и выступает незаменимым помошником для фильтрации огромного количества трассировок

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

Android Good Reads

28 Oct, 11:59


Тестируйте мобильные приложения без эмуляторов и телефонов
 
Для тестирования мобильных приложений раньше нужно было покупать разные модели смартфонов, обслуживать устройства, передавать их между сотрудниками и все это без возможности провести параллельное тестирование.
 
Сейчас возможно приблизиться к клиентскому опыту, проводить параллельные тесты на разных устройствах, проверять производительность, нажатия и UI. И все это благодаря мобильной ферме от Selectel. Физические устройства покупать не нужно — они доступны к аренде удаленно.
 
Вы можете получить доступ бесплатно. Для этого запросите демо продукта и убедитесь в удобстве мобильной фермы на собственном опыте.
 
Преимущества мобильной фермы Selectel:
● Простор для тестирования как на популярных, так и на редких моделях телефонов — 100+ моделей смартфонов с разными параметрами (Android версии, процессоры, диагонали и т.д.)
● Доступность — легкая аренда и управление устройствами без ограничений по времени сессий через my.selectel
● Удаленная работа на устройствах из любой точки мира
● Удобство — настройки сохраняются, пока устройство закреплено за вами вне зависимости от количества тестов и длины сессии.
● Безопасность — информация о ваших сессиях автоматически удаляется после завершения аренды
 
Оставляйте запрос на демо продукта: https://slc.tl/pps1m

Реклама АО «Селектел». ИНН: 7810962785 Erid: 2VtzqufhwTa

Android Good Reads

25 Oct, 07:52


Преиспользуем стили в Jetpack Compose

Чтобы сотню раз не проставлять паддинги и обводки в дизайн/системе, объединяем в простой универсальный Modifier:


fun Modifier.paddedBorder(): Modifier {
return this
.border(1.dp, Color.Black)
.padding(8.dp)
}

fun Modifier.cardStyle(): Modifier {
val shape = RoundedCornerShape(4.dp)

return this
.shadow(4.dp, shape)
.background(Color.White)
}


И несколько предупреждений:
👉 Не нужно паковать весь интерфейс внутрь одной функции, сохраняйте атомарность и переиспользуемость таких модификаторов
👉 Не делайте слишком глубокую вложенность из таких модификаторов. Это намного сложнее исправлять

Android Good Reads

23 Oct, 07:45


Все чаще мне попадаются статьи с отказом от DI фреймворков. Пока что не видел какого-либо жизнеспособного решения в продакшене без DI.
Автор одной из минималистичных DI библиотек - Magnet тоже предлагает отказаться от DI и использовать явные зависимости. И почему же?
👉 Это сложно
👉 Время сборки сильно вырастает
👉 Время холодного старта тоже увеличивается
👉 Часто обьекты графа остаются в памяти дольше чем нужно. Да, большинство команд просто плодит синглтоны в том или ином виде и инжектит их. Увы, это и правда плохой подход

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

interface NetworkModule {
val httpClient: HttpClient

class Default : NetworkModule {
override val httpClient: HttpClient by lazy ...
}
}

interface DatabaseModule {
val database: Database

class Default : DatabaseModule {
override val database: Database by lazy ...
}
}

interface RssReaderModule {
fun fetchRss(): FetchRss

class Default(
private val networkModule: NetworkModule,
private val databaseModule: DatabaseModule,
) : UserModule {
override fun fetchRss(): FetchRss ...
}
}

Больше примеров внутри статьи

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

Android Good Reads

19 Oct, 09:26


🚀 Большие релизы предыдущей недели. Выделяем время на миграцию!

👉 Ktor 3.0 Миграция на kotlinx-io, немного улучшений перфоманса, поддержка WASM по всем направлениям. Миграция не сложная

👉 Фиксы и немного стабильности в Kotlin 2.0.21. Теперь поддерживается Xcode 16, а для тех кто любит быть на острие технологий Kotlin 2.1.0-Beta2. Страничка со всеми изменениями тут, но в кратце:
⚡️Условия в when
⚡️break и continue в лямбдах
⚡️улучшения в составлении строковых переменных
⚡️Улучшение k2 kapt (все еще в альфе)
⚡️AGP минимальная теперь 7.3.1, а Gradle 7.6.1
⚡️Большое количество улучшений для WASM и компилятора

👉 Compose Multiplatform 1.7.0. Тут нас ждёт compile-time safety для навграфа, огромные улучшения по перформансу для iOS. Мы с командой уже заценили, хоть и не все было гладко на предрелизных версиях. Material3 библиотеки постепенно мигрируют в общую кодовую базу. Уже привычный Shared element transitions тоже тут!

Android Good Reads

17 Oct, 12:01


Секреты успеха в мобильном гейминге без иллюзий

Приглашаем на конференцию RuStore Mobile Conf: GameDev 2 ноября, где специалисты поделятся секретами продвижения и успешной монетизации мобильных игр. 

Вас ждут информативные доклады от ведущих экспертов, живые дискуссии и презентации инди-проектов. 

Крутая возможность прокачать свои навыки и узнать о самых актуальных трендах в мире мобильного гейминга и о монетизации своей игры. А еще будет возможность рассказать про свой проект и получить фидбэк от спикеров!

Прийти на конференцию бесплатно можно всем, но регистрация обязательна!

Android Good Reads

17 Oct, 06:44


А вот и демонстрация Kotlin RPC. На примере создания фуллстак приложения с KMM, Koin, Wasm
Самый приятный момент это в том что клиент и сервер шарят интерфейсы, модели и статусы. В самой статье много кода, так рекомендую взглянуть.
Из болезненного, со слов автора, это WASM, который еще в альфе, и высокий порог входа. Нужно быть чуть знакомым с kmm концепцией, чтобы разобраться в этом.

Android Good Reads

16 Oct, 06:29


Абстракция для работы со строками

Возникали вопросы как работать со строками в Compose на UI и на data слое чтоб это выглядело удобно? А еще чтобы строки с разных источников были закрыты общей абстракцией и не нужно было разделять строки от пользователя, string.xml и пришедшие с бекенда

Автор предлагает воспользоваться sealed interface такого вида:
sealed interface StringHolder {
// These are the 2 essential Holders
data class Value(val value: String) : StringHolder
data class Resource(@StringRes val resId: Int) : StringHolder

// These are additional and will come in handy!
class ParametrizedResource(@StringRes val resId: Int, vararg val formatArgs: Any) : StringHolder
class Plural(@PluralsRes val resId: Int, val count: Int, vararg val formatArgs: Any) : StringHolder
}


Пример использования:
@Composable
fun ExampleText(stringHolder: StringHolder) {
Text(text = stringHolder.value)
}

class MessageDataSource(private val context: Context, private val api: Api) {
suspend fun sendMessage(message: StringHolder) {
api.sendMessage(message.fromContext(context))
}
}



Из минусов - конечно сложновато это адаптировать к CMP, да и протекание логики в UI может не соответствовать вашей архитектуре.

Android Good Reads

11 Oct, 09:00


Ink API, поддержка рисовалок для Android приложений

Корректная поддержка стилусов. Работает с API 21 (Android 5.0)
Возможности включают в себя кисти, обьекты, обработка отрисованной линии, чтобы она казалась более плавной. Не хватало этого во многих приложениях, особенно если ты пользуешься стилусом. Теперь поддержка стилуса является частью гайдлайнов гугла по созданию приложений. Глянуть и вдохновиться можно тут: https://developer.android.com/adaptive-apps

Android Good Reads

07 Oct, 10:01


Разбираемся с FileProvider

Банальная вещь, но сэкномит вам время

👉 Базово в манифесте определяем провайдер. Решаем нужно ли давать разрешениями на пользование нашими данными другим приложениям (grantUriPermissions, exported)
👉 Определяем <paths>:
<files-path> Для файлов внутреннего хранилища ([pm]/files/)
<cache-path> Для кэша ([pm]/cache/)
<external-path> Внешнее хранилище (/storage/emulated/0/). Учитывайте, что доступ сюда будет иметь любое приложение и без вашего ведома
<external-files-path> Внешнее приватное хранилище (/storage/emulated/0/Android/data/[package_name]/files/)
<external-cache-path> Внешний приватный кэш (/storage/emulated/0/Android/data/[package_name]/cache/)
<root-path> Доступ напрямую из корня. Тут надо осторожно, у вашего приложения может не быть прав на запись
👉 Не забываем про permissions. Можно обойтись без прямого доступа к файловой системе:


intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);


Пример использования для того чтобы пошарить картинку из кэша в email без выгрузки bitmap:


val imagePath = File(context.getCacheDir(), "images")
val newFile = File(imagePath, "image.png")
val contentUri = FileProvider.getUriForFile(context, "com.example.myapp.fileprovider", newFile)

if (contentUri != null) {
val shareIntent = Intent()
shareIntent.setAction(Intent.ACTION_SEND)
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
shareIntent.setDataAndType(contentUri, context.getContentResolver().getType(contentUri))
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri)
startActivity(Intent.createChooser(shareIntent, "Choose an app"))
}

Android Good Reads

04 Oct, 13:42


Как Uber мигрирует нетворк слой на gRPC

Знакомая боль всех мобильный разработчиков с миграцией чего либо на слое данных. Как решает проблему Uber:

👉 Protocol Buffers вместо JSON, HTTP/2 без откатов к HTTP/1.1
👉 Использование gRPC, на который мигрировали постепенно.
С помощью shadow calls проверяли скорость работы и PoC. Это позволило провести небольшое исследование на проде и увидеть результаты без больших затрат.
Поэтапно переводили API, по принципу A/B тестирования и откату к старой REST версии в случае возникновения проблем. Круто же!
👉 Эксперимент привел к снижению нагрузки на 45% и уменьшению задержки запросов на 27%

У компаний сейчас большой запрос на оптимизацию затрат, и это одно из технических решений которые вы можете предложить! Чуть больше по поводу gRPC и Android разработке: https://developer.android.com/guide/topics/connectivity/grpc

Android Good Reads

03 Oct, 14:02


Приглашаем на Mobile PeerLab #2 — камерную встречу для мобильных разработчиков

10 октября в Москве во второй раз пройдет PeerLab от экспертов Райдтеха Яндекс Go. Специалисты разберут кейсы, которые предложат участники: поговорят о DI-архитектуре, легаси и скорости сборки, сравнят KMP и Flutter, объяснят, чем отличаются техлиды от фичалидов, и поделятся советами о тестировании фичей.

После разбора кейсов гостей ждет afterparty, feature dev консультация и активности в реальной качалке — будем тренировать прогерские мышцы!

Реальные кейсы и ответы экспертов Яндекса на ваши вопросы о мобильной разработке — регистрируйтесь и зовите коллег!
Обратите внимание, количество мест ограничено. После регистрации обязательно дождитесь подтверждения заявки.

Android Good Reads

01 Oct, 14:50


🚀 Если вы, как и я, обновили свой макбук и теперь KMM проект не собирается под iOS - появился патч Kotlin 2.0.21-RC с поддержкой Xcode 16.

А еще compose 1.7.0-rc01 с большим количеством оптимизаций и исправлений для Compose Multiplatform проектов. iOS версия нашего проекта стала значительно бодрее. Хотя в альфе, версии к версии, не все работало хорошо.

Android Good Reads

30 Sep, 06:45


В понедельник утром оптимизируем загрузку изображений в compose и kotlin MP

Сохраню вам время. Общий посыл - используйте landscapist (2100+ ⭐️) Шустрый плагин, совместимый с coil, fresco и glide.
Работает как с последним coil3, превьюхами Android Studio и wasm. Используем?

Android Good Reads

27 Sep, 07:56


🎨 Главное — чтобы было красиво!

Тесты, шместы, архитектура — это всё прекрасно. Но в итоге главное — чтобы было красиво! Я вот вспомнил одну нашу фичу, где надо было сделать кастомный контрол типа табов, которые плавно анимировались, центрировались на выбранном, а потом обратно схлопывались. Всё на Compose, конечно. 💻

И что вы думаете? Контентные паддинги в LazyRow не помогли, игры с отступами тоже. Даже использование horizontalScroll не дало результата. Пришлось думать дальше. 🤔

А как в итоге сделали? Ну, это можно назвать костылём (или нормальным решением, если вам так больше нравится). Добавили "фейковые" элементы в начале и в конце списка и анимировали их размер. 🙃

Используем LazyRow и делаем первый и последний item просто прозрачные Spacer, чтобы создать видимость отступов. Плавно и красиво анимируем их ширину, и всё! 💫 На самом деле не совсем всё: это тянет за собой много всего, чтобы учитывать эти элементы по-особенному (чтобы не кликались, не анимировались, не участвовали в выборе и т.д.).

Как заметили в комментариях, это создает дополнительные рекомпозиции 🫣, что не может не радовать. Такой трейдофф решили взять. Но в итоге всё выглядит плавно, аккуратно, ну и просто красиво! 🌟

В комментах я добавлю скриншот кода и видосик — там видно, как это анимируется и центрируется. 🎥

А у вас какие были проблемы из-за красоты? Поделитесь! 😎

#android #compose #ui #lazyrow

Android Good Reads

27 Sep, 07:56


Красивое решение для LazyList с канала мобильное чтиво. Многие в процессе миграции с xml на compose, так что берите элегантный хак на заметку!

Android Good Reads

26 Sep, 15:15


#вакансия
Команда Яндекс 🌍 Путешествий ищет того, кто поможет сделать лучшее Android-приложение для бронирования отелей. Откликайтесь на вакансию, если вы…

📍 готовы писать код самостоятельно и быстро
📍 можете обсудить детали реализации и предложить варианты выполнения задачи
📍 способны отвечать за выполненную работу

Подробнее про стек, условия и задачи — по ссылке 💛

Android Good Reads

26 Sep, 07:51


Устали писать обслуживающий код? Автоматизируем все с помощью KSP

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

Android Good Reads

24 Sep, 06:29


Визуальный гайд по структуре мультиплатформенных проектов

Хотите быстро объяснить коллеге, как устроить архитектуру с KMP/CMP? Это лучший вариант!

👉 Compose MP c разделением по слоям
👉 Kotlin MP с общим presentation слоем. Странный вариант, есть идеи когда это выигрывает?
👉 Kotlin MP c общим data слоем.
👉 Kotlin MP, как общий модуль для нативных приложений. На мой взгляд это самый лучший вариант, но продать эту идею iOS команде еще не получалось
👉 Стандартный вид CMP предлагаемый из шаблонов

Больше возможных архитектурных шаблонов с KMP/CMP: https://github.com/TheSetox/kmp-sample-diagrams