@@ -13,7 +13,6 @@ import kotlinx.coroutines.flow.catch
1313import kotlinx.coroutines.flow.distinctUntilChanged
1414import kotlinx.coroutines.flow.map
1515import java.time.LocalDate
16- import java.time.format.DateTimeFormatter
1716import javax.inject.Inject
1817import javax.inject.Singleton
1918
@@ -27,7 +26,7 @@ class UserPreferences @Inject constructor(
2726 val ONBOARDING_COMPLETED = booleanPreferencesKey(" onboarding_completed" )
2827
2928 val FORTUNE_ID = longPreferencesKey(" fortune_id" )
30- val FORTUNE_DATE = stringPreferencesKey( " fortune_date " )
29+ val FORTUNE_DATE_EPOCH = longPreferencesKey( " fortune_date_epoch " )
3130 val FORTUNE_IMAGE_ID = intPreferencesKey(" fortune_image_id" )
3231 val FORTUNE_SCORE = intPreferencesKey(" fortune_score" )
3332 val FORTUNE_SEEN = booleanPreferencesKey(" fortune_seen" )
@@ -36,10 +35,13 @@ class UserPreferences @Inject constructor(
3635 val FORTUNE_FAILED = booleanPreferencesKey(" fortune_failed" )
3736
3837 val FIRST_ALARM_DISMISSED_TODAY = booleanPreferencesKey(" first_alarm_dismissed_today" )
39- val FIRST_ALARM_DISMISSED_DATE = stringPreferencesKey(" first_alarm_dismissed_date" )
38+ val FIRST_ALARM_DISMISSED_DATE_EPOCH = longPreferencesKey(" first_alarm_dismissed_date_epoch" )
39+
40+ val UPDATE_NOTICE_DONT_SHOW_VERSION = stringPreferencesKey(" update_notice_dont_show_version" )
41+ val UPDATE_NOTICE_LAST_SHOWN_DATE_EPOCH = longPreferencesKey(" update_notice_last_shown_date_epoch" )
4042 }
4143
42- private fun today (): String = LocalDate .now().format( DateTimeFormatter . ISO_DATE )
44+ private fun todayEpoch (): Long = LocalDate .now().toEpochDay( )
4345
4446 val userIdFlow: Flow <Long ?> = dataStore.data
4547 .catch { emit(emptyPreferences()) }
@@ -61,9 +63,9 @@ class UserPreferences @Inject constructor(
6163 .map { it[Keys .FORTUNE_ID ] }
6264 .distinctUntilChanged()
6365
64- val fortuneDateFlow : Flow <String ?> = dataStore.data
66+ val fortuneDateEpochFlow : Flow <Long ?> = dataStore.data
6567 .catch { emit(emptyPreferences()) }
66- .map { it[Keys .FORTUNE_DATE ] }
68+ .map { it[Keys .FORTUNE_DATE_EPOCH ] }
6769 .distinctUntilChanged()
6870
6971 val fortuneImageIdFlow: Flow <Int ?> = dataStore.data
@@ -79,18 +81,17 @@ class UserPreferences @Inject constructor(
7981 val hasUnseenFortuneFlow: Flow <Boolean > = dataStore.data
8082 .catch { emit(emptyPreferences()) }
8183 .map { pref ->
82- pref[Keys .FORTUNE_DATE ] == today() &&
83- pref[Keys .FORTUNE_ID ] != null &&
84- (pref[Keys .FORTUNE_SEEN ] != true )
84+ val isToday = pref[Keys .FORTUNE_DATE_EPOCH ] == todayEpoch()
85+ isToday && (pref[Keys .FORTUNE_ID ] != null ) && (pref[Keys .FORTUNE_SEEN ] != true )
8586 }
8687 .distinctUntilChanged()
8788
8889 val shouldShowFortuneToolTipFlow: Flow <Boolean > = dataStore.data
8990 .catch { emit(emptyPreferences()) }
9091 .map { pref ->
91- val hasTodayFortune = pref[Keys .FORTUNE_DATE ] == today() && pref[Keys .FORTUNE_ID ] != null
92- val tooltipNotShown = pref[Keys .FORTUNE_TOOLTIP_SHOWN ] ? : false
93- hasTodayFortune && ! tooltipNotShown
92+ val hasTodayFortune = ( pref[Keys .FORTUNE_DATE_EPOCH ] == todayEpoch()) && ( pref[Keys .FORTUNE_ID ] != null )
93+ val tooltipShown = pref[Keys .FORTUNE_TOOLTIP_SHOWN ] ? : false
94+ hasTodayFortune && ! tooltipShown
9495 }
9596 .distinctUntilChanged()
9697
@@ -108,27 +109,31 @@ class UserPreferences @Inject constructor(
108109 .catch { emit(emptyPreferences()) }
109110 .map { pref ->
110111 val flag = pref[Keys .FIRST_ALARM_DISMISSED_TODAY ] ? : false
111- val date = pref[Keys .FIRST_ALARM_DISMISSED_DATE ]
112- flag && date == today()
112+ val isToday = pref[Keys .FIRST_ALARM_DISMISSED_DATE_EPOCH ] == todayEpoch()
113+ flag && isToday
113114 }
114115 .distinctUntilChanged()
115116
117+ val updateNoticeDontShowVersionFlow: Flow <String ?> = dataStore.data
118+ .catch { emit(emptyPreferences()) }
119+ .map { it[Keys .UPDATE_NOTICE_DONT_SHOW_VERSION ] }
120+ .distinctUntilChanged()
121+
122+ val updateNoticeLastShownDateEpochFlow: Flow <Long ?> = dataStore.data
123+ .catch { emit(emptyPreferences()) }
124+ .map { it[Keys .UPDATE_NOTICE_LAST_SHOWN_DATE_EPOCH ] }
125+ .distinctUntilChanged()
126+
116127 suspend fun saveUserId (userId : Long ) {
117- dataStore.edit { pref ->
118- pref[Keys .USER_ID ] = userId
119- }
128+ dataStore.edit { it[Keys .USER_ID ] = userId }
120129 }
121130
122131 suspend fun saveUserName (userName : String ) {
123- dataStore.edit { pref ->
124- pref[Keys .USER_NAME ] = userName
125- }
132+ dataStore.edit { it[Keys .USER_NAME ] = userName }
126133 }
127134
128135 suspend fun setOnboardingCompleted () {
129- dataStore.edit { pref ->
130- pref[Keys .ONBOARDING_COMPLETED ] = true
131- }
136+ dataStore.edit { it[Keys .ONBOARDING_COMPLETED ] = true }
132137 }
133138
134139 suspend fun markFortuneCreating () {
@@ -140,10 +145,12 @@ class UserPreferences @Inject constructor(
140145
141146 suspend fun markFortuneCreated (fortuneId : Long ) {
142147 dataStore.edit { pref ->
143- val isNewForToday = pref[Keys .FORTUNE_ID ] != fortuneId || pref[Keys .FORTUNE_DATE ] != today()
148+ val today = todayEpoch()
149+ val prevDate = pref[Keys .FORTUNE_DATE_EPOCH ]
150+ val isNewForToday = (pref[Keys .FORTUNE_ID ] != fortuneId) || (prevDate != today)
144151
145152 pref[Keys .FORTUNE_ID ] = fortuneId
146- pref[Keys .FORTUNE_DATE ] = today()
153+ pref[Keys .FORTUNE_DATE_EPOCH ] = today
147154 pref[Keys .FORTUNE_CREATING ] = false
148155 pref[Keys .FORTUNE_FAILED ] = false
149156
@@ -162,44 +169,46 @@ class UserPreferences @Inject constructor(
162169 }
163170
164171 suspend fun markFortuneSeen () {
165- dataStore.edit { pref ->
166- pref[Keys .FORTUNE_SEEN ] = true
167- }
172+ dataStore.edit { it[Keys .FORTUNE_SEEN ] = true }
168173 }
169174
170175 suspend fun markFortuneTooltipShown () {
171- dataStore.edit { pref ->
172- pref[Keys .FORTUNE_TOOLTIP_SHOWN ] = true
173- }
176+ dataStore.edit { it[Keys .FORTUNE_TOOLTIP_SHOWN ] = true }
174177 }
175178
176179 suspend fun saveFortuneImageId (imageResId : Int ) {
177- dataStore.edit { pref ->
178- pref[Keys .FORTUNE_IMAGE_ID ] = imageResId
179- }
180+ dataStore.edit { it[Keys .FORTUNE_IMAGE_ID ] = imageResId }
180181 }
181182
182183 suspend fun saveFortuneScore (score : Int ) {
183- dataStore.edit { pref ->
184- pref[Keys .FORTUNE_SCORE ] = score
185- }
184+ dataStore.edit { it[Keys .FORTUNE_SCORE ] = score }
186185 }
187186
188187 suspend fun markFirstAlarmDismissedToday () {
189188 dataStore.edit { pref ->
190189 pref[Keys .FIRST_ALARM_DISMISSED_TODAY ] = true
191- pref[Keys .FIRST_ALARM_DISMISSED_DATE ] = today()
190+ pref[Keys .FIRST_ALARM_DISMISSED_DATE_EPOCH ] = todayEpoch()
191+ }
192+ }
193+
194+ suspend fun markUpdateNoticeDontShow (version : String ) {
195+ dataStore.edit { it[Keys .UPDATE_NOTICE_DONT_SHOW_VERSION ] = version }
196+ }
197+
198+ suspend fun markUpdateNoticeShownToday () {
199+ dataStore.edit { pref ->
200+ pref[Keys .UPDATE_NOTICE_LAST_SHOWN_DATE_EPOCH ] = todayEpoch()
192201 }
193202 }
194203
195204 suspend fun clearUserData () {
196- dataStore.edit { pref -> pref .clear() }
205+ dataStore.edit { it .clear() }
197206 }
198207
199208 suspend fun clearFortuneData () {
200209 dataStore.edit { pref ->
201210 pref.remove(Keys .FORTUNE_ID )
202- pref.remove(Keys .FORTUNE_DATE )
211+ pref.remove(Keys .FORTUNE_DATE_EPOCH )
203212 pref.remove(Keys .FORTUNE_IMAGE_ID )
204213 pref.remove(Keys .FORTUNE_SCORE )
205214 pref.remove(Keys .FORTUNE_SEEN )
0 commit comments