88import com .google .firebase .database .ChildEventListener ;
99import com .google .firebase .database .DataSnapshot ;
1010import com .google .firebase .database .DatabaseError ;
11+ import com .google .firebase .database .DatabaseException ;
1112import com .google .firebase .database .DatabaseReference ;
1213import com .google .firebase .database .FirebaseDatabase ;
14+ import com .google .firebase .database .Query ;
1315import com .google .firebase .database .ValueEventListener ;
1416import io .flutter .plugin .common .MethodCall ;
1517import io .flutter .plugin .common .MethodChannel ;
@@ -31,7 +33,7 @@ public class FirebaseDatabasePlugin implements MethodCallHandler {
3133
3234 // Handles are ints used as indexes into the sparse array of active observers
3335 private int nextHandle = 0 ;
34- private final SparseArray <EventObserver > observers = new SparseArray <EventObserver >();
36+ private final SparseArray <EventObserver > observers = new SparseArray <>();
3537
3638 public static void registerWith (PluginRegistry .Registrar registrar ) {
3739 final MethodChannel channel =
@@ -43,14 +45,68 @@ private FirebaseDatabasePlugin(MethodChannel channel) {
4345 this .channel = channel ;
4446 }
4547
46- private static DatabaseReference getReference (Map <String , ?> arguments ) {
47- @ SuppressWarnings ("unchecked" )
48+ private DatabaseReference getReference (Map <String , Object > arguments ) {
4849 String path = (String ) arguments .get ("path" );
4950 DatabaseReference reference = FirebaseDatabase .getInstance ().getReference ();
5051 if (path != null ) reference = reference .child (path );
5152 return reference ;
5253 }
5354
55+ private Query getQuery (Map <String , Object > arguments ) {
56+ Query query = getReference (arguments );
57+ @ SuppressWarnings ("unchecked" )
58+ Map <String , Object > parameters = (Map <String , Object >) arguments .get ("parameters" );
59+ Object orderBy = parameters .get ("orderBy" );
60+ if ("child" .equals (orderBy )) {
61+ query = query .orderByChild ((String ) parameters .get ("orderByChildKey" ));
62+ } else if ("key" .equals (orderBy )) {
63+ query = query .orderByKey ();
64+ } else if ("value" .equals (orderBy )) {
65+ query = query .orderByValue ();
66+ } else if ("priority" .equals (orderBy )) {
67+ query = query .orderByPriority ();
68+ }
69+ if (parameters .containsKey ("startAt" )) {
70+ Object startAt = parameters .get ("startAt" );
71+ String startAtKey = (String ) parameters .get ("startAtKey" );
72+ if (startAt instanceof Boolean ) {
73+ query = query .startAt ((Boolean ) startAt , startAtKey );
74+ } else if (startAt instanceof String ) {
75+ query = query .startAt ((String ) startAt , startAtKey );
76+ } else {
77+ query = query .startAt ((Double ) startAt , startAtKey );
78+ }
79+ }
80+ if (parameters .containsKey ("endAt" )) {
81+ Object endAt = parameters .get ("endAt" );
82+ String endAtKey = (String ) parameters .get ("endAtKey" );
83+ if (endAt instanceof Boolean ) {
84+ query = query .endAt ((Boolean ) endAt , endAtKey );
85+ } else if (endAt instanceof String ) {
86+ query = query .endAt ((String ) endAt , endAtKey );
87+ } else {
88+ query = query .endAt ((Double ) endAt , endAtKey );
89+ }
90+ }
91+ if (arguments .containsKey ("equalTo" )) {
92+ Object equalTo = arguments .get ("equalTo" );
93+ if (equalTo instanceof Boolean ) {
94+ query = query .equalTo ((Boolean ) equalTo );
95+ } else if (equalTo instanceof String ) {
96+ query = query .equalTo ((String ) equalTo );
97+ } else {
98+ query = query .equalTo ((Double ) equalTo );
99+ }
100+ }
101+ if (arguments .containsKey ("limitToFirst" )) {
102+ query = query .limitToFirst ((int ) arguments .get ("limitToFirst" ));
103+ }
104+ if (arguments .containsKey ("limitToLast" )) {
105+ query = query .limitToLast ((int ) arguments .get ("limitToLast" ));
106+ }
107+ return query ;
108+ }
109+
54110 private class DefaultCompletionListener implements DatabaseReference .CompletionListener {
55111 private final Result result ;
56112
@@ -79,8 +135,8 @@ private class EventObserver implements ChildEventListener, ValueEventListener {
79135
80136 private void sendEvent (String eventType , DataSnapshot snapshot , String previousChildName ) {
81137 if (eventType .equals (requestedEventType )) {
82- Map <String , Object > arguments = new HashMap <String , Object >();
83- Map <String , Object > snapshotMap = new HashMap <String , Object >();
138+ Map <String , Object > arguments = new HashMap <>();
139+ Map <String , Object > snapshotMap = new HashMap <>();
84140 snapshotMap .put ("key" , snapshot .getKey ());
85141 snapshotMap .put ("value" , snapshot .getValue ());
86142 arguments .put ("handle" , handle );
@@ -119,34 +175,54 @@ public void onDataChange(DataSnapshot snapshot) {
119175 }
120176 }
121177
122- @ SuppressWarnings ("unchecked" )
123178 @ Override
124179 public void onMethodCall (MethodCall call , final Result result ) {
125- Map <String , Object > arguments = ( Map < String , Object >) call .arguments ;
180+ Map <String , Object > arguments = call .arguments () ;
126181 switch (call .method ) {
127182 case "FirebaseDatabase#goOnline" :
128- FirebaseDatabase .getInstance ().goOnline ();
129- break ;
183+ {
184+ FirebaseDatabase .getInstance ().goOnline ();
185+ result .success (null );
186+ break ;
187+ }
130188
131189 case "FirebaseDatabase#goOffline" :
132- FirebaseDatabase .getInstance ().goOffline ();
133- break ;
190+ {
191+ FirebaseDatabase .getInstance ().goOffline ();
192+ result .success (null );
193+ break ;
194+ }
134195
135196 case "FirebaseDatabase#purgeOutstandingWrites" :
136- FirebaseDatabase .getInstance ().purgeOutstandingWrites ();
137- break ;
197+ {
198+ FirebaseDatabase .getInstance ().purgeOutstandingWrites ();
199+ result .success (null );
200+ break ;
201+ }
138202
139203 case "FirebaseDatabase#setPersistenceEnabled" :
140204 {
141- boolean isEnabled = (boolean ) arguments .get ("enabled" );
142- FirebaseDatabase .getInstance ().setPersistenceEnabled (isEnabled );
205+ Boolean isEnabled = (Boolean ) arguments .get ("enabled" );
206+ try {
207+ FirebaseDatabase .getInstance ().setPersistenceEnabled (isEnabled );
208+ result .success (true );
209+ } catch (DatabaseException e ) {
210+ // Database is already in use, e.g. after hot reload/restart.
211+ result .success (false );
212+ }
143213 break ;
144214 }
145215
146216 case "FirebaseDatabase#setPersistenceCacheSizeBytes" :
147217 {
148- long cacheSize = (long ) arguments .get ("cacheSize" );
149- FirebaseDatabase .getInstance ().setPersistenceCacheSizeBytes (cacheSize );
218+ Long cacheSize = (Long ) arguments .get ("cacheSize" );
219+ try {
220+ FirebaseDatabase .getInstance ().setPersistenceCacheSizeBytes (cacheSize );
221+ result .success (true );
222+ } catch (DatabaseException e ) {
223+ // Database is already in use, e.g. after hot reload/restart.
224+ result .success (false );
225+ }
150226 break ;
151227 }
152228
@@ -171,31 +247,38 @@ public void onMethodCall(MethodCall call, final Result result) {
171247 break ;
172248 }
173249
250+ case "Query#keepSynced" :
251+ {
252+ boolean value = (Boolean ) arguments .get ("value" );
253+ getQuery (arguments ).keepSynced (value );
254+ break ;
255+ }
256+
174257 case "Query#observe" :
175258 {
176259 String eventType = (String ) arguments .get ("eventType" );
177260 int handle = nextHandle ++;
178261 EventObserver observer = new EventObserver (eventType , handle );
179262 observers .put (handle , observer );
180263 if (eventType .equals (EVENT_TYPE_VALUE )) {
181- getReference (arguments ).addValueEventListener (observer );
264+ getQuery (arguments ).addValueEventListener (observer );
182265 } else {
183- getReference (arguments ).addChildEventListener (observer );
266+ getQuery (arguments ).addChildEventListener (observer );
184267 }
185268 result .success (handle );
186269 break ;
187270 }
188271
189272 case "Query#removeObserver" :
190273 {
191- DatabaseReference reference = getReference (arguments );
274+ Query query = getQuery (arguments );
192275 int handle = (Integer ) arguments .get ("handle" );
193276 EventObserver observer = observers .get (handle );
194277 if (observer != null ) {
195278 if (observer .requestedEventType .equals (EVENT_TYPE_VALUE )) {
196- reference .removeEventListener ((ValueEventListener ) observer );
279+ query .removeEventListener ((ValueEventListener ) observer );
197280 } else {
198- reference .removeEventListener ((ChildEventListener ) observer );
281+ query .removeEventListener ((ChildEventListener ) observer );
199282 }
200283 observers .delete (handle );
201284 result .success (null );
0 commit comments