PreferenceGroup.java revision 6904f67c96a28a0e5966b4fb6d37a0ad5f136858
16904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/* 26904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Copyright (C) 2015 The Android Open Source Project 36904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 46904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 56904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * you may not use this file except in compliance with the License. 66904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * You may obtain a copy of the License at 76904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 86904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * http://www.apache.org/licenses/LICENSE-2.0 96904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Unless required by applicable law or agreed to in writing, software 116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * See the License for the specific language governing permissions and 146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * limitations under the License 156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpackage android.support.v7.preference; 186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.Context; 206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.res.TypedArray; 216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.os.Bundle; 226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.text.TextUtils; 236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.util.AttributeSet; 246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport java.util.ArrayList; 266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport java.util.Collections; 276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport java.util.List; 286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/** 306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * A container for multiple 316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * {@link Preference} objects. It is a base class for Preference objects that are 326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * parents, such as {@link PreferenceCategory} and {@link PreferenceScreen}. 336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <div class="special reference"> 356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <h3>Developer Guides</h3> 366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p>For information about building a settings UI with Preferences, 376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * read the <a href="{@docRoot}guide/topics/ui/settings.html">Settings</a> 386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * guide.</p> 396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * </div> 406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#PreferenceGroup_orderingFromXml 426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic abstract class PreferenceGroup extends Preference { 446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * The container for child {@link Preference}s. This is sorted based on the 466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * ordering, please use {@link #addPreference(Preference)} instead of adding 476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * to this directly. 486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private List<Preference> mPreferenceList; 506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private boolean mOrderingAsAdded = true; 526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private int mCurrentPreferenceOrder = 0; 546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private boolean mAttachedToActivity = false; 566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler super(context, attrs, defStyleAttr, defStyleRes); 596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mPreferenceList = new ArrayList<>(); 616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final TypedArray a = context.obtainStyledAttributes( 636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler attrs, R.styleable.PreferenceGroup, defStyleAttr, defStyleRes); 646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mOrderingAsAdded = a.getBoolean(R.styleable.PreferenceGroup_orderingFromXml, 656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mOrderingAsAdded); 666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler a.recycle(); 676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr) { 706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler this(context, attrs, defStyleAttr, 0); 716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public PreferenceGroup(Context context, AttributeSet attrs) { 746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler this(context, attrs, 0); 756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Whether to order the {@link Preference} children of this group as they 796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * are added. If this is false, the ordering will follow each Preference 806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * order and default to alphabetic for those without an order. 816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p> 826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * If this is called after preferences are added, they will not be 836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * re-ordered in the order they were added, hence call this method early on. 846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param orderingAsAdded Whether to order according to the order added. 866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @see Preference#setOrder(int) 876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void setOrderingAsAdded(boolean orderingAsAdded) { 896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mOrderingAsAdded = orderingAsAdded; 906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Whether this group is ordering preferences in the order they are added. 946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return Whether this group orders based on the order the children are added. 966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @see #setOrderingAsAdded(boolean) 976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public boolean isOrderingAsAdded() { 996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return mOrderingAsAdded; 1006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Called by the inflater to add an item to this group. 1046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void addItemFromInflater(Preference preference) { 1066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler addPreference(preference); 1076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Returns the number of children {@link Preference}s. 1116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return The number of preference children in this group. 1126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public int getPreferenceCount() { 1146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return mPreferenceList.size(); 1156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Returns the {@link Preference} at a particular index. 1196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param index The index of the {@link Preference} to retrieve. 1216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return The {@link Preference}. 1226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public Preference getPreference(int index) { 1246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return mPreferenceList.get(index); 1256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Adds a {@link Preference} at the correct position based on the 1296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * preference's order. 1306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param preference The preference to add. 1326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return Whether the preference is now in this group. 1336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public boolean addPreference(Preference preference) { 1356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (mPreferenceList.contains(preference)) { 1366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // Exists 1376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return true; 1386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (preference.getOrder() == DEFAULT_ORDER) { 1416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (mOrderingAsAdded) { 1426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler preference.setOrder(mCurrentPreferenceOrder++); 1436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (preference instanceof PreferenceGroup) { 1466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // TODO: fix (method is called tail recursively when inflating, 1476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // so we won't end up properly passing this flag down to children 1486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler ((PreferenceGroup)preference).setOrderingAsAdded(mOrderingAsAdded); 1496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler int insertionIndex = Collections.binarySearch(mPreferenceList, preference); 1536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (insertionIndex < 0) { 1546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler insertionIndex = insertionIndex * -1 - 1; 1556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (!onPrepareAddPreference(preference)) { 1586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return false; 1596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler synchronized(this) { 1626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mPreferenceList.add(insertionIndex, preference); 1636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler preference.onAttachedToHierarchy(getPreferenceManager()); 1666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (mAttachedToActivity) { 1686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler preference.onAttached(); 1696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler notifyHierarchyChanged(); 1726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return true; 1746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Removes a {@link Preference} from this group. 1786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param preference The preference to remove. 1806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return Whether the preference was found and removed. 1816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public boolean removePreference(Preference preference) { 1836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final boolean returnValue = removePreferenceInt(preference); 1846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler notifyHierarchyChanged(); 1856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return returnValue; 1866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private boolean removePreferenceInt(Preference preference) { 1896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler synchronized(this) { 1906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler preference.onPrepareForRemoval(); 1916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return mPreferenceList.remove(preference); 1926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Removes all {@link Preference Preferences} from this group. 1976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void removeAll() { 1996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler synchronized(this) { 2006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler List<Preference> preferenceList = mPreferenceList; 2016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler for (int i = preferenceList.size() - 1; i >= 0; i--) { 2026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler removePreferenceInt(preferenceList.get(0)); 2036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler notifyHierarchyChanged(); 2066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 2096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Prepares a {@link Preference} to be added to the group. 2106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 2116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param preference The preference to add. 2126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return Whether to allow adding the preference (true), or not (false). 2136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 2146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler protected boolean onPrepareAddPreference(Preference preference) { 2156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler preference.onParentChanged(this, shouldDisableDependents()); 2166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return true; 2176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 2206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Finds a {@link Preference} based on its key. If two {@link Preference} 2216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * share the same key (not recommended), the first to appear will be 2226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * returned (to retrieve the other preference with the same key, call this 2236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * method on the first preference). If this preference has the key, it will 2246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * not be returned. 2256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p> 2266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This will recursively search for the preference into children that are 2276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * also {@link PreferenceGroup PreferenceGroups}. 2286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 2296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param key The key of the preference to retrieve. 2306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return The {@link Preference} with the key, or null. 2316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 2326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public Preference findPreference(CharSequence key) { 2336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (TextUtils.equals(getKey(), key)) { 2346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return this; 2356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final int preferenceCount = getPreferenceCount(); 2376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler for (int i = 0; i < preferenceCount; i++) { 2386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final Preference preference = getPreference(i); 2396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final String curKey = preference.getKey(); 2406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (curKey != null && curKey.equals(key)) { 2426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return preference; 2436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (preference instanceof PreferenceGroup) { 2466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final Preference returnedPreference = ((PreferenceGroup)preference) 2476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler .findPreference(key); 2486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (returnedPreference != null) { 2496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return returnedPreference; 2506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return null; 2556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 2586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Whether this preference group should be shown on the same screen as its 2596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * contained preferences. 2606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 2616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return True if the contained preferences should be shown on the same 2626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * screen as this preference. 2636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 2646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler protected boolean isOnSameScreenAsChildren() { 2656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return true; 2666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler @Override 2696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler protected void onAttached() { 2706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler super.onAttached(); 2716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // Mark as attached so if a preference is later added to this group, we 2736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // can tell it we are already attached 2746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mAttachedToActivity = true; 2756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // Dispatch to all contained preferences 2776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final int preferenceCount = getPreferenceCount(); 2786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler for (int i = 0; i < preferenceCount; i++) { 2796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler getPreference(i).onAttached(); 2806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler @Override 2846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler protected void onPrepareForRemoval() { 2856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler super.onPrepareForRemoval(); 2866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // We won't be attached to the activity anymore 2886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mAttachedToActivity = false; 2896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler @Override 2926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void notifyDependencyChange(boolean disableDependents) { 2936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler super.notifyDependencyChange(disableDependents); 2946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // Child preferences have an implicit dependency on their containing 2966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // group. Dispatch dependency change to all contained preferences. 2976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final int preferenceCount = getPreferenceCount(); 2986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler for (int i = 0; i < preferenceCount; i++) { 2996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler getPreference(i).onParentChanged(this, disableDependents); 3006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 3016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 3026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 3036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler void sortPreferences() { 3046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler synchronized (this) { 3056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler Collections.sort(mPreferenceList); 3066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 3076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 3086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 3096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler @Override 3106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler protected void dispatchSaveInstanceState(Bundle container) { 3116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler super.dispatchSaveInstanceState(container); 3126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 3136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // Dispatch to all contained preferences 3146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final int preferenceCount = getPreferenceCount(); 3156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler for (int i = 0; i < preferenceCount; i++) { 3166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler getPreference(i).dispatchSaveInstanceState(container); 3176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 3186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 3196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 3206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler @Override 3216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler protected void dispatchRestoreInstanceState(Bundle container) { 3226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler super.dispatchRestoreInstanceState(container); 3236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 3246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // Dispatch to all contained preferences 3256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final int preferenceCount = getPreferenceCount(); 3266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler for (int i = 0; i < preferenceCount; i++) { 3276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler getPreference(i).dispatchRestoreInstanceState(container); 3286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 3296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 3306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 3316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler} 332