Android-приложение для учёта тренировок: справочник упражнений, планирование тренировочных дней (сплит A/B/C...), запись тренировки по подходам (вес × повторения) с учётом прогресса по плану, история тренировок с фильтром по дате и прогресс по каждому упражнению.
- Упражнения — CRUD: создание, редактирование, удаление, список упражнений (название, группа мышц, заметка).
- Дни тренировок — до 7 абстрактных дней сплита (День A, День B, ...; буква вычисляется по позиции, а не хранится в базе). Для каждого дня можно составить план: набор упражнений, а для каждого — целевые подходы (вес × повторения).
- Сессия дня — открывается по дню тренировки: план сверху (целевые подходы), под ним — что реально выполнено; подход из плана отмечается выполненным в один тап, показывается процент выполнения плана. Можно логировать и внеплановые подходы.
- История — список прошедших тренировок с фильтром по диапазону дат, детализация по подходам внутри тренировки (тап по дню открывает список подходов).
- Прогресс — по каждому упражнению: рабочий вес, число подходов на этом весе и график динамики веса по тренировкам.
- Тема оформления — переключатель в тулбаре: как в системе / светлая / тёмная, выбор сохраняется между запусками.
- Kotlin,
compileSdk/targetSdk— 37, минимальный SDK — 24. - MVVM:
View (Fragment) → ViewModel (StateFlow) → Repository → Room (DAO). - Room — локальное хранилище (SQLite), реактивные запросы через
Flow, генерация через KSP. - Kotlin Coroutines — асинхронность (
viewModelScope). - Navigation Component + BottomNavigationView — 4 вкладки: Упражнения, Тренировка (дни), История, Прогресс (плюс вложенные экраны: редактирование упражнения, сессия дня, детали тренировки).
- RecyclerView + DiffUtil — списки.
- Самодельный DI-контейнер (
AppContainer) вместо Hilt/Koin — репозиториев всего пять, отдельная библиотека не оправдана. - График прогресса нарисован через собственный
ViewнаCanvas, без внешних чарт-библиотек. - Без Navigation Safe Args — аргументы экранов (
exerciseId,trainingDayId,workoutId) передаются вручную черезbundleOf(...).
Тулчейн (AGP 9.3.1 / Gradle 9.5.0) на момент написания очень свежий и требует нескольких неочевидных обходных путей в связке AGP + KSP + built-in Kotlin.
com.example.trainingtracker
├── data
│ ├── model // Room @Entity: Exercise, TrainingDay, PlannedExercise, PlannedSet,
│ │ // Workout, WorkoutSet
│ ├── dao // ExerciseDao, TrainingDayDao, PlannedExerciseDao, PlannedSetDao,
│ │ // WorkoutDao, WorkoutSetDao + QueryResults (POJO под JOIN'ы)
│ ├── AppDatabase.kt
│ └── AppContainer.kt // самодельный DI-контейнер
├── repository // ExerciseRepository, TrainingDayRepository, PlanRepository,
│ // WorkoutRepository, ProgressRepository (+ Impl)
├── ui
│ ├── exercises // ExerciseListFragment/ViewModel/Adapter, ExerciseEditFragment/ViewModel
│ ├── trainingdays // TrainingDayListFragment/ViewModel/Adapter — список дней сплита
│ ├── workout // DaySessionFragment/ViewModel — план + факт одного дня
│ ├── history // HistoryFragment/ViewModel, WorkoutDetailFragment/ViewModel, WorkoutAdapter
│ └── progress // ProgressFragment/ViewModel, ProgressChartView (свой Canvas-график)
├── util // Formatting, ThemePreferences (переключатель темы)
├── TrainingTrackerApp.kt
└── MainActivity.kt // NavHostFragment + BottomNavigationView + тулбар
Тестовый исходный набор (app/src/test) зеркалит его: fakes/ — in-memory
реализации DAO- и Repository-интерфейсов, testutil/MainDispatcherRule.kt, и
тесты рядом с каждым Repository/ViewModel в тех же под-пакетах.
./gradlew assembleDebug
Приложение можно открыть и запустить как обычный проект Android Studio (Run ▶).
Юнит-тесты лежат в app/src/test и не требуют эмулятора (чистый JVM):
./gradlew testDebugUnitTest
Покрыты:
- Repository — Exercise, TrainingDay, Plan, Workout, Progress — на фейковых in-memory реализациях DAO-интерфейсов.
- ViewModel — списки/редактирование упражнений, дни тренировок, сессия
дня, история, детали тренировки, прогресс — на фейковых реализациях
репозиториев +
kotlinx-coroutines-test.
UI (Fragment/Adapter/Activity) юнит-тестами не покрыт — для этого нужны инструментальные тесты (Espresso) на эмуляторе/устройстве.