TwoStatePreference.java revision be0a4535053bbfdebd215e244b154ac810fd8edc
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.app.Service;
20be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.content.Context;
21be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.content.SharedPreferences;
22be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.content.res.TypedArray;
23be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.os.Parcel;
24be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powellimport android.os.Parcelable;
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;
41be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    private boolean mSendAccessibilityEventViewClickedType;
42be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    private AccessibilityManager mAccessibilityManager;
43be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    private boolean mDisableDependentsState;
44be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
45be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public TwoStatePreference(Context context, AttributeSet attrs, int defStyle) {
46be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        super(context, attrs, defStyle);
47be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
48be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mAccessibilityManager =
49be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                (AccessibilityManager) getContext().getSystemService(Service.ACCESSIBILITY_SERVICE);
50be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
51be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
52be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public TwoStatePreference(Context context, AttributeSet attrs) {
53be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        super(context, attrs);
54be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
55be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mAccessibilityManager =
56be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                (AccessibilityManager) getContext().getSystemService(Service.ACCESSIBILITY_SERVICE);
57be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
58be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
59be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public TwoStatePreference(Context context) {
60be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        super(context);
61be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
62be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mAccessibilityManager =
63be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                (AccessibilityManager) getContext().getSystemService(Service.ACCESSIBILITY_SERVICE);
64be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
65be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
66be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
67be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected void onClick() {
68be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        super.onClick();
69be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
70be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        boolean newValue = !isChecked();
71be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
72be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        // in onBindView() an AccessibilityEventViewClickedType is sent to announce the change
73be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        // not sending
74be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mSendAccessibilityEventViewClickedType = true;
75be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
76be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (!callChangeListener(newValue)) {
77be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            return;
78be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
79be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
80be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setChecked(newValue);
81be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
82be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
83be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
84be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sets the checked state and saves it to the {@link SharedPreferences}.
85be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
86be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param checked The checked state.
87be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
88be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setChecked(boolean checked) {
89be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (mChecked != checked) {
90be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            mChecked = checked;
91be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            persistBoolean(checked);
92be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            notifyDependencyChange(shouldDisableDependents());
93be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            notifyChanged();
94be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
95be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
96be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
97be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
98be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Returns the checked state.
99be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
100be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @return The checked state.
101be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
102be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public boolean isChecked() {
103be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return mChecked;
104be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
105be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
106be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
107be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public boolean shouldDisableDependents() {
108be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        boolean shouldDisable = mDisableDependentsState ? mChecked : !mChecked;
109be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return shouldDisable || super.shouldDisableDependents();
110be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
111be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
112be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
113be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sets the summary to be shown when checked.
114be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
115be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param summary The summary to be shown when checked.
116be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
117be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setSummaryOn(CharSequence summary) {
118be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mSummaryOn = summary;
119be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (isChecked()) {
120be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            notifyChanged();
121be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
122be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
123be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
124be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
125be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @see #setSummaryOn(CharSequence)
126be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param summaryResId The summary as a resource.
127be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
128be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setSummaryOn(int summaryResId) {
129be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setSummaryOn(getContext().getString(summaryResId));
130be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
131be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
132be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
133be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Returns the summary to be shown when checked.
134be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @return The summary.
135be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
136be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public CharSequence getSummaryOn() {
137be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return mSummaryOn;
138be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
139be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
140be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
141be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sets the summary to be shown when unchecked.
142be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
143be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param summary The summary to be shown when unchecked.
144be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
145be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setSummaryOff(CharSequence summary) {
146be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mSummaryOff = summary;
147be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (!isChecked()) {
148be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            notifyChanged();
149be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
150be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
151be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
152be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
153be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @see #setSummaryOff(CharSequence)
154be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param summaryResId The summary as a resource.
155be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
156be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setSummaryOff(int summaryResId) {
157be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setSummaryOff(getContext().getString(summaryResId));
158be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
159be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
160be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
161be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Returns the summary to be shown when unchecked.
162be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @return The summary.
163be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
164be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public CharSequence getSummaryOff() {
165be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return mSummaryOff;
166be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
167be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
168be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
169be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Returns whether dependents are disabled when this preference is on ({@code true})
170be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * or when this preference is off ({@code false}).
171be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
172be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @return Whether dependents are disabled when this preference is on ({@code true})
173be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *         or when this preference is off ({@code false}).
174be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
175be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public boolean getDisableDependentsState() {
176be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return mDisableDependentsState;
177be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
178be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
179be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
180be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sets whether dependents are disabled when this preference is on ({@code true})
181be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * or when this preference is off ({@code false}).
182be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     *
183be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param disableDependentsState The preference state that should disable dependents.
184be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
185be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    public void setDisableDependentsState(boolean disableDependentsState) {
186be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        mDisableDependentsState = disableDependentsState;
187be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
188be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
189be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
190be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected Object onGetDefaultValue(TypedArray a, int index) {
191be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return a.getBoolean(index, false);
192be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
193be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
194be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
195be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
196be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setChecked(restoreValue ? getPersistedBoolean(mChecked)
197be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                : (Boolean) defaultValue);
198be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
199be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
200be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
201be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Send an accessibility event for the given view if appropriate
202be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param view View that should send the event
203be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
204be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    void sendAccessibilityEventForView(View view) {
205be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        // send an event to announce the value change of the state. It is done here
206be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        // because clicking a preference does not immediately change the checked state
207be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        // for example when enabling the WiFi
208be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (mSendAccessibilityEventViewClickedType &&
209be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                mAccessibilityManager.isEnabled() &&
210be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                view.isEnabled()) {
211be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            mSendAccessibilityEventViewClickedType = false;
212be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
213be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            int eventType = AccessibilityEvent.TYPE_VIEW_CLICKED;
214be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            view.sendAccessibilityEventUnchecked(AccessibilityEvent.obtain(eventType));
215be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
216be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
217be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
218be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    /**
219be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * Sync a summary view contained within view's subhierarchy with the correct summary text.
220be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     * @param view View where a summary should be located
221be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell     */
222be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    void syncSummaryView(View view) {
223be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        // Sync the summary view
224be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        TextView summaryView = (TextView) view.findViewById(com.android.internal.R.id.summary);
225be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (summaryView != null) {
226be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            boolean useDefaultSummary = true;
227be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            if (mChecked && mSummaryOn != null) {
228be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                summaryView.setText(mSummaryOn);
229be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                useDefaultSummary = false;
230be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            } else if (!mChecked && mSummaryOff != null) {
231be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                summaryView.setText(mSummaryOff);
232be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                useDefaultSummary = false;
233be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
234be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
235be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            if (useDefaultSummary) {
236be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                final CharSequence summary = getSummary();
237be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                if (summary != null) {
238be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                    summaryView.setText(summary);
239be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                    useDefaultSummary = false;
240be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                }
241be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
242be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
243be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            int newVisibility = View.GONE;
244be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            if (!useDefaultSummary) {
245be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                // Someone has written to it
246be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                newVisibility = View.VISIBLE;
247be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
248be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            if (newVisibility != summaryView.getVisibility()) {
249be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                summaryView.setVisibility(newVisibility);
250be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
251be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
252be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
253be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
254be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
255be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected Parcelable onSaveInstanceState() {
256be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        final Parcelable superState = super.onSaveInstanceState();
257be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (isPersistent()) {
258be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            // No need to save instance state since it's persistent
259be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            return superState;
260be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
261be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
262be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        final SavedState myState = new SavedState(superState);
263be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        myState.checked = isChecked();
264be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        return myState;
265be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
266be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
267be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    @Override
268be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    protected void onRestoreInstanceState(Parcelable state) {
269be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        if (state == null || !state.getClass().equals(SavedState.class)) {
270be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            // Didn't save state for us in onSaveInstanceState
271be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            super.onRestoreInstanceState(state);
272be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            return;
273be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
274be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
275be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        SavedState myState = (SavedState) state;
276be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        super.onRestoreInstanceState(myState.getSuperState());
277be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        setChecked(myState.checked);
278be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
279be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
280be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    static class SavedState extends BaseSavedState {
281be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        boolean checked;
282be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
283be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        public SavedState(Parcel source) {
284be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            super(source);
285be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            checked = source.readInt() == 1;
286be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
287be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
288be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        @Override
289be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        public void writeToParcel(Parcel dest, int flags) {
290be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            super.writeToParcel(dest, flags);
291be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            dest.writeInt(checked ? 1 : 0);
292be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
293be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
294be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        public SavedState(Parcelable superState) {
295be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            super(superState);
296be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        }
297be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
298be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        public static final Parcelable.Creator<SavedState> CREATOR =
299be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                new Parcelable.Creator<SavedState>() {
300be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            public SavedState createFromParcel(Parcel in) {
301be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                return new SavedState(in);
302be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
303be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell
304be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            public SavedState[] newArray(int size) {
305be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell                return new SavedState[size];
306be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell            }
307be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell        };
308be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell    }
309be0a4535053bbfdebd215e244b154ac810fd8edcAdam Powell}
310