Блогер с канала tech-it запустил трансляцию на YouTube, где он раскладывает и складывает новейший гибкий флагман Samsung Galaxy Z Fold 7. По его словам, он решил проверить заявление компании об устойчивости смартфона к сгибаниям до 200 тысяч раз. После 6 тысяч повторений смартфон перезагрузился, после 46 тысяч шарнир начал скрипеть, а после 75 тысяч складываний из шарнира начала вытекать «неопознанная жидкость». Эксперимент продолжается.
Apple и Synchron показали, как Марк Джексон с мозговым имплантом может управлять iPad. Он получил мозговой имплант Stentrode, разработанный Synchron в сотрудничестве с Apple, и оптимизированным для работы с iPhone, iPad и Vision Pro. У Джексона боковой амиотрофический склероз, поэтому он не может пользоваться iPad руками. Но с помощью импланта он управляетпланшетом при помощи мыслей. Джексон может открывать приложения и писать сообщения, используя только свои мысли. Для управления используется протокол Switch Control, который воспринимает мозговой имплант за источник ввода. В текущей версии проект позволяет только нажимать на кнопки и писать текст. Имитировать прокрутку и пролистывать содержимое на экране нельзя.
Представлен бесплатный аналог Spotify без рекламы, без платных доступов и без подписок под названием SimpMusic, где треки можно слушать фоном, есть гигантская библиотека, персонализированные подборки, чарты и топы и полностью открытый код.

Пользователь запустил Skyrim на Samsung S25+, чтобы охладить гаджет, смартфон пришлось положить в стакан с холодной водой. В комментариях умоляли положить смартфон в полиэтиленовый пакет. Но пользователь оказался непреклонен и твердо верит во влагозащиту IP68.

BPN vs MVM
В двух, приложенных к этому посту файлах (здесь и здесь), показан код для решения одной и той же задачи в мобильном приложении. А именно: запустить обратный отсчёт перед началом игры.
В одном файле эта задача реализована в архитектуре BPN (Business Process Notation), о которой рассказывал раньше здесь. А во втором файле тот же код организован по архитектуре MVVM.
Код и в том, и в другом файле написан с помощью Claude Sonnet. В случае с BPN структурировал код вручную, следуя бизнес-процессам. А во втором случае попросил Клода сделать рефакторинг, используя традиционный современный подход и он выбрал MVVM.
Что можно сказать в итоге, сравнивая архитектуру в том, и другом случае.
Объём кода
В BPN варианте 270 строки кода с комментариями, в MVVM - 524.
Т.е., в MVVM случае кода практически в 2 раза больше.
Количество сущностей, объектов.
BPN - один класс и 3 раширения к нему.
MVM - 6 классов, 1 структура, 3 протокола, каллбэки, фабрика, расширение.
Архитектура
BPN - монолит.
MVVM - вью и модель, анимация и аудио как сервисы, роутер, отдельная структура для хранения значений свойств и т.д.
Что лучше
Как всегда, каждый из подходов имеет свои плюсы и минусы.
В BPN нравится, что можно видеть модель процесса, в данном случае модель одной из задач приложения.
Что такое “Модель”
Наиболее традиционны 2 понимания термина “модель”.
В одном случае, это структура данных, модель объекта.
Например:
struct Person {
let firstName: String
let lastName: String
var age: Int
}
В другом случае, под моделью понимается всё, что не относится к интерфейсу.
Но есть и третье понимание модели - это модель приложения, или модель отдельных процессов внутри приложения. Т.е., составные части приложения (процесса) и их последовательность.
В BPN файле такая модель проступает наглядно:

Здесь Обратный отсчёт складывается из таких блоков как подготовка, собственно выполнение, анимация, звук и закрытие экрана. Внутри каждого этапа видны его составляющие - методы и необходимые свойства.
В файале MVVM блоков кода гораздо больше и нужно несколько раз проскоролить чтобы увидеть их в выпадающем меню. И увидеть целостную модель здесь сложнее.
Conclusion
На относительно небольших проектах архитектура MVVM может быть избыточна. Здесь могут использоваться более простые варианты.
BPN позволяет видеть целостную модель задачи (процесса, приложения).
Ozon Tech открыл сразу несколько вакансий для QA mobile
Если хотите тестировать продукт, которым пользуются миллионы, — этот пост для вас.

У нас несколько сильных команд, и вы можете выбрать ту, где ваш опыт даст максимум результата:
Будете тестировать сразу два приложения:
Ozon Курьер Express помогает курьерам и водителям принимать экспресс-заказы и зарабатывать.
Ozon Job — приложение для соискателей, где можно найти склад, записаться на смену, посмотреть выплаты и тарифы.
Проекты молодые, без легаси — можно внедрять лучшие практики и выстраивать процессы с нуля.
То самое, которым пользуетесь вы, ваши друзья и соседи. Через него проходит >90% заказов. Вы будете тестировать UI, логику, аналитику и пуши, следить за стабильностью релизов и качеством пользовательских сценариев. У нас отлаженная инфраструктура: автоматизация, фермы с эмуляторами, симуляторами и реальными девайсами.
Фундамент всех приложений Ozon: библиотеки авторизации, аналитики, performance-метрики. Вы будете проверять их стабильность, писать автотесты и автоматизировать процессы. Команды Ozon используют эти библиотеки каждый день — и от их качества зависит работа всей мобильной разработки.
Что общего во всех командах:
— Кроссплатформенная автоматизация на Python и Appium.
— Сложные, нетривиальные задачи — как в ручном тестировании, так и в автоматизации.
— Фичи, которые вы тестируете, видят миллионы пользователей — включая ваших друзей и родных.
Выбирайте продукт и откликайтесь на сайте.
Tesla добавила окошко с чаевыми в мобильное приложение своего роботакси. Предложение оставить «на чай» появляется на экране во время оценки беспилотной поездки. Если пользователь захочет перевести деньги, то приложение запустит картинку с дикобразом в солнцезащитных очках и кожаном костюме с подписью, что это шутка.
Бывший генеральный директор Google призывает сотрудников компаний выключать смартфоны, чтобы сосредоточиться на работе или расслабиться.
Шмидт рассказал, что исследователи и разработчики «не могут глубоко мыслить», когда их смартфоны постоянно вибрируют от уведомлений. Ветеран технологий, который 10 лет руководил Google и участвовал в разработке системы уведомлений Android, признал, что индустрия пытается «монетизировать внимание клиентов» с помощью постоянной рекламы и оповещений.

🎲 Retrofit 3.0 — что изменилось?

При поддержке блога @dolgo_polo_dev
Вышел Retrofit 3.0. А точнее в один день вышло 2 версии — Retrofit 3.0 и 2.12
Библиотека важная, поэтому попробовал разобраться, что изменилось
Самое интересное случилось в 2.12 — добавили стриминговую сериализацию из Kotlin/Java-классов в Json/Protobuf
Зачем это нужно было?
➡ чтобы большие классы не сериализовывались целиком перед отправкой запроса, а начинали это делать во время передачи данных на бэк
Это позволит чутка снизить нагрузку на процессор и оперативку, если
передаете объемные данные в теле запроса (1 мегабайт+)
где-то вызываете
Retrofit.Call.enqueue()с главного потока — стриминг перенесет сериализацию с главного UI-потока в бэкграунд
Чтобы изменения заработали, нужно создавать конвертер с помощью функции withStreaming()
MoshiConverterFactory.create(moshi).withStreaming() // пример
В Retrofit 3.0 просто апнули версию OkHttp (3.14.9 -> 4.12.0). И немного поправили внутреннего кода, пару строк для совместимости с 4.12.0
Так что если обновите версию Retrofit, у вас транзитивно апнется OkHttp — будьте внимательны, берегите себя и своих тестировщиков
Из хороших новостей — Retrofit 3.0 формальный мажор, то есть бинарно совместим с предыдущими версиями (по словам разработчиков). Мажорное версию апнули для хайпа, чтобы подчеркнуть обновление OkHttp
Пруфы:
compare 3.0 with previous (https://github.com/square/retrofit/compare/2.12.0...3.0.0#diff-ee4546957dd484579c54b92114186cb4b3181a8906d98fbf94fbc526bf755943)(там много ченжей, но 90% из них — это обновление их website с документацией)
compare 2.12 with previous (https://github.com/square/retrofit/compare/2.11.0...2.12.0) (тут можно посмотреть, за счет чего сериализация стала асинхронной)
остальные посты про Android публикую в https://t.me/dolgo_polo_dev
Основа Kotlin K2 компилятора — это FIR‑дерево (Frontend Intermediate Representation).
Вкратце: FIR — это AST (абстрактное синтаксическое дерево), обогащённое семантической (смысловой) информацией. Оказывается, что у этой основополагающей технологии есть своя небольшая документация: fir‑basics.md и в той части, где написано про контракты указано (в моём вольном переводе), что:
Компилятор разрешает использовать контракты в свойствах, функциях и конструкторах классов
Вот это поворот! Ведь ранее было замечено их использование только внутри тела функций. В доке написано, что для свойств должно работать, но на практике получаем ошибку.

А где находится то самое ограничение на использование контрактов вне функций описал Android‑разработчик Виталий Перятин в новой статье о Kotlin Contracts, где он поделился любопытными моментами, которые удалось накопать самостоятельно, потому что как парсится список эффектов, как работает новый Contracts API изнутри, и почему, чёрт возьми, на уровне компилятора можно использовать контракты не только на уровне функций, в доках не пишут.
Как я случайно сделал ферму в Telegram с помощью ИИ

— История одного бота, картошки и чёртовой тыквы
Всем привет. Я — человек, который однажды хотел просто сделать прикольного бота в Телеграме, а в итоге... выращивает капусту, торгует молоком и организует тыквенные войны.
Но началось всё, как ни странно, с Таро. Да-да, карт Таро. Тех самых.
Первая попытка: гадать и страдать
Где-то в начале года я решил сделать Telegram-бота, который бы умел раскладывать карты Таро, делать натальные карты и выдавать предсказания на день. Казалось бы, звучит просто. Особенно если рядом есть ChatGPT, который может на ходу генерировать описания карт и писать код на Node.js.
Зарядка с утра: — GPT, напиши функцию для расчёта Луны в Скорпионе. — GPT, как сделать inline-кнопки в grammY? — GPT, почему Heroku опять всё уронил?
И вот бот заработал. Люди заходят, тянут карту дня, шлют благодарности… и уходят. На следующий день — снова тяни карту. Через неделю — всё. Надоело.
Я понял: бот с Таро работает, но удержать людей в нём сложно. Там нет жизни. Там нет... морковки.
А потом я вспомнил старую ферму
Когда-то, ещё во времена динозавров и ВКонтакте, у меня была ферма. Та самая, где каждый день надо было заходить, собирать урожай, сажать заново, а если не успеешь — тебя вытопчут друзья с соседнего класса.
И вот я подумал: а что, если скрестить эту старую добрую механику с Telegram-ботом?
Чтобы всё было просто:
Никаких установок
Играть можно прямо в чате
И чтобы всегда был шанс насадить кукурузу, а не просто наслаждаться жизнью
Начало новой жизни
Запустил первого бота. Добавил регистрацию, посадку капусты и сбор. Подключил базу PostgreSQL. Всё это — руками и с подсказками ИИ (да здравствует Cursor AI, GPT и граммY).
Первый баг — бот забывал, что ты уже посадил картошку. Второй баг — тыква, которую почему-то можно было доить. Третий баг — не баг, а фича: игроки начали просить рынок, коров и возможность топтать грядки друг другу.
Так появилась Веселая Ферма — ферма прямо в Telegram, которая сейчас уже живёт своей жизнью, где игроки сажают растения, разводят скот, воруют другу у друга лимоны и спорят в чате, почему мед дешевле мотыги.
Что дальше?
Это только начало. Я хочу рассказать:
Как ИИ помогает не сойти с ума, когда у тебя 500+ игроков и баг в 3 ночи
Как запускались тыквенные фестивали и почему это был трэш
Как устроен баланс в экономике фермы
И как создать клановую систему, когда никто не читает туториал
Если интересно — подписывайся на продолжение. А если хочешь сам потыкать бот — вот: 👉 Веселая Ферма
Следующая часть будет про то, как я балансировал экономику в игре, используя google sheet, интуицию и крик в подушку, почему Доярка Жанна названа в честь жадной хозяйки квартиры, и откуда взялся Председатель СНТ в образе Якубовича.
Как ускорить Android-разработку и избавиться от мучительно долгих запусков эмуляторов ради простого теста?
Ответ — Robolectric — мощный инструмент для UI‑тестирования Android‑кода без эмулятора.
Позволяет запускать юнит-тесты Android-приложений прямо в JVM, без эмуляторов и физических устройств. Экономия на каждом тестовом прогоне, обратная связь почти мгновенная.
В Android‑комьюнити у Robolectric неоднозначная репутация из‑за трудностей совместимости с другими библиотеками. Но…его почти бесценные возможности пробудили любопытство и желание копнуть глубже и осмыслить этот инструмент.
Так и родилась статья «Мечтают ли андроиды о Robolectric? Разбираем фреймворк по косточкам» от Павла Нестеренко, нашего Android-разработчика.
Если вы устали ждать, пока эмулятор запустится, и хотите гонять юнит-тесты за секунды прямо в JVM, то рекомендуем статью к прочтению!
Ближайшие события
⚡️Вести с полей - Duit
Новый релиз - flutter_duit v3.6.0!
Что внутри:
⚙️ Новые виджеты: Offstage, AbsorbPointer, AnimatedCrossFade, AnimatedSlide, PhysicalModel, AnimatedPhysicalModel, CustomScrollView, SliverPadding, SliverFillRemaining, SliverToBoxAdapter, SliverFillViewport, SliverOpacity, SliverVisibility, SliverAnimatedOpacity, SliverSafeArea, SliverOffstage, SliverIgnorePointer, SliverList, SliverAppBar, FlexibleSpaceBar and SliverGrid (+21)
⚙️ Улучшен механизм передачи текущих значений анимации дочерним виджетам AnimatedBuilder
⚙️ Исправлен баг сепаратора в виджете ListView.separated, который не уничтожался правильно
⚙️ Значительно улучшено покрытие юнит-тестами критических участков кода (с 27% до 64%)
📖 Обновленная документация
Подробности о самом интересном:
⚡️Самое большое обновление виджетов! В этом важном релизе были добавлены сливеры - важная часть Flutter, без которой зачастую сложно реализовать высокоэффективные эффекты скролла.
🚀 Duit v4: производительность и простота. Анонсирую начало масштабных работ над мажорным обновлением проекта. Упрощение кодовой базы, решение проблем производительности, переосмысление дизайна DSL и надежная валидация входящих параметров - это лишь малая часть грядущего большого обновления!
Поддержать проект:
- Кодом
- Денежкой
- TG канал DUIT

Save the date: 4 июля встречаемся на Android Meetup!
В программе доклады от спикеров Wildberries & Russ и Альфа-Банка, Q&A-сессия с розыгрышем мерча, нетворкинг и фуршет для классного завершения вечера.
Поговорим о том, как оживить виджеты, подружить Compose с Koin и навигацией, а заодно встроить одно Android-приложение в другое без боли...или с болью:
«Виджеты на Android: это просто?»
Александр Гирев, Android Team Lead продуктовой команды WB Partners
«Compose+Koin+JetpackNavigation: что мы поняли за 2 года»
Арсений Шпилевой, Android-разработчик кор-команды WB Partners
«Интеграция Android-приложений: подходы и лучшие практики»
Абакар Магомедов, главный техлид разработки в Альфа-Банке
Когда: 4 июля 18:00 (сбор гостей с 17:00)
Где: Москва, пространство Весна + онлайн-трансляция
Регистрация уже открыта — присоединяйтесь онлайн или офлайн!
релизнул версию 2.3.0 mcp для flutter - добавил многомелкихфиксов + возможность сохранять скриншоты как файлы как workaround для RooCode issue
Ещё добавил setup для RooCode - оказалось что похоже что RooCode не поддерживает анализ images в responses от mcp сервера.
А ещё - впервые коммьюнити отметили 100 звездочками репозиторий🎆 надеюсь что кто-то действительно пользуется:)

Telegram запустил конкурс для разработчиков под Android. Призовой фонд: $50 000. Срок сдачи работ: 11 июля, 23:59 по дубайскому времени (UTC+4). Объявление итогов: июль 2025.
В дополнение к призовым, победитель конкурса сможет присоединиться к команде Telegram в Дубае и зарабатывать 1 миллион долларов в год после вычета налогов.
Задача: Внедрить обновлённый интерфейс профилей в приложение Telegram для Android в строгом соответствии с предоставленным дизайном.
Полные условия конкурсного задания, технические подробности и макеты представлены в отдельном канале платформы.
Вы - начинающий разработчик под Андроид или просто пишете "для себя" и решили отображать динамическую анимацию через SurfaceView. Например, взяв за основу вот этот код или похожий. Вы разместили SurfaceView или его наследника (у меня MySurfaceView) в activity layout:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activityMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<agalilov.doppler.MySurfaceView
android:id="@+id/dopplerView"
android:background="#040947"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="15dp"
app:layout_constraintBottom_toTopOf="@+id/btnStartStop"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btnStartStop"
android:layout_width="118dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:layout_marginBottom="16dp"
android:text="@string/start"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dopplerView" />
</androidx.constraintlayout.widget.ConstraintLayout>Запускаете приложение и... ничего не работает: SurfaceView не меняется, картинки нет! Ошибок тоже нет, код рисования выполняется впустую.
Я провёл почти всю ночь, разбираясь в причине. Оказалось, для SurfaceView, который размещён внутри другого View, по-умолчанию используется z-order "позади" родительского View. Это поведение, документированное в разных источниках, оказалось для меня неожиданным.
Лечится просто: при инициализации (в конструкторе класса-наследника) SurfaceView устанавливаем setZOrderOnTop(true):
public MySurfaceView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
setZOrderOnTop(true);
. . .
}Вот такая история :)
Часть 2: итоги недели разработки вайбкодинга с агентами
Прошлый пост тут
1️⃣ Текущий прогресс по xsoulspace.dev привел к тому, что обнаружил что есть закономерность какие именно модели хороши для использования в проектировании layout страницы (спойлер - не записал какие 🤦♂️ кажется использовал Claude 4.0 thinking + Gemini 2.5 Pro).
Что попробовал сделать : нарисовал простой wireframe image -> сконвертировал в ACSII art, и затем скормил LLM для более корректного восприятия layout.
Оказалось что так проще, но относительно (за счет убирания лишних элементов проще понять что где расположено), но с другой стороны LLM все так же тяжело воспринимать layout (если он чересчур кастомный).
2️⃣обновил все flutter библиотеки, last answer, word by word, budget app до flutter 3.8 - пользовался агентами в окошках. В некоторых случаях правил руками, но в большей части работал по принципу PDSA (Plan Do Study Act), где я разрабатывал план, а агент по нему шел, потому изучал результаты и т.д.
Вывод - нужно сильнее нарабатывать промпты.
3️⃣внезапно получил спам-рассылку-письмо с возможностью потестить on device API для того чтобы запускать модели. Чтобы потетстить решил запилить новое приложение для работы с промптами - действовал по принципу:
Идея и этические принципы
Палитра и дизайн система на основе идеи и принципов
План работы
Имплементация через агентов + доп ресерчи чтобы агенты понимали какую информацию брать.
Удалось собрать прототип за 12 часов (рабочую, включая все экраны и дизайн систему). Следующий этап - буду модифицировать чтобы можно было тестировать на реальных промптах в проектах.
Опыт: понял как создавать и работать с ролями (опишу в следующем посте про MVP), разобрался как запускать LLM на устройстве.
Недостатки: нужно более точно прописывать тех стак, особенно ключевые места, такие как - синхронизация данных, тип хранилища и т.д. И хорошо если изначально можно давать wireframes, или подгенеривать на основании дизайн системы.

Хотелось сделать нечто среднее между игрой и обычным интерфейсом, но пока не получилось.
4️⃣Создал детальный план и начал прорабатывать новую систему сохранения данных. Для меня это оказалось большой проблемой - потому что Hive, Isar на flutter перестали поддерживаться, а другие библиотеки неудобно использовать (где-то перешел на Sembast).
В результате на мой взгляд завязка на том, что данные хранятся непонятно где для конечного пользователя опасна тем, что в случае прекращения работы с приложением теряются все данные. Это оч больно.
Поэтому решил объединить все идеи и написать одну библиотеку которая будет из коробки давать синхронизацию с гитом, github и папками. Так надеюсь удастся побороть проблему долговечности и надежности хранения данных.
Пока агенты имплементировали 4 этапа из 5 (основную логику провайдеров данных), и как итог - собрал отдельное тестовое приложение (todo), чтобы протестировать работу (отдельный скриншот), понять недостатки и как можно быстрее завершить библиотеку чтобы начать интеграцию во все проекты. Это важно, потому что при одновременной интеграции сразу будет понятно что работает, а что нет, и таким образом будет проще получать feedback и развивать библиотеку качественно.
Спасибо за ваше время и хорошего дня!
p.s.:
Бумаги которые claude нашел по теме и одновременно не по теме)
Towards Aligned Layout Generation via Diffusion Model with Aesthetic Constraints https://arxiv.org/abs/2402.04754
CreatiLayout: Siamese Multimodal Diffusion Transformer for Creative Layout-to-Image Generation https://arxiv.org/abs/2412.03859
Future of edge and on-device AI in gaming https://inworld.ai/blog/ml-advancements-that-will-make-on-device-ai-possible
MobileExperts: A Dynamic Tool-Enabled Agent Team in Mobile Devices https://arxiv.org/abs/2407.03913
From Cloud to Edge: Rethinking Generative AI for Low-Resource Design Challenges https://arxiv.org/html/2402.12702v1
Generative Artificial Intelligence-Enabled Facility Layout Design Paradigm https://www.mdpi.com/2076-3417/15/10/5697
Google опубликовала ролик в рамках своей юмористической рекламной кампании Best Phones Forever с «диалогом» между персонифицированными смартфонами Pixel и iPhone. Повествование разворачивается вокруг анонсированных Apple «прорывных» функций iOS 26, которые, по задумке Google, на самом деле уже давно доступны пользователям Pixel.
В видео iPhone перечисляет «новые» возможности операционной системы Apple: перевод сообщений и звонков в режиме реального времени, интеллектуальный отбор вызовов и умное удержание. Выясняется, что аналогичный функционал появился на устройствах Pixel еще пять лет назад, что ставит под сомнение новизну представленных Apple решений.
