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