diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayFragment.kt index 42349daa6e6170199ce52d9032151af796c309b4..ae4dd4fc0ddd33175b5b532bb5980d9c07475c88 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayFragment.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.contactdiary.ui.day import android.os.Bundle import android.view.View +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.navigation.fragment.navArgs import com.google.android.material.tabs.TabLayoutMediator @@ -63,7 +64,7 @@ class ContactDiaryDayFragment : Fragment(R.layout.contact_diary_day_fragment), A viewModel.uiState.observe2(this) { binding.contactDiaryDayHeader.title = it.dayText(requireContext()) - binding.contentContainer.contentDescription = it.dayText(requireContext()) + binding.contactDiaryDayHeader.contentDescription = it.dayTextContentDescription(requireContext()) } viewModel.routeToScreen.observe2(this) { @@ -84,4 +85,9 @@ class ContactDiaryDayFragment : Fragment(R.layout.contact_diary_day_fragment), A } } } + + override fun onResume() { + super.onResume() + binding.contentContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt index d7312158100c45b10934a2b669b0d6c473bd1811..82b5775e5401e38f438399d8944f5e08b2417021 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt @@ -7,6 +7,7 @@ import com.squareup.inject.assisted.AssistedInject import de.rki.coronawarnapp.contactdiary.ui.day.tabs.ContactDiaryDayTab import de.rki.coronawarnapp.contactdiary.util.getLocale import de.rki.coronawarnapp.contactdiary.util.toFormattedDay +import de.rki.coronawarnapp.contactdiary.util.toFormattedDayForAccessibility import de.rki.coronawarnapp.ui.SingleLiveEvent import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.viewmodel.CWAViewModel @@ -24,7 +25,9 @@ class ContactDiaryDayViewModel @AssistedInject constructor( val routeToScreen: SingleLiveEvent<ContactDiaryDayNavigationEvents> = SingleLiveEvent() val uiState = displayedDay.map { day -> - UIState(dayText = { day.toFormattedDay(it.getLocale()) }) + UIState( + dayText = { day.toFormattedDay(it.getLocale()) }, + dayTextContentDescription = { day.toFormattedDayForAccessibility(it.getLocale()) }) }.asLiveData() fun onCreateButtonClicked(activeTab: ContactDiaryDayTab) { @@ -41,7 +44,8 @@ class ContactDiaryDayViewModel @AssistedInject constructor( } data class UIState( - val dayText: (Context) -> String + val dayText: (Context) -> String, + val dayTextContentDescription: (Context) -> String ) @AssistedInject.Factory diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewFragment.kt index 8df5988087bd2fd580a25c7b4acf04d723fd01bf..dc4624cdab362a923686a3304da8b921af3b629c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewFragment.kt @@ -9,6 +9,7 @@ import de.rki.coronawarnapp.R import de.rki.coronawarnapp.contactdiary.ui.overview.adapter.ContactDiaryOverviewAdapter import de.rki.coronawarnapp.contactdiary.util.getLocale import de.rki.coronawarnapp.contactdiary.util.toFormattedDay +import de.rki.coronawarnapp.contactdiary.util.toFormattedDayForAccessibility import de.rki.coronawarnapp.databinding.ContactDiaryOverviewFragmentBinding import de.rki.coronawarnapp.util.di.AutoInject import de.rki.coronawarnapp.util.ui.doNavigate @@ -30,6 +31,7 @@ class ContactDiaryOverviewFragment : Fragment(R.layout.contact_diary_overview_fr super.onViewCreated(view, savedInstanceState) val adapter = ContactDiaryOverviewAdapter( { it.toFormattedDay(requireContext().getLocale()) }, + { it.toFormattedDayForAccessibility(requireContext().getLocale()) }, { vm.onItemPress(it) } ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt index 4875c0734c43571d1d915cd1f1ddb74123cb145b..05a3a950db4b7cb8613ab4b168bc76e26f031450 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt @@ -9,6 +9,7 @@ import org.joda.time.LocalDate class ContactDiaryOverviewAdapter( private val dateFormatter: (LocalDate) -> String, + private val dateFormatterForAccessibility: (LocalDate) -> String, private val onItemSelectionListener: (ListItem) -> Unit ) : RecyclerView.Adapter<ContactDiaryOverviewAdapter.OverviewElementHolder>() { @@ -34,7 +35,7 @@ class ContactDiaryOverviewAdapter( override fun getItemCount() = elements.size override fun onBindViewHolder(holder: OverviewElementHolder, position: Int) { - holder.bind(elements[position], dateFormatter, onItemSelectionListener) + holder.bind(elements[position], dateFormatter, dateFormatterForAccessibility, onItemSelectionListener) } class OverviewElementHolder(private val viewDataBinding: ContactDiaryOverviewListItemBinding) : @@ -48,10 +49,14 @@ class ContactDiaryOverviewAdapter( fun bind( item: ListItem, dateFormatter: (LocalDate) -> String, + dateFormatterForAccessibility: (LocalDate) -> String, onElementSelectionListener: (ListItem) -> Unit ) { viewDataBinding.contactDiaryOverviewElementName.text = dateFormatter(item.date) + viewDataBinding.contactDiaryOverviewElementName.contentDescription = + dateFormatterForAccessibility(item.date) + viewDataBinding.contactDiaryOverviewElementBody.setOnClickListener { onElementSelectionListener(item) } viewDataBinding.contactDiaryOverviewNestedElementGroup.isGone = item.data.isEmpty() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt index 92614ba40b25549db3818376859f031ea424e423..8149e4cf9d4c76715224d91a76d446f21279682f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt @@ -38,6 +38,14 @@ fun LocalDate.toFormattedDay(locale: Locale): String { DateTimeFormat.shortDate().withLocale(locale).print(this) } +fun LocalDate.toFormattedDayForAccessibility(locale: Locale): String { + // Use two different methods to get the final date format (Weekday, Longdate) + // because the custom pattern of toString() does not localize characters like "/" or "." + // For accessibility DateTimeFormat.longDate() is required since shortDate() may read the date in the wrong format + return "${toString("EEEE", locale)}, " + + DateTimeFormat.longDate().withLocale(locale).print(this) +} + fun String.formatContactDiaryNameField(maxLength: Int): String { val newName = if (isNotBlank()) { trim() diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_day_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_day_fragment.xml index ef861b939119c20f3506db228ecd86cf1a7fc3d6..85a9473ead1eda35770553fdb6663319c2a78564 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_day_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_day_fragment.xml @@ -6,8 +6,8 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/content_container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:focusable="true"> + android:focusable="true" + android:layout_height="match_parent"> <androidx.appcompat.widget.Toolbar android:id="@+id/contact_diary_day_header"