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;
216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.os.Parcel;
226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.os.Parcelable;
23c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.text.TextUtils;
256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.util.AttributeSet;
266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.view.View;
276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.widget.TextView;
286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
29c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport static android.support.annotation.RestrictTo.Scope.GROUP_ID;
30c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette
316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/**
326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Common base class for preferences that have two selectable states, persist a
336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * boolean value in SharedPreferences, and may have dependent preferences that are
346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * enabled/disabled based on the current state.
356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */
366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic abstract class TwoStatePreference extends Preference {
376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private CharSequence mSummaryOn;
396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private CharSequence mSummaryOff;
406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected boolean mChecked;
416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private boolean mCheckedSet;
426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    private boolean mDisableDependentsState;
436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public TwoStatePreference(
456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super(context, attrs, defStyleAttr, defStyleRes);
476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public TwoStatePreference(Context context, AttributeSet attrs, int defStyleAttr) {
506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, attrs, defStyleAttr, 0);
516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public TwoStatePreference(Context context, AttributeSet attrs) {
546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, attrs, 0);
556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public TwoStatePreference(Context context) {
586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        this(context, null);
596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected void onClick() {
636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super.onClick();
646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final boolean newValue = !isChecked();
666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (callChangeListener(newValue)) {
676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            setChecked(newValue);
686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
724c867cf4f0537d940d512aad679acacbcdf16765Tony Mantler     * Sets the checked state and saves it to the {@link android.content.SharedPreferences}.
736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param checked The checked state.
756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setChecked(boolean checked) {
776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        // Always persist/notify the first time; don't assume the field's default of false.
786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final boolean changed = mChecked != checked;
796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (changed || !mCheckedSet) {
806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            mChecked = checked;
816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            mCheckedSet = true;
826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            persistBoolean(checked);
836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            if (changed) {
846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                notifyDependencyChange(shouldDisableDependents());
856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                notifyChanged();
866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the checked state.
926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The checked state.
946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public boolean isChecked() {
966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mChecked;
976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
1006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public boolean shouldDisableDependents() {
1016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        boolean shouldDisable = mDisableDependentsState ? mChecked : !mChecked;
1026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return shouldDisable || super.shouldDisableDependents();
1036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the summary to be shown when checked.
1076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param summary The summary to be shown when checked.
1096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setSummaryOn(CharSequence summary) {
1116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mSummaryOn = summary;
1126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (isChecked()) {
1136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            notifyChanged();
1146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
1156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #setSummaryOn(CharSequence)
1196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param summaryResId The summary as a resource.
1206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setSummaryOn(int summaryResId) {
1226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setSummaryOn(getContext().getString(summaryResId));
1236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the summary to be shown when checked.
1276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The summary.
1286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CharSequence getSummaryOn() {
1306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mSummaryOn;
1316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets the summary to be shown when unchecked.
1356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param summary The summary to be shown when unchecked.
1376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setSummaryOff(CharSequence summary) {
1396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mSummaryOff = summary;
1406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (!isChecked()) {
1416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            notifyChanged();
1426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
1436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @see #setSummaryOff(CharSequence)
1476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param summaryResId The summary as a resource.
1486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setSummaryOff(int summaryResId) {
1506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setSummaryOff(getContext().getString(summaryResId));
1516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns the summary to be shown when unchecked.
1556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return The summary.
1566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public CharSequence getSummaryOff() {
1586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mSummaryOff;
1596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Returns whether dependents are disabled when this preference is on ({@code true})
1636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * or when this preference is off ({@code false}).
1646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @return Whether dependents are disabled when this preference is on ({@code true})
1666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *         or when this preference is off ({@code false}).
1676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public boolean getDisableDependentsState() {
1696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return mDisableDependentsState;
1706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sets whether dependents are disabled when this preference is on ({@code true})
1746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * or when this preference is off ({@code false}).
1756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     *
1766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param disableDependentsState The preference state that should disable dependents.
1776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    public void setDisableDependentsState(boolean disableDependentsState) {
1796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        mDisableDependentsState = disableDependentsState;
1806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
1836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected Object onGetDefaultValue(TypedArray a, int index) {
1846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return a.getBoolean(index, false);
1856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
1886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
1896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setChecked(restoreValue ? getPersistedBoolean(mChecked)
1906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                : (Boolean) defaultValue);
1916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
1926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
1936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    /**
1946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * Sync a summary holder contained within holder's subhierarchy with the correct summary text.
1956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     * @param holder PreferenceViewHolder which holds a reference to the summary view
1966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler     */
1976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected void syncSummaryView(PreferenceViewHolder holder) {
1986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        // Sync the summary holder
199c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        View view = holder.findViewById(android.R.id.summary);
200c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        syncSummaryView(view);
201c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    }
2026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
203c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    /**
204c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav     * @hide
205c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav     */
206c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viverette    @RestrictTo(GROUP_ID)
207c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav    protected void syncSummaryView(View view) {
208c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (!(view instanceof TextView)) {
209c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            return;
210c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
211c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        TextView summaryView = (TextView) view;
212c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        boolean useDefaultSummary = true;
213c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (mChecked && !TextUtils.isEmpty(mSummaryOn)) {
214c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            summaryView.setText(mSummaryOn);
215c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            useDefaultSummary = false;
216c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        } else if (!mChecked && !TextUtils.isEmpty(mSummaryOff)) {
217c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            summaryView.setText(mSummaryOff);
218c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            useDefaultSummary = false;
219c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
220c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (useDefaultSummary) {
221c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            final CharSequence summary = getSummary();
222c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            if (!TextUtils.isEmpty(summary)) {
223c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav                summaryView.setText(summary);
224c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav                useDefaultSummary = false;
2256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
2266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
227c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        int newVisibility = View.GONE;
228c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (!useDefaultSummary) {
229c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            // Someone has written to it
230c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            newVisibility = View.VISIBLE;
231c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
232c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        if (newVisibility != summaryView.getVisibility()) {
233c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav            summaryView.setVisibility(newVisibility);
234c67647d83261aad33d42309c52aa75e05ea9daf7Svetoslav        }
2356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
2386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected Parcelable onSaveInstanceState() {
2396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final Parcelable superState = super.onSaveInstanceState();
2406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (isPersistent()) {
2416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            // No need to save instance state since it's persistent
2426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return superState;
2436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        final SavedState myState = new SavedState(superState);
2466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        myState.checked = isChecked();
2476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        return myState;
2486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    @Override
2516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    protected void onRestoreInstanceState(Parcelable state) {
2526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        if (state == null || !state.getClass().equals(SavedState.class)) {
2536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            // Didn't save state for us in onSaveInstanceState
2546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            super.onRestoreInstanceState(state);
2556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            return;
2566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        SavedState myState = (SavedState) state;
2596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        super.onRestoreInstanceState(myState.getSuperState());
2606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        setChecked(myState.checked);
2616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    static class SavedState extends BaseSavedState {
2646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        boolean checked;
2656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        public SavedState(Parcel source) {
2676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            super(source);
2686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            checked = source.readInt() == 1;
2696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        @Override
2726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        public void writeToParcel(Parcel dest, int flags) {
2736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            super.writeToParcel(dest, flags);
2746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            dest.writeInt(checked ? 1 : 0);
2756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        public SavedState(Parcelable superState) {
2786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            super(superState);
2796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        }
2806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
2816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        public static final Parcelable.Creator<SavedState> CREATOR =
2826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                new Parcelable.Creator<SavedState>() {
283dc8e099ed130434c0238f558277c5bcb6a533121Aurimas Liutikas            @Override
2846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            public SavedState createFromParcel(Parcel in) {
2856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                return new SavedState(in);
2866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
2876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler
288dc8e099ed130434c0238f558277c5bcb6a533121Aurimas Liutikas            @Override
2896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            public SavedState[] newArray(int size) {
2906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler                return new SavedState[size];
2916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler            }
2926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler        };
2936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler    }
2946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler}
295