Commit 207f5c77 authored by Luca Hunkeler's avatar Luca Hunkeler Committed by Commit Bot

[Autofill Assistant] Allow accessibility strings to be null

Change the way we handle accessibility strings to that there are three options:

not set -> the default description is used
empty string -> the view is ignored by accessibility
non-empty string -> the string is used as description

Bug: b/143757329
Change-Id: I39cd9bf4a634fa7482c485320d2a81d8513eb935
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1926590
Commit-Queue: Luca Hunkeler <hluca@google.com>
Reviewed-by: default avatarClemens Arbesser <arbesser@google.com>
Cr-Commit-Position: refs/heads/master@{#719542}
parent 66a41d97
...@@ -67,6 +67,7 @@ android_library("java") { ...@@ -67,6 +67,7 @@ android_library("java") {
java_files = [ java_files = [
"java/src/org/chromium/chrome/browser/autofill_assistant/AbstractListObserver.java", "java/src/org/chromium/chrome/browser/autofill_assistant/AbstractListObserver.java",
"java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAccessibilityUtils.java",
"java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java", "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java",
"java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomSheetContent.java", "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomSheetContent.java",
"java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java", "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.autofill_assistant;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
/**
* Common accessibility utilities used by autofill assistant.
*/
public class AssistantAccessibilityUtils {
/*
* Sets the importance for accessibility and the description for the given field.
* */
public static void setAccessibility(View view, @Nullable String accessibilityHint) {
view.setContentDescription(accessibilityHint);
if (accessibilityHint != null && TextUtils.isEmpty(accessibilityHint)) {
view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
} else {
view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_AUTO);
}
}
}
...@@ -4,8 +4,7 @@ ...@@ -4,8 +4,7 @@
package org.chromium.chrome.browser.autofill_assistant.details; package org.chromium.chrome.browser.autofill_assistant.details;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO; import static org.chromium.chrome.browser.autofill_assistant.AssistantAccessibilityUtils.setAccessibility;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
...@@ -157,11 +156,8 @@ class AssistantDetailsViewBinder ...@@ -157,11 +156,8 @@ class AssistantDetailsViewBinder
details.getTotalPrice().isEmpty() ? View.GONE : View.VISIBLE); details.getTotalPrice().isEmpty() ? View.GONE : View.VISIBLE);
viewHolder.mImageView.setVisibility(View.VISIBLE); viewHolder.mImageView.setVisibility(View.VISIBLE);
viewHolder.mImageView.setContentDescription(details.getImageAccessibilityHint()); setAccessibility(viewHolder.mImageView, details.getImageAccessibilityHint());
viewHolder.mImageView.setImportantForAccessibility(
TextUtils.isEmpty(details.getImageAccessibilityHint())
? IMPORTANT_FOR_ACCESSIBILITY_NO
: IMPORTANT_FOR_ACCESSIBILITY_AUTO);
if (details.getImageUrl().isEmpty()) { if (details.getImageUrl().isEmpty()) {
if (details.getShowImagePlaceholder()) { if (details.getShowImagePlaceholder()) {
viewHolder.mImageView.setImageDrawable(viewHolder.mDefaultImage); viewHolder.mImageView.setImageDrawable(viewHolder.mDefaultImage);
......
...@@ -4,8 +4,7 @@ ...@@ -4,8 +4,7 @@
package org.chromium.chrome.browser.autofill_assistant.user_data; package org.chromium.chrome.browser.autofill_assistant.user_data;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO; import static org.chromium.chrome.browser.autofill_assistant.AssistantAccessibilityUtils.setAccessibility;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
import android.content.Context; import android.content.Context;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
...@@ -59,11 +58,7 @@ public class AssistantLoginSection extends AssistantCollectUserDataSection<Assis ...@@ -59,11 +58,7 @@ public class AssistantLoginSection extends AssistantCollectUserDataSection<Assis
sublabelView.setVisibility(View.GONE); sublabelView.setVisibility(View.GONE);
} else { } else {
sublabelView.setText(option.getSublabel()); sublabelView.setText(option.getSublabel());
sublabelView.setContentDescription(option.getSublabelAccessibilityHint()); setAccessibility(sublabelView, option.getSublabelAccessibilityHint());
sublabelView.setImportantForAccessibility(
TextUtils.isEmpty(option.getSublabelAccessibilityHint())
? IMPORTANT_FOR_ACCESSIBILITY_NO
: IMPORTANT_FOR_ACCESSIBILITY_AUTO);
} }
} }
......
...@@ -131,14 +131,19 @@ base::android::ScopedJavaLocalRef<jobject> CreateJavaLoginChoiceList( ...@@ -131,14 +131,19 @@ base::android::ScopedJavaLocalRef<jobject> CreateJavaLoginChoiceList(
base::android::ConvertUTF8ToJavaString( base::android::ConvertUTF8ToJavaString(
env, login_choice.info_popup->text())); env, login_choice.info_popup->text()));
} }
base::android::ScopedJavaLocalRef<jstring> jsublabel_accessibility_hint =
nullptr;
if (login_choice.sublabel_accessibility_hint.has_value()) {
jsublabel_accessibility_hint = base::android::ConvertUTF8ToJavaString(
env, login_choice.sublabel_accessibility_hint.value());
}
Java_AssistantCollectUserDataModel_addLoginChoice( Java_AssistantCollectUserDataModel_addLoginChoice(
env, jlist, env, jlist,
base::android::ConvertUTF8ToJavaString(env, login_choice.identifier), base::android::ConvertUTF8ToJavaString(env, login_choice.identifier),
base::android::ConvertUTF8ToJavaString(env, login_choice.label), base::android::ConvertUTF8ToJavaString(env, login_choice.label),
base::android::ConvertUTF8ToJavaString(env, login_choice.sublabel), base::android::ConvertUTF8ToJavaString(env, login_choice.sublabel),
base::android::ConvertUTF8ToJavaString( jsublabel_accessibility_hint, login_choice.preselect_priority,
env, login_choice.sublabel_accessibility_hint), jinfo_popup);
login_choice.preselect_priority, jinfo_popup);
} }
return jlist; return jlist;
} }
...@@ -1174,14 +1179,18 @@ void UiControllerAndroid::OnDetailsChanged(const Details* details) { ...@@ -1174,14 +1179,18 @@ void UiControllerAndroid::OnDetailsChanged(const Details* details) {
Java_AssistantDetailsModel_clearDetails(env, jmodel); Java_AssistantDetailsModel_clearDetails(env, jmodel);
return; return;
} }
auto opt_image_accessibility_hint = details->imageAccessibilityHint();
base::android::ScopedJavaLocalRef<jstring> jimage_accessibility_hint =
nullptr;
if (opt_image_accessibility_hint.has_value()) {
jimage_accessibility_hint = base::android::ConvertUTF8ToJavaString(
env, opt_image_accessibility_hint.value());
}
auto jdetails = Java_AssistantDetails_create( auto jdetails = Java_AssistantDetails_create(
env, base::android::ConvertUTF8ToJavaString(env, details->title()), env, base::android::ConvertUTF8ToJavaString(env, details->title()),
details->titleMaxLines(), details->titleMaxLines(),
base::android::ConvertUTF8ToJavaString(env, details->imageUrl()), base::android::ConvertUTF8ToJavaString(env, details->imageUrl()),
base::android::ConvertUTF8ToJavaString(env, jimage_accessibility_hint, details->imageAllowClickthrough(),
details->imageAccessibilityHint()),
details->imageAllowClickthrough(),
base::android::ConvertUTF8ToJavaString(env, details->imageDescription()), base::android::ConvertUTF8ToJavaString(env, details->imageDescription()),
base::android::ConvertUTF8ToJavaString(env, details->imagePositiveText()), base::android::ConvertUTF8ToJavaString(env, details->imagePositiveText()),
base::android::ConvertUTF8ToJavaString(env, details->imageNegativeText()), base::android::ConvertUTF8ToJavaString(env, details->imageNegativeText()),
......
...@@ -637,7 +637,10 @@ CollectUserDataAction::CreateOptionsFromProto() { ...@@ -637,7 +637,10 @@ CollectUserDataAction::CreateOptionsFromProto() {
collect_user_data_options->login_choices.size()), collect_user_data_options->login_choices.size()),
login_option.custom().label(), login_option.custom().label(),
login_option.sublabel(), login_option.sublabel(),
login_option.sublabel_accessibility_hint(), login_option.has_sublabel_accessibility_hint()
? base::make_optional(
login_option.sublabel_accessibility_hint())
: base::nullopt,
login_option.has_preselection_priority() login_option.has_preselection_priority()
? login_option.preselection_priority() ? login_option.preselection_priority()
: -1, : -1,
......
...@@ -194,7 +194,7 @@ base::Value Details::GetDebugContext() const { ...@@ -194,7 +194,7 @@ base::Value Details::GetDebugContext() const {
if (!proto_.image_url().empty()) if (!proto_.image_url().empty())
dict.SetKey("image_url", base::Value(proto_.image_url())); dict.SetKey("image_url", base::Value(proto_.image_url()));
if (!proto_.image_accessibility_hint().empty()) if (proto_.has_image_accessibility_hint())
dict.SetKey("image_accessibility_hint", dict.SetKey("image_accessibility_hint",
base::Value(proto_.image_accessibility_hint())); base::Value(proto_.image_accessibility_hint()));
...@@ -366,8 +366,11 @@ const std::string Details::imageUrl() const { ...@@ -366,8 +366,11 @@ const std::string Details::imageUrl() const {
return proto_.image_url(); return proto_.image_url();
} }
const std::string Details::imageAccessibilityHint() const { const base::Optional<std::string> Details::imageAccessibilityHint() const {
return proto_.image_accessibility_hint(); if (proto_.has_image_accessibility_hint()) {
return proto_.image_accessibility_hint();
}
return base::nullopt;
} }
bool Details::imageAllowClickthrough() const { bool Details::imageAllowClickthrough() const {
......
...@@ -56,7 +56,7 @@ class Details { ...@@ -56,7 +56,7 @@ class Details {
const std::string title() const; const std::string title() const;
int titleMaxLines() const; int titleMaxLines() const;
const std::string imageUrl() const; const std::string imageUrl() const;
const std::string imageAccessibilityHint() const; const base::Optional<std::string> imageAccessibilityHint() const;
bool imageAllowClickthrough() const; bool imageAllowClickthrough() const;
const std::string imageDescription() const; const std::string imageDescription() const;
const std::string imagePositiveText() const; const std::string imagePositiveText() const;
......
...@@ -10,12 +10,13 @@ ...@@ -10,12 +10,13 @@
namespace autofill_assistant { namespace autofill_assistant {
LoginChoice::LoginChoice(const std::string& _identifier, LoginChoice::LoginChoice(
const std::string& _label, const std::string& _identifier,
const std::string& _sublabel, const std::string& _label,
const std::string& _sublabel_accessibility_hint, const std::string& _sublabel,
int _preselect_priority, const base::Optional<std::string>& _sublabel_accessibility_hint,
const base::Optional<InfoPopupProto>& _info_popup) int _preselect_priority,
const base::Optional<InfoPopupProto>& _info_popup)
: identifier(_identifier), : identifier(_identifier),
label(_label), label(_label),
sublabel(_sublabel), sublabel(_sublabel),
......
...@@ -42,7 +42,7 @@ struct LoginChoice { ...@@ -42,7 +42,7 @@ struct LoginChoice {
LoginChoice(const std::string& id, LoginChoice(const std::string& id,
const std::string& label, const std::string& label,
const std::string& sublabel, const std::string& sublabel,
const std::string& sublabel_accessibility_hint, const base::Optional<std::string>& sublabel_accessibility_hint,
int priority, int priority,
const base::Optional<InfoPopupProto>& info_popup); const base::Optional<InfoPopupProto>& info_popup);
LoginChoice(const LoginChoice& another); LoginChoice(const LoginChoice& another);
...@@ -55,7 +55,7 @@ struct LoginChoice { ...@@ -55,7 +55,7 @@ struct LoginChoice {
// The sublabel to display to the user. // The sublabel to display to the user.
std::string sublabel; std::string sublabel;
// The a11y hint for |sublabel|. // The a11y hint for |sublabel|.
std::string sublabel_accessibility_hint; base::Optional<std::string> sublabel_accessibility_hint;
// The priority to pre-select this choice (-1 == not set/automatic). // The priority to pre-select this choice (-1 == not set/automatic).
int preselect_priority = -1; int preselect_priority = -1;
// The popup to show to provide more information about this login choice. // The popup to show to provide more information about this login choice.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment