SDPepe/AppArt

View on GitHub
app/src/main/java/ch/epfl/sdp/appart/filter/FilterViewModel.java

Summary

Maintainability
A
0 mins
Test Coverage
C
78%
package ch.epfl.sdp.appart.filter;

import android.util.Log;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import ch.epfl.sdp.appart.ad.Ad;
import ch.epfl.sdp.appart.database.DatabaseService;
import ch.epfl.sdp.appart.location.geocoding.GoogleGeocodingService;
import ch.epfl.sdp.appart.location.place.locality.Locality;
import ch.epfl.sdp.appart.location.place.locality.LocalityFactory;
import ch.epfl.sdp.appart.location.place.locality.MalformedLocalityException;
import ch.epfl.sdp.appart.login.LoginService;
import ch.epfl.sdp.appart.scrolling.card.Card;
import ch.epfl.sdp.appart.user.User;
import dagger.hilt.android.lifecycle.HiltViewModel;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import javax.inject.Inject;

@HiltViewModel
public class FilterViewModel extends ViewModel {

  private List<Card> cardsFilter;
  final DatabaseService database;
  final GoogleGeocodingService geocodingService;
  private int min;
  private int max;
  private Locality city;
  private float range;



  @Inject
  public FilterViewModel(DatabaseService database, GoogleGeocodingService geocodingService) {
    this.database = database;
    this.geocodingService = geocodingService;
  }

  public CompletableFuture<Boolean> confirmFilter(){
      CompletableFuture<List<Card>> queriedCards = database.getCardsFilterPrice(min, max);
      return queriedCards.thenApply(cardList -> {
        List<Card> cardsFilterBuffer = new ArrayList<>();
        for (Card c : cardList){
          //remove postal code
          String [] l = c.getCity().split(" ", 2);
          try {
            Locality location = LocalityFactory.makeLocality(l[1]);
            float dist;
            dist = geocodingService.getDistance(location, city).get();
            //conversion in kilometers
            dist = dist/1000;
            if(dist <= range){
              cardsFilterBuffer.add(c);
            }
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
        cardsFilter = cardsFilterBuffer;
        return true;
      }).exceptionally(e -> false);
  }

  public List<Card> getCards() {
    return cardsFilter;
  }

  // setters
  public void setMin(int i) { min = i; }

  public void setMax(int i) { max = i; }


  public void setCity(String s) {
    city = LocalityFactory.makeLocality(s);
  }

  public void setRange(float i) {
    range = i;
  }





}