Fixed Re-login Bug

This commit is contained in:
Caesar2011
2018-11-16 23:23:16 +01:00
parent 1d90b3e9da
commit 14b38f22a3
4 changed files with 56 additions and 2 deletions

View File

@@ -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);
});
}

View File

@@ -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 -> {

View File

@@ -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();
}
}
}

View File

@@ -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));