15 Commits

Author SHA1 Message Date
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
15 changed files with 45 additions and 47 deletions

View File

@@ -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 {

View File

@@ -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" />

View File

@@ -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

View File

@@ -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);

View File

@@ -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
));

View File

@@ -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,8 +76,6 @@ public class UserLoginTask extends AsyncTask<Void, Void, String> {
e.printStackTrace();
}
log.d(login.get());
if (login.get() == null) {
return null;
} else {

View File

@@ -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() {}

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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();
}
}
}
}

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.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);
}

View File

@@ -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());
}
}

View File

@@ -93,17 +93,17 @@
<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>

View File

@@ -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

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
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