How to force on Task from firestore to wait for updated from RoomDB

27 views Asked by At

Structure of my app looks like that if needed there will be updated from firestore to roomDB. What my problem is that I don't know how to force waiting for firestore Task to wait for new data from roomDB. Here is my case:

public LiveData<List<TimeModel>> getAllTimeModelsForAdminSQL(String userId) {

    executor.execute(new Runnable() {
        @Override
        public void run() {
            List<TimeModel> value = timeModelDAO.getAllTimeModelsList(userId);
            collectionReferenceTime.whereEqualTo("id", userId).whereGreaterThan("timestamp", countMethod(value))
                    .get()
                    .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                        @Override
                        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                            if (!queryDocumentSnapshots.isEmpty()) {
                                List<TimeModel> timeModelArrayList = new ArrayList<>();
                                for (QueryDocumentSnapshot timeModels : queryDocumentSnapshots) {

                                    TimeModel timeModel = timeModels.toObject(TimeModel.class);

                                    timeModelArrayList.add(timeModel);
                                    Collections.sort(timeModelArrayList, new Comparator<TimeModel>() {
                                        @Override
                                        public int compare(TimeModel o1, TimeModel o2) {
                                            return o1.getTimeAdded().compareTo(o2.getTimeAdded());
                                        }
                                    });
    
                                }

                                saveAllCollectionToSQLite(timeModelArrayList);
                                updateDataSQLite(timeModelArrayList);
                        
                                collectionReferenceUser.whereEqualTo("userId", userId).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                                    @Override
                                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                                        if (!queryDocumentSnapshots.isEmpty()) {
                                            for (QueryDocumentSnapshot users : queryDocumentSnapshots) {
                                                executor.execute(new Runnable() {
                                                    @Override
                                                    public void run() {
                                                        User user = users.toObject(User.class);
                                                        long hoursToSettle = user.getHoursOverall();
                                                        long timeModelSumForTimeOverall = sumUp(timeModelDAO.getAllTimeModelsList(userId));

                                                        if (hoursToSettle != timeModelSumForTimeOverall) {
                                                        
                                                            timeModelDAO.deleteListForTimeModel(userId);
                                                            getDataFirebase(userId, new Timestamp(new Date(0)));
                                                        }
                                                    }
                                                });
                                            }
                                        }
                                    }
                                });
                            }
                        }
                    });
        }
    });
    return timeModelDAO.getAllTimeModels(userId);
}

So from first Task I need to saveAllCollectionToSQLite(timeModelArrayList) or updateDataSQLite(timeModelArrayList), then in second task I download timeModelDAO.getAllTimeModelsList(userId), but sometimes save or updated don't finished their work from first task and already timeModelDAO.getAllTimeModelsList(userId) is invoked.

What I want is that full save or full updated and then app can download data. I thought about RXJava3, but maybe there is simplest solution.

0

There are 0 answers