From 6467d2027e8fefd646af03c08d51d91386843463 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Mon, 13 Mar 2017 10:29:34 -0700 Subject: [PATCH] Extends the touch area for the switch in Master Switch preference. - set view click listener on the entire widget view instead of only listening to the switch button event. - move the preference layout end padding into the widget frame, so that clicking on the empty space at the end will send the click event to the widget frame instead of the preference view. Change-Id: I98025f723465f3941cebbbd03b812209c0240590 Fix: 35872094 Test: make RunSettingsRoboTests --- res/layout/preference_master_switch.xml | 4 +-- .../preference_widget_master_switch.xml | 3 +- .../widget/MasterSwitchPreference.java | 24 +++++++------ .../widget/MasterSwitchPreferenceTest.java | 35 ++++++++++++------- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/res/layout/preference_master_switch.xml b/res/layout/preference_master_switch.xml index 9f46d76093f..c7dd6d69693 100644 --- a/res/layout/preference_master_switch.xml +++ b/res/layout/preference_master_switch.xml @@ -21,7 +21,6 @@ android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:background="@android:color/transparent" android:clipToPadding="false"> @@ -85,6 +84,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="end|center_vertical" - android:orientation="vertical"/> + android:orientation="vertical" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"/> diff --git a/res/layout/preference_widget_master_switch.xml b/res/layout/preference_widget_master_switch.xml index bc1cafd3a73..ee335f173b3 100644 --- a/res/layout/preference_widget_master_switch.xml +++ b/res/layout/preference_widget_master_switch.xml @@ -36,6 +36,7 @@ + android:gravity="center_vertical" + android:clickable="false"/> diff --git a/src/com/android/settings/widget/MasterSwitchPreference.java b/src/com/android/settings/widget/MasterSwitchPreference.java index ba3458aa4e4..84f1532dab8 100644 --- a/src/com/android/settings/widget/MasterSwitchPreference.java +++ b/src/com/android/settings/widget/MasterSwitchPreference.java @@ -20,7 +20,8 @@ import android.content.Context; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; import android.util.AttributeSet; -import android.widget.CompoundButton; +import android.view.View; +import android.view.View.OnClickListener; import android.widget.Switch; import android.widget.TextView; @@ -61,21 +62,24 @@ public class MasterSwitchPreference extends Preference { @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); - mSwitch = (Switch) holder.itemView.findViewById(R.id.switchWidget); - if (mSwitch != null) { - mSwitch.setChecked(mChecked); - mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + final View widgetView = holder.itemView.findViewById(android.R.id.widget_frame); + if (widgetView != null) { + widgetView.setOnClickListener(new OnClickListener() { @Override - public void onCheckedChanged(CompoundButton button, boolean isChecked) { - if (!callChangeListener(isChecked)) { - button.setChecked(!isChecked); + public void onClick(View v) { + setChecked(!mChecked); + if (!callChangeListener(mChecked)) { + setChecked(!mChecked); } else { - persistBoolean(isChecked); - mChecked = isChecked; + persistBoolean(mChecked); } } }); } + mSwitch = (Switch) holder.itemView.findViewById(R.id.switchWidget); + if (mSwitch != null) { + mSwitch.setChecked(mChecked); + } if (mMultiLine) { TextView textView = (TextView)holder.findViewById(android.R.id.title); if (textView != null) { diff --git a/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java index 8cf33899ec2..7d2e24061b3 100644 --- a/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java @@ -21,7 +21,10 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; import android.support.v7.preference.Preference.OnPreferenceChangeListener; import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.LinearLayout; import android.widget.Switch; import com.android.settings.R; @@ -92,31 +95,39 @@ public class MasterSwitchPreferenceTest { } @Test - public void toggleButtonOn_shouldNotifyChecked() { + public void clickWidgetView_shouldToggleButton() { final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); + final LayoutInflater inflater = LayoutInflater.from(mContext); final PreferenceViewHolder holder = new PreferenceViewHolder( - LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null)); + inflater.inflate(R.layout.preference_master_switch, null)); + 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.itemView.findViewById(R.id.switchWidget); - final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class); - preference.setOnPreferenceChangeListener(listener); preference.onBindViewHolder(holder); - toggle.setChecked(true); - verify(listener).onPreferenceChange(preference, true); + widgetView.performClick(); + assertThat(toggle.isChecked()).isTrue(); + + widgetView.performClick(); + assertThat(toggle.isChecked()).isFalse(); } @Test - public void toggleButtonOff_shouldNotifyUnchecked() { + public void clickWidgetView_shouldNotifyPreferenceChanged() { final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); final PreferenceViewHolder holder = new PreferenceViewHolder( - LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null)); - final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget); + LayoutInflater.from(mContext).inflate(R.layout.preference_master_switch, null)); + final View widgetView = holder.itemView.findViewById(android.R.id.widget_frame); final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class); - preference.setChecked(true); preference.setOnPreferenceChangeListener(listener); preference.onBindViewHolder(holder); - toggle.setChecked(false); + preference.setChecked(false); + widgetView.performClick(); + verify(listener).onPreferenceChange(preference, true); + + preference.setChecked(true); + widgetView.performClick(); verify(listener).onPreferenceChange(preference, false); } @@ -134,7 +145,7 @@ public class MasterSwitchPreferenceTest { } @Test - public void setDisabledByAdmin_noEnforcedAdmin_shouldEnaableButton() { + public void setDisabledByAdmin_noEnforcedAdmin_shouldEnableButton() { final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); final PreferenceViewHolder holder = new PreferenceViewHolder( LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));