Fixed Re-login Bug
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package de.sebse.fuplanner.services.KVV;
|
package de.sebse.fuplanner.services.KVV;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -10,11 +11,15 @@ import org.json.JSONObject;
|
|||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
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.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import de.sebse.fuplanner.services.KVV.types.LoginToken;
|
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.HTTPService;
|
||||||
import de.sebse.fuplanner.tools.network.NetworkCallback;
|
import de.sebse.fuplanner.tools.network.NetworkCallback;
|
||||||
import de.sebse.fuplanner.tools.network.NetworkError;
|
import de.sebse.fuplanner.tools.network.NetworkError;
|
||||||
@@ -25,6 +30,7 @@ public class Login extends HTTPService {
|
|||||||
@Nullable private LoginToken mToken;
|
@Nullable private LoginToken mToken;
|
||||||
private boolean mLoginPending = false;
|
private boolean mLoginPending = false;
|
||||||
private boolean mOnlineMode = false;
|
private boolean mOnlineMode = false;
|
||||||
|
private NetworkCallbackCollector<LoginToken> mRefreshCallbacks = new NetworkCallbackCollector<>();
|
||||||
|
|
||||||
Login(KVVListener listener, Context context) {
|
Login(KVVListener listener, Context context) {
|
||||||
super(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) {
|
public void doOnlineLogin(@NotNull String username, @NotNull String password, NetworkCallback<LoginToken> callback, NetworkErrorCallback errorCallback) {
|
||||||
if (mLoginPending) {
|
if (mLoginPending) {
|
||||||
errorCallback.onError(new NetworkError(100160, -1, "Login already pending!"));
|
errorCallback.onError(new NetworkError(100160, -1, "Login already pending!"));
|
||||||
|
log.t();
|
||||||
}
|
}
|
||||||
mLoginPending = true;
|
mLoginPending = true;
|
||||||
doLogin(username, password, token -> {
|
doLogin(username, password, token -> {
|
||||||
@@ -148,11 +155,18 @@ public class Login extends HTTPService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void refreshLogin(NetworkCallback<LoginToken> success, NetworkErrorCallback error) {
|
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 -> {
|
mListener.getCredentials(credentials -> {
|
||||||
doOnlineLogin(credentials.getUsername(), credentials.getPassword(), success, error);
|
doOnlineLogin(credentials.getUsername(), credentials.getPassword(),
|
||||||
|
success1 -> mRefreshCallbacks.responseResponse(success1),
|
||||||
|
error1 -> mRefreshCallbacks.responseError(error1));
|
||||||
}, e -> {
|
}, e -> {
|
||||||
logout(false);
|
logout(false);
|
||||||
error.onError(e);
|
mRefreshCallbacks.responseError(e);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ final public class ModulesDetails extends Part<Pair<Modules.Module, Boolean>> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void recv(final Modules.Module module, final NetworkCallback<Pair<Modules.Module, Boolean>> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) {
|
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};
|
final int[] returned = {0};
|
||||||
AtomicReference<NetworkError> lastError = new AtomicReference<>(null);
|
AtomicReference<NetworkError> lastError = new AtomicReference<>(null);
|
||||||
NetworkCallback<Modules.Module> successCb = success -> {
|
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);
|
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) {
|
private void longLog(String content, LogInterface logInterface) {
|
||||||
if (content.length() > 4000) {
|
if (content.length() > 4000) {
|
||||||
logInterface.run(tag, content.substring(0, 4000));
|
logInterface.run(tag, content.substring(0, 4000));
|
||||||
|
|||||||
Reference in New Issue
Block a user