17 Commits

Author SHA1 Message Date
Caesar2011
22470f58da New preference for FastSync 2019-01-17 00:01:54 +01:00
Caesar2011
697740e20b Simplified Login Token 2019-01-16 23:34:52 +01:00
Caesar2011
31cea12d16 Updated Gradle 2019-01-16 22:44:58 +01:00
Caesar2011
b8fe45e75e Changed event identifier from Id to StartDate 2019-01-16 22:44:35 +01:00
Caesar2011
729d3165f7 Event end time optimized 2019-01-14 14:04:30 +01:00
Caesar2011
6f1705ccf4 Handle register sync properly 2019-01-14 13:53:42 +01:00
Caesar2011
6a56573c6b Version 21 2019-01-14 13:21:32 +01:00
Caesar2011
322cf6f8a5 UnknownFormatException while syncing fixed 2019-01-14 13:19:56 +01:00
Caesar2011
6d30050eae Unused logs and permissions removed 2019-01-14 12:33:34 +01:00
Caesar2011
45a5513b54 Version 20 2019-01-09 15:52:51 +01:00
Caesar2011
e98e9f5e2f Merge branch 'kvvservice2' 2019-01-09 15:52:28 +01:00
Caesar2011
d4275aad90 Version 19 2018-12-19 15:58:12 +01:00
Caesar2011
f9fb7e8351 Merge branch 'kvvservice' 2018-12-19 15:55:39 +01:00
Caesar2011
889007ab42 Version 18 2018-12-18 15:50:54 +01:00
Joshua
c549bb39a4 fehler bei anzeigen von Ordnern mit umlauten behoben 2018-12-17 16:06:41 +01:00
Caesar2011
1e0b2a8952 Version 17 2018-12-06 13:38:26 +01:00
Joshua
54196f3794 Projekt Fehler behoben 2018-12-04 16:43:32 +01:00
21 changed files with 71 additions and 86 deletions

View File

@@ -7,8 +7,8 @@ android {
applicationId "de.sebse.fuplanner" applicationId "de.sebse.fuplanner"
minSdkVersion 15 minSdkVersion 15
targetSdkVersion 28 targetSdkVersion 28
versionCode 19 versionCode 21
versionName "1.4" versionName "1.4.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {

View File

@@ -18,8 +18,6 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- To auto-complete the email text field in the login form with the user's emails --> <!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />

View File

@@ -171,8 +171,6 @@ public class MainActivity extends AppCompatActivity
getKVV().modules().list().reloadIfOutdated(); getKVV().modules().list().reloadIfOutdated();
} }
isPaused = false; isPaused = false;
//log.d("onResume", "send notification!");
//CustomNotificationManager.sendNotification(this, "Titel", "Neue Announcements!");
} }
@Override @Override
@@ -361,12 +359,10 @@ public class MainActivity extends AppCompatActivity
((TextView) header.findViewById(R.id.login_mail)).setText(email); ((TextView) header.findViewById(R.id.login_mail)).setText(email);
changeFragment(newFragment); changeFragment(newFragment);
registerSync();
} }
private void registerSync() { private void registerSync() {
Account accountByType = mAccountManager.getAccountByType(AccountGeneral.ACCOUNT_TYPE); Account accountByType = mAccountManager.getAccountByType(AccountGeneral.ACCOUNT_TYPE);
log.d("registerSync", accountByType);
if (accountByType != null) { if (accountByType != null) {
ContentResolver.setSyncAutomatically(accountByType, KVVContentProvider.PROVIDER_NAME, true); ContentResolver.setSyncAutomatically(accountByType, KVVContentProvider.PROVIDER_NAME, true);
ContentResolver.addPeriodicSync( ContentResolver.addPeriodicSync(
@@ -662,8 +658,11 @@ public class MainActivity extends AppCompatActivity
@Override @Override
public void onLogin(LoginToken token) { public void onLogin(LoginToken token, boolean isOnlyRefresh) {
toLoginState(token.getFullName(), token.getEmail(), getDefaultFragmentAfterLogin()); toLoginState(token.getFullName(), token.getEmail(), getDefaultFragmentAfterLogin());
if (!isOnlyRefresh) {
registerSync();
}
} }
@Override @Override

View File

@@ -178,7 +178,7 @@ class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
end = UtilsDate.getModifiedDate(lastDateTime); end = UtilsDate.getModifiedDate(lastDateTime);
weekday = UtilsDate.getModifiedDate(context, firstDateTime, "E"); weekday = UtilsDate.getModifiedDate(context, firstDateTime, "E");
startTime = UtilsDate.getModifiedTime(context, firstDateTime); startTime = UtilsDate.getModifiedTime(context, firstDateTime);
endTime = UtilsDate.getModifiedTime(context, lastDateTime); endTime = UtilsDate.getModifiedTime(context, lastDateTime+1);
for (long skippedDate : group.getSkippedDates()) { for (long skippedDate : group.getSkippedDates()) {
if (excepts == null) { if (excepts == null) {
excepts = new StringBuilder(UtilsDate.getModifiedDate(skippedDate)); excepts = new StringBuilder(UtilsDate.getModifiedDate(skippedDate));
@@ -199,9 +199,9 @@ class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
else else
start = UtilsDate.getModifiedDateTime(context, event.getStartDate()); start = UtilsDate.getModifiedDateTime(context, event.getStartDate());
if (UtilsDate.dateEquals(event.getStartDate(), event.getEndDate())) if (UtilsDate.dateEquals(event.getStartDate(), event.getEndDate()))
end = UtilsDate.getModifiedTime(context, event.getEndDate()); end = UtilsDate.getModifiedTime(context, event.getEndDate()+1);
else else
end = UtilsDate.getModifiedDateTime(context, event.getEndDate()); end = UtilsDate.getModifiedDateTime(context, event.getEndDate()+1);
date = context.getString(R.string.date_scale, start, end); date = context.getString(R.string.date_scale, start, end);
iu.mTitle.setText(event.getTitle()); iu.mTitle.setText(event.getTitle());
iu.mSubLeft.setText(date); iu.mSubLeft.setText(date);

View File

@@ -193,9 +193,9 @@ class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
else else
start = UtilsDate.getModifiedDateTime(i.mView.getContext(), event.getStartDate()); start = UtilsDate.getModifiedDateTime(i.mView.getContext(), event.getStartDate());
if (UtilsDate.dateEquals(event.getStartDate(), event.getEndDate())) if (UtilsDate.dateEquals(event.getStartDate(), event.getEndDate()))
end = UtilsDate.getModifiedTime(i.mView.getContext(), event.getEndDate()); end = UtilsDate.getModifiedTime(i.mView.getContext(), event.getEndDate()+1);
else else
end = UtilsDate.getModifiedDateTime(i.mView.getContext(), event.getEndDate()); end = UtilsDate.getModifiedDateTime(i.mView.getContext(), event.getEndDate()+1);
i.mSubRight.setText(i.mView.getResources().getString(R.string.date_scale, i.mSubRight.setText(i.mView.getResources().getString(R.string.date_scale,
start, end start, end
)); ));

View File

@@ -14,8 +14,8 @@ import java.util.concurrent.atomic.AtomicReference;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import de.sebse.fuplanner.R; import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.kvv.types.LoginToken;
import de.sebse.fuplanner.services.kvv.sync.Login; import de.sebse.fuplanner.services.kvv.sync.Login;
import de.sebse.fuplanner.services.kvv.types.LoginToken;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
@@ -76,24 +76,11 @@ public class UserLoginTask extends AsyncTask<Void, Void, String> {
e.printStackTrace(); e.printStackTrace();
} }
log.d(login.get());
if (login.get() == null) { if (login.get() == null) {
return null; return null;
} else { } else {
return login.get().toJsonString(); return login.get().toJsonString();
} }
/*for (String credential : DUMMY_CREDENTIALS) {
String[] pieces = credential.split(":");
if (pieces[0].equals(mEmail)) {
// Account exists, return true if the password matches.
return pieces[1].equals(mPassword) ? "auth token here" : null;
}
}
// TODO: register the new account here.
return null;*/
} }
@Override @Override

View File

@@ -6,7 +6,7 @@ import de.sebse.fuplanner.services.kvv.types.LoginToken;
import de.sebse.fuplanner.tools.CustomAccountManager; import de.sebse.fuplanner.tools.CustomAccountManager;
public interface KVVListener { public interface KVVListener {
default void onLogin(LoginToken token) {} default void onLogin(LoginToken token, boolean isOnlyRefresh) {}
default void onLogout() {} default void onLogout() {}

View File

@@ -5,8 +5,8 @@ import android.content.Context;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import de.sebse.fuplanner.services.kvv.types.LoginToken;
import de.sebse.fuplanner.services.fulogin.AccountGeneral; import de.sebse.fuplanner.services.fulogin.AccountGeneral;
import de.sebse.fuplanner.services.kvv.types.LoginToken;
import de.sebse.fuplanner.tools.CustomAccountManager; import de.sebse.fuplanner.tools.CustomAccountManager;
import de.sebse.fuplanner.tools.NetworkCallbackCollector; import de.sebse.fuplanner.tools.NetworkCallbackCollector;
import de.sebse.fuplanner.tools.network.HTTPService; import de.sebse.fuplanner.tools.network.HTTPService;
@@ -34,7 +34,6 @@ public class Login extends HTTPService {
LoginToken.load(mListener.getAccountManager(), token -> { LoginToken.load(mListener.getAccountManager(), token -> {
boolean result = setToken(token); boolean result = setToken(token);
mLoginPending = false; mLoginPending = false;
log.d("loginToken", token != null ? token.toString() : null);
callback.run(result); callback.run(result);
}); });
} }
@@ -53,7 +52,7 @@ public class Login extends HTTPService {
if (delete) if (delete)
mToken.delete(mListener.getAccountManager()); mToken.delete(mListener.getAccountManager());
mToken = null; mToken = null;
return handleCallbacks(); return handleCallbacks(false);
} }
public boolean isLoginPending() { public boolean isLoginPending() {
@@ -104,9 +103,9 @@ public class Login extends HTTPService {
private boolean handleCallbacks() { private boolean handleCallbacks(boolean isOnlyRefresh) {
if (mToken != null) { if (mToken != null) {
mListener.onLogin(mToken); mListener.onLogin(mToken, isOnlyRefresh);
return true; return true;
} else { } else {
mListener.onLogout(); mListener.onLogout();
@@ -119,7 +118,7 @@ public class Login extends HTTPService {
return false; return false;
boolean isOnlyRefresh = mToken != null; boolean isOnlyRefresh = mToken != null;
mToken = token; mToken = token;
return isOnlyRefresh || handleCallbacks(); return isOnlyRefresh || handleCallbacks(isOnlyRefresh);
} }
public interface BooleanInterface { public interface BooleanInterface {

View File

@@ -149,7 +149,6 @@ public class ModulesList extends HTTPService {
} }
private void upgrade(final NetworkCallback<Modules> callback, final NetworkErrorCallback errorCallback) { private void upgrade(final NetworkCallback<Modules> callback, final NetworkErrorCallback errorCallback) {
log.d(mLogin.isInOnlineMode(), mLogin.getLoginToken());
if (!mLogin.isInOnlineMode() || mLogin.getLoginToken() == null) { if (!mLogin.isInOnlineMode() || mLogin.getLoginToken() == null) {
errorCallback.onError(new NetworkError(101105, 500, "Currently running in offline mode!")); errorCallback.onError(new NetworkError(101105, 500, "Currently running in offline mode!"));
return; return;

View File

@@ -1,6 +1,7 @@
package de.sebse.fuplanner.services.kvv; package de.sebse.fuplanner.services.kvv;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.os.Environment; import android.os.Environment;
import org.json.JSONArray; import org.json.JSONArray;
@@ -9,6 +10,9 @@ import org.json.JSONObject;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import de.sebse.fuplanner.services.kvv.types.Modules; import de.sebse.fuplanner.services.kvv.types.Modules;
@@ -95,10 +99,18 @@ public class ModulesResources extends PartModules<ArrayList<Resource>> {
} else { } else {
// in sub folder // in sub folder
for (Resource res2: resources) { for (Resource res2: resources) {
if (res2.getUrl().endsWith(res.getContainer()) && res2 instanceof Resource.Folder) { try {
String utf8Name;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
utf8Name = StandardCharsets.UTF_8.name();
else utf8Name = "UTF-8";
if (URLDecoder.decode(res2.getUrl(), utf8Name).endsWith(res.getContainer()) && res2 instanceof Resource.Folder) {
// Append File/Folder to list // Append File/Folder to list
((Resource.Folder) res2).add(res); ((Resource.Folder) res2).add(res);
} }
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} }
} }
} }

View File

@@ -18,7 +18,6 @@ import de.sebse.fuplanner.services.kvv.KVVListener;
import de.sebse.fuplanner.services.kvv.types.Announcement; import de.sebse.fuplanner.services.kvv.types.Announcement;
import de.sebse.fuplanner.services.kvv.types.Assignment; import de.sebse.fuplanner.services.kvv.types.Assignment;
import de.sebse.fuplanner.services.kvv.types.AssignmentList; import de.sebse.fuplanner.services.kvv.types.AssignmentList;
import de.sebse.fuplanner.services.kvv.types.Event;
import de.sebse.fuplanner.services.kvv.types.EventList; import de.sebse.fuplanner.services.kvv.types.EventList;
import de.sebse.fuplanner.services.kvv.types.Grade; import de.sebse.fuplanner.services.kvv.types.Grade;
import de.sebse.fuplanner.services.kvv.types.Modules; import de.sebse.fuplanner.services.kvv.types.Modules;
@@ -56,6 +55,7 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
private void init(Context context) { private void init(Context context) {
mKVV = new KVV(new KVVListener() { mKVV = new KVV(new KVVListener() {
CustomAccountManager accountManager = null; CustomAccountManager accountManager = null;
@Override @Override
public CustomAccountManager getAccountManager() { public CustomAccountManager getAccountManager() {
@@ -66,7 +66,6 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
}, context); }, context);
mQueue.add(() -> { mQueue.add(() -> {
mKVV.account().restoreOnlineLogin(bool -> { mKVV.account().restoreOnlineLogin(bool -> {
log.d("login restored");
mQueue.next(); mQueue.next();
}); });
}); });
@@ -84,14 +83,11 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
String authority, String authority,
ContentProviderClient provider, ContentProviderClient provider,
SyncResult syncResult) { SyncResult syncResult) {
log.d("onPerformSync");
mQueue.add(() -> { mQueue.add(() -> {
log.d("start syncing");
mKVV.modules().list().recv(success -> { mKVV.modules().list().recv(success -> {
Iterator<Modules.Module> iterator = success.latestSemesterIterator(); Iterator<Modules.Module> iterator = success.latestSemesterIterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
Modules.Module module = iterator.next(); Modules.Module module = iterator.next();
log.d("sync module", module.title);
final ArrayList<Announcement> announcements = module.announcements; final ArrayList<Announcement> announcements = module.announcements;
final AssignmentList assignments = module.assignments; final AssignmentList assignments = module.assignments;
final EventList events = module.events; final EventList events = module.events;
@@ -99,12 +95,11 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
final ArrayList<Resource> resources = module.resources; final ArrayList<Resource> resources = module.resources;
mKVV.modules().details().recv(module, success1 -> { mKVV.modules().details().recv(module, success1 -> {
if (success1.second) { if (success1.second) {
log.d("Sync Successful for Module '"+module.title+"'!");
sendNotifications(announcements, module.announcements, module.title, Announcement::getTitle, Announcement::getId, sendNotifications(announcements, module.announcements, module.title, Announcement::getTitle, Announcement::getId,
R.string.announcement_updated, R.string.announcement_added, R.string.announcement_removed); R.string.announcement_updated, R.string.announcement_added, R.string.announcement_removed);
sendNotifications(assignments, module.assignments, module.title, Assignment::getTitle, Assignment::getId, sendNotifications(assignments, module.assignments, module.title, Assignment::getTitle, Assignment::getId,
R.string.assignment_updated, R.string.assignment_added, R.string.assignment_removed); R.string.assignment_updated, R.string.assignment_added, R.string.assignment_removed);
sendNotifications(events, module.events, module.title, evt -> evt.getTitle()+" - "+UtilsDate.getModifiedDate(evt.getStartDate()), Event::getId, sendNotifications(events, module.events, module.title, evt -> evt.getTitle()+" - "+UtilsDate.getModifiedDate(evt.getStartDate()), event -> String.valueOf(event.getStartDate()),
R.string.event_updated, R.string.event_added, R.string.event_removed); R.string.event_updated, R.string.event_added, R.string.event_removed);
sendNotifications(gradebook, module.gradebook, module.title, Grade::getItemName, Grade::getItemName, sendNotifications(gradebook, module.gradebook, module.title, Grade::getItemName, Grade::getItemName,
R.string.gradebook_updated, R.string.gradebook_added, R.string.gradebook_removed); R.string.gradebook_updated, R.string.gradebook_added, R.string.gradebook_removed);
@@ -121,7 +116,6 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
log.e(msg); log.e(msg);
mQueue.next(); mQueue.next();
}, true); }, true);
log.d("finished");
}); });
} }
@@ -129,7 +123,7 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
if (oldList == null || newList == null) { if (oldList == null || newList == null) {
return; return;
} }
ArrayList<T> obsoletes = new ArrayList<T>(); ArrayList<T> obsoletes = new ArrayList<>();
for (T old: oldList) { for (T old: oldList) {
obsoletes.add(old); obsoletes.add(old);
} }

View File

@@ -62,14 +62,13 @@ public class Login extends HTTPService {
String fuJSESSIONID = success2.get("JSESSIONID"); String fuJSESSIONID = success2.get("JSESSIONID");
step3(fuJSESSIONID, success3 -> { step3(fuJSESSIONID, success3 -> {
step4(username, password, fuJSESSIONID, success4 -> { step4(username, password, fuJSESSIONID, success4 -> {
String fuSHIBSession = success4.get("shib_idp_session");
String samlResponse = success4.get("SAMLResponse"); String samlResponse = success4.get("SAMLResponse");
step5(samlResponse, success5 -> { step5(samlResponse, success5 -> {
String shibsessionKey = success5.get("shibsessionKey"); String shibsessionKey = success5.get("shibsessionKey");
String shibsessionName = success5.get("shibsessionName"); String shibsessionName = success5.get("shibsessionName");
step6(shibsessionKey, shibsessionName, success6 -> { step6(shibsessionKey, shibsessionName, success6 -> {
String kvvJSESSIONID = success6.get("JSESSIONID"); String kvvJSESSIONID = success6.get("JSESSIONID");
LoginToken token = new LoginToken(username, shibsessionKey, shibsessionName, kvvJSESSIONID); LoginToken token = new LoginToken(username, kvvJSESSIONID);
callback.onResponse(token); callback.onResponse(token);
}, error); }, error);
}, error); }, error);

View File

@@ -118,6 +118,6 @@ public class Event implements Serializable {
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hashCode(getId(), getType(), getStartDate(), getEndDate(), getTitle(), getLocation()); return Objects.hashCode(getType(), getStartDate(), getEndDate(), getTitle(), getLocation());
} }
} }

View File

@@ -1,12 +1,8 @@
package de.sebse.fuplanner.services.kvv.types; package de.sebse.fuplanner.services.kvv.types;
import android.content.Context;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -19,25 +15,19 @@ import de.sebse.fuplanner.tools.logging.Logger;
* Created by sebastian on 29.10.17. * Created by sebastian on 29.10.17.
*/ */
public class LoginToken implements Serializable { public class LoginToken {
static Logger log = new Logger("LoginToken"); static Logger log = new Logger("LoginToken");
private static final String FILE_NAME = "LoginTokenSaving";
private final String username; private final String username;
private final String shibsessionKey;
private final String shibsessionName;
private final String JSESSIONID; private final String JSESSIONID;
@Nullable private String fullName; @Nullable private String fullName;
@Nullable private String email; @Nullable private String email;
public LoginToken(String username, String shibsessionKey, String shibsessionName, String JSESSIONID) { public LoginToken(String username, String JSESSIONID) {
this.username = username; this.username = username;
this.shibsessionKey = shibsessionKey;
this.shibsessionName = shibsessionName;
this.JSESSIONID = JSESSIONID; this.JSESSIONID = JSESSIONID;
} }
@Nullable
public static void load(CustomAccountManager manager, LoginTokenInterface callback) { public static void load(CustomAccountManager manager, LoginTokenInterface callback) {
if (!manager.hasAccounts(AccountGeneral.ACCOUNT_TYPE)) { if (!manager.hasAccounts(AccountGeneral.ACCOUNT_TYPE)) {
callback.run(null); callback.run(null);
@@ -65,14 +55,6 @@ public class LoginToken implements Serializable {
return username; return username;
} }
private String getShibsessionKey() {
return shibsessionKey;
}
private String getShibsessionName() {
return shibsessionName;
}
private String getJSESSIONID() { private String getJSESSIONID() {
return JSESSIONID; return JSESSIONID;
} }
@@ -90,7 +72,6 @@ public class LoginToken implements Serializable {
public HashMap<String, String> getCookies() { public HashMap<String, String> getCookies() {
HashMap<String, String> cookies = new HashMap<>(); HashMap<String, String> cookies = new HashMap<>();
cookies.put("JSESSIONID", getJSESSIONID()); cookies.put("JSESSIONID", getJSESSIONID());
cookies.put(getShibsessionKey(), getShibsessionName());
cookies.put("pasystem_timezone_ok", "true"); cookies.put("pasystem_timezone_ok", "true");
return cookies; return cookies;
} }
@@ -114,8 +95,6 @@ public class LoginToken implements Serializable {
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
try { try {
json.put("username", username); json.put("username", username);
json.put("shibsessionKey", shibsessionKey);
json.put("shibsessionName", shibsessionName);
json.put("JSESSIONID", JSESSIONID); json.put("JSESSIONID", JSESSIONID);
json.put("fullName", fullName); json.put("fullName", fullName);
json.put("email", email); json.put("email", email);
@@ -125,13 +104,11 @@ public class LoginToken implements Serializable {
return json.toString(); return json.toString();
} }
public static LoginToken fromJsonString(String tokenString) { private static LoginToken fromJsonString(String tokenString) {
try { try {
JSONObject json = new JSONObject(tokenString); JSONObject json = new JSONObject(tokenString);
LoginToken token = new LoginToken( LoginToken token = new LoginToken(
json.getString("username"), json.getString("username"),
json.getString("shibsessionName"),
json.getString("shibsessionName"),
json.getString("JSESSIONID")); json.getString("JSESSIONID"));
if (!json.isNull("fullName")) if (!json.isNull("fullName"))
token.setAdditionals( token.setAdditionals(

View File

@@ -7,6 +7,11 @@
android:icon="@drawable/ic_local_dining" android:icon="@drawable/ic_local_dining"
android:title="@string/canteen_plan" android:title="@string/canteen_plan"
android:orderInCategory="200" /> android:orderInCategory="200" />
<item
android:id="@+id/nav_settings"
android:icon="@drawable/ic_settings"
android:title="@string/settings"
android:orderInCategory="300"/>
<item <item
android:id="@+id/nav_news" android:id="@+id/nav_news"
android:icon="@drawable/ic_chat_bubble_outline" android:icon="@drawable/ic_chat_bubble_outline"

View File

@@ -93,20 +93,22 @@
<string name="error_field_required">Pflichtfeld</string> <string name="error_field_required">Pflichtfeld</string>
<string name="kvv_sync">KVV-Synchronisation</string> <string name="kvv_sync">KVV-Synchronisation</string>
<string name="channel_name">Neue Daten verfügbar</string> <string name="channel_name">Neue Daten verfügbar</string>
<string name="channel_description">Benachrichtigen, wenn neue Ankündigungen, Aufgaben, Noten oder Resourcen verfügbar sind</string> <string name="channel_description">Benachrichtigen, wenn neue Ankündigungen, Aufgaben, Noten oder Ressourcen verfügbar sind</string>
<string name="announcement_updated">Ankündigung aktualisiert: %1$s</string> <string name="announcement_updated">Ankündigung aktualisiert: %1$s</string>
<string name="assignment_updated">Aufgabe aktualisiert: %1$s</string> <string name="assignment_updated">Aufgabe aktualisiert: %1$s</string>
<string name="event_updated">Event aktualisiert: %1$s</string> <string name="event_updated">Event aktualisiert: %1$s</string>
<string name="gradebook_updated">Noteneintrag aktualisiert: %1$s</string> <string name="gradebook_updated">Noteneintrag aktualisiert: %1$s</string>
<string name="resource_updated">Ressource aktualisiert: %1$s</string> <string name="resource_updated">Ressource aktualisiert: %1$s</string>
<string name="announcement_added">Neue Ankündigung: %1$s</string> <string name="announcement_added">Neue Ankündigung: %1$s</string>
<string name="assignment_added">Neue Aufgabe: %1$</string> <string name="assignment_added">Neue Aufgabe: %1$s</string>
<string name="event_added">Neues Event: %1$</string> <string name="event_added">Neues Event: %1$s</string>
<string name="gradebook_added">Neuer Noteneintrag: %1$</string> <string name="gradebook_added">Neuer Noteneintrag: %1$s</string>
<string name="resource_added">Neue Ressource: %1$</string> <string name="resource_added">Neue Ressource: %1$s</string>
<string name="announcement_removed">Ankündigung entfernt: %1$s</string> <string name="announcement_removed">Ankündigung entfernt: %1$s</string>
<string name="assignment_removed">Aufgabe entfernt: %1$s</string> <string name="assignment_removed">Aufgabe entfernt: %1$s</string>
<string name="event_removed">Event entfernt: %1$s</string> <string name="event_removed">Event entfernt: %1$s</string>
<string name="gradebook_removed">Noteneintrag entfernt: %1$s</string> <string name="gradebook_removed">Noteneintrag entfernt: %1$s</string>
<string name="resource_removed">Ressource entfernt: %1$s</string> <string name="resource_removed">Ressource entfernt: %1$s</string>
<string name="pref_external_server_title">Effizientes Aktualisieren</string>
<string name="pref_external_server_summary">Spart mobile Daten und Akku, verwendet jedoch externen Server zur Sychronisierung.</string>
</resources> </resources>

View File

@@ -10,4 +10,12 @@
<string name="pref_last_visited_news" translatable="false">pref_last_visited_news</string> <string name="pref_last_visited_news" translatable="false">pref_last_visited_news</string>
<string name="pref_set_auto_sync_on_startup" translatable="false">pref_set_auto_sync_on_startup</string> <string name="pref_set_auto_sync_on_startup" translatable="false">pref_set_auto_sync_on_startup</string>
<string-array name="pref_external_server" translatable="false">
<item>@string/pref_external_server</item>
<item>@string/pref_external_server_default</item>
</string-array>
<string name="pref_external_server" translatable="false">pref_external_server</string>
<string name="pref_external_server_default" translatable="false">all</string>
</resources> </resources>

View File

@@ -50,6 +50,8 @@
<string name="pref_price_group_title">Canteen Price Group</string> <string name="pref_price_group_title">Canteen Price Group</string>
<string name="pref_price_group_summary">Only show specific price category</string> <string name="pref_price_group_summary">Only show specific price category</string>
<string name="pref_price_group_dialog">Price Group Selection</string> <string name="pref_price_group_dialog">Price Group Selection</string>
<string name="pref_external_server_title">More efficient data sync</string>
<string name="pref_external_server_summary">Uses more battery and data efficient syncing and refreshing, but use an external server.</string>
<string name="meals">Meals</string> <string name="meals">Meals</string>
<string name="special_meals">Special meals</string> <string name="special_meals">Special meals</string>
<string name="side_dishes">Side Dishes</string> <string name="side_dishes">Side Dishes</string>

View File

@@ -9,6 +9,11 @@
android:entries="@array/pref_price_group_entries" android:entries="@array/pref_price_group_entries"
android:entryValues="@array/pref_price_group_values" android:entryValues="@array/pref_price_group_values"
android:dialogTitle="@string/pref_price_group_dialog" /> android:dialogTitle="@string/pref_price_group_dialog" />
<SwitchPreference
android:key="@string/pref_external_server"
android:defaultValue="@string/pref_external_server_default"
android:title="@string/pref_external_server_title"
android:summary="@string/pref_external_server_summary" />
<PreferenceScreen <PreferenceScreen
android:title="@string/open_data_policy" android:title="@string/open_data_policy"
android:summary="@string/open_data_policy_summary"> android:summary="@string/open_data_policy_summary">

View File

@@ -9,8 +9,7 @@ buildscript {
} }
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.google.gms:google-services:4.0.0'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files

View File

@@ -1,6 +1,6 @@
#Tue Oct 16 18:11:34 CEST 2018 #Wed Jan 16 22:29:38 CET 2019
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip