From c1b07211b8a2a1eebefa8e5403ca7b2c6ccdccc6 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Fri, 10 Aug 2012 14:20:14 -0700 Subject: [PATCH] Don't assume a default of 'false' for TwoStatePreference TwoStatePreference would treat a default value of false as having no effect since it matched the initial value of the internal field. This caused asymmetric behavior around persistence and listener notification when the default was true (persisted) vs. false (not persisted). Standard behavior for most Preferences is to persist the default value. Make TwoStatePreference (CheckBoxPreference and SwitchPreference) follow this pattern. Bug 5722690 Change-Id: I8b3cf55efc5dfd573b511913b48ced017f0432d8 --- core/java/android/preference/TwoStatePreference.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/java/android/preference/TwoStatePreference.java b/core/java/android/preference/TwoStatePreference.java index d186b203a156f..c6498791997cd 100644 --- a/core/java/android/preference/TwoStatePreference.java +++ b/core/java/android/preference/TwoStatePreference.java @@ -37,6 +37,7 @@ public abstract class TwoStatePreference extends Preference { private CharSequence mSummaryOn; private CharSequence mSummaryOff; boolean mChecked; + private boolean mCheckedSet; private boolean mSendClickAccessibilityEvent; private boolean mDisableDependentsState; @@ -74,11 +75,16 @@ public abstract class TwoStatePreference extends Preference { * @param checked The checked state. */ public void setChecked(boolean checked) { - if (mChecked != checked) { + // Always persist/notify the first time; don't assume the field's default of false. + final boolean changed = mChecked != checked; + if (changed || !mCheckedSet) { mChecked = checked; + mCheckedSet = true; persistBoolean(checked); - notifyDependencyChange(shouldDisableDependents()); - notifyChanged(); + if (changed) { + notifyDependencyChange(shouldDisableDependents()); + notifyChanged(); + } } }