From ceccd77f184087253a6fcc22871d8b69d0f34e9c Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Mon, 7 Jan 2019 21:14:59 +0100 Subject: [PATCH] Periodic sync, reload from memory if outdated --- app/build.gradle | 3 +- .../java/de/sebse/fuplanner/MainActivity.java | 28 +++++++-- .../services/kvv/sync/KVVSyncAdapter.java | 48 ++++++++++----- .../tools/CustomNotificationManager.java | 57 ++++++++++++++++++ .../de/sebse/fuplanner/tools/Preferences.java | 11 ++++ .../res/drawable-hdpi/ic_notification.png | Bin 0 -> 427 bytes .../res/drawable-mdpi/ic_notification.png | Bin 0 -> 320 bytes .../res/drawable-xhdpi/ic_notification.png | Bin 0 -> 472 bytes .../res/drawable-xxhdpi/ic_notification.png | Bin 0 -> 879 bytes .../res/drawable-xxxhdpi/ic_notification.png | Bin 0 -> 1059 bytes app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/preferences.xml | 2 + app/src/main/res/values/strings.xml | 2 + 13 files changed, 130 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/CustomNotificationManager.java create mode 100644 app/src/main/res/drawable-hdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-mdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_notification.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_notification.png diff --git a/app/build.gradle b/app/build.gradle index d89a1e5..bee6578 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,6 +27,7 @@ android { dependencies { + //implementation "com.android.support:support-compat:28.0.0" implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation fileTree(include: ['*.jar'], dir: 'libs') androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0-beta02', { @@ -34,7 +35,7 @@ dependencies { }) implementation 'androidx.preference:preference:1.0.0' implementation 'com.google.android.material:material:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3' implementation 'com.android.volley:volley:1.1.0' //noinspection GradleDependency implementation 'com.google.android.gms:play-services-auth:15.0.0' diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index 17bbbc1..75ba7f6 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -1,5 +1,6 @@ package de.sebse.fuplanner; +import android.accounts.Account; import android.accounts.AccountManager; import android.content.ContentResolver; import android.content.Intent; @@ -48,6 +49,7 @@ 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.tools.CustomAccountManager; +import de.sebse.fuplanner.tools.CustomNotificationManager; import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.NewAsyncQueue; import de.sebse.fuplanner.tools.Preferences; @@ -138,12 +140,12 @@ public class MainActivity extends AppCompatActivity changeFragment(getDefaultFragmentAfterLogout()); }); } - ContentResolver.addPeriodicSync( - mAccountManager.getAccountByType(AccountGeneral.ACCOUNT_TYPE), - KVVContentProvider.PROVIDER_NAME, - Bundle.EMPTY, - AccountGeneral.SYNC_INTERVAL); + if (!Preferences.getBoolean(this, R.string.pref_set_auto_sync_on_startup)) { + registerSync(); + Preferences.setBoolean(this, R.string.pref_set_auto_sync_on_startup, true); + } + CustomNotificationManager.createNotificationChannel(this); } @Override @@ -169,6 +171,8 @@ public class MainActivity extends AppCompatActivity getKVV().modules().list().reloadIfOutdated(); } isPaused = false; + //log.d("onResume", "send notification!"); + //CustomNotificationManager.sendNotification(this, "Titel", "Neue Announcements!"); } @Override @@ -357,6 +361,20 @@ public class MainActivity extends AppCompatActivity ((TextView) header.findViewById(R.id.login_mail)).setText(email); changeFragment(newFragment); + registerSync(); + } + + private void registerSync() { + Account accountByType = mAccountManager.getAccountByType(AccountGeneral.ACCOUNT_TYPE); + log.d("registerSync", accountByType); + if (accountByType != null) { + ContentResolver.setSyncAutomatically(accountByType, KVVContentProvider.PROVIDER_NAME, true); + ContentResolver.addPeriodicSync( + accountByType, + KVVContentProvider.PROVIDER_NAME, + Bundle.EMPTY, + AccountGeneral.SYNC_INTERVAL); + } } private void changeFragment(int newFragment) { 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 index cf2d3bf..8ef879e 100644 --- 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 @@ -17,11 +17,13 @@ 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.NewAsyncQueue; import de.sebse.fuplanner.tools.logging.Logger; public class KVVSyncAdapter extends AbstractThreadedSyncAdapter { private KVV mKVV; private Logger log = new Logger(this); + private NewAsyncQueue mQueue = new NewAsyncQueue(); /** * Set up the sync adapter @@ -53,7 +55,12 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter { return accountManager; } }, context); - mKVV.account().restoreOnlineLogin(bool -> {}); + mQueue.add(() -> { + mKVV.account().restoreOnlineLogin(bool -> { + log.d("login restored"); + mQueue.next(); + }); + }); } /* @@ -68,20 +75,29 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter { 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); + log.d("onPerformSync"); + mQueue.add(() -> { + log.d("start syncing"); + 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+"'!"); + mQueue.next(); + } + }, msg -> { + log.e(msg); + mQueue.next(); + }, true); + } + }, msg -> { + log.e(msg); + mQueue.next(); + }, true); + log.d("finished"); + }); } } diff --git a/app/src/main/java/de/sebse/fuplanner/tools/CustomNotificationManager.java b/app/src/main/java/de/sebse/fuplanner/tools/CustomNotificationManager.java new file mode 100644 index 0000000..73e8f46 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/CustomNotificationManager.java @@ -0,0 +1,57 @@ +package de.sebse.fuplanner.tools; + +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +import org.jetbrains.annotations.NotNull; + +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; +import de.sebse.fuplanner.MainActivity; +import de.sebse.fuplanner.R; + +public class CustomNotificationManager { + private static final String CHANNEL_ID = "fuplanner-default"; + //public static ArrayList passedNotifications = new ArrayList<>(); + + public static void sendNotification(Context context, String textTitle, String textContent) { + Intent intent = new Intent(context, MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); + + + NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.ic_notification) + .setContentTitle(textTitle) + .setContentText(textContent) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setContentIntent(pendingIntent) + .setAutoCancel(true); + + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); + int notificationId = (int) (System.currentTimeMillis() % Integer.MAX_VALUE); + notificationManager.notify(notificationId, mBuilder.build()); + } + + public static void createNotificationChannel(@NotNull Context context) { + // Create the NotificationChannel, but only on API 26+ because + // the NotificationChannel class is new and not in the support library + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + CharSequence name = context.getString(R.string.channel_name); + String description = context.getString(R.string.channel_description); + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); + channel.setDescription(description); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + if (notificationManager != null) { + notificationManager.createNotificationChannel(channel); + } + } + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java b/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java index 9c98512..c86eede 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/Preferences.java @@ -1,6 +1,7 @@ package de.sebse.fuplanner.tools; import android.content.Context; + import androidx.annotation.ArrayRes; import androidx.annotation.StringRes; import androidx.preference.PreferenceManager; @@ -20,4 +21,14 @@ public class Preferences { String string = context.getResources().getString(key); PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(string, value).apply(); } + + public static boolean getBoolean(Context context, @StringRes int key) { + String string = context.getResources().getString(key); + return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(string, false); + } + + public static void setBoolean(Context context, @StringRes int key, boolean value) { + String string = context.getResources().getString(key); + PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(string, value).apply(); + } } diff --git a/app/src/main/res/drawable-hdpi/ic_notification.png b/app/src/main/res/drawable-hdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..2d7c1b9c294bbfcfd7c636bec25d406d3e5cf935 GIT binary patch literal 427 zcmV;c0aX5pP)~0%4=S%kYllby z@hl+z^`AKK3#wj<+796Z;wB*e@}E5L1*)HqQiresaW)XY_)i`10%{%`xjE?a|MUf*9NB=+QG!6+0mNTv>=5Lfx{#QtlLO-UK>VA^ z4*3l=*N!9yAvsJRh__M6F(7mFq2?-(_a zfqUrD098{1vkWbI@1g0Zx`S{gR3b9~%^U V73%h8f{FkD002ovPDHLkV1gI4u@3+M literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_notification.png b/app/src/main/res/drawable-mdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..279fcddb793bd631d0c18aea180454fb997a64cc GIT binary patch literal 320 zcmV-G0l)r|NsBz2Vq(m%m&1HK>P}dL2Nc^7|aO7;Xr)nKPI>Xm188=a0ehh`JXTVsc|61 zU>zXd@}G17(xZdVU}+$p1H^y+lMntt&5*_x*6l$2^FMXKS0EO|<_l#YUID~^$uRUU zRPPliUkqPxnE~;B5)22aHHGTkPtXD+i@bsOG9H6La^7fq_7mfSP$13*Vpbq#2I6EO zevD-BW2hK2R1HXNC@B_XLKWQv;$UbZ-~!?*DCUBS1w++(}0+FV2TPHh23o|2H&Qru%k6P)Nkl7V5j5->@+W6nLL05VjoD#z*RAjWSoKT z;LyYSx4X9|^MelpcRM#9xy;UNS}jFU6vbDF=t|VY#0RW5))A7=gC->2V?DEW^qU>7 z^?Xb`U_G!R$|l0Sfe(pyS+}ee6=#LD-8vF)v#wbSs?Gwj+Ab^0jLb8$TCoz9#XcdENc;ClZflgK+KYL!#c@(Dk1k`%`zpPa|1E5 zV~+lstWdp1DZ8r|1_-aqJ8PJ-c8F`oj2N{Vh}pAVP*wW)ywADTs)2FAR$>bkX(h%# zo_QfjCv<9}m6*C}CG=S3Umk2#9Da%q>JE*BIa-NOkJt4N4n5$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_notification.png b/app/src/main/res/drawable-xxhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..29dc666eb96d4fe68c9962cba13bdb8fd947aed9 GIT binary patch literal 879 zcmV-#1CacQP)+YyvY0zlG0~Jvw7flW~F>gm*oz)H#s`QAbinuFT!dh9jM-t3U%Y@^iS)8+?1uYS!*0JOl)_#3?B^&Y_SX;zs=8sQSJ znKpR;Eio6J(}FF4Dobp(-WCFTJok;%+mdj=d##tP(p*~y$kAVT-QZE^gdfzXcsU;H zG0&;W=ufbOgE8YR^S()^jT>H3AeCq)@(l`AC?(tabvbM)LJzVR+AZ}s+ zIojc4lkpKJ!)tdMh?h7(&Wm@;>&08;g}&uuZ#YAV+^#g~ltk zQPz2^8KnY{yM0)rgKA3_YWz|CQpGpI0yGS7DEo#NbWX!IO?k}1pH%$gFFJ==o9Bd< z;h!CV1P2BD4wCC@(>F+71=Ku8PfR~W z(C4QAQ-mtbr+my}07^cGG6W?b)QLnQkw_#GiA17S(LemkOp1U5U8ev5002ovPDHLk FV1h)AmI(j= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notification.png b/app/src/main/res/drawable-xxxhdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..128789aa5ab72b77837f005113f1a766abd0f260 GIT binary patch literal 1059 zcmV+;1l;?HP)6vmfjBkw>cz@>nKM?ygbRwTA!rF0aim4AU+Vy~9kgIf^oF=!$^HYRqOkWdgF zYXuZQc!UH9JI``sByUJa5vBo}=9N!^&D*D}E&Bit=SgT%hN7^+To!M+=#PNQC z*n|%XNjl!E*{oTX*~FPKt;JqrLP|M?I?5US?wc{Kz(*}nJAVLmlVke1F30fIKopMe zM4hBezlNp^-*qwo>9WADAln1LP1t|{Fb%EAWugJ#gP8AwSn>g2DdPI&O*?#$UH~#! zjMG_R@2$0`AAk&$qjeTotg&Wu0^r~and=soI%_pA0Is}}47g4+17Pt>`3E7_W_|!% zZcDKy0IoJ>Sr-7;S`)1efGf?prlz5fL?aEjO}oV?P$%2{BG0hxD{fu+8sT#hCzj ze>1;}WB% zy-~jx4g1VDjGx6(S!DojQARe?4=t&9`&X?DKq-OJ^7gHoOW^6|t;%WtngN#yfcvS64**2dW*}sJ)XnQFTRl zCs|tQ;oyPLT@lTkys5ragBQ0p5eQygY)Bw@dAA{f;Pv$e)tLAnI1oYzA%qY@2qADas Passwort ist nicht korrekt. Pflichtfeld KVV-Synchronisation + Neue Daten verfügbar \ No newline at end of file diff --git a/app/src/main/res/values/preferences.xml b/app/src/main/res/values/preferences.xml index 63926cc..d1535fd 100644 --- a/app/src/main/res/values/preferences.xml +++ b/app/src/main/res/values/preferences.xml @@ -8,4 +8,6 @@ all pref_last_visited_news + + pref_set_auto_sync_on_startup \ 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 47efe37..33af0dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -100,4 +100,6 @@ This password is incorrect This field is required KVV Synchronization + New data available + Notify when new announcements, assignments, grades or resources are available