From d1ea136cb8a1cbebba0359a0086f9df34fd2db3c Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Wed, 6 Nov 2019 10:02:18 +0800 Subject: [PATCH] [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 --- .../settings/widget/MasterSwitchPreference.java | 6 +++--- .../widget/MasterSwitchPreferenceTest.java | 15 +++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/widget/MasterSwitchPreference.java b/src/com/android/settings/widget/MasterSwitchPreference.java index 42529cfd4d0..eb9301c15a5 100644 --- a/src/com/android/settings/widget/MasterSwitchPreference.java +++ b/src/com/android/settings/widget/MasterSwitchPreference.java @@ -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()) { diff --git a/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java index 1ddabc15983..4cd53e9493b 100644 --- a/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java @@ -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); }