Implemented Network Callback

This commit is contained in:
Caesar2011
2018-11-12 18:40:15 +01:00
parent cceb317457
commit 99933d5f80
6 changed files with 101 additions and 10 deletions

View File

@@ -8,6 +8,7 @@ import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.android.volley.NetworkResponse;
import com.google.android.material.navigation.NavigationView; import com.google.android.material.navigation.NavigationView;
import java.util.HashMap; import java.util.HashMap;
@@ -547,4 +548,14 @@ public class MainActivity extends AppCompatActivity
public void onModuleListChange() { public void onModuleListChange() {
updateNavigation(); updateNavigation();
} }
@Override
public void onNetworkError(NetworkResponse networkResponse) {
setRefreshFailedBanner(true);
}
@Override
public void onNetworkSuccess() {
setRefreshFailedBanner(false);
}
} }

View File

@@ -1,5 +1,7 @@
package de.sebse.fuplanner.services.KVV; package de.sebse.fuplanner.services.KVV;
import com.android.volley.NetworkResponse;
import de.sebse.fuplanner.services.GoogleAuth.Credentials; import de.sebse.fuplanner.services.GoogleAuth.Credentials;
import de.sebse.fuplanner.services.KVV.types.LoginToken; import de.sebse.fuplanner.services.KVV.types.LoginToken;
import de.sebse.fuplanner.tools.network.NetworkCallback; import de.sebse.fuplanner.tools.network.NetworkCallback;
@@ -13,4 +15,8 @@ public interface KVVListener {
void handleLogout(); void handleLogout();
void onModuleListChange(); void onModuleListChange();
void onNetworkError(NetworkResponse networkResponse);
void onNetworkSuccess();
} }

View File

@@ -56,6 +56,8 @@ public class KVVModules {
public KVVModulesList list() { public KVVModulesList list() {
if (mList == null) { if (mList == null) {
mList = new KVVModulesList(mLogin, mListener, context); mList = new KVVModulesList(mLogin, mListener, context);
mList.addErrorListener("KVVModules", error -> mListener.onNetworkError(error.networkResponse));
mList.addSuccessListener("KVVModules", success -> mListener.onNetworkSuccess());
} }
return mList; return mList;
} }
@@ -66,6 +68,8 @@ public class KVVModules {
Part o = mAddons.get(addon); Part o = mAddons.get(addon);
if (o == null) { if (o == null) {
o = creatorInterface.create(); o = creatorInterface.create();
o.addErrorListener("KVVModules", error -> mListener.onNetworkError(error.networkResponse));
o.addSuccessListener("KVVModules", success -> mListener.onNetworkSuccess());
mAddons.put(addon, o); mAddons.put(addon, o);
} }
return o; return o;

View File

@@ -0,0 +1,28 @@
package de.sebse.fuplanner.tools;
import com.google.android.gms.common.util.Function;
import java.util.HashMap;
public class EventListener<T> {
private HashMap<String, EventFunction<T>> list = new HashMap<>();
public void add(String id,EventFunction<T> listener) {
list.put(id, listener);
}
public void remove(String id) {
list.remove(id);
}
public void emit(T value) {
for (EventFunction<T> listener : list.values()) {
listener.apply(value);
}
}
@FunctionalInterface
public interface EventFunction<T> {
void apply(T value);
}
}

View File

@@ -19,10 +19,10 @@ public interface MainActivityListener {
GoogleAuth getGoogleAuth(); GoogleAuth getGoogleAuth();
void onRefreshCompleted(boolean isFailed);
CanteenBrowser getCanteenBrowser(); CanteenBrowser getCanteenBrowser();
void onRefreshCompleted(boolean isFailed);
void addRequestPermissionsResultListener(RequestPermissionsResultListener listener, String id); void addRequestPermissionsResultListener(RequestPermissionsResultListener listener, String id);
void removeRequestPermissionsResultListener(String id); void removeRequestPermissionsResultListener(String id);

View File

@@ -10,6 +10,7 @@ import com.android.volley.Response;
import com.android.volley.TimeoutError; import com.android.volley.TimeoutError;
import com.android.volley.VolleyError; import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley; import com.android.volley.toolbox.Volley;
import com.google.android.gms.common.util.Function;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
@@ -17,6 +18,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import de.sebse.fuplanner.tools.EventListener;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
/** /**
@@ -27,35 +29,64 @@ public class HTTPService {
private final RequestQueue requestQueue; private final RequestQueue requestQueue;
private final Context mContext; private final Context mContext;
protected Logger log = new Logger(this); protected Logger log = new Logger(this);
private EventListener<VolleyError> errorResponseListener = new EventListener<>();
private EventListener<Result> successResponseListener = new EventListener<>();
protected HTTPService(Context context) { protected HTTPService(Context context) {
this.mContext = context; this.mContext = context;
requestQueue = Volley.newRequestQueue(context, new BetterHurlStack(false)); requestQueue = Volley.newRequestQueue(context, new BetterHurlStack(false));
} }
public void addErrorListener(String id, EventListener.EventFunction<VolleyError> listener) {
errorResponseListener.add(id, listener);
}
public void removeErrorListener(String id) {
errorResponseListener.remove(id);
}
public void addSuccessListener(String id, EventListener.EventFunction<Result> listener) {
successResponseListener.add(id, listener);
}
public void removeSuccessListener(String id) {
successResponseListener.remove(id);
}
protected void get(String url, @Nullable final HashMap<String, String> cookies, Response.Listener<Result> response, Response.ErrorListener error) { protected void get(String url, @Nullable final HashMap<String, String> cookies, Response.Listener<Result> response, Response.ErrorListener error) {
HttpRequest request = new HttpRequest(Request.Method.GET, url, response, error) { HttpRequest request = new HttpRequest(Request.Method.GET, url, response, error) {
@Override @Override
public void deliverError(VolleyError error) { public void deliverError(VolleyError error) {
if (error == null) { if (error == null) {
super.deliverError(new VolleyError(new NetworkResponse(500, null, true, 0, null))); deliver(new VolleyError(new NetworkResponse(500, null, true, 0, null)));
} else if (error.networkResponse == null) { } else if (error.networkResponse == null) {
int statusCode; int statusCode;
if (error instanceof TimeoutError) if (error instanceof TimeoutError)
statusCode = 408; statusCode = 408;
else else
statusCode = 500; statusCode = 500;
super.deliverError(new VolleyError(new NetworkResponse(statusCode, null, true, error.getNetworkTimeMs(), null))); deliver(new VolleyError(new NetworkResponse(statusCode, null, true, error.getNetworkTimeMs(), null)));
} else { } else {
final int status = error.networkResponse.statusCode; final int status = error.networkResponse.statusCode;
if (status == 302) { if (status == 302) {
super.deliverResponse(new Result(null, error.networkResponse.headers)); deliverResponse(new Result(null, error.networkResponse.headers));
} else { } else {
super.deliverError(error); deliver(error);
} }
} }
} }
@Override
protected void deliverResponse(Result response) {
successResponseListener.emit(response);
super.deliverResponse(response);
}
private void deliver(VolleyError error) {
errorResponseListener.emit(error);
super.deliverError(error);
}
public Map<String, String> getHeaders() throws AuthFailureError { public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = super.getHeaders(); Map<String, String> params = super.getHeaders();
if (cookies != null) { if (cookies != null) {
@@ -109,24 +140,35 @@ public class HTTPService {
@Override @Override
public void deliverError(VolleyError error) { public void deliverError(VolleyError error) {
if (error == null) { if (error == null) {
super.deliverError(new VolleyError(new NetworkResponse(500, null, true, 0, null))); deliver(new VolleyError(new NetworkResponse(500, null, true, 0, null)));
} else if (error.networkResponse == null) { } else if (error.networkResponse == null) {
int statusCode; int statusCode;
if (error instanceof TimeoutError) if (error instanceof TimeoutError)
statusCode = 408; statusCode = 408;
else else
statusCode = 500; statusCode = 500;
super.deliverError(new VolleyError(new NetworkResponse(statusCode, null, true, error.getNetworkTimeMs(), null))); deliver(new VolleyError(new NetworkResponse(statusCode, null, true, error.getNetworkTimeMs(), null)));
} else { } else {
final int status = error.networkResponse.statusCode; final int status = error.networkResponse.statusCode;
if (status == 302) { if (status == 302) {
super.deliverResponse(new Result(null, error.networkResponse.headers)); deliverResponse(new Result(null, error.networkResponse.headers));
} else { } else {
super.deliverError(error); deliver(error);
} }
} }
} }
private void deliver(VolleyError error) {
errorResponseListener.emit(error);
super.deliverError(error);
}
@Override
protected void deliverResponse(Result response) {
successResponseListener.emit(response);
super.deliverResponse(response);
}
public Map<String, String> getHeaders() throws AuthFailureError { public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = super.getHeaders(); Map<String, String> params = super.getHeaders();
if (cookies != null) { if (cookies != null) {