1package com.android.settingslib.core; 2 3import android.content.Context; 4import android.support.v7.preference.Preference; 5import android.support.v7.preference.PreferenceGroup; 6import android.support.v7.preference.PreferenceScreen; 7import java.util.List; 8 9/** 10 * A controller that manages event for preference. 11 */ 12public abstract class AbstractPreferenceController { 13 14 protected final Context mContext; 15 16 public AbstractPreferenceController(Context context) { 17 mContext = context; 18 } 19 20 /** 21 * Displays preference in this controller. 22 */ 23 public void displayPreference(PreferenceScreen screen) { 24 if (isAvailable()) { 25 if (this instanceof Preference.OnPreferenceChangeListener) { 26 final Preference preference = screen.findPreference(getPreferenceKey()); 27 preference.setOnPreferenceChangeListener( 28 (Preference.OnPreferenceChangeListener) this); 29 } 30 } else { 31 removePreference(screen, getPreferenceKey()); 32 } 33 } 34 35 /** 36 * Updates the current status of preference (summary, switch state, etc) 37 */ 38 public void updateState(Preference preference) { 39 40 } 41 42 /** 43 * Updates non-indexable keys for search provider. 44 * 45 * Called by SearchIndexProvider#getNonIndexableKeys 46 */ 47 public void updateNonIndexableKeys(List<String> keys) { 48 if (!isAvailable()) { 49 keys.add(getPreferenceKey()); 50 } 51 } 52 53 /** 54 * Returns true if preference is available (should be displayed) 55 */ 56 public abstract boolean isAvailable(); 57 58 /** 59 * Handles preference tree click 60 * 61 * @param preference the preference being clicked 62 * @return true if click is handled 63 */ 64 public boolean handlePreferenceTreeClick(Preference preference) { 65 return false; 66 } 67 68 /** 69 * Returns the key for this preference. 70 */ 71 public abstract String getPreferenceKey(); 72 73 /** 74 * Removes preference from screen. 75 */ 76 protected final void removePreference(PreferenceScreen screen, String key) { 77 findAndRemovePreference(screen, key); 78 } 79 80 // finds the preference recursively and removes it from its parent 81 private boolean findAndRemovePreference(PreferenceGroup prefGroup, String key) { 82 final int preferenceCount = prefGroup.getPreferenceCount(); 83 for (int i = 0; i < preferenceCount; i++) { 84 final Preference preference = prefGroup.getPreference(i); 85 final String curKey = preference.getKey(); 86 87 if (curKey != null && curKey.equals(key)) { 88 return prefGroup.removePreference(preference); 89 } 90 91 if (preference instanceof PreferenceGroup) { 92 if (findAndRemovePreference((PreferenceGroup) preference, key)) { 93 return true; 94 } 95 } 96 } 97 return false; 98 } 99 100} 101