11package io .fullstack .firestack ;
22
33import android .content .Context ;
4+ import android .text .TextUtils ;
45import android .util .Log ;
56import java .util .HashMap ;
67import java .util .List ;
1314import com .facebook .react .bridge .ReactContextBaseJavaModule ;
1415import com .facebook .react .bridge .ReactMethod ;
1516import com .facebook .react .bridge .Callback ;
17+ import com .facebook .react .bridge .WritableArray ;
1618import com .facebook .react .bridge .WritableMap ;
1719import com .facebook .react .bridge .ReadableMap ;
1820import com .facebook .react .bridge .ReadableMapKeySetIterator ;
@@ -49,29 +51,29 @@ public void setModifiers(final ReadableArray modifiers) {
4951 mModifiers = modifiers ;
5052 }
5153
52- public void addChildEventListener (final String name , final ReadableArray modifiers ) {
54+ public void addChildEventListener (final String name , final ReadableArray modifiersArray , final String modifiersString ) {
5355 final FirestackDBReference self = this ;
5456
5557 if (mEventListener == null ) {
5658 mEventListener = new ChildEventListener () {
5759 @ Override
5860 public void onChildAdded (DataSnapshot dataSnapshot , String previousChildName ) {
59- self .handleDatabaseEvent ("child_added" , mPath , dataSnapshot );
61+ self .handleDatabaseEvent ("child_added" , mPath , modifiersString , dataSnapshot );
6062 }
6163
6264 @ Override
6365 public void onChildChanged (DataSnapshot dataSnapshot , String previousChildName ) {
64- self .handleDatabaseEvent ("child_changed" , mPath , dataSnapshot );
66+ self .handleDatabaseEvent ("child_changed" , mPath , modifiersString , dataSnapshot );
6567 }
6668
6769 @ Override
6870 public void onChildRemoved (DataSnapshot dataSnapshot ) {
69- self .handleDatabaseEvent ("child_removed" , mPath , dataSnapshot );
71+ self .handleDatabaseEvent ("child_removed" , mPath , modifiersString , dataSnapshot );
7072 }
7173
7274 @ Override
7375 public void onChildMoved (DataSnapshot dataSnapshot , String previousChildName ) {
74- self .handleDatabaseEvent ("child_moved" , mPath , dataSnapshot );
76+ self .handleDatabaseEvent ("child_moved" , mPath , modifiersString , dataSnapshot );
7577 }
7678
7779 @ Override
@@ -81,18 +83,18 @@ public void onCancelled(DatabaseError error) {
8183 };
8284 }
8385
84- Query ref = this .getDatabaseQueryAtPathAndModifiers (modifiers );
86+ Query ref = this .getDatabaseQueryAtPathAndModifiers (modifiersArray );
8587 ref .addChildEventListener (mEventListener );
86- this .setListeningTo (mPath , name );
88+ // this.setListeningTo(mPath, modifiersString , name);
8789 }
8890
89- public void addValueEventListener (final String name , final ReadableArray modifiers ) {
91+ public void addValueEventListener (final String name , final ReadableArray modifiersArray , final String modifiersString ) {
9092 final FirestackDBReference self = this ;
9193
9294 mValueListener = new ValueEventListener () {
9395 @ Override
9496 public void onDataChange (DataSnapshot dataSnapshot ) {
95- self .handleDatabaseEvent ("value" , mPath , dataSnapshot );
97+ self .handleDatabaseEvent ("value" , mPath , modifiersString , dataSnapshot );
9698 }
9799
98100 @ Override
@@ -101,19 +103,20 @@ public void onCancelled(DatabaseError error) {
101103 }
102104 };
103105
104- Query ref = this .getDatabaseQueryAtPathAndModifiers (modifiers );
106+ Query ref = this .getDatabaseQueryAtPathAndModifiers (modifiersArray );
105107 ref .addValueEventListener (mValueListener );
106- this .setListeningTo (mPath , "value" );
108+ // this.setListeningTo(mPath, modifiersString , "value");
107109 }
108110
109- public void addOnceValueEventListener (final ReadableArray modifiers ,
111+ public void addOnceValueEventListener (final ReadableArray modifiersArray ,
112+ final String modifiersString ,
110113 final Callback callback ) {
111114 final FirestackDBReference self = this ;
112115
113116 mOnceValueListener = new ValueEventListener () {
114117 @ Override
115118 public void onDataChange (DataSnapshot dataSnapshot ) {
116- WritableMap data = FirestackUtils .dataSnapshotToMap ("value" , mPath , dataSnapshot );
119+ WritableMap data = FirestackUtils .dataSnapshotToMap ("value" , mPath , modifiersString , dataSnapshot );
117120 callback .invoke (null , data );
118121 }
119122
@@ -127,31 +130,31 @@ public void onCancelled(DatabaseError error) {
127130 }
128131 };
129132
130- Query ref = this .getDatabaseQueryAtPathAndModifiers (modifiers );
133+ Query ref = this .getDatabaseQueryAtPathAndModifiers (modifiersArray );
131134 ref .addListenerForSingleValueEvent (mOnceValueListener );
132135 }
133136
134- public Boolean isListeningTo (final String path , final String evtName ) {
135- String key = this .pathListeningKey (path , evtName );
136- return mListeners .containsKey (key );
137- }
137+ // public Boolean isListeningTo(final String path, String modifiersString , final String evtName) {
138+ // String key = this.pathListeningKey(path, modifiersString , evtName);
139+ // return mListeners.containsKey(key);
140+ // }
138141
139142 /**
140143 * Note: these path/eventType listeners only get removed when javascript calls .off() and cleanup is run on the entire path
141144 */
142- public void setListeningTo (final String path , final String evtName ) {
143- String key = this .pathListeningKey (path , evtName );
144- mListeners .put (key , true );
145- }
145+ // public void setListeningTo(final String path, String modifiersString , final String evtName) {
146+ // String key = this.pathListeningKey(path, modifiersString , evtName);
147+ // mListeners.put(key, true);
148+ // }
146149
147- public void notListeningTo (final String path , final String evtName ) {
148- String key = this .pathListeningKey (path , evtName );
149- mListeners .remove (key );
150- }
150+ // public void notListeningTo(final String path, String modifiersString , final String evtName) {
151+ // String key = this.pathListeningKey(path, modifiersString , evtName);
152+ // mListeners.remove(key);
153+ // }
151154
152- private String pathListeningKey (final String path , final String eventName ) {
153- return "listener/" + path + "/" + eventName ;
154- }
155+ // private String pathListeningKey(final String path, String modifiersString , final String eventName) {
156+ // return "listener/" + path + "/" + modifiersString + "/" + eventName;
157+ // }
155158
156159 public void cleanup () {
157160 Log .d (TAG , "cleaning up database reference " + this );
@@ -163,10 +166,10 @@ public void removeChildEventListener() {
163166 if (mEventListener != null ) {
164167 DatabaseReference ref = this .getDatabaseRef ();
165168 ref .removeEventListener (mEventListener );
166- this .notListeningTo (mPath , "child_added" );
167- this .notListeningTo (mPath , "child_changed" );
168- this .notListeningTo (mPath , "child_removed" );
169- this .notListeningTo (mPath , "child_moved" );
169+ // this.notListeningTo(mPath, "child_added");
170+ // this.notListeningTo(mPath, "child_changed");
171+ // this.notListeningTo(mPath, "child_removed");
172+ // this.notListeningTo(mPath, "child_moved");
170173 mEventListener = null ;
171174 }
172175 }
@@ -175,7 +178,7 @@ public void removeValueEventListener() {
175178 DatabaseReference ref = this .getDatabaseRef ();
176179 if (mValueListener != null ) {
177180 ref .removeEventListener (mValueListener );
178- this .notListeningTo (mPath , "value" );
181+ // this.notListeningTo(mPath, "value");
179182 mValueListener = null ;
180183 }
181184 if (mOnceValueListener != null ) {
@@ -184,14 +187,15 @@ public void removeValueEventListener() {
184187 }
185188 }
186189
187- private void handleDatabaseEvent (final String name , final String path , final DataSnapshot dataSnapshot ) {
188- if (!FirestackDBReference .this .isListeningTo (path , name )) {
189- return ;
190- }
191- WritableMap data = FirestackUtils .dataSnapshotToMap (name , path , dataSnapshot );
190+ private void handleDatabaseEvent (final String name , final String path , final String modifiersString , final DataSnapshot dataSnapshot ) {
191+ // if (!FirestackDBReference.this.isListeningTo(path, modifiersString , name)) {
192+ // return;
193+ // }
194+ WritableMap data = FirestackUtils .dataSnapshotToMap (name , path , modifiersString , dataSnapshot );
192195 WritableMap evt = Arguments .createMap ();
193196 evt .putString ("eventName" , name );
194197 evt .putString ("path" , path );
198+ evt .putString ("modifiersString" , modifiersString );
195199 evt .putMap ("body" , data );
196200
197201 FirestackUtils .sendEvent (mReactContext , "database_event" , evt );
@@ -433,35 +437,37 @@ public void onComplete(DatabaseError error, DatabaseReference ref) {
433437
434438 @ ReactMethod
435439 public void on (final String path ,
436- final ReadableArray modifiers ,
440+ final String modifiersString ,
441+ final ReadableArray modifiersArray ,
437442 final String name ,
438443 final Callback callback ) {
439- FirestackDBReference ref = this .getDBHandle (path );
444+ FirestackDBReference ref = this .getDBHandle (path , modifiersString );
440445
441446 WritableMap resp = Arguments .createMap ();
442447
443448 if (name .equals ("value" )) {
444- ref .addValueEventListener (name , modifiers );
449+ ref .addValueEventListener (name , modifiersArray , modifiersString );
445450 } else {
446- ref .addChildEventListener (name , modifiers );
451+ ref .addChildEventListener (name , modifiersArray , modifiersString );
447452 }
448453
449- this .saveDBHandle (path , ref );
454+ this .saveDBHandle (path , modifiersString , ref );
450455 resp .putString ("result" , "success" );
451- Log .d (TAG , "Added listener " + name + " for " + ref );
456+ Log .d (TAG , "Added listener " + name + " for " + ref + "with modifiers: " + modifiersString );
452457
453458 resp .putString ("handle" , path );
454459 callback .invoke (null , resp );
455460 }
456461
457462 @ ReactMethod
458463 public void onOnce (final String path ,
459- final ReadableArray modifiers ,
464+ final String modifiersString ,
465+ final ReadableArray modifiersArray ,
460466 final String name ,
461467 final Callback callback ) {
462468 Log .d (TAG , "Setting one-time listener on event: " + name + " for path " + path );
463- FirestackDBReference ref = this .getDBHandle (path );
464- ref .addOnceValueEventListener (modifiers , callback );
469+ FirestackDBReference ref = this .getDBHandle (path , modifiersString );
470+ ref .addOnceValueEventListener (modifiersArray , modifiersString , callback );
465471 }
466472
467473 /**
@@ -471,9 +477,13 @@ public void onOnce(final String path,
471477 * off() should therefore clean *everything* up
472478 */
473479 @ ReactMethod
474- public void off (final String path , @ Deprecated final String name , final Callback callback ) {
475- this .removeDBHandle (path );
476- Log .d (TAG , "Removed listener " + path );
480+ public void off (
481+ final String path ,
482+ final String modifiersString ,
483+ @ Deprecated final String name ,
484+ final Callback callback ) {
485+ this .removeDBHandle (path , modifiersString );
486+ Log .d (TAG , "Removed listener " + path + "/" + modifiersString );
477487 WritableMap resp = Arguments .createMap ();
478488 resp .putString ("handle" , path );
479489 resp .putString ("result" , "success" );
@@ -573,24 +583,31 @@ private void handleCallback(
573583 }
574584 }
575585
576- private FirestackDBReference getDBHandle (final String path ) {
577- if (!mDBListeners .containsKey (path )) {
586+ private FirestackDBReference getDBHandle (final String path , final String modifiersString ) {
587+ String key = this .getDBListenerKey (path , modifiersString );
588+ if (!mDBListeners .containsKey (key )) {
578589 ReactContext ctx = getReactApplicationContext ();
579- mDBListeners .put (path , new FirestackDBReference (ctx , path ));
590+ mDBListeners .put (key , new FirestackDBReference (ctx , path ));
580591 }
581592
582- return mDBListeners .get (path );
593+ return mDBListeners .get (key );
594+ }
595+
596+ private void saveDBHandle (final String path , String modifiersString , final FirestackDBReference dbRef ) {
597+ String key = this .getDBListenerKey (path , modifiersString );
598+ mDBListeners .put (key , dbRef );
583599 }
584600
585- private void saveDBHandle ( final String path , final FirestackDBReference dbRef ) {
586- mDBListeners . put ( path , dbRef ) ;
601+ private String getDBListenerKey ( String path , String modifiersString ) {
602+ return path + " | " + modifiersString ;
587603 }
588604
589- private void removeDBHandle (final String path ) {
590- if (mDBListeners .containsKey (path )) {
591- FirestackDBReference r = mDBListeners .get (path );
605+ private void removeDBHandle (final String path , String modifiersString ) {
606+ String key = this .getDBListenerKey (path , modifiersString );
607+ if (mDBListeners .containsKey (key )) {
608+ FirestackDBReference r = mDBListeners .get (key );
592609 r .cleanup ();
593- mDBListeners .remove (path );
610+ mDBListeners .remove (key );
594611 }
595612 }
596613
@@ -604,73 +621,10 @@ private DatabaseReference getDatabaseReferenceAtPath(final String path) {
604621 return mDatabase ;
605622 }
606623
607- private Query getDatabaseQueryAtPathAndModifiers (
608- final String path ,
609- final ReadableArray modifiers ) {
610- DatabaseReference ref = this .getDatabaseReferenceAtPath (path );
611-
612- List <Object > strModifiers = FirestackUtils .recursivelyDeconstructReadableArray (modifiers );
613- ListIterator <Object > it = strModifiers .listIterator ();
614- Query query = ref .orderByKey ();
615-
616- while (it .hasNext ()) {
617- String str = (String ) it .next ();
618- String [] strArr = str .split (":" );
619- String methStr = strArr [0 ];
620624
621- if (methStr .equalsIgnoreCase ("orderByKey" )) {
622- query = ref .orderByKey ();
623- } else if (methStr .equalsIgnoreCase ("orderByValue" )) {
624- query = ref .orderByValue ();
625- } else if (methStr .equalsIgnoreCase ("orderByPriority" )) {
626- query = ref .orderByPriority ();
627- } else if (methStr .contains ("orderByChild" )) {
628- String key = strArr [1 ];
629- Log .d (TAG , "orderByChild: " + key );
630- query = ref .orderByChild (key );
631- } else if (methStr .contains ("limitToLast" )) {
632- String key = strArr [1 ];
633- int limit = Integer .parseInt (key );
634- Log .d (TAG , "limitToLast: " + limit );
635- query = query .limitToLast (limit );
636- } else if (methStr .contains ("limitToFirst" )) {
637- String key = strArr [1 ];
638- int limit = Integer .parseInt (key );
639- Log .d (TAG , "limitToFirst: " + limit );
640- query = query .limitToFirst (limit );
641- } else if (methStr .contains ("equalTo" )) {
642- String value = strArr [1 ];
643- String key = strArr .length >= 3 ? strArr [2 ] : null ;
644- if (key == null ) {
645- query = query .equalTo (value );
646- } else {
647- query = query .equalTo (value , key );
648- }
649- } else if (methStr .contains ("endAt" )) {
650- String value = strArr [1 ];
651- String key = strArr .length >= 3 ? strArr [2 ] : null ;
652- if (key == null ) {
653- query = query .endAt (value );
654- } else {
655- query = query .endAt (value , key );
656- }
657- } else if (methStr .contains ("startAt" )) {
658- String value = strArr [1 ];
659- String key = strArr .length >= 3 ? strArr [2 ] : null ;
660- if (key == null ) {
661- query = query .startAt (value );
662- } else {
663- query = query .startAt (value , key );
664- }
665- }
666- }
667-
668- return query ;
669- }
670-
671- private WritableMap dataSnapshotToMap (String name , String path , DataSnapshot dataSnapshot ) {
672- return FirestackUtils .dataSnapshotToMap (name , path , dataSnapshot );
673- }
625+ //private WritableMap dataSnapshotToMap(String name, String path, DataSnapshot dataSnapshot) {
626+ // return FirestackUtils.dataSnapshotToMap(name, path, dataSnapshot);
627+ //}
674628
675629 private <Any > Any castSnapshotValue (DataSnapshot snapshot ) {
676630 if (snapshot .hasChildren ()) {
0 commit comments