Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,14 @@ public interface GeoQueryDataEventListener {

/**
* Called if a dataSnapshot changed within the search area.
* An onDataMoved() event would always be preceded by onDataChanged() but it would be possible to see onDataChanged() without an antecedent onDataMoved().
*
* This method can be called multiple times.
* An onDataMoved() is always followed by onDataChanged() but it is be possible to see
* onDataChanged() without an preceding onDataMoved().
*
* This method can be called multiple times for a single location change, due to the way
* the Realtime Database handles floating point numbers.
*
* Note: this method is not related to ValueEventListener#onDataChange(DataSnapshot).
*
* @param dataSnapshot The associated dataSnapshot that moved within the search area
* @param location The location for this dataSnapshot as a GeoLocation object
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.firebase.geofire;

import static java.util.Locale.US;

import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DataSnapshot;

public class GeoQueryDataEventTestListener extends TestListener implements GeoQueryDataEventListener {

private boolean recordEntered;
private boolean recordMoved;
private boolean recordChanged;
private boolean recordExited;

public static String dataEntered(String key, double latitude, double longitude) {
return String.format(US, "DATA_ENTERED(%s,%f,%f)", key, latitude, longitude);
}

public static String dataExited(String key) {
return String.format("DATA_EXITED(%s)", key);
}

public static String dataMoved(String key, double latitude, double longitude) {
return String.format(US, "DATA_MOVED(%s,%f,%f)", key, latitude, longitude);
}

public static String dataChanged(String key, double latitude, double longitude) {
return String.format(US, "DATA_CHANGED(%s,%f,%f)", key, latitude, longitude);
}

public GeoQueryDataEventTestListener(boolean recordEntered,
boolean recordMoved,
boolean recordChanged,
boolean recordExited) {
this.recordEntered = recordEntered;
this.recordMoved = recordMoved;
this.recordChanged = recordChanged;
this.recordExited = recordExited;

}

@Override
public void onDataEntered(DataSnapshot dataSnapshot, GeoLocation location) {
if (recordEntered) {
this.addEvent(dataEntered(dataSnapshot.getKey(), location.latitude, location.longitude));
}
}

@Override
public void onDataExited(DataSnapshot dataSnapshot) {
if (recordExited) {
this.addEvent(dataExited(dataSnapshot.getKey()));
}
}

@Override
public void onDataMoved(DataSnapshot dataSnapshot, GeoLocation location) {
if (recordMoved) {
this.addEvent(dataMoved(dataSnapshot.getKey(), location.latitude, location.longitude));
}
}

@Override
public void onDataChanged(DataSnapshot dataSnapshot, GeoLocation location) {
if (recordChanged) {
this.addEvent(dataChanged(dataSnapshot.getKey(), location.latitude, location.longitude));
}
}

@Override
public void onGeoQueryReady() {

}

@Override
public void onGeoQueryError(DatabaseError error) {

}

}
38 changes: 38 additions & 0 deletions src/test/java/com/firebase/geofire/GeoQueryTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.firebase.geofire;

import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand Down Expand Up @@ -109,6 +110,43 @@ public void keyMoved() throws InterruptedException {
testListener.expectEvents(events);
}

@Test
public void dataChanged() throws InterruptedException {
GeoFire geoFire = newTestGeoFire();
setLoc(geoFire, "0", 0, 0);
setLoc(geoFire, "1", 37.0000, -122.0001);
setLoc(geoFire, "2", 37.0001, -122.0001);
setLoc(geoFire, "3", 37.1000, -122.0000);
setLoc(geoFire, "4", 37.0002, -121.9998, true);

GeoQuery query = geoFire.queryAtLocation(new GeoLocation(37, -122), 0.5);

GeoQueryDataEventTestListener testListener = new GeoQueryDataEventTestListener(
false, true, true, false);
query.addGeoQueryDataEventListener(testListener);

waitForGeoFireReady(geoFire);

setLoc(geoFire, "0", 1, 1, true); // outside of query
setLoc(geoFire, "1", 37.0001, -122.0001, true); // moved
setLoc(geoFire, "2", 37.0001, -122.0001, true); // location stayed the same
setLoc(geoFire, "4", 37.0002, -121.9999, true); // moved

DatabaseReference childRef = geoFire.getDatabaseRefForKey("2").child("some_child");
setValueAndWait(childRef, "some_value"); // data changed

List<String> events = new LinkedList<>();
events.add(GeoQueryDataEventTestListener.dataMoved("1", 37.0001, -122.0001));
events.add(GeoQueryDataEventTestListener.dataChanged("1", 37.0001, -122.0001));

events.add(GeoQueryDataEventTestListener.dataMoved("4", 37.0002, -121.9999));
events.add(GeoQueryDataEventTestListener.dataChanged("4", 37.0002, -121.9999));

events.add(GeoQueryDataEventTestListener.dataChanged("2", 37.0001, -122.0001));

testListener.expectEvents(events);
}

@Test
public void subQueryTriggersKeyMoved() throws InterruptedException {
GeoFire geoFire = newTestGeoFire();
Expand Down