package de.guerda.matekarte.common.request;
import android.location.Location;
import android.util.Log;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Locale;
import de.guerda.matekarte.dealers.DealersList;
import de.guerda.matekarte.dealers.DealersListDeserializer;
import de.guerda.matekarte.dealers.Radius;
import de.janmatuschek.GeoLocation;
/**
* Created by iulius on 18/01/15.
*/
public class DealersDownloadRequest extends MatekarteRequest<DealersList> {
private static final String LOGTAG = DealersDownloadRequest.class.getSimpleName();
private static final double EARTH_RADIUS = 6371.01;
private static final String URL_DEALERS = "dealers/map";
private final DealersListDeserializer dealersListDeserializer = new DealersListDeserializer();
private final Location location;
private final Radius radius;
private DealersList dealersList;
public DealersDownloadRequest(Location location, Radius radius) {
super(DealersList.class);
this.location = location;
this.radius = radius;
Log.i(LOGTAG, "Creating DealersDownloadRequest");
}
private String getBoundingBoxParameters() {
double tmpLat = location.getLatitude();
double tmpLon = location.getLongitude();
GeoLocation tmpGeoLocation = GeoLocation.fromDegrees(tmpLat, tmpLon);
GeoLocation[] tmpBoundingBoxLocations = tmpGeoLocation.boundingCoordinates(radius.getKilometers(), EARTH_RADIUS);
double[] tmpBoundingBox = new double[]{tmpBoundingBoxLocations[0].getLatitudeInDegrees(), tmpBoundingBoxLocations[0].getLongitudeInDegrees(), tmpBoundingBoxLocations[1].getLatitudeInDegrees(), tmpBoundingBoxLocations[1].getLongitudeInDegrees()};
return getBoundingBoxParameters(tmpBoundingBox);
}
private String getBoundingBoxParameters(double[] aBoundingBox) {
//example: "?t=48.165856&r=11.640015&b=48.112933&l=11.525345";
//0: MINLAT --> bottom
//1: MINLON --> left
//2: MAXLAT --> top
//3: MAXLON --> right
return String.format(Locale.US, "?b=%f&l=%f&t=%f&r=%f", aBoundingBox[0], aBoundingBox[1], aBoundingBox[2], aBoundingBox[3]);
}
@Override
public DealersList loadDataFromNetwork() throws Exception {
String url = URL_BASE + URL_DEALERS + getBoundingBoxParameters();
HttpRequest request = getHttpRequestFactory().buildGetRequest(new GenericUrl(url));
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(DealersList.class, dealersListDeserializer);
Gson gson = gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
DealersList result;
try (InputStream in = request.execute().getContent()) {
result = gson.fromJson(new InputStreamReader(in), DealersList.class);
} catch (Exception e) {
throw e;
}
return result;
}
}