package com.jbvincey.instantappssample.repositories; import android.content.Context; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.jbvincey.instantappssample.model.Trip; import org.apache.commons.io.IOUtils; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import io.reactivex.Maybe; import io.reactivex.Observable; import io.reactivex.ObservableSource; import io.reactivex.Single; import io.reactivex.functions.Function; import io.reactivex.functions.Predicate; /** * Created by jean-baptistevincey on 18/06/2017. */ public class TripRepository { private Gson gson; private Context applicationContext; public TripRepository(Context applicationContext) { GsonBuilder gsonBuilder = new GsonBuilder(); gson = gsonBuilder.create(); this.applicationContext = applicationContext; } public Single<List<Trip>> getTrips() { return Single.fromCallable(new Callable<List<Trip>>() { @Override public List<Trip> call() throws Exception { Type listType = new TypeToken<ArrayList<Trip>>() { }.getType(); List<Trip> tripList = gson.fromJson( IOUtils.toString(applicationContext.getAssets().open("trips/trips.json"), "UTF-8"), listType ); return tripList; } }); } public Maybe<Trip> getTrip(final String tripId) { return getTrips() .toObservable() .flatMap(new Function<List<Trip>, ObservableSource<? extends Trip>>() { @Override public ObservableSource<? extends Trip> apply(List<Trip> tripList) throws Exception { return Observable.fromIterable(tripList); } }) .filter(new Predicate<Trip>() { @Override public boolean test(Trip trip) throws Exception { return trip.getId().equals(tripId); } }) .singleElement(); } }