package dk.dr.radio.net.volley;
import com.android.volley.Cache;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.StringRequest;
import dk.dr.radio.diverse.App;
import dk.dr.radio.diverse.Log;
/**
* Oprettet af Jacob Nordfalk d 13-03-14.
*/
public class DrVolleyStringRequest extends StringRequest {
private final DrVolleyResonseListener lytter;
public DrVolleyStringRequest(String url, final DrVolleyResonseListener listener) {
super(url, listener, listener);
lytter = listener;
lytter.url = url;
if (!App.PRODUKTION && url.contains("channel/p4?")) {
throw new IllegalStateException("P4 streamURL kaldt, uden underkanal: "+url);
}
App.sætErIGang(true, url);
/*
* DRs serverinfrastruktur caches med Varnish, men det kan tage lang tid for den bagvedliggende
* serverinfrastruktur at svare.
*/
setRetryPolicy(new DefaultRetryPolicy(4000, 3, 1.5f)); // Ny instans hver gang, da der ændres i den
Cache.Entry response = App.volleyRequestQueue.getCache().get(url);
if (response == null) return; // Vi har ikke en cachet udgave
try {
//String contentType = response.responseHeaders.get(HTTP.CONTENT_TYPE);
// Fix: Det er set at Volley ikke husker contentType, og dermed går tegnsættet tabt. Gæt på UTF-8 hvis det sker
//String charset = contentType==null?HTTP.UTF_8:HttpHeaderParser.parseCharset(response.responseHeaders);
//lytter.cachetVærdi = new String(response.data, charset);
lytter.cachetVærdi = new String(response.data, HttpHeaderParser.parseCharset(response.responseHeaders));
// Vi kalder fikSvar i forgrundstråden - og dermed må forespørgsler ikke foretages direkte
// fra en listeopdatering eller fra getView
lytter.fikSvar(listener.cachetVærdi, true, false);
} catch (Exception e) {
Log.e(e);
// En fejl i den cachede værdi - smid indholdet af cachen væk, det kan alligevel ikke bruges
App.volleyRequestQueue.getCache().remove(url);
return;
} catch (Throwable e) {
// Der kom sandsynligvis en OOM! Smid indholdet af cachen væk, det fylder alligevel for meget i RAM
Log.rapporterFejl(e);
}
}
@Override
public void cancel() {
super.cancel();
lytter.annulleret();
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
// ignorér forbud mod caching - i vores tilfælde er en gammel værdi er altid bedre at have liggende end ingen
response.headers.remove("Cache-Control");
return super.parseNetworkResponse(response);
}
}