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...