OSDN Git Service

Extends the touch area for the switch in Master Switch preference.
authorDoris Ling <dling@google.com>
Mon, 13 Mar 2017 17:29:34 +0000 (10:29 -0700)
committerDoris Ling <dling@google.com>
Mon, 13 Mar 2017 17:29:34 +0000 (10:29 -0700)
- 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
res/layout/preference_widget_master_switch.xml
src/com/android/settings/widget/MasterSwitchPreference.java
tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java

index 9f46d76..c7dd6d6 100644 (file)
@@ -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"/>
 
 </LinearLayout>
index bc1cafd..ee335f1 100644 (file)
@@ -36,6 +36,7 @@
     <Switch android:id="@+id/switchWidget"
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
-      android:gravity="center_vertical" />
+      android:gravity="center_vertical"
+      android:clickable="false"/>
 
 </LinearLayout>
index ba3458a..84f1532 100644 (file)
@@ -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) {
index 8cf3389..7d2e240 100644 (file)
@@ -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));