Health Tracker là ứng dụng Android giúp người dùng theo dõi sức khỏe hằng ngày thông qua nhật ký ăn uống, hoạt động thể chất, mục tiêu calorie, BMI, BMR, TDEE và xu hướng theo thời gian.
Ứng dụng lưu dữ liệu cục bộ trên máy, tính mục tiêu năng lượng dựa trên thông tin cá nhân, hiển thị tiến độ trong dashboard/widget, nhắc người dùng ghi nhật ký và hỗ trợ xuất báo cáo PDF.
- Kotlin
- Android Jetpack Compose
- Material 3
- Navigation Compose
- Room Database
- DataStore Preferences
- Hilt / Dagger
- Kotlin Coroutines + Flow
- WorkManager
- Glance App Widget
- Coil
- Kotlin Serialization
- Onboarding nhập họ tên, ngày sinh, giới tính, chiều cao, cân nặng, mức độ vận động và mục tiêu.
- Dashboard hiển thị calorie đã ăn, calorie đã đốt, cân bằng calorie, calorie còn lại, BMI và TDEE.
- Nhật ký ăn uống theo ngày và theo bữa: Breakfast, Lunch, Dinner, Snack.
- Thêm món ăn thủ công hoặc chọn từ catalog món ăn mặc định.
- Ghi nhận hoạt động thể chất theo catalog MET và thời lượng tập.
- Trang Activity hiển thị lịch sử hoạt động và tổng calorie đã đốt.
- Trang Trends hiển thị xu hướng calorie nạp vào và net calorie theo khoảng ngày.
- Hồ sơ người dùng: cập nhật thông tin, avatar, mục tiêu, theme, màu chủ đạo, cỡ chữ và ngôn ngữ.
- Nhắc nhở ghi nhật ký bằng notification.
- Widget hiển thị nhanh tiến độ calorie trong ngày.
- Xuất và chia sẻ báo cáo PDF theo tuần/khoảng ngày.
Ngày sinh được parse theo định dạng yyyy-MM-dd.
age = số năm giữa dateOfBirth và ngày hiện tại
Tuổi hợp lệ nằm trong khoảng 20 đến 120 vì ứng dụng đang dùng phân loại BMI và công thức năng lượng dành cho người lớn.
heightMeter = heightCm / 100
BMI = weightKg / (heightMeter * heightMeter)
Phân loại BMI:
BMI <= 0: UnknownBMI < 18.5: UnderweightBMI < 25.0: NormalBMI < 30.0: Overweight- Còn lại: Obese
Ứng dụng dùng công thức Mifflin-St Jeor dựa trên cân nặng kg, chiều cao cm và tuổi.
Male = 10 * weightKg + 6.25 * heightCm - 5 * age + 5
Female = 10 * weightKg + 6.25 * heightCm - 5 * age - 161
Other = 10 * weightKg + 6.25 * heightCm - 5 * age
TDEE = BMR * activityMultiplier
Hệ số vận động:
sedentary: 1.2lightly_active: 1.375moderately_active: 1.55very_active: 1.725extra_active: 1.9- Mặc định: 1.55
goalKcal = round(TDEE + goalDelta)
Trong đó:
lose_weight:goalDelta = -500gain_weight:goalDelta = +500- Mục tiêu khác:
goalDelta = 0
Kết quả được chặn tối thiểu là 1000 kcal/ngày.
Macro được tính theo mục tiêu calorie hằng ngày:
proteinCalories = goalKcal * 0.30
fatCalories = goalKcal * 0.25
carbsCalories = goalKcal * 0.45
proteinGrams = proteinCalories / 4
fatGrams = fatCalories / 9
carbsGrams = carbsCalories / 4
Ứng dụng tính calorie đốt dựa trên MET của hoạt động, cân nặng và thời lượng.
kcalBurned = round(MET * 3.5 * weightKg / 200 * durationMinutes)
kcalPerHour = round(MET * 3.5 * weightKg / 200 * 60)
intakeCalories = tổng calories của các món ăn trong ngày
burnedCalories = tổng kcalBurned của các hoạt động trong ngày
netBalance = intakeCalories - burnedCalories
remainingCalories = goalKcal - netBalance
progress = clamp(netBalance / goalKcal, 0, 1)
Với mỗi ngày trong khoảng được chọn:
dailyIntake = tổng calories của món ăn trong ngày
dailyBurned = tổng kcalBurned của hoạt động trong ngày
dailyBalance = dailyIntake - dailyBurned
Trung bình:
avgIntake = totalIntake / totalDays
avgBurned = totalBurned / totalDays
Ngày đạt mục tiêu:
dailyIntake > 0 và dailyBalance nằm trong [goalKcal - 300, goalKcal + 200]
Yêu cầu Android Studio/JDK phù hợp với Android Gradle Plugin của dự án.
.\gradlew.bat assembleDebugHoặc mở thư mục này bằng Android Studio và chạy module app.