[A11Y] Fix MasterSwitchPreference onClick not callback after TalkBack is enabled

TalkBack service dispatches onClick event to the Switch component
instead of the LinearLayout wrapping it. Do all the onClick tasks
for the Switch component instead of the LinearLayout wrapping it.

Bug: 142570671
Test: MasterSwitchPreferenceTest
      Manual click the toggle button for both TalkBack enabled case and disabled case.

Change-Id: I4b2f9df309d03a477863445cd187384cdb61314b
This commit is contained in:
Arc Wang
2019-11-06 10:02:18 +08:00
parent fe5b2d9624
commit d1ea136cb8
2 changed files with 12 additions and 9 deletions

View File

@@ -63,9 +63,9 @@ public class MasterSwitchPreference extends TwoTargetPreference {
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
final View widgetView = holder.findViewById(android.R.id.widget_frame);
if (widgetView != null) {
widgetView.setOnClickListener(new OnClickListener() {
final View switchWidget = holder.findViewById(R.id.switchWidget);
if (switchWidget != null) {
switchWidget.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mSwitch != null && !mSwitch.isEnabled()) {

View File

@@ -23,7 +23,6 @@ import static org.mockito.Mockito.verify;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Switch;
@@ -115,10 +114,10 @@ public class MasterSwitchPreferenceTest {
final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
preference.onBindViewHolder(holder);
widgetView.performClick();
toggle.performClick();
assertThat(toggle.isChecked()).isTrue();
widgetView.performClick();
toggle.performClick();
assertThat(toggle.isChecked()).isFalse();
}
@@ -143,19 +142,23 @@ public class MasterSwitchPreferenceTest {
@Test
public void clickWidgetView_shouldNotifyPreferenceChanged() {
final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
LayoutInflater.from(mContext).inflate(R.layout.preference_two_target, null));
final View widgetView = holder.findViewById(android.R.id.widget_frame);
final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true);
final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
preference.setOnPreferenceChangeListener(listener);
preference.onBindViewHolder(holder);
preference.setChecked(false);
widgetView.performClick();
toggle.performClick();
verify(listener).onPreferenceChange(preference, true);
preference.setChecked(true);
widgetView.performClick();
toggle.performClick();
verify(listener).onPreferenceChange(preference, false);
}