Fixed Re-login Bug
This commit is contained in:
@@ -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<LoginToken> 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<LoginToken> 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<LoginToken> 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);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ final public class ModulesDetails extends Part<Pair<Modules.Module, Boolean>> {
|
||||
|
||||
@Override
|
||||
protected void recv(final Modules.Module module, final NetworkCallback<Pair<Modules.Module, Boolean>> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) {
|
||||
log.d(mLogin.getLoginToken());
|
||||
final int[] returned = {0};
|
||||
AtomicReference<NetworkError> lastError = new AtomicReference<>(null);
|
||||
NetworkCallback<Modules.Module> successCb = success -> {
|
||||
|
||||
@@ -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<T> extends HashSet<Pair<NetworkCallback<T>, NetworkErrorCallback>> {
|
||||
public void add(NetworkCallback<T> success, NetworkErrorCallback error) {
|
||||
add(new Pair<>(success, error));
|
||||
}
|
||||
|
||||
public void responseError(NetworkError error) {
|
||||
Iterator<Pair<NetworkCallback<T>, NetworkErrorCallback>> i;
|
||||
for (i = this.iterator(); i.hasNext();) {
|
||||
Pair<NetworkCallback<T>, NetworkErrorCallback> pair = i.next();
|
||||
pair.second.onError(error);
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
|
||||
public void responseResponse(T success) {
|
||||
Iterator<Pair<NetworkCallback<T>, NetworkErrorCallback>> i;
|
||||
for (i = this.iterator(); i.hasNext();) {
|
||||
Pair<NetworkCallback<T>, NetworkErrorCallback> pair = i.next();
|
||||
pair.first.onResponse(success);
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user