diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ca1fede..542b57a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -18,6 +18,8 @@
+
+
+
+
+
-
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java
index 21043a4..ffccf8b 100644
--- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java
+++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java
@@ -39,14 +39,13 @@ import de.sebse.fuplanner.fragments.moddetails.ModDetailFragment;
import de.sebse.fuplanner.services.Canteen.CanteenBrowser;
import de.sebse.fuplanner.services.Canteen.types.Canteen;
import de.sebse.fuplanner.services.Canteen.types.CanteenListener;
-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.KVVListener;
-import de.sebse.fuplanner.services.KVV.types.LoginToken;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.KVV;
+import de.sebse.fuplanner.services.kvv.KVVListener;
+import de.sebse.fuplanner.services.kvv.types.LoginToken;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.services.News.NewsManager;
-import de.sebse.fuplanner.services.newkvv.AccountGeneral;
+import de.sebse.fuplanner.services.fulogin.AccountGeneral;
import de.sebse.fuplanner.tools.CustomAccountManager;
import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.NewAsyncQueue;
@@ -54,9 +53,6 @@ import de.sebse.fuplanner.tools.Preferences;
import de.sebse.fuplanner.tools.Regex;
import de.sebse.fuplanner.tools.RequestPermissionsResultListener;
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;
import de.sebse.fuplanner.tools.types.News;
public class MainActivity extends AppCompatActivity
@@ -669,16 +665,6 @@ public class MainActivity extends AppCompatActivity
- @Override
- public void getCredentials(NetworkCallback callback, NetworkErrorCallback error) {
- getGoogleAuth().getLoginState(credentials -> {
- if (credentials == null || credentials.getUsername() == null || credentials.getPassword() == null) {
- error.onError(new NetworkError(200100, 403, "No Google Login available!"));
- } else {
- callback.onResponse(credentials);
- }
- });
- }
@Override
public void onLogin(LoginToken token, boolean enteringOnlineMode) {
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java
index 3d770ea..01b5916 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java
@@ -11,9 +11,9 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.fragments.ModulesFragment.OnModulesFragmentInteractionListener;
-import de.sebse.fuplanner.services.KVV.types.Lecturer;
-import de.sebse.fuplanner.services.KVV.types.Modules;
-import de.sebse.fuplanner.services.KVV.types.Semester;
+import de.sebse.fuplanner.services.kvv.types.Lecturer;
+import de.sebse.fuplanner.services.kvv.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Semester;
import de.sebse.fuplanner.tools.ui.CustomViewHolder;
import de.sebse.fuplanner.tools.ui.ItemViewHolder;
import de.sebse.fuplanner.tools.ui.StringViewHolder;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/NewsAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/NewsAdapter.java
index a454958..cdebef9 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/NewsAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/NewsAdapter.java
@@ -8,7 +8,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
import de.sebse.fuplanner.fragments.ModulesFragment.OnModulesFragmentInteractionListener;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.types.News;
import de.sebse.fuplanner.tools.types.NewsList;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java
index 01329b2..703c172 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java
@@ -16,8 +16,8 @@ import java.util.List;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Event;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Event;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java
index c416336..1e26f9d 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java
@@ -16,9 +16,9 @@ import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.ui.Download;
-import de.sebse.fuplanner.services.KVV.types.Announcement;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.ui.Download;
+import de.sebse.fuplanner.services.kvv.types.Announcement;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.Regex;
import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java
index 102ee62..fcbd7cf 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java
@@ -14,8 +14,8 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Modules;
-import de.sebse.fuplanner.services.KVV.ui.Download;
+import de.sebse.fuplanner.services.kvv.types.Modules;
+import de.sebse.fuplanner.services.kvv.ui.Download;
import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java
index 7e115d4..d2fc2a9 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java
@@ -16,9 +16,9 @@ import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.ui.Download;
-import de.sebse.fuplanner.services.KVV.types.Assignment;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.ui.Download;
+import de.sebse.fuplanner.services.kvv.types.Assignment;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.Regex;
import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java
index 28f2514..19b4af6 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java
@@ -14,8 +14,8 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.ui.Download;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.ui.Download;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java
index 7773664..6de6a20 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java
@@ -14,10 +14,10 @@ import java.util.Map;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Event;
-import de.sebse.fuplanner.services.KVV.types.EventList;
-import de.sebse.fuplanner.services.KVV.types.GroupedEvents;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Event;
+import de.sebse.fuplanner.services.kvv.types.EventList;
+import de.sebse.fuplanner.services.kvv.types.GroupedEvents;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger;
import de.sebse.fuplanner.tools.ui.CustomViewHolder;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java
index b673cb2..7bc80fa 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java
@@ -10,7 +10,7 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookAdapter.java
index cd0bb74..8a1e3c9 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookAdapter.java
@@ -12,8 +12,8 @@ import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Grade;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Grade;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.ui.StringViewHolder;
class ModDetailGradebookAdapter extends RecyclerView.Adapter {
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java
index 6b616d4..1f444cd 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java
@@ -15,11 +15,11 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Announcement;
-import de.sebse.fuplanner.services.KVV.types.Assignment;
-import de.sebse.fuplanner.services.KVV.types.Event;
-import de.sebse.fuplanner.services.KVV.types.Lecturer;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Announcement;
+import de.sebse.fuplanner.services.kvv.types.Assignment;
+import de.sebse.fuplanner.services.kvv.types.Event;
+import de.sebse.fuplanner.services.kvv.types.Lecturer;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger;
import de.sebse.fuplanner.tools.ui.CustomViewHolder;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceAdapter.java
index ba5f006..b91ef2a 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceAdapter.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceAdapter.java
@@ -3,8 +3,8 @@ package de.sebse.fuplanner.fragments.moddetails;
import java.util.ArrayList;
import java.util.List;
-import de.sebse.fuplanner.services.KVV.types.Modules;
-import de.sebse.fuplanner.services.KVV.types.Resource;
+import de.sebse.fuplanner.services.kvv.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Resource;
import de.sebse.fuplanner.tools.ui.treeview.TreeNode;
import de.sebse.fuplanner.tools.ui.treeview.TreeViewAdapter;
import de.sebse.fuplanner.tools.ui.treeview.TreeViewBinder;
diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java
index 9d23e95..56f5249 100644
--- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java
+++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailResourceFragment.java
@@ -18,9 +18,9 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.ui.Download;
-import de.sebse.fuplanner.services.KVV.types.Modules;
-import de.sebse.fuplanner.services.KVV.types.Resource;
+import de.sebse.fuplanner.services.kvv.ui.Download;
+import de.sebse.fuplanner.services.kvv.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Resource;
import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.logging.Logger;
import de.sebse.fuplanner.tools.ui.treeview.DirectoryNodeBinder;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVListener.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVListener.java
deleted file mode 100644
index 9747f7f..0000000
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package de.sebse.fuplanner.services.KVV;
-
-import com.android.volley.NetworkResponse;
-
-import de.sebse.fuplanner.services.GoogleAuth.Credentials;
-import de.sebse.fuplanner.services.KVV.types.LoginToken;
-import de.sebse.fuplanner.tools.CustomAccountManager;
-import de.sebse.fuplanner.tools.network.NetworkCallback;
-import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
-
-public interface KVVListener {
- void getCredentials(NetworkCallback callback, NetworkErrorCallback error);
-
- void onLogin(LoginToken token, boolean enteringOnlineMode);
-
- void onLogout();
-
- void onModuleListChange();
-
- void onKVVNetworkResponse(NetworkResponse error);
-
- CustomAccountManager getAccountManager();
-}
diff --git a/app/src/main/java/de/sebse/fuplanner/services/newkvv/AccountGeneral.java b/app/src/main/java/de/sebse/fuplanner/services/fulogin/AccountGeneral.java
similarity index 84%
rename from app/src/main/java/de/sebse/fuplanner/services/newkvv/AccountGeneral.java
rename to app/src/main/java/de/sebse/fuplanner/services/fulogin/AccountGeneral.java
index 2d98253..7c15881 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/newkvv/AccountGeneral.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/fulogin/AccountGeneral.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.newkvv;
+package de.sebse.fuplanner.services.fulogin;
public class AccountGeneral {
public static final String ACCOUNT_TYPE = "de.sebse.fuplanner.fuauth";
diff --git a/app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticator.java b/app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticator.java
similarity index 98%
rename from app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticator.java
rename to app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticator.java
index 6dfba9c..ae8e79d 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticator.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticator.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.newkvv;
+package de.sebse.fuplanner.services.fulogin;
import android.accounts.AbstractAccountAuthenticator;
import android.accounts.Account;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticatorActivity.java b/app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticatorActivity.java
similarity index 95%
rename from app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticatorActivity.java
rename to app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticatorActivity.java
index 03ee6cd..79b6e14 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticatorActivity.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticatorActivity.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.newkvv;
+package de.sebse.fuplanner.services.fulogin;
import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity;
@@ -27,7 +27,7 @@ import android.widget.EditText;
import androidx.annotation.NonNull;
import de.sebse.fuplanner.R;
-import static de.sebse.fuplanner.services.newkvv.UserLoginTask.PARAM_USER_PASS;
+import static de.sebse.fuplanner.services.fulogin.UserLoginTask.PARAM_USER_PASS;
/**
* A login screen that offers login via email/password.
@@ -169,10 +169,6 @@ public class FUAuthenticatorActivity extends AccountAuthenticatorActivity implem
mEmailView.setError(getString(R.string.error_field_required));
focusView = mEmailView;
cancel = true;
- } else if (!isEmailValid(email)) {
- mEmailView.setError(getString(R.string.error_invalid_email));
- focusView = mEmailView;
- cancel = true;
}
if (cancel) {
@@ -188,11 +184,6 @@ public class FUAuthenticatorActivity extends AccountAuthenticatorActivity implem
}
}
- private boolean isEmailValid(String email) {
- //TODO: Replace this with your own logic
- return true;//email.contains("@");
- }
-
private boolean isPasswordValid(String password) {
//TODO: Replace this with your own logic
return password.length() > 4;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticatorService.java b/app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticatorService.java
similarity index 87%
rename from app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticatorService.java
rename to app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticatorService.java
index a6f1516..62519a6 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/newkvv/FUAuthenticatorService.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/fulogin/FUAuthenticatorService.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.newkvv;
+package de.sebse.fuplanner.services.fulogin;
import android.app.Service;
import android.content.Intent;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/newkvv/UserLoginTask.java b/app/src/main/java/de/sebse/fuplanner/services/fulogin/UserLoginTask.java
similarity index 96%
rename from app/src/main/java/de/sebse/fuplanner/services/newkvv/UserLoginTask.java
rename to app/src/main/java/de/sebse/fuplanner/services/fulogin/UserLoginTask.java
index 3338106..50f0e34 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/newkvv/UserLoginTask.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/fulogin/UserLoginTask.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.newkvv;
+package de.sebse.fuplanner.services.fulogin;
import android.accounts.AccountManager;
import android.annotation.SuppressLint;
@@ -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.newkvv.network.Login;
+import de.sebse.fuplanner.services.kvv.types.LoginToken;
+import de.sebse.fuplanner.services.kvv.sync.Login;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/KVV.java
similarity index 96%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/KVV.java
index 076947f..3a0770b 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/KVV.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/KVVListener.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/KVVListener.java
new file mode 100644
index 0000000..ffe2a81c
--- /dev/null
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/KVVListener.java
@@ -0,0 +1,18 @@
+package de.sebse.fuplanner.services.kvv;
+
+import com.android.volley.NetworkResponse;
+
+import de.sebse.fuplanner.services.kvv.types.LoginToken;
+import de.sebse.fuplanner.tools.CustomAccountManager;
+
+public interface KVVListener {
+ void onLogin(LoginToken token, boolean enteringOnlineMode);
+
+ void onLogout();
+
+ void onModuleListChange();
+
+ void onKVVNetworkResponse(NetworkResponse error);
+
+ CustomAccountManager getAccountManager();
+}
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/Login.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/Login.java
similarity index 69%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/Login.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/Login.java
index ca47f2e..cda072c 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/Login.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/Login.java
@@ -1,14 +1,12 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
import org.jetbrains.annotations.NotNull;
-import org.json.JSONException;
-import org.json.JSONObject;
import androidx.annotation.Nullable;
-import de.sebse.fuplanner.services.KVV.types.LoginToken;
-import de.sebse.fuplanner.services.newkvv.AccountGeneral;
+import de.sebse.fuplanner.services.kvv.types.LoginToken;
+import de.sebse.fuplanner.services.fulogin.AccountGeneral;
import de.sebse.fuplanner.tools.CustomAccountManager;
import de.sebse.fuplanner.tools.NetworkCallbackCollector;
import de.sebse.fuplanner.tools.network.HTTPService;
@@ -35,18 +33,6 @@ public class Login extends HTTPService {
mOnlineMode = false;
}
- public void doOnlineLogin(@NotNull String username, @NotNull String password, NetworkCallback callback, NetworkErrorCallback errorCallback) {
-
- }
-
- //public boolean restoreOnlineLogin() {
- // return restoreLogin(true);
- //}
-
- //public boolean doOfflineLogin() {
- // return restoreLogin(false);
- //}
-
public void restoreOnlineLogin(BooleanInterface callback) {
if (mLoginPending) {
callback.run(false);
@@ -103,22 +89,7 @@ public class Login extends HTTPService {
}
private void testLoginToken(@NotNull LoginToken token, @NotNull NetworkCallback callback, @NotNull NetworkErrorCallback errorCallback) {
- get(String.format("https://kvv.imp.fu-berlin.de/direct/profile/%s.json", token.getUsername()), token.getCookies(), response -> {
- String body = response.getParsed();
- if (body == null) {
- errorCallback.onError(new NetworkError(100172, 403, "Testing login failed!"));
- return;
- }
- try {
- JSONObject json = new JSONObject(body);
- String displayName = json.getString("displayName");
- String email = json.getString("email");
- token.setAdditionals(displayName, email);
- callback.onResponse(token);
- } catch (JSONException e) {
- errorCallback.onError(new NetworkError(100171, 403, "Cannot parse profile!"));
- }
- }, error -> errorCallback.onError(new NetworkError(100170, error.networkResponse.statusCode, "Testing login failed!")));
+ new de.sebse.fuplanner.services.kvv.sync.Login(getContext()).testLoginToken(token, callback, errorCallback);
}
@Nullable public LoginToken getLoginToken() {
@@ -132,9 +103,7 @@ public class Login extends HTTPService {
return;
CustomAccountManager manager = mListener.getAccountManager();
manager.doInvalidateToken(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_KVV, ignored -> {
- log.d("try restore", ignored);
restoreOnlineLogin(isRestored -> {
- log.d("restore", isRestored, mToken);
if (isRestored)
testLoginToken(mRefreshCallbacks::responseResponse, mRefreshCallbacks::responseError);
else {
@@ -143,14 +112,6 @@ public class Login extends HTTPService {
}
});
});
- /* mListener.getCredentials(credentials -> {
- doOnlineLogin(credentials.getUsername(), credentials.getPassword(),
- mRefreshCallbacks::responseResponse,
- mRefreshCallbacks::responseError);
- }, e -> {
- logout(false);
- mRefreshCallbacks.responseError(e);
- });*/
}
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
similarity index 98%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/Modules.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/Modules.java
index 6923138..f2e8868 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
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesAnnouncements.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAnnouncements.java
similarity index 96%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesAnnouncements.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAnnouncements.java
index b13df13..d6b4877 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesAnnouncements.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAnnouncements.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
@@ -8,8 +8,8 @@ import org.json.JSONObject;
import java.util.ArrayList;
-import de.sebse.fuplanner.services.KVV.types.Announcement;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Announcement;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesAssignments.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAssignments.java
similarity index 94%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesAssignments.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAssignments.java
index 357be2c..c7948a5 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesAssignments.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesAssignments.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
@@ -8,9 +8,9 @@ import org.json.JSONObject;
import java.util.ArrayList;
-import de.sebse.fuplanner.services.KVV.types.Assignment;
-import de.sebse.fuplanner.services.KVV.types.AssignmentList;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Assignment;
+import de.sebse.fuplanner.services.kvv.types.AssignmentList;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesDetails.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesDetails.java
similarity index 94%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesDetails.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesDetails.java
index a08fda4..ffc491c 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesDetails.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesDetails.java
@@ -1,11 +1,11 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
import android.util.Pair;
import java.util.concurrent.atomic.AtomicReference;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesEvents.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java
similarity index 94%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesEvents.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java
index 66ba5c1..13417f9 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesEvents.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
@@ -6,9 +6,9 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-import de.sebse.fuplanner.services.KVV.types.Event;
-import de.sebse.fuplanner.services.KVV.types.EventList;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Event;
+import de.sebse.fuplanner.services.kvv.types.EventList;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesGradebook.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesGradebook.java
similarity index 95%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesGradebook.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesGradebook.java
index d346289..74672d9 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesGradebook.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesGradebook.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
@@ -8,8 +8,8 @@ import org.json.JSONObject;
import java.util.ArrayList;
-import de.sebse.fuplanner.services.KVV.types.Grade;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Grade;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesList.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java
similarity index 96%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesList.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java
index 7c1d279..b21635a 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesList.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
@@ -13,9 +13,9 @@ import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.regex.MatchResult;
-import de.sebse.fuplanner.services.KVV.types.Lecturer;
-import de.sebse.fuplanner.services.KVV.types.Modules;
-import de.sebse.fuplanner.services.KVV.types.Semester;
+import de.sebse.fuplanner.services.kvv.types.Lecturer;
+import de.sebse.fuplanner.services.kvv.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Semester;
import de.sebse.fuplanner.tools.NewAsyncQueue;
import de.sebse.fuplanner.tools.Regex;
import de.sebse.fuplanner.tools.network.HTTPService;
@@ -23,7 +23,7 @@ import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
-import static de.sebse.fuplanner.services.KVV.PartModules.RETRY_COUNT;
+import static de.sebse.fuplanner.services.kvv.PartModules.RETRY_COUNT;
public class ModulesList extends HTTPService {
private final Login mLogin;
@@ -139,6 +139,7 @@ public class ModulesList extends HTTPService {
}
private void upgrade(final NetworkCallback 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;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesResources.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesResources.java
similarity index 98%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesResources.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesResources.java
index 5250ed9..4c86b2a 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ModulesResources.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesResources.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
import android.os.Environment;
@@ -11,8 +11,8 @@ import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
-import de.sebse.fuplanner.services.KVV.types.Modules;
-import de.sebse.fuplanner.services.KVV.types.Resource;
+import de.sebse.fuplanner.services.kvv.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Resource;
import de.sebse.fuplanner.tools.Regex;
import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.network.NetworkCallback;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/Part.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/Part.java
similarity index 93%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/Part.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/Part.java
index a9b11d7..763af76 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/Part.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/Part.java
@@ -1,8 +1,8 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.network.HTTPService;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/PartModules.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/PartModules.java
similarity index 96%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/PartModules.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/PartModules.java
index 8798c8c..eae3b53 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/PartModules.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/PartModules.java
@@ -1,11 +1,11 @@
-package de.sebse.fuplanner.services.KVV;
+package de.sebse.fuplanner.services.kvv;
import android.content.Context;
import android.os.Build;
import android.text.Html;
import android.text.Spanned;
-import de.sebse.fuplanner.services.KVV.types.Modules;
+import de.sebse.fuplanner.services.kvv.types.Modules;
import de.sebse.fuplanner.tools.NewAsyncQueue;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVContentProvider.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVContentProvider.java
new file mode 100644
index 0000000..2ea6c78
--- /dev/null
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVContentProvider.java
@@ -0,0 +1,67 @@
+package de.sebse.fuplanner.services.kvv.sync;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.net.Uri;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public class KVVContentProvider extends ContentProvider {
+
+ private static final String PROVIDER_NAME = "de.sebse.fuplanner.contentprovider.kvv.modules";
+ private static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/modules");
+ private static final int MODULE = 1;
+ private static final int MODULE_ID = 2;
+ private static final UriMatcher uriMatcher = getUriMatcher();
+
+ private static UriMatcher getUriMatcher() {
+ UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ uriMatcher.addURI(PROVIDER_NAME, "modules", MODULE);
+ uriMatcher.addURI(PROVIDER_NAME, "modules/#", MODULE_ID);
+ return uriMatcher;
+ }
+
+
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Nullable
+ @Override
+ public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public String getType(@NonNull Uri uri) {
+ switch (uriMatcher.match(uri)) {
+ case MODULE:
+ return "vnd.android.cursor.dir/vnd.com."+PROVIDER_NAME;
+ case MODULE_ID:
+ return "vnd.android.cursor.item/vnd.com."+PROVIDER_NAME;
+
+ }
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
+ return null;
+ }
+
+ @Override
+ public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
+ return 0;
+ }
+
+ @Override
+ public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
+ return 0;
+ }
+}
diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncAdapter.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncAdapter.java
new file mode 100644
index 0000000..e9e3d51
--- /dev/null
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncAdapter.java
@@ -0,0 +1,107 @@
+package de.sebse.fuplanner.services.kvv.sync;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.AbstractThreadedSyncAdapter;
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SyncResult;
+import android.os.Bundle;
+
+import com.android.volley.NetworkResponse;
+
+import java.util.Iterator;
+import java.util.concurrent.CountDownLatch;
+
+import de.sebse.fuplanner.services.kvv.KVV;
+import de.sebse.fuplanner.services.kvv.KVVListener;
+import de.sebse.fuplanner.services.kvv.types.LoginToken;
+import de.sebse.fuplanner.services.kvv.types.Modules;
+import de.sebse.fuplanner.tools.CustomAccountManager;
+import de.sebse.fuplanner.tools.logging.Logger;
+
+public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
+ private KVV mKVV;
+ private Logger log = new Logger(this);
+
+ /**
+ * Set up the sync adapter
+ */
+ public KVVSyncAdapter(Context context, boolean autoInitialize) {
+ super(context, autoInitialize);
+ init(context);
+ }
+ /**
+ * Set up the sync adapter. This form of the
+ * constructor maintains compatibility with Android 3.0
+ * and later platform versions
+ */
+ public KVVSyncAdapter(
+ Context context,
+ boolean autoInitialize,
+ boolean allowParallelSyncs) {
+ super(context, autoInitialize, allowParallelSyncs);
+ init(context);
+ }
+
+ private void init(Context context) {
+ CountDownLatch latch = new CountDownLatch(1);
+ mKVV = new KVV(new KVVListener() {
+ @Override
+ public void onLogin(LoginToken token, boolean enteringOnlineMode) {
+
+ }
+
+ @Override
+ public void onLogout() {
+
+ }
+
+ @Override
+ public void onModuleListChange() {
+
+ }
+
+ @Override
+ public void onKVVNetworkResponse(NetworkResponse error) {
+
+ }
+
+ @Override
+ public CustomAccountManager getAccountManager() {
+ return new CustomAccountManager(AccountManager.get(context), () -> null);
+ }
+ }, context);
+ mKVV.account().restoreOnlineLogin(bool -> {});
+ }
+
+ /*
+ * Specify the code you want to run in the sync adapter. The entire
+ * sync adapter runs in a background thread, so you don't have to set
+ * up your own background processing.
+ */
+ @Override
+ public void onPerformSync(
+ Account account,
+ Bundle extras,
+ String authority,
+ ContentProviderClient provider,
+ SyncResult syncResult) {
+ log.d("start syncing");
+ /*
+ * Put the data transfer code here.
+ */
+ mKVV.modules().list().recv(success -> {
+ Iterator iterator = success.latestSemesterIterator();
+ while (iterator.hasNext()) {
+ Modules.Module module = iterator.next();
+ log.d("sync module", module.title);
+ mKVV.modules().details().recv(module, success1 -> {
+ if (success1.second)
+ log.d("Sync Successful for Module '"+module.title+"'!");
+ }, log::e, true);
+ }
+ }, log::e, true);
+ }
+}
diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncService.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncService.java
new file mode 100644
index 0000000..8000812
--- /dev/null
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncService.java
@@ -0,0 +1,24 @@
+package de.sebse.fuplanner.services.kvv.sync;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class KVVSyncService extends Service {
+
+ private static final Object sSyncAdapterLock = new Object();
+ private static KVVSyncAdapter sSyncAdapter = null;
+
+ @Override
+ public void onCreate() {
+ synchronized (sSyncAdapterLock) {
+ if (sSyncAdapter == null)
+ sSyncAdapter = new KVVSyncAdapter(getApplicationContext(), true);
+ }
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return sSyncAdapter.getSyncAdapterBinder();
+ }
+}
diff --git a/app/src/main/java/de/sebse/fuplanner/services/newkvv/network/Login.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/Login.java
similarity index 99%
rename from app/src/main/java/de/sebse/fuplanner/services/newkvv/network/Login.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/sync/Login.java
index 5c67b22..52bd73f 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/newkvv/network/Login.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/Login.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.newkvv.network;
+package de.sebse.fuplanner.services.kvv.sync;
import android.content.Context;
@@ -10,7 +10,7 @@ import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import de.sebse.fuplanner.services.KVV.types.LoginToken;
+import de.sebse.fuplanner.services.kvv.types.LoginToken;
import de.sebse.fuplanner.tools.network.HTTPService;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
@@ -46,6 +46,15 @@ public class Login extends HTTPService {
+
+
+
+
+
+
+
+
+
public void doLogin(String username, String password, NetworkCallback callback, NetworkErrorCallback error) {
startKVVSession(success -> {
String kvvJSESSIONID = success.get("JSESSIONID");
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Announcement.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Announcement.java
similarity index 97%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/Announcement.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/Announcement.java
index 9ad8656..c4b96be 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Announcement.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Announcement.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import com.google.android.gms.common.internal.Objects;
@@ -16,7 +16,6 @@ public class Announcement implements Serializable {
private final ArrayList urls;
public Announcement(String id, String title, String body, String createdBy, long createdOn, ArrayList urls) {
-
this.id = id;
this.title = title;
this.body = body;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Assignment.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Assignment.java
similarity index 97%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/Assignment.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/Assignment.java
index 2e72d00..b5e3ac3 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Assignment.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Assignment.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import com.google.android.gms.common.internal.Objects;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/AssignmentList.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/AssignmentList.java
similarity index 86%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/AssignmentList.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/AssignmentList.java
index 0516b60..4600f8f 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/AssignmentList.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/AssignmentList.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import de.sebse.fuplanner.tools.DateSortedList;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Event.java
similarity index 98%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/Event.java
index 22177d3..8a6005c 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Event.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import com.google.android.gms.common.internal.Objects;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/EventList.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/EventList.java
similarity index 85%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/EventList.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/EventList.java
index 5957c0e..a0ce825 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/EventList.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/EventList.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import de.sebse.fuplanner.tools.DateSortedList;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Grade.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Grade.java
similarity index 95%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/Grade.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/Grade.java
index 1310429..fefba7f 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Grade.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Grade.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import com.google.android.gms.common.internal.Objects;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/GroupedEvents.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/GroupedEvents.java
similarity index 98%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/GroupedEvents.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/GroupedEvents.java
index 08835e3..7e4409b 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/GroupedEvents.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/GroupedEvents.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import android.annotation.SuppressLint;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Lecturer.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Lecturer.java
similarity index 96%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/Lecturer.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/Lecturer.java
index 5bacd94..48842c5 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Lecturer.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Lecturer.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import java.io.Serializable;
import java.util.regex.Matcher;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/LoginToken.java
similarity index 97%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/LoginToken.java
index 544729f..1c4a1da 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/LoginToken.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import android.content.Context;
@@ -11,7 +11,7 @@ import java.util.HashMap;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import de.sebse.fuplanner.services.newkvv.AccountGeneral;
+import de.sebse.fuplanner.services.fulogin.AccountGeneral;
import de.sebse.fuplanner.tools.CustomAccountManager;
import de.sebse.fuplanner.tools.logging.Logger;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Modules.java
similarity index 99%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/Modules.java
index 9e5b6d7..8ca426b 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Modules.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import android.content.Context;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Resource.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Resource.java
similarity index 98%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/Resource.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/Resource.java
index 5cb7e4d..829e53f 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Resource.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Resource.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import com.google.android.gms.common.internal.Objects;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Semester.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Semester.java
similarity index 97%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/Semester.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/Semester.java
index 76605aa..80823cb 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Semester.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/Semester.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import java.io.Serializable;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/SortedListModule.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/SortedListModule.java
similarity index 97%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/types/SortedListModule.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/types/SortedListModule.java
index 5c226f4..b85f862 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/SortedListModule.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/SortedListModule.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.types;
+package de.sebse.fuplanner.services.kvv.types;
import androidx.annotation.Nullable;
import de.sebse.fuplanner.tools.SortedList;
diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/ui/Download.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ui/Download.java
similarity index 99%
rename from app/src/main/java/de/sebse/fuplanner/services/KVV/ui/Download.java
rename to app/src/main/java/de/sebse/fuplanner/services/kvv/ui/Download.java
index 637d143..47b8898 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/KVV/ui/Download.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ui/Download.java
@@ -1,4 +1,4 @@
-package de.sebse.fuplanner.services.KVV.ui;
+package de.sebse.fuplanner.services.kvv.ui;
import android.Manifest;
import android.app.AlertDialog;
@@ -18,7 +18,7 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.FileProvider;
import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Resource;
+import de.sebse.fuplanner.services.kvv.types.Resource;
import de.sebse.fuplanner.tools.Regex;
import de.sebse.fuplanner.tools.RequestPermissionsResultListener;
import de.sebse.fuplanner.tools.UtilsDate;
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/CustomAccountManager.java b/app/src/main/java/de/sebse/fuplanner/tools/CustomAccountManager.java
index 25d13d9..782f637 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/CustomAccountManager.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/CustomAccountManager.java
@@ -2,16 +2,17 @@ package de.sebse.fuplanner.tools;
import android.accounts.Account;
import android.accounts.AccountManager;
+import android.accounts.AccountManagerCallback;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
+import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import java.io.IOException;
import androidx.annotation.Nullable;
-import de.sebse.fuplanner.MainActivity;
-import de.sebse.fuplanner.services.KVV.Login;
+import de.sebse.fuplanner.services.kvv.Login;
import de.sebse.fuplanner.tools.logging.Logger;
public class CustomAccountManager {
@@ -77,8 +78,8 @@ public class CustomAccountManager {
}
public void getTokenByType(String accountType, String authTokenType, @Nullable StringInterface callback) {
- //Account account = mAccountManager.getAccountsByType(accountType)[0];
- mAccountManager.getAuthTokenByFeatures(accountType, authTokenType, null, mActivityInterface.get(), null, null, accountManagerFuture -> {
+ Activity activity = mActivityInterface.get();
+ AccountManagerCallback cb = (accountManagerFuture -> {
try {
Bundle bnd = accountManagerFuture.getResult();
final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
@@ -94,22 +95,25 @@ public class CustomAccountManager {
}
if (callback != null)
callback.run(null);
- }, null);
+ });
+ if (activity != null) {
+ mAccountManager.getAuthTokenByFeatures(accountType, authTokenType, null, mActivityInterface.get(), null, null, cb, null);
+ } else {
+ Account account = mAccountManager.getAccountsByType(accountType)[0];
+ mAccountManager.getAuthToken(account, authTokenType, null, true, cb, null);
+ }
}
public String getTokenByTypeSync(String accountType, String authTokenType) {
Account account = mAccountManager.getAccountsByType(accountType)[0];
- MainActivity activity = this.mActivityInterface.get();
- if (activity != null) {
- try {
- return mAccountManager.blockingGetAuthToken(account, authTokenType, true);
- } catch (AuthenticatorException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (OperationCanceledException e) {
- e.printStackTrace();
- }
+ try {
+ return mAccountManager.blockingGetAuthToken(account, authTokenType, true);
+ } catch (AuthenticatorException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (OperationCanceledException e) {
+ e.printStackTrace();
}
return null;
}
@@ -121,7 +125,7 @@ public class CustomAccountManager {
@FunctionalInterface
public interface ActivityInterface {
@Nullable
- MainActivity get();
+ Activity get();
}
public interface StringInterface {
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java b/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java
index c37daa2..f4d0e38 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java
@@ -4,7 +4,7 @@ import androidx.annotation.StringRes;
import de.sebse.fuplanner.services.Canteen.CanteenBrowser;
import de.sebse.fuplanner.services.GoogleAuth.GoogleAuth;
-import de.sebse.fuplanner.services.KVV.KVV;
+import de.sebse.fuplanner.services.kvv.KVV;
import de.sebse.fuplanner.services.News.NewsManager;
public interface MainActivityListener {
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/DirectoryNodeBinder.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/DirectoryNodeBinder.java
index b086207..2b14360 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/DirectoryNodeBinder.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/DirectoryNodeBinder.java
@@ -5,7 +5,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Resource;
+import de.sebse.fuplanner.services.kvv.types.Resource;
/**
* Created by tlh on 2016/10/1 :)
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/FileNodeBinder.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/FileNodeBinder.java
index dbb592b..53653fb 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/FileNodeBinder.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/treeview/FileNodeBinder.java
@@ -4,7 +4,7 @@ import android.view.View;
import android.widget.TextView;
import de.sebse.fuplanner.R;
-import de.sebse.fuplanner.services.KVV.types.Resource;
+import de.sebse.fuplanner.services.kvv.types.Resource;
/**
* Created by tlh on 2016/10/1 :)
diff --git a/app/src/main/res/layout/activity_fu_authenticator.xml b/app/src/main/res/layout/activity_fu_authenticator.xml
index 6cae445..9c170d4 100644
--- a/app/src/main/res/layout/activity_fu_authenticator.xml
+++ b/app/src/main/res/layout/activity_fu_authenticator.xml
@@ -9,7 +9,7 @@
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
- tools:context=".services.newkvv.FUAuthenticatorActivity">
+ tools:context=".services.fulogin.FUAuthenticatorActivity">
+ tools:context="de.sebse.fuplanner.services.fulogin.FUAuthenticatorActivity">
+ tools:context="de.sebse.fuplanner.services.fulogin.FUAuthenticatorActivity">
Update-News
Tipps/Tricks
Klicke ZURÜCK erneut zum Beenden!
+ Sign in
+
+ Benutzername
+ Passwort (optional)
+ Log in
+ Log in
+ Das Passwort ist zu kurz.
+ Das Passwort ist nicht korrekt.
+ Pflichtfeld
+ KVV-Synchronisation
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f750d1e..47efe37 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -92,15 +92,12 @@
Please click BACK again to exit!
Sign in
- Email
+ Username
Password (optional)
Sign in or register
Sign in
- This email address is invalid
This password is too short
This password is incorrect
This field is required
- "Contacts permissions are needed for providing email
- completions."
-
+ KVV Synchronization
diff --git a/app/src/main/res/xml/syncadapter_kvv.xml b/app/src/main/res/xml/syncadapter_kvv.xml
new file mode 100644
index 0000000..1dbe851
--- /dev/null
+++ b/app/src/main/res/xml/syncadapter_kvv.xml
@@ -0,0 +1,8 @@
+
+