KVV as a service to connect SyncAdapter with MainActivity
This commit is contained in:
@@ -80,6 +80,13 @@
|
|||||||
android:name="android.content.SyncAdapter"
|
android:name="android.content.SyncAdapter"
|
||||||
android:resource="@xml/syncadapter_kvv" />
|
android:resource="@xml/syncadapter_kvv" />
|
||||||
</service>
|
</service>
|
||||||
|
<service
|
||||||
|
android:name=".services.kvv.KVV"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.app.Service" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|||||||
@@ -2,9 +2,13 @@ package de.sebse.fuplanner;
|
|||||||
|
|
||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
import android.accounts.AccountManager;
|
import android.accounts.AccountManager;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.ServiceConnection;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.IBinder;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -16,6 +20,7 @@ import com.google.android.material.navigation.NavigationView;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@@ -80,12 +85,40 @@ public class MainActivity extends AppCompatActivity
|
|||||||
private static final int DOUBLE_CLICK_TO_EXIT_MILLIS = 2000;
|
private static final int DOUBLE_CLICK_TO_EXIT_MILLIS = 2000;
|
||||||
|
|
||||||
private FragmentManager mFragmentManager;
|
private FragmentManager mFragmentManager;
|
||||||
private KVV mKVV;
|
|
||||||
private NewsManager mNewsManager;
|
private NewsManager mNewsManager;
|
||||||
private CanteenBrowser mCanteenBrowser;
|
private CanteenBrowser mCanteenBrowser;
|
||||||
private final Logger log = new Logger(this);
|
private final Logger log = new Logger(this);
|
||||||
private NavigationView mNavigationView;
|
private NavigationView mNavigationView;
|
||||||
|
|
||||||
|
// KVV service
|
||||||
|
private ArrayList<KVVCallback> mCallbacks = new ArrayList<>();
|
||||||
|
private KVV mKVV;
|
||||||
|
boolean mBound = false;
|
||||||
|
/** Defines callbacks for service binding, passed to bindService() */
|
||||||
|
private ServiceConnection mConnection = new ServiceConnection() {
|
||||||
|
@Override
|
||||||
|
public void onServiceConnected(ComponentName className,
|
||||||
|
IBinder service) {
|
||||||
|
// We've bound to LocalService, cast the IBinder and get LocalService instance
|
||||||
|
KVV.LocalBinder binder = (KVV.LocalBinder) service;
|
||||||
|
mKVV = binder.getService();
|
||||||
|
mKVV.addListener("mainactivity", MainActivity.this);
|
||||||
|
for (KVVCallback callback : mCallbacks) {
|
||||||
|
callback.get(mKVV);
|
||||||
|
}
|
||||||
|
mBound = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceDisconnected(ComponentName arg0) {
|
||||||
|
mKVV.removeListener("mainactivity");
|
||||||
|
mBound = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private int mFragmentPage = FRAGMENT_NONE;
|
private int mFragmentPage = FRAGMENT_NONE;
|
||||||
@NotNull
|
@NotNull
|
||||||
private String mFragmentData = "";
|
private String mFragmentData = "";
|
||||||
@@ -146,13 +179,15 @@ public class MainActivity extends AppCompatActivity
|
|||||||
changeFragment(FRAGMENT_STARTUP);
|
changeFragment(FRAGMENT_STARTUP);
|
||||||
int targetPage = desiredPage;
|
int targetPage = desiredPage;
|
||||||
String targetData = desiredData;
|
String targetData = desiredData;
|
||||||
getKVV().account().restoreOnlineLogin(restoreResult -> {
|
getKVV(kvv -> {
|
||||||
|
kvv.account().restoreOnlineLogin(restoreResult -> {
|
||||||
updateNavigation();
|
updateNavigation();
|
||||||
if (restoreResult != Login.RESTORE_STATUS_INVALID_PASSWORD)
|
if (restoreResult != Login.RESTORE_STATUS_INVALID_PASSWORD)
|
||||||
changeFragment(targetPage, targetData);
|
changeFragment(targetPage, targetData);
|
||||||
else
|
else
|
||||||
changeFragment(getDefaultFragmentAfterLogout());
|
changeFragment(getDefaultFragmentAfterLogout());
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Preferences.getBoolean(this, R.string.pref_set_auto_sync_on_startup)) {
|
if (!Preferences.getBoolean(this, R.string.pref_set_auto_sync_on_startup)) {
|
||||||
@@ -168,6 +203,21 @@ public class MainActivity extends AppCompatActivity
|
|||||||
}, log::e);*/
|
}, log::e);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
Intent intent = new Intent(this, KVV.class);
|
||||||
|
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStop() {
|
||||||
|
super.onStop();
|
||||||
|
mKVV.removeListener("mainactivity");
|
||||||
|
unbindService(mConnection);
|
||||||
|
mBound = false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onNewIntent(Intent intent) {
|
protected void onNewIntent(Intent intent) {
|
||||||
super.onNewIntent(intent);
|
super.onNewIntent(intent);
|
||||||
@@ -184,24 +234,26 @@ public class MainActivity extends AppCompatActivity
|
|||||||
protected void onPause() {
|
protected void onPause() {
|
||||||
super.onPause();
|
super.onPause();
|
||||||
isPaused = true;
|
isPaused = true;
|
||||||
isLoggedInBeforePause = getKVV().account().isLoggedIn();
|
getKVV(kvv -> isLoggedInBeforePause = kvv.account().isLoggedIn());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
if (isPaused) {
|
if (isPaused) {
|
||||||
getKVV().account().restoreOnlineLogin(restoreResult -> {
|
getKVV(kvv -> {
|
||||||
|
kvv.account().restoreOnlineLogin(restoreResult -> {
|
||||||
updateNavigation();
|
updateNavigation();
|
||||||
if (restoreResult == Login.RESTORE_STATUS_SUCCESS && !isLoggedInBeforePause) {
|
if (restoreResult == Login.RESTORE_STATUS_SUCCESS && !isLoggedInBeforePause) {
|
||||||
changeFragment(getDefaultFragmentAfterLogin());
|
changeFragment(getDefaultFragmentAfterLogin());
|
||||||
registerSync(true);
|
registerSync(true);
|
||||||
} else if (restoreResult == Login.RESTORE_STATUS_INVALID_PASSWORD && isLoggedInBeforePause) {
|
} else if (restoreResult == Login.RESTORE_STATUS_INVALID_PASSWORD && isLoggedInBeforePause) {
|
||||||
getKVV().account().logout(false);
|
kvv.account().logout(false);
|
||||||
changeFragment(getDefaultFragmentAfterLogout());
|
changeFragment(getDefaultFragmentAfterLogout());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
getKVV().modules().list().reloadIfOutdated();
|
kvv.modules().list().reloadIfOutdated();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
isPaused = false;
|
isPaused = false;
|
||||||
}
|
}
|
||||||
@@ -217,6 +269,7 @@ public class MainActivity extends AppCompatActivity
|
|||||||
if (drawer.isDrawerOpen(GravityCompat.START) && !isDrawerFixed) {
|
if (drawer.isDrawerOpen(GravityCompat.START) && !isDrawerFixed) {
|
||||||
drawer.closeDrawer(GravityCompat.START);
|
drawer.closeDrawer(GravityCompat.START);
|
||||||
} else {
|
} else {
|
||||||
|
getKVV(kvv -> {
|
||||||
if (mFragmentPage == FRAGMENT_MODULES_DETAILS) {
|
if (mFragmentPage == FRAGMENT_MODULES_DETAILS) {
|
||||||
ModDetailFragment fragment = (ModDetailFragment) mFragmentManager.findFragmentByTag(String.valueOf(FRAGMENT_MODULES_DETAILS));
|
ModDetailFragment fragment = (ModDetailFragment) mFragmentManager.findFragmentByTag(String.valueOf(FRAGMENT_MODULES_DETAILS));
|
||||||
if (fragment != null && fragment.isVisible() && Regex.has("\\.[1-9][0-9]*", fragment.getData())) {
|
if (fragment != null && fragment.isVisible() && Regex.has("\\.[1-9][0-9]*", fragment.getData())) {
|
||||||
@@ -231,13 +284,14 @@ public class MainActivity extends AppCompatActivity
|
|||||||
} else {
|
} else {
|
||||||
changeFragment(FRAGMENT_CANTEENS);
|
changeFragment(FRAGMENT_CANTEENS);
|
||||||
}
|
}
|
||||||
} else if (getKVV().account().isLoggedIn() && mFragmentPage != getDefaultFragmentAfterLogin()) {
|
} else if (kvv.account().isLoggedIn() && mFragmentPage != getDefaultFragmentAfterLogin()) {
|
||||||
changeFragment(getDefaultFragmentAfterLogin());
|
changeFragment(getDefaultFragmentAfterLogin());
|
||||||
} else {
|
} else {
|
||||||
mDoubleBackToExitPressedOnce = System.currentTimeMillis();
|
mDoubleBackToExitPressedOnce = System.currentTimeMillis();
|
||||||
showToast(R.string.back_to_exit);
|
showToast(R.string.back_to_exit);
|
||||||
//getTokenForAccountCreateIfNeeded(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_KVV);
|
//getTokenForAccountCreateIfNeeded(AccountGeneral.ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_KVV);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,8 +358,10 @@ public class MainActivity extends AppCompatActivity
|
|||||||
startActivity(sendIntent);
|
startActivity(sendIntent);
|
||||||
break;
|
break;
|
||||||
case R.id.nav_logout:
|
case R.id.nav_logout:
|
||||||
getKVV().account().logout(true);
|
getKVV(kvv -> {
|
||||||
getKVV().modules().list().delete();
|
kvv.account().logout(true);
|
||||||
|
kvv.modules().list().delete();
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -357,11 +413,12 @@ public class MainActivity extends AppCompatActivity
|
|||||||
return this.mNewsManager;
|
return this.mNewsManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public KVV getKVV() {
|
public void getKVV(KVVCallback callback) {
|
||||||
if (this.mKVV == null) {
|
if (this.mKVV == null) {
|
||||||
this.mKVV = new KVV(this, this);
|
mCallbacks.add(callback);
|
||||||
|
} else {
|
||||||
|
callback.get(this.mKVV);
|
||||||
}
|
}
|
||||||
return this.mKVV;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CanteenBrowser getCanteenBrowser() {
|
public CanteenBrowser getCanteenBrowser() {
|
||||||
@@ -484,7 +541,9 @@ public class MainActivity extends AppCompatActivity
|
|||||||
moduleId = moduleId.substring(0, dotPos);
|
moduleId = moduleId.substring(0, dotPos);
|
||||||
switch (mFragmentPage) {
|
switch (mFragmentPage) {
|
||||||
case FRAGMENT_MODULES_DETAILS:
|
case FRAGMENT_MODULES_DETAILS:
|
||||||
getKVV().modules().list().find(moduleId, success -> {
|
String finalModuleId = moduleId;
|
||||||
|
getKVV(kvv -> {
|
||||||
|
kvv.modules().list().find(finalModuleId, success -> {
|
||||||
int size = mNavigationView.getMenu().size();
|
int size = mNavigationView.getMenu().size();
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
String title = success == null ? null : success.title;
|
String title = success == null ? null : success.title;
|
||||||
@@ -496,6 +555,7 @@ public class MainActivity extends AppCompatActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, log::e);
|
}, log::e);
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
case FRAGMENT_MODULES:
|
case FRAGMENT_MODULES:
|
||||||
item = mNavigationView.getMenu().findItem(R.id.nav_modules);
|
item = mNavigationView.getMenu().findItem(R.id.nav_modules);
|
||||||
@@ -561,7 +621,8 @@ public class MainActivity extends AppCompatActivity
|
|||||||
int MAX_COUNT = isLoggedIn ? 3 : 2;
|
int MAX_COUNT = isLoggedIn ? 3 : 2;
|
||||||
final int[] count = {0};
|
final int[] count = {0};
|
||||||
if (isLoggedIn) {
|
if (isLoggedIn) {
|
||||||
getKVV().modules().list().recv(success -> {
|
getKVV(kvv -> {
|
||||||
|
kvv.modules().list().recv(success -> {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (Iterator<Modules.Module> it = success.latestSemesterIterator(); it.hasNext(); ) {
|
for (Iterator<Modules.Module> it = success.latestSemesterIterator(); it.hasNext(); ) {
|
||||||
Modules.Module module = it.next();
|
Modules.Module module = it.next();
|
||||||
@@ -577,6 +638,7 @@ public class MainActivity extends AppCompatActivity
|
|||||||
if (++count[0] == MAX_COUNT) done.run();
|
if (++count[0] == MAX_COUNT) done.run();
|
||||||
log.e(error);
|
log.e(error);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
getCanteenBrowser().getCanteens(success -> {
|
getCanteenBrowser().getCanteens(success -> {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -616,7 +678,8 @@ public class MainActivity extends AppCompatActivity
|
|||||||
|
|
||||||
private void updateNavigation() {
|
private void updateNavigation() {
|
||||||
mQueue.add(() -> {
|
mQueue.add(() -> {
|
||||||
boolean isLoggedIn = getKVV().account().isLoggedIn();
|
getKVV(kvv -> {
|
||||||
|
boolean isLoggedIn = kvv.account().isLoggedIn();
|
||||||
setNavigationHeader(isLoggedIn);
|
setNavigationHeader(isLoggedIn);
|
||||||
mNavigationView.getMenu().clear();
|
mNavigationView.getMenu().clear();
|
||||||
if (isLoggedIn)
|
if (isLoggedIn)
|
||||||
@@ -628,6 +691,7 @@ public class MainActivity extends AppCompatActivity
|
|||||||
mQueue.next();
|
mQueue.next();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -722,4 +786,8 @@ public class MainActivity extends AppCompatActivity
|
|||||||
public CustomAccountManager getAccountManager() {
|
public CustomAccountManager getAccountManager() {
|
||||||
return mAccountManager;
|
return mAccountManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface KVVCallback {
|
||||||
|
void get(KVV kvv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,15 +66,15 @@ public class ModulesFragment extends Fragment {
|
|||||||
|
|
||||||
private void refresh(boolean forceRefresh) {
|
private void refresh(boolean forceRefresh) {
|
||||||
if (mMainActivityListener != null) {
|
if (mMainActivityListener != null) {
|
||||||
mMainActivityListener.getKVV().modules().list().recv(success -> {
|
mMainActivityListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().list().recv(success -> {
|
||||||
adapter.setModules(success);
|
adapter.setModules(success);
|
||||||
//if (mMainActivityListener != null)
|
|
||||||
// mMainActivityListener.refreshNavigation();
|
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
}, error -> {
|
}, error -> {
|
||||||
log.e(error.toString());
|
log.e(error.toString());
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
}, forceRefresh);
|
}, forceRefresh);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,13 +64,14 @@ public class ScheduleFragment extends Fragment implements
|
|||||||
|
|
||||||
public void invalidate(boolean forceRefresh) {
|
public void invalidate(boolean forceRefresh) {
|
||||||
if (mListener == null) return;
|
if (mListener == null) return;
|
||||||
mListener.getKVV().modules().list().recv(modules -> {
|
mListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().list().recv(modules -> {
|
||||||
mModules = modules;
|
mModules = modules;
|
||||||
final int[] i = {0};
|
final int[] i = {0};
|
||||||
Iterator<Modules.Module> iter = mModules.latestSemesterIterator();
|
Iterator<Modules.Module> iter = mModules.latestSemesterIterator();
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
Modules.Module module = iter.next();
|
Modules.Module module = iter.next();
|
||||||
mListener.getKVV().modules().events().recv(module, success1 -> {
|
kvv.modules().events().recv(module, success1 -> {
|
||||||
i[0]++;
|
i[0]++;
|
||||||
if (i[0] >= mModules.size()) {
|
if (i[0] >= mModules.size()) {
|
||||||
if (mWeekView != null) {
|
if (mWeekView != null) {
|
||||||
@@ -81,6 +82,7 @@ public class ScheduleFragment extends Fragment implements
|
|||||||
}, log::e, forceRefresh);
|
}, log::e, forceRefresh);
|
||||||
}
|
}
|
||||||
}, log::e, forceRefresh);
|
}, log::e, forceRefresh);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -187,7 +189,8 @@ public class ScheduleFragment extends Fragment implements
|
|||||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext());
|
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext());
|
||||||
|
|
||||||
if (mListener == null) return;
|
if (mListener == null) return;
|
||||||
mListener.getKVV().modules().list().find(moduleId, module -> {
|
mListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().list().find(moduleId, module -> {
|
||||||
String moduleName = module.title;
|
String moduleName = module.title;
|
||||||
alertDialogBuilder
|
alertDialogBuilder
|
||||||
.setTitle(event.getName())
|
.setTitle(event.getName())
|
||||||
@@ -202,5 +205,6 @@ public class ScheduleFragment extends Fragment implements
|
|||||||
AlertDialog alertDialog = alertDialogBuilder.create();
|
AlertDialog alertDialog = alertDialogBuilder.create();
|
||||||
alertDialog.show();
|
alertDialog.show();
|
||||||
}, log::e);
|
}, log::e);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,9 +82,9 @@ public class ModDetailAnnounceFragment extends Fragment implements Download.OnDo
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void refresh(boolean forceRefresh) {
|
private void refresh(boolean forceRefresh) {
|
||||||
if (mListener == null)
|
if (mListener != null) {
|
||||||
return;
|
mListener.getKVV(kvv -> {
|
||||||
mListener.getKVV().modules().details().recv(mItemPos, pair -> {
|
kvv.modules().details().recv(mItemPos, pair -> {
|
||||||
adapter.setModule(pair.first);
|
adapter.setModule(pair.first);
|
||||||
if (pair.second)
|
if (pair.second)
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
@@ -92,17 +92,21 @@ public class ModDetailAnnounceFragment extends Fragment implements Download.OnDo
|
|||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, forceRefresh);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void request(String title, String url) {
|
public void request(String title, String url) {
|
||||||
if (mListener == null)
|
if (mListener == null)
|
||||||
return;
|
return;
|
||||||
mListener.getKVV().modules().list().find(mItemPos, (Modules.Module module) -> {
|
mListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().list().find(mItemPos, (Modules.Module module) -> {
|
||||||
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
|
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
|
||||||
folderName += "/Announcement";
|
folderName += "/Announcement";
|
||||||
getDownload().openDownloadDialog(title, url, folderName);
|
getDownload().openDownloadDialog(title, url, folderName);
|
||||||
}, log::e);
|
}, log::e);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -82,9 +82,9 @@ public class ModDetailAssignmentFragment extends Fragment implements Download.On
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void refresh(boolean forceRefresh) {
|
private void refresh(boolean forceRefresh) {
|
||||||
if (mListener == null)
|
if (mListener != null) {
|
||||||
return;
|
mListener.getKVV(kvv -> {
|
||||||
mListener.getKVV().modules().details().recv(mItemPos, pair -> {
|
kvv.modules().details().recv(mItemPos, pair -> {
|
||||||
adapter.setModule(pair.first);
|
adapter.setModule(pair.first);
|
||||||
if (pair.second)
|
if (pair.second)
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
@@ -92,17 +92,21 @@ public class ModDetailAssignmentFragment extends Fragment implements Download.On
|
|||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, forceRefresh);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void request(String title, String url) {
|
public void request(String title, String url) {
|
||||||
if (mListener == null)
|
if (mListener == null)
|
||||||
return;
|
return;
|
||||||
mListener.getKVV().modules().list().find(mItemPos, (Modules.Module module) -> {
|
mListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().list().find(mItemPos, (Modules.Module module) -> {
|
||||||
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
|
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
|
||||||
folderName += "/Assignment";
|
folderName += "/Announcement";
|
||||||
getDownload().openDownloadDialog(title, url, folderName);
|
getDownload().openDownloadDialog(title, url, folderName);
|
||||||
}, log::e);
|
}, log::e);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -81,9 +81,9 @@ public class ModDetailEventFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void refresh(boolean forceRefresh) {
|
private void refresh(boolean forceRefresh) {
|
||||||
if (mListener == null)
|
if (mListener != null) {
|
||||||
return;
|
mListener.getKVV(kvv -> {
|
||||||
mListener.getKVV().modules().details().recv(mItemPos, pair -> {
|
kvv.modules().details().recv(mItemPos, pair -> {
|
||||||
adapter.setModule(pair.first);
|
adapter.setModule(pair.first);
|
||||||
if (pair.second)
|
if (pair.second)
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
@@ -91,6 +91,8 @@ public class ModDetailEventFragment extends Fragment {
|
|||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, forceRefresh);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -72,11 +72,13 @@ public class ModDetailFragment extends Fragment implements ModDetailListener {
|
|||||||
}
|
}
|
||||||
if (mListener != null) {
|
if (mListener != null) {
|
||||||
mListener.onTitleTextChange(R.string.courses);
|
mListener.onTitleTextChange(R.string.courses);
|
||||||
mListener.getKVV().modules().list().recv(success -> {
|
mListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().list().recv(success -> {
|
||||||
Modules.Module module = success.get(mItemPos);
|
Modules.Module module = success.get(mItemPos);
|
||||||
if (mListener != null && module != null)
|
if (mListener != null && module != null)
|
||||||
mListener.onTitleTextChange(module.title);
|
mListener.onTitleTextChange(module.title);
|
||||||
}, log::e);
|
}, log::e);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -81,9 +81,9 @@ public class ModDetailGradebookFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void refresh(boolean forceRefresh) {
|
private void refresh(boolean forceRefresh) {
|
||||||
if (mListener == null)
|
if (mListener != null) {
|
||||||
return;
|
mListener.getKVV(kvv -> {
|
||||||
mListener.getKVV().modules().details().recv(mItemPos, pair -> {
|
kvv.modules().details().recv(mItemPos, pair -> {
|
||||||
adapter.setModule(pair.first);
|
adapter.setModule(pair.first);
|
||||||
if (pair.second)
|
if (pair.second)
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
@@ -91,6 +91,8 @@ public class ModDetailGradebookFragment extends Fragment {
|
|||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, forceRefresh);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -86,7 +86,8 @@ public class ModDetailOverviewFragment extends Fragment {
|
|||||||
|
|
||||||
private void refresh(boolean forceRefresh) {
|
private void refresh(boolean forceRefresh) {
|
||||||
if (mListener != null) {
|
if (mListener != null) {
|
||||||
mListener.getKVV().modules().details().recv(mItemPos, pair -> {
|
mListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().details().recv(mItemPos, pair -> {
|
||||||
adapter.setModule(pair.first);
|
adapter.setModule(pair.first);
|
||||||
if (pair.second)
|
if (pair.second)
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
@@ -94,6 +95,7 @@ public class ModDetailOverviewFragment extends Fragment {
|
|||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, forceRefresh);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,11 +90,13 @@ public class ModDetailResourceFragment extends Fragment implements Download.OnDo
|
|||||||
// Update and toggle the node.
|
// Update and toggle the node.
|
||||||
onToggle(!node.isExpand(), holder);
|
onToggle(!node.isExpand(), holder);
|
||||||
} else if (node.getContent() instanceof Resource.File && ModDetailResourceFragment.this.mListener != null) { // if leaf is file
|
} else if (node.getContent() instanceof Resource.File && ModDetailResourceFragment.this.mListener != null) { // if leaf is file
|
||||||
ModDetailResourceFragment.this.mListener.getKVV().modules().resources().recv(mItemPos, (Modules.Module module) -> {
|
ModDetailResourceFragment.this.mListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().resources().recv(mItemPos, (Modules.Module module) -> {
|
||||||
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
|
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
|
||||||
Resource.File file = (Resource.File) node.getContent();
|
Resource.File file = (Resource.File) node.getContent();
|
||||||
getDownload().openDownloadDialog(file, folderName);
|
getDownload().openDownloadDialog(file, folderName);
|
||||||
}, log::e);
|
}, log::e);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -123,11 +125,13 @@ public class ModDetailResourceFragment extends Fragment implements Download.OnDo
|
|||||||
public void request(String title, String url) {
|
public void request(String title, String url) {
|
||||||
if (mListener == null)
|
if (mListener == null)
|
||||||
return;
|
return;
|
||||||
mListener.getKVV().modules().list().find(mItemPos, (Modules.Module module) -> {
|
mListener.getKVV(kvv -> {
|
||||||
|
kvv.modules().list().find(mItemPos, (Modules.Module module) -> {
|
||||||
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
|
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
|
||||||
folderName += "/Announcement";
|
folderName += "/Announcement";
|
||||||
getDownload().openDownloadDialog(title, url, folderName);
|
getDownload().openDownloadDialog(title, url, folderName);
|
||||||
}, log::e);
|
}, log::e);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -150,9 +154,9 @@ public class ModDetailResourceFragment extends Fragment implements Download.OnDo
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void refresh(boolean forceRefresh) {
|
private void refresh(boolean forceRefresh) {
|
||||||
if (mListener == null)
|
if (mListener != null) {
|
||||||
return;
|
mListener.getKVV(kvv -> {
|
||||||
mListener.getKVV().modules().details().recv(mItemPos, pair -> {
|
kvv.modules().details().recv(mItemPos, pair -> {
|
||||||
adapter.setModule(pair.first);
|
adapter.setModule(pair.first);
|
||||||
if (pair.second)
|
if (pair.second)
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
@@ -160,6 +164,8 @@ public class ModDetailResourceFragment extends Fragment implements Download.OnDo
|
|||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, forceRefresh);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Download getDownload() {
|
private Download getDownload() {
|
||||||
|
|||||||
@@ -1,31 +1,98 @@
|
|||||||
package de.sebse.fuplanner.services.kvv;
|
package de.sebse.fuplanner.services.kvv;
|
||||||
|
|
||||||
|
import android.accounts.AccountManager;
|
||||||
|
import android.app.Service;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Binder;
|
||||||
|
import android.os.IBinder;
|
||||||
|
|
||||||
|
import com.android.volley.NetworkResponse;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class KVV {
|
import de.sebse.fuplanner.services.kvv.types.LoginTokenKVV;
|
||||||
private final HashMap<String, Object> addons = new HashMap<>();
|
import de.sebse.fuplanner.tools.CustomAccountManager;
|
||||||
private final KVVListener mListener;
|
|
||||||
private final Context mContext;
|
|
||||||
|
|
||||||
public KVV(KVVListener listener, Context context) {
|
public class KVV extends Service {
|
||||||
this.mListener = listener;
|
private final HashMap<String, Object> addons = new HashMap<>();
|
||||||
this.mContext = context;
|
private final HashMap<String, KVVListener> mListeners = new HashMap<>();
|
||||||
|
private final KVVListener mListener = new KVVListener() {
|
||||||
|
CustomAccountManager accountManager = null;
|
||||||
|
@Override
|
||||||
|
public CustomAccountManager getAccountManager() {
|
||||||
|
if (accountManager == null)
|
||||||
|
accountManager = new CustomAccountManager(AccountManager.get(KVV.this.getApplicationContext()), () -> null);
|
||||||
|
return accountManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onKVVNetworkResponse(NetworkResponse error) {
|
||||||
|
for (KVVListener listener : mListeners.values())
|
||||||
|
listener.onKVVNetworkResponse(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLogin(LoginTokenKVV token, boolean isOnlyRefresh) {
|
||||||
|
for (KVVListener listener : mListeners.values())
|
||||||
|
listener.onLogin(token, isOnlyRefresh);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLogout() {
|
||||||
|
for (KVVListener listener : mListeners.values())
|
||||||
|
listener.onLogout();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onModuleListChange() {
|
||||||
|
for (KVVListener listener : mListeners.values())
|
||||||
|
listener.onModuleListChange();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// Binder given to clients
|
||||||
|
private final IBinder mBinder = new LocalBinder();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Login account() {
|
public Login account() {
|
||||||
return (Login) addAndGet("account", () -> new Login(mListener, mContext));
|
return (Login) addAndGet("account", () -> new Login(mListener, getApplicationContext()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Modules modules() {
|
public Modules modules() {
|
||||||
return (Modules) addAndGet("module", () -> new Modules(account(), mListener, mContext));
|
return (Modules) addAndGet("module", () -> new Modules(account(), mListener, getApplicationContext()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addListener(String key, KVVListener listener) {
|
||||||
|
mListeners.put(key, listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeListener(String key) {
|
||||||
|
mListeners.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return mBinder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class used for the client Binder. Because we know this service always
|
||||||
|
* runs in the same process as its clients, we don't need to deal with IPC.
|
||||||
|
*/
|
||||||
|
public class LocalBinder extends Binder {
|
||||||
|
public KVV getService() {
|
||||||
|
// Return this instance of LocalService so clients can call public methods
|
||||||
|
return KVV.this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,14 @@ package de.sebse.fuplanner.services.kvv.sync;
|
|||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
import android.accounts.AccountManager;
|
import android.accounts.AccountManager;
|
||||||
import android.content.AbstractThreadedSyncAdapter;
|
import android.content.AbstractThreadedSyncAdapter;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.ContentProviderClient;
|
import android.content.ContentProviderClient;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.ServiceConnection;
|
||||||
import android.content.SyncResult;
|
import android.content.SyncResult;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.IBinder;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@@ -36,6 +40,26 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
|
|||||||
private Logger log = new Logger(this);
|
private Logger log = new Logger(this);
|
||||||
private NewAsyncQueue mQueue = new NewAsyncQueue();
|
private NewAsyncQueue mQueue = new NewAsyncQueue();
|
||||||
|
|
||||||
|
|
||||||
|
boolean mBound = false;
|
||||||
|
boolean mWaitForBound = false;
|
||||||
|
private ServiceConnection mConnection = new ServiceConnection() {
|
||||||
|
@Override
|
||||||
|
public void onServiceConnected(ComponentName className, IBinder service) {
|
||||||
|
// We've bound to LocalService, cast the IBinder and get LocalService instance
|
||||||
|
KVV.LocalBinder binder = (KVV.LocalBinder) service;
|
||||||
|
mKVV = binder.getService();
|
||||||
|
if (mWaitForBound) mQueue.next();
|
||||||
|
mBound = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceDisconnected(ComponentName arg0) {
|
||||||
|
mBound = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up the sync adapter
|
* Set up the sync adapter
|
||||||
*/
|
*/
|
||||||
@@ -57,15 +81,13 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void init(Context context) {
|
private void init(Context context) {
|
||||||
mKVV = new KVV(new KVVListener() {
|
// Bind to LocalService
|
||||||
CustomAccountManager accountManager = null;
|
Intent intent = new Intent(getContext(), KVV.class);
|
||||||
@Override
|
getContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
||||||
public CustomAccountManager getAccountManager() {
|
if (!mBound) {
|
||||||
if (accountManager == null)
|
mWaitForBound = true;
|
||||||
accountManager = new CustomAccountManager(AccountManager.get(context), () -> null);
|
mQueue.add(() -> {});
|
||||||
return accountManager;
|
|
||||||
}
|
}
|
||||||
}, context);
|
|
||||||
mQueue.add(() -> {
|
mQueue.add(() -> {
|
||||||
mKVV.account().restoreOnlineLogin(bool -> {
|
mKVV.account().restoreOnlineLogin(bool -> {
|
||||||
mQueue.next();
|
mQueue.next();
|
||||||
|
|||||||
@@ -104,7 +104,8 @@ public class Download {
|
|||||||
showDownloadError();
|
showDownloadError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
activity.getKVV().modules().resources().file(file.getTitle(), file.getUrl(), folderName, success -> {
|
activity.getKVV(kvv -> {
|
||||||
|
kvv.modules().resources().file(file.getTitle(), file.getUrl(), folderName, success -> {
|
||||||
Context context = contextInterface.get();
|
Context context = contextInterface.get();
|
||||||
if (success.equals("") || context== null) {
|
if (success.equals("") || context== null) {
|
||||||
showDownloadError();
|
showDownloadError();
|
||||||
@@ -118,6 +119,7 @@ public class Download {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, log::e, downloadNew);
|
}, log::e, downloadNew);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showDownloadError() {
|
private void showDownloadError() {
|
||||||
|
|||||||
@@ -2,8 +2,10 @@ package de.sebse.fuplanner.tools;
|
|||||||
|
|
||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
|
|
||||||
|
import de.sebse.fuplanner.MainActivity;
|
||||||
import de.sebse.fuplanner.services.canteen.CanteenBrowser;
|
import de.sebse.fuplanner.services.canteen.CanteenBrowser;
|
||||||
import de.sebse.fuplanner.services.kvv.KVV;
|
import de.sebse.fuplanner.services.kvv.KVV;
|
||||||
|
import de.sebse.fuplanner.services.kvv.KVVListener;
|
||||||
import de.sebse.fuplanner.services.news.NewsManager;
|
import de.sebse.fuplanner.services.news.NewsManager;
|
||||||
|
|
||||||
public interface MainActivityListener {
|
public interface MainActivityListener {
|
||||||
@@ -15,7 +17,7 @@ public interface MainActivityListener {
|
|||||||
|
|
||||||
void showToast(@StringRes int msgStringRes);
|
void showToast(@StringRes int msgStringRes);
|
||||||
|
|
||||||
KVV getKVV();
|
void getKVV(MainActivity.KVVCallback kvv);
|
||||||
|
|
||||||
CanteenBrowser getCanteenBrowser();
|
CanteenBrowser getCanteenBrowser();
|
||||||
|
|
||||||
|
|||||||
8
app/src/main/res/xml/service_kvv.xml
Normal file
8
app/src/main/res/xml/service_kvv.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:contentAuthority="de.sebse.fuplanner.contentprovider.kvv.modules"
|
||||||
|
android:accountType="de.sebse.fuplanner.fuauth"
|
||||||
|
android:userVisible="true"
|
||||||
|
android:allowParallelSyncs="false"
|
||||||
|
android:isAlwaysSyncable="true"
|
||||||
|
android:supportsUploading="false"/>
|
||||||
Reference in New Issue
Block a user