CheckBoxPreference.java revision c67647d83261aad33d42309c52aa75e05ea9daf7
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;
266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/**
286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * A {@link Preference} that provides checkbox widget
296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * functionality.
306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p>
316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This preference will store a boolean into the SharedPreferences.
326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler *
336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#CheckBoxPreference_summaryOff
346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#CheckBoxPreference_summaryOn
356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#CheckBoxPreference_disableDependentsState
366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic class CheckBoxPreference extends TwoStatePreference {
386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, attrs, defStyleAttr, 0);
416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(
446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super(context, attrs, defStyleAttr, defStyleRes);
466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final TypedArray a = context.obtainStyledAttributes(attrs,
486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                R.styleable.CheckBoxPreference, defStyleAttr, defStyleRes);
4984765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
5084765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setSummaryOn(TypedArrayUtils.getString(a, R.styleable.CheckBoxPreference_summaryOn,
5184765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_summaryOn));
5284765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
5384765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setSummaryOff(TypedArrayUtils.getString(a, R.styleable.CheckBoxPreference_summaryOff,
5484765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_summaryOff));
5584765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
5684765eaea7da18d0576db557959129e9d0db8e8cTony Mantler        setDisableDependentsState(TypedArrayUtils.getBoolean(a,
5784765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_disableDependentsState,
5884765eaea7da18d0576db557959129e9d0db8e8cTony Mantler                R.styleable.CheckBoxPreference_android_disableDependentsState, false));
5984765eaea7da18d0576db557959129e9d0db8e8cTony Mantler
606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        a.recycle();
616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context, AttributeSet attrs) {
646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, attrs, R.attr.checkBoxPreferenceStyle);
656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CheckBoxPreference(Context context) {
686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, null);
696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
72671d9d6db5c64e6c8392e56fb84a181ca0550469Tony Mantler    public void onBindViewHolder(PreferenceViewHolder holder) {
736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super.onBindViewHolder(holder);
746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        View checkboxView = holder.findViewById(R.id.checkbox);
766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (checkboxView != null && checkboxView instanceof Checkable) {
776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            ((Checkable) checkboxView).setChecked(mChecked);
786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        syncSummaryView(holder);
816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
82c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
83c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    /**
84c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav     * @hide
85c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav     */
86c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    @Override
87c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    protected void performClick(View view) {
88c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        super.performClick(view);
89c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncViewIfAccessibilityEnabled(view);
90c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
91c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
92c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    private void syncViewIfAccessibilityEnabled(View view) {
93c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        AccessibilityManager accessibilityManager = (AccessibilityManager)
94c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav                getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
95c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (!accessibilityManager.isEnabled()) {
96c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            return;
97c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
98c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
99c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        View checkboxView = view.findViewById(R.id.checkbox);
100c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncCheckboxView(checkboxView);
101c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
102c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        View summaryView = view.findViewById(android.R.id.summary);
103c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncSummaryView(summaryView);
104c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
105c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav
106c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    private void syncCheckboxView(View view) {
107c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (view instanceof Checkable) {
108c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            ((Checkable) view).setChecked(mChecked);
109c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
110c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
1116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler}
112