Skip to content
This repository was archived by the owner on Jan 15, 2025. It is now read-only.

Commit 9389c79

Browse files
committed
Change AddTriggerListener to be a TriggerRepositoryObserver that also gets signaled on trigger removal.
Make trigger service stop if all triggers are removed.
1 parent fcd4523 commit 9389c79

File tree

3 files changed

+41
-37
lines changed

3 files changed

+41
-37
lines changed

android/Common/src/com/googlecode/android_scripting/trigger/TriggerRepository.java

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import android.content.SharedPreferences;
3535
import android.preference.PreferenceManager;
3636

37-
3837
import com.googlecode.android_scripting.IntentBuilders;
3938
import 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
}

android/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/TriggerService.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import com.googlecode.android_scripting.R;
3333
import com.googlecode.android_scripting.trigger.Trigger;
3434
import com.googlecode.android_scripting.trigger.TriggerRepository;
35-
import com.googlecode.android_scripting.trigger.TriggerRepository.AddTriggerListener;
35+
import com.googlecode.android_scripting.trigger.TriggerRepository.TriggerRepositoryObserver;
3636

3737
/**
3838
* The trigger service takes care of installing triggers serialized to the preference storage.
@@ -50,11 +50,18 @@ public class TriggerService extends Service {
5050
private static int mTriggerServiceNotificationId;
5151
private static final long TRIGGER_SERVICE_PING_MILLIS = 10 * 1000 * 60;
5252

53-
private final AddTriggerListener mAddTriggerListener = new AddTriggerListener() {
53+
private final TriggerRepositoryObserver mAddTriggerListener = new TriggerRepositoryObserver() {
5454
@Override
5555
public void onAddTrigger(Trigger trigger) {
5656
trigger.install(TriggerService.this);
5757
}
58+
59+
@Override
60+
public void onRemoveTrigger(Trigger trigger) {
61+
if (mTriggerRepository.isEmpty()) {
62+
stopSelf();
63+
}
64+
}
5865
};
5966

6067
public TriggerService() {
@@ -69,12 +76,10 @@ private void initializeTriggers() {
6976
@Override
7077
public void onCreate() {
7178
super.onCreate();
72-
7379
mTriggerServiceNotificationId = NotificationIdFactory.create();
7480
BaseApplication application = (BaseApplication) getApplication();
7581
mTriggerRepository = application.getTriggerRepository();
7682
mTriggerRepository.registerAddTriggerListener(mAddTriggerListener);
77-
7883
if (mTriggerRepository.isEmpty()) {
7984
stopSelf();
8085
} else {
@@ -127,7 +132,6 @@ public void onDestroy() {
127132
NotificationManager manager =
128133
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
129134
manager.cancel(mTriggerServiceNotificationId);
130-
131135
mTriggerRepository.unregisterAddListener(mAddTriggerListener);
132136
}
133137

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)