11package io .fullstack .firestack .database ;
22
3+ import java .util .HashSet ;
34import java .util .List ;
45import android .util .Log ;
56import java .util .ListIterator ;
7+ import java .util .Set ;
68
79import com .facebook .react .bridge .Callback ;
810import 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