From d598a6cf0c72f51ffb4a1819ce4c67c0545bd4a9 Mon Sep 17 00:00:00 2001 From: axelherbstreith <75120552+axelherbstreith@users.noreply.github.com> Date: Thu, 7 Jan 2021 20:37:39 +0100 Subject: [PATCH] Contact Journal Day date is not announced (EXPOSUREAPP-4457) (#2006) * Added TalkBack Support for toolbar in day screen * Updated day strings to support all languages * Update date format to support different languages in overview screen * Linting * Updated day screen - Title is now read automatically when opening the screen * Removed unsused type announcement for accessibility * reverted changes in localization * linting * Updated local specific date announcements * Linting * Updated creation of accessibility date * Updated formatting --- .../contactdiary/ui/day/ContactDiaryDayFragment.kt | 8 +++++++- .../contactdiary/ui/day/ContactDiaryDayViewModel.kt | 8 ++++++-- .../ui/overview/ContactDiaryOverviewFragment.kt | 2 ++ .../ui/overview/adapter/ContactDiaryOverviewAdapter.kt | 7 ++++++- .../contactdiary/util/ContactDiaryExtensions.kt | 8 ++++++++ .../src/main/res/layout/contact_diary_day_fragment.xml | 4 ++-- 6 files changed, 31 insertions(+), 6 deletions(-) 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 42349daa6..ae4dd4fc0 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 d73121581..82b5775e5 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 8df598808..dc4624cda 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 4875c0734..05a3a950d 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 92614ba40..8149e4cf9 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 ef861b939..85a9473ea 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" -- GitLab