3434import android .content .SharedPreferences ;
3535import android .preference .PreferenceManager ;
3636
37-
3837import com .googlecode .android_scripting .IntentBuilders ;
3938import com .googlecode .android_scripting .Log ;
4039
@@ -50,12 +49,15 @@ public class TriggerRepository {
5049 /**
5150 * An interface for objects that are notified when a trigger is added to the repository.
5251 */
53- public interface AddTriggerListener {
52+ public interface TriggerRepositoryObserver {
5453 void onAddTrigger (Trigger trigger );
54+
55+ void onRemoveTrigger (Trigger trigger );
5556 }
5657
57- private CopyOnWriteArrayList <AddTriggerListener > mAddTriggerListeners =
58- new CopyOnWriteArrayList <AddTriggerListener >();
58+ private final CopyOnWriteArrayList <Trigger > mTriggers = new CopyOnWriteArrayList <Trigger >();
59+ private final CopyOnWriteArrayList <TriggerRepositoryObserver > mTriggerObservers =
60+ new CopyOnWriteArrayList <TriggerRepositoryObserver >();
5961
6062 /**
6163 * The list of triggers is serialized to the shared preferences entry with this name.
@@ -70,8 +72,6 @@ public interface AddTriggerListener {
7072
7173 private final SharedPreferences mPreferences ;
7274
73- private List <Trigger > mTriggers ;
74-
7575 private Context mContext ;
7676
7777 /** Interface for filters over triggers */
@@ -82,13 +82,8 @@ public static interface TriggerFilter {
8282 public TriggerRepository (Context context ) {
8383 mContext = context ;
8484 mPreferences = PreferenceManager .getDefaultSharedPreferences (context );
85- mTriggers = deserializeTriggers ();
86- }
87-
88- private synchronized List <Trigger > deserializeTriggers () {
89- final String triggers = mPreferences .getString (TRIGGERS_PREF_KEY , null );
90- List <Trigger > triggerInfos = deserializeTriggersFromString (triggers );
91- return triggerInfos ;
85+ String triggers = mPreferences .getString (TRIGGERS_PREF_KEY , null );
86+ mTriggers .addAll (deserializeTriggersFromString (triggers ));
9287 }
9388
9489 /** Returns a list of all triggers. The list is unmodifiable. */
@@ -102,7 +97,7 @@ public synchronized List<Trigger> getAllTriggers() {
10297 */
10398 public synchronized void addTrigger (Trigger trigger ) {
10499 mTriggers .add (trigger );
105- storeTriggers (mTriggers );
100+ storeTriggers ();
106101 notifyOnTriggerAdd (trigger );
107102 ensureTriggerServiceRunning ();
108103 }
@@ -113,17 +108,24 @@ private void ensureTriggerServiceRunning() {
113108 mContext .startService (startTriggerServiceIntent );
114109 }
115110
116- /** Notify all {@link AddTriggerListener }s that a {@link Trigger} was added. */
111+ /** Notify all {@link TriggerRepositoryObserver }s that a {@link Trigger} was added. */
117112 private void notifyOnTriggerAdd (Trigger trigger ) {
118- for (AddTriggerListener listener : mAddTriggerListeners ) {
119- listener .onAddTrigger (trigger );
113+ for (TriggerRepositoryObserver observer : mTriggerObservers ) {
114+ observer .onAddTrigger (trigger );
115+ }
116+ }
117+
118+ /** Notify all {@link TriggerRepositoryObserver}s that a {@link Trigger} was added. */
119+ private void notifyOnTriggerRemove (Trigger trigger ) {
120+ for (TriggerRepositoryObserver observer : mTriggerObservers ) {
121+ observer .onRemoveTrigger (trigger );
120122 }
121123 }
122124
123125 /** Writes the list of triggers to the shared preferences. */
124- private void storeTriggers (List < Trigger > triggers ) {
126+ private void storeTriggers () {
125127 SharedPreferences .Editor editor = mPreferences .edit ();
126- final String triggerValue = serializeTriggersToString (triggers );
128+ final String triggerValue = serializeTriggersToString (mTriggers );
127129 if (triggerValue != null ) {
128130 editor .putString (TRIGGERS_PREF_KEY , triggerValue );
129131 }
@@ -176,16 +178,15 @@ private String serializeTriggersToString(List<Trigger> triggers) {
176178
177179 /** Removes all triggers that match the filters */
178180 public synchronized void removeTriggers (TriggerFilter triggerFilter ) {
179- List <Trigger > allTriggers = new ArrayList <Trigger >();
180- for (Trigger trigger : getAllTriggers ()) {
181- if (!triggerFilter .matches (trigger )) {
182- allTriggers .add (trigger );
183- } else {
181+ new ArrayList <Trigger >();
182+ for (Trigger trigger : mTriggers ) {
183+ if (triggerFilter .matches (trigger )) {
184184 trigger .remove ();
185+ mTriggers .remove (trigger );
186+ notifyOnTriggerRemove (trigger );
185187 }
186188 }
187- mTriggers = allTriggers ;
188- storeTriggers (allTriggers );
189+ storeTriggers ();
189190 }
190191
191192 /** Returns the currently stored index. */
@@ -209,12 +210,11 @@ public synchronized long createNewId() {
209210
210211 /** Returns the {@link TriggerInfo} object with the given id. */
211212 public Trigger getById (UUID id ) {
212- for (Trigger trigger : getAllTriggers () ) {
213+ for (Trigger trigger : mTriggers ) {
213214 if (trigger .getId ().equals (id )) {
214215 return trigger ;
215216 }
216217 }
217-
218218 return null ;
219219 }
220220
@@ -224,15 +224,15 @@ public boolean isEmpty() {
224224 }
225225
226226 /** Registers a listener that is invoked when a new trigger gets added. */
227- public void registerAddTriggerListener (AddTriggerListener listener ) {
228- mAddTriggerListeners .add (listener );
227+ public void registerAddTriggerListener (TriggerRepositoryObserver listener ) {
228+ mTriggerObservers .add (listener );
229229 }
230230
231231 /**
232232 * Unregisters a previously registered listener. This is a no-op if the listener hasn't been
233233 * registered.
234234 */
235- public void unregisterAddListener (AddTriggerListener addTriggerListener ) {
236- mAddTriggerListeners .remove (addTriggerListener );
235+ public void unregisterAddListener (TriggerRepositoryObserver addTriggerListener ) {
236+ mTriggerObservers .remove (addTriggerListener );
237237 }
238238}
0 commit comments