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.Toast;
import com.android.volley.NetworkResponse;
import com.google.android.material.navigation.NavigationView;
import java.util.HashMap;
@@ -547,4 +548,14 @@ public class MainActivity extends AppCompatActivity
public void onModuleListChange() {
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;
import com.android.volley.NetworkResponse;
import de.sebse.fuplanner.services.GoogleAuth.Credentials;
import de.sebse.fuplanner.services.KVV.types.LoginToken;
import de.sebse.fuplanner.tools.network.NetworkCallback;
@@ -13,4 +15,8 @@ public interface KVVListener {
void handleLogout();
void onModuleListChange();
void onNetworkError(NetworkResponse networkResponse);
void onNetworkSuccess();
}

View File

@@ -56,6 +56,8 @@ public class KVVModules {
public KVVModulesList list() {
if (mList == null) {
mList = new KVVModulesList(mLogin, mListener, context);
mList.addErrorListener("KVVModules", error -> mListener.onNetworkError(error.networkResponse));
mList.addSuccessListener("KVVModules", success -> mListener.onNetworkSuccess());
}
return mList;
}
@@ -66,6 +68,8 @@ public class KVVModules {
Part o = mAddons.get(addon);
if (o == null) {
o = creatorInterface.create();
o.addErrorListener("KVVModules", error -> mListener.onNetworkError(error.networkResponse));
o.addSuccessListener("KVVModules", success -> mListener.onNetworkSuccess());
mAddons.put(addon, 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();
void onRefreshCompleted(boolean isFailed);
CanteenBrowser getCanteenBrowser();
void onRefreshCompleted(boolean isFailed);
void addRequestPermissionsResultListener(RequestPermissionsResultListener listener, 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.VolleyError;
import com.android.volley.toolbox.Volley;
import com.google.android.gms.common.util.Function;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
@@ -17,6 +18,7 @@ import java.util.HashMap;
import java.util.Map;
import androidx.annotation.Nullable;
import de.sebse.fuplanner.tools.EventListener;
import de.sebse.fuplanner.tools.logging.Logger;
/**
@@ -27,35 +29,64 @@ public class HTTPService {
private final RequestQueue requestQueue;
private final Context mContext;
protected Logger log = new Logger(this);
private EventListener<VolleyError> errorResponseListener = new EventListener<>();
private EventListener<Result> successResponseListener = new EventListener<>();
protected HTTPService(Context context) {
this.mContext = context;
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) {
HttpRequest request = new HttpRequest(Request.Method.GET, url, response, error) {
@Override
public void deliverError(VolleyError error) {
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) {
int statusCode;
if (error instanceof TimeoutError)
statusCode = 408;
else
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 {
final int status = error.networkResponse.statusCode;
if (status == 302) {
super.deliverResponse(new Result(null, error.networkResponse.headers));
deliverResponse(new Result(null, error.networkResponse.headers));
} 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 {
Map<String, String> params = super.getHeaders();
if (cookies != null) {
@@ -109,24 +140,35 @@ public class HTTPService {
@Override
public void deliverError(VolleyError error) {
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) {
int statusCode;
if (error instanceof TimeoutError)
statusCode = 408;
else
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 {
final int status = error.networkResponse.statusCode;
if (status == 302) {
super.deliverResponse(new Result(null, error.networkResponse.headers));
deliverResponse(new Result(null, error.networkResponse.headers));
} 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 {
Map<String, String> params = super.getHeaders();
if (cookies != null) {