Старый Мобильщик
74 subscribers
34 photos
1 video
1 file
118 links
Разработка мобильных приложений, дедлайны и все, что вы любите в IT.

Будни. Сниппеты. Заметки.

Когда-то были AsyncTasks ... Android 2.3.3 и ни одной вакансии в городе-миллионнике

Обсудить что-либо: @activitynotfound
Download Telegram
Попробовал удобный и быстрый способ протестировать диплинки в Android-приложении.
Просто запускаем команду:

adb shell am start -a android.intent.action.VIEW -d "deep_link_url" app_package_name

И приложение запускается с нужным диплинком.
Красота!
👍1🔥1
Любопытный баг нашелся в Compose:
https://issuetracker.google.com/issues/192433071

Суть: при нажатии на Back сперва сбрасывается фокус поля вместо перехода на предыдущий в стеке экран. Приходится дополнительно тапать на Back.
Статус у бага вроде бы уже fixed, но пока не ясно до конца в какой версии исправят. На текущей стабильной версии Compose 1.1.0 вроде бы еще проявляется.

Вариантов исправить несколько, но если не сильно заморачиваться, то просто к полю ввода добавляем такой вот костыль-модификатор:

modifier = Modifier
.onKeyEvent {
if (it.key == Key.Back) {
// presenter.onBackPressed() or something like
true
} else {
false
}
}

Ждем включения фикса в основную версию.

p.s. Давненько я что-то ничего не постил… в общем как вы там поживаете в ваших Грузиях / Армениях ? 🙂
👍4
Я снова с вами!

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

Кстати, теперь у постов будут теги для быстрого поиска.

Что новенького?
1️⃣ В банке сменилось руководство (теперь российское), но изменений в плане работы пока особых нет. Работаем как и раньше. Ограничений на работу из-за рубежа тоже нет, в отличии от Альфы, Сбера и еще парочки банков. Вот коллегам из Открытия (по слухам) тяжелее всего. Хотя, ВТБ многих заберет к себе, если покупка осуществится.
2️⃣ Потихоньку наша махина переходит на рельсы MVI + Compose. MVI пока самописный, благо не так чтобы сложно его реализовать в базовом виде. По Compose вроде дела идут неплохо: переносим свои компоненты на него, что-то выкидываем, ибо хватает стандартной поддержки, но все упирается как всегда во время.
3️⃣ Активнее начали заниматься написанием тестов и скоро их количество в конкретном функционале будет проверяться на CI. Сделаем минимально допустимое покрытие перед мержем ветки в dev.
4️⃣ В Сентябре переболел ковидом, но в легкой форме, поэтому полет нормальный.

А как у вас дела?
👍4
В xml-разметке когда привязываете элемент к top и bottom других элементов, используя ConstraintLayout, по-умолчанию нужный кусок макета займет не всю область между двумя другими и нужно проставить ему height = 0dp. Частый кейс!

В Compose если поставить у этого элемента в модификаторе height = 0.dp это не сработает.

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


Modifier
.constrainAs(content) {
bottom.linkTo(termsAndConditions.top)
top.linkTo(topBar.bottom, margin = 32.dp)
...
height = Dimension.fillToConstraints
}


Теперь элемент растянется по всей высоте.

#Compose #ConstraintLayout
👍1
Кто бы мог подумать, что в 2023 я буду прикручивать к Android-приложению снова веб-сокеты? Еще когда только технология появилась все в мобильном мире считали как должное, что нужно обязательно их попробовать затянуть в проект. Потом все как хапанули с ними, особенно, в кейсах, когда нужно работать с сокетом из нескольких мест в приложении и держать коннект в фоне, который так и хотел где-то закрыться или память покушать. Видимо mobile-мир, как и человечество развивается по кругу (ну или просто архитекторы у нас вызывают вопросы?). Теперь ждем снова, когда будем хапать кое-чего на лопате.

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

webSocket = builder.newWebSocket(
Request.Builder().url(url).build(),
webSocketListener
)

и дальше работать с объектом WebSocket.
Минус реализации в OkHttp в том, что вы не можете гибко контролировать коннект. Есть только открытие сокета, закрытие и отправка / получение сообщения. Хотя может и есть, я пока не встретил сходу, при том что в исходник тоже заглянул.

Как думаете зачем в банке могли потребоваться веб-сокеты в 2023?
Нет, не для чата 🙂

#WebSocket
👍4
Небольшой нюанс многомодульности в Android Studio Electric Eel

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

Суть: коллега закончил перенос конфигов в build.gradle для всех модулей на KTS и слил это в dev.
Но при мерже в ветку с новым модулем, который был только локально в этой самой ветке произошла аказия: студия САМА добавила вот такие строки в КАЖДЫЙ build.gradle:


apply plugin: 'org.jetbrains.kotlin.android'

implementation("androidx.core:core-ktx:+")
implementation("androidx.core:core-ktx:+")


Неприятно.

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

#Многомодульность
👍2🤔1
При переходе с MVP на MVI очень спасает мини-библиотека kotlinx.coroutines.rx2.

Проект старый, весь код работающий с API в основном возвращает Rx-сущности. А методы Middleware в котором как раз мы и дергаем этот API, возвращает flow.

Поток данных внутри flow-билдера должен быть синхронным, что как раз и позволяет сделать эта маленькая библиотечка, добавляющая метод-расширение await() к SingleSource/CompletableSource/MaybeSource и тд. Внутри расширения используется блок suspendCancellableCoroutine, который оборачивает каллбеки Rx, возвращая результат.

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

val response = interactor.apiRequest().await()

Крайне рекомендую, если у вас все еще смешанное использование Coroutines/Rx.

#MVI #Coroutines #Rx
👍4🤔1
В Compose 1.2.0 появились Chips.
Раньше контрол на скрине был у нас на базе RadioGroup, а теперь элементарно переехал на LazyRow + FilterChip.
Отличие FilterChip от обычного Chip в настройках цвета для выбранного/обычного состояний:

FilterChip(
modifier = Modifier,
onClick = { dayClick(index) },
content = {
...
Text(text)
},
colors = ChipDefaults.filterChipColors(
backgroundColor = .. ,
contentColor = ... ,
selectedBackgroundColor = ... ,
selectedContentColor = ...
),
selected = index == currentDay
)

Анимация нажатия тоже есть 🙂

#Compose
👍3💩2🌚1
Знаете в чем основная проблема ревью пулл-реквестов?

У вас никогда не хватает времени (или желания?) скопировать себе чужую ветку из ревью, запустить и прогнать функционал 🙈

В итоге, основная проблема нового кода никак не решается. Вы просто проверяете стилистику, а не функционал.

#потрындеть
🌚2
Слушайте, ну не так уж и страшно выглядит Аврора 😁
Или многие разрабы уже не учат плюсы в универе?

Понятно, что после Kotlin/Swift/Dart чуть-чуть больновато.
С другой стороны - новая ниша, новые возможности. Тут Алексей прав 👍
А доклад хороший:
https://www.youtube.com/watch?v=vPbAHQy7OBw
🆒2🤡1🤨1
Реализация паттернов проектирования на Kotlin:
https://reflectoring.io/kotlin-design-patterns/
и Java:
https://java-design-patterns.com/patterns/

Кстати, версия синглтона на базе companion object не компилится на Kotlin 1.9.24 - нужно сменить имя для getInstance. Такие дела 🫡

#DesignPatterns
🤔1
Разница между collectAsState() и collectAsStateWithLifecycle() в одной картинке

#Compose #Flow
🤨1
Channel name was changed to «Droid Dev Notes»
Продолжая тему полезных статей для собесов, хочется отдельно поблагодарить автора за такую классную подборку статей по Kotlin. Здоровья тебе, мил человек!

Есть пару нюансов, но в остальном - замечательно 👍
Пол часа делов и ты снова в форме 😄

https://habr.com/ru/articles/721084/

#Kotlin
21
🧑‍💻 Мы пишем книгу по Flutter

Ну как вам такие новости?
Я долго пропадал, обо всем по порядку...

Несколькими неделями ранее мне написал Станислав Чернышев, автор книги “Основы Dart”. Думаю многие из вас уже читали или, как минимум, слышали про эту книгу

Станислав предложил мне войти в авторский состав книги по Flutter, я конечно же согласился!

📖 Команда, которая будет работать над книгой (в порядке присоединения):

1️⃣Станислав Чернышев - автор канала MADTeacher на YouTube, тг-канала MADTeacher и учебника "Основы Dart".

2️⃣Павел Гершевич - Flutter Team Lead в Amiga и соавтор Flutter.Много. Спикер различных конференций и автор канала Flutter Tech-Lead Notes.

3️⃣Юрий Петров - Flutter Tech Lead в компании Friflex, автор YouTube и одноименного тг-канала «Мобильный разработчик», а также курсов на платформе Stepik

4️⃣Я Станислав Ильин - Flutter Team Lead в Поток'е. Автор YouTube и одноименного тг-канала "Стас Ильин"

🔴Про книгу

✔️ За прошедший месяц мы утвердили структуру книги и распределили главы

✔️ Свежие материалы книги, прошедшие редактуру, будут выкладываться в курс на Stepik - Основы Flutter (в разработке)

Это позволит нам собирать быструю обратную связь по добавленному материалу и вносить правки

🔴 Вы тоже можете приложить свою руку к книге, как?

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

Предлагай тему проекта (только не todo-лист🥴) и если она понравится авторскому коллективу - мы упомянем вас в графе с благодарностями

💬Темы предлагайте в комментариях тут или на Stepik

☄️ А сейчас нужно столько реакций, репостов и огласки, насколько вы хотите качественный материал по Flutter
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🌚1