[Wi-Fi] [a11y] The "Advanced options" should be accessible by Voice Access and pronounced by talkback correctly.

The checkbox is unclickable via Accessibility.

Solution: Refine the solution of b/30079196 to let checkbox be focusable and clickable by Accessibility, and remove unnecessary Accessibility pronunciation strings.

Bug: 141588638
Bug: 141588161
Test: Add unit test to check the content description of the checkbox.
Change-Id: I2e7932f64ae29a13b793276eab6705009af20104
This commit is contained in:
govenliu
2019-10-17 15:57:57 +08:00
parent ca3639a668
commit 116060e011
4 changed files with 48 additions and 14 deletions

View File

@@ -368,14 +368,14 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
style="@style/wifi_item" style="@style/wifi_item"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:importantForAccessibility="yes" android:importantForAccessibility="no"
android:contentDescription="@string/wifi_advanced_toggle_description_collapsed"
android:visibility="gone"> android:visibility="gone">
<CheckBox android:id="@+id/wifi_advanced_togglebox" <CheckBox android:id="@+id/wifi_advanced_togglebox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
style="@style/wifi_advanced_toggle" style="@style/wifi_advanced_toggle"
android:importantForAccessibility="noHideDescendants" android:importantForAccessibility="yes"
android:contentDescription="@string/wifi_advanced_toggle_description"
android:text="@string/wifi_show_advanced" /> android:text="@string/wifi_show_advanced" />
</LinearLayout> </LinearLayout>

View File

@@ -1953,10 +1953,12 @@
<!-- Dialog for Access Points --> <skip /> <!-- Dialog for Access Points --> <skip />
<!-- Label to show/hide advanced options [CHAR LIMIT=40] --> <!-- Label to show/hide advanced options [CHAR LIMIT=40] -->
<string name="wifi_show_advanced">Advanced options</string> <string name="wifi_show_advanced">Advanced options</string>
<!-- Message for talkback to say when Advanced Options expanded [CHAR LIMIT=NONE] --> <!-- Message for talkback to say when focus on Advanced Options[CHAR LIMIT=NONE] -->
<string name="wifi_advanced_toggle_description_expanded">Drop down list Advanced Options. Double-tap to collapse.</string> <string name="wifi_advanced_toggle_description">Drop down list Advanced Options</string>
<!-- Message for talkback to say when Advanced Options is collapsed [CHAR LIMIT=NONE] --> <!-- Extended message for talkback to say when Advanced Options is expanded. (e.g., Double-tap to collapse) [CHAR LIMIT=NONE] -->
<string name="wifi_advanced_toggle_description_collapsed">Drop down list Advanced Options. Double-tap to expand.</string> <string name="wifi_advanced_toggle_description_expanded">collapse</string>
<!-- Extended message for talkback to say when Advanced Options is collapsed. (e.g., Double-tap to expand) [CHAR LIMIT=NONE] -->
<string name="wifi_advanced_toggle_description_collapsed">expand</string>
<!-- Label for the SSID of the network --> <!-- Label for the SSID of the network -->
<string name="wifi_ssid">Network name</string> <string name="wifi_ssid">Network name</string>
<!-- Hint for a text field to enter the SSID of a hidden wifi network. [CHAR LIMIT=35] --> <!-- Hint for a text field to enter the SSID of a hidden wifi network. [CHAR LIMIT=35] -->

View File

@@ -47,7 +47,10 @@ import android.text.TextWatcher;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.view.View.AccessibilityDelegate;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView; import android.widget.AdapterView;
@@ -62,6 +65,8 @@ import android.widget.ScrollView;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
import com.android.settings.ProxySelector; import com.android.settings.ProxySelector;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.wifi.details.WifiPrivacyPreferenceController; import com.android.settings.wifi.details.WifiPrivacyPreferenceController;
@@ -76,8 +81,6 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import androidx.annotation.VisibleForTesting;
/** /**
* The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigUiBase} to * The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigUiBase} to
* share the logic for controlling buttons, text fields, etc. * share the logic for controlling buttons, text fields, etc.
@@ -338,6 +341,7 @@ public class WifiConfigController implements TextWatcher,
mAccessPoint.isCarrierAp() ? View.GONE : View.VISIBLE); mAccessPoint.isCarrierAp() ? View.GONE : View.VISIBLE);
advancedTogglebox.setOnCheckedChangeListener(this); advancedTogglebox.setOnCheckedChangeListener(this);
advancedTogglebox.setChecked(showAdvancedFields); advancedTogglebox.setChecked(showAdvancedFields);
setAdvancedOptionAccessibilityString(showAdvancedFields);
mView.findViewById(R.id.wifi_advanced_fields) mView.findViewById(R.id.wifi_advanced_fields)
.setVisibility(showAdvancedFields ? View.VISIBLE : View.GONE); .setVisibility(showAdvancedFields ? View.VISIBLE : View.GONE);
if (mAccessPoint.isCarrierAp()) { if (mAccessPoint.isCarrierAp()) {
@@ -1554,21 +1558,17 @@ public class WifiConfigController implements TextWatcher,
((EditText) mPasswordView).setSelection(pos); ((EditText) mPasswordView).setSelection(pos);
} }
} else if (view.getId() == R.id.wifi_advanced_togglebox) { } else if (view.getId() == R.id.wifi_advanced_togglebox) {
final View advancedToggle = mView.findViewById(R.id.wifi_advanced_toggle);
final int toggleVisibility; final int toggleVisibility;
final int stringID; final int stringID;
if (isChecked) { if (isChecked) {
toggleVisibility = View.VISIBLE; toggleVisibility = View.VISIBLE;
stringID = R.string.wifi_advanced_toggle_description_expanded;
// Hide the SoftKeyboard temporary to let user can see most of the expanded items. // Hide the SoftKeyboard temporary to let user can see most of the expanded items.
hideSoftKeyboard(mView.getWindowToken()); hideSoftKeyboard(mView.getWindowToken());
} else { } else {
toggleVisibility = View.GONE; toggleVisibility = View.GONE;
stringID = R.string.wifi_advanced_toggle_description_collapsed;
} }
mView.findViewById(R.id.wifi_advanced_fields).setVisibility(toggleVisibility); mView.findViewById(R.id.wifi_advanced_fields).setVisibility(toggleVisibility);
advancedToggle.setContentDescription(mContext.getString(stringID)); setAdvancedOptionAccessibilityString(isChecked);
} }
} }
@@ -1677,6 +1677,8 @@ public class WifiConfigController implements TextWatcher,
mView.findViewById(R.id.hidden_settings_field).setVisibility(View.VISIBLE); mView.findViewById(R.id.hidden_settings_field).setVisibility(View.VISIBLE);
((CheckBox) mView.findViewById(R.id.wifi_advanced_togglebox)) ((CheckBox) mView.findViewById(R.id.wifi_advanced_togglebox))
.setOnCheckedChangeListener(this); .setOnCheckedChangeListener(this);
// Set correct accessibility strings.
setAdvancedOptionAccessibilityString(false /* showAdvancedFields */);
} }
/** /**
@@ -1767,4 +1769,26 @@ public class WifiConfigController implements TextWatcher,
InputMethodManager.class); InputMethodManager.class);
inputMethodManager.hideSoftInputFromWindow(windowToken, 0 /* flags */); inputMethodManager.hideSoftInputFromWindow(windowToken, 0 /* flags */);
} }
private void setAdvancedOptionAccessibilityString(boolean showAdvancedFields) {
final CheckBox advancedToggleBox = mView.findViewById(R.id.wifi_advanced_togglebox);
advancedToggleBox.setAccessibilityDelegate(new AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(
View v, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(v, info);
// To let TalkBack don't pronounce checked/unchecked.
info.setCheckable(false /* checkable */);
// To let TalkBack don't pronounce CheckBox.
info.setClassName(null /* className */);
final CharSequence accessibilityDoubleTapExtend = mContext.getString(
showAdvancedFields ? R.string.wifi_advanced_toggle_description_expanded
: R.string.wifi_advanced_toggle_description_collapsed);
// Customize TalkBack's pronunciation which been appended to "Double-tap to".
final AccessibilityAction customClick = new AccessibilityAction(
AccessibilityNodeInfo.ACTION_CLICK, accessibilityDoubleTapExtend);
info.addAction(customClick);
}
});
}
} }

View File

@@ -557,4 +557,12 @@ public class WifiConfigControllerTest {
assertThat(firstChild).isEqualTo(hiddenSettingLayout); assertThat(firstChild).isEqualTo(hiddenSettingLayout);
} }
@Test
public void getAdvancedOptionContentDescription_whenViewInitialed_shouldBeCorrect() {
final CheckBox advButton = mView.findViewById(R.id.wifi_advanced_togglebox);
assertThat(advButton.getContentDescription()).isEqualTo(
mContext.getString(R.string.wifi_advanced_toggle_description));
}
} }