CheckBoxPreference.java revision 8e10080c914d1ad0784394fa3026b85535535847
16904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/*
26904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Copyright (C) 2015 The Android Open Source Project
36904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
46904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
56904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * you may not use this file except in compliance with the License.
66904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * You may obtain a copy of the License at
76904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
86904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
96904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Unless required by applicable law or agreed to in writing, software
116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * See the License for the specific language governing permissions and
146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * limitations under the License
156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpackage android.support.v7.preference;
186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas
216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.Context;
226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.res.TypedArray;
23c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
2484765eaea7da18d0576db557959129e9d0db8e8cTony Mantlerimport android.support.v4.content.res.TypedArrayUtils;
256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.util.AttributeSet;
266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.view.View;
27c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslavimport android.view.accessibility.AccessibilityManager;
286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.widget.Checkable;
292c15890a010232b8625788629fa14923fdd6ec5bScott Kennedyimport android.widget.CompoundButton;
306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/**
326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * A {@link Preference} that provides checkbox widget
336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * functionality.
346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p>
356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This preference will store a boolean into the SharedPreferences.
366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
37929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:summaryOff
38929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:summaryOn
39929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:disableDependentsState
406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic class CheckBoxPreference extends TwoStatePreference {
422c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy    private final Listener mListener = new Listener();
432c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy
442c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy    private class Listener implements CompoundButton.OnCheckedChangeListener {
452c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        @Override
462c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
472c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            if (!callChangeListener(isChecked)) {
482c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy                // Listener didn't like it, change it back.
492c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy                // CompoundButton will make sure we don't recurse.
502c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy                buttonView.setChecked(!isChecked);
512c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy                return;
522c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            }
532c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            CheckBoxPreference.this.setChecked(isChecked);
542c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        }
552c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy    }
566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, attrs, defStyleAttr, 0);
596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(
626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super(context, attrs, defStyleAttr, defStyleRes);
646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final TypedArray a = context.obtainStyledAttributes(attrs,
666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                R.styleable.CheckBoxPreference, defStyleAttr, defStyleRes);
6784765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
6884765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setSummaryOn(TypedArrayUtils.getString(a, R.styleable.CheckBoxPreference_summaryOn,
6984765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_summaryOn));
7084765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
7184765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setSummaryOff(TypedArrayUtils.getString(a, R.styleable.CheckBoxPreference_summaryOff,
7284765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_summaryOff));
7384765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
7484765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setDisableDependentsState(TypedArrayUtils.getBoolean(a,
7584765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_disableDependentsState,
7684765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_disableDependentsState, false));
7784765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        a.recycle();
796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context, AttributeSet attrs) {
823fadd62b614e4a69aefe920aac640bdb629e502eJason Monk        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.checkBoxPreferenceStyle,
833fadd62b614e4a69aefe920aac640bdb629e502eJason Monk                android.R.attr.checkBoxPreferenceStyle));
846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context) {
876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, null);
886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
91671d9d6db5c64e6c8392e56fb84a181ca0550469Tony Mantler    public void onBindViewHolder(PreferenceViewHolder holder) {
926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super.onBindViewHolder(holder);
936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
942c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        syncCheckboxView(holder.findViewById(android.R.id.checkbox));
956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        syncSummaryView(holder);
976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
98c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
99c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    /**
100c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav     * @hide
101c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav     */
1028e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas    @RestrictTo(LIBRARY_GROUP)
103c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    @Override
104c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    protected void performClick(View view) {
105c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        super.performClick(view);
106c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncViewIfAccessibilityEnabled(view);
107c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
108c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
109c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    private void syncViewIfAccessibilityEnabled(View view) {
110c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        AccessibilityManager accessibilityManager = (AccessibilityManager)
111c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav                getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
112c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (!accessibilityManager.isEnabled()) {
113c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            return;
114c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
115c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
11690d56ef3b34db86c9b775e910db38b6b81a170cdTony Mantler        View checkboxView = view.findViewById(android.R.id.checkbox);
117c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncCheckboxView(checkboxView);
118c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
119c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        View summaryView = view.findViewById(android.R.id.summary);
120c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncSummaryView(summaryView);
121c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
122c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
123c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    private void syncCheckboxView(View view) {
1242c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        if (view instanceof CompoundButton) {
1252c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            ((CompoundButton) view).setOnCheckedChangeListener(null);
1262c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        }
127c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (view instanceof Checkable) {
128c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            ((Checkable) view).setChecked(mChecked);
129c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
1302c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        if (view instanceof CompoundButton) {
1312c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            ((CompoundButton) view).setOnCheckedChangeListener(mListener);
1322c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        }
133c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
1346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler}
135