CheckBoxPreference.java revision 90d56ef3b34db86c9b775e910db38b6b81a170cd
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
196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.Context;
206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.res.TypedArray;
2184765eaea7da18d0576db557959129e9d0db8e8cTony Mantlerimport android.support.v4.content.res.TypedArrayUtils;
226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.util.AttributeSet;
236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.view.View;
24c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslavimport android.view.accessibility.AccessibilityManager;
256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.widget.Checkable;
262c15890a010232b8625788629fa14923fdd6ec5bScott Kennedyimport android.widget.CompoundButton;
276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/**
296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * A {@link Preference} that provides checkbox widget
306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * functionality.
316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p>
326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This preference will store a boolean into the SharedPreferences.
336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
34929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:summaryOff
35929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:summaryOn
36929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:disableDependentsState
376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic class CheckBoxPreference extends TwoStatePreference {
392c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy    private final Listener mListener = new Listener();
402c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy
412c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy    private class Listener implements CompoundButton.OnCheckedChangeListener {
422c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        @Override
432c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
442c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            if (!callChangeListener(isChecked)) {
452c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy                // Listener didn't like it, change it back.
462c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy                // CompoundButton will make sure we don't recurse.
472c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy                buttonView.setChecked(!isChecked);
482c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy                return;
492c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            }
502c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            CheckBoxPreference.this.setChecked(isChecked);
512c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        }
522c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy    }
536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, attrs, defStyleAttr, 0);
566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(
596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super(context, attrs, defStyleAttr, defStyleRes);
616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final TypedArray a = context.obtainStyledAttributes(attrs,
636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                R.styleable.CheckBoxPreference, defStyleAttr, defStyleRes);
6484765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
6584765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setSummaryOn(TypedArrayUtils.getString(a, R.styleable.CheckBoxPreference_summaryOn,
6684765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_summaryOn));
6784765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
6884765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setSummaryOff(TypedArrayUtils.getString(a, R.styleable.CheckBoxPreference_summaryOff,
6984765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_summaryOff));
7084765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
7184765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setDisableDependentsState(TypedArrayUtils.getBoolean(a,
7284765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_disableDependentsState,
7384765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_disableDependentsState, false));
7484765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        a.recycle();
766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context, AttributeSet attrs) {
793fadd62b614e4a69aefe920aac640bdb629e502eJason Monk        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.checkBoxPreferenceStyle,
803fadd62b614e4a69aefe920aac640bdb629e502eJason Monk                android.R.attr.checkBoxPreferenceStyle));
816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context) {
846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, null);
856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
88671d9d6db5c64e6c8392e56fb84a181ca0550469Tony Mantler    public void onBindViewHolder(PreferenceViewHolder holder) {
896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super.onBindViewHolder(holder);
906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
912c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        syncCheckboxView(holder.findViewById(android.R.id.checkbox));
926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        syncSummaryView(holder);
946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
95c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
96c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    /**
97c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav     * @hide
98c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav     */
99c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    @Override
100c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    protected void performClick(View view) {
101c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        super.performClick(view);
102c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncViewIfAccessibilityEnabled(view);
103c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
104c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
105c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    private void syncViewIfAccessibilityEnabled(View view) {
106c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        AccessibilityManager accessibilityManager = (AccessibilityManager)
107c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav                getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
108c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (!accessibilityManager.isEnabled()) {
109c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            return;
110c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
111c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
11290d56ef3b34db86c9b775e910db38b6b81a170cdTony Mantler        View checkboxView = view.findViewById(android.R.id.checkbox);
113c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncCheckboxView(checkboxView);
114c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
115c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        View summaryView = view.findViewById(android.R.id.summary);
116c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncSummaryView(summaryView);
117c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
118c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
119c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    private void syncCheckboxView(View view) {
1202c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        if (view instanceof CompoundButton) {
1212c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            ((CompoundButton) view).setOnCheckedChangeListener(null);
1222c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        }
123c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (view instanceof Checkable) {
124c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            ((Checkable) view).setChecked(mChecked);
125c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
1262c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        if (view instanceof CompoundButton) {
1272c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy            ((CompoundButton) view).setOnCheckedChangeListener(mListener);
1282c15890a010232b8625788629fa14923fdd6ec5bScott Kennedy        }
129c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
1306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler}
131