Compare commits
17 Commits
kvvservice
...
beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22470f58da | ||
|
|
697740e20b | ||
|
|
31cea12d16 | ||
|
|
b8fe45e75e | ||
|
|
729d3165f7 | ||
|
|
6f1705ccf4 | ||
|
|
6a56573c6b | ||
|
|
322cf6f8a5 | ||
|
|
6d30050eae | ||
|
|
45a5513b54 | ||
|
|
e98e9f5e2f | ||
|
|
d4275aad90 | ||
|
|
f9fb7e8351 | ||
|
|
889007ab42 | ||
|
|
c549bb39a4 | ||
|
|
1e0b2a8952 | ||
|
|
54196f3794 |
@@ -7,8 +7,8 @@ android {
|
||||
applicationId "de.sebse.fuplanner"
|
||||
minSdkVersion 15
|
||||
targetSdkVersion 28
|
||||
versionCode 19
|
||||
versionName "1.4"
|
||||
versionCode 21
|
||||
versionName "1.4.2"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
buildTypes {
|
||||
|
||||
@@ -18,8 +18,6 @@
|
||||
<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 -->
|
||||
<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.READ_SYNC_SETTINGS" />
|
||||
|
||||
|
||||
@@ -171,8 +171,6 @@ public class MainActivity extends AppCompatActivity
|
||||
getKVV().modules().list().reloadIfOutdated();
|
||||
}
|
||||
isPaused = false;
|
||||
//log.d("onResume", "send notification!");
|
||||
//CustomNotificationManager.sendNotification(this, "Titel", "Neue Announcements!");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -361,12 +359,10 @@ public class MainActivity extends AppCompatActivity
|
||||
((TextView) header.findViewById(R.id.login_mail)).setText(email);
|
||||
|
||||
changeFragment(newFragment);
|
||||
registerSync();
|
||||
}
|
||||
|
||||
private void registerSync() {
|
||||
Account accountByType = mAccountManager.getAccountByType(AccountGeneral.ACCOUNT_TYPE);
|
||||
log.d("registerSync", accountByType);
|
||||
if (accountByType != null) {
|
||||
ContentResolver.setSyncAutomatically(accountByType, KVVContentProvider.PROVIDER_NAME, true);
|
||||
ContentResolver.addPeriodicSync(
|
||||
@@ -662,8 +658,11 @@ public class MainActivity extends AppCompatActivity
|
||||
|
||||
|
||||
@Override
|
||||
public void onLogin(LoginToken token) {
|
||||
public void onLogin(LoginToken token, boolean isOnlyRefresh) {
|
||||
toLoginState(token.getFullName(), token.getEmail(), getDefaultFragmentAfterLogin());
|
||||
if (!isOnlyRefresh) {
|
||||
registerSync();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -178,7 +178,7 @@ class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
|
||||
end = UtilsDate.getModifiedDate(lastDateTime);
|
||||
weekday = UtilsDate.getModifiedDate(context, firstDateTime, "E");
|
||||
startTime = UtilsDate.getModifiedTime(context, firstDateTime);
|
||||
endTime = UtilsDate.getModifiedTime(context, lastDateTime);
|
||||
endTime = UtilsDate.getModifiedTime(context, lastDateTime+1);
|
||||
for (long skippedDate : group.getSkippedDates()) {
|
||||
if (excepts == null) {
|
||||
excepts = new StringBuilder(UtilsDate.getModifiedDate(skippedDate));
|
||||
@@ -199,9 +199,9 @@ class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
|
||||
else
|
||||
start = UtilsDate.getModifiedDateTime(context, event.getStartDate());
|
||||
if (UtilsDate.dateEquals(event.getStartDate(), event.getEndDate()))
|
||||
end = UtilsDate.getModifiedTime(context, event.getEndDate());
|
||||
end = UtilsDate.getModifiedTime(context, event.getEndDate()+1);
|
||||
else
|
||||
end = UtilsDate.getModifiedDateTime(context, event.getEndDate());
|
||||
end = UtilsDate.getModifiedDateTime(context, event.getEndDate()+1);
|
||||
date = context.getString(R.string.date_scale, start, end);
|
||||
iu.mTitle.setText(event.getTitle());
|
||||
iu.mSubLeft.setText(date);
|
||||
|
||||
@@ -193,9 +193,9 @@ class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||
else
|
||||
start = UtilsDate.getModifiedDateTime(i.mView.getContext(), event.getStartDate());
|
||||
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
|
||||
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,
|
||||
start, end
|
||||
));
|
||||
|
||||
@@ -14,8 +14,8 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
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.types.LoginToken;
|
||||
import de.sebse.fuplanner.tools.logging.Logger;
|
||||
|
||||
|
||||
@@ -76,24 +76,11 @@ public class UserLoginTask extends AsyncTask<Void, Void, String> {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
log.d(login.get());
|
||||
|
||||
if (login.get() == null) {
|
||||
return null;
|
||||
} else {
|
||||
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
|
||||
|
||||
@@ -6,7 +6,7 @@ import de.sebse.fuplanner.services.kvv.types.LoginToken;
|
||||
import de.sebse.fuplanner.tools.CustomAccountManager;
|
||||
|
||||
public interface KVVListener {
|
||||
default void onLogin(LoginToken token) {}
|
||||
default void onLogin(LoginToken token, boolean isOnlyRefresh) {}
|
||||
|
||||
default void onLogout() {}
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ import android.content.Context;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import de.sebse.fuplanner.services.kvv.types.LoginToken;
|
||||
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.NetworkCallbackCollector;
|
||||
import de.sebse.fuplanner.tools.network.HTTPService;
|
||||
@@ -34,7 +34,6 @@ public class Login extends HTTPService {
|
||||
LoginToken.load(mListener.getAccountManager(), token -> {
|
||||
boolean result = setToken(token);
|
||||
mLoginPending = false;
|
||||
log.d("loginToken", token != null ? token.toString() : null);
|
||||
callback.run(result);
|
||||
});
|
||||
}
|
||||
@@ -53,7 +52,7 @@ public class Login extends HTTPService {
|
||||
if (delete)
|
||||
mToken.delete(mListener.getAccountManager());
|
||||
mToken = null;
|
||||
return handleCallbacks();
|
||||
return handleCallbacks(false);
|
||||
}
|
||||
|
||||
public boolean isLoginPending() {
|
||||
@@ -104,9 +103,9 @@ public class Login extends HTTPService {
|
||||
|
||||
|
||||
|
||||
private boolean handleCallbacks() {
|
||||
private boolean handleCallbacks(boolean isOnlyRefresh) {
|
||||
if (mToken != null) {
|
||||
mListener.onLogin(mToken);
|
||||
mListener.onLogin(mToken, isOnlyRefresh);
|
||||
return true;
|
||||
} else {
|
||||
mListener.onLogout();
|
||||
@@ -119,7 +118,7 @@ public class Login extends HTTPService {
|
||||
return false;
|
||||
boolean isOnlyRefresh = mToken != null;
|
||||
mToken = token;
|
||||
return isOnlyRefresh || handleCallbacks();
|
||||
return isOnlyRefresh || handleCallbacks(isOnlyRefresh);
|
||||
}
|
||||
|
||||
public interface BooleanInterface {
|
||||
|
||||
@@ -149,7 +149,6 @@ public class ModulesList extends HTTPService {
|
||||
}
|
||||
|
||||
private void upgrade(final NetworkCallback<Modules> callback, final NetworkErrorCallback errorCallback) {
|
||||
log.d(mLogin.isInOnlineMode(), mLogin.getLoginToken());
|
||||
if (!mLogin.isInOnlineMode() || mLogin.getLoginToken() == null) {
|
||||
errorCallback.onError(new NetworkError(101105, 500, "Currently running in offline mode!"));
|
||||
return;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package de.sebse.fuplanner.services.kvv;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Environment;
|
||||
|
||||
import org.json.JSONArray;
|
||||
@@ -9,6 +10,9 @@ import org.json.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLDecoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import de.sebse.fuplanner.services.kvv.types.Modules;
|
||||
@@ -95,10 +99,18 @@ public class ModulesResources extends PartModules<ArrayList<Resource>> {
|
||||
} else {
|
||||
// in sub folder
|
||||
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
|
||||
((Resource.Folder) res2).add(res);
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.Assignment;
|
||||
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.Grade;
|
||||
import de.sebse.fuplanner.services.kvv.types.Modules;
|
||||
@@ -56,6 +55,7 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
|
||||
|
||||
private void init(Context context) {
|
||||
mKVV = new KVV(new KVVListener() {
|
||||
|
||||
CustomAccountManager accountManager = null;
|
||||
@Override
|
||||
public CustomAccountManager getAccountManager() {
|
||||
@@ -66,7 +66,6 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
|
||||
}, context);
|
||||
mQueue.add(() -> {
|
||||
mKVV.account().restoreOnlineLogin(bool -> {
|
||||
log.d("login restored");
|
||||
mQueue.next();
|
||||
});
|
||||
});
|
||||
@@ -84,14 +83,11 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
|
||||
String authority,
|
||||
ContentProviderClient provider,
|
||||
SyncResult syncResult) {
|
||||
log.d("onPerformSync");
|
||||
mQueue.add(() -> {
|
||||
log.d("start syncing");
|
||||
mKVV.modules().list().recv(success -> {
|
||||
Iterator<Modules.Module> iterator = success.latestSemesterIterator();
|
||||
while (iterator.hasNext()) {
|
||||
Modules.Module module = iterator.next();
|
||||
log.d("sync module", module.title);
|
||||
final ArrayList<Announcement> announcements = module.announcements;
|
||||
final AssignmentList assignments = module.assignments;
|
||||
final EventList events = module.events;
|
||||
@@ -99,12 +95,11 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
|
||||
final ArrayList<Resource> resources = module.resources;
|
||||
mKVV.modules().details().recv(module, success1 -> {
|
||||
if (success1.second) {
|
||||
log.d("Sync Successful for Module '"+module.title+"'!");
|
||||
sendNotifications(announcements, module.announcements, module.title, Announcement::getTitle, Announcement::getId,
|
||||
R.string.announcement_updated, R.string.announcement_added, R.string.announcement_removed);
|
||||
sendNotifications(assignments, module.assignments, module.title, Assignment::getTitle, Assignment::getId,
|
||||
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);
|
||||
sendNotifications(gradebook, module.gradebook, module.title, Grade::getItemName, Grade::getItemName,
|
||||
R.string.gradebook_updated, R.string.gradebook_added, R.string.gradebook_removed);
|
||||
@@ -121,7 +116,6 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
|
||||
log.e(msg);
|
||||
mQueue.next();
|
||||
}, true);
|
||||
log.d("finished");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -129,7 +123,7 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
|
||||
if (oldList == null || newList == null) {
|
||||
return;
|
||||
}
|
||||
ArrayList<T> obsoletes = new ArrayList<T>();
|
||||
ArrayList<T> obsoletes = new ArrayList<>();
|
||||
for (T old: oldList) {
|
||||
obsoletes.add(old);
|
||||
}
|
||||
|
||||
@@ -62,14 +62,13 @@ public class Login extends HTTPService {
|
||||
String fuJSESSIONID = success2.get("JSESSIONID");
|
||||
step3(fuJSESSIONID, success3 -> {
|
||||
step4(username, password, fuJSESSIONID, success4 -> {
|
||||
String fuSHIBSession = success4.get("shib_idp_session");
|
||||
String samlResponse = success4.get("SAMLResponse");
|
||||
step5(samlResponse, success5 -> {
|
||||
String shibsessionKey = success5.get("shibsessionKey");
|
||||
String shibsessionName = success5.get("shibsessionName");
|
||||
step6(shibsessionKey, shibsessionName, success6 -> {
|
||||
String kvvJSESSIONID = success6.get("JSESSIONID");
|
||||
LoginToken token = new LoginToken(username, shibsessionKey, shibsessionName, kvvJSESSIONID);
|
||||
LoginToken token = new LoginToken(username, kvvJSESSIONID);
|
||||
callback.onResponse(token);
|
||||
}, error);
|
||||
}, error);
|
||||
|
||||
@@ -118,6 +118,6 @@ public class Event implements Serializable {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(getId(), getType(), getStartDate(), getEndDate(), getTitle(), getLocation());
|
||||
return Objects.hashCode(getType(), getStartDate(), getEndDate(), getTitle(), getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
package de.sebse.fuplanner.services.kvv.types;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -19,25 +15,19 @@ import de.sebse.fuplanner.tools.logging.Logger;
|
||||
* Created by sebastian on 29.10.17.
|
||||
*/
|
||||
|
||||
public class LoginToken implements Serializable {
|
||||
public class LoginToken {
|
||||
static Logger log = new Logger("LoginToken");
|
||||
private static final String FILE_NAME = "LoginTokenSaving";
|
||||
|
||||
private final String username;
|
||||
private final String shibsessionKey;
|
||||
private final String shibsessionName;
|
||||
private final String JSESSIONID;
|
||||
@Nullable private String fullName;
|
||||
@Nullable private String email;
|
||||
|
||||
public LoginToken(String username, String shibsessionKey, String shibsessionName, String JSESSIONID) {
|
||||
public LoginToken(String username, String JSESSIONID) {
|
||||
this.username = username;
|
||||
this.shibsessionKey = shibsessionKey;
|
||||
this.shibsessionName = shibsessionName;
|
||||
this.JSESSIONID = JSESSIONID;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static void load(CustomAccountManager manager, LoginTokenInterface callback) {
|
||||
if (!manager.hasAccounts(AccountGeneral.ACCOUNT_TYPE)) {
|
||||
callback.run(null);
|
||||
@@ -65,14 +55,6 @@ public class LoginToken implements Serializable {
|
||||
return username;
|
||||
}
|
||||
|
||||
private String getShibsessionKey() {
|
||||
return shibsessionKey;
|
||||
}
|
||||
|
||||
private String getShibsessionName() {
|
||||
return shibsessionName;
|
||||
}
|
||||
|
||||
private String getJSESSIONID() {
|
||||
return JSESSIONID;
|
||||
}
|
||||
@@ -90,7 +72,6 @@ public class LoginToken implements Serializable {
|
||||
public HashMap<String, String> getCookies() {
|
||||
HashMap<String, String> cookies = new HashMap<>();
|
||||
cookies.put("JSESSIONID", getJSESSIONID());
|
||||
cookies.put(getShibsessionKey(), getShibsessionName());
|
||||
cookies.put("pasystem_timezone_ok", "true");
|
||||
return cookies;
|
||||
}
|
||||
@@ -114,8 +95,6 @@ public class LoginToken implements Serializable {
|
||||
JSONObject json = new JSONObject();
|
||||
try {
|
||||
json.put("username", username);
|
||||
json.put("shibsessionKey", shibsessionKey);
|
||||
json.put("shibsessionName", shibsessionName);
|
||||
json.put("JSESSIONID", JSESSIONID);
|
||||
json.put("fullName", fullName);
|
||||
json.put("email", email);
|
||||
@@ -125,13 +104,11 @@ public class LoginToken implements Serializable {
|
||||
return json.toString();
|
||||
}
|
||||
|
||||
public static LoginToken fromJsonString(String tokenString) {
|
||||
private static LoginToken fromJsonString(String tokenString) {
|
||||
try {
|
||||
JSONObject json = new JSONObject(tokenString);
|
||||
LoginToken token = new LoginToken(
|
||||
json.getString("username"),
|
||||
json.getString("shibsessionName"),
|
||||
json.getString("shibsessionName"),
|
||||
json.getString("JSESSIONID"));
|
||||
if (!json.isNull("fullName"))
|
||||
token.setAdditionals(
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
android:icon="@drawable/ic_local_dining"
|
||||
android:title="@string/canteen_plan"
|
||||
android:orderInCategory="200" />
|
||||
<item
|
||||
android:id="@+id/nav_settings"
|
||||
android:icon="@drawable/ic_settings"
|
||||
android:title="@string/settings"
|
||||
android:orderInCategory="300"/>
|
||||
<item
|
||||
android:id="@+id/nav_news"
|
||||
android:icon="@drawable/ic_chat_bubble_outline"
|
||||
|
||||
@@ -93,20 +93,22 @@
|
||||
<string name="error_field_required">Pflichtfeld</string>
|
||||
<string name="kvv_sync">KVV-Synchronisation</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="assignment_updated">Aufgabe aktualisiert: %1$s</string>
|
||||
<string name="event_updated">Event aktualisiert: %1$s</string>
|
||||
<string name="gradebook_updated">Noteneintrag 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="assignment_added">Neue Aufgabe: %1$</string>
|
||||
<string name="event_added">Neues Event: %1$</string>
|
||||
<string name="gradebook_added">Neuer Noteneintrag: %1$</string>
|
||||
<string name="resource_added">Neue Ressource: %1$</string>
|
||||
<string name="assignment_added">Neue Aufgabe: %1$s</string>
|
||||
<string name="event_added">Neues Event: %1$s</string>
|
||||
<string name="gradebook_added">Neuer Noteneintrag: %1$s</string>
|
||||
<string name="resource_added">Neue Ressource: %1$s</string>
|
||||
<string name="announcement_removed">Ankündigung entfernt: %1$s</string>
|
||||
<string name="assignment_removed">Aufgabe entfernt: %1$s</string>
|
||||
<string name="event_removed">Event entfernt: %1$s</string>
|
||||
<string name="gradebook_removed">Noteneintrag 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>
|
||||
@@ -10,4 +10,12 @@
|
||||
<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-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>
|
||||
@@ -50,6 +50,8 @@
|
||||
<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_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="special_meals">Special meals</string>
|
||||
<string name="side_dishes">Side Dishes</string>
|
||||
|
||||
@@ -9,6 +9,11 @@
|
||||
android:entries="@array/pref_price_group_entries"
|
||||
android:entryValues="@array/pref_price_group_values"
|
||||
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
|
||||
android:title="@string/open_data_policy"
|
||||
android:summary="@string/open_data_policy_summary">
|
||||
|
||||
@@ -9,8 +9,7 @@ buildscript {
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.2.1'
|
||||
classpath 'com.google.gms:google-services:4.0.0'
|
||||
classpath 'com.android.tools.build:gradle:3.3.0'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
||||
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
||||
#Tue Oct 16 18:11:34 CEST 2018
|
||||
#Wed Jan 16 22:29:38 CET 2019
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user