Серия «Вайб-кодинг»

3

Делаю интервальный таймер для Android: что изменилось за две версии

Серия Вайб-кодинг

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

В этот раз попробую без длинного захода про изобретение велосипеда и работу с ИИ. Сразу сделаю упор на результат - то, что уже получилось.

Скриншоты текущей версии 0.3.0

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

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

С тех пор вышли еще две версии - 0.2.0 и 0.3.0. Как и было в планах, в версии 0.2.0 появилась поддержка нагрудных пульсометров. Также в приложении появился метроном, отдых между кругами, импорт и экспорт тренировок.

Что было в первой версии

В 0.1.1 приложение закрывало только базовый сценарий интервального таймера:

  • настройка подготовки, работы, отдыха и количества повторов;

  • тренировки из нескольких разных интервалов;

  • собственные названия интервалов, чтобы на экране было понятно, какое упражнение идет сейчас;

  • сохранение сложных тренировок для последующего быстрого запуска;

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

Например, можно было собрать тренировку вроде:

  • отжимания - 40 секунд работы, 20 секунд отдыха;

  • приседания - 50 секунд работы, 30 секунд отдыха;

  • планка - 60 секунд работы, 30 секунд отдыха.

Что добавилось в 0.2.0

В предыдущей статье я писал, что следующим крупным шагом хочу сделать поддержку нагрудных пульсометров. Как и планировал, в версии 0.2.0 такая поддержка появилась.

Приложение работает с нагрудными BLE-датчиками, которые передают пульс через стандартный Bluetooth Heart Rate Service. Например, XOSS X2, Polar H10, Garmin HRM-Dual, Wahoo TICKR и похожие устройства.

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

Пример:

  • работа - 45 секунд;

  • отдых - 20 секунд;

  • восстановление - до 120 BPM.

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

Доработана настройка самой тренировки: кроме кнопок + и - с шагом 5 секунд, добавлен точный выбор значений через колесо прокрутки. Это гораздо удобнее, когда нужно выбрать длинный интервал - 50, 60, 90 секунд и более. Кнопки + и - при этом остались для быстрых правок.

Отдельно появились настройки звуков таймера: можно выбрать сигналы последних секунд, начала работы и начала отдыха. В первой версии звуки воспроизводились через канал будильника, поэтому во время тренировки было не всегда удобно быстро менять громкость. В 0.2.0 сигналы таймера перенесены на медиа-канал Android и их можно регулировать обычными кнопками громкости.

Была улучшена работа таймера в фоне и после блокировки экрана. Телефон можно заблокировать или свернуть приложение - в первой версии я упустил этот момент. Таймер в том числе будет показывать активную тренировку через уведомление.

Что добавилось в 0.3.0

Основное изменение версии 0.3.0 - метроном для рабочей фазы. В карточке интервала можно задать темп в BPM, выбрать звук метронома и включить визуальный импульс на экране таймера. Это может быть полезно для упражнений, где требуется соблюдать темп, например: приседания, жимы, тяги с небольшим весом, махи гирей, упражнения с собственным весом, круговые комплексы и т.д.

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

Время подготовки, работы и отдыха теперь выбирается в формате мин:сек, что гораздо удобнее, если длительность интервалов достигает нескольких минут.

Добавилась возможность импорта и экспорта сохраненных тренировок.

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

Из мелких правок - карточки стали компактнее, дополнительные настройки переехали в блок Больше параметров.

Что приложение умеет сейчас

Если собрать все вместе, сейчас в приложении есть:

  • быстрый старт простой интервальной тренировки: подготовка, работа, отдых и круги;

  • возможность создать несколько разных интервалов в одной тренировке с возможностью переименования и отображения названия на экране в процессе работы;

  • голосовые подсказки, которые можно записать прямо в приложении и установить как сигнал начала интервала вместо стандартных звуков;

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

  • поддержка Bluetooth-пульсометров - наблюдение за пульсом во время тренировки, отдых до восстановления до заданного пульса;

  • метроном для рабочей фазы - возможность задавать нужный темп для работы;

  • работа таймера в фоне и после блокировки экрана.

Планы на будущее

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

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

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

Краткая ремарка про работу с ИИ

Проект я делаю при активной помощи Codex/ChatGPT. Но это далеко не про "сделай приложение за один промпт".

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

ИИ существенно упрощает работу с рутиной. Он пишет/правит код, помогает с миграциями базы, помогает с текстами для справок и документации, ищет и разбирает ошибки, собирает APK, ставит приложение на телефон. В моем случае, даже нужные скриншоты для релиза, сам делает через ADB. Мне только приходится надевать пульсометр и поднимать пульс, чтобы на скриншотах были соответствующие значения)

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

Буду рад советам

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

Особенно интересны реальные тренировочные сценарии: какие варианты тренировок уже можно делать с ним, а какие нельзя и что для этого не хватает?

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

Ссылка на приложение в RuStore: Интервальный таймер

Показать полностью 8

Вайб-кодинг на практике: делаю интервальный таймер для Android с Codex

Серия Вайб-кодинг

Привет, Пикабу. Хочу представить на суд общественности небольшой Android-проект, который делаю как очередной эксперимент в вайб-кодинге – разработка мобильного приложения. Это мой первый пост здесь, прошу сильно ногами не бить.

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

Приложение написано под Android на Kotlin. Интерфейс сделан на Jetpack Compose, сборка через Gradle Wrapper. Общее количество строк кода на Kotlin в этом проекте – 6600. У меня есть определенный опыт в программировании, но до работы над этим приложением с Kotlin, Jetpack Compose и Gradle я никогда не работал. Отдельный маленький привет моему отсутствию опыта в Android: на старте я не поменял applicationId, поэтому он остался почти дефолтным. Отладку делал сначала в эмуляторе, а потом стал делать непосредственно в своем телефоне, через ADB. Работаю в vscode с агентом Codex/ChatGPT.  

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

После того, как идея расписана, стек подобран, начинается рутинная работа. Примерно так: промпт «Проанализируй идею. План.» Далее знакомлюсь с планом, если есть какие-то замечания, правки – озвучиваю, иногда прошу агента задавать уточняющие вопросы. Если задаю вопросы, то обязательно указываю «сначала напиши список вопросов, а потом задавай их в интерактивном режиме по одному». Это для того, чтобы агент не ушел в глобальные размышления о каждой мелочи, а сразу ограничился конкретным списком вопросов. Интерактивный режим удобен тем, что не надо читать всю портянку, а можно размеренно отвечать на каждый вопрос и задавать уточняющие по мере необходимости. В конечном итоге промпт «делай». Агент у меня работает в виртуалке с полными правами, поэтому в таком режиме он может работать минут 5-10, иногда и больше без моего физического одобрения различных команд. В обычном режиме при работе с codex я не смог отключить эти вечные запросы-разрешения, поэтому и отправил его в виртуалку, наделив полной властью. Большой проект целиком он сразу не делает. Обычно он делает какую-то часть, каркас, какие-то начальные механики с заглушками, после чего отчитывается что сделал такую-то часть. Далее промпт: «что дальше по плану» - это если мне надо что-то уточнить, или сразу «делай дальше».

После нескольких итераций, когда уже получается относительно рабочее приложение – прошу его запустить. В данном случае это было в Android Emulator из Android Studio. Кстати, в последнее время почти весь необходимый софт, включая андроид-студио, Gradle и т.д. я либо прошу агента, чтобы он установил сам, либо прошу команду для PowerShell. С консолью работаю прямо из vscode.

Следующий этап, когда первая версия запускается в эмуляторе, начинается допиливание. Если нужно что-то добавить, сделать какое-то определенное меню – я ему так и описываю. Если уже что-то есть готовое, но нужны косметические правки или что-то конкретно не нравится – то раньше я так же пытался описать, а теперь просто делаю скрин экрана при помощи ножниц в виндовс, кидаю ему этот кусок скрина прямо в чат и пишу – «измени цвет», «меню сливается, предложи вариант», «измени шрифт» и т.д. Обычно к каждому такому промпту добавляю «Анализ» или «План». Далее читаю, вношу правки при необходимости и снова «Делай». Доработки функционала идут по такому-же принципу – «нужно сделать запись звука, план». Или «нужно добавить сохранение тренировок, план». Агент описывает примерную концепцию, я так же вношу правки при необходимости и потом прошу реализовать. Собственно примерно в таком режиме и происходит разработка – анализ, что есть, далее – промпт на допиливание/изменение, либо на внедрение новой фичи.

В этом проекте, в определенный момент я решил, что нужно протестировать приложение в реальных условиях. Для этого при помощи агента настроил удаленную отладку по wifi, т.к. я уже забыл все нюансы, даже подключения и далее тестировал приложение на телефоне. После очередной доработки просил его установить приложение на телефон и тестил. Для сборки дебаг-версии и релизной версии apk я попросил сделать соответствующие скрипты, т.к. часть текста, особенно политика конфиденциальности берется из md файлов на момент сборки. Ну и на случай, если вдруг по какой-то причине доступ к агенту пропадет, чтобы я мог что-то изменить, сделать и собрать сам. Хотя я понимаю, что это утопия – в таком проекте, даже с документацией в формате md на 2500 строк в этом проекте – мне это будет почти нереально. Примерное время, которое мне понадобилось на реализацию этого проекта в текущем виде – от 20 до 30 часов. Это время, которое я непосредственно провел, сидя за компом. Точным подсчетом я не занимался, оцениваю примерно.

Еще в последнее время, если проект разрастается, я начинаю заниматься рефакторингом. Прошу агента провести анализ и дать предложения по рефакторингу. Далее прошу сделать план и отправляю его делать. Если проект крупный – агент обычно делает план рефакторинга так же, по шагам – одну часть, потом остановка, потом другую и т.д. За один подход, проект размером в несколько тысяч строк он не рефакторит) Как было написано выше – общее количество строк кода в этом приложении – около 6600, небольшой рефакторинг я уже делал.

Из дополнительных инструментов я использую git, который поднял на домашнем сервере. Это  удобно для хранения всех своих поделок, копания в истории, при необходимости (такое уже было пару раз). Хотя для кого-то это банальная база. Так же при помощи git деплою некоторые свои поделки на боевых серверах.

Теперь немного о самом приложении. Это классический интервальный таймер для круговых тренировок с чередованием работы и отдыха. Почему таймер? А так получилось. Мне показалось это то приложение, которое можно достаточно быстро сделать полностью работоспособным и относительно отполированным для размещения в сторах. Тем более когда-то давно я подобными пользовался, но в них не было возможности настраивать разные интервалы. Возможно сейчас такие возможности уже во многих есть, но в свое время я не нашел. Но самая главная фишка этого приложения – оно полностью бесплатное и без рекламы.  Возможность добровольной поддержки разработчика есть, но это никак не влияет на его функциональность – функциональность полная и не зависит от наличия или отсутствия таких покупок у пользователя. Это некая такая «месть» всем тем, кто пишет приложения с кучей рекламы или урезанными функциями)

Буду ли я использовать рекламу, подписку и другие «нехорошие» способы монетизации в будущем в других приложениях? Скорее всего буду – я же все-таки тоже человек)

Что сейчас уже есть. На текущий момент в приложении уже реализована простая тренировка, в которой настраивается время работы и отдыха и сложная тренировка, в которой можно создать несколько интервалов со своим временем работы и отдыха – например отжимания 40/20, приседания 50/30 и т.д. Каждому интервалу можно дать свое название, которое отображается на экране работы и на экране отдыха, для подготовки к следующему упражнению. Тренировки можно сохранять.

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

Площадку RuStore выбрал по объективным причинам – в наше время с гуглом все очень сложно в этом плане.

Для ознакомления прикрепляю скриншоты. Если кому интересно посмотреть/протестировать – вот ссылка на рустор - Интервальный таймер.

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

UPD. Сбор прикрутить не получилось, возможно из-за первого поста здесь. Значит оставляю только панамку)

З.Ы. Буду рад обратной связи, идеям, замечаниям и предложениям. Мне интересно, что хотелось бы людям видеть в этом приложении и что могло бы оказаться полезным. Но честно предупрежу – это проект для практики, для души и делается в относительно свободное от работы, и кучи других дел и обязанностей время, поэтому обещать реализацию всех идей и пожеланий не буду. Планирую делать то, что реально зацепит и к чему душа ляжет.

Скриншоты

Показать полностью 4
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества