* Implemented accessibility support for android date picker. * Created new function to return accessible text. Changed access modifier of few functions to public. * removed duplicate contentDescription for accessibility to work correct. * Added finnish and swedish localizations for accessible items in datepicker. * Added localisation english texts. * Implemented localisations for accessible selections made inside android datepicker. * Added getLocaleStringResource function for getting localised string resource. * Added required imports for getLocaleStringResource function. * Content description set based on localised strings from resources initially. * Implemented meaningful content description for dateTime picker. Added new keys for time prefix. Content description set when screen reader is focused on picker wheels. * Updated correct finnish and swedish translations. * refactor: move accessibility to its own class Co-authored-by: Jencir CJ <jencir.jamal@digia.com> Co-authored-by: Henning Hall <henning.hall@hotmail.com>master
@ -0,0 +1,80 @@ | |||
package com.henninghall.date_picker.ui; | |||
import android.view.View; | |||
import android.view.accessibility.AccessibilityEvent; | |||
import com.henninghall.date_picker.State; | |||
import com.henninghall.date_picker.Utils; | |||
import com.henninghall.date_picker.wheelFunctions.WheelFunction; | |||
import com.henninghall.date_picker.wheels.Wheel; | |||
import java.util.Locale; | |||
public class Accessibility { | |||
public static class SetAccessibilityDelegate implements WheelFunction { | |||
private final Locale locale; | |||
public SetAccessibilityDelegate(Locale locale) { | |||
this.locale = locale; | |||
} | |||
@Override | |||
public void apply(Wheel wheel) { | |||
final View view = wheel.picker.getView(); | |||
view.setAccessibilityDelegate( | |||
new View.AccessibilityDelegate(){ | |||
@Override | |||
public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) { | |||
super.onPopulateAccessibilityEvent(host, event); | |||
if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) { | |||
String resourceKey = view.getTag().toString()+"_description"; | |||
String localeTag = Utils.getLocalisedStringFromResources(locale, resourceKey); | |||
// Screen reader reads the content description when focused on each picker wheel | |||
view.setContentDescription(localeTag); | |||
} | |||
} | |||
} | |||
); | |||
} | |||
} | |||
private final State state; | |||
private final Wheels wheels; | |||
public Accessibility(State state, Wheels wheels){ | |||
this.state = state; | |||
this.wheels = wheels; | |||
} | |||
public void update(Wheel picker){ | |||
String tagName = picker.picker.getView().getTag().toString(); | |||
String selectedDateString = getAccessibleTextForSelectedDate(); | |||
String descriptionPrefix = Utils.getLocalisedStringFromResources(state.getLocale(), "selected_"+tagName+"_description"); | |||
String descriptionPostFix = Utils.getLocalisedStringFromResources(state.getLocale(), "selected_value_description"); | |||
picker.picker.getView().setContentDescription(descriptionPrefix + ", "+ descriptionPostFix + " "+ selectedDateString); | |||
} | |||
private String getAccessibleTextForSelectedDate() { | |||
String accessibleText; | |||
switch(state.getMode()) { | |||
case date: | |||
accessibleText = wheels.getDateString(); | |||
break; | |||
case time: | |||
accessibleText = wheels.getTimeString(); | |||
break; | |||
default: | |||
// default is dateTime | |||
String timePrefix = Utils.getLocalisedStringFromResources(state.getLocale(), "time_tag"); | |||
String hourPrefix = Utils.getLocalisedStringFromResources(state.getLocale(), "hour_tag"); | |||
String minutesPrefix = Utils.getLocalisedStringFromResources(state.getLocale(), "minutes_tag"); | |||
accessibleText = wheels.getAccessibleDateTimeString(timePrefix, hourPrefix, minutesPrefix); | |||
break; | |||
} | |||
return accessibleText; | |||
} | |||
} |
@ -0,0 +1,22 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<resources> | |||
<string name="overlay">Päivämääränvalitsimen päällekkäin</string> | |||
<string name="year_description">Valitse Vuosi</string> | |||
<string name="month_description">Valitse Kuukausi</string> | |||
<string name="date_description">Valitse Päivämäärä</string> | |||
<string name="day_description">Valitse Päivä</string> | |||
<string name="hour_description">Valitse Tunti</string> | |||
<string name="minutes_description">Valitse Minuutit</string> | |||
<string name="ampm_description">Valitse am/pm</string> | |||
<string name="selected_year_description">Valittu Vuosi</string> | |||
<string name="selected_month_description">Valittu Kuukausi</string> | |||
<string name="selected_date_description">Valittu Päivämäärä</string> | |||
<string name="selected_day_description">Valittu Päivä</string> | |||
<string name="selected_hour_description">Valittu Tunti</string> | |||
<string name="selected_minutes_description">Valitut Minuutit</string> | |||
<string name="selected_ampm_description">Valittu am/pm</string> | |||
<string name="selected_value_description">Arvo on</string> | |||
<string name="time_tag">Kello on</string> | |||
<string name="hour_tag">Tunti:</string> | |||
<string name="minutes_tag">Minuutit</string> | |||
</resources> |
@ -0,0 +1,22 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<resources> | |||
<string name="overlay">Datumväljare på</string> | |||
<string name="year_description">Välj ett år</string> | |||
<string name="month_description">Välj en månad</string> | |||
<string name="date_description">Välj ett datum</string> | |||
<string name="day_description">Välj en dag</string> | |||
<string name="hour_description">Välj en timme</string> | |||
<string name="minutes_description">Välj minuter</string> | |||
<string name="ampm_description">Välj am/pm</string> | |||
<string name="selected_year_description">Valt år</string> | |||
<string name="selected_month_description">Valt månad</string> | |||
<string name="selected_date_description">Valt datum</string> | |||
<string name="selected_day_description">Vald dag</string> | |||
<string name="selected_hour_description">Vald timme</string> | |||
<string name="selected_minutes_description">Valda minuter</string> | |||
<string name="selected_ampm_description">Vald am/pm</string> | |||
<string name="selected_value_description">Värdet är</string> | |||
<string name="time_tag">Tiden är</string> | |||
<string name="hour_tag">Timme:</string> | |||
<string name="minutes_tag">Minuter</string> | |||
</resources> |
@ -1,4 +1,22 @@ | |||
<resources> | |||
<string name="app_name">react-native-date-picker</string> | |||
<string name="overlay">overlay</string> | |||
<string name="overlay">Date Picker Overlay</string> | |||
<string name="year_description">Select Year</string> | |||
<string name="month_description">Select Month</string> | |||
<string name="date_description">Select Date</string> | |||
<string name="day_description">Select Day</string> | |||
<string name="hour_description">Select Hour</string> | |||
<string name="minutes_description">Select Minutes</string> | |||
<string name="ampm_description">Select AM/PM</string> | |||
<string name="selected_year_description">Selected Year</string> | |||
<string name="selected_month_description">Selected Month</string> | |||
<string name="selected_date_description">Selected Date</string> | |||
<string name="selected_day_description">Selected Day</string> | |||
<string name="selected_hour_description">Selected Hour</string> | |||
<string name="selected_minutes_description">Selected Minutes</string> | |||
<string name="selected_ampm_description">Selected AM/PM</string> | |||
<string name="selected_value_description">Value is</string> | |||
<string name="time_tag">Time is</string> | |||
<string name="hour_tag">Hour :</string> | |||
<string name="minutes_tag">Minutes </string> | |||
</resources> |