@@ -19,15 +19,13 @@ import org.wikipedia.analytics.eventplatform.WikiGamesEvent
1919import org.wikipedia.games.onthisday.OnThisDayGameViewModel.Companion.LANG_CODES_SUPPORTED
2020import org.wikipedia.games.onthisday.OnThisDayGameViewModel.Companion.dateReleasedForLang
2121import org.wikipedia.util.log.L
22+ import java.time.Instant
2223import java.time.LocalDate
2324import java.time.ZoneId
24- import java.time.ZoneOffset
25- import java.util.Calendar
26- import java.util.Date
27- import java.util.TimeZone
25+ import java.time.temporal.ChronoUnit
2826
2927abstract class OnThisDayGameBaseFragment : Fragment () {
30- private var scoreData: Map < Long , Int > = emptyMap ()
28+ private var scoreData = emptyMap< LocalDate , Int >()
3129
3230 private val fragmentLifecycleCallbacks = object : FragmentManager .FragmentLifecycleCallbacks () {
3331 @SuppressLint(" RestrictedApi" )
@@ -38,7 +36,7 @@ abstract class OnThisDayGameBaseFragment : Fragment() {
3836 (calendar as MaterialCalendar <Long >? )?.addOnSelectionChangedListener(object :
3937 OnSelectionChangedListener <Long >() {
4038 override fun onSelectionChanged (selection : Long ) {
41- maybeShowToastForDate(selection, scoreData )
39+ maybeShowToastForDate(selection)
4240 }
4341 })
4442 }
@@ -58,90 +56,66 @@ abstract class OnThisDayGameBaseFragment : Fragment() {
5856 protected fun prepareAndOpenArchiveCalendar (viewModel : OnThisDayGameViewModel ) {
5957 lifecycleScope.launch {
6058 val startDateBasedOnLanguage = LANG_CODES_SUPPORTED .associateWith { dateReleasedForLang(it) }
61- val localDate = startDateBasedOnLanguage[viewModel.wikiSite.languageCode]
62- val startDate = Date .from(localDate?.atStartOfDay(ZoneId .systemDefault())?.toInstant())
59+ val startDate = startDateBasedOnLanguage[viewModel.wikiSite.languageCode]!!
6360 scoreData = viewModel.getDataForArchiveCalendar(language = viewModel.wikiSite.languageCode)
64- showArchiveCalendar(
65- startDate,
66- Date (),
67- scoreData,
68- onDateSelected = { selectedDateInMillis ->
69- handleDateSelection(selectedDateInMillis)
70- }
71- )
61+ showArchiveCalendar(startDate, onDateSelected = ::handleDateSelection)
7262 }
7363 }
7464
75- private fun showArchiveCalendar (startDate : Date , endDate : Date , scoreData : Map <Long , Int >, onDateSelected : (Long ) -> Unit ) {
76- val startTimeInMillis = startDate.time
77- val endTimeInMillis = endDate.time
65+ private fun showArchiveCalendar (startDate : LocalDate , onDateSelected : (Long ) -> Unit ) {
66+ val startInstant = startDate.atStartOfDay(ZoneId .systemDefault()).toInstant()
67+ val startTimeInMillis = startInstant.toEpochMilli()
68+ val endInstant = Instant .now()
69+ val endTimeInMillis = endInstant.toEpochMilli()
70+ val oneDayBeforeStart = startInstant.minus(1 , ChronoUnit .DAYS ).toEpochMilli()
7871 val calendarConstraints = CalendarConstraints .Builder ()
79- .setStart(startDate.time )
72+ .setStart(startTimeInMillis )
8073 .setEnd(endTimeInMillis)
8174 .setValidator(
8275 CompositeDateValidator .allOf(
8376 listOf (
84- DateValidatorPointForward .from(startTimeInMillis - ( 24 * 60 * 60 * 1000 ) ),
77+ DateValidatorPointForward .from(oneDayBeforeStart ),
8578 DateValidatorPointBackward .before(endTimeInMillis)
8679 )
8780 )
8881 )
8982 .build()
9083
84+ val endDate = LocalDate .ofInstant(endInstant, ZoneId .systemDefault())
9185 val datePicker = MaterialDatePicker .Builder .datePicker()
9286 .setTitleText(getString(R .string.on_this_day_game_archive_calendar_title))
9387 .setTheme(R .style.MaterialDatePickerStyle )
94- .setDayViewDecorator(
95- DateDecorator (
96- startDate,
97- endDate,
98- scoreData
99- )
100- )
88+ .setDayViewDecorator(DateDecorator (startDate, endDate, scoreData))
10189 .setCalendarConstraints(calendarConstraints)
10290 .setSelection(endTimeInMillis)
10391 .build()
10492 .apply {
105- addOnPositiveButtonClickListener { selectedDateInMillis ->
106- onDateSelected(selectedDateInMillis)
107- }
93+ addOnPositiveButtonClickListener(onDateSelected)
10894 }
10995
11096 datePicker.show(childFragmentManager, " datePicker" )
11197 }
11298
11399 private fun handleDateSelection (selectedDateInMillis : Long ) {
114- val calendar = Calendar .getInstance(TimeZone .getTimeZone(ZoneOffset .UTC ))
115- calendar.timeInMillis = selectedDateInMillis
116- val year = calendar.get(Calendar .YEAR )
117- val month = calendar.get(Calendar .MONTH ) + 1
118- val day = calendar.get(Calendar .DAY_OF_MONTH )
119- val scoreDataKey = DateDecorator .getDateKey(year, month, day)
120- if (scoreData[scoreDataKey] != null ) {
100+ val localDate = LocalDate .ofInstant(Instant .ofEpochMilli(selectedDateInMillis),
101+ ZoneId .systemDefault())
102+ if (scoreData[localDate] != null ) {
121103 return
122104 }
123105 WikiGamesEvent .submit(" date_select" , " game_play" , slideName = " archive_calendar" )
124- onArchiveDateSelected(LocalDate .of(year, month, day) )
106+ onArchiveDateSelected(localDate )
125107 }
126108
127109 abstract fun onArchiveDateSelected (date : LocalDate )
128110
129- private fun maybeShowToastForDate (selectedDateInMillis : Long , scoreData : Map <Long , Int >) {
130- val calendar = Calendar .getInstance(TimeZone .getTimeZone(ZoneOffset .UTC ))
131- calendar.timeInMillis = selectedDateInMillis
132- val year = calendar.get(Calendar .YEAR )
133- val month = calendar.get(Calendar .MONTH )
134- val day = calendar.get(Calendar .DAY_OF_MONTH )
135- val scoreDataKey = DateDecorator .getDateKey(year, month + 1 , day)
136- if (scoreData[scoreDataKey] != null ) {
137- Toast .makeText(
138- requireContext(),
139- getString(
140- R .string.on_this_day_game_score_toast_message,
141- scoreData[scoreDataKey],
142- OnThisDayGameViewModel .MAX_QUESTIONS
143- ), Toast .LENGTH_SHORT
144- ).show()
111+ private fun maybeShowToastForDate (selectedDateInMillis : Long ) {
112+ val localDate = LocalDate .ofInstant(Instant .ofEpochMilli(selectedDateInMillis),
113+ ZoneId .systemDefault())
114+ val score = scoreData[localDate]
115+ if (score != null ) {
116+ val message = getString(R .string.on_this_day_game_score_toast_message, score,
117+ OnThisDayGameViewModel .MAX_QUESTIONS )
118+ Toast .makeText(requireContext(), message, Toast .LENGTH_SHORT ).show()
145119 }
146120 }
147121
0 commit comments