Merge "Extends the touch area for the switch in Master Switch preference."
diff --git a/res/layout/preference_master_switch.xml b/res/layout/preference_master_switch.xml
index 9f46d76..c7dd6d6 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"/>
 
 </LinearLayout>
diff --git a/res/layout/preference_widget_master_switch.xml b/res/layout/preference_widget_master_switch.xml
index bc1cafd..ee335f1 100644
--- a/res/layout/preference_widget_master_switch.xml
+++ b/res/layout/preference_widget_master_switch.xml
@@ -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>
diff --git a/src/com/android/settings/widget/MasterSwitchPreference.java b/src/com/android/settings/widget/MasterSwitchPreference.java
index ba3458a..84f1532 100644
--- a/src/com/android/settings/widget/MasterSwitchPreference.java
+++ b/src/com/android/settings/widget/MasterSwitchPreference.java
@@ -20,7 +20,8 @@
 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 @@
     @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 8cf3389..7d2e240 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.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 @@
     }
 
     @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 @@
     }
 
     @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));