From b0bbad7f973b52c1fcd4161e74ce84880a09a271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sun, 16 Feb 2025 18:08:04 +0100 Subject: [PATCH 1/3] added timetable widget for android devices --- android/app/build.gradle | 3 + android/app/src/main/AndroidManifest.xml | 76 +++-- .../marianum/mobile/client/TimetableWidget.kt | 39 +++ .../timetable_widget_default.png | Bin 0 -> 100793 bytes .../timetable_widget_preview.png | Bin 0 -> 48668 bytes .../drawable-v21/app_widget_background.xml | 10 + .../app_widget_inner_view_background.xml | 10 + .../src/main/res/layout/timetable_widget.xml | 26 ++ .../src/main/res/values-night-v31/themes.xml | 10 + .../app/src/main/res/values-v21/styles.xml | 14 + .../app/src/main/res/values-v31/styles.xml | 14 + .../app/src/main/res/values-v31/themes.xml | 11 + android/app/src/main/res/values/attrs.xml | 7 + android/app/src/main/res/values/colors.xml | 6 + android/app/src/main/res/values/dimens.xml | 10 + android/app/src/main/res/values/strings.xml | 6 + android/app/src/main/res/values/styles.xml | 10 + android/app/src/main/res/values/themes.xml | 17 ++ .../main/res/xml/timetable_widget_info.xml | 16 + android/build.gradle | 10 + .../timetable/timetableHomeWidget.dart | 76 +++++ lib/main.dart | 1 - lib/view/pages/timetable/calendar.dart | 287 ++++++++++++++++++ lib/view/pages/timetable/timetable.dart | 287 +----------------- pubspec.yaml | 4 +- 25 files changed, 650 insertions(+), 300 deletions(-) create mode 100644 android/app/src/main/java/eu/mhsl/marianum/mobile/client/TimetableWidget.kt create mode 100644 android/app/src/main/res/drawable-nodpi/timetable_widget_default.png create mode 100644 android/app/src/main/res/drawable-nodpi/timetable_widget_preview.png create mode 100644 android/app/src/main/res/drawable-v21/app_widget_background.xml create mode 100644 android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml create mode 100644 android/app/src/main/res/layout/timetable_widget.xml create mode 100644 android/app/src/main/res/values-night-v31/themes.xml create mode 100644 android/app/src/main/res/values-v21/styles.xml create mode 100644 android/app/src/main/res/values-v31/themes.xml create mode 100644 android/app/src/main/res/values/attrs.xml create mode 100644 android/app/src/main/res/values/colors.xml create mode 100644 android/app/src/main/res/values/dimens.xml create mode 100644 android/app/src/main/res/values/strings.xml create mode 100644 android/app/src/main/res/values/themes.xml create mode 100644 android/app/src/main/res/xml/timetable_widget_info.xml create mode 100644 lib/homescreen_widgets/timetable/timetableHomeWidget.dart create mode 100644 lib/view/pages/timetable/calendar.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 53332cf..77903e3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -57,6 +57,9 @@ android { signingConfig signingConfigs.debug } } + buildFeatures { + viewBinding true + } } flutter { diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3c24865..530ed37 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,45 +1,69 @@ + + + + + + + + + + + + + + android:icon="@mipmap/ic_launcher" + android:label="Marianum Fulda"> + + + + + + + + - + to determine the Window background behind the Flutter UI. + --> + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" /> + - - + + - + - - - - - - - - - + \ No newline at end of file diff --git a/android/app/src/main/java/eu/mhsl/marianum/mobile/client/TimetableWidget.kt b/android/app/src/main/java/eu/mhsl/marianum/mobile/client/TimetableWidget.kt new file mode 100644 index 0000000..1c9e3ac --- /dev/null +++ b/android/app/src/main/java/eu/mhsl/marianum/mobile/client/TimetableWidget.kt @@ -0,0 +1,39 @@ +package eu.mhsl.marianum.mobile.client + +import android.app.PendingIntent +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetProvider +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.widget.RemoteViews + +import es.antonborri.home_widget.HomeWidgetPlugin +import android.util.Base64 + +/** + * Implementation of App Widget functionality. + */ +class TimetableWidget : AppWidgetProvider() { + override fun onUpdate( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetIds: IntArray, + ) { + for (appWidgetId in appWidgetIds) { + val widgetData = HomeWidgetPlugin.getData(context) + val views = RemoteViews(context.packageName, R.layout.timetable_widget).apply { + val imageBase64 = widgetData.getString("screen", null) ?: return@apply + val imageBytes = Base64.decode(imageBase64, Base64.DEFAULT); + val imageBitmap: Bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size) + setImageViewBitmap(R.id.widget_image, imageBitmap) + } + + val launchIntent = context.packageManager.getLaunchIntentForPackage(context.packageName) + val pendingIntent = PendingIntent.getActivity(context, 0, launchIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + views.setOnClickPendingIntent(R.id.background, pendingIntent) + + appWidgetManager.updateAppWidget(appWidgetId, views) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/res/drawable-nodpi/timetable_widget_default.png b/android/app/src/main/res/drawable-nodpi/timetable_widget_default.png new file mode 100644 index 0000000000000000000000000000000000000000..4079ef949225c2e2c9b8a3599556265da20fc08d GIT binary patch literal 100793 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
  • ?cD*=oh<%Zrf8ZI}?+W~!I|23{zjOTlO?2n&r zKSujuD17}>w#*Lv6iw(TP+J)BBMjvc2FoALB!WJ{AKSeq6Qn(dLgzx>SJ@}+yj=83 zX`#%jYzjoc6y5DK)~@>B%NcggI#2AiUClLedA^rUzb!RV6lf9)(SNKPW6mNDCsZyH zxpe)DLE|QDq>3zgT3;(%N$(gCck)(1-7~k6(x}D;HkQq0;-y0?)1zHLW^pNeP;j^N z4ae3NX>mh`j#d)4B%7!o8T(MphuEQ2$0|2;Dm9n54>PGs>Z?hII47wg7b-5;+73qZ zV;KO5rEO1N>BR{H73#$^zdd&~*7`fzg&kAm66EA8Epfp-#ZYHy|Y^APIaAc#P^F2O{&v93z@>=iP7WjH<*co4DPS6|4 z>oED#*BD)6lf>rSPSEO6=XJsl)69vhDP8JP`}~I0@g3}bV#gH5g0Dy8KV5XLaWkFc z=Ych1GKQPXUmGW9yLc-4+~efYDrMoVBSqQ@e_PSNq=^>(KvHm>t7_};A%68 zt~Fkh#oP&v!Z~TgMn{;-=l-Kh*Xgxu`U7a%9%@ji`FRJc(IJ)VO=Bny{Ij>fZ|GKk z7j!_fPK0^Cc;bhCS6V7Jcz-r~6cedjfcCQXU5Xxkz{s*4zLp3wsX;fJ&u`5d-1wdS zw3KNYQ%rOeVSYaEFzbUN5+oX&97=qHgNz#-F@> zvDdG3s5aB+OE61LkYI8vgVvy{;}>3WJzrT;(cECw+CF81APOJ8=)iq-d&I$k{{Do< zWgmp4vT-ZDM9IO+VZ#{egHgeb+^~LM-lX_&|I1 z&5{{O3!V4Lb(bVdld|OLyOwP`T@SWnMyRVvYD)JnPz}VBXUEC4ZB2Y)+qW0M*McYm zeS&kDP+#ZzURBpY=h3&qkwBNcp?jnu?#2_Lln*6}M;ad4MLt6Bpg2<>>Et;7(3O5e z=rHzVkK`#gi9!-DJN3&B_=i<52Gk4{VXNOm0hEBH@DM}%9{`wQ4>-~7fTBnp2NcC0 zXNEvBWQ#&vtXpQ<2Hu~|ji2HQ&0dAC(Wc$W7CzY^|jk;Wh1FsI?@9uxT@DQW&obg5SkW*c-yQNdemOEcO-M@ZxnvaAPp}jOq zWEMgmIV05nAWDARk&}9J(b*yLq9%M&PW40C)h?^uCUXQ1xSX$F!^g=a7BwVggR?uF zB?i0D<182|SJ*B^4z3vw<1z2;NBA6gQC}q%s5Z@uN?QZp2;2G3Dl1|I*#{jB{x&;3 z2I;k5_fn1;knQZqSe1pF{K@C*Rm7g}cRm|zAtbQ5xj9+^CzUQ<@IViNU78^v$cGVR^`fn(eSVv`?Qbw>p8)FG7l>h+QcOCq?n znnNG~=NpOfhe~tm(t$qpeDF;eHAqiVBr10Hd|ZncP1>opiIzNi|s@q|q5l)+9x{`QXv7Z|u0L+-Hx4+S%G#O|O8A^z|F(8xdl>k52b&m!R=xUs^p|0R=@7q|W%<~Io7R4qCrziFW#1%L7(k&= z&*c`mx=Tj#o^x{5Of>0o;A4XfYr2HlzO{arw!G;BeBekJqk_&pf}Nu$p* zlG|f@q2E>|poKR(2qhv3_@2lz12TltJMc=+I6aEq78=4_L65d>zl_M)5qhV<(6NU> zbM>C(S^9}Vz&;z2akZA05oiK#^nBj8w0z#W)QMP-&#ToU^J8=~1o)&J2Kl_4KW3jL zpgVYV-SZ5m{r$Mzbd6#g0FAeeLn>$jMwAr2*pdNSGGEOVG207p>OJm>^goUQ)N_=i zg%oJP9O~RfUzMcX1!_X)(cwENh5$Y~>92ku65!Ta*@2jy5Se2cN9Z5Wi$E&5sIK#p z1#vLo=w4y^X?TM}tlsj${w?y z5dU?7>M6gT;IAR7{_7q5HOZ)_{F+67{!HkFsOM8rq(IG}{kzvj9IKrORfNDD0^V=a z6cbz~Vl9%rmK7D{l3YPom;e)8SsHd(OGzpMzX<$Jl{l17uX7N8ZPz;k4M#`EZ($AJ zVkclL9eJQs7P0Z7q(ydg6GXQ%E>8y0+7;QC4#|FlI6>Ir4Y1801?jB2By){A^-Z`` zE~LD8n=(tU)VDyUj8l4rNe_Ji`8xVwlfW)*-MYW4+6x^T0h**tCJRn9Ck;7&71<5C zE>T5&0fzkeAse%bii$mHZg!TX8aDpKsdMS8RfO#iZK9mL`sSb7M1cs2Lrlcv28q6a z@MeCxPYht*m*h{eaI&z=ADAnd%}JwJs3xi7yTc^e1{|yX8lT0UPa$^QO%Gr+B2KRa z>l%%jo>QWW6g^xKIuTz>hqxDfz94jTTKpo^pTxHY(0||@3-|%l8tA+{4-k#Zi!^OQ zH9KpuWheaJ4bU)Q(7sShN&$~p|nr&iO&4B|3Cd`pwg zA^|DedwVjmjx&g#o7+0~0jn~T*Cc>oOLNK&BJmA;SOK4Oo}G}yiwco+PvOnC>hBO^ zxz*&aJ&Fj=6#^khrcaPSM>cAt+<=WkTw^lPrS*%OcmW(;?GZ)ULv5a$t|trWiuS8W z$iY zw5qig6gsT#f*_UnMZuYq@J;>5CSL6Qu6}gP1!2tO7S`Ro5$YZ9o-Y4bK?c$W(3s#? zz5+}{pa3YZcNpzdkYEws+DI*1`j|(lDk%+tntwD`m>DO2>Cg&d7jS9*@=mgfeE){~ zYImZk;#dM`mBbEmQNOfdxdMo{ET%Z&f^B^AFlTIdHYWX?63Q2J^HS{yZWPZ&?xuWQ z`s5Ox865^xkf(q46+L14O$CAfq=GnCoiTOd=kaL_7{M23coZ1E>#?@wN@`6qu4inS zXJ}ZYV7&tY68_08-B;GcM#Uqy${5p-t75kNQ1B7af9^;!@$Bp+{jH6J+$vdRDrqFL ze}r)|5o3%Lh$NmJ7pz`yF~!b|1KOGE@Faa1y0c3}FCp%@ovO`;+KK#&e1!YKxo4}Q zj;9E~XfTJ{#yc-j`YunT6%JC?jAejZ=7I2O(rz70z2e{6!F`>(? z6N}N73)$DC9b|bhs*l_+$DTYqmlW_jxYK3ly=@y8SNSyBBEwpeJwa4xA(T?E`qYw$ zpFT!QvDqGx&wy?h6~L3>M9?y((r7C7kw(gkUDxdC3;r3&c4o-(MDw)ZeB{W%bhwGxm;Sf%J@w+A*%hXnnPaRj%YyPlSe8cyPAOXqSrkn_P`R{v9d6$xT^n(W=e9?vY?9g+ zCHul5FC|=&!EDHf_u_hKRhGr4Oi1}QAJ}@;KFDVJNDLG?6j@DKTaCa-^F5uW>gLK0fM~h)SJC(cRAMp=Ca9yIAnSe63~#M=Ezx6Xi9WF5nDv{8hjS z104uJtMqT+$gv;bNL9}%(E-AkU!P&pSnJT%Sy4+kKIF_Usk+E$U3sBntqpQc^_pWp zVIwjN@)U${U<7fd%cM^+v`Gn&gIP@n9NI4AxPB1MAWl-WtLS|JZ7OEU9aj(C5-=IVY zTIt4ZQiP^pW`r6L3y!V!$Pwp$0|!WF#2_$ap=q3 zE39g2s!ZkBoXXm&v@G@`8?r$A=I$1tU*%qg3p+w@q!L%Y1OxPuh3A;frn3OlBeX`y z;TYixH=6*d#nCudq*!SzF3=!Gg4Jif+&WmvbOdRs={eD7J&>dZ>RHC|y=cu&{OT*> z#cRITW@v>B5OIUQP#XsvJ{3M=#lQ;mN@k5Wbgb8>P@Pt)SPZ(B2|QJ*yglx{*R}W~ zKr3)5{nHq(@5o5pk@i*fj>~H^Eygq-&LcYA`1p4qx}14-kvC0UpP_(eb^kVr%0M`P z=cG&7U^lS%ln2tMI^h3dFWR>4-%L5b@NsbGepxtvxs0~`4_P=)aENUb#I77tRbB_E1tG zLNIpl3v1a4Agi9Z$V!)H;|{lvz>V9?3$3ZI(yOWCcUlJRN`;rV|MuI?#S3RoUkzdg z!8!?+V z*F5>0VJbjB_wMRAMxPUJGlROw^;{^G0BB{8wYlT~3MKmE{s*WG0OMUv=RQX#+JHkk zo`W*9%qKh8!3+T(LTXfY8WDbFFVdM?92gyE-^tKxmqUyN9Qam2S-W0|cx$S9io7Zd zM0`fod6~})%(d1(HV%(2rKC>=&avobBQ;Vx@);h-|)>>QAG8r<}U zq4pW{M;OAqLZG%}g!56|fmcMW*QYh%(*|inRjotSG#NmQPp(%zdQLyEHo`vrveC+5 zg`4i9ePU~gQrNUAgExb{En8+PeZg4sby1MP6*z=%DRo>S0e9YKG~uqeH#=KzRv7bqQ7(dzr8PI-kTfMI5EAs!r2@u z$hv5uRwcZgemwxrqEtKuPCs-pqqn#B^-YV-4dQztpV+&fthz)Y_@{Qq(YONYoXPyV zy=I)?pL}xw|M5n48Kw+%hR9<}5Vgjk8^auR)*^bR(tGaEVNKprFzC55dvc*&3l$}Z zgXWL3UlXsDJRjSNUFc%G03O(dXP<7;#iH9RkB9}G?OPu06`Q-H@19-JnXKNy?@>j+ znY%g4BuJO%_F9FzG^=w;HuqdHjoO^FWxCwM;R4=Sg;CRU-zSQ7=LM$Mc$5g5UssqD4T982|>nqH6Jy*)Q93ZSA8Q0j;=>FWN zM;@!h5>Kz)8p}fZO@M>fRZTQ2q^0NL`jLs1Ie(w13m8TAiHv!QLc}b$l3L>2?mOzX zu@~0Z8OlDOgaVuPUutg$4kJR46Q^90fVC%EFQ2p^=t&sz$Zevu`5Bx!)kCG#0J-Q> zM9c0EmB0C%dVPjL)6SF9980Pi>U8;E1A0;J{+gmC_R)<>f2C$I!ooYa(Pn;|?CQ6N zn2tKASD&3%o9SQwf4bG&37>ZXL%L)?n;R_fX5=*PVE*>(-#`7n^vk>aj)hb#=$QL% z>+5y#b2e3ewoiSZntS`C!ko*oz#?Gxzbe>z{wWFtcY9U_@Bj4U*4EYC@3MoKTxFj8 zD}E;P$*=zZf9YSp{k5tt+|mvMu1UTYoDD0GxH!M0uebR7e)aYB|9_v9y1az7tC8{i zY~$zIwSWKqH{}+y_P?gG#o7=Uze#oLU`H&6ggn>>aoxp!}UcJ9%XX-4(8nOy6v!(q8fOZ~#-&o1Bkf7b8LI^6a{^qQx=7pDmG<{RnP zWBXsdef!sb6RYCKgt%T~>DtzMKg8E(Smp_+|obaPPr|4$+#8bArgf!Te?MS#D z%U`v6|9|~M&(4as%$sL>YVNLkY`|9gci2{X1;@sD^Q1S`FWA3kP5A6voTa7#JhE5r zZB9RaeZjd?0e;_i-Ym+`Xj~MNzZX`pswsT%`1bu1|Mt07U#lnYy|L@EVHofpZJvrm zj?3m}XBHQ+l|Gs>Z(jeG?_XtayiA!h9k}2B#Perb(A0k*g*&Bw&Hl-?-%2aLZU5LC z?DXR&x3rm!(aqYv?SD_Pc0ClHVPE{LZuW9t>s{N|zyB-whUaY?&fnSDzJK@6x!dDv zGT-J`!fRchc@FXM+njG-S@}Ng;KSZG{2#-e_KUkOlw% literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-nodpi/timetable_widget_preview.png b/android/app/src/main/res/drawable-nodpi/timetable_widget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3ca0d2f6cf322d599ecc658dee7352c4d99a07 GIT binary patch literal 48668 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

    s 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 W2Fv?CZiM}UPDM#wG3WG^+y5UE2Ie#X literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-v21/app_widget_background.xml b/android/app/src/main/res/drawable-v21/app_widget_background.xml new file mode 100644 index 0000000..785445c --- /dev/null +++ b/android/app/src/main/res/drawable-v21/app_widget_background.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml b/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml new file mode 100644 index 0000000..007e287 --- /dev/null +++ b/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/timetable_widget.xml b/android/app/src/main/res/layout/timetable_widget.xml new file mode 100644 index 0000000..56cb7fd --- /dev/null +++ b/android/app/src/main/res/layout/timetable_widget.xml @@ -0,0 +1,26 @@ + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values-night-v31/themes.xml b/android/app/src/main/res/values-night-v31/themes.xml new file mode 100644 index 0000000..f253c9d --- /dev/null +++ b/android/app/src/main/res/values-night-v31/themes.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values-v21/styles.xml b/android/app/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..0b35f7d --- /dev/null +++ b/android/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml index ae64507..c5f4f25 100644 --- a/android/app/src/main/res/values-v31/styles.xml +++ b/android/app/src/main/res/values-v31/styles.xml @@ -18,4 +18,18 @@ + + + + diff --git a/android/app/src/main/res/values-v31/themes.xml b/android/app/src/main/res/values-v31/themes.xml new file mode 100644 index 0000000..badd306 --- /dev/null +++ b/android/app/src/main/res/values-v31/themes.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/attrs.xml b/android/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000..7781ac8 --- /dev/null +++ b/android/app/src/main/res/values/attrs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..b2bffa8 --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + #FFE1F5FE + #FF81D4FA + #FF039BE5 + #FF01579B + \ No newline at end of file diff --git a/android/app/src/main/res/values/dimens.xml b/android/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..4db8c59 --- /dev/null +++ b/android/app/src/main/res/values/dimens.xml @@ -0,0 +1,10 @@ + + + + + 0dp + + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..3bf528f --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ + + + Marianum Vertretungsplan + Hinzufügen + Übersicht zum Vertretungsplan + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 0d1fa8f..4a56836 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -19,4 +19,14 @@ + + + + diff --git a/android/app/src/main/res/values/themes.xml b/android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..dcd8899 --- /dev/null +++ b/android/app/src/main/res/values/themes.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/xml/timetable_widget_info.xml b/android/app/src/main/res/xml/timetable_widget_info.xml new file mode 100644 index 0000000..a05e013 --- /dev/null +++ b/android/app/src/main/res/xml/timetable_widget_info.xml @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index bc157bd..d236fb3 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,6 +5,16 @@ allprojects { } } +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10' + } +} + rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" diff --git a/lib/homescreen_widgets/timetable/timetableHomeWidget.dart b/lib/homescreen_widgets/timetable/timetableHomeWidget.dart new file mode 100644 index 0000000..c8c803f --- /dev/null +++ b/lib/homescreen_widgets/timetable/timetableHomeWidget.dart @@ -0,0 +1,76 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:home_widget/home_widget.dart'; +import 'package:provider/provider.dart'; +import 'package:screenshot/screenshot.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; + +import '../../model/timetable/timetableProps.dart'; +import '../../storage/base/settingsProvider.dart'; +import '../../theming/darkAppTheme.dart'; +import '../../theming/lightAppTheme.dart'; +import '../../view/pages/timetable/calendar.dart'; + +class TimetableHomeWidget { + + static void update(BuildContext context) { + var data = Provider.of(context, listen: false); + var settings = Provider.of(context, listen: false); + + if(data.primaryLoading()) { + log('Could not generate widget screen because no data was found!'); + return; + } + + log('Generating widget screen...'); + var screenshotController = ScreenshotController(); + var calendarController = CalendarController(); + calendarController.displayDate = DateTime.now().copyWith(hour: 07, minute: 00); + + screenshotController.captureFromWidget( + delay: Duration(milliseconds: 100), + SizedBox( + height: 700, + width: 300, + child: Directionality( + textDirection: TextDirection.ltr, + child: MediaQuery( + data: MediaQueryData(), + child: MaterialApp( + localizationsDelegates: const [ + ...GlobalMaterialLocalizations.delegates, + GlobalWidgetsLocalizations.delegate, + ], + supportedLocales: const [ + Locale('de'), + Locale('en'), + ], + locale: const Locale('de'), + darkTheme: DarkAppTheme.theme, + theme: LightAppTheme.theme, + themeMode: settings.val().appTheme, + home: ClipRRect( + borderRadius: BorderRadius.circular(20), + child: Scaffold( + body: Calendar( + controller: calendarController, + timetableProps: data, + settings: settings, + isHomeWidget: true, + ), + ), + ), + ), + ), + ), + ), + ).then((value) { + HomeWidget.saveWidgetData('screen', base64.encode(value)); + HomeWidget.updateWidget(name: 'TimetableWidget'); + log('Widget screen successfully updated! (${value.length})'); + }); + } +} diff --git a/lib/main.dart b/lib/main.dart index 6f20ebb..d9d6ec1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -125,7 +125,6 @@ class _MainState extends State

    { checkerboardOffscreenLayers: devToolsSettings.checkerboardOffscreenLayers, checkerboardRasterCacheImages: devToolsSettings.checkerboardRasterCacheImages, - debugShowCheckedModeBanner: false, localizationsDelegates: const [ ...GlobalMaterialLocalizations.delegates, GlobalWidgetsLocalizations.delegate, diff --git a/lib/view/pages/timetable/calendar.dart b/lib/view/pages/timetable/calendar.dart new file mode 100644 index 0000000..0f99fdd --- /dev/null +++ b/lib/view/pages/timetable/calendar.dart @@ -0,0 +1,287 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; + +import '../../../api/webuntis/queries/getHolidays/getHolidaysResponse.dart'; +import '../../../api/webuntis/queries/getTimetable/getTimetableResponse.dart'; +import '../../../extensions/dateTime.dart'; +import '../../../model/timetable/timetableProps.dart'; +import '../../../storage/base/settingsProvider.dart'; +import 'appointmenetComponent.dart'; +import 'appointmentDetails.dart'; +import 'arbitraryAppointment.dart'; +import 'customTimetableColors.dart'; +import 'timeRegionComponent.dart'; +import 'timetableEvents.dart'; +import 'timetableNameMode.dart'; + +class Calendar extends StatefulWidget { + final CalendarController controller; + final TimetableProps timetableProps; + final SettingsProvider settings; + final bool isHomeWidget; + const Calendar({super.key, required this.controller, required this.timetableProps, required this.settings, this.isHomeWidget = false}); + + @override + State createState() => _CalendarState(); +} + +class _CalendarState extends State { + @override + Widget build(BuildContext context) { + var holidays = widget.timetableProps.getHolidaysResponse; + return SfCalendar( + timeZone: 'W. Europe Standard Time', + view: widget.isHomeWidget ? CalendarView.day : CalendarView.workWeek, + dataSource: _buildTableEvents(widget.timetableProps), + + maxDate: DateTime.now().add(const Duration(days: 7)).nextWeekday(DateTime.saturday), + minDate: DateTime.now().subtract(const Duration (days: 14)).nextWeekday(DateTime.sunday), + + controller: widget.controller, + + onViewChanged: (ViewChangedDetails details) { + if(widget.isHomeWidget) return; + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + Provider.of(context, listen: false).updateWeek(details.visibleDates.first, details.visibleDates.last); + }); + }, + + onTap: (calendarTapDetails) { + if(calendarTapDetails.appointments == null) return; + Appointment tapped = calendarTapDetails.appointments!.first; + AppointmentDetails.show(context, widget.timetableProps, tapped); + }, + + firstDayOfWeek: DateTime.monday, + specialRegions: _buildSpecialTimeRegions(holidays), + timeSlotViewSettings: TimeSlotViewSettings( + startHour: widget.isHomeWidget ? 08 : 07.5, + endHour: widget.isHomeWidget ? 16 : 16.5, + timeInterval: Duration(minutes: 30), + timeFormat: 'HH:mm', + dayFormat: 'EE', + timeIntervalHeight: 40, + ), + + timeRegionBuilder: (BuildContext context, TimeRegionDetails timeRegionDetails) => TimeRegionComponent(details: timeRegionDetails), + appointmentBuilder: (BuildContext context, CalendarAppointmentDetails details) => AppointmentComponent( + details: details, + crossedOut: _isCrossedOut(details) + ), + + headerHeight: 0, + selectionDecoration: const BoxDecoration(), + + allowAppointmentResize: false, + allowDragAndDrop: false, + allowViewNavigation: false, + ); + } + + List _buildSpecialTimeRegions(GetHolidaysResponse holidays) { + var lastMonday = DateTime.now().subtract(const Duration(days: 14)).nextWeekday(DateTime.monday); + var firstBreak = lastMonday.copyWith(hour: 10, minute: 15); + var secondBreak = lastMonday.copyWith(hour: 13, minute: 50); + + var holidayList = holidays.result.map((holiday) { + var startDay = _parseWebuntisTimestamp(holiday.startDate, 0); + var dayCount = _parseWebuntisTimestamp(holiday.endDate, 0) + .difference(startDay) + .inDays; + var days = List.generate(dayCount, (index) => startDay.add(Duration(days: index))); + + return days.map((holidayDay) => TimeRegion( + startTime: holidayDay.copyWith(hour: 07, minute: 55), + endTime: holidayDay.copyWith(hour: 16, minute: 30), + text: 'holiday:${holiday.name}', + color: Theme + .of(context) + .disabledColor + .withAlpha(50), + iconData: Icons.holiday_village_outlined + )); + }).expand((e) => e); + + bool isInHoliday(DateTime time) => holidayList.any((element) => element.startTime.isSameDay(time)); + + return [ + ...holidayList, + + if(!isInHoliday(firstBreak)) + TimeRegion( + startTime: firstBreak, + endTime: firstBreak.add(const Duration(minutes: 20)), + recurrenceRule: 'FREQ=DAILY;INTERVAL=1', + text: 'centerIcon', + color: Theme.of(context).primaryColor.withAlpha(50), + iconData: Icons.restaurant + ), + + if(!isInHoliday(secondBreak)) + TimeRegion( + startTime: secondBreak, + endTime: secondBreak.add(const Duration(minutes: 15)), + recurrenceRule: 'FREQ=DAILY;INTERVAL=1', + text: 'centerIcon', + color: Theme.of(context).primaryColor.withAlpha(50), + iconData: Icons.restaurant + ), + ]; + } + + List _removeDuplicates(TimetableProps data, Duration maxTimeBetweenDouble) { + + var timetableList = data.getTimetableResponse.result.toList(); + + if(timetableList.isEmpty) return timetableList; + + timetableList.sort((a, b) => _parseWebuntisTimestamp(a.date, a.startTime).compareTo(_parseWebuntisTimestamp(b.date, b.startTime))); + + var previousElement = timetableList.first; + for(var i = 1; i < timetableList.length; i++) { + var currentElement = timetableList.elementAt(i); + + bool isSameLesson() { + var currentSubjectId = currentElement.su.firstOrNull?.id; + var previousSubjectId = previousElement.su.firstOrNull?.id; + + if(currentSubjectId == null || previousSubjectId == null || currentSubjectId != previousSubjectId) return false; + + var currentRoomId = currentElement.ro.firstOrNull?.id; + var previousRoomId = previousElement.ro.firstOrNull?.id; + + if(currentRoomId != previousRoomId) return false; + + var currentTeacherId = currentElement.te.firstOrNull?.id; + var previousTeacherId = previousElement.te.firstOrNull?.id; + + if(currentTeacherId != previousTeacherId) return false; + + var currentStatusCode = currentElement.code; + var previousStatusCode = previousElement.code; + + if(currentStatusCode != previousStatusCode) return false; + + return true; + } + + bool isNotSeparated() => _parseWebuntisTimestamp(previousElement.date, previousElement.endTime).add(maxTimeBetweenDouble) + .isSameOrAfter(_parseWebuntisTimestamp(currentElement.date, currentElement.startTime)); + + if(isSameLesson() && isNotSeparated()) { + previousElement.endTime = currentElement.endTime; + timetableList.remove(currentElement); + i--; + } else { + previousElement = currentElement; + } + } + + return timetableList; + } + + TimetableEvents _buildTableEvents(TimetableProps data) { + + var timetableList = data.getTimetableResponse.result.toList(); + + if(widget.settings.val().timetableSettings.connectDoubleLessons) { + timetableList = _removeDuplicates(data, const Duration(minutes: 5)); + } + + var appointments = timetableList.map((element) { + + var rooms = data.getRoomsResponse; + var subjects = data.getSubjectsResponse; + + try { + var startTime = _parseWebuntisTimestamp(element.date, element.startTime); + var endTime = _parseWebuntisTimestamp(element.date, element.endTime); + + var subject = subjects.result.firstWhere((subject) => subject.id == element.su[0].id); + var subjectName = { + TimetableNameMode.name: subject.name, + TimetableNameMode.longName: subject.longName, + TimetableNameMode.alternateName: subject.alternateName, + }[widget.settings.val().timetableSettings.timetableNameMode]; + + + return Appointment( + id: ArbitraryAppointment(webuntis: element), + startTime: startTime, + endTime: endTime, + subject: subjectName!, + location: '' + '${rooms.result.firstWhere((room) => room.id == element.ro[0].id).name}' + '\n' + '${element.te.first.longname}', + notes: element.activityType, + color: _getEventColor(element, startTime, endTime), + ); + } catch(e) { + var endTime = _parseWebuntisTimestamp(element.date, element.endTime); + return Appointment( + id: ArbitraryAppointment(webuntis: element), + startTime: _parseWebuntisTimestamp(element.date, element.startTime), + endTime: endTime, + subject: 'Änderung', + notes: element.info, + location: 'Unbekannt', + color: endTime.isBefore(DateTime.now()) ? Theme.of(context).primaryColor.withAlpha(100) : Theme.of(context).primaryColor, + startTimeZone: '', + endTimeZone: '', + ); + } + }).toList(); + + appointments.addAll(data.getCustomTimetableEventResponse.events.map((customEvent) => Appointment( + id: ArbitraryAppointment(custom: customEvent), + startTime: customEvent.startDate, + endTime: customEvent.endDate, + location: customEvent.description, + subject: customEvent.title, + recurrenceRule: customEvent.rrule, + color: TimetableColors.getColorFromString(customEvent.color ?? TimetableColors.defaultColor.name), + startTimeZone: '', + endTimeZone: '', + ))); + + return TimetableEvents(appointments); + } + + DateTime _parseWebuntisTimestamp(int date, int time) { + var timeString = time.toString().padLeft(4, '0'); + return DateTime.parse('$date ${timeString.substring(0, 2)}:${timeString.substring(2, 4)}'); + } + + Color _getEventColor(GetTimetableResponseObject webuntisElement, DateTime startTime, DateTime endTime) { + // Make element darker, when it already took place + var alpha = endTime.isBefore(DateTime.now()) ? 100 : 255; + + // Cancelled + if(webuntisElement.code == 'cancelled') return const Color(0xff000000).withAlpha(alpha); + + // Any changes or no teacher at this element + if(webuntisElement.code == 'irregular' || webuntisElement.te.first.id == 0) return const Color(0xff8F19B3).withAlpha(alpha); + + // Teacher has changed + if(webuntisElement.te.any((element) => element.orgname != null)) return const Color(0xFF29639B).withAlpha(alpha); + + // Event was in the past + if(endTime.isBefore(DateTime.now())) return Theme.of(context).primaryColor.withAlpha(alpha); + + // Event takes currently place + if(endTime.isAfter(DateTime.now()) && startTime.isBefore(DateTime.now())) return Theme.of(context).primaryColor.withRed(200); + + // Fallback + return Theme.of(context).primaryColor.withAlpha(alpha); + } + + bool _isCrossedOut(CalendarAppointmentDetails calendarEntry) { + var appointment = calendarEntry.appointments.first.id as ArbitraryAppointment; + if(appointment.hasWebuntis()) { + return appointment.webuntis!.code == 'cancelled'; + } + return false; + } +} diff --git a/lib/view/pages/timetable/timetable.dart b/lib/view/pages/timetable/timetable.dart index 9c939be..8109c51 100644 --- a/lib/view/pages/timetable/timetable.dart +++ b/lib/view/pages/timetable/timetable.dart @@ -2,24 +2,16 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import '../../../extensions/dateTime.dart'; import 'package:provider/provider.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; -import '../../../api/webuntis/queries/getHolidays/getHolidaysResponse.dart'; -import '../../../api/webuntis/queries/getTimetable/getTimetableResponse.dart'; +import '../../../homescreen_widgets/timetable/timetableHomeWidget.dart'; import '../../../model/timetable/timetableProps.dart'; import '../../../storage/base/settingsProvider.dart'; import '../../../widget/loadingSpinner.dart'; import '../../../widget/placeholderView.dart'; -import 'appointmenetComponent.dart'; -import 'appointmentDetails.dart'; -import 'arbitraryAppointment.dart'; -import 'customTimetableColors.dart'; +import 'calendar.dart'; import 'customTimetableEventEditDialog.dart'; -import 'timeRegionComponent.dart'; -import 'timetableEvents.dart'; -import 'timetableNameMode.dart'; import 'viewCustomTimetableEvents.dart'; class Timetable extends StatefulWidget { @@ -34,12 +26,11 @@ enum CalendarActions { addEvent, viewEvents } class _TimetableState extends State { CalendarController controller = CalendarController(); late Timer updateTimings; - late final SettingsProvider settings; + late SettingsProvider settings; @override void initState() { settings = Provider.of(context, listen: false); - WidgetsBinding.instance.addPostFrameCallback((timeStamp) { Provider.of(context, listen: false).run(); }); @@ -56,6 +47,7 @@ class _TimetableState extends State { appBar: AppBar( title: const Text('Stunden & Vertretungsplan'), actions: [ + IconButton(onPressed: () => TimetableHomeWidget.update(context), icon: Icon(Icons.screen_share_outlined)), IconButton( icon: const Icon(Icons.home_outlined), onPressed: () { @@ -119,62 +111,19 @@ class _TimetableState extends State { if(value.primaryLoading()) return const LoadingSpinner(); - var holidays = value.getHolidaysResponse; - return RefreshIndicator( - child: SfCalendar( - timeZone: 'W. Europe Standard Time', - view: CalendarView.workWeek, - dataSource: _buildTableEvents(value), - - maxDate: DateTime.now().add(const Duration(days: 7)).nextWeekday(DateTime.saturday), - minDate: DateTime.now().subtract(const Duration (days: 14)).nextWeekday(DateTime.sunday), - - controller: controller, - - onViewChanged: (ViewChangedDetails details) { - WidgetsBinding.instance.addPostFrameCallback((timeStamp) { - Provider.of(context, listen: false).updateWeek(details.visibleDates.first, details.visibleDates.last); - }); - }, - - onTap: (calendarTapDetails) { - if(calendarTapDetails.appointments == null) return; - Appointment tapped = calendarTapDetails.appointments!.first; - AppointmentDetails.show(context, value, tapped); - }, - - firstDayOfWeek: DateTime.monday, - specialRegions: _buildSpecialTimeRegions(holidays), - timeSlotViewSettings: const TimeSlotViewSettings( - startHour: 07.5, - endHour: 16.5, - timeInterval: Duration(minutes: 30), - timeFormat: 'HH:mm', - dayFormat: 'EE', - timeIntervalHeight: 40, - ), - - timeRegionBuilder: (BuildContext context, TimeRegionDetails timeRegionDetails) => TimeRegionComponent(details: timeRegionDetails), - appointmentBuilder: (BuildContext context, CalendarAppointmentDetails details) => AppointmentComponent( - details: details, - crossedOut: _isCrossedOut(details) - ), - - headerHeight: 0, - selectionDecoration: const BoxDecoration(), - - allowAppointmentResize: false, - allowDragAndDrop: false, - allowViewNavigation: false, - ), - onRefresh: () async { - Provider.of(context, listen: false).run(renew: true); - return Future.delayed(const Duration(seconds: 3)); - } - ); + child: Calendar( + controller: controller, + timetableProps: value, + settings: settings, + ), + onRefresh: () async { + Provider.of(context, listen: false).run(renew: true); + return Future.delayed(const Duration(seconds: 3)); + } + ); }, - ), + ) ); @override @@ -182,210 +131,4 @@ class _TimetableState extends State { updateTimings.cancel(); super.dispose(); } - - List _buildSpecialTimeRegions(GetHolidaysResponse holidays) { - var lastMonday = DateTime.now().subtract(const Duration(days: 14)).nextWeekday(DateTime.monday); - var firstBreak = lastMonday.copyWith(hour: 10, minute: 15); - var secondBreak = lastMonday.copyWith(hour: 13, minute: 50); - - var holidayList = holidays.result.map((holiday) { - var startDay = _parseWebuntisTimestamp(holiday.startDate, 0); - var dayCount = _parseWebuntisTimestamp(holiday.endDate, 0) - .difference(startDay) - .inDays; - var days = List.generate(dayCount, (index) => startDay.add(Duration(days: index))); - - return days.map((holidayDay) => TimeRegion( - startTime: holidayDay.copyWith(hour: 07, minute: 55), - endTime: holidayDay.copyWith(hour: 16, minute: 30), - text: 'holiday:${holiday.name}', - color: Theme - .of(context) - .disabledColor - .withAlpha(50), - iconData: Icons.holiday_village_outlined - )); - }).expand((e) => e); - - bool isInHoliday(DateTime time) => holidayList.any((element) => element.startTime.isSameDay(time)); - - return [ - ...holidayList, - - if(!isInHoliday(firstBreak)) - TimeRegion( - startTime: firstBreak, - endTime: firstBreak.add(const Duration(minutes: 20)), - recurrenceRule: 'FREQ=DAILY;INTERVAL=1', - text: 'centerIcon', - color: Theme.of(context).primaryColor.withAlpha(50), - iconData: Icons.restaurant - ), - - if(!isInHoliday(secondBreak)) - TimeRegion( - startTime: secondBreak, - endTime: secondBreak.add(const Duration(minutes: 15)), - recurrenceRule: 'FREQ=DAILY;INTERVAL=1', - text: 'centerIcon', - color: Theme.of(context).primaryColor.withAlpha(50), - iconData: Icons.restaurant - ), - ]; - } - - List _removeDuplicates(TimetableProps data, Duration maxTimeBetweenDouble) { - - var timetableList = data.getTimetableResponse.result.toList(); - - if(timetableList.isEmpty) return timetableList; - - timetableList.sort((a, b) => _parseWebuntisTimestamp(a.date, a.startTime).compareTo(_parseWebuntisTimestamp(b.date, b.startTime))); - - var previousElement = timetableList.first; - for(var i = 1; i < timetableList.length; i++) { - var currentElement = timetableList.elementAt(i); - - bool isSameLesson() { - var currentSubjectId = currentElement.su.firstOrNull?.id; - var previousSubjectId = previousElement.su.firstOrNull?.id; - - if(currentSubjectId == null || previousSubjectId == null || currentSubjectId != previousSubjectId) return false; - - var currentRoomId = currentElement.ro.firstOrNull?.id; - var previousRoomId = previousElement.ro.firstOrNull?.id; - - if(currentRoomId != previousRoomId) return false; - - var currentTeacherId = currentElement.te.firstOrNull?.id; - var previousTeacherId = previousElement.te.firstOrNull?.id; - - if(currentTeacherId != previousTeacherId) return false; - - var currentStatusCode = currentElement.code; - var previousStatusCode = previousElement.code; - - if(currentStatusCode != previousStatusCode) return false; - - return true; - } - - bool isNotSeparated() => _parseWebuntisTimestamp(previousElement.date, previousElement.endTime).add(maxTimeBetweenDouble) - .isSameOrAfter(_parseWebuntisTimestamp(currentElement.date, currentElement.startTime)); - - if(isSameLesson() && isNotSeparated()) { - previousElement.endTime = currentElement.endTime; - timetableList.remove(currentElement); - i--; - } else { - previousElement = currentElement; - } - } - - return timetableList; - } - - TimetableEvents _buildTableEvents(TimetableProps data) { - - var timetableList = data.getTimetableResponse.result.toList(); - - if(settings.val().timetableSettings.connectDoubleLessons) { - timetableList = _removeDuplicates(data, const Duration(minutes: 5)); - } - - var appointments = timetableList.map((element) { - - var rooms = data.getRoomsResponse; - var subjects = data.getSubjectsResponse; - - try { - var startTime = _parseWebuntisTimestamp(element.date, element.startTime); - var endTime = _parseWebuntisTimestamp(element.date, element.endTime); - - var subject = subjects.result.firstWhere((subject) => subject.id == element.su[0].id); - var subjectName = { - TimetableNameMode.name: subject.name, - TimetableNameMode.longName: subject.longName, - TimetableNameMode.alternateName: subject.alternateName, - }[settings.val().timetableSettings.timetableNameMode]; - - - return Appointment( - id: ArbitraryAppointment(webuntis: element), - startTime: startTime, - endTime: endTime, - subject: subjectName!, - location: '' - '${rooms.result.firstWhere((room) => room.id == element.ro[0].id).name}' - '\n' - '${element.te.first.longname}', - notes: element.activityType, - color: _getEventColor(element, startTime, endTime), - ); - } catch(e) { - var endTime = _parseWebuntisTimestamp(element.date, element.endTime); - return Appointment( - id: ArbitraryAppointment(webuntis: element), - startTime: _parseWebuntisTimestamp(element.date, element.startTime), - endTime: endTime, - subject: 'Änderung', - notes: element.info, - location: 'Unbekannt', - color: endTime.isBefore(DateTime.now()) ? Theme.of(context).primaryColor.withAlpha(100) : Theme.of(context).primaryColor, - startTimeZone: '', - endTimeZone: '', - ); - } - }).toList(); - - appointments.addAll(data.getCustomTimetableEventResponse.events.map((customEvent) => Appointment( - id: ArbitraryAppointment(custom: customEvent), - startTime: customEvent.startDate, - endTime: customEvent.endDate, - location: customEvent.description, - subject: customEvent.title, - recurrenceRule: customEvent.rrule, - color: TimetableColors.getColorFromString(customEvent.color ?? TimetableColors.defaultColor.name), - startTimeZone: '', - endTimeZone: '', - ))); - - return TimetableEvents(appointments); - } - - DateTime _parseWebuntisTimestamp(int date, int time) { - var timeString = time.toString().padLeft(4, '0'); - return DateTime.parse('$date ${timeString.substring(0, 2)}:${timeString.substring(2, 4)}'); - } - - Color _getEventColor(GetTimetableResponseObject webuntisElement, DateTime startTime, DateTime endTime) { - // Make element darker, when it already took place - var alpha = endTime.isBefore(DateTime.now()) ? 100 : 255; - - // Cancelled - if(webuntisElement.code == 'cancelled') return const Color(0xff000000).withAlpha(alpha); - - // Any changes or no teacher at this element - if(webuntisElement.code == 'irregular' || webuntisElement.te.first.id == 0) return const Color(0xff8F19B3).withAlpha(alpha); - - // Teacher has changed - if(webuntisElement.te.any((element) => element.orgname != null)) return const Color(0xFF29639B).withAlpha(alpha); - - // Event was in the past - if(endTime.isBefore(DateTime.now())) return Theme.of(context).primaryColor.withAlpha(alpha); - - // Event takes currently place - if(endTime.isAfter(DateTime.now()) && startTime.isBefore(DateTime.now())) return Theme.of(context).primaryColor.withRed(200); - - // Fallback - return Theme.of(context).primaryColor.withAlpha(alpha); - } - - bool _isCrossedOut(CalendarAppointmentDetails calendarEntry) { - var appointment = calendarEntry.appointments.first.id as ArbitraryAppointment; - if(appointment.hasWebuntis()) { - return appointment.webuntis!.code == 'cancelled'; - } - return false; - } } diff --git a/pubspec.yaml b/pubspec.yaml index 7ad1cea..a526b75 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.1.1+39 +version: 0.1.2+40 environment: sdk: '>3.0.0' @@ -101,6 +101,8 @@ dependencies: time_range_picker: ^2.3.0 url_launcher: ^6.3.1 uuid: ^4.5.1 + home_widget: ^0.7.0+1 + screenshot: ^3.0.0 dev_dependencies: flutter_test: -- 2.30.2 From 6bbc75fa94237003624b071c9b450640f17d4800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Tue, 11 Mar 2025 15:50:02 +0100 Subject: [PATCH 2/3] implemented scheduled updates for widgets --- android/app/src/main/AndroidManifest.xml | 6 +- android/build.gradle | 5 ++ lib/app.dart | 2 +- lib/background_tasks/scheduledTask.dart | 64 +++++++++++++++ .../timetable/timetableHomeWidget.dart | 41 ++++++---- lib/main.dart | 7 +- lib/storage/base/settingsProvider.dart | 8 ++ lib/view/settings/devToolsSettings.dart | 82 +++++++++++++++++++ pubspec.yaml | 1 + 9 files changed, 197 insertions(+), 19 deletions(-) create mode 100644 lib/background_tasks/scheduledTask.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 530ed37..701cabd 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,8 @@ - +