diff --git a/app/src/main/java/org/wikipedia/activitytab/ImpactModule.kt b/app/src/main/java/org/wikipedia/activitytab/ImpactModule.kt index 86ede646296..c2d28b5bd44 100644 --- a/app/src/main/java/org/wikipedia/activitytab/ImpactModule.kt +++ b/app/src/main/java/org/wikipedia/activitytab/ImpactModule.kt @@ -166,7 +166,7 @@ fun AllTimeImpactCard( statLabel = pluralStringResource(R.plurals.activity_tab_impact_thanks, totalThanks) ) val lastEditedDateString = if (lastEditTimestamp > 0) { - DateUtil.getMDYDateString(Date(lastEditTimestamp * 1000)) + DateUtil.getDateString(Date(lastEditTimestamp * 1000)) } else { "-" } diff --git a/app/src/main/java/org/wikipedia/activitytab/ReadingHistoryModule.kt b/app/src/main/java/org/wikipedia/activitytab/ReadingHistoryModule.kt index 988c83f33c1..cc2ccc559f0 100644 --- a/app/src/main/java/org/wikipedia/activitytab/ReadingHistoryModule.kt +++ b/app/src/main/java/org/wikipedia/activitytab/ReadingHistoryModule.kt @@ -1,6 +1,5 @@ package org.wikipedia.activitytab -import android.text.format.DateFormat import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -55,11 +54,11 @@ import org.wikipedia.compose.theme.WikipediaTheme import org.wikipedia.dataclient.WikiSite import org.wikipedia.page.PageTitle import org.wikipedia.theme.Theme +import org.wikipedia.util.DateUtil import org.wikipedia.util.StringUtil import org.wikipedia.util.UiState import org.wikipedia.views.imageservice.ImageService import java.time.LocalDate -import java.time.format.DateTimeFormatter import java.util.Locale @Composable @@ -252,25 +251,9 @@ private fun ArticleReadThisMonthCard( showChevron = true, subtitle = if (readingHistory.lastArticleReadTime != null) { if (todayDate == readingHistory.lastArticleReadTime.toLocalDate()) - readingHistory.lastArticleReadTime - .format( - DateTimeFormatter.ofPattern( - DateFormat.getBestDateTimePattern( - Locale.getDefault(), - "hhmm a" - ) - ) - ) + DateUtil.getTimeString(readingHistory.lastArticleReadTime) else - readingHistory.lastArticleReadTime - .format( - DateTimeFormatter.ofPattern( - DateFormat.getBestDateTimePattern( - Locale.getDefault(), - "MMMM d" - ) - ) - ) + DateUtil.getLongMonthDayString(readingHistory.lastArticleReadTime.toLocalDate()) } else null ) @@ -325,25 +308,9 @@ private fun ArticleSavedThisMonthCard( showChevron = true, subtitle = if (readingHistory.lastArticleSavedTime != null) { if (todayDate == readingHistory.lastArticleSavedTime.toLocalDate()) - readingHistory.lastArticleSavedTime - .format( - DateTimeFormatter.ofPattern( - DateFormat.getBestDateTimePattern( - Locale.getDefault(), - "hhmm a" - ) - ) - ) + DateUtil.getTimeString(readingHistory.lastArticleSavedTime) else - readingHistory.lastArticleSavedTime - .format( - DateTimeFormatter.ofPattern( - DateFormat.getBestDateTimePattern( - Locale.getDefault(), - "MMMM d" - ) - ) - ) + DateUtil.getLongMonthDayString(readingHistory.lastArticleSavedTime.toLocalDate()) } else null ) diff --git a/app/src/main/java/org/wikipedia/activitytab/timeline/TimelineModule.kt b/app/src/main/java/org/wikipedia/activitytab/timeline/TimelineModule.kt index 4430afbcd23..e936657bd8d 100644 --- a/app/src/main/java/org/wikipedia/activitytab/timeline/TimelineModule.kt +++ b/app/src/main/java/org/wikipedia/activitytab/timeline/TimelineModule.kt @@ -221,7 +221,7 @@ fun TimelineDateSeparator( val (dateHeaderText, showSecondaryDate) = when { date.isToday() -> stringResource(R.string.activity_tab_timeline_today) to true date.isYesterday() -> stringResource(R.string.activity_tab_timeline_yesterday) to true - else -> DateUtil.getMMMMdYYYY(date, false) to false + else -> DateUtil.getDateString(date) to false } Column( @@ -236,7 +236,7 @@ fun TimelineDateSeparator( ) if (showSecondaryDate) { Text( - text = DateUtil.getMMMMdYYYY(date, false), + text = DateUtil.getDateString(date), style = MaterialTheme.typography.bodySmall, color = WikipediaTheme.colors.secondaryColor ) diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt index 7261e69340f..45817a61a7e 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsFragment.kt @@ -452,7 +452,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M if (viewModel.revisionFrom != null) { binding.usernameFromButton.text = viewModel.revisionFrom!!.user - binding.revisionFromTimestamp.text = DateUtil.getTimeAndDateString(requireContext(), viewModel.revisionFrom!!.timeStamp) + binding.revisionFromTimestamp.text = DateUtil.getDateAndTimeString(viewModel.revisionFrom!!.localDateTime) binding.revisionFromEditComment.text = StringUtil.fromHtml(viewModel.revisionFrom!!.parsedcomment.trim()) binding.revisionFromTimestamp.setTextColor(ResourceUtil.getThemedColor(requireContext(), R.attr.progressive_color)) binding.overlayRevisionFromTimestamp.setTextColor(ResourceUtil.getThemedColor(requireContext(), R.attr.progressive_color)) @@ -472,7 +472,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M viewModel.revisionTo?.let { binding.usernameToButton.text = it.user - binding.revisionToTimestamp.text = DateUtil.getTimeAndDateString(requireContext(), it.timeStamp) + binding.revisionToTimestamp.text = DateUtil.getDateAndTimeString(it.localDateTime) binding.overlayRevisionToTimestamp.text = binding.revisionToTimestamp.text binding.revisionToEditComment.text = StringUtil.fromHtml(it.parsedcomment.trim()) diff --git a/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayCard.kt b/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayCard.kt index 1173bab4c42..0738d998b48 100644 --- a/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayCard.kt +++ b/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayCard.kt @@ -24,7 +24,7 @@ class OnThisDayCard(val event: OnThisDay.Event, wiki: WikiSite, val age: Int) : } override fun subtitle(): String { - return DateUtil.getFeedCardShortDateString(date) + return DateUtil.getMediumMonthDayString(date) } override fun dismissHashCode(): Int { diff --git a/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayFragment.kt b/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayFragment.kt index ce3dfd3d6c6..5d44074deef 100644 --- a/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/onthisday/OnThisDayFragment.kt @@ -50,7 +50,7 @@ class OnThisDayFragment : Fragment(), CustomDatePicker.Callback { } else if (verticalOffset <= -appBarLayout.totalScrollRange) { binding.dropDownToolbar.visibility = View.VISIBLE } - val newText = if (verticalOffset <= -appBarLayout.totalScrollRange) DateUtil.getMonthOnlyDateString(viewModel.date.time) else "" + val newText = if (verticalOffset <= -appBarLayout.totalScrollRange) DateUtil.getMonthOnlyDateString(viewModel.date) else "" if (newText != binding.toolbarDay.text.toString()) { appBarLayout.post { binding.toolbarDay.text = newText } } @@ -138,7 +138,7 @@ class OnThisDayFragment : Fragment(), CustomDatePicker.Callback { binding.collapsingToolbarLayout.setCollapsedTitleTextColor( ResourceUtil.getThemedColor(requireContext(), R.attr.primary_color) ) - binding.day.text = DateUtil.getMonthOnlyDateString(viewModel.date.time) + binding.day.text = DateUtil.getMonthOnlyDateString(viewModel.date) maybeHideDateIndicator() binding.appBar.addOnOffsetChangedListener(offsetChangedListener) } @@ -161,7 +161,7 @@ class OnThisDayFragment : Fragment(), CustomDatePicker.Callback { override fun onDatePicked(calendar: Calendar) { binding.eventsRecycler.visibility = View.GONE viewModel.date[CustomDatePicker.LEAP_YEAR, calendar[Calendar.MONTH], calendar[Calendar.DATE], 0] = 0 - binding.day.text = DateUtil.getMonthOnlyDateString(viewModel.date.time) + binding.day.text = DateUtil.getMonthOnlyDateString(viewModel.date) binding.appBar.setExpanded(true) viewModel.loadOnThisDay(calendar) maybeHideDateIndicator() diff --git a/app/src/main/java/org/wikipedia/feed/topread/TopReadListCard.kt b/app/src/main/java/org/wikipedia/feed/topread/TopReadListCard.kt index 401916d6c13..2575121dbfc 100644 --- a/app/src/main/java/org/wikipedia/feed/topread/TopReadListCard.kt +++ b/app/src/main/java/org/wikipedia/feed/topread/TopReadListCard.kt @@ -21,7 +21,7 @@ class TopReadListCard( } override fun subtitle(): String { - return DateUtil.getShortDateString(articles.localDate) + return DateUtil.getDateString(articles.localDate) } override fun type(): CardType { diff --git a/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGameMainMenuFragment.kt b/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGameMainMenuFragment.kt index 20a95d2334c..a843336ec06 100644 --- a/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGameMainMenuFragment.kt +++ b/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGameMainMenuFragment.kt @@ -70,7 +70,7 @@ class OnThisDayGameMainMenuFragment : OnThisDayGameBaseFragment() { } private fun showGameMenu() { - binding.dateText.text = DateUtil.getShortDateString(viewModel.currentDate) + binding.dateText.text = DateUtil.getDateString(viewModel.currentDate) binding.gameMenuContainer.isVisible = true binding.progressBar.isVisible = false binding.errorView.isVisible = false diff --git a/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGamePlayFragment.kt b/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGamePlayFragment.kt index 84a31875add..55e01ea971a 100644 --- a/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGamePlayFragment.kt +++ b/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGamePlayFragment.kt @@ -7,7 +7,6 @@ import android.content.Intent import android.graphics.Color import android.media.MediaPlayer import android.os.Bundle -import android.text.format.DateFormat import android.text.method.ScrollingMovementMethod import android.view.LayoutInflater import android.view.View @@ -29,17 +28,14 @@ import org.wikipedia.analytics.eventplatform.WikiGamesEvent import org.wikipedia.databinding.FragmentOnThisDayGamePlayBinding import org.wikipedia.feed.onthisday.OnThisDay import org.wikipedia.settings.Prefs +import org.wikipedia.util.DateUtil import org.wikipedia.util.DimenUtil import org.wikipedia.util.Resource import org.wikipedia.util.ResourceUtil import org.wikipedia.util.log.L import org.wikipedia.views.ViewUtil import org.wikipedia.views.WikiCardView -import java.time.LocalDate -import java.time.MonthDay -import java.time.format.DateTimeFormatter import java.time.format.FormatStyle -import java.util.Locale class OnThisDayGamePlayFragment : Fragment() { private var _binding: FragmentOnThisDayGamePlayBinding? = null @@ -356,10 +352,7 @@ class OnThisDayGamePlayFragment : Fragment() { binding.questionStatusIcon1.isVisible = false binding.questionStatusIcon2.isVisible = false - MonthDay.of(viewModel.currentMonth, viewModel.currentDay).let { - val text = it.format(DateTimeFormatter.ofPattern(DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMM d"))) - mainActivity?.updateAppBarDateText(text) - } + mainActivity?.updateAppBarDateText(DateUtil.getLongMonthDayString(viewModel.currentDate)) binding.scoreView.updateScores(gameState.answerState, gameState.currentQuestionIndex, gameState.currentQuestionState.goToNext) @@ -369,7 +362,7 @@ class OnThisDayGamePlayFragment : Fragment() { binding.questionCard1.tag = event1 binding.questionCard2.tag = event2 - binding.questionDate1.text = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).format(LocalDate.of(event1.year, viewModel.currentMonth, viewModel.currentDay)) + binding.questionDate1.text = DateUtil.getDateString(viewModel.currentDate.withYear(event1.year), FormatStyle.LONG) binding.questionText1.updateLayoutParams { bottomMargin = 0 } binding.questionText1.text = event1.text binding.questionText1.scrollY = 0 @@ -383,7 +376,7 @@ class OnThisDayGamePlayFragment : Fragment() { ViewUtil.loadImage(binding.questionThumbnail1, thumbnailUrl1, placeholderId = R.mipmap.launcher) } - binding.questionDate2.text = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).format(LocalDate.of(event2.year, viewModel.currentMonth, viewModel.currentDay)) + binding.questionDate2.text = DateUtil.getDateString(viewModel.currentDate.withYear(event2.year), FormatStyle.LONG) binding.questionText2.updateLayoutParams { bottomMargin = 0 } binding.questionText2.text = event2.text binding.questionText2.scrollY = 0 diff --git a/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGameResultFragment.kt b/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGameResultFragment.kt index 51a45877786..31fb56d7cb7 100644 --- a/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGameResultFragment.kt +++ b/app/src/main/java/org/wikipedia/games/onthisday/OnThisDayGameResultFragment.kt @@ -7,7 +7,6 @@ import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper -import android.text.format.DateFormat import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -50,6 +49,7 @@ import org.wikipedia.readinglist.LongPressMenu import org.wikipedia.readinglist.ReadingListBehaviorsUtil import org.wikipedia.readinglist.database.ReadingListPage import org.wikipedia.settings.Prefs +import org.wikipedia.util.DateUtil import org.wikipedia.util.DimenUtil import org.wikipedia.util.FeedbackUtil import org.wikipedia.util.Resource @@ -63,8 +63,6 @@ import java.time.Duration import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime -import java.time.MonthDay -import java.time.format.DateTimeFormatter import java.util.Locale class OnThisDayGameResultFragment : OnThisDayGameBaseFragment(), OnThisDayGameArticleBottomSheet.Callback { @@ -180,10 +178,7 @@ class OnThisDayGameResultFragment : OnThisDayGameBaseFragment(), OnThisDayGameAr private fun onGameEnded(gameState: OnThisDayGameViewModel.GameState, gameStatistics: OnThisDayGameViewModel.GameStatistics) { mainActivity?.showAppBarDateText() - MonthDay.of(viewModel.currentMonth, viewModel.currentDay).let { - val text = it.format(DateTimeFormatter.ofPattern(DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMM d"))) - mainActivity?.updateAppBarDateText(text) - } + mainActivity?.updateAppBarDateText(DateUtil.getLongMonthDayString(viewModel.currentDate)) binding.progressBar.isVisible = false binding.errorView.isVisible = false diff --git a/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt b/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt index 57cb50f46ec..2c481bd7455 100644 --- a/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt +++ b/app/src/main/java/org/wikipedia/page/PageFragmentLoadState.kt @@ -225,7 +225,7 @@ class PageFragmentLoadState(private var model: PageViewModel, return } val localDate = LocalDate.ofInstant(dateHeader, ZoneId.systemDefault()) - val dateStr = DateUtil.getShortDateString(localDate) + val dateStr = DateUtil.getDateString(localDate) Toast.makeText(fragment.requireContext().applicationContext, fragment.getString(R.string.page_offline_notice_last_date, dateStr), Toast.LENGTH_LONG).show() diff --git a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryItemView.kt b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryItemView.kt index fb137b3d3be..5f5e373598e 100644 --- a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryItemView.kt +++ b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryItemView.kt @@ -70,7 +70,7 @@ class EditHistoryItemView(context: Context) : FrameLayout(context) { StringUtil.setHighlightedAndBoldenedText(binding.editHistoryTitle, historyTitle, currentQuery) } StringUtil.setHighlightedAndBoldenedText(binding.userNameText, itemRevision.user, currentQuery) - binding.editHistoryTimeText.text = DateUtil.getTimeString(context, DateUtil.iso8601DateParse(itemRevision.timeStamp)) + binding.editHistoryTimeText.text = DateUtil.getTimeString(itemRevision.localDateTime) } fun setSelectedState(selectedState: Int) { diff --git a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt index 62296fa3cba..17a22791310 100644 --- a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt +++ b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListActivity.kt @@ -53,6 +53,7 @@ import org.wikipedia.views.EditHistoryFilterOverflowView import org.wikipedia.views.EditHistoryStatsView import org.wikipedia.views.SearchAndFilterActionProvider import org.wikipedia.views.WikiErrorView +import java.time.format.FormatStyle class EditHistoryListActivity : BaseActivity() { @@ -165,11 +166,13 @@ class EditHistoryListActivity : BaseActivity() { private fun updateCompareStateItems() { binding.compareFromCard.isVisible = viewModel.selectedRevisionFrom != null if (viewModel.selectedRevisionFrom != null) { - binding.compareFromText.text = DateUtil.getShortDayWithTimeString(viewModel.selectedRevisionFrom!!.timeStamp) + binding.compareFromText.text = + DateUtil.getDateAndTimeString(viewModel.selectedRevisionFrom!!.localDateTime, dateStyle = FormatStyle.SHORT) } binding.compareToCard.isVisible = viewModel.selectedRevisionTo != null if (viewModel.selectedRevisionTo != null) { - binding.compareToText.text = DateUtil.getShortDayWithTimeString(viewModel.selectedRevisionTo!!.timeStamp) + binding.compareToText.text = + DateUtil.getDateAndTimeString(viewModel.selectedRevisionTo!!.localDateTime, dateStyle = FormatStyle.SHORT) } enableCompareButton(binding.compareConfirmButton, viewModel.selectedRevisionFrom != null && viewModel.selectedRevisionTo != null) } diff --git a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListViewModel.kt b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListViewModel.kt index adf39aba34f..f37d2d275cc 100644 --- a/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListViewModel.kt +++ b/app/src/main/java/org/wikipedia/page/edithistory/EditHistoryListViewModel.kt @@ -81,7 +81,7 @@ class EditHistoryListViewModel(savedStateHandle: SavedStateHandle) : ViewModel() val dateBefore = before?.item?.localDateTime?.toLocalDate() val dateAfter = after?.item?.localDateTime?.toLocalDate() if (dateAfter != null && dateAfter != dateBefore) { - EditHistorySeparator(DateUtil.getShortDateString(dateAfter)) + EditHistorySeparator(DateUtil.getDateString(dateAfter)) } else { null } diff --git a/app/src/main/java/org/wikipedia/page/leadimages/PageHeaderView.kt b/app/src/main/java/org/wikipedia/page/leadimages/PageHeaderView.kt index 778ee5678f1..b5dc3b797d5 100644 --- a/app/src/main/java/org/wikipedia/page/leadimages/PageHeaderView.kt +++ b/app/src/main/java/org/wikipedia/page/leadimages/PageHeaderView.kt @@ -150,7 +150,7 @@ class PageHeaderView(context: Context, attrs: AttributeSet? = null) : LinearLayo context.getString(R.string.donation_reminders_subsequent_milestone_reached_prompt_title, articleText) } - val dateText = DateUtil.getMMMMdYYYY(Date(config.setupTimestamp)) + val dateText = DateUtil.getDateString(Date(config.setupTimestamp)) val messageText = context.getString(R.string.donation_reminders_prompt_message, dateText, articleText, donationAmount) val positiveButtonText = context.getString(R.string.donation_reminders_prompt_positive_button) val negativeButtonText = context.getString(R.string.donation_reminders_prompt_negative_button) diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt index 94bd9bd4b82..6c19864e58a 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt @@ -77,7 +77,7 @@ import org.wikipedia.views.MultiSelectActionModeCallback.Companion.isTagType import org.wikipedia.views.PageItemView import org.wikipedia.views.SwipeableItemTouchHelperCallback import org.wikipedia.yearinreview.YearInReviewViewModel -import java.util.Date +import java.time.LocalDateTime import java.util.Locale class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDialog.Callback { @@ -503,7 +503,7 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial ReadingListMode.PREVIEW -> { if (readingList == null) { val emptyTitle = requireContext().getString(R.string.reading_lists_preview_header_title) - val emptyDescription = DateUtil.getTimeAndDateString(requireContext(), Date()) + val emptyDescription = DateUtil.getDateAndTimeString(LocalDateTime.now()) viewModel.updateList(emptyTitle, emptyDescription, encoded = true) } else { update() diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListPreviewSaveDialogView.kt b/app/src/main/java/org/wikipedia/readinglist/ReadingListPreviewSaveDialogView.kt index 340530bc355..7eff988e886 100644 --- a/app/src/main/java/org/wikipedia/readinglist/ReadingListPreviewSaveDialogView.kt +++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListPreviewSaveDialogView.kt @@ -25,7 +25,7 @@ import org.wikipedia.util.log.L import org.wikipedia.views.DefaultViewHolder import org.wikipedia.views.DrawableItemDecoration import org.wikipedia.views.ViewUtil -import java.util.Date +import java.time.LocalDateTime class ReadingListPreviewSaveDialogView(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) { @@ -68,7 +68,8 @@ class ReadingListPreviewSaveDialogView(context: Context, attrs: AttributeSet? = } else { R.string.recommended_reading_list_title } - val defaultListTitle = context.getString(titleRes).plus(" " + DateUtil.getShortDayWithTimeString(Date())) + val defaultListTitle = context.getString(titleRes) + " " + + DateUtil.getDateAndTimeString(LocalDateTime.now()) binding.readingListTitleLayout.editText?.setText(defaultListTitle) validateTitleAndList() binding.recyclerView.adapter = ReadingListItemAdapter() diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsItemFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsItemFragment.kt index 779b941edb6..3ed51c03615 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsItemFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsItemFragment.kt @@ -164,7 +164,7 @@ class SuggestedEditsCardsItemFragment : SuggestedEditsItemFragment() { binding.viewImageArtist.setTitleText(StringUtil.removeHTMLTags(sourceSummaryForEdit?.metadata?.artist())) } - binding.viewImageDate.setDetailText(DateUtil.getTimeAndDateString(requireContext(), sourceSummaryForEdit?.timestamp.orEmpty())) + binding.viewImageDate.setDetailText(DateUtil.getDateAndTimeString(sourceSummaryForEdit?.timestamp.orEmpty())) binding.viewImageSource.setDetailText(sourceSummaryForEdit!!.metadata!!.credit()) binding.viewImageLicense.setDetailText(sourceSummaryForEdit!!.metadata!!.licenseShortName()) diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsItemView.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsItemView.kt index cae4e8d490c..495b200008a 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsItemView.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsItemView.kt @@ -57,7 +57,7 @@ class SuggestedEditsRecentEditsItemView(context: Context, attrs: AttributeSet? = binding.tagsText.setTypeface(Typeface.SANS_SERIF, if (isTagsEmpty) Typeface.ITALIC else Typeface.NORMAL) binding.tagsText.setTextColor(ResourceUtil.getThemedColor(context, if (isTagsEmpty) R.attr.secondary_color else R.attr.primary_color)) - StringUtil.setHighlightedAndBoldenedText(binding.timeText, DateUtil.getTimeString(context, item.parsedDateTime), currentQuery) + StringUtil.setHighlightedAndBoldenedText(binding.timeText, DateUtil.getTimeString(item.parsedDateTime), currentQuery) binding.userNameText.text = item.user StringUtil.setHighlightedAndBoldenedText(binding.userNameText, item.user, currentQuery) binding.userNameText.contentDescription = context.getString(R.string.talk_user_title, item.user) diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsViewModel.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsViewModel.kt index bd44833f8d2..00fa61644fe 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsViewModel.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsViewModel.kt @@ -59,7 +59,7 @@ class SuggestedEditsRecentEditsViewModel : ViewModel() { val dateBefore = before?.item?.parsedDateTime?.toLocalDate() val dateAfter = after?.item?.parsedDateTime?.toLocalDate() if (dateAfter != null && dateAfter != dateBefore) { - RecentEditsSeparator(DateUtil.getShortDateString(dateAfter)) + RecentEditsSeparator(DateUtil.getDateString(dateAfter)) } else { null } diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt index c60e96ca338..8f0cc0d08b1 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt @@ -293,7 +293,7 @@ class SuggestedEditsTasksFragment : Fragment(), MenuProvider { } else if (pauseEndDate != null) { clearContents() val localDateTime = LocalDateTime.ofInstant(pauseEndDate.toInstant(), ZoneId.systemDefault()).toLocalDate() - binding.messageCard.setPaused(getString(R.string.suggested_edits_paused_message, DateUtil.getShortDateString(localDateTime), AccountUtil.userName)) + binding.messageCard.setPaused(getString(R.string.suggested_edits_paused_message, DateUtil.getDateString(localDateTime), AccountUtil.userName)) binding.messageCard.isVisible = true return true } diff --git a/app/src/main/java/org/wikipedia/talk/TalkThreadItemView.kt b/app/src/main/java/org/wikipedia/talk/TalkThreadItemView.kt index e6aced87274..1224cb2c07d 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkThreadItemView.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkThreadItemView.kt @@ -75,7 +75,7 @@ class TalkThreadItemView(context: Context, attrs: AttributeSet? = null) : Constr binding.profileImage.setImageResource(if (AccountUtil.isUserNameTemporary(item.author)) R.drawable.ic_temp_account else R.drawable.ic_user_avatar) binding.timeStampText.isVisible = item.date != null item.date?.let { - val timestamp = DateUtil.getTimeAndDateString(context, it) + val timestamp = DateUtil.getDateAndTimeString(it) StringUtil.setHighlightedAndBoldenedText(binding.timeStampText, timestamp, searchQuery) } val body = CustomHtmlParser.fromHtml(StringUtil.removeStyleTags(item.html), binding.bodyText).trim() diff --git a/app/src/main/java/org/wikipedia/talk/TalkTopicHolder.kt b/app/src/main/java/org/wikipedia/talk/TalkTopicHolder.kt index 9167d5bd9f3..e583a1f82c4 100644 --- a/app/src/main/java/org/wikipedia/talk/TalkTopicHolder.kt +++ b/app/src/main/java/org/wikipedia/talk/TalkTopicHolder.kt @@ -103,7 +103,8 @@ class TalkTopicHolder internal constructor( ImageViewCompat.setImageTintList(binding.topicReplyIcon, ResourceUtil.getThemedColorStateList(context, replyNumberColor)) // Last comment date - val lastCommentDate = allReplies.mapNotNull { it.date }.maxOrNull()?.run { DateUtil.getDateAndTime(context, this) } + val lastCommentDate = allReplies.mapNotNull { it.date }.maxOrNull()?.run { DateUtil.getDateAndTimeString( + this) } val lastCommentColor = if (threadItem.seen) R.attr.inactive_color else R.attr.placeholder_color binding.topicLastCommentDate.text = lastCommentDate binding.topicLastCommentDate.isVisible = lastCommentDate != null diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserContribItemView.kt b/app/src/main/java/org/wikipedia/usercontrib/UserContribItemView.kt index 0b116b46435..a3f4bbb3d77 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserContribItemView.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserContribItemView.kt @@ -50,6 +50,6 @@ class UserContribItemView(context: Context) : FrameLayout(context) { StringUtil.setHighlightedAndBoldenedText(binding.editSummary, editSummary, currentQuery) } binding.currentIndicator.isVisible = contrib.top - binding.editHistoryTimeText.text = DateUtil.getTimeString(context, contrib.parsedDateTime) + binding.editHistoryTimeText.text = DateUtil.getTimeString(contrib.parsedDateTime) } } diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt b/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt index 133de7f57b8..4321678b7d6 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserContribListViewModel.kt @@ -55,7 +55,7 @@ class UserContribListViewModel(savedStateHandle: SavedStateHandle) : ViewModel() val dateBefore = before?.item?.parsedDateTime?.toLocalDate() val dateAfter = after?.item?.parsedDateTime?.toLocalDate() if (dateAfter != null && dateAfter != dateBefore) { - UserContribSeparator(DateUtil.getShortDateString(dateAfter)) + UserContribSeparator(DateUtil.getDateString(dateAfter)) } else { null } diff --git a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt index 9950e005757..945784a4d26 100644 --- a/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt +++ b/app/src/main/java/org/wikipedia/usercontrib/UserInformationDialog.kt @@ -81,7 +81,7 @@ class UserInformationDialog : DialogFragment() { 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.getDateString(localDate) 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/util/DateUtil.kt b/app/src/main/java/org/wikipedia/util/DateUtil.kt index 85cce609198..a4aa11fd0e8 100644 --- a/app/src/main/java/org/wikipedia/util/DateUtil.kt +++ b/app/src/main/java/org/wikipedia/util/DateUtil.kt @@ -5,35 +5,26 @@ import android.icu.text.RelativeDateTimeFormatter import android.os.Build import android.text.format.DateFormat import org.wikipedia.R -import org.wikipedia.WikipediaApp import org.wikipedia.extensions.getResources import org.wikipedia.extensions.getString -import org.wikipedia.extensions.toLocalDate 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.Year import java.time.ZoneId -import java.time.ZoneOffset -import java.time.ZonedDateTime import java.time.format.DateTimeFormatter import java.time.format.FormatStyle import java.time.format.TextStyle -import java.time.temporal.ChronoUnit -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.concurrent.ConcurrentHashMap object DateUtil { - private val DATE_FORMATS = ConcurrentHashMap() - private val DATE_TIME_FORMATTERS = ConcurrentHashMap() + private val DB_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss") + private val YMD_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd") - // TODO: Switch to DateTimeFormatter when minSdk = 26. fun iso8601DateParse(date: String): Date { return Date.from(Instant.parse(date)) } @@ -43,130 +34,69 @@ object DateUtil { } fun dbDateFormat(date: Date): String { - return getCachedDateFormat("yyyyMMddHHmmss", Locale.ROOT, true).format(date) + return DB_FORMATTER.format(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())) } fun dbDateParse(date: String): Date { - return getCachedDateFormat("yyyyMMddHHmmss", Locale.ROOT, true).parse(date)!! + val dateTime = LocalDateTime.parse(date, DB_FORMATTER) + return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()) } fun getFeedCardDateString(age: Int): String { - return getShortDateString(UtcDate(age).baseCalendar.time) + return getDateString(LocalDate.now().minusDays(age.toLong())) } - fun getFeedCardShortDateString(date: Calendar): String { - return getExtraShortDateString(date.time) + fun getMediumMonthDayString(calendar: Calendar): String { + val date = LocalDate.ofInstant(calendar.toInstant(), ZoneId.systemDefault()) + return getFormatterForSkeleton("MMM d").format(date) } - fun getMDYDateString(date: Date): String { - return getDateStringWithSkeletonPattern(date, "MM/dd/yyyy") + fun getLongMonthDayString(localDate: LocalDate): String { + return getFormatterForSkeleton("MMMM d").format(localDate) } - fun getMonthOnlyDateString(date: Date): String { - return getDateStringWithSkeletonPattern(date, "MMMM d") + fun getMonthOnlyDateString(localDate: LocalDate): String { + return localDate.month.getDisplayName(TextStyle.FULL_STANDALONE, Locale.getDefault()) } - fun getMonthOnlyDateStringFromTimeString(dateStr: String): String { - return getMonthOnlyDateString(SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).parse(dateStr)!!) - } - - fun getMonthOnlyDateString(date: LocalDate): String { - return getDateStringWithSkeletonPattern(date, "MMMM d") + fun getMonthOnlyDateString(calendar: Calendar): String { + return getMonthOnlyDateString(LocalDate.ofInstant(calendar.toInstant(), ZoneId.systemDefault())) } - fun getMonthOnlyWithoutDayDateString(date: Date): String { - return getDateStringWithSkeletonPattern(date, "MMMM") + fun getMonthOnlyDateStringFromTimeString(dateStr: String): String { + return getMonthOnlyDateString(LocalDate.parse(dateStr)) } fun getYearOnlyDateString(date: Date): String { - return getDateStringWithSkeletonPattern(date, "yyyy") + return LocalDate.ofInstant(date.toInstant(), ZoneId.systemDefault()).year.toString() } fun getYMDDateString(date: LocalDate): String { - return getCachedDateTimeFormatter("yyyyMMdd", Locale.getDefault(), utc = false, skeleton = false) - .format(date) - } - - fun getMMMMdYYYY(date: Date, utc: Boolean = true): String { - return getCachedDateFormat("MMMM d, yyyy", Locale.getDefault(), utc).format(date) - } - - private fun getExtraShortDateString(date: Date): String { - return getDateStringWithSkeletonPattern(date, "MMM d") - } - - fun getTimeString(context: Context, date: Date): String { - val datePattern = if (DateFormat.is24HourFormat(context)) "HH:mm" else "hh:mm a" - return getDateStringWithSkeletonPattern(date, datePattern) - } - - fun getTimeString(context: Context, localDateTime: LocalDateTime): String { - val datePattern = if (DateFormat.is24HourFormat(context)) "HH:mm" else "hh:mm a" - return getDateStringWithSkeletonPattern(localDateTime, datePattern) - } - - fun getShortDayWithTimeString(dateStr: String): String { - return getDateStringWithSkeletonPattern(iso8601DateParse(dateStr), "MMM d HH:mm") - } - - fun getShortDayWithTimeString(date: Date): String { - return getDateStringWithSkeletonPattern(date, "MM/dd/yyyy HH:mm") - } - - fun getTimeAndDateString(context: Context, date: Date): String { - val datePattern = if (DateFormat.is24HourFormat(context)) "HH:mm, MMM d, yyyy" else "hh:mm a, MMM d, yyyy" - return getDateStringWithSkeletonPattern(date, datePattern) - } - - fun getTimeAndDateString(context: Context, dateStr: String): String { - val datePattern = if (DateFormat.is24HourFormat(context)) "HH:mm, MMM d, yyyy" else "hh:mm a, MMM d, yyyy" - return getDateStringWithSkeletonPattern(iso8601DateParse(dateStr), datePattern) - } - - fun getDateAndTime(context: Context, date: Date): String { - val datePattern = if (DateFormat.is24HourFormat(context)) "MMM d, yyyy, HH:mm" else "MMM d, yyyy, hh:mm a" - return getCachedDateFormat(datePattern, Locale.getDefault(), false).format(date) + return YMD_FORMATTER.format(date) } - private fun getDateStringWithSkeletonPattern(date: Date, pattern: String): String { - return getCachedDateFormat(pattern, Locale.getDefault(), utc = false, skeleton = true) - .format(date) + fun getTimeString(dateTime: LocalDateTime): String { + return DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).format(dateTime) } - private fun getDateStringWithSkeletonPattern(temporalAccessor: TemporalAccessor, pattern: String): String { - return getCachedDateTimeFormatter(pattern, Locale.getDefault(), utc = false, skeleton = true) - .format(temporalAccessor) + fun getDateAndTimeString(dateStr: String): String { + return getDateAndTimeString(iso8601LocalDateTimeParse(dateStr)) } - private fun getCachedDateFormat(pattern: String, locale: Locale, utc: Boolean, skeleton: Boolean = false): SimpleDateFormat { - return DATE_FORMATS.getOrPut(pattern) { - val df = SimpleDateFormat(if (skeleton) DateFormat.getBestDateTimePattern(locale, pattern) else pattern, locale) - if (utc) { - df.timeZone = TimeZone.getTimeZone("UTC") - } - df - } + fun getDateAndTimeString(dateTime: LocalDateTime, dateStyle: FormatStyle = FormatStyle.MEDIUM): String { + return DateTimeFormatter.ofLocalizedDateTime(dateStyle, FormatStyle.SHORT).format(dateTime) } - private fun getCachedDateTimeFormatter(pattern: String, locale: Locale, utc: Boolean, skeleton: Boolean = false): DateTimeFormatter { - return DATE_TIME_FORMATTERS.getOrPut(pattern) { - val dtf = DateTimeFormatter.ofPattern(if (skeleton) DateFormat.getBestDateTimePattern(locale, pattern) else pattern, locale) - return if (utc) dtf.withZone(ZoneOffset.UTC) else dtf - } + fun getDateAndTimeString(date: Date): String { + return getDateAndTimeString(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())) } - fun getShortDateString(date: Date): String { - // todo: consider allowing TWN date formats. It would be useful to have but might be - // difficult for translators to write correct format specifiers without being able to - // test them. We should investigate localization support in date libraries such as - // Joda-Time and how TWN solves this classic problem. - val dateFormat = DateFormat.getMediumDateFormat(WikipediaApp.instance) - dateFormat.timeZone = TimeZone.getTimeZone("UTC") - return dateFormat.format(date) + fun getDateString(localDate: LocalDate, style: FormatStyle = FormatStyle.MEDIUM): String { + return DateTimeFormatter.ofLocalizedDate(style).format(localDate) } - fun getShortDateString(localDate: LocalDate): String { - return DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(localDate) + fun getDateString(date: Date, style: FormatStyle = FormatStyle.MEDIUM): String { + return getDateString(LocalDate.ofInstant(date.toInstant(), ZoneId.systemDefault()), style) } fun getUtcRequestDateFor(age: Int): UtcDate { @@ -180,8 +110,7 @@ object DateUtil { } fun yearToStringWithEra(year: Int): String { - val cal: Calendar = GregorianCalendar(if (year < 0) year + 1 else year, 1, 1) - return getDateStringWithSkeletonPattern(cal.time, if (year < 0) "y GG" else "y") + return getFormatterForSkeleton(if (year < 0) "y GG" else "y").format(Year.of(year)) } fun getYearDifferenceString(context: Context, year: Int, languageCode: String): String { @@ -201,39 +130,7 @@ object DateUtil { } } - fun startOfYearInMillis(year: Int, zoneId: ZoneId = ZoneId.systemDefault()): Long { - val localDate = LocalDate.of(year, 1, 1) - return localDate.atStartOfDay(zoneId).toInstant().toEpochMilli() - } - - fun endOfYearInMillis(year: Int, zoneId: ZoneId = ZoneId.systemDefault()): Long { - val localDate = LocalDate.of(year, 12, 31) - return localDate.atTime(0, 0, 0).atZone(zoneId).toInstant().toEpochMilli() - } - - fun epochMilliToYear(epochMilli: Long, zoneId: ZoneId = ZoneId.systemDefault()): Int { - val zonedDateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), zoneId) - return zonedDateTime.year - } - - fun toRelativeDateString(date: Date): String { - val localDate = date.toLocalDate() - val now = LocalDate.now() - val daysDiff = ChronoUnit.DAYS.between(localDate, now) - - return when { - daysDiff < 7 -> { - val dayOfWeek = localDate.dayOfWeek.getDisplayName(TextStyle.FULL, Locale.getDefault()) - dayOfWeek - } - - localDate.year == now.year -> { - DateUtil.getMonthOnlyDateString(localDate) - } - - else -> { - DateUtil.getShortDateString(localDate) - } - } + private fun getFormatterForSkeleton(skeleton: String): DateTimeFormatter { + return DateTimeFormatter.ofPattern(DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton)) } } diff --git a/app/src/main/java/org/wikipedia/views/CustomDatePicker.kt b/app/src/main/java/org/wikipedia/views/CustomDatePicker.kt index a4eaf87ff3f..862607c30d1 100644 --- a/app/src/main/java/org/wikipedia/views/CustomDatePicker.kt +++ b/app/src/main/java/org/wikipedia/views/CustomDatePicker.kt @@ -69,7 +69,7 @@ class CustomDatePicker : DialogFragment() { } private fun setMonthString() { - binding.currentMonth.text = DateUtil.getMonthOnlyWithoutDayDateString(selectedDay.time) + binding.currentMonth.text = DateUtil.getMonthOnlyDateString(selectedDay) binding.calendarGrid.adapter?.notifyDataSetChanged() } @@ -119,7 +119,7 @@ class CustomDatePicker : DialogFragment() { } private fun setDayString() { - binding.calendarDay.text = DateUtil.getFeedCardShortDateString(selectedDay) + binding.calendarDay.text = DateUtil.getMediumMonthDayString(selectedDay) } fun setSelectedDay(month: Int, day: Int) { diff --git a/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt b/app/src/main/java/org/wikipedia/views/EditHistoryStatsView.kt index 76606adc944..eea2598e1c8 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) { @@ -34,14 +34,14 @@ class EditHistoryStatsView constructor(context: Context, attrs: AttributeSet? = 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()) + val createdYear = stats.revision.localDateTime.year.toString() + val today = LocalDate.now() + val todayStr = DateUtil.getDateString(today) + val lastYear = DateUtil.getDateString(today.minusYears(1)) 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) + binding.statsGraphView.contentDescription = context.getString(R.string.page_edit_history_metrics_content_description, lastYear, todayStr) FeedbackUtil.setButtonTooltip(binding.statsGraphView) } } diff --git a/app/src/main/java/org/wikipedia/views/ReadingListsOverflowView.kt b/app/src/main/java/org/wikipedia/views/ReadingListsOverflowView.kt index fa6fd180b3e..09f8c0d6998 100644 --- a/app/src/main/java/org/wikipedia/views/ReadingListsOverflowView.kt +++ b/app/src/main/java/org/wikipedia/views/ReadingListsOverflowView.kt @@ -76,7 +76,7 @@ class ReadingListsOverflowView(context: Context) : FrameLayout(context) { if (!it.isNullOrEmpty()) { try { binding.readingListsOverflowLastSync.text = context.getString(R.string.reading_list_menu_last_sync, - DateUtil.getTimeAndDateString(context, it)) + DateUtil.getDateAndTimeString(it)) } catch (e: ParseException) { // ignore } diff --git a/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt b/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt index e06b141a718..5022f53d7a9 100644 --- a/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt +++ b/app/src/main/java/org/wikipedia/watchlist/WatchlistFragment.kt @@ -49,8 +49,6 @@ import org.wikipedia.util.ResourceUtil import org.wikipedia.util.StringUtil import org.wikipedia.views.NotificationButtonView import org.wikipedia.views.SearchAndFilterActionProvider -import java.time.LocalDateTime -import java.time.ZoneId import java.util.Date class WatchlistFragment : Fragment(), WatchlistItemView.Callback, MenuProvider { @@ -209,11 +207,9 @@ class WatchlistFragment : Fragment(), WatchlistItemView.Callback, MenuProvider { } } - internal inner class WatchlistDateViewHolder(view: View) : RecyclerView.ViewHolder(view) { + internal class WatchlistDateViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bindItem(date: Date) { - val textView = itemView.findViewById(R.id.dateText) - val localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate() - textView.text = DateUtil.getShortDateString(localDateTime) + itemView.findViewById(R.id.dateText).text = DateUtil.getDateString(date) } } diff --git a/app/src/main/java/org/wikipedia/watchlist/WatchlistItemView.kt b/app/src/main/java/org/wikipedia/watchlist/WatchlistItemView.kt index bdafd2ce7a6..694b6265d75 100644 --- a/app/src/main/java/org/wikipedia/watchlist/WatchlistItemView.kt +++ b/app/src/main/java/org/wikipedia/watchlist/WatchlistItemView.kt @@ -17,6 +17,8 @@ import org.wikipedia.extensions.setLayoutDirectionByLang import org.wikipedia.util.DateUtil import org.wikipedia.util.ResourceUtil import org.wikipedia.util.StringUtil +import java.time.LocalDateTime +import java.time.ZoneId class WatchlistItemView(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) { val binding = ItemWatchlistBinding.inflate(LayoutInflater.from(context), this, true) @@ -55,7 +57,7 @@ class WatchlistItemView(context: Context, attrs: AttributeSet? = null) : FrameLa binding.summaryText.setTypeface(Typeface.SANS_SERIF, if (isSummaryEmpty) Typeface.ITALIC else Typeface.NORMAL) binding.summaryText.setTextColor(ResourceUtil.getThemedColor(context, if (isSummaryEmpty) R.attr.secondary_color else R.attr.primary_color)) - binding.timeText.text = DateUtil.getTimeString(context, item.date) + binding.timeText.text = DateUtil.getTimeString(LocalDateTime.ofInstant(item.date.toInstant(), ZoneId.systemDefault())) binding.userNameText.contentDescription = context.getString(R.string.talk_user_title, item.user) binding.userNameText.setIconResource(if (item.isAnon) R.drawable.ic_anonymous_ooui else R.drawable.ic_user_avatar)