package org.holoeverywhere.preference; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.holoeverywhere.internal.GenericInflater; import com.actionbarsherlock.R; import android.content.Context; import android.content.res.TypedArray; import android.os.Bundle; import android.text.TextUtils; import android.util.AttributeSet; public abstract class PreferenceGroup extends Preference implements GenericInflater.Parent<Preference> { private boolean mAttachedToActivity = false; private int mCurrentPreferenceOrder = 0; private boolean mOrderingAsAdded = true; private List<Preference> mPreferenceList; public PreferenceGroup(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PreferenceGroup(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); context = getContext(); mPreferenceList = new ArrayList<Preference>(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PreferenceGroup, defStyle, 0); mOrderingAsAdded = a.getBoolean( R.styleable.PreferenceGroup_orderingFromXml, mOrderingAsAdded); a.recycle(); } @Override public void addItemFromInflater(Preference preference) { addPreference(preference); } public boolean addPreference(Preference preference) { if (mPreferenceList.contains(preference)) { // Exists return true; } if (preference.getOrder() == Preference.DEFAULT_ORDER) { if (mOrderingAsAdded) { preference.setOrder(mCurrentPreferenceOrder++); } if (preference instanceof PreferenceGroup) { ((PreferenceGroup) preference) .setOrderingAsAdded(mOrderingAsAdded); } } int insertionIndex = Collections.binarySearch(mPreferenceList, preference); if (insertionIndex < 0) { insertionIndex = insertionIndex * -1 - 1; } if (!onPrepareAddPreference(preference)) { return false; } synchronized (this) { mPreferenceList.add(insertionIndex, preference); } preference.onAttachedToHierarchy(getPreferenceManager()); if (mAttachedToActivity) { preference.onAttachedToActivity(); } notifyHierarchyChanged(); return true; } @Override protected void dispatchRestoreInstanceState(Bundle container) { super.dispatchRestoreInstanceState(container); final int preferenceCount = getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { getPreference(i).dispatchRestoreInstanceState(container); } } @Override protected void dispatchSaveInstanceState(Bundle container) { super.dispatchSaveInstanceState(container); final int preferenceCount = getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { getPreference(i).dispatchSaveInstanceState(container); } } public Preference findPreference(CharSequence key) { if (TextUtils.equals(getKey(), key)) { return this; } final int preferenceCount = getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { final Preference preference = getPreference(i); final String curKey = preference.getKey(); if (curKey != null && curKey.equals(key)) { return preference; } if (preference instanceof PreferenceGroup) { final Preference returnedPreference = ((PreferenceGroup) preference) .findPreference(key); if (returnedPreference != null) { return returnedPreference; } } } return null; } public Preference findPreference(int id) { if (getResId() == id) { return this; } final int preferenceCount = getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { final Preference preference = getPreference(i); final int curId = preference.getResId(); if (curId > 0 && curId == id) { return preference; } if (preference instanceof PreferenceGroup) { final Preference returnedPreference = ((PreferenceGroup) preference) .findPreference(id); if (returnedPreference != null) { return returnedPreference; } } } return null; } public Preference getPreference(int index) { return mPreferenceList.get(index); } public int getPreferenceCount() { return mPreferenceList.size(); } protected boolean isOnSameScreenAsChildren() { return true; } public boolean isOrderingAsAdded() { return mOrderingAsAdded; } @Override protected void onAttachedToActivity() { super.onAttachedToActivity(); mAttachedToActivity = true; final int preferenceCount = getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { getPreference(i).onAttachedToActivity(); } } protected boolean onPrepareAddPreference(Preference preference) { if (!super.isEnabled()) { preference.setEnabled(false); } return true; } @Override protected void onPrepareForRemoval() { super.onPrepareForRemoval(); mAttachedToActivity = false; } public void removeAll() { synchronized (this) { List<Preference> preferenceList = mPreferenceList; for (int i = preferenceList.size() - 1; i >= 0; i--) { removePreferenceInt(preferenceList.get(0)); } } notifyHierarchyChanged(); } public boolean removePreference(Preference preference) { final boolean returnValue = removePreferenceInt(preference); notifyHierarchyChanged(); return returnValue; } private boolean removePreferenceInt(Preference preference) { synchronized (this) { preference.onPrepareForRemoval(); return mPreferenceList.remove(preference); } } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); final int preferenceCount = getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { getPreference(i).setEnabled(enabled); } } public void setOrderingAsAdded(boolean orderingAsAdded) { mOrderingAsAdded = orderingAsAdded; } void sortPreferences() { synchronized (this) { Collections.sort(mPreferenceList); } } }