Skip to content

Commit 3845a12

Browse files
committed
Only remove Android db listeners when all listened to events have been removed
1 parent 5281627 commit 3845a12

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

android/src/main/java/io/fullstack/firestack/database/FirestackDatabase.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,14 @@ public void onComplete(DatabaseError error, DatabaseReference ref) {
171171
public void on(final String path,
172172
final String modifiersString,
173173
final ReadableArray modifiersArray,
174-
final String name,
174+
final String eventName,
175175
final Callback callback) {
176176
FirestackDatabaseReference ref = this.getDBHandle(path, modifiersArray, modifiersString);
177177

178-
if (name.equals("value")) {
178+
if (eventName.equals("value")) {
179179
ref.addValueEventListener();
180180
} else {
181-
ref.addChildEventListener(name);
181+
ref.addChildEventListener(eventName);
182182
}
183183

184184
WritableMap resp = Arguments.createMap();
@@ -191,7 +191,7 @@ public void on(final String path,
191191
public void onOnce(final String path,
192192
final String modifiersString,
193193
final ReadableArray modifiersArray,
194-
final String name,
194+
final String eventName,
195195
final Callback callback) {
196196
FirestackDatabaseReference ref = this.getDBHandle(path, modifiersArray, modifiersString);
197197
ref.addOnceValueEventListener(callback);
@@ -207,22 +207,21 @@ public void onOnce(final String path,
207207
public void off(
208208
final String path,
209209
final String modifiersString,
210-
final String name,
210+
final String eventName,
211211
final Callback callback) {
212212

213213
String key = this.getDBListenerKey(path, modifiersString);
214214
FirestackDatabaseReference r = mDBListeners.get(key);
215215

216216
if (r != null) {
217-
if (name == null || "".equals(name)) {
217+
if (eventName == null || "".equals(eventName)) {
218218
r.cleanup();
219219
mDBListeners.remove(key);
220220
} else {
221-
//TODO: Remove individual listeners as per iOS code
222-
//1) Remove event handler
223-
//2) If no more listeners, remove from listeners map
224-
r.cleanup();
225-
mDBListeners.remove(key);
221+
r.removeEventListener(eventName);
222+
if (!r.hasListeners()) {
223+
mDBListeners.remove(key);
224+
} ;
226225
}
227226
}
228227

android/src/main/java/io/fullstack/firestack/database/FirestackDatabaseReference.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package io.fullstack.firestack.database;
22

3+
import java.util.HashSet;
34
import java.util.List;
45
import android.util.Log;
56
import java.util.ListIterator;
7+
import java.util.Set;
68

79
import com.facebook.react.bridge.Callback;
810
import com.facebook.react.bridge.Arguments;
@@ -28,6 +30,7 @@ public class FirestackDatabaseReference {
2830
private ChildEventListener mEventListener;
2931
private ValueEventListener mValueListener;
3032
private ReactContext mReactContext;
33+
private Set<String> childEventListeners = new HashSet<>();
3134

3235
public FirestackDatabaseReference(final ReactContext context,
3336
final FirebaseDatabase firebaseDatabase,
@@ -40,7 +43,7 @@ public FirestackDatabaseReference(final ReactContext context,
4043
mQuery = this.buildDatabaseQueryAtPathAndModifiers(firebaseDatabase, path, modifiersArray);
4144
}
4245

43-
public void addChildEventListener(final String name) {
46+
public void addChildEventListener(final String eventName) {
4447
if (mEventListener == null) {
4548
mEventListener = new ChildEventListener() {
4649
@Override
@@ -65,14 +68,16 @@ public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
6568

6669
@Override
6770
public void onCancelled(DatabaseError error) {
68-
handleDatabaseError(name, error);
71+
handleDatabaseError(eventName, error);
6972
}
7073
};
7174
mQuery.addChildEventListener(mEventListener);
7275
Log.d(TAG, "Added ChildEventListener for path: " + mPath + " with modifiers: "+ mModifiersString);
7376
} else {
7477
Log.w(TAG, "Trying to add duplicate ChildEventListener for path: " + mPath + " with modifiers: "+ mModifiersString);
7578
}
79+
//Keep track of the events that the JS is interested in knowing about
80+
childEventListeners.add(eventName);
7681
}
7782

7883
public void addValueEventListener() {
@@ -117,8 +122,24 @@ public void onCancelled(DatabaseError error) {
117122
Log.d(TAG, "Added OnceValueEventListener for path: " + mPath + " with modifiers " + mModifiersString);
118123
}
119124

125+
public void removeEventListener(String eventName) {
126+
if ("value".equals(eventName)) {
127+
this.removeValueEventListener();
128+
} else {
129+
childEventListeners.remove(eventName);
130+
if (childEventListeners.isEmpty()) {
131+
this.removeChildEventListener();
132+
}
133+
}
134+
}
135+
136+
public boolean hasListeners() {
137+
return mEventListener != null || mValueListener != null;
138+
}
139+
120140
public void cleanup() {
121141
Log.d(TAG, "cleaning up database reference " + this);
142+
childEventListeners.clear();
122143
this.removeChildEventListener();
123144
this.removeValueEventListener();
124145
}
@@ -272,5 +293,4 @@ private Query buildDatabaseQueryAtPathAndModifiers(final FirebaseDatabase fireba
272293

273294
return query;
274295
}
275-
276296
}

0 commit comments

Comments
 (0)