From f05e151a7a062fb71657995c8a457b94220c139a Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Sat, 28 Jul 2018 19:49:14 +0200 Subject: [PATCH 1/2] Login Refactoring --- .../java/de/sebse/fuplanner/MainActivity.java | 37 ++++++++++++---- .../fuplanner/fragments/LoginFragment.java | 6 +-- .../de/sebse/fuplanner/services/KVV/KVV.java | 44 ++++++++++++++----- .../fuplanner/services/KVV/KVVModuleList.java | 2 +- .../services/KVV/types/LoginToken.java | 2 +- .../tools/MainAcitivityListener.java | 4 ++ app/src/main/res/layout/app_bar_main.xml | 22 ++++++++++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 2 + 9 files changed, 96 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index be22567..9ab81fd 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -91,12 +91,12 @@ public class MainActivity extends AppCompatActivity LoginToken loginToken = getKVV().easyLogin(); if (newFragmentPage != FRAGMENT_LOGIN && newFragmentPage != FRAGMENT_STARTUP && newFragmentPage != FRAGMENT_NONE) { if (loginToken != null) - toLoginState(loginToken, newFragmentPage, newFragmentData); + toLoginState(loginToken, newFragmentPage, newFragmentData, true); else checkAndDoLogin(); } else { if (loginToken != null) - toLoginState(loginToken, getDefaultFragmentAfterLogin(), ""); + toLoginState(loginToken, getDefaultFragmentAfterLogin(), "", true); else checkAndDoLogin(); } @@ -227,22 +227,29 @@ public class MainActivity extends AppCompatActivity private void toLogoutState() { changeFragment(FRAGMENT_LOGIN); + View offline_header = findViewById(R.id.offline_msg); + offline_header.setVisibility(View.GONE); } - private void toLoginState(LoginToken loginToken, int newFragment, String newData) { + private void toLoginState(LoginToken loginToken, int newFragment, String newData, boolean onlineMode) { if (loginToken == null) { toLogoutState(); } else { - toLoginState(loginToken.getFullname(), loginToken.getEmail(), newFragment, newData); + toLoginState(loginToken.getFullname(), loginToken.getEmail(), newFragment, newData, onlineMode); } } - private void toLoginState(String fullname, String email, int newFragment, String newData) { + private void toLoginState(String fullname, String email, int newFragment, String newData, boolean onlineMode) { changeFragment(newFragment, newData); View header = mNavigationView.getHeaderView(0); ((TextView) header.findViewById(R.id.login_name)).setText(fullname); ((TextView) header.findViewById(R.id.login_mail)).setText(email); + View offline_header = findViewById(R.id.offline_msg); + if (onlineMode) + offline_header.setVisibility(View.GONE); + else + offline_header.setVisibility(View.VISIBLE); } private void checkAndDoLogin() { @@ -253,7 +260,7 @@ public class MainActivity extends AppCompatActivity return; } this.getKVV().login(credentials.getUsername(), credentials.getPassword(), success -> { - toLoginState(success, getDefaultFragmentAfterLogin(), ""); + toLoginState(success, getDefaultFragmentAfterLogin(), "", true); }, error -> { log.e(error); toLogoutState(); @@ -365,8 +372,8 @@ public class MainActivity extends AppCompatActivity - public void onLoginFragmentInteraction(LoginToken loginToken) { - toLoginState(loginToken.getFullname(), loginToken.getEmail(), getDefaultFragmentAfterLogin(), ""); + public void onLoginFragmentInteraction(LoginToken loginToken, boolean onlineMode) { + toLoginState(loginToken.getFullname(), loginToken.getEmail(), getDefaultFragmentAfterLogin(), "", onlineMode); } public void onModulesFragmentInteraction(final String itemID) { @@ -380,4 +387,18 @@ public class MainActivity extends AppCompatActivity public void onTitleTextChange(@StringRes int titleId) { setTitle(titleId); } + + public void loginTokenInvalid() { + //getKVV().invalidate(); + //checkAndDoLogin(); + log.d("Login token invalid!"); + } + + public void refreshFailed(boolean isFailed) { + View viewNoConnection = findViewById(R.id.no_connection_msg); + if (isFailed) + viewNoConnection.setVisibility(View.VISIBLE); + else + viewNoConnection.setVisibility(View.GONE); + } } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java index 0748ab7..267c162 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java @@ -69,7 +69,7 @@ public class LoginFragment extends Fragment { Button offline_btn = v.findViewById(R.id.btn_offline); offline_btn.setVisibility(View.VISIBLE); offline_btn.setText(v.getResources().getString(R.string.enter_offline_mode, modules.getToken().getUsername())); - offline_btn.setOnClickListener(v1 -> mListener.onLoginFragmentInteraction(modules.getToken())); + offline_btn.setOnClickListener(v1 -> mListener.onLoginFragmentInteraction(modules.getToken(), false)); } } } catch (IOException e) { @@ -102,7 +102,7 @@ public class LoginFragment extends Fragment { progressDialog.dismiss(); gauth.setLoginState(username, password); if (mListener != null) - mListener.onLoginFragmentInteraction(success); + mListener.onLoginFragmentInteraction(success, true); }, error -> { progressDialog.dismiss(); log.e("Error on KVV login!", error); @@ -148,6 +148,6 @@ public class LoginFragment extends Fragment { * >Communicating with Other Fragments for more information. */ public interface OnLoginFragmentInteractionListener { - void onLoginFragmentInteraction(LoginToken loginToken); + void onLoginFragmentInteraction(LoginToken loginToken, boolean onlineMode); } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java index d796585..1bb80a1 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java @@ -10,6 +10,7 @@ import java.util.HashMap; import de.sebse.fuplanner.services.KVV.types.LoginToken; import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.tools.MainAcitivityListener; import de.sebse.fuplanner.tools.network.NetworkCallback; import de.sebse.fuplanner.tools.network.NetworkErrorCallback; @@ -23,8 +24,11 @@ public class KVV { private boolean isLoginPending = true; private ArrayList updatingList; private HashMap addons = new HashMap<>(); + private MainAcitivityListener mListener; public KVV(Context context) { + if (context instanceof MainAcitivityListener) + mListener = (MainAcitivityListener) context; this.context = context; this.updatingList = new ArrayList<>(); } @@ -54,14 +58,18 @@ public class KVV { } public void logout() { - if (lastToken != null) { - lastToken.delete(this.context); - lastToken = null; - } KVVModuleList modules = (KVVModuleList) addons.get("modules"); if (modules != null) { modules.deleteModulesOffline(this.context); } + invalidate(); + } + + public void invalidate() { + if (lastToken != null) { + lastToken.delete(this.context); + lastToken = null; + } addons.clear(); this.isLoginPending = true; } @@ -77,7 +85,7 @@ public class KVV { modules = new KVVModuleList(KVV.this.context, token); addons.put("modules", modules); } - modules.getModule(id, saveOnCallback(modules, callback), error, forceRefresh); + modules.getModule(id, saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh); }); } @@ -92,7 +100,7 @@ public class KVV { modules = new KVVModuleList(KVV.this.context, token); addons.put("modules", modules); } - modules.getModuleList(saveOnCallback(modules, callback), error, forceRefresh); + modules.getModuleList(saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh); }); } @@ -101,7 +109,7 @@ public class KVV { } public void getModuleDetails(Modules.Module module, final NetworkCallback> callback, final NetworkErrorCallback error, boolean forceRefresh) { - getModulePart(modules -> modules.getModuleDetails(module, saveOnCallback(modules, callback), error, forceRefresh)); + getModulePart(modules -> modules.getModuleDetails(module, saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh)); } public void getModuleAnnouncements(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error) { @@ -109,7 +117,7 @@ public class KVV { } public void getModuleAnnouncements(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - getModulePart(modules -> modules.getAnnouncements(module, saveOnCallback(modules, callback), error, forceRefresh)); + getModulePart(modules -> modules.getAnnouncements(module, saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh)); } public void getModuleAssignments(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error) { @@ -117,7 +125,7 @@ public class KVV { } public void getModuleAssignments(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - getModulePart(modules -> modules.getAssignments(module, saveOnCallback(modules, callback), error, forceRefresh)); + getModulePart(modules -> modules.getAssignments(module, saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh)); } public void getModuleEvents(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error) { @@ -125,7 +133,7 @@ public class KVV { } public void getModuleEvents(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - getModulePart(modules -> modules.getEvents(module, saveOnCallback(modules, callback), error, forceRefresh)); + getModulePart(modules -> modules.getEvents(module, saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh)); } public void getModuleGradebook(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error) { @@ -133,7 +141,7 @@ public class KVV { } public void getModuleGradebook(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - getModulePart(modules -> modules.getGradebook(module, saveOnCallback(modules, callback), error, forceRefresh)); + getModulePart(modules -> modules.getGradebook(module, saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh)); } @@ -149,17 +157,29 @@ public class KVV { }); } - private NetworkCallback saveOnCallback(KVVModuleList modules, NetworkCallback callback){ + private NetworkCallback saveOnCallback(KVVModuleList modules, NetworkCallback callback, boolean forceRefresh){ return (success -> { try { modules.saveModulesOffline(this.context); } catch (IOException e) { e.printStackTrace(); } + if (forceRefresh) + mListener.refreshFailed(false); callback.onResponse(success); }); } + private NetworkErrorCallback errorOnCallback(NetworkErrorCallback errorCallback){ + return (error -> { + if (error.getHttpStatus() == 401 || error.getHttpStatus() == 403) + mListener.loginTokenInvalid(); + else + mListener.refreshFailed(true); + errorCallback.onError(error); + }); + } + @FunctionalInterface interface ModListFunction { void apply(KVVModuleList mod); diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java index a5c5895..f25c3b7 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java @@ -375,7 +375,7 @@ public class KVVModuleList extends HTTPService { private void getGradebookUpgrade(String ID, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { if (token == null) { - errorCallback.onError(new NetworkError(101104, 500, "Currently running in offline mode!")); + errorCallback.onError(new NetworkError(101504, 500, "Currently running in offline mode!")); return; } get(String.format("https://kvv.imp.fu-berlin.de/direct/gradebook/site/%s.json", ID ), token.getCookies(), response ->{ diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java index cd5c537..4f1a090 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java @@ -16,7 +16,7 @@ import java.util.HashMap; */ public class LoginToken implements Serializable { - private static final long EASY_LOGIN_TIME_MILLIS = 1000 * 60 * 60 * 3; + private static final long EASY_LOGIN_TIME_MILLIS = 1000 * 60 * 60 * 300; private static final String FILE_NAME = "LoginTokenSaving"; private final String username; diff --git a/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java b/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java index ea72e1d..84c74a0 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java @@ -13,4 +13,8 @@ public interface MainAcitivityListener { KVV getKVV(); GoogleAuth getGoogleAuth(); + + void loginTokenInvalid(); + + void refreshFailed(boolean isFailed); } diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index f835238..58e8c9b 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -19,6 +19,28 @@ android:background="@color/colorFUGreen" app:popupTheme="@style/AppTheme.PopupOverlay" /> + + + + #333333 #f5cccc #cca3a3 + #CC0000 + #FF9900 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70d9a4f..296af8a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,4 +38,6 @@ Events Gradebook Current Percentage + Offline Mode + Refresh failed... From 14bebf32c093996b5dcc83dc0c416b06d42d4881 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Sun, 29 Jul 2018 03:40:03 +0200 Subject: [PATCH 2/2] Login Restructuring Complete --- .../java/de/sebse/fuplanner/MainActivity.java | 56 +++++++++++-------- .../moddetails/ModDetailFragment.java | 7 ++- .../de/sebse/fuplanner/services/KVV/KVV.java | 29 +++------- .../fuplanner/services/KVV/KVVLogin.java | 12 ++-- .../fuplanner/services/KVV/KVVModuleList.java | 47 ++++++++++++++-- .../tools/MainAcitivityListener.java | 2 +- 6 files changed, 97 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index 9ab81fd..630e769 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -60,6 +60,7 @@ public class MainActivity extends AppCompatActivity private int fragmentPage = FRAGMENT_NONE; private String fragmentData = ""; private CanteenBrowser mCanteenBrowser; + private boolean mOfflineMode = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -91,22 +92,22 @@ public class MainActivity extends AppCompatActivity LoginToken loginToken = getKVV().easyLogin(); if (newFragmentPage != FRAGMENT_LOGIN && newFragmentPage != FRAGMENT_STARTUP && newFragmentPage != FRAGMENT_NONE) { if (loginToken != null) - toLoginState(loginToken, newFragmentPage, newFragmentData, true); + toLoginState(loginToken, newFragmentPage, newFragmentData); else checkAndDoLogin(); } else { if (loginToken != null) - toLoginState(loginToken, getDefaultFragmentAfterLogin(), "", true); + toLoginState(loginToken, getDefaultFragmentAfterLogin(), ""); else checkAndDoLogin(); } - this.getCanteenBrowser().getCanteens(success -> { + /*this.getCanteenBrowser().getCanteens(success -> { Canteen canteen = success.get(0); this.getCanteenBrowser().getCanteen(canteen, success1 -> { this.getCanteenBrowser().getDay(canteen.get(0), log::d, log::e, true); }, log::e, true); - }, log::e, true); + }, log::e, true);*/ } @Override @@ -227,15 +228,14 @@ public class MainActivity extends AppCompatActivity private void toLogoutState() { changeFragment(FRAGMENT_LOGIN); - View offline_header = findViewById(R.id.offline_msg); - offline_header.setVisibility(View.GONE); + setOfflineBanner(true); } - private void toLoginState(LoginToken loginToken, int newFragment, String newData, boolean onlineMode) { + private void toLoginState(LoginToken loginToken, int newFragment, String newData) { if (loginToken == null) { toLogoutState(); } else { - toLoginState(loginToken.getFullname(), loginToken.getEmail(), newFragment, newData, onlineMode); + toLoginState(loginToken.getFullname(), loginToken.getEmail(), newFragment, newData, true); } } @@ -245,11 +245,7 @@ public class MainActivity extends AppCompatActivity View header = mNavigationView.getHeaderView(0); ((TextView) header.findViewById(R.id.login_name)).setText(fullname); ((TextView) header.findViewById(R.id.login_mail)).setText(email); - View offline_header = findViewById(R.id.offline_msg); - if (onlineMode) - offline_header.setVisibility(View.GONE); - else - offline_header.setVisibility(View.VISIBLE); + setOfflineBanner(onlineMode); } private void checkAndDoLogin() { @@ -260,7 +256,7 @@ public class MainActivity extends AppCompatActivity return; } this.getKVV().login(credentials.getUsername(), credentials.getPassword(), success -> { - toLoginState(success, getDefaultFragmentAfterLogin(), "", true); + toLoginState(success, getDefaultFragmentAfterLogin(), ""); }, error -> { log.e(error); toLogoutState(); @@ -351,6 +347,24 @@ public class MainActivity extends AppCompatActivity this.fragmentData = newData; } + private void setOfflineBanner(boolean onlineMode) { + View offline_header = findViewById(R.id.offline_msg); + if (onlineMode) + offline_header.setVisibility(View.GONE); + else + offline_header.setVisibility(View.VISIBLE); + mOfflineMode = !onlineMode; + } + + private void setRefreshFailedBanner(boolean refreshFailed) { + View viewNoConnection = findViewById(R.id.no_connection_msg); + if (!mOfflineMode && refreshFailed) + viewNoConnection.setVisibility(View.VISIBLE); + else + viewNoConnection.setVisibility(View.GONE); + + } + private void afterAnyMenuInflate() { getCanteenBrowser().getCanteens(success -> { @@ -388,17 +402,13 @@ public class MainActivity extends AppCompatActivity setTitle(titleId); } - public void loginTokenInvalid() { - //getKVV().invalidate(); - //checkAndDoLogin(); - log.d("Login token invalid!"); + public void loginTokenInvalid(boolean doPrecheck) { + getKVV().invalidate(); + checkAndDoLogin(); + //log.d("Login token invalid!"); } public void refreshFailed(boolean isFailed) { - View viewNoConnection = findViewById(R.id.no_connection_msg); - if (isFailed) - viewNoConnection.setVisibility(View.VISIBLE); - else - viewNoConnection.setVisibility(View.GONE); + setRefreshFailedBanner(isFailed); } } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java index eb2dcc0..52c540a 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java @@ -10,6 +10,7 @@ import android.view.View; import android.view.ViewGroup; import de.sebse.fuplanner.R; +import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.tools.MainAcitivityListener; import de.sebse.fuplanner.tools.logging.Logger; @@ -58,7 +59,11 @@ public class ModDetailFragment extends Fragment implements ModDetailListener { } if (mListener != null) { mListener.onTitleTextChange(R.string.courses); - mListener.getKVV().getModuleList(success -> mListener.onTitleTextChange(success.get(mItemPos).title), log::e); + mListener.getKVV().getModuleList(success -> { + Modules.Module module = success.get(mItemPos); + if (module != null) + mListener.onTitleTextChange(module.title); + }, log::e); } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java index 1bb80a1..e807088 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java @@ -27,8 +27,7 @@ public class KVV { private MainAcitivityListener mListener; public KVV(Context context) { - if (context instanceof MainAcitivityListener) - mListener = (MainAcitivityListener) context; + mListener = (MainAcitivityListener) context; this.context = context; this.updatingList = new ArrayList<>(); } @@ -46,7 +45,7 @@ public class KVV { lastToken = success; this.endUpdate(); try { - login.saveOffline(this.context); + login.saveOffline(); } catch (IOException e) { e.printStackTrace(); } @@ -67,7 +66,7 @@ public class KVV { public void invalidate() { if (lastToken != null) { - lastToken.delete(this.context); + new KVVLogin(context).deleteOffline(); lastToken = null; } addons.clear(); @@ -79,14 +78,7 @@ public class KVV { } public void getModule(String id, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - this.getLastToken(token -> { - KVVModuleList modules = (KVVModuleList) addons.get("modules"); - if (modules == null) { - modules = new KVVModuleList(KVV.this.context, token); - addons.put("modules", modules); - } - modules.getModule(id, saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh); - }); + getModulePart(modules -> modules.getModule(id, saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh)); } public void getModuleList(final NetworkCallback callback, final NetworkErrorCallback error) { @@ -94,14 +86,7 @@ public class KVV { } public void getModuleList(final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - this.getLastToken(token -> { - KVVModuleList modules = (KVVModuleList) addons.get("modules"); - if (modules == null) { - modules = new KVVModuleList(KVV.this.context, token); - addons.put("modules", modules); - } - modules.getModuleList(saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh); - }); + getModulePart(modules -> modules.getModuleList(saveOnCallback(modules, callback, forceRefresh), errorOnCallback(error), forceRefresh)); } public void getModuleDetails(Modules.Module module, final NetworkCallback> callback, final NetworkErrorCallback error) { @@ -150,7 +135,7 @@ public class KVV { this.getLastToken(token -> { KVVModuleList modules = (KVVModuleList) addons.get("modules"); if (modules == null) { - modules = new KVVModuleList(KVV.this.context, token); + modules = new KVVModuleList(this.context, token); addons.put("modules", modules); } func.apply(modules); @@ -173,7 +158,7 @@ public class KVV { private NetworkErrorCallback errorOnCallback(NetworkErrorCallback errorCallback){ return (error -> { if (error.getHttpStatus() == 401 || error.getHttpStatus() == 403) - mListener.loginTokenInvalid(); + mListener.loginTokenInvalid(false); else mListener.refreshFailed(true); errorCallback.onError(error); diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVLogin.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVLogin.java index 0c7d5b5..6206377 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVLogin.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVLogin.java @@ -21,10 +21,12 @@ import de.sebse.fuplanner.tools.network.NetworkErrorCallback; */ class KVVLogin extends HTTPService { + private final Context mContext; private LoginToken loginToken; KVVLogin(Context context) { super(context, false); + this.mContext = context; try { this.loginToken = LoginToken.load(context); } catch (IOException e) { @@ -57,14 +59,14 @@ class KVVLogin extends HTTPService { } } - public void deleteOffline(Context context) { + public void deleteOffline() { if (this.loginToken != null) - this.loginToken.delete(context); + this.loginToken.delete(mContext); } - public void saveOffline(Context context) throws IOException { + public void saveOffline() throws IOException { if (this.loginToken != null) - this.loginToken.save(context); + this.loginToken.save(mContext); } @@ -103,7 +105,7 @@ class KVVLogin extends HTTPService { loginToken.setAdditionals(displayName, email); callback.onResponse(loginToken); } catch (JSONException e) { - errorCallback.onError(new NetworkError(100201, 403, "Cannot parse announcements!")); + errorCallback.onError(new NetworkError(100201, 403, "Cannot parse profile!")); return; } }, error -> errorCallback.onError(new NetworkError(100200, error.networkResponse.statusCode, "Testing login failed!"))); diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java index f25c3b7..4bd7d55 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java @@ -120,7 +120,11 @@ public class KVVModuleList extends HTTPService { errorCallback.onError(new NetworkError(101103, 403, "Cannot parse module list!")); return; } - callback.onResponse(modules); + // Empty module may *may be* because token is invalid -> check + if (modules.size() == 0) + testLogin(token, token -> callback.onResponse(modules), errorCallback); + else + callback.onResponse(modules); }, error -> errorCallback.onError(new NetworkError(101104, error.networkResponse.statusCode, "Cannot get module list!"))); } @@ -228,7 +232,11 @@ public class KVVModuleList extends HTTPService { errorCallback.onError(new NetworkError(101202, 403, "Cannot parse announcements!")); return; } - callback.onResponse(announcements); + // Empty announcements may *may be* because token is invalid -> check + if (announcements.size() == 0) + testLogin(token, token -> callback.onResponse(announcements), errorCallback); + else + callback.onResponse(announcements); }, error -> errorCallback.onError(new NetworkError(101203, error.networkResponse.statusCode, "Cannot get announcements!"))); } @@ -293,7 +301,11 @@ public class KVVModuleList extends HTTPService { errorCallback.onError(new NetworkError(101302, 403, "Cannot parse announcements!")); return; } - callback.onResponse(assignments); + // Empty assignments may *may be* because token is invalid -> check + if (assignments.size() == 0) + testLogin(token, token -> callback.onResponse(assignments), errorCallback); + else + callback.onResponse(assignments); }, error -> errorCallback.onError(new NetworkError(101303, error.networkResponse.statusCode, "Cannot get assignments!"))); @@ -350,7 +362,11 @@ public class KVVModuleList extends HTTPService { return; } events.sort(); - callback.onResponse(events); + // Empty events may *may be* because token is invalid -> check + if (events.size() == 0) + testLogin(token, token -> callback.onResponse(events), errorCallback); + else + callback.onResponse(events); }, error -> errorCallback.onError(new NetworkError(101403, error.networkResponse.statusCode, "Cannot get calendar entries!"))); } @@ -409,4 +425,27 @@ public class KVVModuleList extends HTTPService { } + + + + + + // TODO Better, more elegant solution than duplicate code KVVLogin + private void testLogin(LoginToken loginToken, NetworkCallback callback, NetworkErrorCallback errorCallback) { + get(String.format("https://kvv.imp.fu-berlin.de/direct/profile/%s.json", loginToken.getUsername()), loginToken.getCookies(), response -> { + String body = response.getParsed(); + try { + JSONObject json = new JSONObject(body); + String displayName = json.getString("displayName"); + String email = json.getString("email"); + loginToken.setAdditionals(displayName, email); + callback.onResponse(loginToken); + } catch (JSONException e) { + errorCallback.onError(new NetworkError(100201, 403, "Cannot parse profile!")); + return; + } + }, error -> errorCallback.onError(new NetworkError(100200, error.networkResponse.statusCode, "Testing login failed!"))); + } + + } diff --git a/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java b/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java index 84c74a0..40facdd 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/MainAcitivityListener.java @@ -14,7 +14,7 @@ public interface MainAcitivityListener { GoogleAuth getGoogleAuth(); - void loginTokenInvalid(); + void loginTokenInvalid(boolean doPrecheck); void refreshFailed(boolean isFailed); }