1be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell/*
2be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Copyright (C) 2010 The Android Open Source Project
3be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell *
4be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * you may not use this file except in compliance with the License.
6be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * You may obtain a copy of the License at
7be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell *
8be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell *
10be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Unless required by applicable law or agreed to in writing, software
11be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * See the License for the specific language governing permissions and
14be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * limitations under the License.
15be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */
16be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
17be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellpackage android.preference;
18be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
19be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.content.Context;
20be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.content.SharedPreferences;
21be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.content.res.TypedArray;
22be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.os.Parcel;
23be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.os.Parcelable;
24be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.util.AttributeSet;
25be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.view.View;
26be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.view.accessibility.AccessibilityEvent;
27be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.view.accessibility.AccessibilityManager;
28be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.widget.TextView;
29be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
30be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell/**
31be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * Common base class for preferences that have two selectable states, persist a
32be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * boolean value in SharedPreferences, and may have dependent preferences that are
33be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell * enabled/disabled based on the current state.
34be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell */
35be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellpublic abstract class TwoStatePreference extends Preference {
36be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
37be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    private CharSequence mSummaryOn;
38be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    private CharSequence mSummaryOff;
39be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    boolean mChecked;
40c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell    private boolean mCheckedSet;
417650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov    private boolean mSendClickAccessibilityEvent;
42be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    private boolean mDisableDependentsState;
43be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
445c3ea06a7a5558509545450ccc465d695bd1a2e6Svetoslav Ganov
45be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public TwoStatePreference(Context context, AttributeSet attrs, int defStyle) {
46be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        super(context, attrs, defStyle);
47be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
48be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
49be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public TwoStatePreference(Context context, AttributeSet attrs) {
505c3ea06a7a5558509545450ccc465d695bd1a2e6Svetoslav Ganov        this(context, attrs, 0);
51be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
52be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
53be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public TwoStatePreference(Context context) {
545c3ea06a7a5558509545450ccc465d695bd1a2e6Svetoslav Ganov        this(context, null);
55be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
56be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
57be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
58be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected void onClick() {
59be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        super.onClick();
60be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
61be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        boolean newValue = !isChecked();
62be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
637650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov        mSendClickAccessibilityEvent = true;
64be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
65be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (!callChangeListener(newValue)) {
66be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            return;
67be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
68be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
69be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setChecked(newValue);
70be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
71be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
72be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
73be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sets the checked state and saves it to the {@link SharedPreferences}.
74be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
75be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param checked The checked state.
76be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
77be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setChecked(boolean checked) {
78c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell        // Always persist/notify the first time; don't assume the field's default of false.
79c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell        final boolean changed = mChecked != checked;
80c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell        if (changed || !mCheckedSet) {
81be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            mChecked = checked;
82c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell            mCheckedSet = true;
83be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            persistBoolean(checked);
84c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell            if (changed) {
85c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell                notifyDependencyChange(shouldDisableDependents());
86c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell                notifyChanged();
87c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6Adam Powell            }
88be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
89be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
90be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
91be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
92be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Returns the checked state.
93be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
94be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @return The checked state.
95be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
96be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public boolean isChecked() {
97be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return mChecked;
98be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
99be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
100be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
101be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public boolean shouldDisableDependents() {
102be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        boolean shouldDisable = mDisableDependentsState ? mChecked : !mChecked;
103be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return shouldDisable || super.shouldDisableDependents();
104be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
105be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
106be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
107be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sets the summary to be shown when checked.
108be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
109be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param summary The summary to be shown when checked.
110be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
111be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setSummaryOn(CharSequence summary) {
112be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mSummaryOn = summary;
113be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (isChecked()) {
114be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            notifyChanged();
115be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
116be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
117be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
118be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
119be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @see #setSummaryOn(CharSequence)
120be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param summaryResId The summary as a resource.
121be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
122be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setSummaryOn(int summaryResId) {
123be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setSummaryOn(getContext().getString(summaryResId));
124be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
125be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
126be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
127be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Returns the summary to be shown when checked.
128be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @return The summary.
129be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
130be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public CharSequence getSummaryOn() {
131be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return mSummaryOn;
132be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
133be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
134be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
135be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sets the summary to be shown when unchecked.
136be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
137be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param summary The summary to be shown when unchecked.
138be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
139be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setSummaryOff(CharSequence summary) {
140be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mSummaryOff = summary;
141be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (!isChecked()) {
142be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            notifyChanged();
143be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
144be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
145be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
146be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
147be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @see #setSummaryOff(CharSequence)
148be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param summaryResId The summary as a resource.
149be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
150be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setSummaryOff(int summaryResId) {
151be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setSummaryOff(getContext().getString(summaryResId));
152be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
153be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
154be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
155be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Returns the summary to be shown when unchecked.
156be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @return The summary.
157be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
158be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public CharSequence getSummaryOff() {
159be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return mSummaryOff;
160be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
161be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
162be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
163be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Returns whether dependents are disabled when this preference is on ({@code true})
164be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * or when this preference is off ({@code false}).
165be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
166be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @return Whether dependents are disabled when this preference is on ({@code true})
167be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *         or when this preference is off ({@code false}).
168be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
169be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public boolean getDisableDependentsState() {
170be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return mDisableDependentsState;
171be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
172be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
173be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
174be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sets whether dependents are disabled when this preference is on ({@code true})
175be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * or when this preference is off ({@code false}).
176be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
177be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param disableDependentsState The preference state that should disable dependents.
178be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
179be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setDisableDependentsState(boolean disableDependentsState) {
180be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mDisableDependentsState = disableDependentsState;
181be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
182be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
183be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
184be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected Object onGetDefaultValue(TypedArray a, int index) {
185be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return a.getBoolean(index, false);
186be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
187be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
188be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
189be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
190be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setChecked(restoreValue ? getPersistedBoolean(mChecked)
191be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                : (Boolean) defaultValue);
192be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
193be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
1947650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov    void sendAccessibilityEvent(View view) {
1957650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov        // Since the view is still not attached we create, populate,
1967650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov        // and send the event directly since we do not know when it
1977650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov        // will be attached and posting commands is not as clean.
1987650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov        AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(getContext());
1997650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov        if (mSendClickAccessibilityEvent && accessibilityManager.isEnabled()) {
2007650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov            AccessibilityEvent event = AccessibilityEvent.obtain();
2017650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov            event.setEventType(AccessibilityEvent.TYPE_VIEW_CLICKED);
2027650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov            view.onInitializeAccessibilityEvent(event);
2037650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov            view.dispatchPopulateAccessibilityEvent(event);
2047650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov            accessibilityManager.sendAccessibilityEvent(event);
205be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
2067650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov        mSendClickAccessibilityEvent = false;
207be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
208be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
209be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
210be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sync a summary view contained within view's subhierarchy with the correct summary text.
211be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param view View where a summary should be located
212be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
213be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    void syncSummaryView(View view) {
214be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        // Sync the summary view
215be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        TextView summaryView = (TextView) view.findViewById(com.android.internal.R.id.summary);
216be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (summaryView != null) {
217be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            boolean useDefaultSummary = true;
218be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            if (mChecked && mSummaryOn != null) {
219be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                summaryView.setText(mSummaryOn);
220be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                useDefaultSummary = false;
221be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            } else if (!mChecked && mSummaryOff != null) {
222be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                summaryView.setText(mSummaryOff);
223be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                useDefaultSummary = false;
224be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
225be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
226be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            if (useDefaultSummary) {
227be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                final CharSequence summary = getSummary();
228be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                if (summary != null) {
229be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                    summaryView.setText(summary);
230be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                    useDefaultSummary = false;
231be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                }
232be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
233be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
234be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            int newVisibility = View.GONE;
235be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            if (!useDefaultSummary) {
236be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                // Someone has written to it
237be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                newVisibility = View.VISIBLE;
238be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
239be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            if (newVisibility != summaryView.getVisibility()) {
240be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                summaryView.setVisibility(newVisibility);
241be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
242be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
243be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
244be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
245be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
246be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected Parcelable onSaveInstanceState() {
247be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        final Parcelable superState = super.onSaveInstanceState();
248be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (isPersistent()) {
249be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            // No need to save instance state since it's persistent
250be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            return superState;
251be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
252be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
253be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        final SavedState myState = new SavedState(superState);
254be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        myState.checked = isChecked();
255be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return myState;
256be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
257be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
258be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
259be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected void onRestoreInstanceState(Parcelable state) {
260be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (state == null || !state.getClass().equals(SavedState.class)) {
261be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            // Didn't save state for us in onSaveInstanceState
262be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            super.onRestoreInstanceState(state);
263be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            return;
264be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
265be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
266be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        SavedState myState = (SavedState) state;
267be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        super.onRestoreInstanceState(myState.getSuperState());
268be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setChecked(myState.checked);
269be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
270be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
271be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    static class SavedState extends BaseSavedState {
272be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        boolean checked;
273be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
274be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        public SavedState(Parcel source) {
275be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            super(source);
276be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            checked = source.readInt() == 1;
277be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
278be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
279be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        @Override
280be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        public void writeToParcel(Parcel dest, int flags) {
281be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            super.writeToParcel(dest, flags);
282be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            dest.writeInt(checked ? 1 : 0);
283be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
284be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
285be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        public SavedState(Parcelable superState) {
286be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            super(superState);
287be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
288be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
289be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        public static final Parcelable.Creator<SavedState> CREATOR =
290be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                new Parcelable.Creator<SavedState>() {
291be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            public SavedState createFromParcel(Parcel in) {
292be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                return new SavedState(in);
293be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
294be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
295be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            public SavedState[] newArray(int size) {
296be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                return new SavedState[size];
297be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
298be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        };
299be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
300be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell}
301