Skip to content

Repository files navigation

TrainingTracker

Android-приложение для учёта тренировок: справочник упражнений, планирование тренировочных дней (сплит A/B/C...), запись тренировки по подходам (вес × повторения) с учётом прогресса по плану, история тренировок с фильтром по дате и прогресс по каждому упражнению.

Возможности

  1. Упражнения — CRUD: создание, редактирование, удаление, список упражнений (название, группа мышц, заметка).
  2. Дни тренировок — до 7 абстрактных дней сплита (День A, День B, ...; буква вычисляется по позиции, а не хранится в базе). Для каждого дня можно составить план: набор упражнений, а для каждого — целевые подходы (вес × повторения).
  3. Сессия дня — открывается по дню тренировки: план сверху (целевые подходы), под ним — что реально выполнено; подход из плана отмечается выполненным в один тап, показывается процент выполнения плана. Можно логировать и внеплановые подходы.
  4. История — список прошедших тренировок с фильтром по диапазону дат, детализация по подходам внутри тренировки (тап по дню открывает список подходов).
  5. Прогресс — по каждому упражнению: рабочий вес, число подходов на этом весе и график динамики веса по тренировкам.
  6. Тема оформления — переключатель в тулбаре: как в системе / светлая / тёмная, выбор сохраняется между запусками.

Стек и архитектура

  • 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) на эмуляторе/устройстве.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages