1
1
package io .fullstack .firestack .database ;
2
2
3
+ import java .util .HashSet ;
3
4
import java .util .List ;
4
5
import android .util .Log ;
5
6
import java .util .ListIterator ;
7
+ import java .util .Set ;
6
8
7
9
import com .facebook .react .bridge .Callback ;
8
10
import com .facebook .react .bridge .Arguments ;
@@ -28,6 +30,7 @@ public class FirestackDatabaseReference {
28
30
private ChildEventListener mEventListener ;
29
31
private ValueEventListener mValueListener ;
30
32
private ReactContext mReactContext ;
33
+ private Set <String > childEventListeners = new HashSet <>();
31
34
32
35
public FirestackDatabaseReference (final ReactContext context ,
33
36
final FirebaseDatabase firebaseDatabase ,
@@ -40,7 +43,7 @@ public FirestackDatabaseReference(final ReactContext context,
40
43
mQuery = this .buildDatabaseQueryAtPathAndModifiers (firebaseDatabase , path , modifiersArray );
41
44
}
42
45
43
- public void addChildEventListener (final String name ) {
46
+ public void addChildEventListener (final String eventName ) {
44
47
if (mEventListener == null ) {
45
48
mEventListener = new ChildEventListener () {
46
49
@ Override
@@ -65,14 +68,16 @@ public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
65
68
66
69
@ Override
67
70
public void onCancelled (DatabaseError error ) {
68
- handleDatabaseError (name , error );
71
+ handleDatabaseError (eventName , error );
69
72
}
70
73
};
71
74
mQuery .addChildEventListener (mEventListener );
72
75
Log .d (TAG , "Added ChildEventListener for path: " + mPath + " with modifiers: " + mModifiersString );
73
76
} else {
74
77
Log .w (TAG , "Trying to add duplicate ChildEventListener for path: " + mPath + " with modifiers: " + mModifiersString );
75
78
}
79
+ //Keep track of the events that the JS is interested in knowing about
80
+ childEventListeners .add (eventName );
76
81
}
77
82
78
83
public void addValueEventListener () {
@@ -117,8 +122,24 @@ public void onCancelled(DatabaseError error) {
117
122
Log .d (TAG , "Added OnceValueEventListener for path: " + mPath + " with modifiers " + mModifiersString );
118
123
}
119
124
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
+
120
140
public void cleanup () {
121
141
Log .d (TAG , "cleaning up database reference " + this );
142
+ childEventListeners .clear ();
122
143
this .removeChildEventListener ();
123
144
this .removeValueEventListener ();
124
145
}
@@ -272,5 +293,4 @@ private Query buildDatabaseQueryAtPathAndModifiers(final FirebaseDatabase fireba
272
293
273
294
return query ;
274
295
}
275
-
276
296
}
0 commit comments