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