More efficient re-login

This commit is contained in:
Caesar2011
2019-02-03 17:11:58 +01:00
parent 3380e79232
commit a6b34f7814
4 changed files with 40 additions and 22 deletions

View File

@@ -22,6 +22,11 @@ public class Login extends HTTPService {
public static final int RESTORE_STATUS_SUCCESS = 1;
public static final int RESTORE_STATUS_ERROR = 2;
public static final int RESTORE_STATUS_INVALID_PASSWORD = 3;
public static final int LOGOUT_KVV = 2;
public static final int LOGOUT_BB = 1;
public static final int RELOGIN = 0;
private final KVVListener mListener;
@Nullable private LoginTokenKVV mTokenKVV;
@Nullable private LoginTokenBB mTokenBB;
@@ -110,14 +115,25 @@ public class Login extends HTTPService {
return mTokenBB;
}
void refreshLogin(NetworkCallback<Pair<LoginTokenKVV, LoginTokenBB>> success, NetworkErrorCallback error) {
void refreshLogin(NetworkCallback<Pair<LoginTokenKVV, LoginTokenBB>> success, NetworkErrorCallback error, int flags) {
boolean isFirst = mRefreshCallbacks.isEmpty();
mRefreshCallbacks.add(success, error);
if (!isFirst)
return;
refreshLoginRunner(success, error, flags);
}
private void refreshLoginRunner(NetworkCallback<Pair<LoginTokenKVV, LoginTokenBB>> success, NetworkErrorCallback error, int flags) {
CustomAccountManager manager = mListener.getAccountManager();
if ((flags & LOGOUT_KVV) == LOGOUT_KVV) {
manager.doInvalidateToken(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_KVV, ignored -> {
manager.doInvalidateToken(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_BLACKBOARD, ignored2 -> {
refreshLoginRunner(success, error, flags & ~LOGOUT_KVV);
});
} else if ((flags & LOGOUT_BB) == LOGOUT_BB) {
manager.doInvalidateToken(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_BLACKBOARD, ignored -> {
refreshLoginRunner(success, error, flags & ~LOGOUT_BB);
});
} else if (flags == RELOGIN) {
restoreOnlineLogin(restoreResult -> {
if (restoreResult == RESTORE_STATUS_SUCCESS)
testLoginToken(mRefreshCallbacks::responseResponse, mRefreshCallbacks::responseError);
@@ -128,8 +144,9 @@ public class Login extends HTTPService {
mRefreshCallbacks.responseError(new NetworkError(100181, 403, "Re-login failed (error)!"));
}
});
});
});
} else {
throw new IllegalArgumentException("Invalid flag in refreshLoginRunner: "+flags);
}
}

View File

@@ -14,6 +14,7 @@ import java.util.LinkedHashSet;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import androidx.arch.core.util.Function;
import de.sebse.fuplanner.services.kvv.types.Lecturer;
import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.services.kvv.types.Semester;
@@ -129,7 +130,7 @@ public class ModulesList extends HTTPService {
mQueue.next();
return;
}
NetworkErrorCallback errorFunc = (error -> {
Function<Integer, NetworkErrorCallback> errorFunc = ((Integer errorCode) -> (error -> {
if (retries > 0 && (error.getHttpStatus() == 401 || error.getHttpStatus() == 403)) {
mLogin.refreshLogin(success -> {
recv(callback, errorCallback, forceRefresh, retries - 1);
@@ -137,12 +138,12 @@ public class ModulesList extends HTTPService {
}, error1 -> {
errorCallback.onError(error1);
mQueue.next();
});
}, errorCode);
return;
}
errorCallback.onError(error);
mQueue.next();
});
}));
this.upgradeKVV(successKVV -> {
this.upgradeBlackboard(successKVV, success -> {
if (this.mModules == null)
@@ -153,8 +154,8 @@ public class ModulesList extends HTTPService {
}
callback.onResponse(this.mModules);
mQueue.next();
}, errorFunc);
}, errorFunc);
}, errorFunc.apply(Login.LOGOUT_BB));
}, errorFunc.apply(Login.LOGOUT_KVV));
});
}

View File

@@ -261,7 +261,7 @@ public class ModulesResources extends PartModules<ArrayList<Resource>> {
if (retries >= 0 && (error.getHttpStatus() == 401 || error.getHttpStatus() == 403)) {
mLogin.refreshLogin(success -> {
file(filename, url, modulename, callback, errorCallback, forceRefresh, retries-1);
}, errorCallback);
}, errorCallback, url.contains("lms.fu-berlin.de") ? Login.LOGOUT_BB : Login.LOGOUT_KVV);
return;
}
errorCallback.onError(error);

View File

@@ -39,7 +39,7 @@ abstract class PartModules<T> extends Part<Modules.Module> {
}, error1 -> {
errorCallback.onError(error1);
mQueue.next();
});
}, module.getModuleType() == Modules.TYPE_BB ? Login.LOGOUT_BB : Login.LOGOUT_KVV);
return;
}
errorCallback.onError(error);