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();
+++ /dev/null
-/*
- * 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);
-}
* @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.
*/
private String mDependencyKey;
private Object mDefaultValue;
private boolean mDependencyMet = true;
+ private boolean mParentDependencyMet = true;
/**
* @see #setShouldDisableView(boolean)
* @return True if this Preference is enabled, false otherwise.
*/
public boolean isEnabled() {
- return mEnabled && mDependencyMet;
+ return mEnabled && mDependencyMet && mParentDependencyMet;
}
/**
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.
return false;
}
+ @Override
+ public boolean shouldDisableDependents() {
+ return !super.isEnabled();
+ }
}
}
@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);
}
}