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