Kotlin Adept Notes
1.98K subscribers
67 photos
10 videos
113 links
Канал о разработке на Kotlin и обо всем, что с ним связано
По всем вопросам и рекламе: @ajiekcx
Download Telegram
Нашли серьезную уязвимость в Jetpack Navigation Compose, которая позволяет открыть любой экран в приложении, даже если там нет явных диплинков ⚠️

Эксплуатируется она максимально просто, достаточно знать имя пакета и название маршрута в графе навигации:


Intent().apply {
setClassName("your.package", "your.package.MainActivity")
data = Uri.parse("android-app://androidx.navigation/YOUR_DESTINATION")
startActivity(this)
}


Как защититься

1. Разумеется лучший вариант не использовать данную навигацию, можете посмотреть мой пост со сравнением библиотек навигации для Compose и выбрать подходящую
2. Если в приложении не используются диплинки, можно частично решить проблему перетерев data в определенном intent:


val intentData = intent.dataString
if (intentData != null && intentData.startsWith("android-app://androidx.navigation")) {
intent.setData(null)
}


#Security #Compose
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13👍6🔥5😱4👀2👻1
Оператор RxJava, изменивший все

Недавно взялся за небольшой старый проект, в котором все еще большинство приложения было написано на RxJava, и я по всем правилам бойскаута переводил только новые куски на корутины до вчерашнего дня. Пока не пришлось столкнуться с огромной цепочкой, состоящей по меньшей мере из 15 операторов 👋

Мне всего лишь нужно было добавить одно условие в оператор onErrorResumeNext, но то, как это делается с типом Single, абсолютно не подходит для типа Maybe, а казалось бы какая разница 💁‍♂️

Тут новое поколение скажет: "Дед, ты таблетки забыл выпить, какая нафиг RxJava, какой еще Maybe"

В общем потупив минут 5, я решил, что оно того не стоит и переписал всю цепочку на корутины, а затем и весь проект... Иии... Результат того стоил!

👍 Все места, где использовались Single и Maybe стали обычными suspend функциями с последовательным кодом
👍 Эта сложная Rx цепочка вообще превратилась в цепочку котлиновских операторов над коллекцией
👍 Теперь нигде не нужно было явно переключать диспатчер
👍 А главное, что я переписал весь проект с первого раза, без единого бага 💪
👎 Без минусов, конечно, тоже не обошлось, в стандартной библиотеке Flow не всегда хватает операторов, например мне не хватило throttleFirst и interval, благо я знаю, где их искать и как написать самому, потому что с Flow кастомные операторы — это супер просто!

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

💬А в ваших проектах еще остался Rx?

#RxJava #Coroutines
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍26🔥101👎1
По мотивам прошлого поста, у людей возник вопрос, а что сложного в обработке исключений в корутинах?

Давайте посмотрим на маленьком примере, в каких случаях приложение скрашится при возникновении исключения в suspend функции getException?
🤝3
В каких случаях приложение скрашится при возникновении исключения в suspend функции getException?
Anonymous Quiz
7%
1,2
18%
1,3
45%
1,4
6%
2,3
7%
2,4
17%
3,4
Паззлеры по корутинам можно делать около бесконечно, поэтому нет никакого смысла все это запоминать, но давайте последний раз посмотрим, есть ли смысл вообще пытаться...

В каком случае программа завершится успешно?
👍1
В каком случае программа завершится успешно?
Anonymous Quiz
27%
1
14%
2
28%
3
11%
4
20%
Ни в каком
👍1
Канал незаметно перевалил за тысячу подписчиков 🎉

Спасибо, что читаете мои редкие записки!

В честь этого давайте разыграем Telegram Premium (поддержим Пашу и я смогу редактировать оформление канала 👏), а также чуть позже будет розыгрыш билета на следующий сезон Podlodka Android Crew, так что stay tuned 🎩
Please open Telegram to view this post
VIEW IN TELEGRAM
👏184🔥1
This media is not supported in the widget
VIEW IN TELEGRAM
🔥384👍1
Топ 4 незаметных бага при смене стека

Помните я похвастался, что переписал проект с RX на корутины без багов? Так вот я соврал 😼

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

1️⃣ Переходя с Rx на корутины у вас может сломаться Retrofit, при этом только для специфичных кейсов, когда в ответе приходит код 204, Retrofit начинает воспринимать успешный ответ как ошибку из-за отсутствия Body.

2️⃣ Переходя с Retrofit на Ktor проверьте все экстеншены для определения сетевых ошибок, зависимость на OkHttp у вас останется, но работать экстеншены перестанут так как исключение уже будет не HttpException, а ResponseException.

3️⃣ А также проверьте места, где возвращается Response, а не Body, в Retrofit это всегда успешная операция вне зависимости от ответа, в Ktor же это будет ошибкой, если выставлен флаг expectSuccess.

4️⃣ При переходе с GSON на KotlinxSerialization убедитесь, что все опциональные поля моделей помечены nullable и имеют дефолтное значение, так как GSON мог засунуть null даже в non-nullable поле и все могло работать, если к этому полю не обращаться.

💭 А какие незаметные баги просачивались у вас при рефакторинге стека технологий?

#Android #Kotlin
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍285🔥3🤔2
Kotlin Adept Notes
This media is not supported in the widget
VIEW IN TELEGRAM
🎉19👏5😍2
Kotlin Adept Notes
Поздравляю победителя, но никому не советую разыгрывать Telegram Premium, если вы вдруг собирались.

По итогу пришлось забанить 195 ботов в канале 😀 и сделать на сегодня канал частным, чтобы не налетело ещё больше ботов на розыгрыш.

Очень странно, что ТГ сам не умеет отсеивать ботов, в целом там довольно понятные паттерны как их можно определять🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔23👍52🔥1😱1
🎁 Розыгрыш билета на Podlodka Android Crew

Продолжим череду розыгрышей на канале, мы с ребятами подготовили для вас очередной сезон Podlodka Android Crew про автоматизацию разработки.

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

От вас всего два условия:
1. Быть подписанным на канал @kotlin_adept
2. Написать любой комментарий про автоматизацию разработки. Может есть что-то, что надоело делать вручную или, наоборот, вы что-то уже автоматизировали 💬

Победителя выберем рандомно среди всех, кто выполнил условия, и подведем итоги 14 сентября.

Ну а те, кто не верит в фортуну, ловите промокод на скидку: android_crew_12_o1TLih 🤦‍♂️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3
Автоматизации в умном доме

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

Умный дом – это не голосовое управление, умный дом – это автоматизации


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

Собрать умный дом можно на базе чего угодно:
1️⃣ Использовать HomeAssistant, с ним можно сделать все что угодно, но все в коде.
2️⃣ Использовать готовые экосистемы вроде Aqara, тут все просто с настройкой, но ограничены линейкой устройств и никаких гибких кастомизаций.

💟 Я выбрал что-то среднее, а именно SprutHub, это универсальный хаб, который поддерживает большое количество устройств и позволяет делать сценарии с помощью блоков, но при этом очень гибко, как не позволяют Aqara и умный дом от Яндекса.

Давайте рассмотрим пример освещения в ванной. Базовый сценарий простой, мы хотим, чтобы свет горел, пока кто-то есть в ванной.

Для этого потребуется как минимум умный выключатель и два датчика: движения и присутствия.

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

То есть свет включается по датчику движения, а отключается по датчику присутствия.

☹️ Хотелось бы сказать, что все работает как часы, но датчики тоже не идеальны и могут сбоить, поэтому можно сделать ещё дополнительный сценарий с датчиком закрытия двери:

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

А что если вы хотите днём включать свет, а вечером подсветку? Это все можно настроить внутри SprutHub, поэтому смело рекомендую эту экосистему, если соберётесь делать умный дом 👍

Если у вас есть вопросы по умному дому, смело оставляйте комментарии 💬

#Offtop #SmartHome
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥182👍1
iOS библиотеки в Kotlin коде

Не все знают, что в KMP мы не только можем скомпилировать Kotlin код в iOS фреймворк, но и, наоборот, использовать сторонние iOS библиотеки в Kotlin коде.

▶️ Например, есть две нативные библиотеки под Android и iOS, и вы хотите объединить их в одну KMP библиотеку и сделать все на Kotlin, тогда у вас есть два пути:

1️⃣ Использовать cocoapods (сторонний менеджер зависимостей в iOS), тогда подключение iOS фреймворка делается в одну строчку кода
2️⃣ Подключать фреймворк вручную, но тут все намного сложнее

Проблема cocoapods в том, что недавно их перевели в режим поддержки и большинство iOS разработчиков мигрируют свои зависимости на официальное решение SPM (Swift Package Manager), поэтому пойдем по второму пути и подключим iOS framework вручную:

1. Необходимо создать файл с расширением .def, где опишем некоторые параметры:

language = Objective-C
modules = YourFrameworkName
package = YourFrameworkName


2. В build.gradle вашей библиотеки необходимо добавить конфигурацию для создания klib из фреймворка с помощью cinterop 🤯:

KotlinNativeTarget.compilations.getByName("main") {
val YourFramework by cinterops.creating {
defFile = project.file("src/nativeInterop/cinterop/YourFramework.def")

compilerOpts("-framework", "YourFramework", "-F${projectDir}/../YourFramework.xcframework/$frameworkArch/")
compilerOpts("-fmodules")
}
}


Сделать это необходимо для всех iOS таргетов❗️ Также как и в следующем шаге.

3. В build.gradle файле, где будете собирать итоговый фреймворк для iOS нужно прилинковать тот же фреймворк:


KotlinNativeTarget.binaries.all {
linkerOpts("-framework", "YourFramework", "-F${projectDir}/../YourFramework.xcframework/$frameworkArch/")
}


💡 Как видите, делается это довольно сложно, поэтому не рекомендую использовать сторонние iOS библиотеки в Kotlin коде, лучше в общем коде сделать интерфейс, а реализацию оставить нативной на каждой платформе.

А еще если в iOS проекте уже использовалась эта библиотека, но другой версии, то все конечно же развалится 😂

#KMP #Kotlin #iOS
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
😍9👍8
Как вкатиться в KMP без MacOs

Сегодня, слушая доклад Никиты Куликова на Podlodka Android Crew, получил для себя интересный инсайт.

Довольно часто видел вопросы в стиле, как мне вкатиться в Kotlin Multiplatform, если под рукой нет мака? Ведь на другой ОС запустить приложение под iOS не выйдет.

Решение довольно интересное, GitHub предоставляет вам бесплатное и безлимитное использование разных раннеров для Open source проектов, в том числе и на MacOs, соответственно вы можете собирать iOS проекты на CI и затем тестировать их на iPhone, если он у вас конечно есть🙃

Если хотите больше таких инсайтов и интересных обсуждений с разными экспертами, то вы ещё успеваете залететь на конференцию со скидкой по промокоду android_crew_12_o1TLih 😉

#KMP
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Шаблонный код в пару кликов

Коллега из Контура, Евгений Мельцайкин, поделился Geminio шаблонами для генерации boilerplate кода.

Geminio – это плагин от HeadHunter для генерации кода из freemarker-ных шаблонов.


В репозитории вы найдете несколько полезных примеров, которые сможете смело переиспользовать в своем проекте:

🔸 Шаблон для создания Data и Domain слоя
🔸 Шаблон для создания Compose экрана
🔥 Шаблон для создания Decompose компонента + MviKotlin

🌟 Давайте накинем звёздочек в репозиторий этому джентльмену 😊

#Kotlin #Decompose #MviKotlin
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥8👎1
Перевернутые модификаторы

Неудивительно, что Android и iOS разработчики часто не могут найти общий язык, ведь у них (у нас) все перевернуто с ног на голову 🇦🇺

Это касается и модификаторов в декларативных UI фреймворках. На картинке видно, что цепочка из одинаковых модификаторов для Compose и SwiftUI дают один и тот же результат, при этом располагаясь в обратном порядке.

➡️ В Compose первый модификатор size задает минимальные и максимальные констрейнты и мы не можем выйти за эти ограничения, не переопределяя их.

➡️ В SwiftUI таких ограничений нет и там всегда padding применяется во вне, что может быть даже удобнее, так как не приходится об этом задумываться.

🗓 Но к чему я это все? На ближайшей конференции Мобиус буду рассказывать доклад, где сравню ключевые отличия обоих фреймворков, и если тема интересна, то буду рад видеть всех на докладе 😉

#Compose #SwiftUI
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥91😁1🤪1
В публичный доступ опубликовали воркшоп от Павла Стрельченко по созданию плагинов для любых IDE от JetBrains 👩‍💻

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

💡 Почерпнуть идеи для плагинов и автоматизаций
🔮 Понять как мыслить при работе с незнакомым кодом
🐞 Увидеть как эффективно работать с дебаггером
✏️ Услышать полезные советы и многое другое

Приятного просмотра

#Plugins #Kotlin #IDE
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Пока готовился к докладу, нашел неплохой репозиторий с набором разных анимаций для Compose Multiplatform.

Там вы найдете множество разных примеров:
🟣Анимации заставок разных приложений (Netflix, Twitter, GitHub, Slack и др.)
🟣Кастомный pull-to-refresh
🟣Анимация горения свечи
🟣Упоротая сова из Duolingo

А если вы iOS разработчик, то вот вам еще более классный репозиторий с кучей красивых анимаций для SwiftUI 💅

#Animation #Compose #KMP #SwiftUI
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25😍1