diff --git a/app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryPage.kt b/app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryPage.kt index aba6fbbd8ac..e2b91cb7669 100644 --- a/app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryPage.kt +++ b/app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryPage.kt @@ -110,7 +110,9 @@ class MwQueryPage { var diffSize = 0 - val localDateTime by lazy { DateUtil.iso8601LocalDateTimeParse(timeStamp) } + val localDateTime by lazy { + if (timeStamp.isNotBlank()) DateUtil.iso8601LocalDateTimeParse(timeStamp) else null + } fun getContentFromSlot(slot: String): String { return slots?.get(slot)?.content.orEmpty() diff --git a/app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryResult.kt b/app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryResult.kt index 428134591f7..8e36122094a 100644 --- a/app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryResult.kt +++ b/app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryResult.kt @@ -17,7 +17,7 @@ import org.wikipedia.util.StringUtil import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId -import java.util.* +import java.util.Date @Serializable class MwQueryResult { diff --git a/app/src/main/java/org/wikipedia/dataclient/mwapi/UserInfo.kt b/app/src/main/java/org/wikipedia/dataclient/mwapi/UserInfo.kt index 1e95ccc4899..9d0547c40b2 100644 --- a/app/src/main/java/org/wikipedia/dataclient/mwapi/UserInfo.kt +++ b/app/src/main/java/org/wikipedia/dataclient/mwapi/UserInfo.kt @@ -5,7 +5,8 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonElement import org.wikipedia.dataclient.mwapi.MwServiceError.BlockInfo import org.wikipedia.util.DateUtil -import java.util.* +import java.time.LocalDate +import java.util.Date @Serializable class UserInfo : BlockInfo() { @@ -39,16 +40,15 @@ class UserInfo : BlockInfo() { return date } - val registrationDate: Date - get() { - var date = Date(0) - if (!regDate.isNullOrEmpty()) { - date = DateUtil.iso8601DateParse(regDate) - } else if (!registration.isNullOrEmpty()) { - date = DateUtil.iso8601DateParse(registration) - } - return date + val registrationDate: LocalDate by lazy { + if (!regDate.isNullOrEmpty()) { + DateUtil.iso8601LocalDateParse(regDate) + } else if (!registration.isNullOrEmpty()) { + DateUtil.iso8601LocalDateParse(registration) + } else { + LocalDate.EPOCH } + } @Serializable class Options { diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsViewModel.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsViewModel.kt index bd44833f8d2..a9e801968c2 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsViewModel.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsViewModel.kt @@ -21,10 +21,9 @@ import org.wikipedia.suggestededits.provider.EditingSuggestionsProvider import org.wikipedia.util.DateUtil import retrofit2.HttpException import java.io.IOException -import java.time.Duration import java.time.Instant -import java.util.Calendar -import java.util.Date +import java.time.LocalDate +import java.time.temporal.ChronoUnit import kotlin.math.max class SuggestedEditsRecentEditsViewModel : ViewModel() { @@ -220,7 +219,7 @@ class SuggestedEditsRecentEditsViewModel : ViewModel() { var qualifiedUser = false userInfo?.let { val editsCount = userInfo.editCount - val diffDays = diffDays(userInfo.registrationDate) + val diffDays = userInfo.registrationDate.until(LocalDate.now(), ChronoUnit.DAYS) findUserExperienceFilters.forEach { type -> val userExperienceArray = type.value.split("|") val requiredEdits = userExperienceArray.first().split(",") @@ -294,11 +293,5 @@ class SuggestedEditsRecentEditsViewModel : ViewModel() { } return recentChanges } - - private fun diffDays(date: Date): Long { - val nowDate = Calendar.getInstance().toInstant() - val beginDate = date.toInstant() - return Duration.between(beginDate, nowDate).toDays() - } } } diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt b/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt index 133de7f57b8..ab6c5d975a1 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt @@ -19,7 +19,7 @@ import org.wikipedia.util.Resource import org.wikipedia.util.log.L import retrofit2.HttpException import java.io.IOException -import java.util.Date +import java.time.LocalDate class UserContribListViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { val userContribStatsData = MutableLiveData>() @@ -123,5 +123,5 @@ class UserContribListViewModel(savedStateHandle: SavedStateHandle) : ViewModel() open class UserContribItemModel class UserContribItem(val item: UserContribution) : UserContribItemModel() class UserContribSeparator(val date: String) : UserContribItemModel() - class UserContribStats(val totalEdits: Int, val registrationDate: Date, val projectName: String) : UserContribItemModel() + class UserContribStats(val totalEdits: Int, val registrationDate: LocalDate, val projectName: String) : UserContribItemModel() } diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt index 9950e005757..823ee7a62e9 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt @@ -20,9 +20,7 @@ import org.wikipedia.suggestededits.SuggestionsActivity import org.wikipedia.util.DateUtil import org.wikipedia.util.Resource import org.wikipedia.util.StringUtil -import java.time.LocalDateTime -import java.time.ZoneId -import java.util.Date +import java.time.LocalDate class UserInformationDialog : DialogFragment() { @@ -75,13 +73,12 @@ class UserInformationDialog : DialogFragment() { binding.dialogErrorView.isVisible = false } - private fun onSuccess(editCount: String, registrationDate: Date) { + private fun onSuccess(editCount: String, registrationDate: LocalDate) { sendPatrollerExperienceEvent() binding.userInformationContainer.isVisible = true binding.dialogProgressBar.isVisible = false binding.dialogErrorView.isVisible = false - val localDate = LocalDateTime.ofInstant(registrationDate.toInstant(), ZoneId.systemDefault()).toLocalDate() - val dateStr = DateUtil.getShortDateString(localDate) + val dateStr = DateUtil.getShortDateString(registrationDate) binding.userTenure.text = StringUtil.fromHtml(getString(R.string.patroller_tasks_edits_list_user_information_dialog_joined_date_text, dateStr)) binding.editCount.text = StringUtil.fromHtml(getString(R.string.patroller_tasks_edits_list_user_information_dialog_edit_count_text, editCount)) } diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt index b9aecd1e59f..7d9f5bfb80b 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialogViewModel.kt @@ -11,12 +11,12 @@ import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.WikiSite import org.wikipedia.util.Resource -import java.util.Date +import java.time.LocalDate class UserInformationDialogViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { var userName = savedStateHandle.get(UserInformationDialog.USERNAME_ARG)!! - private val _uiState = MutableStateFlow(Resource>()) + private val _uiState = MutableStateFlow(Resource>()) val uiState = _uiState.asStateFlow() init { @@ -31,7 +31,7 @@ class UserInformationDialogViewModel(savedStateHandle: SavedStateHandle) : ViewM val userInfo = ServiceFactory.get(WikiSite.forLanguageCode(WikipediaApp.instance.appOrSystemLanguageCode)).globalUserInfo(userName) userInfo.query?.globalUserInfo?.let { val editCount = String.format("%,d", it.editCount) - _uiState.value = Resource.Success(Pair(editCount, it.registrationDate)) + _uiState.value = Resource.Success(editCount to it.registrationDate) } ?: run { _uiState.value = Resource.Error(Throwable("Cannot fetch user information.")) } diff --git a/app/src/main/java/org/wikipedia/util/DateUtil.kt b/app/src/main/java/org/wikipedia/util/DateUtil.kt index 838be754e44..f3b7f33cee3 100644 --- a/app/src/main/java/org/wikipedia/util/DateUtil.kt +++ b/app/src/main/java/org/wikipedia/util/DateUtil.kt @@ -8,19 +8,11 @@ import org.wikipedia.R import org.wikipedia.WikipediaApp import org.wikipedia.feed.model.UtcDate import java.text.SimpleDateFormat -import java.time.Instant -import java.time.LocalDate -import java.time.LocalDateTime -import java.time.ZoneId -import java.time.ZoneOffset +import java.time.* import java.time.format.DateTimeFormatter import java.time.format.FormatStyle import java.time.temporal.TemporalAccessor -import java.util.Calendar -import java.util.Date -import java.util.GregorianCalendar -import java.util.Locale -import java.util.TimeZone +import java.util.* import java.util.concurrent.ConcurrentHashMap object DateUtil { @@ -36,6 +28,10 @@ object DateUtil { return LocalDateTime.ofInstant(Instant.parse(timestamp), ZoneId.systemDefault()) } + fun iso8601LocalDateParse(timestamp: String): LocalDate { + return LocalDate.ofInstant(Instant.parse(timestamp), ZoneId.systemDefault()) + } + fun dbDateFormat(date: Date): String { return getCachedDateFormat("yyyyMMddHHmmss", Locale.ROOT, true).format(date) } @@ -64,7 +60,7 @@ object DateUtil { return getDateStringWithSkeletonPattern(date, "MMMM") } - fun getYearOnlyDateString(date: Date): String { + fun getYearOnlyDateString(date: LocalDate): String { return getDateStringWithSkeletonPattern(date, "yyyy") } diff --git a/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt b/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt index 76606adc944..c2c969bc2a1 100644 --- a/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt +++ b/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt @@ -16,7 +16,7 @@ import org.wikipedia.util.DateUtil import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.StringUtil -import java.time.LocalDateTime +import java.time.LocalDate class EditHistoryStatsView constructor(context: Context, attrs: AttributeSet? = null) : ConstraintLayout(context, attrs) { @@ -31,19 +31,16 @@ class EditHistoryStatsView constructor(context: Context, attrs: AttributeSet? = fun setup(pageTitle: PageTitle, editHistoryStats: EditHistoryListViewModel.EditHistoryStats?) { binding.articleTitleView.text = StringUtil.fromHtml(context.getString(R.string.page_edit_history_activity_title, "${pageTitle.displayText}")) - editHistoryStats?.let { stats -> - val timestamp = stats.revision.timeStamp - if (timestamp.isNotBlank()) { - val createdYear = DateUtil.getYearOnlyDateString(DateUtil.iso8601DateParse(timestamp)) - val localDateTime = LocalDateTime.now() - val today = DateUtil.getShortDateString(localDateTime.toLocalDate()) - val lastYear = DateUtil.getShortDateString(localDateTime.minusYears(1).toLocalDate()) - binding.editCountsView.text = context.resources.getQuantityString(R.plurals.page_edit_history_article_edits_since_year, - stats.allEdits.count, stats.allEdits.count, createdYear) - binding.statsGraphView.setData(stats.metrics.map { it.edits.toFloat() }) - binding.statsGraphView.contentDescription = context.getString(R.string.page_edit_history_metrics_content_description, lastYear, today) - FeedbackUtil.setButtonTooltip(binding.statsGraphView) - } + editHistoryStats?.revision?.localDateTime?.let { dateTime -> + val createdYear = DateUtil.getYearOnlyDateString(dateTime.toLocalDate()) + val localDate = LocalDate.now() + val today = DateUtil.getShortDateString(localDate) + val lastYear = DateUtil.getShortDateString(localDate.minusYears(1)) + binding.editCountsView.text = context.resources.getQuantityString(R.plurals.page_edit_history_article_edits_since_year, + editHistoryStats.allEdits.count, editHistoryStats.allEdits.count, createdYear) + binding.statsGraphView.setData(editHistoryStats.metrics.map { it.edits.toFloat() }) + binding.statsGraphView.contentDescription = context.getString(R.string.page_edit_history_metrics_content_description, lastYear, today) + FeedbackUtil.setButtonTooltip(binding.statsGraphView) } binding.articleTitleView.movementMethod = LinkMovementMethodExt { _ -> context.startActivity(PageActivity.newIntentForNewTab(context, HistoryEntry(pageTitle, HistoryEntry.SOURCE_EDIT_HISTORY), pageTitle))