diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index e718b89..dfdda0a 100644
Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ
diff --git a/app/build.gradle b/app/build.gradle
index a11823a..f23641c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -34,7 +34,7 @@ dependencies {
})
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
- implementation 'com.android.support.constraint:constraint-layout:1.1.0'
+ implementation 'com.android.support.constraint:constraint-layout:1.1.1'
implementation 'com.android.volley:volley:1.0.0'
//noinspection GradleDependency
implementation 'com.google.android.gms:play-services-auth:15.0.0'
@@ -45,5 +45,6 @@ dependencies {
implementation 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
implementation 'com.android.support:support-v4:27.1.1'
implementation 'org.jetbrains:annotations-java5:15.0'
+ implementation 'com.ms-square:expandableTextView:0.1.4'
implementation files('libs/jericho-html-3.4.jar')
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 31257ee..68361a7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -16,8 +16,8 @@
android:name=".MainActivity"
android:label="@string/app_name">
+
-
diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java
index 47b90be..1f7f726 100644
--- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java
+++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java
@@ -22,17 +22,11 @@ import de.sebse.fuplanner.fragments.LoginFragment;
import de.sebse.fuplanner.fragments.moddetails.ModDetailFragment;
import de.sebse.fuplanner.fragments.ModulesFragment;
import de.sebse.fuplanner.fragments.StartupFragment;
-import de.sebse.fuplanner.services.GoogleAuth.ConnectedListener;
import de.sebse.fuplanner.services.GoogleAuth.Credentials;
-import de.sebse.fuplanner.services.GoogleAuth.CredentialsListener;
import de.sebse.fuplanner.services.GoogleAuth.GoogleAuth;
import de.sebse.fuplanner.services.KVV.KVV;
-import de.sebse.fuplanner.services.KVV.LoginToken;
import de.sebse.fuplanner.services.KVV.Modules;
import de.sebse.fuplanner.tools.logging.Logger;
-import de.sebse.fuplanner.tools.network.NetworkCallback;
-import de.sebse.fuplanner.tools.network.NetworkError;
-import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener,
@@ -55,7 +49,7 @@ public class MainActivity extends AppCompatActivity
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
- drawer.setDrawerListener(toggle);
+ drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = findViewById(R.id.nav_view);
@@ -75,35 +69,23 @@ public class MainActivity extends AppCompatActivity
findViewById(R.id.app_bar_layout).setVisibility(View.GONE);
- this.getGoogleAuth().connect(new ConnectedListener() {
- @Override
- public void connected() {
- // getGoogleAuth().setLoginState("seedorf96", "m&gcwBaT@");
- getGoogleAuth().getLoginState(new CredentialsListener() {
- @Override
- public void onCredentials(final Credentials credentials) {
- if (credentials == null || credentials.getUsername() == null || credentials.getPassword() == null) {
- MainActivity.this.getKVV().endUpdate();
- changeLoginState(null);
- return;
- }
- MainActivity.this.getKVV().login(credentials.getUsername(), credentials.getPassword(), new NetworkCallback() {
- @Override
- public void onResponse(@NonNull LoginToken success) {
- MainActivity.this.getKVV().endUpdate();
- changeLoginState(credentials);
- }
- }, new NetworkErrorCallback() {
- @Override
- public void onError(NetworkError error) {
- log.e(error);
- MainActivity.this.getKVV().endUpdate();
- changeLoginState(null);
- }
- });
- }
+ this.getGoogleAuth().connect(() -> {
+ // getGoogleAuth().setLoginState("seedorf96", "m&gcwBaT@");
+ getGoogleAuth().getLoginState(credentials -> {
+ if (credentials == null || credentials.getUsername() == null || credentials.getPassword() == null) {
+ MainActivity.this.getKVV().endUpdate();
+ changeLoginState(null);
+ return;
+ }
+ MainActivity.this.getKVV().login(credentials.getUsername(), credentials.getPassword(), success -> {
+ MainActivity.this.getKVV().endUpdate();
+ changeLoginState(credentials);
+ }, error -> {
+ log.e(error);
+ MainActivity.this.getKVV().endUpdate();
+ changeLoginState(null);
});
- }
+ });
});
}
@@ -159,14 +141,11 @@ public class MainActivity extends AppCompatActivity
break;
case R.id.nav_logout:
this.getKVV().logout();
- this.getGoogleAuth().getLoginState(new CredentialsListener() {
- @Override
- public void onCredentials(Credentials credentials) {
- if (credentials != null) {
- MainActivity.this.getGoogleAuth().deleteLoginState(credentials.getUsername(), credentials.getPassword());
- }
- MainActivity.this.changeLoginState(null);
+ this.getGoogleAuth().getLoginState(credentials -> {
+ if (credentials != null) {
+ MainActivity.this.getGoogleAuth().deleteLoginState(credentials.getUsername(), credentials.getPassword());
}
+ MainActivity.this.changeLoginState(null);
});
break;
}
@@ -236,29 +215,21 @@ public class MainActivity extends AppCompatActivity
navigationView.getMenu().clear();
navigationView.inflateMenu(R.menu.activity_main_drawer_login);
navigationView.setCheckedItem(R.id.nav_modules);
- getKVV().getModuleList(new NetworkCallback() {
- @Override
- public void onResponse(@NonNull Modules success) {
- log.d("Modules.get", success.size());
- //SubMenu moduleMenu = navigationView.getMenu().findItem(R.id.nav_modules).getSubMenu();
- int i = 0;
- for (Iterator it = success.latestSemesterIterator(); it.hasNext(); ) {
- Modules.Module module = it.next();
- MenuItem menuItem = navigationView.getMenu().add(Menu.NONE, Menu.NONE, 101 + i, module.title);
- final int finalI = i;
- menuItem.setOnMenuItemClickListener(item -> {
- onModulesFragmentInteraction(finalI);
- return false;
- });
- i++;
- }
+ getKVV().getModuleList(success -> {
+ log.d("Modules.get", success.size());
+ //SubMenu moduleMenu = navigationView.getMenu().findItem(R.id.nav_modules).getSubMenu();
+ int i = 0;
+ for (Iterator it = success.latestSemesterIterator(); it.hasNext(); ) {
+ Modules.Module module = it.next();
+ MenuItem menuItem = navigationView.getMenu().add(Menu.NONE, Menu.NONE, 101 + i, module.title);
+ final int finalI = i;
+ menuItem.setOnMenuItemClickListener(item -> {
+ onModulesFragmentInteraction(finalI);
+ return false;
+ });
+ i++;
}
- }, new NetworkErrorCallback() {
- @Override
- public void onError(NetworkError error) {
- log.d("Modules.error", error);
- }
- });
+ }, error -> log.d("Modules.error", error));
}
}
@@ -280,16 +251,8 @@ public class MainActivity extends AppCompatActivity
@Override
public void onModulesFragmentInteraction(final int itemPosition) {
log.d("Item clicked", itemPosition);
- getKVV().getModuleList(new NetworkCallback() {
- @Override
- public void onResponse(@NonNull Modules success) {
- log.d(success.get(itemPosition).title);
- }
- }, new NetworkErrorCallback() {
- @Override
- public void onError(NetworkError error) {
- // TODO
- }
+ getKVV().getModuleList(success -> log.d(success.get(itemPosition).title), error -> {
+ // TODO
});
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
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 431ae14..3a4d1ad 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/LoginFragment.java
@@ -5,7 +5,6 @@ import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -16,11 +15,7 @@ import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.GoogleAuth.Credentials;
import de.sebse.fuplanner.services.GoogleAuth.GoogleAuth;
import de.sebse.fuplanner.services.KVV.KVV;
-import de.sebse.fuplanner.services.KVV.LoginToken;
import de.sebse.fuplanner.tools.logging.Logger;
-import de.sebse.fuplanner.tools.network.NetworkCallback;
-import de.sebse.fuplanner.tools.network.NetworkError;
-import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
/**
* A simple {@link Fragment} subclass.
@@ -63,54 +58,45 @@ public class LoginFragment extends Fragment {
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_login, container, false);
View btn_login = v.findViewById(R.id.btn_login);
if (btn_login != null) {
- btn_login.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- final ProgressDialog progressDialog = new ProgressDialog(LoginFragment.this.getContext(),
- R.style.FUTheme_Dialog);
- progressDialog.setIndeterminate(true);
- progressDialog.setMessage("Authenticating...");
- progressDialog.show();
+ btn_login.setOnClickListener(view -> {
+ final ProgressDialog progressDialog = new ProgressDialog(LoginFragment.this.getContext(),
+ R.style.FUTheme_Dialog);
+ progressDialog.setIndeterminate(true);
+ progressDialog.setMessage("Authenticating...");
+ progressDialog.show();
- EditText input_usr = ((View) view.getParent()).findViewById(R.id.input_username);
- EditText input_pwd = ((View) view.getParent()).findViewById(R.id.input_password);
- if (input_usr != null) {
- if (input_pwd != null) {
- if (LoginFragment.this.getActivity() == null) {
- log.e("Login fragment has no activity!");
- return;
- }
- final String username = input_usr.getText().toString();
- final String password = input_pwd.getText().toString();
- final KVV kvv = ((MainActivity) LoginFragment.this.getActivity()).getKVV();
- final GoogleAuth gauth = ((MainActivity) LoginFragment.this.getActivity()).getGoogleAuth();
- kvv.login(username, password, new NetworkCallback() {
- @Override
- public void onResponse(@NonNull LoginToken success) {
- progressDialog.dismiss();
- log.d("success", success.toString());
- gauth.setLoginState(username, password);
- if (LoginFragment.this.mListener != null) {
- Credentials cred = new Credentials(username, password);
- LoginFragment.this.mListener.onLoginFragmentInteraction(cred);
- }
- }
- }, new NetworkErrorCallback() {
- @Override
- public void onError(NetworkError error) {
- progressDialog.dismiss();
- log.e("error", error);
- }
- });
+ EditText input_usr = ((View) view.getParent()).findViewById(R.id.input_username);
+ EditText input_pwd = ((View) view.getParent()).findViewById(R.id.input_password);
+ if (input_usr != null) {
+ if (input_pwd != null) {
+ if (LoginFragment.this.getActivity() == null) {
+ log.e("Login fragment has no activity!");
+ return;
}
+ final String username = input_usr.getText().toString();
+ final String password = input_pwd.getText().toString();
+ final KVV kvv = ((MainActivity) LoginFragment.this.getActivity()).getKVV();
+ final GoogleAuth gauth = ((MainActivity) LoginFragment.this.getActivity()).getGoogleAuth();
+ kvv.login(username, password, success -> {
+ progressDialog.dismiss();
+ log.d("success", success.toString());
+ gauth.setLoginState(username, password);
+ if (LoginFragment.this.mListener != null) {
+ Credentials cred = new Credentials(username, password);
+ LoginFragment.this.mListener.onLoginFragmentInteraction(cred);
+ }
+ }, error -> {
+ progressDialog.dismiss();
+ log.e("error", error);
+ });
}
}
});
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java
index 560790f..8785b80 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java
@@ -13,11 +13,7 @@ import android.view.ViewGroup;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.Modules;
import de.sebse.fuplanner.tools.logging.Logger;
-import de.sebse.fuplanner.tools.network.NetworkCallback;
-import de.sebse.fuplanner.tools.network.NetworkError;
-import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
/**
* A fragment representing a list of Items.
@@ -75,18 +71,10 @@ public class ModulesFragment extends Fragment {
if (getActivity() != null) {
- ((MainActivity) getActivity()).getKVV().getModuleList(new NetworkCallback() {
- @Override
- public void onResponse(@NonNull Modules success) {
- log.d(success);
- adapter.setModules(success);
- }
- }, new NetworkErrorCallback() {
- @Override
- public void onError(NetworkError error) {
- Log.e("ModFrag", error.toString());
- }
- });
+ ((MainActivity) getActivity()).getKVV().getModuleList(success -> {
+ log.d(success);
+ adapter.setModules(success);
+ }, error -> Log.e("ModFrag", error.toString()));
}
}
return view;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesRecyclerViewAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesRecyclerViewAdapter.java
index 7a599f0..7186994 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesRecyclerViewAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesRecyclerViewAdapter.java
@@ -1,5 +1,6 @@
package de.sebse.fuplanner.fragments;
+import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
@@ -31,29 +32,28 @@ public class ModulesRecyclerViewAdapter extends RecyclerView.Adapter {
+ if (null != mListener) {
+ // Notify the active callbacks interface (the activity, if the
+ // fragment is attached to one) that an item has been selected.
+ mListener.onModulesFragmentInteraction(holder.mItemPosition);
}
});
}
@@ -77,8 +77,8 @@ public class ModulesRecyclerViewAdapter extends RecyclerView.Adapter {
+ private static final int TYPE_HEADER = 0;
+ private static final int TYPE_DESCRIPTION = 1;
+ private static final int TYPE_ITEM = 2;
+ private static final int TYPE_SHOW_MORE = 3;
+
private Modules.Module mValue;
//private final ModulesFragment.OnModulesFragmentInteractionListener mListener;
@@ -39,18 +40,22 @@ public class ModDetailOverviewAdapter extends RecyclerView.Adapter() {
- @Override
- public void onComplete(@NonNull Task task) {
- if (task.isSuccessful()) {
- // Successfully read the credential without any user interaction, this
- // means there was only a single credential and the user has auto
- // sign-in enabled.
- Credential credential = task.getResult().getCredential();
- credentialsListener.onCredentials(new Credentials(credential.getId(), credential.getPassword()));
- return;
- }
+ mCredentialsClient.request(request).addOnCompleteListener(task -> {
+ if (task.isSuccessful()) {
+ // Successfully read the credential without any user interaction, this
+ // means there was only a single credential and the user has auto
+ // sign-in enabled.
+ Credential credential = task.getResult().getCredential();
+ credentialsListener.onCredentials(new Credentials(credential.getId(), credential.getPassword()));
+ return;
+ }
- Exception e = task.getException();
- if (e instanceof ResolvableApiException) {
- // This is most likely the case where the user has multiple saved
- // credentials and needs to pick one. This requires showing UI to
- // resolve the read request.
- GoogleAuth.this.mCredentialsListener = credentialsListener;
- ResolvableApiException rae = (ResolvableApiException) e;
- resolveResult(rae, RequestCode.RC_READ);
- return;
- }
+ Exception e = task.getException();
+ if (e instanceof ResolvableApiException) {
+ // This is most likely the case where the user has multiple saved
+ // credentials and needs to pick one. This requires showing UI to
+ // resolve the read request.
+ GoogleAuth.this.mCredentialsListener = credentialsListener;
+ ResolvableApiException rae = (ResolvableApiException) e;
+ resolveResult(rae, RequestCode.RC_READ);
+ return;
+ }
- if (e instanceof ApiException) {
- ApiException ae = (ApiException) e;
- if (ae.getStatusCode() == CommonStatusCodes.SIGN_IN_REQUIRED) {
- // This means only a hint is available, but we are handling that
- // elsewhere so no need to act here.
- } else {
- credentialsListener.onCredentials(null);
- Log.w(TAG, "Unexpected status code: " + ae.getStatusCode());
- }
+ if (e instanceof ApiException) {
+ ApiException ae = (ApiException) e;
+ if (ae.getStatusCode() == CommonStatusCodes.SIGN_IN_REQUIRED) {
+ // This means only a hint is available, but we are handling that
+ // elsewhere so no need to act here.
+ } else {
+ credentialsListener.onCredentials(null);
+ Log.w(TAG, "Unexpected status code: " + ae.getStatusCode());
}
}
});
@@ -111,25 +104,22 @@ public class GoogleAuth {
Credential credential = new Credential.Builder(username)
.setPassword(password)
.build();
- mCredentialsClient.save(credential).addOnCompleteListener(new OnCompleteListener() {
- @Override
- public void onComplete(@NonNull Task task) {
- if (task.isSuccessful()) {
- showToast("Credential saved.");
- return;
- }
+ mCredentialsClient.save(credential).addOnCompleteListener(task -> {
+ if (task.isSuccessful()) {
+ showToast("Credential saved.");
+ return;
+ }
- Exception e = task.getException();
- if (e instanceof ResolvableApiException) {
- // The first time a credential is saved, the user is shown UI
- // to confirm the action. This requires resolution.
- ResolvableApiException rae = (ResolvableApiException) e;
- resolveResult(rae, RequestCode.RC_SAVE);
- } else {
- // Save failure cannot be resolved.
- Log.w(TAG, "Save failed.", e);
- showToast("Credential Save Failed");
- }
+ Exception e = task.getException();
+ if (e instanceof ResolvableApiException) {
+ // The first time a credential is saved, the user is shown UI
+ // to confirm the action. This requires resolution.
+ ResolvableApiException rae = (ResolvableApiException) e;
+ resolveResult(rae, RequestCode.RC_SAVE);
+ } else {
+ // Save failure cannot be resolved.
+ Log.w(TAG, "Save failed.", e);
+ showToast("Credential Save Failed");
}
});
}
@@ -142,12 +132,9 @@ public class GoogleAuth {
Credential credential = new Credential.Builder(username)
.setPassword(password)
.build();
- mCredentialsClient.delete(credential).addOnCompleteListener(new OnCompleteListener() {
- @Override
- public void onComplete(@NonNull Task task) {
- if (task.isSuccessful()) {
- // Credential was deleted successfully
- }
+ mCredentialsClient.delete(credential).addOnCompleteListener(task -> {
+ if (task.isSuccessful()) {
+ // Credential was deleted successfully
}
});
}
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 4c081c1..b481597 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
@@ -1,12 +1,8 @@
package de.sebse.fuplanner.services.KVV;
import android.content.Context;
-import android.support.annotation.NonNull;
import android.util.Log;
-import com.android.volley.Response;
-import com.android.volley.VolleyError;
-
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -15,7 +11,6 @@ import de.sebse.fuplanner.tools.network.HTTPService;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
-import de.sebse.fuplanner.tools.network.Result;
/**
* Created by sebastian on 24.10.17.
@@ -53,29 +48,21 @@ class KVVLogin extends HTTPService {
-> JSESSIONID 5c10406f-588c-4c16-96e9-c80d115417de.tomcat1
*/
private void startKVVSession(final NetworkCallback> callback, final NetworkErrorCallback errorCallback) {
- get("https://kvv.imp.fu-berlin.de/portal/login", null, new Response.Listener() {
- @Override
- public void onResponse(Result response) {
- String cookies = response.getHeaders().get("Set-Cookie");
- if (cookies==null) {
- errorCallback.onError(new NetworkError(100101, -1, "Error on starting KVV session!"));
- return;
- }
- HashMap object;
- try {
- object = getCookie(cookies, new String[]{"JSESSIONID"});
- } catch (NoSuchFieldException e) {
- errorCallback.onError(new NetworkError(100102, -1, "Error on starting KVV session!"));
- return;
- }
- callback.onResponse(object);
+ get("https://kvv.imp.fu-berlin.de/portal/login", null, response -> {
+ String cookies = response.getHeaders().get("Set-Cookie");
+ if (cookies==null) {
+ errorCallback.onError(new NetworkError(100101, -1, "Error on starting KVV session!"));
+ return;
}
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- errorCallback.onError(new NetworkError(100100, error.networkResponse.statusCode, "Error on starting KVV session!"));
+ HashMap object;
+ try {
+ object = getCookie(cookies, new String[]{"JSESSIONID"});
+ } catch (NoSuchFieldException e) {
+ errorCallback.onError(new NetworkError(100102, -1, "Error on starting KVV session!"));
+ return;
}
- });
+ callback.onResponse(object);
+ }, error -> errorCallback.onError(new NetworkError(100100, error.networkResponse.statusCode, "Error on starting KVV session!")));
}
/*
@@ -88,24 +75,16 @@ class KVVLogin extends HTTPService {
private void getSAMLRequest(String JSESSIONID, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) {
HashMap cookies = new HashMap<>();
cookies.put("JSESSIONID", JSESSIONID);
- get("https://kvv.imp.fu-berlin.de/sakai-login-tool/container", cookies, new Response.Listener() {
- @Override
- public void onResponse(Result response) {
- String location = response.getHeaders().get("Location");
- if (location==null) {
- errorCallback.onError(new NetworkError(100111, -1, "Error on getting SAML request!"));
- return;
- }
- HashMap object = new HashMap<>();
- object.put("Location", location);
- callback.onResponse(object);
+ get("https://kvv.imp.fu-berlin.de/sakai-login-tool/container", cookies, response -> {
+ String location = response.getHeaders().get("Location");
+ if (location==null) {
+ errorCallback.onError(new NetworkError(100111, -1, "Error on getting SAML request!"));
+ return;
}
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- errorCallback.onError(new NetworkError(100110, error.networkResponse.statusCode, "Error on getting SAML request!"));
- }
- });
+ HashMap object = new HashMap<>();
+ object.put("Location", location);
+ callback.onResponse(object);
+ }, error -> errorCallback.onError(new NetworkError(100110, error.networkResponse.statusCode, "Error on getting SAML request!")));
}
/*
@@ -117,29 +96,21 @@ class KVVLogin extends HTTPService {
-> ROUTEID .1
*/
private void startIdentSession(String url, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) {
- get(url, null, new Response.Listener() {
- @Override
- public void onResponse(Result response) {
- String cookies = response.getHeaders().get("Set-Cookie");
- if (cookies==null) {
- errorCallback.onError(new NetworkError(100121, -1, "Error on starting Ident session!"));
- return;
- }
- HashMap object;
- try {
- object = getCookie(cookies, new String[]{"JSESSIONID", "_idp_authn_lc_key", "ROUTEID"});
- } catch (NoSuchFieldException e) {
- errorCallback.onError(new NetworkError(100122, -1, "Error on starting Ident session!"));
- return;
- }
- callback.onResponse(object);
+ get(url, null, response -> {
+ String cookies = response.getHeaders().get("Set-Cookie");
+ if (cookies==null) {
+ errorCallback.onError(new NetworkError(100121, -1, "Error on starting Ident session!"));
+ return;
}
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- errorCallback.onError(new NetworkError(100120, error.networkResponse.statusCode, "Error on starting Ident session!"));
+ HashMap object;
+ try {
+ object = getCookie(cookies, new String[]{"JSESSIONID", "_idp_authn_lc_key", "ROUTEID"});
+ } catch (NoSuchFieldException e) {
+ errorCallback.onError(new NetworkError(100122, -1, "Error on starting Ident session!"));
+ return;
}
- });
+ callback.onResponse(object);
+ }, error -> errorCallback.onError(new NetworkError(100120, error.networkResponse.statusCode, "Error on starting Ident session!")));
}
/*
@@ -160,34 +131,26 @@ class KVVLogin extends HTTPService {
HashMap body = new HashMap<>();
body.put("j_username", username);
body.put("j_password", password);
- post("https://identity.fu-berlin.de/idp-fub/Authn/UserPassword", cookies, body, new Response.Listener() {
- @Override
- public void onResponse(Result response) {
- if (first) {
- callback.onResponse(new HashMap());
- return;
- }
+ post("https://identity.fu-berlin.de/idp-fub/Authn/UserPassword", cookies, body, response -> {
+ if (first) {
+ callback.onResponse(new HashMap<>());
+ return;
+ }
- String cookies = response.getHeaders().get("Set-Cookie");
- if (cookies==null) {
- errorCallback.onError(new NetworkError(100131, -1, "Error on logging in to Identity Server!"));
- return;
- }
- HashMap object;
- try {
- object = getCookie(cookies, new String[]{"_idp_session"});
- } catch (NoSuchFieldException e) {
- errorCallback.onError(new NetworkError(100132, -1, "Error on logging in to Identity Server!"));
- return;
- }
- callback.onResponse(object);
+ String cookies1 = response.getHeaders().get("Set-Cookie");
+ if (cookies1 ==null) {
+ errorCallback.onError(new NetworkError(100131, -1, "Error on logging in to Identity Server!"));
+ return;
}
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- errorCallback.onError(new NetworkError(100130, error.networkResponse.statusCode, "Error on logging in to Identity Server!"));
+ HashMap object;
+ try {
+ object = getCookie(cookies1, new String[]{"_idp_session"});
+ } catch (NoSuchFieldException e) {
+ errorCallback.onError(new NetworkError(100132, -1, "Error on logging in to Identity Server!"));
+ return;
}
- });
+ callback.onResponse(object);
+ }, error -> errorCallback.onError(new NetworkError(100130, error.networkResponse.statusCode, "Error on logging in to Identity Server!")));
}
/*
@@ -205,35 +168,27 @@ class KVVLogin extends HTTPService {
cookies.put("_idp_authn_lc_key", _idp_authn_lc_key);
cookies.put("ROUTEID", ROUTEID);
cookies.put("_idp_session", _idp_session);
- get("https://identity.fu-berlin.de/idp-fub/profile/SAML2/Redirect/SSO", cookies, new Response.Listener() {
- @Override
- public void onResponse(Result response) {
- HashMap object = new HashMap<>();
+ get("https://identity.fu-berlin.de/idp-fub/profile/SAML2/Redirect/SSO", cookies, response -> {
+ HashMap object = new HashMap<>();
- Pattern pattern = Pattern.compile("ss:mem:([0-9a-f]+)");
- Matcher matcher = pattern.matcher(response.getParsed());
- if (!matcher.find()) {
- errorCallback.onError(new NetworkError(100142, -1, "Error on getting SAML response!"));
- return;
- }
- object.put("RelayState", "ss:mem:"+matcher.group(1));
-
- pattern = Pattern.compile("([0-9a-zA-Z+]+==)");
- matcher = pattern.matcher(response.getParsed());
- if (!matcher.find()) {
- errorCallback.onError(new NetworkError(100141, -1, "Error on getting SAML response!"));
- return;
- }
- object.put("SAMLResponse", matcher.group(1));
-
- callback.onResponse(object);
+ Pattern pattern = Pattern.compile("ss:mem:([0-9a-f]+)");
+ Matcher matcher = pattern.matcher(response.getParsed());
+ if (!matcher.find()) {
+ errorCallback.onError(new NetworkError(100142, -1, "Error on getting SAML response!"));
+ return;
}
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- errorCallback.onError(new NetworkError(100140, error.networkResponse.statusCode, "Error on getting SAML response!"));
+ object.put("RelayState", "ss:mem:"+matcher.group(1));
+
+ pattern = Pattern.compile("([0-9a-zA-Z+]+==)");
+ matcher = pattern.matcher(response.getParsed());
+ if (!matcher.find()) {
+ errorCallback.onError(new NetworkError(100141, -1, "Error on getting SAML response!"));
+ return;
}
- });
+ object.put("SAMLResponse", matcher.group(1));
+
+ callback.onResponse(object);
+ }, error -> errorCallback.onError(new NetworkError(100140, error.networkResponse.statusCode, "Error on getting SAML response!")));
}
@@ -251,33 +206,25 @@ class KVVLogin extends HTTPService {
HashMap body = new HashMap<>();
body.put("RelayState", RelayState);
body.put("SAMLResponse", SAMLResponse);
- post("https://kvv.imp.fu-berlin.de/Shibboleth.sso/SAML2/POST", cookies, body, new Response.Listener() {
- @Override
- public void onResponse(Result response) {
- String cookies = response.getHeaders().get("Set-Cookie");
- if (cookies==null) {
- errorCallback.onError(new NetworkError(100151, -1, "Error on starting KVV session!"));
- return;
- }
- HashMap object = new HashMap<>();
-
-
- Pattern pattern = Pattern.compile("(_shibsession_[0-9a-f]+)=([^;]+);");
- Matcher matcher = pattern.matcher(cookies);
- if (!matcher.find()) {
- errorCallback.onError(new NetworkError(100152, -1, "Error on starting Ident session!"));
- }
- object.put("shibsessionKey", matcher.group(1));
- object.put("shibsessionName", matcher.group(2));
-
- callback.onResponse(object);
+ post("https://kvv.imp.fu-berlin.de/Shibboleth.sso/SAML2/POST", cookies, body, response -> {
+ String cookies1 = response.getHeaders().get("Set-Cookie");
+ if (cookies1 ==null) {
+ errorCallback.onError(new NetworkError(100151, -1, "Error on starting KVV session!"));
+ return;
}
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- errorCallback.onError(new NetworkError(100150, error.networkResponse.statusCode, "Error on starting Ident session!"));
+ HashMap object = new HashMap<>();
+
+
+ Pattern pattern = Pattern.compile("(_shibsession_[0-9a-f]+)=([^;]+);");
+ Matcher matcher = pattern.matcher(cookies1);
+ if (!matcher.find()) {
+ errorCallback.onError(new NetworkError(100152, -1, "Error on starting Ident session!"));
}
- });
+ object.put("shibsessionKey", matcher.group(1));
+ object.put("shibsessionName", matcher.group(2));
+
+ callback.onResponse(object);
+ }, error -> errorCallback.onError(new NetworkError(100150, error.networkResponse.statusCode, "Error on starting Ident session!")));
}
@@ -288,17 +235,7 @@ class KVVLogin extends HTTPService {
_b1912c5a03d733a80bd3fee772bf68d4
*/
private void finishKVVlogin(LoginToken loginToken, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) {
- get("https://kvv.imp.fu-berlin.de/sakai-login-tool/container", loginToken.getCookies(), new Response.Listener() {
- @Override
- public void onResponse(Result response) {
- callback.onResponse(new HashMap());
- }
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- errorCallback.onError(new NetworkError(100160, error.networkResponse.statusCode, "Cannot finish login process!"));
- }
- });
+ get("https://kvv.imp.fu-berlin.de/sakai-login-tool/container", loginToken.getCookies(), response -> callback.onResponse(new HashMap<>()), error -> errorCallback.onError(new NetworkError(100160, error.networkResponse.statusCode, "Cannot finish login process!")));
}
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 b3aad4a..8684309 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
@@ -38,7 +38,7 @@ public class KVVModuleList extends HTTPService {
get("https://kvv.imp.fu-berlin.de/direct/site.json", token.getCookies(), response -> {
String body = response.getParsed();
if (body == null) {
- errorCallback.onError(new NetworkError(101101, 403, "No module list retreived!"));
+ errorCallback.onError(new NetworkError(101101, 403, "No module list retrieved!"));
return;
}
Modules modules = new Modules();
@@ -78,11 +78,14 @@ public class KVVModuleList extends HTTPService {
}
public void getModule(int index, final NetworkCallback callback, final NetworkErrorCallback errorCallback) {
- this.getModuleList(success -> {
- callback.onResponse(success.get(index));
- }, errorCallback);
+ this.getModuleList(success -> callback.onResponse(success.get(index)), errorCallback);
}
+
+
+
+
+
public void getAnnouncements(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback) {
queueModuleDetails.add(module.getID(), () -> {
if (module.announcements != null) {
@@ -103,7 +106,7 @@ public class KVVModuleList extends HTTPService {
get(String.format("https://kvv.imp.fu-berlin.de/direct/announcement/site/%s.json?n=999999&d=999999999", ID), token.getCookies(), response -> {
String body = response.getParsed();
if (body == null) {
- errorCallback.onError(new NetworkError(101201, 403, "No announcements retreived!"));
+ errorCallback.onError(new NetworkError(101201, 403, "No announcements retrieved!"));
return;
}
ArrayList announcements = new ArrayList<>();
@@ -129,4 +132,28 @@ public class KVVModuleList extends HTTPService {
callback.onResponse(announcements);
}, error -> errorCallback.onError(new NetworkError(101203, error.networkResponse.statusCode, "Cannot get announcements!")));
}
+
+
+
+
+
+
+ public void getAssignments(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback) {
+ queueModuleDetails.add(module.getID(), () -> {
+ if (module.assignments != null) {
+ callback.onResponse(module);
+ queueModuleDetails.next(module.getID());
+ return;
+ }
+ getAssignmentsUpgrade(module.getID(), success -> {
+ module.assignments = success;
+ callback.onResponse(module);
+ queueModuleDetails.next(module.getID());
+ }, errorCallback);
+ });
+ }
+
+ private void getAssignmentsUpgrade(String ID, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) {
+ callback.onResponse(new ArrayList());
+ }
}
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/Modules.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/Modules.java
index e06e95d..27a3350 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/Modules.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/Modules.java
@@ -160,13 +160,13 @@ public class Modules /*extends EventEmitter announcements;
+ public ArrayList assignments;
/*private Module() {
this(null, null, null, null, null);
diff --git a/app/src/main/java/de/sebse/fuplanner/services/MensaPlan.java b/app/src/main/java/de/sebse/fuplanner/services/MensaPlan.java
index ae852a6..9ad343e 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/MensaPlan.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/MensaPlan.java
@@ -6,8 +6,6 @@ import android.util.Log;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
-import com.android.volley.Response;
-import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
@@ -35,17 +33,7 @@ public class MensaPlan {
post.put("date", "2017-10-13");
final String requestBody = post.toString();
- StringRequest request = new StringRequest(Request.Method.POST, "https://www.stw.berlin/xhr/speiseplan-wochentag.html", new Response.Listener() {
- @Override
- public void onResponse(String response) {
- Log.d("MensaPlan DDDD", response);
- }
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- Log.d("MensaPlan EEEE", error.getMessage());
- }
- }) {
+ StringRequest request = new StringRequest(Request.Method.POST, "https://www.stw.berlin/xhr/speiseplan-wochentag.html", response -> Log.d("MensaPlan DDDD", response), error -> Log.d("MensaPlan EEEE", error.getMessage())) {
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/AsyncQueue.java b/app/src/main/java/de/sebse/fuplanner/tools/AsyncQueue.java
index 7897983..2bc56c6 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/AsyncQueue.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/AsyncQueue.java
@@ -1,12 +1,9 @@
package de.sebse.fuplanner.tools;
-import android.support.annotation.NonNull;
-
import java.util.HashMap;
import java.util.LinkedList;
import de.sebse.fuplanner.tools.network.NetworkCallback;
-import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
public class AsyncQueue {
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/Conversion.java b/app/src/main/java/de/sebse/fuplanner/tools/Conversion.java
index c217666..1c61112 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/Conversion.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/Conversion.java
@@ -1,5 +1,6 @@
package de.sebse.fuplanner.tools;
+import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.text.format.DateFormat;
@@ -16,13 +17,14 @@ public class Conversion {
return getModifiedDate(Locale.getDefault(), modified);
}
+ @SuppressLint("SimpleDateFormat")
public static String getModifiedDate(Locale locale, long modified) {
- SimpleDateFormat dateFormat = null;
+ SimpleDateFormat dateFormat;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
dateFormat = new SimpleDateFormat(getDateFormat(locale));
} else {
- dateFormat = new SimpleDateFormat("MMM/dd/yyyy hh:mm:ss aa");
+ dateFormat = new SimpleDateFormat("MMM/dd/yyyy hh:mm:ss aa", locale);
}
return dateFormat.format(new Date(modified));
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/Regex.java b/app/src/main/java/de/sebse/fuplanner/tools/Regex.java
index 046da07..1493e10 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/Regex.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/Regex.java
@@ -1,7 +1,5 @@
package de.sebse.fuplanner.tools;
-import android.support.annotation.NonNull;
-
import org.intellij.lang.annotations.Language;
import java.util.Iterator;
@@ -26,38 +24,33 @@ public class Regex {
public static Iterable allMatches(@Language("Regexp") String regex, final CharSequence input) {
final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
- return new Iterable() {
- @NonNull
- public Iterator iterator() {
- return new Iterator() {
- // Use a matcher internally.
- final Matcher matcher = pattern.matcher(input);
- // Keep a match around that supports any interleaving of hasNext/next calls.
- MatchResult pending;
+ return () -> new Iterator() {
+ // Use a matcher internally.
+ final Matcher matcher = pattern.matcher(input);
+ // Keep a match around that supports any interleaving of hasNext/next calls.
+ MatchResult pending;
- public boolean hasNext() {
- // Lazily fill pending, and avoid calling find() multiple times if the
- // clients call hasNext() repeatedly before sampling via next().
- if (pending == null && matcher.find()) {
- pending = matcher.toMatchResult();
- }
- return pending != null;
- }
-
- public MatchResult next() {
- // Fill pending if necessary (as when clients call next() without
- // checking hasNext()), throw if not possible.
- if (!hasNext()) { throw new NoSuchElementException(); }
- // Consume pending so next call to hasNext() does a find().
- MatchResult next = pending;
- pending = null;
- return next;
- }
-
- /** Required to satisfy the interface, but unsupported. */
- public void remove() { throw new UnsupportedOperationException(); }
- };
+ public boolean hasNext() {
+ // Lazily fill pending, and avoid calling find() multiple times if the
+ // clients call hasNext() repeatedly before sampling via next().
+ if (pending == null && matcher.find()) {
+ pending = matcher.toMatchResult();
+ }
+ return pending != null;
}
+
+ public MatchResult next() {
+ // Fill pending if necessary (as when clients call next() without
+ // checking hasNext()), throw if not possible.
+ if (!hasNext()) { throw new NoSuchElementException(); }
+ // Consume pending so next call to hasNext() does a find().
+ MatchResult next = pending;
+ pending = null;
+ return next;
+ }
+
+ /** Required to satisfy the interface, but unsupported. */
+ public void remove() { throw new UnsupportedOperationException(); }
};
}
}
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/BetterHurlStack.java b/app/src/main/java/de/sebse/fuplanner/tools/network/BetterHurlStack.java
index d832715..6e798d4 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/network/BetterHurlStack.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/network/BetterHurlStack.java
@@ -37,7 +37,8 @@ public class BetterHurlStack extends HurlStack {
private final UrlRewriter mUrlRewriter;
private final SSLSocketFactory mSslSocketFactory;
- private boolean followRedirects;
+ @SuppressWarnings({"unused", "FieldCanBeLocal"})
+ private boolean followRedirects; // TODO auto-redirect
BetterHurlStack() {
this(true);
@@ -130,7 +131,7 @@ public class BetterHurlStack extends HurlStack {
/**
* Initializes an {@link HttpEntity} from the given {@link HttpURLConnection}.
- * @param connection
+ * @param connection A http connection
* @return an HttpEntity populated with data from connection.
*/
private static HttpEntity entityFromConnection(HttpURLConnection connection) {
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
index 8f7ffc6..f3ffddd 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
@@ -2,7 +2,6 @@ package de.sebse.fuplanner.tools.network;
import android.content.Context;
import android.support.annotation.Nullable;
-import android.util.Log;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml
index f13b531..323a10f 100644
--- a/app/src/main/res/layout/fragment_login.xml
+++ b/app/src/main/res/layout/fragment_login.xml
@@ -17,7 +17,8 @@
android:layout_width="128dp"
android:layout_height="128dp"
android:layout_marginBottom="24dp"
- android:layout_gravity="center_horizontal" />
+ android:layout_gravity="center_horizontal"
+ android:contentDescription="@string/cd_ic_launcher"/>
+ android:hint="@string/username" />
@@ -42,7 +43,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
- android:hint="Password"/>
+ android:hint="@string/password"/>
+ android:text="@string/log_in"/>
diff --git a/app/src/main/res/layout/fragment_mod_detail_announce.xml b/app/src/main/res/layout/fragment_mod_detail_announce.xml
index 6fe1860..99b4da7 100644
--- a/app/src/main/res/layout/fragment_mod_detail_announce.xml
+++ b/app/src/main/res/layout/fragment_mod_detail_announce.xml
@@ -9,6 +9,6 @@
+ android:text="@string/lorem_ipsum_100" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_startup.xml b/app/src/main/res/layout/fragment_startup.xml
index 8d36fec..7da0ee5 100644
--- a/app/src/main/res/layout/fragment_startup.xml
+++ b/app/src/main/res/layout/fragment_startup.xml
@@ -10,6 +10,7 @@
android:layout_width="@android:dimen/thumbnail_width"
android:layout_height="@android:dimen/thumbnail_height"
android:layout_gravity="center"
- android:src="@mipmap/ic_launcher" />
+ android:src="@mipmap/ic_launcher"
+ android:contentDescription="@string/cd_ic_launcher"/>
diff --git a/app/src/main/res/layout/list_all_caption.xml b/app/src/main/res/layout/list_all_caption.xml
index 54c6200..fdc55a7 100644
--- a/app/src/main/res/layout/list_all_caption.xml
+++ b/app/src/main/res/layout/list_all_caption.xml
@@ -1,14 +1,15 @@
diff --git a/app/src/main/res/layout/list_all_show_more.xml b/app/src/main/res/layout/list_all_show_more.xml
new file mode 100644
index 0000000..db95e44
--- /dev/null
+++ b/app/src/main/res/layout/list_all_show_more.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/list_moddetails_announcements.xml b/app/src/main/res/layout/list_moddetails_announcements.xml
index 255379d..63a2719 100644
--- a/app/src/main/res/layout/list_moddetails_announcements.xml
+++ b/app/src/main/res/layout/list_moddetails_announcements.xml
@@ -1,7 +1,7 @@
@@ -15,21 +15,21 @@
tools:text="Test this new stuff!" />
+ tools:text="Peter Bauer" />
-
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml
index 3c310d2..1176a0a 100644
--- a/app/src/main/res/layout/nav_header_main.xml
+++ b/app/src/main/res/layout/nav_header_main.xml
@@ -1,6 +1,7 @@
@@ -27,14 +28,15 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher"
- android:visibility="gone" />
+ android:visibility="gone"
+ android:contentDescription="@string/cd_ic_launcher"/>
diff --git a/app/src/main/res/layout/nav_header_main_login.xml b/app/src/main/res/layout/nav_header_main_login.xml
deleted file mode 100644
index 2e86b7b..0000000
--- a/app/src/main/res/layout/nav_header_main_login.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml
index 389dd77..822175e 100644
--- a/app/src/main/res/menu/activity_main_drawer.xml
+++ b/app/src/main/res/menu/activity_main_drawer.xml
@@ -5,15 +5,15 @@
+ android:title="@string/canteen_plan" />
- -
+
-
diff --git a/app/src/main/res/menu/activity_main_drawer_login.xml b/app/src/main/res/menu/activity_main_drawer_login.xml
index 3e44d06..92832cd 100644
--- a/app/src/main/res/menu/activity_main_drawer_login.xml
+++ b/app/src/main/res/menu/activity_main_drawer_login.xml
@@ -5,37 +5,37 @@
- -
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 56cf822..3d01ed6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -7,10 +7,21 @@
Settings
- Hello blank fragment
Overview
Announcements
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Description
Announcements (%1$d)
+ App Icon
+ Schedule
+ Events
+ Canteen Plan
+ Settings
+ Options
+ Log out
+ Share
+ Log in
+ Username
+ Password
+ Show All