@@ -19,15 +19,13 @@ import org.wikipedia.analytics.eventplatform.WikiGamesEvent
19
19
import org.wikipedia.games.onthisday.OnThisDayGameViewModel.Companion.LANG_CODES_SUPPORTED
20
20
import org.wikipedia.games.onthisday.OnThisDayGameViewModel.Companion.dateReleasedForLang
21
21
import org.wikipedia.util.log.L
22
+ import java.time.Instant
22
23
import java.time.LocalDate
23
24
import 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
28
26
29
27
abstract class OnThisDayGameBaseFragment : Fragment () {
30
- private var scoreData: Map < Long , Int > = emptyMap ()
28
+ private var scoreData = emptyMap< LocalDate , Int >()
31
29
32
30
private val fragmentLifecycleCallbacks = object : FragmentManager .FragmentLifecycleCallbacks () {
33
31
@SuppressLint(" RestrictedApi" )
@@ -38,7 +36,7 @@ abstract class OnThisDayGameBaseFragment : Fragment() {
38
36
(calendar as MaterialCalendar <Long >? )?.addOnSelectionChangedListener(object :
39
37
OnSelectionChangedListener <Long >() {
40
38
override fun onSelectionChanged (selection : Long ) {
41
- maybeShowToastForDate(selection, scoreData )
39
+ maybeShowToastForDate(selection)
42
40
}
43
41
})
44
42
}
@@ -58,90 +56,66 @@ abstract class OnThisDayGameBaseFragment : Fragment() {
58
56
protected fun prepareAndOpenArchiveCalendar (viewModel : OnThisDayGameViewModel ) {
59
57
lifecycleScope.launch {
60
58
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]!!
63
60
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)
72
62
}
73
63
}
74
64
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()
78
71
val calendarConstraints = CalendarConstraints .Builder ()
79
- .setStart(startDate.time )
72
+ .setStart(startTimeInMillis )
80
73
.setEnd(endTimeInMillis)
81
74
.setValidator(
82
75
CompositeDateValidator .allOf(
83
76
listOf (
84
- DateValidatorPointForward .from(startTimeInMillis - ( 24 * 60 * 60 * 1000 ) ),
77
+ DateValidatorPointForward .from(oneDayBeforeStart ),
85
78
DateValidatorPointBackward .before(endTimeInMillis)
86
79
)
87
80
)
88
81
)
89
82
.build()
90
83
84
+ val endDate = LocalDate .ofInstant(endInstant, ZoneId .systemDefault())
91
85
val datePicker = MaterialDatePicker .Builder .datePicker()
92
86
.setTitleText(getString(R .string.on_this_day_game_archive_calendar_title))
93
87
.setTheme(R .style.MaterialDatePickerStyle )
94
- .setDayViewDecorator(
95
- DateDecorator (
96
- startDate,
97
- endDate,
98
- scoreData
99
- )
100
- )
88
+ .setDayViewDecorator(DateDecorator (startDate, endDate, scoreData))
101
89
.setCalendarConstraints(calendarConstraints)
102
90
.setSelection(endTimeInMillis)
103
91
.build()
104
92
.apply {
105
- addOnPositiveButtonClickListener { selectedDateInMillis ->
106
- onDateSelected(selectedDateInMillis)
107
- }
93
+ addOnPositiveButtonClickListener(onDateSelected)
108
94
}
109
95
110
96
datePicker.show(childFragmentManager, " datePicker" )
111
97
}
112
98
113
99
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 ) {
121
103
return
122
104
}
123
105
WikiGamesEvent .submit(" date_select" , " game_play" , slideName = " archive_calendar" )
124
- onArchiveDateSelected(LocalDate .of(year, month, day) )
106
+ onArchiveDateSelected(localDate )
125
107
}
126
108
127
109
abstract fun onArchiveDateSelected (date : LocalDate )
128
110
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()
145
119
}
146
120
}
147
121
0 commit comments