Merge "Add implicit parent dependency for Preferences" into klp-dev
diff --git a/api/current.txt b/api/current.txt
index 394acba..5918417 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -18621,6 +18621,7 @@
method protected android.view.View onCreateView(android.view.ViewGroup);
method public void onDependencyChanged(android.preference.Preference, boolean);
method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
+ method public void onParentChanged(android.preference.Preference, boolean);
method protected void onPrepareForRemoval();
method protected void onRestoreInstanceState(android.os.Parcelable);
method protected android.os.Parcelable onSaveInstanceState();
diff --git a/core/java/android/preference/OnDependencyChangeListener.java b/core/java/android/preference/OnDependencyChangeListener.java
deleted file mode 100644
index ce25e34..0000000
--- a/core/java/android/preference/OnDependencyChangeListener.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.preference;
-
-/**
- * Interface definition for a callback to be invoked when this
- * {@link Preference} changes with respect to enabling/disabling
- * dependents.
- */
-interface OnDependencyChangeListener {
- /**
- * Called when this preference has changed in a way that dependents should
- * care to change their state.
- *
- * @param disablesDependent Whether the dependent should be disabled.
- */
- void onDependencyChanged(Preference dependency, boolean disablesDependent);
-}
diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java
index 6c02965..08e3d7b 100644
--- a/core/java/android/preference/Preference.java
+++ b/core/java/android/preference/Preference.java
@@ -77,7 +77,7 @@
* @attr ref android.R.styleable#Preference_defaultValue
* @attr ref android.R.styleable#Preference_shouldDisableView
*/
-public class Preference implements Comparable<Preference>, OnDependencyChangeListener {
+public class Preference implements Comparable<Preference> {
/**
* Specify for {@link #setOrder(int)} if a specific order is not required.
*/
@@ -115,6 +115,7 @@
private String mDependencyKey;
private Object mDefaultValue;
private boolean mDependencyMet = true;
+ private boolean mParentDependencyMet = true;
/**
* @see #setShouldDisableView(boolean)
@@ -733,7 +734,7 @@
* @return True if this Preference is enabled, false otherwise.
*/
public boolean isEnabled() {
- return mEnabled && mDependencyMet;
+ return mEnabled && mDependencyMet && mParentDependencyMet;
}
/**
@@ -1259,7 +1260,24 @@
notifyChanged();
}
}
-
+
+ /**
+ * Called when the implicit parent dependency changes.
+ *
+ * @param parent The Preference that this Preference depends on.
+ * @param disableChild Set true to disable this Preference.
+ */
+ public void onParentChanged(Preference parent, boolean disableChild) {
+ if (mParentDependencyMet == disableChild) {
+ mParentDependencyMet = !disableChild;
+
+ // Enabled state can change dependent preferences' states, so notify
+ notifyDependencyChange(shouldDisableDependents());
+
+ notifyChanged();
+ }
+ }
+
/**
* Checks whether this preference's dependents should currently be
* disabled.
diff --git a/core/java/android/preference/PreferenceCategory.java b/core/java/android/preference/PreferenceCategory.java
index d8af3248..229a96a 100644
--- a/core/java/android/preference/PreferenceCategory.java
+++ b/core/java/android/preference/PreferenceCategory.java
@@ -62,4 +62,8 @@
return false;
}
+ @Override
+ public boolean shouldDisableDependents() {
+ return !super.isEnabled();
+ }
}
diff --git a/core/java/android/preference/PreferenceGroup.java b/core/java/android/preference/PreferenceGroup.java
index f33a6be..a5e05ba 100644
--- a/core/java/android/preference/PreferenceGroup.java
+++ b/core/java/android/preference/PreferenceGroup.java
@@ -290,13 +290,14 @@
}
@Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
-
- // Dispatch to all contained preferences
+ public void notifyDependencyChange(boolean disableDependents) {
+ super.notifyDependencyChange(disableDependents);
+
+ // Child preferences have an implicit dependency on their containing
+ // group. Dispatch dependency change to all contained preferences.
final int preferenceCount = getPreferenceCount();
for (int i = 0; i < preferenceCount; i++) {
- getPreference(i).setEnabled(enabled);
+ getPreference(i).onParentChanged(this, disableDependents);
}
}