From 99933d5f8005e0224ee62945018df01c7a31b3ca Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Mon, 12 Nov 2018 18:40:15 +0100 Subject: [PATCH] Implemented Network Callback --- .../java/de/sebse/fuplanner/MainActivity.java | 11 ++++ .../fuplanner/services/KVV/KVVListener.java | 6 ++ .../fuplanner/services/KVV/KVVModules.java | 4 ++ .../sebse/fuplanner/tools/EventListener.java | 28 +++++++++ .../fuplanner/tools/MainActivityListener.java | 4 +- .../fuplanner/tools/network/HTTPService.java | 58 ++++++++++++++++--- 6 files changed, 101 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/EventListener.java diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index 7e6cd53..52d61a7 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -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); + } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVListener.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVListener.java index 5304f33..df3b43f 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVListener.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVListener.java @@ -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(); } diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModules.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModules.java index 8f8e456..52d0a52 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModules.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModules.java @@ -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; diff --git a/app/src/main/java/de/sebse/fuplanner/tools/EventListener.java b/app/src/main/java/de/sebse/fuplanner/tools/EventListener.java new file mode 100644 index 0000000..7e1afd2 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/EventListener.java @@ -0,0 +1,28 @@ +package de.sebse.fuplanner.tools; + +import com.google.android.gms.common.util.Function; + +import java.util.HashMap; + +public class EventListener { + private HashMap> list = new HashMap<>(); + + public void add(String id,EventFunction listener) { + list.put(id, listener); + } + + public void remove(String id) { + list.remove(id); + } + + public void emit(T value) { + for (EventFunction listener : list.values()) { + listener.apply(value); + } + } + + @FunctionalInterface + public interface EventFunction { + void apply(T value); + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java b/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java index e41fe62..3cc12d9 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java @@ -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); diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java index 088247a..96b9b00 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java @@ -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 errorResponseListener = new EventListener<>(); + private EventListener successResponseListener = new EventListener<>(); protected HTTPService(Context context) { this.mContext = context; requestQueue = Volley.newRequestQueue(context, new BetterHurlStack(false)); } + public void addErrorListener(String id, EventListener.EventFunction listener) { + errorResponseListener.add(id, listener); + } + + public void removeErrorListener(String id) { + errorResponseListener.remove(id); + } + + public void addSuccessListener(String id, EventListener.EventFunction listener) { + successResponseListener.add(id, listener); + } + + public void removeSuccessListener(String id) { + successResponseListener.remove(id); + } + protected void get(String url, @Nullable final HashMap cookies, Response.Listener 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 getHeaders() throws AuthFailureError { Map 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 getHeaders() throws AuthFailureError { Map params = super.getHeaders(); if (cookies != null) {