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.