Allow clicks on the custom widget in CheckBoxPreference

Most of this was copied verbatim from SwitchPreferenceCompat.

When using a custom widgetLayout, a listener needs to be attached to
listen for changes to the checked state, so that this can be passed
into the preference system.

Change-Id: Ieabdfd76d82f8bfd7f313613e25766cea8c3b65b
diff --git a/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java b/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
index 61eb13c..bd85c35 100644
--- a/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
+++ b/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
@@ -23,6 +23,7 @@
 import android.view.View;
 import android.view.accessibility.AccessibilityManager;
 import android.widget.Checkable;
+import android.widget.CompoundButton;
 
 /**
  * A {@link Preference} that provides checkbox widget
@@ -35,6 +36,20 @@
  * @attr ref android.R.styleable#CheckBoxPreference_disableDependentsState
  */
 public class CheckBoxPreference extends TwoStatePreference {
+    private final Listener mListener = new Listener();
+
+    private class Listener implements CompoundButton.OnCheckedChangeListener {
+        @Override
+        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+            if (!callChangeListener(isChecked)) {
+                // Listener didn't like it, change it back.
+                // CompoundButton will make sure we don't recurse.
+                buttonView.setChecked(!isChecked);
+                return;
+            }
+            CheckBoxPreference.this.setChecked(isChecked);
+        }
+    }
 
     public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
@@ -104,8 +119,14 @@
     }
 
     private void syncCheckboxView(View view) {
+        if (view instanceof CompoundButton) {
+            ((CompoundButton) view).setOnCheckedChangeListener(null);
+        }
         if (view instanceof Checkable) {
             ((Checkable) view).setChecked(mChecked);
         }
+        if (view instanceof CompoundButton) {
+            ((CompoundButton) view).setOnCheckedChangeListener(mListener);
+        }
     }
 }