From b0b3ccfd530e2b450804c194365b4e4fe225c754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sun, 20 Sep 2020 21:54:59 +0200 Subject: [PATCH 1/9] Upgrade gradle wrapper to 6.6.1 (#968) --- .travis.yml | 4 ++-- app/jacoco.gradle | 4 ++-- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 ++ gradlew.bat | 22 ++++------------------ 11 files changed, 16 insertions(+), 28 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5dbd9e366..45818739f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,8 +48,8 @@ before_script: script: - ./gradlew dependencies --stacktrace --daemon - fossa --no-ansi || true - - ./gradlew -Pcoverage testPlayDebugUnitTest --stacktrace --daemon - - ./gradlew -Pcoverage createFdroidDebugCoverageReport --stacktrace --daemon + - ./gradlew -Pcoverage testFdroidDebugUnitTest --stacktrace --daemon + - ./gradlew -Pcoverage connectedFdroidDebugAndroidTest --stacktrace --daemon - ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon - | if [ $TRAVIS_TAG ]; then diff --git a/app/jacoco.gradle b/app/jacoco.gradle index e9abfb613..a5cf84e63 100644 --- a/app/jacoco.gradle +++ b/app/jacoco.gradle @@ -35,13 +35,13 @@ task jacocoTestReport(type: JacocoReport) { dir: "$buildDir/intermediates/classes/debug", excludes: excludes ) + fileTree( - dir: "$buildDir/tmp/kotlin-classes/playDebug", + dir: "$buildDir/tmp/kotlin-classes/fdroidDebug", excludes: excludes )) sourceDirectories.setFrom(files([ "src/main/java", - "src/play/java" + "src/fdroid/java" ])) executionData.setFrom(fileTree( dir: project.projectDir, diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 42169ca53..7e2877674 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -19,7 +19,7 @@ Hausaufgaben Wählen Sie ein Konto - Semester %d, %d/%d + Semester %1$d, %2$d/%3$d Melden Sie sich mit dem Studenten- oder Elternkonto an Geben Sie das Symbol diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ebc145423..bc94b227f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -19,7 +19,7 @@ Zadania domowe Wybierz konto - Semestr %d, %d/%d + Semestr %1$d, %2$d/%3$d Zaloguj się za pomocą konta ucznia lub rodzica Podaj symbol diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 15c583173..7052fbc9c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -19,7 +19,7 @@ Домашние задания Выберите аккаунт - %d семестр, %d/%d + %1$d семестр, %2$d/%3$d Авторизируйтесь при помощи аккаунта ученика или родителя Впишите \"symbol\" diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 423c4e12f..15fe203d5 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -19,7 +19,7 @@ Домашні завдання Оберіть аккаунт - %d семестр, %d/%d + %1$d семестр, %2$d/%3$d Авторизуйтеся за допомогою аккаунта учня або батька Впишіть \"symbol\" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 963c70478..7df2b68a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,7 +21,7 @@ - Semester %d, %d/%d + Semester %1$d, %2$d/%3$d diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2faf2fc91d853cd5d4242b5547257070..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 12842 zcmY+q1ymhDmoSOmQr324hm`&0SZbS3R18r37J8Z0F-T>@gIK` zatajf2b1lO#&E_RnGDF51uk%8Wcxm3`%Yhe7Psx?*?eZ?8M9_+G(?L=s^OG1n#S(NP3gF?2Mr2^f5E7sM~iVC`Rn;(-^MZ zZu*ZXB;XmgvPls(e#)MMTObsEx9oNz-K?AmQ8pP&P7vqx*=5zxjU+ye_1R<%KSg1? z7H&Yh))(Ke!Pa+aVuWxPKa_~Qo_IH}*;tV8n~O*Xa?t3P^9=L%=wOL1=~{LVv}mU8Q#e6s>v}iV8cDP|EdY)`dp≶7^21 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

XiM^r_M1uFTw)(UPqqUJ zed7DJQvOpplYJoNl`A3a2Zr~v)Y}K|*%d7?8;dC*Af}0=(EXrk7hP8PM4v)ZawEv0 z5j5q_6vilv4*ppZ3Wke7%8b`odJu26#YseA?$sP8?@d?TpACTX`G^?%K=Hly9Y$Tj z5`i!}-WH0lQ3yt-&Pf&Z)OxjKfAZ3X`YI2)5o@9EiOA}?kX`^rk;yaOh^Li4VHcT& zd6ztJz^`H!8>cL)a%?Lnofzo0$WPrgkNcP#u@{%~EvA7g#go z+Q4$Q^o_MJTE0G_&9@cgp)WF>2zo>AG}C|(~E^_?ijc2EQ>> zFH1Lxc@i!gDHxvEsrfc+Kiz3Q6Z*NM+U6DH6*-Fv{YDY4>U&eegGH~Xmk~!sd6fw2 z!6^4(MZWhzf(xs6BHy=oS+dir0_JW(j*AIu$9&&p@}T;&6s7(yYidEdkp6pk9}Z(F zk6lG`d!HcJWP{7X)&P5FW;XWU6;zke2e+g*#1kW4L0Auj5pVA45Bhzt{8lj)XyMHu z0p;Q}t*NLnXbGQOTC9WdOQsX;_yLThOP$mzcEbqSBifmDecV;Fqhtm#KxfJTMhY!K zw{1L9za2QtuIWXu0ZYm@Uy72(9^vYajuP$(VAKn+&Jp z!%S;#BqO;02)n~6pFYK8oRC6wXx@kyb?VENM7l?NFg)%^=q4aZ* zwVCZxA8lalF&n`vk#gxD@!9~Aktc+h2UUUax3q2XKQLuL@CpVEpx2IyiH3bALY+Oi zDydtacE1Z|$z5qsCG=%F{}8_ozwieWuM4VcDesuu+wX&YjHm^Ryx)pVtiSLpch7<` zIw9QM%I;(VG9~#Rw2JNt+;?_=O2lA#YSudpgsM`e&(}1 zGdj7U)St4`+Cj#Vn>a;Bj~Q3S1G54;gzq)`b_Hh~ip(`BK#GMkI*RUcK+6ycjl?QN zP%sH5*R$$6A&8j8O4iFJhuHMXLJm|drH+=!_{`60&+tC8*m3Z=YsR@~%eaZyWQI|W zie7;BRL6`LR+4B{%FY~;-^*1GGTCLp!U6VoS36GUAWv$Rcc#|a7DD01{QPB=VyT)? z+1ZV>P=bP1;>v-+j0;BwenO`EKcIbmB3$r*@a~=?5#KB_R$3bTg zOjEutZmWuylIJQEM?28D!4uA#0CZEJHar0TFAW|NwP;WL|EIb_L2>;}e*N!K9E61S zH&u@m!n#CH{C_j}{#ybCRU8z7`Cs{b>@bxSkp3lOm`qAYgB>npnw%V>w}t_+S_Z)s zFhGKq^e%m@=^@sD0CJdAK=`Upbr}?}N zf;snqpt#dOwhxFg82(%Tw=ND+@`O0JGeOWd7-3R8A%Yu%FhiaYXD>p?t2+o%_1CKE z{g(>=g%}X(O%M!}KZK%$7-F<34wD-24`y$WLDv6z?ty=_b)Oi*x&?v}3j0f`AV3HL zWPAYw!XNs-1EmZ9=d=$6LAJISVJ4&gQM5=bh{!f0OmFNz8oMnGgOl_RK5VPP3@87C zpLS$muCo5YTmOslSjFLb`AXIJ@1|O{pm5r z9MxUb-8HMe*|TpFa%dE?+7}MVQ-A-N8wvtq85ROU2%KYt4etC52X0%W08haQgGSU| zvw=K$djTYSLy@4My_Te_8JcZp8Oozg{-ey>*Nm7BkGrX(M~HU6N16U>DSj<`;cy`u zR?0B23zx|*o1V=#fLZ=wd6*NfWjC`pqA^mt>DTZjGBeX`0ZK>Qgxz+37Dyb#NT4WT zl@7Lmh{WdY*h%e_bo6(oXKw=`(9=mft10fOR4< zCOUungtJZPAM~qw4Ydy9PhvYTi1ZRqR5nY)?OX2O3FJ6VXy&`&H%^U|d>N>@f zQ}Cd;DV}_bNiVTW8HcUJDRvXCUwGx|(r2-KbXY>jpd!~jmt(

p*eWM!w;MI3hb2}DlKZV3$r+FsPh`1u zZIhE^SI{5xAuy z+6s18Cax7>1@Y#i1q$NF_)Mm4=(dAqT=saVC z3ws?DY|72z{D*xEl#|0weiXdOyz;mQF%odcChZxu=xzy3zt9$`P-=&#C8aI?6n%3_ zz5<`IpS1r9aqk`~?k)EH2L|zR(c4Uv$Z2a7olc=EI=84->IDAgQ0O!c?s;j~GwDOV zK+prKX=xdIJ0N3!LOV2$b)N7Uaj>3E@S6-{hjDvE>t}L0kZcXl=YV}q=M|8&#+IV% z7RD^fabFCVe->sNrUPX?l52oFvgCj*D!(yOiEb6ol7ttL7T=<BUI`ejr zgg*+ZP+8(22v|(^48*#}u^g}B3f>xir^adn-`lmfOb<^G-!y7%`k3IZ`#M zB{(rrRg$?dR!WsBMPBXZhE#(*5aSeOsDc}n@*FavsCX4WLSl+8v?3`toT5z?Tru|% z6?^pxQ6s6!8MuxUMnH2qd1lR2{b+Z7{vwZ;`Ts(=fC zfROnoU9kNpRnRWsf)bQ~o;_|;`3e3h0#0{2iZq`)?zha}?%a*6PcgK1jgmijN#M&dYfe=TeRB#a0%Y3Of-H;!G z-nt(l!?_lU2Lp5&eSC;vz@;ZmG))Y7eVe8d>|(`l`0BrmtG9x4ViWwD)_yVm{NN+$_Iq_fR=NdfKXQO9!4q;TmDTPWEhSHC(H4OP- z5**=I$LJrFaxI9{BXMC!X@#$%I3AX}cp}#yj9^kX({mj|U&A@Xm1Nwj>YaO(b&FH$cCc{u$!BM}fBu4imE&Nr$UwbW0Ai?7U`GlSm}-%GfbhuDvw`ysfRC9Tl8_e1vG zFc(_hSkSZ5_t6T|zTl5;1m6_vxp zv8jFu#m0PB;MT-~Gk4klcW6H^X7>#l0>YgboQ*~e z(u8wYS#o)gVFUiQxT|OO)9)TMV%9Kc#|>bxwuS=01d_9T7uAo<%BQl>XCs?x7t$XZ zbQPJ4DwJIxsIRGGb4cYt=DPl@9VXctOQ}0cp*zc_yWwotnlC-ebqe}TpZaSse6Gsx zvhDY})0FSKSJqRno1PC+x0=UjjLQ={Nbu$QnRc=>JNSospB?U#tf2Q3!~Koe!2KGf z?@-Lvz;C>#I1+5%tr)>>l9y}3_wPtQ)c8Q+L@GMM-In1m;wpxXA-pC^cS zVTO+a{P)rRGv9U;P(^SR-V?$7o3`L)OxNw+?`ssxry*L)S1OE;^P#0{CYbjHP=D8R z4cy0N(2FvP${xWJieTmtDD{a+@SR{w1--L?dW-c+a5UPkYzK+mTLQ_65XusjT?JRk zB6J9|iiBu4&%`j<@P&n1weU%{grol^4z1RQ${fj#X*2{0?XshpYqAz> zCUrEjg=}fFhEioTHkL+hq;9yvYZdls)}J>l+>X3*ATV>LLZor;SdHKs~>D&N01H-%VlfQl~aT)oDl zW11w^joAb`l@;o!(BxZO*NN(lEQaDMex6SH`@FWk$cyz3wLzg*LgAAZU!48k*xJGh zOJ8;JtEE%*gzD5V^wz^3^*YX#z;$Xi$<#+sf8;BD>rnLVH)YVQvvBB%!|-e;0|u7^#EtDm+1(w zlx6!HBqj+PiySwT^SB$zTL#P5oA(+~?n0cja>E{cW|H&RaUYJ0L99_Oild`1crHq| zY?*Va+O0{@(=N9CDM}IRI$2A2(QR_9wnOGRJb2n)8q(G*=V+)}yw*olX)y%Ti3yak zlpS)x5B+oCKhd=vtFq0m*?pifv53mPmejslmfNAUjZC3)hCNaIpP8R60N<4=dRaJuIOQWc>5tI1pi z1C*g5^!@?^-UI8cMJ$pT{@RinnTv#g@DIZK<){K3TZV zsaV~_btV*zT5TSN6*4adonBssH$nkp$)s~K_(QK6kTO{iP;0%$`rc5VR!`~Xv24eW z!hqX+=jd7yp=yUGuNcv8!J=+I)>+$8!@a&zxA&8@XTek)*{t37{UadA>{^M!%pix!xr2zD#!Ys5{XQu-g&!%3 zw&9oqNIF>cu3|T?!5C_Z0Z%m`Z=686&VgOVKAS6dWR>De2tVJCnm_&1$N9?j&E8oP z+0nu4qUNJ=h3T=gk|jk9?ctjK>IuT5aX{hnE_Z7;kbJWl$o$JdFA5QtXFXHCBE1T{ zQBJ=m6<+P0Gyg&4l|8})S;B05$O|fG(8HNEC{SE8a^%=v>$*PZ#SocA#ztCfWhcj3 z$RIyTH)ozAZbrf>yT#H#-nB4~B?`B*+#^v&YQ1;pDwhHdtBuB^KQ6yGK=#5WZ&gFP zC|FinN3zcEuqU=?8n9loUoLY5U+4bYCWxp(lbJ7d7(aea88Iw4y>7pqZxk1WaAV06 z)Iqn(u0BPsM(nNG&ZxjP^~Sr3O-(jhWLI%Y#iv(6&aBPeytXZkUQTcHN)!gjgG-JS)z^Rn9`; zC<0~P`>qKwWogD?a9{?jKI*1+v-Uz$&^8E~|{zX!{2OsMF_- zW@v&)Zd_x=K)1KZWS+XgHLl;f`0Q5V`YmXI)5DZ4Rp!JBShI3Q>HG$te(N@G5*5KT z+B0~ABi^7U?Y1`%rd{{VbmR~4Th&X3#B96n6zu5(Yg6^j7F5GseLk@oR*ROm_Qd9L zaq6?TRiKc?XyE~Ztp_X$?aJnf@w`b6Zln-b zIqz}?)G1Yth90DGU(O!TcBxf;$dlWnp~$l@D0-*i`M3v!p)CdHLB{;xMJOqi(|W0liNk zO-^Ow=C5j!&Saz-jnHIB^g@ao;{U}kd7lqC8vs|{gGo%&PW7Bg>*oh++|pB&)gH5RK}d462GM?XrMWOq&rku3Ez=suNUiy4gdkH7+69=&YKrrP72W;* zQda+U23SxkJQZInRk3@L9!`=6f3H0zD+??(xAetJkgZ_qo5Q?oN3@%x_ZFF805a6YBmV+@P;MirfnQJWH|0$aW&tWrrsdl_l-zYf|??SBf zJd;pYsjiJs{`sj2l=A{(X=Z>lf@oQpqqd?{VpFp4`rDNLvd8g!zO~}KGyO6mRXq{> z^v9h_)i_VPgmbaMSRqO1PYvb4X{`rIouixL<)3uH?1SK1ZFqr&9oVY?Ep;N_&w}F_ zg1s#v@kZ%CM(N7RL*zepXU3)~k?n5Tp;$FGchUyJb2Q5dLAkrZc;%;XFRU6HI~JD6 zo~EeA!%NP%Lh|}H)5F_^*;D~(yzOK7*EDr~Dt1lQkLnl2m8*&vcQ6x(!Xj&Bw3#7J zNKK~I@0#V_a0GxRlWGU-v|vEfRQ9!}$o*((#6$FHF#ex%i(*ax39#x^I}Ucz8%|bB zBzx-Nd9lR{hd#FA=73GaRc*WMuy|g* z?%?Rwo3mgolttaH(QJ1I$SR;p)t=Q$itIs*A>>ep&Xz0n$$38tr(BEwbL@p2-a)rP(fYNMm>U<>@xg&kP z$wU@jwaeDP`^00h_2nWhzr%m-YiL-=ETegvRa3Gy+)@&0$N&50ZL zDK*$459PvD>Fsh2E$SeA2cIDg8aXZEV%3S6SUk+^STZ z4CCYH8w&TvYy88T23Mxc_qXO~=;TnK+`gQ)H?^5b$41Avsv{FBjt8 z@mooKTAqpPlzl#3V%x(eaa`=5#n9t;Eo!{3U_w^dj$;x{bNhWwlY z?qF7(3mqNNwy0PqR7x#U{+3ZyzhDBeZs-Lxrivnt@(NMLne@T<;NN( z%$5RMP6K1&y3B|+L^qG?j`)ipgdwb$lU@P0^+KjbG1M#kieWK2oy&!CsbgNfD7BMo zTA14eoWOM#PLx2Od?op(G)5Ev8nZPfV`+poQkSV1WjTs~pa6C!mhw#oTWOvR$3yY( zRpMUQ(!@*U)z*!!dW+@qdWGZGFAs0Us;rd7fI=JP-fBIrEd#-YIe9|R6kHbTxQmb{ zn<_=!j=u=jYl%LWkm}Q9C)opTT+l9WurhgHYJ{kXQEv8z~v{ELf;%baSF;Oh^gc}i6l5j&M&y>=+a*-sOWv&d0+ zqa#Gefl7@qQKo*^7$-z(FED@Vlyr-d6Wx}n#Vu^b%j`v15Lb+ugv0K?L}rkQ+M?I? zBv*@Q#tjEa$t+Ar`IoX!^*_4{zT-(B4^F0N9edgkurNm-sEqY$@|RioV1#-)E<%uA|I z^%13Gno@-HyRoh{DGDH7PRfY+Q?ybt$7CTCxq% z$SfaEz+$MY#i0MMFzD|*)|rn90r8Ci0^-ZR*Axl7B8&hUxmpI0BA)p{31jz0L*)y9 zMo0VvhYG3cLC!QXOn*H=5LaB$DCS_HtFZRdr6L?bRZ+5=dR1$wbfL7NLL29zvO%p( zjcx0rofDWsj`9ig!*`_P_lDPHi`jFQ(^Q+sVFWA+`i#u`xcrfQG+SRj9;0j}8(Hnl zz9djd57HMzyR8Tx84DsE(Fp&@ zzEUBWG&N59MO6l$VQxqSK zDN2A>f3*;B9ayKeP?L5Fuhu3bwDfLQ6JMlh*W1w|$vWNR!CT%gqG(r4t$ICi5s=-P z!x9i7=6pUeUVN+n$w{a4yGXUy2b%LqBPmJT;*e&2zsP01+;~JS*S9p`S7;W; z4K)c!q98^RI5oxKofw1ki#v0Il1j9$LclhmQx?in{mEL8Jwi9_IsMZeX%^iCC+2%$ z)>rRvwj;QmXLykGj@|1B>T2B+Z>@eBwU>XEz%IhUy|BkBBXO(3P6TFWvSdZ%pezF+ zqut_JlSY-|1~rP+bu+OUJbi^mqr2|HDlieGwpgyK++w`3I;y&0R<76X%B?K7kg}>) z!B#GoCS@f@8BpW1;;>}sT~T=Yv`|W5d!2exx_Oifnc?eT zg`X~j4V!Lglo=@Tp_VQ6p0SgW{~i%)S|R*-G{|*n{fa;PdWNJ6yf4UU9%0*34A5!| z5g`zfg%bga)ExgTX`Bm7(>f2`+m<22Kd%CQ#jL2W4QbcvuX7M_9sd)P`!<9 z$RoS5(db}dBa{r;t7JpJ7DaR=OT!BTT?00P89YdSXAHA7&7xmz<1>4sS*o2ZJ&Z=i zy2QadKJQNoxLL`RFu2zvldlG#65=XOVTQ(l4J1;?QIwizBLN*PtlIM3CQYUoG5sO5 zj=X{n3M`f$0R)@}Y_AzW5Yul(AYNOdhQsxF`p@@pB1MP52J{-A&nV{irosr?TqDs# z=;9r=Vto)D6=GGK_b^t2IE|m+R0AgUM^!e+wm+S0M|DVIdBUg72d3tNQd5|#pYO=7 zPR)?A$t%;aZ2WR*V00=7ekt%VUP(Ya9KeXxL8X$-?Q!JZ1+%v<>YL3rub@gNTRdrL zGezK`O|UTl+;CG+ytO#UBFu1|8qmP$?c`|iYw7msv(@iVta*>&(W)o0y0H&k4Y{o0 z3{j#8k(rXL(=bXN^yo97+|LqNqAX;1f$%>*frED&a;PVnk56fnTR&M2>@K82FtrJx zoW)ro!M^$_gi)2(K`ZS}sBa;6j3 z!X^6G)ML_=3!9P`^+2A)llH_J*3ug3%;r|Z!`0rfCaa2Kpz&vbmUI&}E@5<$aSqN^ zGRM!l+K?nWm3D~We?ZqS4r#3d9dYLB0YmAB^qEl{8j~hFBUspUFYIHj;6nMV$@zWv z`GU!Tk16kj1rFU*yxH;dUxtm}cf7X?^X=Cubg2q(C(y(ZVlos>i4u0%ABWqclkJt- z58dsf+x_)$r*g2Hh8?FEyir2U#U=xH6*? zX9dS_3)(6CxK_?u_}25=OTlo@GjHZZ_7~qVW>y0xK&xu}&6-PjLdp^K-{DZLky0k+ zZt@mG{L$c2CsM=2QRE!xUyGo$BXO})FNBU~7`;}G=_PZWv>b_Hkfi=#AP(d-k}d{} z5g1D<0KaIlLIZRcT}KXj#L2MzePqbcaO9T@me~~PlQlPC6f+W_Z}*;OR2Y$@Y-p4p z>{pZSK_j#^<2UfjP&nEJdR=e{AV!v_=27`8FuY*F&D>k$XxFxxBFx?X>OgQ#gLJRz zGqi@PLmfZ11yI&Z@H zHaVeBn@rfA&lGvFCis^s#t(6}Hg#xLpoXrmig(flx(b>!9pIjHTOoxTjuTV6ix5ni z3oj(rS`@{>f!-^?P+8#iuk%Ug!5W=c?*iWVbOA%{tZx?go{TDQ+0s9XtY1fiH0{cW z8XPCF^3GN7A@4wa?qGC1$NvP6?DsPfX2#Q;t8ZseA9RYw z=)T^q7qD%$7gv%H%Q!QeouXuA&>fuKM2ZJ@`Lo1v09fzlTVKfyn_P3i-^AYnoe;fz zz1vnYV%^Bh;1xEpU*_g4k1dm{Jo@C`GM@X2Ejpe`-@d2{=P2A*qY{ z!*E9J+scte+VBh)ZAkRTEuEK`2c+FgKzwdiQxD4M^^v4E1-xjDNvY_v7n&yT`u8ZU zsak|l(?S>p1^;rG#9`*2`L$?fdb3u8@;r04yD%kuO^R35-IM5OX7EFGS<~YB(49V= z*(L0DGeMYllq{bZ2YF-MDq(@yc1pH~ImFs5fsIF_GKjT ztjgq}U{T>qdsc$*bwLRaUakca#JPh+r++`TNVZiAc9fXnQLv4P1SXeGhsHBMV>IRt z&|%tXD!<;66ayMbj+kyA7#-Cf*}nAZ>6(8_6mrg4Zbs|zgECJ*5=M2gV7b=_KHgW| zD$YZ_@RAg$6B#fu$_WX61~J@kzSh@B;0#}=mjdbpf@5e=@)<7xAsrX71nC;!41RSg zI#A(=!~jT0is6st zVr;A#33q6%{hLssmFHF-lI`Lyol&qJ+9KK2CqKb2rA;X#OP!P7K~!YWhqZRZ9lsbJ zHr%se#s4slO95RjT~>1 zCiZVKJA)Ac{Q9NU9T01M-f)ELS2Y+5E+SYw${DWFp*iDLLSPVweCy9j^4d&M%EnC5 zQu;H=eMbXlSluABU#5c3l0sd@#Q`u?qQLytt55iWAvq?Oer*AcqkOYSbhn1y`rT_{ zeP{5Hn|?*j#ra@IUi1FEcsDx|?jqqKVSC2latgN8LZO?JL{R$J#m1~7V{X|A{`dWy z=R2R5Pt8vj9Dh*N91UzpFY-x*>Sm^Id0L58Ff0%^{HT~VLKkey+u^LP`0dX6jts|R zQV<-)FN?ZI8Sz!s=Oy#Xbe%RtLZ(GJS>-Ev&tUMC(XX7RlUpuz9`84PQHmL zx;?H95V2JvYJsAw&hqtBc2m#B?xEXZ?FvssN_e*??k8RjeNz<@iH0w;!!8LdzJ0@E z?Ffi2L!xG7D{)PWadQ(SQQ)EeF}_xC{_;1gkV4bJq;BvB$ez$Ou=x&TUAYy?9^ zPh(vYIJ!=OZUuCkq3^a=vzfFWP^vC2oQ(44W_QVqOXacaW`IxfxXf$$x$80g^3-8b zjHUI|1t7T0{uFw<6Iu;nXw6EV8T9TR>hx7q6COg>RxBIGi1yF?s0<`(h+rSs7#v>D zP769_q1zh)i~dNwzjLCK`d#Pv6$BHU;wc~}pTCi1lH(+XGa;dnAepFH4aUyZ)N|J) zw!&*ct{?#UISa*_spr-)G}-YQu|G#N7yuewxg+O?hW?_dHG?JD^jfWyo{`{M!+*mp zF1qv8(S?kPrlgsxczW*1B-uQ@dm|we;u@&t`Ud@;S#Wf&3;}bel`9ymylurh($N%g za~kd_cb-2$*U}o1IPXDHc*CPUsq`dJ1jvMiNL+B9m2}n8i>^o9QoqbM(XG#|i~z}1 zf*(uev{ob+;=0v(7RwAo>|isL)DOLW-T7)gl!Kg2~BxL41UDz>AiDTe`R#Ep-R?Go6fW!u{ zfi2&FdnM`?dip|53_v6)WKA}O%LV0NUsuD$t^q^4%f&!ZM2e#?M<&@modn$@rRl2t|U`T|lC7_@5< zmd5nd&B217g(u2&z{U8|3=I1oy6B(ps*h^DmCXre7XogQ7m6R4zgpb-sB8%#sfuxX z!m^ug2opaNFJ(G=A8G7%Le2aL_W1E>{YOJ2OYdQrae2H)<&6}#k z{mNH^&m*3<;pNO}!Ic&TRx_Yw!*o{+c!qD-F&S{8u5sFOqq_SJ7b}OtpF5#vHTl2F z*6+TuYrMO}ovrLB(37m;7}goKPvr|1kuj5~fbs=}!i1>5@BfpVCyYJQHfu1GlOFo` z%3B3Wy1zO4$OT}&AjJH^l&RhSAu)pSA!g0^t3EFx^`IPO<-36LWC{bwaWe1<)wG-5 za7f0P>LAQ<;08UwlW6{@f_q8Cq%a|#OUEG(&88$}c$S}bF#0DuDw~94%MDq`i(^Y9 z>X`G(PAv`_uu#@L<`sV}j#Or_$fln&46^gdABbnyyETV*Yk7ide0{PPSktWn(mSU8 zvqyt;6#e#(X}CMmoBJWq_8pD8k2p*A*tf0dcbyl)w^j=Rgdy8j#6Jn&g$>WytH;QB z65f$JiOY%QKcL*0o|Xc_f7Pb7FWXbU znj@lQe<@=NgEdWmd$y3?@0)bfOdKxy=rMG>iD?=o$N7>5JGPZrA1I|6lFzp47V6j{ zaZD=Uet4Tdjio^WN>qc7ub7%-O(%$61YK`y4SEwzRR4_5WgmtQ0mFrAcw zv8VCOx%uwvYFe=h#bHJ7TC-+Q^LUKywVbA-lPII1SC;RjXG2A9r$tv)f%Qaf9{@@6 zm}#^Ro_NnsQSal4!}ehY3P|gC5pl1ONOrPOk#Mb;M4?0p>n=V)pp4w5V5@(^qH;6k zw!1yJY!~Ru=!Qqx?U5VQH`@$hfiby8%{j`slSQ~?+z)m-CJ5cwG5$E;4dW86`#`Dl zR)+>b|Lu|n2QOL@{#O&^KW&l!`{nz8Mh5%SWBqNPrd^^Y{J))U5D=vQ>-uNR_jg47 z*Z3J6vBV6hAo&knUHS&d`0|&Iefhmj@^~fw$LH0Vz&k&JA9`@ITB22u9sR1vhQr1C(9= zp?Ki)4LJam7kDS05UjB&1W5J%3nzV1{u&oI@c}PBeL^e2h{yt0J~uHVK7;Ku%yZnxzDBXR#gL9qNjDj2+j z54cPD8(~T(0AK9T0&dg)(r-mDV74smzb^A#e85xIf8>f?9>C|k|4_*Sw7)Lk9zFoN z;9nX2@8Kep{=b{{srcU@B6w?$2XIyTmkR9j0z@nRLQoa)-NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From 2a74b11cce0a0388d1dd2d5e589a0fa5a23969bb Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Fri, 25 Sep 2020 15:37:19 +0200 Subject: [PATCH 2/9] Add app shortcuts (#939) Co-authored-by: Faierbel --- .../wulkanowy/ui/modules/main/MainActivity.kt | 42 +++++++++++++++++- .../drawable-hdpi/ic_shortcut_attendance.png | Bin 0 -> 1536 bytes .../res/drawable-hdpi/ic_shortcut_exam.png | Bin 0 -> 1602 bytes .../res/drawable-hdpi/ic_shortcut_grade.png | Bin 0 -> 1812 bytes .../res/drawable-hdpi/ic_shortcut_message.png | Bin 0 -> 1775 bytes .../drawable-hdpi/ic_shortcut_timetable.png | Bin 0 -> 1625 bytes .../drawable-mdpi/ic_shortcut_attendance.png | Bin 0 -> 902 bytes .../res/drawable-mdpi/ic_shortcut_exam.png | Bin 0 -> 913 bytes .../res/drawable-mdpi/ic_shortcut_grade.png | Bin 0 -> 1034 bytes .../res/drawable-mdpi/ic_shortcut_message.png | Bin 0 -> 1048 bytes .../drawable-mdpi/ic_shortcut_timetable.png | Bin 0 -> 937 bytes .../drawable-xhdpi/ic_shortcut_attendance.png | Bin 0 -> 1907 bytes .../res/drawable-xhdpi/ic_shortcut_exam.png | Bin 0 -> 1940 bytes .../res/drawable-xhdpi/ic_shortcut_grade.png | Bin 0 -> 2231 bytes .../drawable-xhdpi/ic_shortcut_message.png | Bin 0 -> 2387 bytes .../drawable-xhdpi/ic_shortcut_timetable.png | Bin 0 -> 1971 bytes .../ic_shortcut_attendance.png | Bin 0 -> 3393 bytes .../res/drawable-xxhdpi/ic_shortcut_exam.png | Bin 0 -> 3417 bytes .../res/drawable-xxhdpi/ic_shortcut_grade.png | Bin 0 -> 3917 bytes .../drawable-xxhdpi/ic_shortcut_message.png | Bin 0 -> 4279 bytes .../drawable-xxhdpi/ic_shortcut_timetable.png | Bin 0 -> 3457 bytes .../ic_shortcut_attendance.png | Bin 0 -> 4892 bytes .../res/drawable-xxxhdpi/ic_shortcut_exam.png | Bin 0 -> 5027 bytes .../drawable-xxxhdpi/ic_shortcut_grade.png | Bin 0 -> 5529 bytes .../drawable-xxxhdpi/ic_shortcut_message.png | Bin 0 -> 5994 bytes .../ic_shortcut_timetable.png | Bin 0 -> 5087 bytes 26 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-hdpi/ic_shortcut_timetable.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-mdpi/ic_shortcut_timetable.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_shortcut_timetable.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_shortcut_timetable.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_attendance.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_exam.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_grade.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_message.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_shortcut_timetable.png diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 035608893..95b4aa77a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -1,14 +1,21 @@ package io.github.wulkanowy.ui.modules.main +import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import android.content.pm.ShortcutInfo +import android.content.pm.ShortcutManager +import android.graphics.drawable.Icon +import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Bundle import android.view.Menu import android.view.MenuItem +import androidx.annotation.RequiresApi +import androidx.core.content.getSystemService import androidx.core.view.ViewCompat import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment @@ -31,6 +38,7 @@ import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.more.MoreFragment import io.github.wulkanowy.ui.modules.note.NoteFragment import io.github.wulkanowy.ui.modules.timetable.TimetableFragment +import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.getThemeAttrColor @@ -48,6 +56,9 @@ class MainActivity : BaseActivity(), MainVie @Inject lateinit var analytics: FirebaseAnalyticsHelper + @Inject + lateinit var appInfo: AppInfo + private val overlayProvider by lazy { ElevationOverlayProvider(this) } private val navController = FragNavController(supportFragmentManager, R.id.mainFragmentContainer) @@ -59,7 +70,7 @@ class MainActivity : BaseActivity(), MainVie return Intent(context, MainActivity::class.java) .apply { if (clear) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK - startMenu?.let { putExtra(EXTRA_START_MENU, it) } + startMenu?.let { putExtra(EXTRA_START_MENU, it.id) } } } } @@ -83,18 +94,45 @@ class MainActivity : BaseActivity(), MainVie MainView.Section.LUCKY_NUMBER.id to LuckyNumberFragment.newInstance() ) + @SuppressLint("NewApi") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityMainBinding.inflate(layoutInflater).apply { binding = this }.root) setSupportActionBar(binding.mainToolbar) messageContainer = binding.mainFragmentContainer - presenter.onAttachView(this, intent.getSerializableExtra(EXTRA_START_MENU) as? MainView.Section) + presenter.onAttachView(this, MainView.Section.values().singleOrNull { it.id == intent.getIntExtra(EXTRA_START_MENU, -1) }) with(navController) { initialize(startMenuIndex, savedInstanceState) pushFragment(moreMenuFragments[startMenuMoreIndex]) } + if (appInfo.systemVersion >= Build.VERSION_CODES.N_MR1) initShortcuts() + } + + @RequiresApi(Build.VERSION_CODES.N_MR1) + fun initShortcuts() { + val shortcutsList = mutableListOf() + + listOf( + Triple(getString(R.string.grade_title), R.drawable.ic_shortcut_grade, MainView.Section.GRADE), + Triple(getString(R.string.attendance_title), R.drawable.ic_shortcut_attendance, MainView.Section.ATTENDANCE), + Triple(getString(R.string.exam_title), R.drawable.ic_shortcut_exam, MainView.Section.EXAM), + Triple(getString(R.string.timetable_title), R.drawable.ic_shortcut_timetable, MainView.Section.TIMETABLE), + Triple(getString(R.string.message_title), R.drawable.ic_shortcut_message, MainView.Section.MESSAGE) + ).forEach { (title, icon, enum) -> + shortcutsList.add(ShortcutInfo.Builder(applicationContext, title) + .setShortLabel(title) + .setLongLabel(title) + .setIcon(Icon.createWithResource(applicationContext, icon)) + .setIntents(arrayOf( + Intent(applicationContext, MainActivity::class.java).setAction(Intent.ACTION_VIEW), + Intent(applicationContext, MainActivity::class.java).putExtra(EXTRA_START_MENU, enum.id) + .setAction(Intent.ACTION_VIEW).addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK))) + .build()) + } + + getSystemService()?.dynamicShortcuts = shortcutsList } override fun onCreateOptionsMenu(menu: Menu?): Boolean { diff --git a/app/src/main/res/drawable-hdpi/ic_shortcut_attendance.png b/app/src/main/res/drawable-hdpi/ic_shortcut_attendance.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5feff2dfcbc56abf45eb59dab87786b7944275 GIT binary patch literal 1536 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 R2uA<_002ovPDHLkV1lwYLzMsk literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_shortcut_timetable.png b/app/src/main/res/drawable-hdpi/ic_shortcut_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..2808559a54b2c9a5f5b3ce003753ac7dd5aae0c0 GIT binary patch literal 1625 zcmV-f2B!ImP)XB2gH@eqF^B$uesnWATgdEH!|3EY#8h?>o5))7exOj;smx$|+ z6(O7a18RZFMh3>e(6ShB?ivS5=>S z{p!`LswN~)TLP5uX-^;lr23(MU*Q88;JQ;0K%i4l87c5cmQTuVg60z z^Y=Sx^&J6J5aL||h8TDUfC3WbnIzz62CiqN{4t6mowBh3x@X(3SD5!Run)j1I*kb- z^O%4u7SZKRj`J`?dEX+&0TnWt9Mb7e!MxYEc9Q}`VXImL`vP(g@20L}ndWuj3AbW8y_mX-4RsJbEpD&}&RnCL*% zhQv{xm`5}D{6|rAhXz!euGI()MrlCYWeK>Q0`|Tk<%2MFg#sjVxwkE%UjQr&Q|UaE znXNGI68ZeCpmhfZbZ=l_SGiL8sfXaynarjvYxky!2{o|VPar@&XgSRw0$Y+cpqkGq z^q}Ru1St(AeHPYGlyEcG**&Yx)jTH?!2PHYT5rDJ;FaXZ=&+-nUPJVVVJ0WVolQHYBSL`pKLhAMy4=yMD--cyD0N$MB%A>dL* z%7cx1UIJ7Q;!guxGd&3iz+_g+*E|8qTyBF!q$20YPcK@K>U0{|(74i{V?hNWJ^&Co z(cP=BSj{T-WTpI}ZXt64+4dPQe-_z%ntagAl`ELOco7J?{_<)F5mp{Nh!y+Po+PUN z$Ak}3x-6nIn;pjuapnLj+V)jue$P0d(b4KmV-k>>A?v}TNkB|=E$2Azx3(Z5)MCl& zAVDB*jXp?C!F51t;fZuQkSO^C8~xHaR34!vr@W?y=EU2FbCn?&z68x-lU;p zK`FVQoAj8pAl0UWGY0Qs2i`~fmJi^b@J=J6Fv0KKqXuURapV{R!Q?=05V zg5sU#RRGx#;Q7J2w|#r-v~0Y9yr=oRZC|B01I2*Tyl37zMnFV#E#nm^-nH%173O1p zBdhbjR~*#!7DV)Q)^S`09a*e4M$$TPePv>_AOPNr)!G3CBj=EN)k#;FH#VNd?nuI{ zhb*Xl!c3WV94XhC%a<`dG6FUf2a!s5s5RaG{YKLrx+z!VN&9CL6L@;(j?r{S-hpGO4tQ#Ii-`1_L7A-Qr{WG5% zhsL&^`}?tM#||u5y}G*fZ1S1ct>@}%7Q^8MlYors3VL{<3Mhu-FGf3MQdyYeFEwXv z^Z=E~J{i;%?f{i)fbk=E276^lRkR~`H7im#d6Gk%?M5Uy2CQMP1tD&C`^_GWZd66o z4WNvaZ|TVUo|CRCNvFBSp2P$(FNvBbdDxP~<4H`sCRo7HMnQ(iv; zwh*@oc%cj2iyQ-YOetULU}#0a7UBs34|D+gCBwj?Ddoc`yhs8yA)YaCHwtJF?+JLG zm-1d1b|`^SjC|19s7M@2V3>10DtcjSqALNl+mK<{QNY7|&yHhu+nu@+s0y(jl1+!{ zw{MGp^}LkVg2p=t93-jNBk?lAs6liynCvIH~|NZF|;J z@Cke^7EgU|G=6F$0q_Xar>1~LBaSMN%_6t8R?UhtzX767^!y zHItM80ZVx)-P+72kYw*~jleJo0N5x<>6Y}Z1USyx2%$rl2U?+X3bzJq57K!(GT54*p|qKT+E%xX2-m~>d`5u-2@c#Ky!Y1 z87C(u;smWj_V>;XzRb^SV}u@P6iTX(lx`IEJJ0Do)GHD-A>IwJ1Fbz>0)l=C-TM2{ zY-}lpsctQLAxd>~*CUbY_WCFz5!F`re2cu`Xd#i_D<+@Be%t-&pgPy81MN7@!ay$h zTKC@6Ub6->P--u_gG5wc^;@%f1k9Or}A-%OgC+xkMifQ(XCdlwp| clVP_10$KmzKu3GSZvX%Q07*qoM6N<$g558g`Tzg` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_shortcut_exam.png b/app/src/main/res/drawable-mdpi/ic_shortcut_exam.png new file mode 100644 index 0000000000000000000000000000000000000000..3bdb5297f588cdea614f7579afc8655a3aa936e7 GIT binary patch literal 913 zcmV;C18)3@P)LOR3701J#1mJ*4HmJt>h*kGnCw4&

%3p^yEY8pp`5L*S{W6^QGrqP!= zsQ}uxecu)0C4if02M*~S8$_>)jmBqPds+Zaxm-33V^aWkbO%zD-x03+%xX59it_3a za2R_;zy!p*y8+yiVdX*IE=j};JJ#yVaW(!!{Yo!lD$NL7GrM(@FdC5D1Im4 zU5WFjakgUtCNcA2XOki^5MZ2ZJ}G)}dm<7*o;G9{PLknq{w`eCiaMPl0h)|$$7It; zzo}60zKd=*mP=JGY=nUA66bd#zW0Cnm!v-F&TgsE@KoBB%0LL|e6e2lg%R)aY+qpH#;*Eu=Ck6I0< z`}@lJh7i?Y?bHY0Sk@Pv!fbwb7v}7&^59W|65?oOMcIZd04>K^^%Z&mKP#0hzdD`Y z%9a55%SJ~hN>+D2xI$cIj^p{-18{7+Ns z=U#2r14wiB_fDRL1)$T>VFyeT#lyq2N9s5!ebsE`^xhuK>1iG2 z3$jBir=?}x3(fWAWz4Owr-m5%g+@Z8y;5chgSvA3mC}pCS?5{%Qm^hqdP${Ay)@rq z?Ar)C&}j*JXMfPZ|Jm4*gt=}l`XS17bJvH+b$fl1kw|K*`@SVUa0DRo`^40PIBUDV z(d}HTo}01*?Yi#TNFMouPUQBPH9V8KedrE@$iC`Hw|fghEK@`5vv;TP2S_D>h+5t4m|56$Z|`Gf_dduW5W!90KlCp6SKhpC?M|j1Oi+A>GYp^C$KJnysF+W0z5**gcnB`V`~9`4`EIF z>_wmJcml}BVh?o2<^f>P>%b1ZLj`dmoXLE0YtI#c7L7&~MOk40cij#oDZjyV{kfXW zW+mn2BcKuT7y;hN8m>o<0X$JDeJ^7}DgqiIuMpscjKN09Fo0#1(w8E8LVz40Zy3N+ zk)dXMM}W5xN}tuTT@&CkX5Q(nC=yixTDj&$(W|v5Dgy9qgNmYw47c(-({;5{cB%-F zC1kzEXu?8*SLgdDg%VFx!i;YwehC+AHi4skFsA+m88r8Hz0DgofNjgGh` zvf}(6PN$8Z^6|J^RYN|K$yoZL<)ko{u-8r{0Gg_?{Pjx=PG`9U21rOuLByH>5LmjcA(Ts|BFNVhLny zRR+LxI2Vf<;?)2`sT2fzdPz|fSE=D$Sy6n5kP>I2&G1C zW&z0Ne!hfcBhV}W0N999YLxVL04AD!L%}70{cz){@@Q!Zex_0-L%EFrSB_F@_})?g zK49_m6uym*`v<_>w9d_5PZnxv1bhu(rcwKP@zoOQn4EJ`5ij*sDJaS_gTcct{N2ZL>9U)6OvT?s&H z)CLJvEvLDCnG4Nj1Ju0Ga0r8PZg91)ltvWJJI^&Q_3dM0Fpx~v z1>pri>Qc`ka)f-5=|FpJqnJ?>-G3d?wQ|4x_y4o8#R+}gS~NrC>*lTr;p_JLWky2O zRyTbUK5*C|{QJaYL7cbUUwi3X%N%&T1Fh@&Oj92D><;+$nbkRqzJ2I+g7CiTk7DsQ zFgA>We>Fe=iimp!T~C?)O_}9YO-6bX*E2{nb$t);7uFA3Pcu^}a{vGU07*qoM6N<$ Eg0UFaS^xk5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_shortcut_message.png b/app/src/main/res/drawable-mdpi/ic_shortcut_message.png new file mode 100644 index 0000000000000000000000000000000000000000..392c45d2482df45902ce93adb278865ef7278105 GIT binary patch literal 1048 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_shortcut_exam.png b/app/src/main/res/drawable-xhdpi/ic_shortcut_exam.png new file mode 100644 index 0000000000000000000000000000000000000000..9f36ca47a5b5bfc636b1082d6f3155363d0f1fa9 GIT binary patch literal 1940 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 FV1i8{2hsol literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_shortcut_message.png b/app/src/main/res/drawable-xhdpi/ic_shortcut_message.png new file mode 100644 index 0000000000000000000000000000000000000000..184929a3cb2f7fe77ace5f6dad5fec976a93f906 GIT binary patch literal 2387 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 FV1lw!YmWc` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_shortcut_timetable.png b/app/src/main/res/drawable-xhdpi/ic_shortcut_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..9a40fe61c794ef5e83f61d43a7e653221e844e7b GIT binary patch literal 1971 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

    NAP6ka>sl0_j}GSc#&BTJX|omQ{=3+Ao57@!2Z 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 brz`&t)&cYSCvq>B00000NkvXXu0mjfieqPL literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_shortcut_message.png b/app/src/main/res/drawable-xxhdpi/ic_shortcut_message.png new file mode 100644 index 0000000000000000000000000000000000000000..250c290aa695e0fae46bdcb2c465f1e1af409d4c GIT binary patch literal 4279 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_attendance.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_attendance.png new file mode 100644 index 0000000000000000000000000000000000000000..7b9a68a708fc52785e7896b46ca261115317cc5b GIT binary patch literal 4892 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_exam.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_exam.png new file mode 100644 index 0000000000000000000000000000000000000000..519c50abcbfa93d9f6ade9896a366d86e3a96997 GIT binary patch literal 5027 zcmYkAWmwd~x5wwV%L39!x`33@np>BM-lKu@!^3&P) zhbsjDOwL;Bs<-@YRMB%;smjW6PPnf9U$4}H+>ijnMKtCFd)wKKMp6=uDPrQIzH>CIPDVv>IRM8oE) zIf{ApYTsQ!pC~ZA{-<8FAM}l5C#|fh+^Ebt_-IjQ|XH zLG>jI13-=+ees9TUbzEQlpuCB)Ts&ZDD*ob$Z#5dtui*CDh*B%G4g5YDL&T;RXana=hAN2iuka=3Mfd&tcm9t^zJhs89koPD5jNrn+LG{8_m8!=akos zVZ)a;?RhNh4a@iVdMNMCB zkFXPie4|%hY!AlO@P4a8-~#^aC}v&$E|1!Dpk(he+5Z{aN|Sd&R@J@cyUV=R^87pp zJ=&~TD}Dh9uI3AWv;m-+&!Fy`eqISwL>714;WVbdS@phworrq zuf@ramfwq(uFOD@vX=|)&JN^p3q6Z|24Re-)?wKB%Uu50>+CJJa_5b$Wns7qVZA#Eu#fExr` zN?DcCn^$nlZW6+gX?S;czeW{_&WHDE^6?)UEX8Iw0ZAm zoWFx9FBLvHk9ougJKOcyY-NOzWw!sLK|Y`ic_>V@P=diV3Dn~5rlLSU zlb<1|%2rvve-ot!B|LVMz47HR!*BuC@E)*BI1TSF37*e17(1t4Vo4=6JVI0p!oY0fTnMGKiL&4 zDP+Ake{YI0@LNdcGdxMBo=N ze-wj7*}#*VIczf@YvwLE^@`iaFXSl~sMUkh`!(}2b?6lyP~KDuDX**=cU=MiCqp`JXi#JmpZ%`s$FSbB z9Z>XJ)f9%_2Dr9nxGBJU+~EXARN4fE3lLBBqk48n$c>}c%mU)MwK&~ib6o_?B(^(9wyMtDdW%M0B=YGPiJBAwqbxngY7UE*9f87tq z?Njr=mYZ(dOumL|*0|oU*DLmmvxj(&$y&@+#9rY7S-muAS;1aUA0Dw; zd#V~|A&rj9uSI$;bcv3;iW<%MHAY2le*{~KS>5jrIpj@X0@)!oJC%xqJ9^5r&uyv& z+_wKLF@}6O74!>dF34p6K44zeg_x>YeFu#%9on zyWQI^dotW zC#j6N3jBc4dTiB~O?k^v2567>l3MGNre6MJ21qinUg=i8W+f!30qZaQ-o};=r0SAg zm~nz94->zM%KjGbFY6_@yr2m;tQIw>2G}ID79{kixl!xz`lsYurOdOMHsy+EafZc{ zObLra<;>8$&2`||%Zv{T2^;3_lS3Gnu&wcTUXiBu;`wJX2*J3hh=PmO;TiOdF!W2n z9#Fa7A#9k{0&_T`!=fVfquml8xF_$$JQXZ9b?S;gK#GCPSBq-g?{&`#ISI0)dkSo@ zoii{l|B}K6^o{ij&?v<7oU4e%2_4tOOF5CY*o+_N68>TPB z1De=)(_x*=Hww_ywBjg4lCa_PVoj69j(oW|QA<-o#CpL;E}qpcqI20EFG&fVl`WV)O5)+M&L|O z3dJnNr_W(fARJ4LcbAs6Y4d`iKSS7w#mH$t-3OA4r^Vec5g+Q|+!Q@ah6{xE!-n-7 zkKQ`1UWD<;Aw{-P(60iz5>tIpBnu?}TI6J0m_G}jI$-TI0!>x6aPs!Jiv#`XZ^|#~ zcn++NQ-89Yp_5&Df6g^b`MU!WNKkBglu=+3-bFd&AjBfvCJa=AG zXG^PfY&`iD6a}S)a18zK!F|{HStMd_ro2JMn)NW$Hm6=RL@OGl+dRKFt#DRUw82twi0fG<vX#_sHr0WVQQNzFB*E{d=`7kMlX?<$M*H z4T9p_$L9V>s*wJZ(J~DFH<5nI$r>b2cWB;A$Npw9!)`2oy?nG>?Q#+=qkr%#lK$6- zbl=qW%2-y`X5XxOOhC6f`$V>!CJM?uB^uM%UK(xDydhD8FzK|^O3DwZUo;ZV;6|K^ zh9by<72JTa0rQPg0MQeP$J(O@=@YQe3M(SA)6kKa>J4ino>-W8?kQ<_KW}*8gNg?q zjHYa16`#-Ihgc9vLfF7lmCY~(X{OG0JTFN?<+CT^BG_NwCcBs&EA%QV&k{%E?L<5f z#$^Y}CO1qqa3lWX`iZ@b^lhQ!2patmIifo)Zp2oSvV|f~NjFPJ!HDNItjBN9cJJup zw!YCj5m3z_)K(MDq?AYMq)Ouq$X1tK0$UMNNP$2ZEe2y#W+@|Fn#wo25AC{L&!4@f zBY83xef?TeV5ePg#ljvi>x5jZ2kXIw)qHlLyxm?)GO>w@L=)VVycmg9U;0sZTM6({ zb;rfK5a%|~W`jcL_8l19+aCW?4>54i6Grt&gU!Lq4d~CU~P3 z41cS!%(oSwTE0@{H7i&#`kEgl?Aoa71U}N9IVFjJ2^%Sj8V-RSPD7l~jF1KQR-i`; zi(4`H7#r&D<#i}CHx5(1Eo_*C`CpPC1akWP{uhF`W8IhJc3i@8U)>cO6*t1CryHEY z^K_nd&T{2h&~d}i7sniHyEAS6OfPNA zme`$A)x;acLmZ9z{T@^P%V<>O?P-~gi?WciXPbQbAF zhpP+OaAK0~+3ideJrkr<_;X|6;vIGQ*?_=n`Y+~#Bn)j-bJET>2ki}C3CQtC@l)cg z=~MT9&^UJVy420ni!4oYXMOnvHxRPFQeVpD!MmDuexTO+@N3Sb?>uz*60)Osh}CPf zNBw-EOh!NrrbG_(Xz{0dj~FB|v5I5#6YsqGRNz8ETF%JxOEsGm`5PCziJcBt-_5zi z?)uq_mzaN}ETi}$cp%bNYo$u^YggDvxDI`5<@+nnT?`*ZwK-vjJQc!Tg6a|pSF$^#P-~I8`Y_%-2k#yi0-J5Re zyn+jW+M|V*sN_$(lSL^0rM`0c$Fbm4!12>*iOek+#6dB;OZ!o^V{A zN{LjkH1XXNQ)VFM8+?d(ZlJUh&bk>%YRZiI^seb?ST&_NRj%7YMIVWS>=2=@8MRM| zr=!OoAGQb`R4Rrh$_}*!UV=ysuk89SBFI2$ppG4}0tc|x#+Me7U@)9c^TpQ|W@u0) zQOxeG1wo|zi6rxKQ66BPdW)vv6%I@pduWvnv+Sve3M`A5XfFIZZN34m>-y>yYS{4q E0u$LQvH$=8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_grade.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..13c793d5eab438cebce711486cec63316f13b9bd GIT binary patch literal 5529 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shortcut_timetable.png b/app/src/main/res/drawable-xxxhdpi/ic_shortcut_timetable.png new file mode 100644 index 0000000000000000000000000000000000000000..03522e9a59f85db3e8a42e43eb2b10283eaeee0e GIT binary patch literal 5087 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 literal 0 HcmV?d00001 From e08abc1fc25fcd47f50566ad0762cd1b64150d1f Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Fri, 25 Sep 2020 15:45:07 +0200 Subject: [PATCH 3/9] Show subjects without grades in "Grades" (#947) --- .../data/repositories/preferences/PreferencesRepository.kt | 3 +++ .../ui/modules/grade/details/GradeDetailsPresenter.kt | 2 +- app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/scheme_preferences.xml | 6 ++++++ 7 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index 1d5e57f8a..a6c83fc91 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -80,6 +80,9 @@ class PreferencesRepository @Inject constructor( val showTimetableTimers: Boolean get() = getBoolean(R.string.pref_key_timetable_show_timers, R.bool.pref_default_timetable_show_timers) + val showSubjectsWithoutGrades: Boolean + get() = getBoolean(R.string.pref_key_subjects_without_grades, R.bool.pref_default_subjects_without_grades) + private fun getString(id: Int, default: Int) = getString(context.getString(id), default) private fun getString(id: String, default: Int) = sharedPref.getString(id, context.getString(default)) ?: context.getString(default) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index a36517938..3dfa0206d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -186,7 +186,7 @@ class GradeDetailsPresenter @Inject constructor( private fun createGradeItems(items: List): List { return items - .filter { it.grades.isNotEmpty() } + .let { if (!preferencesRepository.showSubjectsWithoutGrades) it.filter { it.grades.isNotEmpty() } else it.filter { true }} .sortedBy { it.subject } .map { (subject, average, points, _, grades) -> val subItems = grades diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index bc94b227f..486290587 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -359,6 +359,7 @@ Oznaczaj bieżącą lekcję na planie Pokazuj listę wykresów w ocenach klasy Pokazuj lekcje całej klasy + Pokazuj przedmioty bez ocen w Oceny Schemat kolorów ocen Język aplikacji Powiadomienia diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index a82b14eb7..5c6eb7d69 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -20,4 +20,5 @@ true no false + false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 6cb877ec2..1a0311b36 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -22,4 +22,5 @@ fill_message_content show_whole_class_plan timetable_show_timers + subjects_without_grades diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7df2b68a8..d461299da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -385,6 +385,7 @@ Mark current lesson in timetable Show chart list in class grades Show whole class lessons + Show subjects without grades in Grades Grades color scheme App language diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index 4cdb989c7..bbb2aaeb7 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -40,6 +40,12 @@ app:key="@string/pref_key_grade_statistics_list" app:singleLineTitle="false" app:title="@string/pref_view_grade_statistics_list" /> + Date: Fri, 25 Sep 2020 15:46:08 +0200 Subject: [PATCH 4/9] Different notification for notes and praises (#952) --- .../wulkanowy/services/sync/works/NoteWork.kt | 27 +++++++++++-- app/src/main/res/values-pl/strings.xml | 38 +++++++++++++++++++ app/src/main/res/values/strings.xml | 28 ++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt index 84b806795..b08896966 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt @@ -14,6 +14,9 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.note.NoteRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository +import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory +import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory.NEUTRAL +import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory.POSITIVE import io.github.wulkanowy.services.sync.channels.NewNotesChannel import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView @@ -41,8 +44,20 @@ class NoteWork @Inject constructor( private fun notify(notes: List) { notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewNotesChannel.CHANNEL_ID) - .setContentTitle(context.resources.getQuantityString(R.plurals.note_new_items, notes.size, notes.size)) - .setContentText(context.resources.getQuantityString(R.plurals.note_notify_new_items, notes.size, notes.size)) + .setContentTitle( + when (NoteCategory.getByValue(notes.first().categoryType)) { + POSITIVE -> context.resources.getQuantityString(R.plurals.praise_new_items, notes.size, notes.size) + NEUTRAL -> context.resources.getQuantityString(R.plurals.neutral_note_new_items, notes.size, notes.size) + else -> context.resources.getQuantityString(R.plurals.note_new_items, notes.size, notes.size) + } + ) + .setContentText( + when (NoteCategory.getByValue(notes.first().categoryType)) { + POSITIVE -> context.resources.getQuantityString(R.plurals.praise_notify_new_items, notes.size, notes.size) + NEUTRAL -> context.resources.getQuantityString(R.plurals.neutral_note_notify_new_items, notes.size, notes.size) + else -> context.resources.getQuantityString(R.plurals.note_notify_new_items, notes.size, notes.size) + } + ) .setSmallIcon(R.drawable.ic_stat_note) .setAutoCancel(true) .setDefaults(DEFAULT_ALL) @@ -52,7 +67,13 @@ class NoteWork @Inject constructor( PendingIntent.getActivity(context, MainView.Section.NOTE.id, MainActivity.getStartIntent(context, MainView.Section.NOTE, true), FLAG_UPDATE_CURRENT)) .setStyle(NotificationCompat.InboxStyle().run { - setSummaryText(context.resources.getQuantityString(R.plurals.note_number_item, notes.size, notes.size)) + setSummaryText( + when (NoteCategory.getByValue(notes.first().categoryType)) { + POSITIVE -> context.resources.getQuantityString(R.plurals.praise_number_item, notes.size, notes.size) + NEUTRAL -> context.resources.getQuantityString(R.plurals.neutral_note_number_item, notes.size, notes.size) + else -> context.resources.getQuantityString(R.plurals.note_number_item, notes.size, notes.size) + } + ) notes.forEach { addLine("${it.teacher}: ${it.category}") } this }) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 486290587..282044192 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -252,6 +252,44 @@ Masz %1$d nowych uwag Masz %1$d nowych uwag + + + %d pochwała + %d pochwały + %d pochwał + %d pochwał + + + Nowa pochwała + Nowe pochwały + Nowe pochwały + Nowe pochwały + + + Masz %1$d nową pochwałę + Masz %1$d nowe pochwały + Masz %1$d nowych pochwał + Masz %1$d nowych pochwał + + + + %d neutralna uwaga + %d neutralne uwagi + %d neutralnych uwag + %d neutralnych uwag + + + Nowa neutralna uwaga + Nowe neutralne uwagi + Nowe neutralne uwagi + Nowe neutralne uwagi + + + Masz %1$d nową neutralną uwagę + Masz %1$d nowe neutralne uwagi + Masz %1$d nowych neutralnych uwag + Masz %1$d nowych neutralnych uwag + Brak zadań domowych Wykonane diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d461299da..b917ad5d1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -249,6 +249,34 @@ You received %1$d notes + + + %d praise + %d praises + + + New praise + New praises + + + You received %1$d praise + You received %1$d praises + + + + + %d neutral note + %d neutral notes + + + New neutral note + New neutral notes + + + You received %1$d neutral note + You received %1$d neutral notes + + No info about homework From c6a99f10002ea8e030940da5d2249d2105f9db77 Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sun, 27 Sep 2020 14:49:19 +0200 Subject: [PATCH 5/9] Add remembering the full screen mode in homework (#956) Co-authored-by: Faierbel --- .../preferences/PreferencesRepository.kt | 4 ++++ .../homework/details/HomeworkDetailsAdapter.kt | 4 ++++ .../homework/details/HomeworkDetailsDialog.kt | 17 +++++++++++++++-- .../details/HomeworkDetailsPresenter.kt | 10 +++++++++- .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index a6c83fc91..c76bcf1e7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -80,6 +80,10 @@ class PreferencesRepository @Inject constructor( val showTimetableTimers: Boolean get() = getBoolean(R.string.pref_key_timetable_show_timers, R.bool.pref_default_timetable_show_timers) + var isHomeworkFullscreen: Boolean + get() = getBoolean(R.string.pref_key_homework_fullscreen, R.bool.pref_default_homework_fullscreen) + set(value) = sharedPref.edit().putBoolean("homework_fullscreen", value).apply() + val showSubjectsWithoutGrades: Boolean get() = getBoolean(R.string.pref_key_subjects_without_grades, R.bool.pref_default_subjects_without_grades) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt index 5d6ee162a..cd9a7e851 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsAdapter.kt @@ -29,6 +29,8 @@ class HomeworkDetailsAdapter @Inject constructor() : attachments = value?.attachments.orEmpty() } + var isHomeworkFullscreen = false + var onAttachmentClickListener: (url: String) -> Unit = {} var onFullScreenClickListener = {} @@ -67,6 +69,8 @@ class HomeworkDetailsAdapter @Inject constructor() : homeworkDialogSubject.text = homework?.subject homeworkDialogTeacher.text = homework?.teacher homeworkDialogContent.text = homework?.content + homeworkDialogFullScreen.visibility = if (isHomeworkFullscreen) GONE else VISIBLE + homeworkDialogFullScreenExit.visibility = if (isHomeworkFullscreen) VISIBLE else GONE homeworkDialogFullScreen.setOnClickListener { homeworkDialogFullScreen.visibility = GONE homeworkDialogFullScreenExit.visibility = VISIBLE diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt index 78abfffd0..aecaa394d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt @@ -62,12 +62,25 @@ class HomeworkDetailsDialog : BaseDialogFragment(), Homew homeworkDialogClose.setOnClickListener { dismiss() } } + if (presenter.isHomeworkFullscreen) { + dialog?.window?.setLayout(MATCH_PARENT, MATCH_PARENT) + } else { + dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT) + } + with(binding.homeworkDialogRecycler) { layoutManager = LinearLayoutManager(context) adapter = detailsAdapter.apply { onAttachmentClickListener = { context.openInternetBrowser(it, ::showMessage) } - onFullScreenClickListener = { dialog?.window?.setLayout(MATCH_PARENT, MATCH_PARENT) } - onFullScreenExitClickListener = { dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT) } + onFullScreenClickListener = { + dialog?.window?.setLayout(MATCH_PARENT, MATCH_PARENT) + presenter.isHomeworkFullscreen = true + } + onFullScreenExitClickListener = { + dialog?.window?.setLayout(WRAP_CONTENT, WRAP_CONTENT) + presenter.isHomeworkFullscreen = false + } + isHomeworkFullscreen = presenter.isHomeworkFullscreen homework = this@HomeworkDetailsDialog.homework } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt index a53d38e86..e485dd748 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt @@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.homework.details import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.repositories.homework.HomeworkRepository +import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler @@ -16,9 +17,16 @@ class HomeworkDetailsPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val homeworkRepository: HomeworkRepository, - private val analytics: FirebaseAnalyticsHelper + private val analytics: FirebaseAnalyticsHelper, + private val preferencesRepository: PreferencesRepository ) : BasePresenter(errorHandler, studentRepository) { + var isHomeworkFullscreen + get() = preferencesRepository.isHomeworkFullscreen + set(value) { + preferencesRepository.isHomeworkFullscreen = value + } + override fun onAttachView(view: HomeworkDetailsView) { super.onAttachView(view) view.initView() diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index 5c6eb7d69..bb9872718 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -20,5 +20,6 @@ true no false + false false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index 1a0311b36..d948dc476 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -22,5 +22,6 @@ fill_message_content show_whole_class_plan timetable_show_timers + homework_fullscreen subjects_without_grades From d32ebd66de8b0969410437ecf637193c61d4e98c Mon Sep 17 00:00:00 2001 From: Mateusz Idziejczak Date: Sun, 27 Sep 2020 16:28:39 +0200 Subject: [PATCH 6/9] Add subjects sorting in grades (#946) --- .../preferences/PreferencesRepository.kt | 4 ++++ .../ui/modules/grade/GradeSortingMode.kt | 10 ++++++++++ .../grade/details/GradeDetailsPresenter.kt | 17 +++++++++++++++-- .../main/res/values-pl/preferences_values.xml | 4 ++++ app/src/main/res/values-pl/strings.xml | 1 + .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/preferences_values.xml | 9 +++++++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/scheme_preferences.xml | 8 ++++++++ 10 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSortingMode.kt diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index c76bcf1e7..fa12622ce 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -5,6 +5,7 @@ import android.content.SharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.grade.GradeAverageMode +import io.github.wulkanowy.ui.modules.grade.GradeSortingMode import javax.inject.Inject import javax.inject.Singleton @@ -77,6 +78,9 @@ class PreferencesRepository @Inject constructor( val showWholeClassPlan: String get() = getString(R.string.pref_key_timetable_show_whole_class, R.string.pref_default_timetable_show_whole_class) + val gradeSortingMode: GradeSortingMode + get() = GradeSortingMode.getByValue(getString(R.string.pref_key_grade_sorting_mode, R.string.pref_default_grade_sorting_mode)) + val showTimetableTimers: Boolean get() = getBoolean(R.string.pref_key_timetable_show_timers, R.bool.pref_default_timetable_show_timers) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSortingMode.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSortingMode.kt new file mode 100644 index 000000000..1e6b26e8c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeSortingMode.kt @@ -0,0 +1,10 @@ +package io.github.wulkanowy.ui.modules.grade + +enum class GradeSortingMode(val value: String) { + ALPHABETIC("alphabetic"), + DATE("date"); + + companion object { + fun getByValue(value: String) = values().firstOrNull { it.value == value } ?: ALPHABETIC + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt index 3dfa0206d..97b7b71c6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade.details +import android.annotation.SuppressLint import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.repositories.grade.GradeRepository @@ -10,6 +11,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage +import io.github.wulkanowy.ui.modules.grade.GradeSortingMode.ALPHABETIC +import io.github.wulkanowy.ui.modules.grade.GradeSortingMode.DATE import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource @@ -184,10 +187,20 @@ class GradeDetailsPresenter @Inject constructor( } } + @SuppressLint("DefaultLocale") private fun createGradeItems(items: List): List { return items - .let { if (!preferencesRepository.showSubjectsWithoutGrades) it.filter { it.grades.isNotEmpty() } else it.filter { true }} - .sortedBy { it.subject } + .let { gradesWithAverages -> + if (!preferencesRepository.showSubjectsWithoutGrades) { + gradesWithAverages.filter { it.grades.isNotEmpty() } + } else gradesWithAverages + } + .let { + when (preferencesRepository.gradeSortingMode) { + DATE -> it.sortedByDescending { gradeDetailsWithAverage -> gradeDetailsWithAverage.grades.firstOrNull()?.date } + ALPHABETIC -> it.sortedBy { gradeDetailsWithAverage -> gradeDetailsWithAverage.subject.toLowerCase() } + } + } .map { (subject, average, points, _, grades) -> val subItems = grades .sortedByDescending { it.date } diff --git a/app/src/main/res/values-pl/preferences_values.xml b/app/src/main/res/values-pl/preferences_values.xml index 1d81fb586..c57d2be54 100644 --- a/app/src/main/res/values-pl/preferences_values.xml +++ b/app/src/main/res/values-pl/preferences_values.xml @@ -29,6 +29,10 @@ 0,5 0,75 + + Alfabetycznie + Według daty + Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 282044192..330174525 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -399,6 +399,7 @@ Pokazuj lekcje całej klasy Pokazuj przedmioty bez ocen w Oceny Schemat kolorów ocen + Sortowanie przedmiotów w "Oceny" Język aplikacji Powiadomienia Pokazuj powiadomienia diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index bb9872718..d42cfc324 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -19,6 +19,7 @@ 0.33 true no + alphabetic false false false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index d948dc476..e9f9054e0 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -20,6 +20,7 @@ grade_modifier_plus grade_modifier_minus fill_message_content + grade_sorting_mode show_whole_class_plan timetable_show_timers homework_fullscreen diff --git a/app/src/main/res/values/preferences_values.xml b/app/src/main/res/values/preferences_values.xml index 5824658c4..06a9d8c4a 100644 --- a/app/src/main/res/values/preferences_values.xml +++ b/app/src/main/res/values/preferences_values.xml @@ -75,6 +75,15 @@ 0.75 + + Alphabetic + By date + + + alphabetic + date + + Dzienniczek+ Wulkanowy diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b917ad5d1..073e77385 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -415,6 +415,7 @@ Show whole class lessons Show subjects without grades in Grades Grades color scheme + Subjects sorting in "Grades" App language Notifications diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index bbb2aaeb7..99cb33669 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -62,6 +62,14 @@ app:key="@string/pref_key_grade_color_scheme" app:title="@string/pref_view_grade_color_scheme" app:useSimpleSummaryProvider="true" /> + Date: Sun, 27 Sep 2020 16:33:36 +0200 Subject: [PATCH 7/9] Show groups next to subjects in timetable (#953) --- .../preferences/PreferencesRepository.kt | 3 +++ .../ui/modules/timetable/TimetableAdapter.kt | 5 ++++ .../ui/modules/timetable/TimetableFragment.kt | 3 ++- .../modules/timetable/TimetablePresenter.kt | 1 + .../ui/modules/timetable/TimetableView.kt | 2 +- app/src/main/res/layout/item_timetable.xml | 23 +++++++++++++++---- app/src/main/res/values-pl/strings.xml | 1 + .../main/res/values/preferences_defaults.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/scheme_preferences.xml | 6 +++++ 11 files changed, 41 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt index fa12622ce..da31751a1 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt @@ -75,6 +75,9 @@ class PreferencesRepository @Inject constructor( val fillMessageContent: Boolean get() = getBoolean(R.string.pref_key_fill_message_content, R.bool.pref_default_fill_message_content) + val showGroupsInPlan: Boolean + get() = getBoolean(R.string.pref_key_timetable_show_groups, R.bool.pref_default_timetable_show_groups) + val showWholeClassPlan: String get() = getString(R.string.pref_key_timetable_show_whole_class, R.string.pref_default_timetable_show_whole_class) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt index 58be38cec..f049f828e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableAdapter.kt @@ -41,6 +41,8 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter() @@ -99,6 +101,7 @@ class TimetableAdapter @Inject constructor() : RecyclerView.Adapter(R.layout.fragme else false } - override fun updateData(data: List, showWholeClassPlanType: String, showTimetableTimers: Boolean) { + override fun updateData(data: List, showWholeClassPlanType: String, showGroupsInPlanType: Boolean, showTimetableTimers: Boolean) { with(timetableAdapter) { items = data.toMutableList() showTimers = showTimetableTimers showWholeClassPlan = showWholeClassPlanType + showGroupsInPlan = showGroupsInPlanType notifyDataSetChanged() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 8581b73c6..f924650a0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -143,6 +143,7 @@ class TimetablePresenter @Inject constructor( view?.apply { updateData( showWholeClassPlanType = prefRepository.showWholeClassPlan, + showGroupsInPlanType = prefRepository.showGroupsInPlan, showTimetableTimers = prefRepository.showTimetableTimers, data = it.data!! .filter { item -> if (prefRepository.showWholeClassPlan == "no") item.isStudentPlan else true } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt index fe34f1ee9..244120176 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableView.kt @@ -12,7 +12,7 @@ interface TimetableView : BaseView { fun initView() - fun updateData(data: List, showWholeClassPlanType: String, showTimetableTimers: Boolean) + fun updateData(data: List, showWholeClassPlanType: String, showGroupsInPlanType: Boolean, showTimetableTimers: Boolean) fun updateNavigationDay(date: String) diff --git a/app/src/main/res/layout/item_timetable.xml b/app/src/main/res/layout/item_timetable.xml index 4e278261a..ccef6e72d 100644 --- a/app/src/main/res/layout/item_timetable.xml +++ b/app/src/main/res/layout/item_timetable.xml @@ -74,7 +74,22 @@ app:layout_constraintBottom_toBottomOf="@+id/timetableItemNumber" app:layout_constraintStart_toEndOf="@+id/timetableItemTimeStart" tools:text="22" - tools:visibility="gone" /> + tools:visibility="visible" /> + + + tools:visibility="visible" /> diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 330174525..0923951ad 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -395,6 +395,7 @@ Motyw aplikacji Rozwiń oceny Oznaczaj bieżącą lekcję na planie + Pokazuj grupę obok przedmiotu na planie Pokazuj listę wykresów w ocenach klasy Pokazuj lekcje całej klasy Pokazuj przedmioty bez ocen w Oceny diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml index d42cfc324..fb82e0ed6 100644 --- a/app/src/main/res/values/preferences_defaults.xml +++ b/app/src/main/res/values/preferences_defaults.xml @@ -18,6 +18,7 @@ 0.33 0.33 true + false no alphabetic false diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index e9f9054e0..0cfa485e3 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -22,6 +22,7 @@ fill_message_content grade_sorting_mode show_whole_class_plan + show_groups_in_plan timetable_show_timers homework_fullscreen subjects_without_grades diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 073e77385..bf4727be6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -411,6 +411,7 @@ Application theme Expand grades Mark current lesson in timetable + Show groups next to subjects in timetable Show chart list in class grades Show whole class lessons Show subjects without grades in Grades diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index 99cb33669..3f24c787a 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -40,6 +40,12 @@ app:key="@string/pref_key_grade_statistics_list" app:singleLineTitle="false" app:title="@string/pref_view_grade_statistics_list" /> + Date: Sun, 27 Sep 2020 20:59:27 +0200 Subject: [PATCH 8/9] Migrate from gson to moshi (#969) --- app/build.gradle | 7 +++-- .../io/github/wulkanowy/data/db/Converters.kt | 30 ++++++++++++------- .../wulkanowy/data/pojos/Contributor.kt | 8 ++++- .../appcreator/AppCreatorRepository.kt | 11 +++---- .../main/res/layout/fragment_contributor.xml | 10 ++++--- app/src/main/res/layout/item_contributor.xml | 3 +- 6 files changed, 46 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 11a82fbd0..c0a4e9f37 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,6 +119,7 @@ ext { room = "2.2.5" chucker = "3.2.0" mockk = "1.10.0" + moshi = "1.9.3" } configurations.all { @@ -126,7 +127,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.20.5" + implementation "io.github.wulkanowy:sdk:9364c2e" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' @@ -170,7 +171,9 @@ dependencies { implementation "com.ncapdevi:frag-nav:3.3.0" implementation "com.github.YarikSOffice:lingver:1.2.2" - implementation "com.google.code.gson:gson:2.8.6" + implementation "com.squareup.moshi:moshi:$moshi" + implementation "com.squareup.moshi:moshi-adapters:$moshi" + kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi" implementation "com.jakewharton.timber:timber:4.7.1" implementation "at.favre.lib:slf4j-timber:1.0.1" implementation "fr.bipi.treessence:treessence:0.3.2" diff --git a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt index b21c4834f..834a9636a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt @@ -1,8 +1,8 @@ package io.github.wulkanowy.data.db import androidx.room.TypeConverter -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime @@ -12,6 +12,16 @@ import java.util.Date class Converters { + private val moshi by lazy { Moshi.Builder().build() } + + private val integerListAdapter by lazy { + moshi.adapter>(Types.newParameterizedType(List::class.java, Integer::class.java)) + } + + private val stringMapAdapter by lazy { + moshi.adapter>(Types.newParameterizedType(MutableMap::class.java, String::class.java, String::class.java)) + } + @TypeConverter fun timestampToDate(value: Long?): LocalDate? = value?.run { Date(value).toInstant().atZone(ZoneOffset.UTC).toLocalDate() @@ -39,22 +49,22 @@ class Converters { fun intToMonth(value: Int?) = value?.let { Month.of(it) } @TypeConverter - fun intListToGson(list: List): String { - return Gson().toJson(list) + fun intListToJson(list: List): String { + return integerListAdapter.toJson(list) } @TypeConverter - fun gsonToIntList(value: String): List { - return Gson().fromJson(value, object : TypeToken>() {}.type) + fun jsonToIntList(value: String): List { + return integerListAdapter.fromJson(value).orEmpty() } @TypeConverter - fun stringPairListToGson(list: List>): String { - return Gson().toJson(list) + fun stringPairListToJson(list: List>): String { + return stringMapAdapter.toJson(list.toMap()) } @TypeConverter - fun gsonToStringPairList(value: String): List> { - return Gson().fromJson(value, object : TypeToken>>() {}.type) + fun jsonToStringPairList(value: String): List> { + return stringMapAdapter.fromJson(value).orEmpty().toList() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt b/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt index e792bde46..d2338c281 100644 --- a/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt +++ b/app/src/main/java/io/github/wulkanowy/data/pojos/Contributor.kt @@ -1,3 +1,9 @@ package io.github.wulkanowy.data.pojos -class Contributor(val displayName: String, val githubUsername: String) +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +class Contributor( + val displayName: String, + val githubUsername: String +) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt index d19565579..ff538969b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt @@ -1,7 +1,8 @@ package io.github.wulkanowy.data.repositories.appcreator import android.content.res.AssetManager -import com.google.gson.Gson +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types import io.github.wulkanowy.data.pojos.Contributor import io.github.wulkanowy.utils.DispatchersProvider import kotlinx.coroutines.withContext @@ -15,9 +16,9 @@ class AppCreatorRepository @Inject constructor( ) { suspend fun getAppCreators() = withContext(dispatchers.backgroundThread) { - Gson().fromJson( - assets.open("contributors.json").bufferedReader().use { it.readText() }, - Array::class.java - ).toList() + val moshi = Moshi.Builder().build() + val type = Types.newParameterizedType(List::class.java, Contributor::class.java) + val adapter = moshi.adapter>(type) + adapter.fromJson(assets.open("contributors.json").bufferedReader().use { it.readText() }) } } diff --git a/app/src/main/res/layout/fragment_contributor.xml b/app/src/main/res/layout/fragment_contributor.xml index 399ab5999..d913c5a4d 100644 --- a/app/src/main/res/layout/fragment_contributor.xml +++ b/app/src/main/res/layout/fragment_contributor.xml @@ -1,5 +1,6 @@ @@ -20,17 +21,18 @@ android:id="@+id/creatorRecycler" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="1" /> + android:layout_weight="1" + tools:listitem="@layout/item_contributor" /> diff --git a/app/src/main/res/layout/item_contributor.xml b/app/src/main/res/layout/item_contributor.xml index 36eb64ecc..9b1263438 100644 --- a/app/src/main/res/layout/item_contributor.xml +++ b/app/src/main/res/layout/item_contributor.xml @@ -15,7 +15,8 @@ android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" - android:contentDescription="@string/contributor_avatar_description" /> + android:contentDescription="@string/contributor_avatar_description" + tools:src="@tools:sample/avatars" /> Date: Sun, 27 Sep 2020 22:11:55 +0200 Subject: [PATCH 9/9] Version 0.21.0 --- .travis.yml | 2 +- app/build.gradle | 6 +++--- app/src/main/play/release-notes/pl-PL/default.txt | 11 ++++++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45818739f..c2361d66c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ cache: branches: only: - develop - - 0.20.5 + - 0.21.0 android: licenses: diff --git a/app/build.gradle b/app/build.gradle index c0a4e9f37..0dd315277 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { testApplicationId "io.github.tests.wulkanowy" minSdkVersion 17 targetSdkVersion 29 - versionCode 69 - versionName "0.20.5" + versionCode 70 + versionName "0.21.0" multiDexEnabled true resValue "string", "app_name", "Wulkanowy" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -127,7 +127,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:9364c2e" + implementation "io.github.wulkanowy:sdk:0.21.0" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 62a71f437..09f44931d 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,5 +1,10 @@ -Wersja 0.20.5 -- naprawiliśmy logowanie do koszalińskiego dziennika -- naprawiliśmy resetowanie hasła na gdańskim dzienniku +Wersja 0.21.0 +- naprawiliśmy logowanie do tarnowskiego dziennika +- naprawiliśmy wyświetlanie podsumowania punktów klasy +- dodaliśmy skróty aplikacji +- dodaliśmy opcję pokazywania nazwy grupy w planie lekcji na liście +- dodaliśmy opcję pokazywania w ocenach przedmiotów bez ocen +- dodaliśmy dodatkowe opcje sortowania ocen +- dodaliśmy rozróżnianie powiadomień dla pochwał i uwag Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases