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 4edb49d..6923fa3 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 @@ -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,26 +115,38 @@ public class Login extends HTTPService { return mTokenBB; } - void refreshLogin(NetworkCallback> success, NetworkErrorCallback error) { + void refreshLogin(NetworkCallback> success, NetworkErrorCallback error, int flags) { boolean isFirst = mRefreshCallbacks.isEmpty(); mRefreshCallbacks.add(success, error); if (!isFirst) return; + refreshLoginRunner(success, error, flags); + } + + private void refreshLoginRunner(NetworkCallback> success, NetworkErrorCallback error, int flags) { CustomAccountManager manager = mListener.getAccountManager(); - manager.doInvalidateToken(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_KVV, ignored -> { - manager.doInvalidateToken(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_BLACKBOARD, ignored2 -> { - restoreOnlineLogin(restoreResult -> { - if (restoreResult == RESTORE_STATUS_SUCCESS) - testLoginToken(mRefreshCallbacks::responseResponse, mRefreshCallbacks::responseError); - else if (restoreResult == RESTORE_STATUS_INVALID_PASSWORD) { - logout(true); - mRefreshCallbacks.responseError(new NetworkError(100180, 403, "Re-login failed (password)!")); - } else { - mRefreshCallbacks.responseError(new NetworkError(100181, 403, "Re-login failed (error)!")); - } - }); + if ((flags & LOGOUT_KVV) == LOGOUT_KVV) { + manager.doInvalidateToken(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_KVV, ignored -> { + 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); + else if (restoreResult == RESTORE_STATUS_INVALID_PASSWORD) { + logout(true); + mRefreshCallbacks.responseError(new NetworkError(100180, 403, "Re-login failed (password)!")); + } else { + mRefreshCallbacks.responseError(new NetworkError(100181, 403, "Re-login failed (error)!")); + } + }); + } else { + throw new IllegalArgumentException("Invalid flag in refreshLoginRunner: "+flags); + } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java index 7c49a4d..15681f4 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java @@ -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 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)); }); } diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesResources.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesResources.java index da2925c..2692cb2 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesResources.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesResources.java @@ -257,11 +257,11 @@ public class ModulesResources extends PartModules> { return; } } - fileUpgrade(filename, url , modulename, callback, error -> { + fileUpgrade(filename, url, modulename, callback, error -> { 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); diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/PartModules.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/PartModules.java index 3a1905c..bea78db 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/PartModules.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/PartModules.java @@ -39,7 +39,7 @@ abstract class PartModules extends Part { }, error1 -> { errorCallback.onError(error1); mQueue.next(); - }); + }, module.getModuleType() == Modules.TYPE_BB ? Login.LOGOUT_BB : Login.LOGOUT_KVV); return; } errorCallback.onError(error);