private int mCameraId = -1;
private AppController mAppController;
+ /**
+ * A List of OnSettingChangedListener's, maintained
+ * to compare to new listeners and prevent duplicate
+ * registering.
+ */
+ private final List<OnSettingChangedListener>
+ mListeners = new ArrayList<OnSettingChangedListener>();
+
+ /**
+ * A List of OnSharedPreferenceChangeListener's, maintained
+ * to hold pointers to actually registered listeners,
+ * so they can be unregistered.
+ */
private final List<OnSharedPreferenceChangeListener>
- mSharedPreferenceListeners =
- new ArrayList<OnSharedPreferenceChangeListener>();
+ mSharedPreferenceListeners = new ArrayList<OnSharedPreferenceChangeListener>();
public SettingsManager(Context context, AppController app, int nCameras) {
mContext = context;
String cameraKey = mContext.getPackageName() + "_preferences_" + cameraId;
mCameraSettings = mContext.getSharedPreferences(
cameraKey, Context.MODE_PRIVATE);
+
for (OnSharedPreferenceChangeListener listener : mSharedPreferenceListeners) {
mCameraSettings.registerOnSharedPreferenceChangeListener(listener);
}
throw new IllegalArgumentException("OnSettingChangedListener cannot be null.");
}
+ if (mListeners.contains(listener)) {
+ return;
+ }
+
+ mListeners.add(listener);
OnSharedPreferenceChangeListener sharedPreferenceListener =
getSharedPreferenceListener(listener);
+ mSharedPreferenceListeners.add(sharedPreferenceListener);
- if (!mSharedPreferenceListeners.contains(sharedPreferenceListener)) {
- mSharedPreferenceListeners.add(sharedPreferenceListener);
-
- if (mGlobalSettings != null) {
- mGlobalSettings.registerOnSharedPreferenceChangeListener(sharedPreferenceListener);
- }
+ if (mGlobalSettings != null) {
+ mGlobalSettings.registerOnSharedPreferenceChangeListener(sharedPreferenceListener);
+ }
- if (mCameraSettings != null) {
- mCameraSettings.registerOnSharedPreferenceChangeListener(sharedPreferenceListener);
- }
+ if (mCameraSettings != null) {
+ mCameraSettings.registerOnSharedPreferenceChangeListener(sharedPreferenceListener);
+ }
- if (mDefaultSettings != null) {
- mDefaultSettings.registerOnSharedPreferenceChangeListener(sharedPreferenceListener);
- }
+ if (mDefaultSettings != null) {
+ mDefaultSettings.registerOnSharedPreferenceChangeListener(sharedPreferenceListener);
}
}
throw new IllegalArgumentException();
}
- OnSharedPreferenceChangeListener sharedPreferenceListener =
- getSharedPreferenceListener(listener);
+ if (!mListeners.contains(listener)) {
+ return;
+ }
- if (mSharedPreferenceListeners.contains(sharedPreferenceListener)) {
- mSharedPreferenceListeners.remove(sharedPreferenceListener);
+ int index = mListeners.indexOf(listener);
+ mListeners.remove(listener);
- if (mGlobalSettings != null) {
- mGlobalSettings.unregisterOnSharedPreferenceChangeListener(
- sharedPreferenceListener);
- }
+ // Get the reference to the actual OnSharedPreferenceChangeListener
+ // that was registered.
+ OnSharedPreferenceChangeListener sharedPreferenceListener =
+ mSharedPreferenceListeners.get(index);
+ mSharedPreferenceListeners.remove(index);
- if (mCameraSettings != null) {
- mCameraSettings.unregisterOnSharedPreferenceChangeListener(
- sharedPreferenceListener);
- }
+ if (mGlobalSettings != null) {
+ mGlobalSettings.unregisterOnSharedPreferenceChangeListener(
+ sharedPreferenceListener);
+ }
- if (mDefaultSettings != null) {
- mDefaultSettings.unregisterOnSharedPreferenceChangeListener(
- sharedPreferenceListener);
- }
+ if (mCameraSettings != null) {
+ mCameraSettings.unregisterOnSharedPreferenceChangeListener(
+ sharedPreferenceListener);
+ }
+
+ if (mDefaultSettings != null) {
+ mDefaultSettings.unregisterOnSharedPreferenceChangeListener(
+ sharedPreferenceListener);
}
}
}
}
mSharedPreferenceListeners.clear();
+ mListeners.clear();
}
/**