#android #firebase #google-cloud-firestore #geolocation #geofirestore
#Android #firebase #google-облако-firestore #геолокация #geofirestore
Вопрос:
Если вы запрашиваете пользователей в радиусе 100 км, как вы исключаете себя (текущего пользователя) из запроса?
Потому что, когда срабатывает onDocumentMoved, если вы единственный, кто перемещает ваш триггер по введенному документу, вы снова получите пользователей, но с другим расстоянием между вами и пользователями, таким образом, вы получите повторяющиеся результаты, если вы добавляете их в базу данных методом onDocumentEntered. Способ, которым я решил это, заключается в удалении всех usersInRange из базы данных при повторном открытии приложения. Я знаю, что это не идеальное решение, и я ищу лучшее.
Вот мой код, который делает это:
public void getLocation(Location location){
ArrayList<String> docMoved = new ArrayList<>();
listenerRegistration = documentReference.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
if(value != null amp;amp; value.exists()){
if (value.get("LocationRange") != null amp;amp; value.get("AgeRangeFrom") != null amp;amp; value.get("AgeRangeTo") != null amp;amp; value.getString("InterestInGender") != null) {
locationRange = (double) value.get("LocationRange");
ageRangeFrom = (double) value.get("AgeRangeFrom");
ageRangeTo = (double) value.get("AgeRangeTo");
interestInGender = value.getString("InterestInGender");
ArrayList<HashMap<Object, Object>> usersInRange = (ArrayList<HashMap<Object, Object>>) value.get("UsersInRange");
geoQuery = geoFirestore.queryAtLocation(new GeoPoint(location.getLatitude(), location.getLongitude()), locationRange);
geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
@Override
public void onDocumentEntered(@NotNull DocumentSnapshot documentSnapshot5, @NotNull GeoPoint geoPoint) {
if (documentSnapshot5.get("age") != null amp;amp; documentSnapshot5.getString("Gender") != null amp;amp; documentSnapshot5.get("Images") != null amp;amp; !documentSnapshot5.getId().equals(user.getUid())) {
age = (long) documentSnapshot5.get("age");
userGender = documentSnapshot5.getString("Gender");
userPhotos = (ArrayList<String>) documentSnapshot5.get("Images");
Location locationNew = new Location(documentSnapshot5.getId());
locationNew.setLatitude(geoPoint.getLatitude());
locationNew.setLongitude(geoPoint.getLongitude());
distanceM = location.distanceTo(locationNew);
distanceKM = (int) Math.round(distanceM / 1000);
if (age >= ageRangeFrom amp;amp; age <= ageRangeTo amp;amp; interestInGender.equals("Women") amp;amp; userGender.equals("Woman")) {
db.collection("UsersFilter").document(user.getUid()).update("UsersInRange", FieldValue.arrayUnion(new User(documentSnapshot5.getString("Name"), age, userPhotos.get(0), documentSnapshot5.getId(), distanceKM, null)));
} else if (age >= ageRangeFrom amp;amp; age <= ageRangeTo amp;amp; interestInGender.equals("Men") amp;amp; userGender.equals("Man")) {
db.collection("UsersFilter").document(user.getUid()).update("UsersInRange", FieldValue.arrayUnion(new User(documentSnapshot5.getString("Name"), age, userPhotos.get(0), documentSnapshot5.getId(), distanceKM, null)));
} else if (age >= ageRangeFrom amp;amp; age <= ageRangeTo amp;amp; interestInGender.equals("Everyone")) {
db.collection("UsersFilter").document(user.getUid()).update("UsersInRange", FieldValue.arrayUnion(new User(documentSnapshot5.getString("Name"), age, userPhotos.get(0), documentSnapshot5.getId(), distanceKM, null)));
} else {
db.collection("UsersFilter").document(user.getUid()).update("UsersInRange", FieldValue.arrayRemove(new User(documentSnapshot5.getString("Name"), age, userPhotos.get(0), documentSnapshot5.getId(), distanceKM, null)));
}
}
}
@Override
public void onDocumentExited(@NotNull DocumentSnapshot documentSnapshot1) {
db.collection("UsersFilter").document(user.getUid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
ArrayList<HashMap<Object, Object>> usersInRange = (ArrayList<HashMap<Object, Object>>) documentSnapshot.get("UsersInRange");
if (usersInRange != null amp;amp; !usersInRange.isEmpty()) {
for (int i = 0; i < usersInRange.size(); i ) {
if (usersInRange.get(i).containsValue(documentSnapshot1.getId())) {
db.collection("UsersFilter").document(user.getUid()).update("UsersInRange", FieldValue.arrayRemove(usersInRange.get(i)));
}
}
}
}
});
}
@Override
public void onDocumentMoved(@NotNull DocumentSnapshot documentSnapshot6, @NotNull GeoPoint geoPoint) {
docMoved.add(documentSnapshot6.getId());
if(!documentSnapshot6.getId().equals(user.getUid())) {
db.collection("UsersFilter").document(user.getUid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
ArrayList<HashMap<Object, Object>> usersInRange = (ArrayList<HashMap<Object, Object>>) documentSnapshot.get("UsersInRange");
if (usersInRange != null amp;amp; !usersInRange.isEmpty()) {
for (int i = 0; i < usersInRange.size(); i ) {
if (usersInRange.get(i).containsValue(documentSnapshot6.getId())) {
db.collection("UsersFilter").document(user.getUid()).update("UsersInRange", FieldValue.arrayRemove(usersInRange.get(i)));
}
}
}
}
});
}
}
@Override
public void onDocumentChanged(@NotNull DocumentSnapshot documentSnapshot1, @NotNull GeoPoint geoPoint) {
if(docMoved.size() == 1 amp;amp; docMoved.get(0).equals(user.getUid())){
db.collection("UsersFilter").document(user.getUid()).update("UsersInRange", FieldValue.delete());
}
db.collection("UsersFilter").document(user.getUid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
ArrayList<HashMap<Object, Object>> usersInRange = (ArrayList<HashMap<Object, Object>>) documentSnapshot.get("UsersInRange");
if (usersInRange != null amp;amp; !usersInRange.isEmpty()) {
for (int i = 0; i < usersInRange.size(); i ) {
if (usersInRange.get(i).containsValue(documentSnapshot1.getId())) {
db.collection("UsersFilter").document(user.getUid()).update("UsersInRange", FieldValue.arrayRemove(usersInRange.get(i)));
}
}
}
}
});
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(@NotNull Exception e) {
}
});
}
}
}
});
Это код, который отображает пользователей в ViewPager2:
listenerRegistration = documentReference.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
if(value != null amp;amp; value.exists()) {
usersInRange = (ArrayList<HashMap<Object, Object>>) value.get("UsersInRange");
usersInChat = (ArrayList<HashMap<Object, Object>>) value.get("UsersInChat");
imageUrls.clear();
viewPager2Adapter.notifyDataSetChanged();
if (usersInChat != null amp;amp; !usersInChat.isEmpty() amp;amp; usersInRange != null amp;amp; !usersInRange.isEmpty()) {
for (int i = 0; i < usersInChat.size(); i ) {
for (int k = 0; k < usersInRange.size(); k ) {
if (usersInRange.get(k).containsValue(usersInChat.get(i).get("userID"))) {
usersInRange.remove(usersInRange.get(k));
}
}
}
}
if (usersInRange != null amp;amp; !usersInRange.isEmpty()) {
for (int i = 0; i < usersInRange.size(); i ) {
String profileImage = (String) usersInRange.get(i).get("profilePic");
String userName = (String) usersInRange.get(i).get("name");
long userAge = (long) usersInRange.get(i).get("age");
String userID = (String) usersInRange.get(i).get("userID");
long km = (long) usersInRange.get(i).get("km");
imageUrls.add(new User(userName, userAge, profileImage, userID, km, null));
viewPager2Adapter.notifyDataSetChanged();
}
}
}
}
});