diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/Login.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/Login.java index 5f6d21d..a5bd208 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/Login.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/Login.java @@ -1,6 +1,7 @@ package de.sebse.fuplanner.services.KVV; import android.content.Context; +import android.util.Pair; import org.jetbrains.annotations.NotNull; @@ -10,11 +11,15 @@ import org.json.JSONObject; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import androidx.annotation.Nullable; import de.sebse.fuplanner.services.KVV.types.LoginToken; +import de.sebse.fuplanner.tools.NetworkCallbackCollector; import de.sebse.fuplanner.tools.network.HTTPService; import de.sebse.fuplanner.tools.network.NetworkCallback; import de.sebse.fuplanner.tools.network.NetworkError; @@ -25,6 +30,7 @@ public class Login extends HTTPService { @Nullable private LoginToken mToken; private boolean mLoginPending = false; private boolean mOnlineMode = false; + private NetworkCallbackCollector mRefreshCallbacks = new NetworkCallbackCollector<>(); Login(KVVListener listener, Context context) { super(context); @@ -34,6 +40,7 @@ public class Login extends HTTPService { public void doOnlineLogin(@NotNull String username, @NotNull String password, NetworkCallback callback, NetworkErrorCallback errorCallback) { if (mLoginPending) { errorCallback.onError(new NetworkError(100160, -1, "Login already pending!")); + log.t(); } mLoginPending = true; doLogin(username, password, token -> { @@ -148,11 +155,18 @@ public class Login extends HTTPService { } void refreshLogin(NetworkCallback success, NetworkErrorCallback error) { + boolean isFirst = mRefreshCallbacks.isEmpty(); + log.d("refresh", mRefreshCallbacks.size(), isFirst); + mRefreshCallbacks.add(success, error); + if (!isFirst) + return; mListener.getCredentials(credentials -> { - doOnlineLogin(credentials.getUsername(), credentials.getPassword(), success, error); + doOnlineLogin(credentials.getUsername(), credentials.getPassword(), + success1 -> mRefreshCallbacks.responseResponse(success1), + error1 -> mRefreshCallbacks.responseError(error1)); }, e -> { logout(false); - error.onError(e); + mRefreshCallbacks.responseError(e); }); } diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesDetails.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesDetails.java index a08fda4..f251af6 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesDetails.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesDetails.java @@ -20,6 +20,7 @@ final public class ModulesDetails extends Part> { @Override protected void recv(final Modules.Module module, final NetworkCallback> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) { + log.d(mLogin.getLoginToken()); final int[] returned = {0}; AtomicReference lastError = new AtomicReference<>(null); NetworkCallback successCb = success -> { diff --git a/app/src/main/java/de/sebse/fuplanner/tools/NetworkCallbackCollector.java b/app/src/main/java/de/sebse/fuplanner/tools/NetworkCallbackCollector.java new file mode 100644 index 0000000..91da5a4 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/NetworkCallbackCollector.java @@ -0,0 +1,34 @@ +package de.sebse.fuplanner.tools; + +import android.util.Pair; + +import java.util.HashSet; +import java.util.Iterator; + +import de.sebse.fuplanner.tools.network.NetworkCallback; +import de.sebse.fuplanner.tools.network.NetworkError; +import de.sebse.fuplanner.tools.network.NetworkErrorCallback; + +public class NetworkCallbackCollector extends HashSet, NetworkErrorCallback>> { + public void add(NetworkCallback success, NetworkErrorCallback error) { + add(new Pair<>(success, error)); + } + + public void responseError(NetworkError error) { + Iterator, NetworkErrorCallback>> i; + for (i = this.iterator(); i.hasNext();) { + Pair, NetworkErrorCallback> pair = i.next(); + pair.second.onError(error); + i.remove(); + } + } + + public void responseResponse(T success) { + Iterator, NetworkErrorCallback>> i; + for (i = this.iterator(); i.hasNext();) { + Pair, NetworkErrorCallback> pair = i.next(); + pair.first.onResponse(success); + i.remove(); + } + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/tools/logging/Logger.java b/app/src/main/java/de/sebse/fuplanner/tools/logging/Logger.java index a9ac6f7..3000aa7 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/logging/Logger.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/logging/Logger.java @@ -32,6 +32,11 @@ public class Logger { longLog(concat(msg), Log::e); } + public void t(Object... msg) { + longLog(concat(msg), Log::e); + new Error().printStackTrace(); + } + private void longLog(String content, LogInterface logInterface) { if (content.length() > 4000) { logInterface.run(tag, content.substring(0, 4000));