we are developing a water tracking app in Kotlin / Android Studio. Unfortunately, the achievements (reaching a daily water intake goal for x days in a row) are not being crossed off, I think? Could you help me? Thanks a lot!
Respective functions from AchievementsFragment.kt
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentAchievementsBinding.inflate(inflater, container, false)
// SharedPreferences
sharedPreferences = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE)
return binding.root
}
// Setting up database operations and listeners in onViewCreated
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val database = AppDatabase.getDatabase(requireContext())
val waterDao = database.waterDao()
// Getting the daily water goal
val dailyWaterGoal = sharedPreferences.getInt("dailyGoal", 2000)
binding.infoButton.setOnClickListener {
showInfoDialog()
}
// Fetching goal days and updating achievements
viewLifecycleOwner.lifecycleScope.launch {
val lastDayIntake = waterDao.getLastDayData()
var streak = sharedPreferences.getInt("currentStreak", 0)
if (lastDayIntake?.amount ?: 0 >= dailyWaterGoal) {
streak++
sharedPreferences.edit().putInt("currentStreak", streak).apply()
} else {
streak = 0
sharedPreferences.edit().putInt("currentStreak", 0).apply()
}
updateAchievements(streak)
}
}
// Method to update achievements based on number of days
private fun updateAchievements(numDays: Int) {
updateAchievement(numDays, 3, binding.textAchievement1)
updateAchievement(numDays, 5, binding.textAchievement2)
updateAchievement(numDays, 10, binding.textAchievement3)
updateAchievement(numDays, 30, binding.textAchievement4)
updateAchievement(numDays, 180, binding.textAchievement5)
}
// Method to update achievements
private fun updateAchievement(numDays: Int, requiredDays: Int, textView: TextView) {
if (numDays >= requiredDays) {
textView.paintFlags = textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
} else {
textView.paintFlags = textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}
}
WaterDao.kt
interface WaterDao {
@Query("SELECT * FROM WaterIntake ORDER BY day, month, year DESC LIMIT 1")
suspend fun getLastDayData(): WaterIntake?
}
data class AmountSum( val date: Int, val totalAmount: Int )