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