package dk.dr.radio.net.volley;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import dk.dr.radio.diverse.App;
import dk.dr.radio.diverse.Log;
/**
* DR Radios ResponseListener-klient til Volley.
* Lavet sådan at også cachede (eventuelt forældede) værdier leveres.
* Håndterer også at signalere over for brugeren når netværskommunikation er påbegyndt eller afsluttet
* Created by j on 13-03-14.
*/
public abstract class DrVolleyResonseListener implements Response.Listener<String>, Response.ErrorListener {
/**
* URL på anmodningen - rar at have til logning
*/
protected String url;
String cachetVærdi;
Exception startetHerfra;
public DrVolleyResonseListener() {
startetHerfra = new Exception();
}
@Override
public final void onResponse(String response) {
try {
boolean uændret = response != null && response.equals(cachetVærdi);
fikSvar(response, false, uændret);
App.sætErIGang(false, url);
} catch (Exception e) {
Log.e(url, e);
onErrorResponse(new VolleyError(e));
}
}
@Override
public final void onErrorResponse(VolleyError error) {
App.sætErIGang(false, url);
fikFejl(error);
}
/**
* Kaldes med svaret fra cachen (hvis der er et) og igen når svaret fra serveren ankommer
* @param response Svaret
* @param fraCache Normalt true første gang hvis svaret kommer fra cachen (og eventuelt er forældet).
* Normalt false anden gang hvor svaret kommer fra serveren.
* @param uændret Serveren svarede med de samme data som der var i cachen
* @throws Exception Hvis noget går galt i behandlingen - f.eks. ulovligt JSON kaldes fikFejl
*/
protected abstract void fikSvar(String response, boolean fraCache, boolean uændret) throws Exception;
/**
* Kaldes af Volley hvis der skete en netværksfejl. Kaldes også hvis behandlingen i #fikSvar gik galt.
* @param error Fejlen
*/
protected void fikFejl(VolleyError error) {
Log.e("fikFejl '" + error.networkResponse + "' for " + url, error);
//error.printStackTrace();
if (App.fejlsøgning) Log.e("fikFejl startet herfra:", startetHerfra);
}
/**
* Kaldes (fra DrVolleyStringRequest) hvis forespørgslen blev annulleret
*/
void annulleret() {
Log.d("annulleret for " + url);
App.sætErIGang(false, url);
}
}