Files
MiniPogodynka/app/src/main/java/eur/one00kb/minipogodynka/weather/WeatherDataProvider.java
T

66 lines
2.1 KiB
Java

package eur.one00kb.minipogodynka.weather;
import android.content.Context;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import eur.one00kb.minipogodynka.R;
// TODO: For all data providers: check if the data parsed is correct and inline with the JSON.
// The exception handling part stinks.
public abstract class WeatherDataProvider {
private final String mUserAgent;
/**
* Must contain two floating point format specifiers for latitude and longitude, in order
*/
private String mAPILinkFormat;
public WeatherDataProvider(Context context) {
mUserAgent = String.format("%s", context.getString(R.string.app_name));
}
public void setAPILinkFormat(String format) {
mAPILinkFormat = format;
}
public Map<Date, List<WeatherData>> provide(double latitude, double longitude)
throws IOException {
String data = fetchData(latitude, longitude);
return parseData(data);
}
/**
* @param data The JSON or otherwise data to parse.
* @return A sorted hashmap with keys being Dates with just the day, month, and year, and the
* values being lists of hourly weather data.
*/
public abstract Map<Date, List<WeatherData>> parseData(String data);
public String fetchData(double latitude, double longitude) throws IOException {
URLConnection conn =
new URL(String.format(Locale.US, mAPILinkFormat, latitude, longitude))
.openConnection();
conn.setRequestProperty("User-Agent", mUserAgent);
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line).append("\n");
}
reader.close();
return builder.toString();
}
}