From 3b0eb28b1e32eeb62717d1fe4485eb930d243a03 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Wed, 6 Jun 2018 14:45:43 +0200 Subject: [PATCH] Module Detail Overview Implementation #2 --- .idea/caches/build_file_checksums.ser | Bin 500 -> 500 bytes app/build.gradle | 3 +- app/src/main/AndroidManifest.xml | 2 +- .../java/de/sebse/fuplanner/MainActivity.java | 111 +++----- .../fuplanner/fragments/LoginFragment.java | 74 +++--- .../fuplanner/fragments/ModulesFragment.java | 20 +- .../fragments/ModulesRecyclerViewAdapter.java | 24 +- .../fuplanner/fragments/StartupFragment.java | 5 - .../moddetails/ModDetailAdapter.java | 1 - .../moddetails/ModDetailAnnounceFragment.java | 3 +- .../moddetails/ModDetailFragment.java | 5 +- .../moddetails/ModDetailOverviewAdapter.java | 97 ++++--- .../moddetails/ModDetailOverviewFragment.java | 9 +- .../GoogleAuth/ConnectedListener.java | 2 +- .../GoogleAuth/CredentialsListener.java | 2 +- .../services/GoogleAuth/GoogleAuth.java | 103 ++++---- .../fuplanner/services/KVV/KVVLogin.java | 239 +++++++----------- .../fuplanner/services/KVV/KVVModuleList.java | 37 ++- .../sebse/fuplanner/services/KVV/Modules.java | 7 +- .../sebse/fuplanner/services/MensaPlan.java | 14 +- .../de/sebse/fuplanner/tools/AsyncQueue.java | 3 - .../de/sebse/fuplanner/tools/Conversion.java | 6 +- .../java/de/sebse/fuplanner/tools/Regex.java | 57 ++--- .../tools/network/BetterHurlStack.java | 5 +- .../fuplanner/tools/network/HTTPService.java | 1 - app/src/main/res/layout/fragment_login.xml | 9 +- .../layout/fragment_mod_detail_announce.xml | 2 +- app/src/main/res/layout/fragment_startup.xml | 3 +- app/src/main/res/layout/list_all_caption.xml | 7 +- .../main/res/layout/list_all_show_more.xml | 19 ++ .../layout/list_moddetails_announcements.xml | 12 +- .../layout/list_moddetails_description.xml | 33 ++- app/src/main/res/layout/nav_header_main.xml | 8 +- .../main/res/layout/nav_header_main_login.xml | 29 --- .../main/res/menu/activity_main_drawer.xml | 6 +- .../res/menu/activity_main_drawer_login.xml | 14 +- app/src/main/res/values/strings.xml | 13 +- 37 files changed, 457 insertions(+), 528 deletions(-) create mode 100644 app/src/main/res/layout/list_all_show_more.xml delete mode 100644 app/src/main/res/layout/nav_header_main_login.xml diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index e718b89dd309a8ba1b5dc8948ffd91745adbf82d..dfdda0affa8dbfdece60d0b317b6a3c96082649d 100644 GIT binary patch delta 63 zcmV-F0KotB1M~xsm;}@3e^Zg1cM#CW9P)}UrJF$fgZs>+6!DWI0g@9D_R)1(-rYvq Vc)>ATb*t=j01=aI0UML!0TCPE9|8aX delta 63 zcmV-F0KotB1M~xsm;`D_E)9{KcMt|!oF7QQFGWes#l}~q!V{At0g@A!^cr%17nqwM VUa|3TD4CXY01=aI0UML!0TD0z84>^h 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 040703b..d82b2e1 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("***REMOVED***", "***REMOVED***"); - 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("***REMOVED***", "***REMOVED***"); + 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 da8a3ed..a0aea9e 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" /> - + + android:title="@string/share"/> 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