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