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

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

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

Обсудить что-либо: @activitynotfound
Download Telegram
Уже несколько дней сложно себя заставить ни то что работать, вообще что-либо делать.
Сегодня буду пытаться все же что-то полезное сделать по работе, а фоном вместо новостей и прочего шлака поставил 37 часовой курс по Flutter для начинающих
Надеюсь, у вас все хорошо.
Берегите себя!
👍3
Любопытный факт, о котором, я, например, не знал.

Во многих учебниках по программированию моего времени переменные в циклах обычно обозначаются как i. Знаете почему?
Дело в том, что более 60 лет назад в первоначальной версии языка Fortran (на синтаксис которого оказала большое влияние алгебра) переменные, имена которых начинались на буквы от I до N, были целочисленными.

В современных языках, понятное дело, лучше переменные циклов называть более осмысленно.
👍3
Интересно, а давно Яндекс начал нанимать Flutter-разрабов? Или это такая реакция на текущие события?
Заметили тренд на коррекцию рублевых зарплат?
Некоторые компании, конечно, и раньше могли себе позволить платить столько архитекторам, но и в Mobile на рядовые позиции коррекция намечается.

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

p.s. потихоньку приходим в себя. Начал набрасывать вторую часть статьи про работу в банке. Поговорим в этот раз о процессах.
👍1
Работа в банке. Часть 4. Код.

Ну что, соскучились?
Пока еще производительность хромает. Как в работе, так и вообще везде. Медленно, медленно приходим в себя, но все еще больше с акцентом на просмотр новостей 😞

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

Всем хороших выходных!
👍3
Попробовал удобный и быстрый способ протестировать диплинки в 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