Minimal screen reader support for polls

This commit is contained in:
charlag 2019-05-26 15:56:26 +02:00
parent 9690cd5730
commit 3f613dc56f
21 changed files with 61 additions and 83 deletions

View File

@ -129,7 +129,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
contentWarningButton = itemView.findViewById(R.id.status_content_warning_button);
avatarInset = itemView.findViewById(R.id.status_avatar_inset);
pollResults = new TextView[] {
pollResults = new TextView[]{
itemView.findViewById(R.id.status_poll_option_result_0),
itemView.findViewById(R.id.status_poll_option_result_1),
itemView.findViewById(R.id.status_poll_option_result_2),
@ -704,7 +704,8 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
getMediaDescription(context, status),
getVisibilityDescription(context, status.getVisibility()),
getFavsText(context, status.getFavouritesCount()),
getReblogsText(context, status.getReblogsCount())
getReblogsText(context, status.getReblogsCount()),
getPollDescription(context, status)
);
itemView.setContentDescription(description);
}
@ -753,7 +754,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
}
private CharSequence getVisibilityDescription(Context context, Status.Visibility visibility) {
if(visibility == null) {
if (visibility == null) {
return "";
}
int resource;
@ -776,6 +777,30 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
return context.getString(resource);
}
private CharSequence getPollDescription(Context context,
@NonNull StatusViewData.Concrete status) {
Poll poll = status.getPoll();
if (poll == null) {
return "";
} else {
CharSequence[] args = new CharSequence[5];
List<PollOption> options = poll.getOptions();
for (int i = 0; i < args.length; i++) {
if (i < options.size()) {
int percent = options.get(i).getPercent(poll.getVotesCount());
args[i] = HtmlUtils.fromHtml(context.getString(
R.string.poll_option_format,
percent,
options.get(i).getTitle()));
} else {
args[i] = "";
}
}
args[4] = getPollInfoText(System.currentTimeMillis(), poll, context);
return context.getString(R.string.description_poll, args);
}
}
protected CharSequence getFavsText(Context context, int count) {
if (count > 0) {
String countString = numberFormat.format(count);
@ -795,14 +820,14 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
}
protected void setupPoll(Poll poll, List<Emoji> emojis, StatusActionListener listener) {
if(poll == null) {
for(TextView pollResult: pollResults) {
if (poll == null) {
for (TextView pollResult : pollResults) {
pollResult.setVisibility(View.GONE);
}
pollDescription.setVisibility(View.GONE);
pollRadioGroup.setVisibility(View.GONE);
for(CheckBox checkBox: pollCheckboxOptions) {
for (CheckBox checkBox : pollCheckboxOptions) {
checkBox.setVisibility(View.GONE);
}
@ -814,40 +839,37 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
Context context = pollDescription.getContext();
if(expired || poll.getVoted()) {
if (expired || poll.getVoted()) {
// no voting possible
setupPollResult(poll, emojis);
setupPollResult(poll, emojis);
} else {
// voting possible
setupPollVoting(poll, emojis, listener);
}
pollDescription.setVisibility(View.VISIBLE);
String votes = numberFormat.format(poll.getVotesCount());
String votesText = context.getResources().getQuantityString(R.plurals.poll_info_votes, poll.getVotesCount(), votes);
CharSequence pollDurationInfo;
if(expired) {
pollDurationInfo = context.getString(R.string.poll_info_closed);
} else {
if(useAbsoluteTime) {
pollDurationInfo = context.getString(R.string.poll_info_time_absolute, getAbsoluteTime(poll.getExpiresAt()));
} else {
String pollDuration = DateUtils.formatPollDuration(pollDescription.getContext(), poll.getExpiresAt().getTime(), timestamp);
pollDurationInfo = context.getString(R.string.poll_info_time_relative, pollDuration);
}
}
String pollInfo = pollDescription.getContext().getString(R.string.poll_info_format, votesText, pollDurationInfo);
pollDescription.setText(pollInfo);
pollDescription.setText(getPollInfoText(timestamp, poll, context));
}
}
private CharSequence getPollInfoText(long timestamp, Poll poll, Context context) {
String votes = numberFormat.format(poll.getVotesCount());
String votesText = context.getResources().getQuantityString(R.plurals.poll_info_votes, poll.getVotesCount(), votes);
CharSequence pollDurationInfo;
if (poll.getExpired()) {
pollDurationInfo = context.getString(R.string.poll_info_closed);
} else {
if (useAbsoluteTime) {
pollDurationInfo = context.getString(R.string.poll_info_time_absolute, getAbsoluteTime(poll.getExpiresAt()));
} else {
String pollDuration = DateUtils.formatPollDuration(pollDescription.getContext(), poll.getExpiresAt().getTime(), timestamp);
pollDurationInfo = context.getString(R.string.poll_info_time_relative, pollDuration);
}
}
return pollDescription.getContext().getString(R.string.poll_info_format, votesText, pollDurationInfo);
}
private void setupPollResult(Poll poll, List<Emoji> emojis) {
List<PollOption> options = poll.getOptions();

View File

@ -482,7 +482,6 @@
<string name="pin_action">Fixar</string>
<string name="description_status_reblogged">Respost</string>
<string name="description_status"> .<!-- Nom públic, advertència\?, contingut\?, data relativa, respost per\?, respost\?, favorits\?, nom usuari, mèdia\?; visibilitat, número de favorits\?, número de respostes\?--> %1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s </string>
<string name="compose_preview_image_description">Accions per a la imatge %s</string>

View File

@ -374,9 +374,6 @@
</string>
<string name="description_visiblity_direct"> Přímý
</string>
<string name="description_status"> <!-- Zobrazované jméno, varování?, obsah?, relativní datum, znovusdíleno kým?, znovusdíleno?, oblíbeno?, uživatelské jméno, média?; viditelnost, počet oblíbení?, počet boostů?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">Název seznamu</string>
<string name="edit_hashtag_title">Upravit hashtag</string>
<string name="edit_hashtag_hint">Hashtag bez #</string>

View File

@ -366,8 +366,6 @@
<string name="description_visiblity_private"> Sekvantoj
</string>
<string name="description_visiblity_direct"> Rekta </string>
<string name="description_status"> <!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">Nomo de la listo</string>
</resources>

View File

@ -424,7 +424,6 @@
<string name="action_open_reblogger">Abrir autor del impulso</string>
<string name="action_open_reblogged_by">Mostrar impulsos</string>
<string name="description_status"> <!-- Display name, cw\?, content\?, relative date, reposted by\?, reposted\?, favorited\?, username, media\?; visibility, fav number\?, reblog number\?--> %1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s </string>
<string name="poll_option_format"> <!-- 15% vote for this! --> &lt;b&gt;%1$d%%&lt;/b&gt; %2$s</string>

View File

@ -372,9 +372,6 @@
</string>
<string name="description_visiblity_direct"> Direct
</string>
<string name="description_status"> <!-- Nom public, avertissement?, contenu?, date relative, reblogué par?, reblogué?, mis en favoris?, username, media?; visibilité, nombre de fav?, nombre de reblogs?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">Nom de la liste</string>
<string name="edit_hashtag_title">Modifier les hashtags</string>
<string name="edit_hashtag_hint">Hastags sans #</string>

View File

@ -366,9 +366,6 @@
</string>
<string name="description_visiblity_direct"> Diretti
</string>
<string name="description_status"> <!-- Nome visualizzato, cw?, contenuto?, data relativa, ripostato da?, ripostato?, apprezzato?, nome utente, media?; visibilità, numero di mi piace?, numero di riblog?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">Nome della lista</string>
<string name="download_media">Scarica media</string>
<string name="downloading_media">Scaricando media</string>

View File

@ -346,9 +346,6 @@
</string>
<string name="description_visiblity_direct"> Direct
</string>
<string name="description_status"> <!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="download_media">Media downloaden</string>
<string name="downloading_media">Media aan het downloaden</string>

View File

@ -218,9 +218,6 @@
<string name="pref_title_http_proxy_server">Serveradresse</string>
<string name="pref_title_http_proxy_port">Serverport</string>
<string name="description_status"> <!-- Display name, cw\?, content\?, relative date, reposted by\?, reposted\?, favorited\?, username, media\?; visibility, fav number\?, reblog number\?--> %1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s </string>
<string name="pref_default_media_sensitivity">Marker alltid media som sensitivt</string>
<string name="pref_publishing">Publisering (synkronisert med server)</string>
<string name="pref_failed_to_sync">Synkronisering av innstillinger feilet</string>

View File

@ -373,7 +373,6 @@
<string name="description_visiblity_unlisted">Pas listat</string>
<string name="description_visiblity_private">Seguidors</string>
<string name="description_visiblity_direct">Dirècte</string>
<string name="description_status"> <!-- Nom dafichatge, cw\?, contengut\?, data relativa, repartejat per\?, repartajat\?, aimat\?, nom dutilizaire, mèdia\?; visibilitat, nombre de fav\?, nombre de partatge\?--> %1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s </string>
<string name="hint_list_name">Nom de la lista</string>

View File

@ -386,7 +386,6 @@
<string name="description_status_favourited">Favoritado</string>
<string name="description_visiblity_unlisted">Não-listado</string>
<string name="description_visiblity_direct">Direta</string>
<string name="description_status"> <!-- Display name, cw\?, content\?, relative date, reposted by\?, reposted\?, favorited\?, username, media\?; visibility, fav number\?, reblog number\?--> %1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s </string>
<string name="hint_list_name">Nome da lista</string>

View File

@ -465,10 +465,6 @@
<string name="description_visiblity_direct">
Для упомянутых
</string>
<string name="description_status">
<!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">Название списка</string>

View File

@ -394,7 +394,6 @@
<string name="description_visiblity_unlisted">Ni prikazano</string>
<string name="description_visiblity_private">Sledilci</string>
<string name="description_visiblity_direct">Neposredno</string>
<string name="description_status"> <!-- Display name, cw\?, content\?, relative date, reposted by\?, reposted\?, favorited\?, username, media\?; visibility, fav number\?, reblog number\?-->%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s </string>
<string name="hint_list_name">Ime seznama</string>

View File

@ -366,9 +366,6 @@
</string>
<string name="description_visiblity_direct"> Direkt
</string>
<string name="description_status"> <!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">Listnamn</string>
<string name="download_media">Ladda ned media</string>
<string name="downloading_media">Laddar ned media</string>

View File

@ -447,10 +447,6 @@
<string name="description_visiblity_direct">
私信
</string>
<string name="description_status">
<!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">列表名</string>

View File

@ -447,10 +447,6 @@
<string name="description_visiblity_direct">
私信
</string>
<string name="description_status">
<!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">列表名</string>

View File

@ -447,10 +447,6 @@
<string name="description_visiblity_direct">
私信
</string>
<string name="description_status">
<!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">列表名</string>

View File

@ -447,10 +447,6 @@
<string name="description_visiblity_direct">
私信
</string>
<string name="description_status">
<!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">列表名</string>

View File

@ -447,10 +447,6 @@
<string name="description_visiblity_direct">
私信
</string>
<string name="description_status">
<!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
<string name="hint_list_name">列表名</string>

View File

@ -99,4 +99,10 @@
<item>ja</item>
</string-array>
<string name="description_status" translatable="false">
<!-- Display name, cw?, content?, poll? relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %13$s %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
</string>
</resources>

View File

@ -450,9 +450,8 @@
<string name="description_visiblity_direct">
Direct
</string>
<string name="description_status">
<!-- Display name, cw?, content?, relative date, reposted by?, reposted?, favorited?, username, media?; visibility, fav number?, reblog number?-->
%1$s; %2$s; %3$s, %4$s, %5$s; %6$s, %7$s, %8$s, %9$s; %10$s, %11$s, %12$s
<string name="description_poll">
Poll with choices: %s, %s, %s, %s; %s
</string>
<string name="hint_list_name">List name</string>