Возможно ли удалить текущего пользователя из запроса GeoFirestore?

#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();

                    }
                }
            }
        }
    });