From 14bebf32c093996b5dcc83dc0c416b06d42d4881 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Sun, 29 Jul 2018 03:40:03 +0200 Subject: [PATCH] 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); }