19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.preference; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A container for multiple 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Preference} objects. It is a base class for Preference objects that are 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parents, such as {@link PreferenceCategory} and {@link PreferenceScreen}. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 36cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <div class="special reference"> 37cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <h3>Developer Guides</h3> 38cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <p>For information about building a settings UI with Preferences, 39cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * read the <a href="{@docRoot}guide/topics/ui/settings.html">Settings</a> 40cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * guide.</p> 41cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * </div> 42cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#PreferenceGroup_orderingFromXml 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class PreferenceGroup extends Preference implements GenericInflater.Parent<Preference> { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The container for child {@link Preference}s. This is sorted based on the 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ordering, please use {@link #addPreference(Preference)} instead of adding 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to this directly. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<Preference> mPreferenceList; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOrderingAsAdded = true; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCurrentPreferenceOrder = 0; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mAttachedToActivity = false; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PreferenceGroup(Context context, AttributeSet attrs, int defStyle) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferenceList = new ArrayList<Preference>(); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.PreferenceGroup, defStyle, 0); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderingAsAdded = a.getBoolean(com.android.internal.R.styleable.PreferenceGroup_orderingFromXml, 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderingAsAdded); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PreferenceGroup(Context context, AttributeSet attrs) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, 0); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether to order the {@link Preference} children of this group as they 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are added. If this is false, the ordering will follow each Preference 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * order and default to alphabetic for those without an order. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this is called after preferences are added, they will not be 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * re-ordered in the order they were added, hence call this method early on. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param orderingAsAdded Whether to order according to the order added. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Preference#setOrder(int) 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOrderingAsAdded(boolean orderingAsAdded) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderingAsAdded = orderingAsAdded; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether this group is ordering preferences in the order they are added. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether this group orders based on the order the children are added. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setOrderingAsAdded(boolean) 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOrderingAsAdded() { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOrderingAsAdded; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by the inflater to add an item to this group. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addItemFromInflater(Preference preference) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPreference(preference); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of children {@link Preference}s. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The number of preference children in this group. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPreferenceCount() { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceList.size(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the {@link Preference} at a particular index. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The index of the {@link Preference} to retrieve. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link Preference}. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Preference getPreference(int index) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceList.get(index); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a {@link Preference} at the correct position based on the 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preference's order. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preference The preference to add. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the preference is now in this group. 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean addPreference(Preference preference) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceList.contains(preference)) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Exists 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preference.getOrder() == Preference.DEFAULT_ORDER) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOrderingAsAdded) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preference.setOrder(mCurrentPreferenceOrder++); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preference instanceof PreferenceGroup) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: fix (method is called tail recursively when inflating, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we won't end up properly passing this flag down to children 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((PreferenceGroup)preference).setOrderingAsAdded(mOrderingAsAdded); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int insertionIndex = Collections.binarySearch(mPreferenceList, preference); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (insertionIndex < 0) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project insertionIndex = insertionIndex * -1 - 1; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!onPrepareAddPreference(preference)) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferenceList.add(insertionIndex, preference); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preference.onAttachedToHierarchy(getPreferenceManager()); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAttachedToActivity) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preference.onAttachedToActivity(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyHierarchyChanged(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes a {@link Preference} from this group. 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preference The preference to remove. 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the preference was found and removed. 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean removePreference(Preference preference) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean returnValue = removePreferenceInt(preference); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyHierarchyChanged(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return returnValue; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean removePreferenceInt(Preference preference) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preference.onPrepareForRemoval(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceList.remove(preference); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes all {@link Preference Preferences} from this group. 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAll() { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<Preference> preferenceList = mPreferenceList; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = preferenceList.size() - 1; i >= 0; i--) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removePreferenceInt(preferenceList.get(0)); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyHierarchyChanged(); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Prepares a {@link Preference} to be added to the group. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preference The preference to add. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether to allow adding the preference (true), or not (false). 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onPrepareAddPreference(Preference preference) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!super.isEnabled()) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preference.setEnabled(false); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finds a {@link Preference} based on its key. If two {@link Preference} 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * share the same key (not recommended), the first to appear will be 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned (to retrieve the other preference with the same key, call this 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method on the first preference). If this preference has the key, it will 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be returned. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This will recursively search for the preference into children that are 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also {@link PreferenceGroup PreferenceGroups}. 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key The key of the preference to retrieve. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link Preference} with the key, or null. 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Preference findPreference(CharSequence key) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TextUtils.equals(getKey(), key)) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int preferenceCount = getPreferenceCount(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < preferenceCount; i++) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Preference preference = getPreference(i); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String curKey = preference.getKey(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curKey != null && curKey.equals(key)) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return preference; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preference instanceof PreferenceGroup) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Preference returnedPreference = ((PreferenceGroup)preference) 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .findPreference(key); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (returnedPreference != null) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return returnedPreference; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether this preference group should be shown on the same screen as its 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained preferences. 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the contained preferences should be shown on the same 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * screen as this preference. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean isOnSameScreenAsChildren() { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onAttachedToActivity() { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onAttachedToActivity(); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Mark as attached so if a preference is later added to this group, we 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can tell it we are already attached 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAttachedToActivity = true; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dispatch to all contained preferences 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int preferenceCount = getPreferenceCount(); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < preferenceCount; i++) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPreference(i).onAttachedToActivity(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onPrepareForRemoval() { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onPrepareForRemoval(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We won't be attached to the activity anymore 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAttachedToActivity = false; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEnabled(boolean enabled) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setEnabled(enabled); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dispatch to all contained preferences 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int preferenceCount = getPreferenceCount(); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < preferenceCount; i++) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPreference(i).setEnabled(enabled); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void sortPreferences() { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(mPreferenceList); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchSaveInstanceState(Bundle container) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchSaveInstanceState(container); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dispatch to all contained preferences 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int preferenceCount = getPreferenceCount(); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < preferenceCount; i++) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPreference(i).dispatchSaveInstanceState(container); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchRestoreInstanceState(Bundle container) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchRestoreInstanceState(container); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dispatch to all contained preferences 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int preferenceCount = getPreferenceCount(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < preferenceCount; i++) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPreference(i).dispatchRestoreInstanceState(container); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 332