From c064164858f71ba3a9ce42722f4fd85eb6c27803 Mon Sep 17 00:00:00 2001 From: Deniz Duezgoeren Date: Sat, 21 Sep 2019 14:04:49 +0200 Subject: [PATCH] Added login and setup screens --- AvH Plan.xcodeproj/project.pbxproj | 12 + .../ic_idea_psa.imageset/Contents.json | 23 ++ .../ic_idea_psa.imageset/idea1x.png | Bin 0 -> 2090 bytes .../ic_idea_psa.imageset/idea2x.png | Bin 0 -> 4782 bytes .../ic_idea_psa.imageset/idea3x.png | Bin 0 -> 7940 bytes .../ic_idea_psa_white.imageset/Contents.json | 23 ++ .../whiteidea1x.png | Bin 0 -> 2714 bytes .../whiteidea2x.png | Bin 0 -> 5958 bytes .../whiteidea3x.png | Bin 0 -> 8064 bytes AvH Plan/Base.lproj/Main.storyboard | 264 +++++++++++++++++- AvH Plan/CustomizationViewController.swift | 13 +- AvH Plan/DataFetcher.swift | 7 + AvH Plan/FirstTimeViewController.swift | 51 ++++ AvH Plan/LoginViewController.swift | 41 +++ AvH Plan/PersonalPlanViewController.swift | 2 - AvH Plan/PlanViewController.swift | 29 +- 16 files changed, 442 insertions(+), 23 deletions(-) create mode 100644 AvH Plan/Assets.xcassets/ic_idea_psa.imageset/Contents.json create mode 100644 AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea1x.png create mode 100644 AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea2x.png create mode 100644 AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea3x.png create mode 100644 AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/Contents.json create mode 100644 AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/whiteidea1x.png create mode 100644 AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/whiteidea2x.png create mode 100644 AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/whiteidea3x.png create mode 100644 AvH Plan/FirstTimeViewController.swift create mode 100644 AvH Plan/LoginViewController.swift diff --git a/AvH Plan.xcodeproj/project.pbxproj b/AvH Plan.xcodeproj/project.pbxproj index 648c932..96ef2d0 100644 --- a/AvH Plan.xcodeproj/project.pbxproj +++ b/AvH Plan.xcodeproj/project.pbxproj @@ -9,6 +9,9 @@ /* Begin PBXBuildFile section */ 1BF3A6CA97BA41C38482C1A6 /* Pods_AvH_PlanTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9D6269E96544A9242A29611 /* Pods_AvH_PlanTests.framework */; }; 2E65263AFD35D6B542E89AE4 /* Pods_AvH_Plan.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7605BB0678C9E27A1D3E9DAA /* Pods_AvH_Plan.framework */; }; + A9378D352336015000C07D07 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9378D342336015000C07D07 /* LoginViewController.swift */; }; + A9378D37233619F300C07D07 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9378D36233619F300C07D07 /* WebKit.framework */; }; + A9378D392336300700C07D07 /* FirstTimeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9378D382336300700C07D07 /* FirstTimeViewController.swift */; }; A957A75122DDC15500E0A2ED /* MenuViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A957A74F22DDC15500E0A2ED /* MenuViewCell.swift */; }; A957A75222DDC15500E0A2ED /* MenuViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A957A75022DDC15500E0A2ED /* MenuViewCell.xib */; }; A958A92222DF5388007052B0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A958A92422DF5388007052B0 /* Localizable.strings */; }; @@ -70,6 +73,9 @@ 589FBD2CE6A9C73CD9B81441 /* Pods-AvH PlanUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AvH PlanUITests.release.xcconfig"; path = "Target Support Files/Pods-AvH PlanUITests/Pods-AvH PlanUITests.release.xcconfig"; sourceTree = ""; }; 74EDE3D8134812AB76BEB988 /* Pods_AvH_PlanUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AvH_PlanUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7605BB0678C9E27A1D3E9DAA /* Pods_AvH_Plan.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AvH_Plan.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A9378D342336015000C07D07 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + A9378D36233619F300C07D07 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + A9378D382336300700C07D07 /* FirstTimeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstTimeViewController.swift; sourceTree = ""; }; A957A74F22DDC15500E0A2ED /* MenuViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuViewCell.swift; sourceTree = ""; }; A957A75022DDC15500E0A2ED /* MenuViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MenuViewCell.xib; sourceTree = ""; }; A958A92322DF5388007052B0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; @@ -117,6 +123,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + A9378D37233619F300C07D07 /* WebKit.framework in Frameworks */, 2E65263AFD35D6B542E89AE4 /* Pods_AvH_Plan.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -156,6 +163,7 @@ A7F8C8C9CE4E171D98EE659D /* Frameworks */ = { isa = PBXGroup; children = ( + A9378D36233619F300C07D07 /* WebKit.framework */, 7605BB0678C9E27A1D3E9DAA /* Pods_AvH_Plan.framework */, D9D6269E96544A9242A29611 /* Pods_AvH_PlanTests.framework */, 74EDE3D8134812AB76BEB988 /* Pods_AvH_PlanUITests.framework */, @@ -212,6 +220,8 @@ A9B0465322E448EC005FB0DB /* GenericViewCell.swift */, A9B033D622E4D0AB009ACF8A /* ColourViewCell.swift */, A9B033D722E4D0AB009ACF8A /* ColourViewCell.xib */, + A9378D342336015000C07D07 /* LoginViewController.swift */, + A9378D382336300700C07D07 /* FirstTimeViewController.swift */, ); path = "AvH Plan"; sourceTree = ""; @@ -483,6 +493,7 @@ A9B0465422E448EC005FB0DB /* GenericViewCell.swift in Sources */, A9B0464E22E1F75A005FB0DB /* CustomizationViewController.swift in Sources */, A96133802299867400B541D4 /* AppDelegate.swift in Sources */, + A9378D352336015000C07D07 /* LoginViewController.swift in Sources */, A9A3496C22D4859200F35AE0 /* SubstModel.swift in Sources */, A9C1D30022D656DD00139043 /* MenuViewController.swift in Sources */, A957A75122DDC15500E0A2ED /* MenuViewCell.swift in Sources */, @@ -493,6 +504,7 @@ A9C1D30222D7237200139043 /* DataFetcher.swift in Sources */, A96D4CCA22DDE184006BAB34 /* PersonalPlanViewController.swift in Sources */, A9B033D822E4D0AB009ACF8A /* ColourViewCell.swift in Sources */, + A9378D392336300700C07D07 /* FirstTimeViewController.swift in Sources */, A9B0465022E21207005FB0DB /* ColourPickerView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/Contents.json b/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/Contents.json new file mode 100644 index 0000000..16b7390 --- /dev/null +++ b/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "idea1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "idea2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "idea3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea1x.png b/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea1x.png new file mode 100644 index 0000000000000000000000000000000000000000..bed348fdcb502b93fe9f445c1d463795c1ff1436 GIT binary patch literal 2090 zcmV+_2-WwAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vRa*8l^p*8xDmy?X!v2fs-~K~#8N?VV-F zEkzi|uif1p*X|C)Kn(0wP%u#ZpjZgv2R{iS3Mz;VCWO`RWY%!TkNj?&vy?j z%X4<-Jv+PSne(0>{Mh$?xo2i)W8#@-XPTA=lygJ5ja)^pD3_N@$OYsa5`L54%P-^y zg>TD8#_}@xt+Y;T3cr*W$#vwIK5QlL zlz&U>B(@>Hb*tne7*nv4yk2(M5LN$@SIK4Ml;$|u=A&t{@+dn>PC1s8_ekrcc#y}~ zqH;>Gg?v|9C&H7j%k^cabUhB)Q_}Th>@X;ttheOzlCCV{4#pqUh4ILOk}=9Ak}*q@ zI({P$k`Mj=uMvZa{VJZjYlf~=k9Wbw0^sv-^op7)=ZZ? z=dB7_{v?l;v&puZU7jqt`mM59(ivG+X34B_GLHvd(rd}C*+{-Btuk3YAZL-;afY-i zWOmL2`Qg{1P_F!Ixdz(f#d>_Dxo`?I`2L4r!U@=))mx~D`^dx8;s;bcm9jg z73)f?pk?onxk4A+s#96kUK*3?k+n;4tb^&1T)C?_*0FVQY(%OC;SQ;TTb>?EuG}cO z3+f1+gHCx_R&U|5Or_+`OVX-aPiD3olj06xDth&aKl?HY4e~;9><6*Oji=>PGzfui zy>%q5qe_;YYlGzgLCAwDXOIrDyTtYfL-I4~(1gvgE%M2+OmhsCju zg^T0Bq-c=&ienu=6vvz)S+$Lx7dFI@Xp+)(eINGr22I z{Mi>GP#Tk}L6`{*5wm9El>>`o9ifY|Q+R2ImN}o5xe^M-W(RT16jG;z-XplJ%#A&y zRhP04$|R(EWWjyKv5w=5V@{k<9P7BfIJ$z+&_ASg1(jt-RW8Kb9mJY7o_22w0vW7A zm!&t7!`v2&ZZR8qE|+fEL0W~bdaCr!+0rU|)y<`A*g0zzyezkQlCYVUpo<>!_{}1; zi6mp8E-;c@%;S~>rg_*dVU@Wob<8G<&~?(PL{+vw$E-MZ1}MNN#cPlxl&pcvOH1_i({l!CQEXz zWD8Lk&q%9cRq1(cFS}-E8M}p>9wY&ASwmzaJu0h$Rap-1a)%Ya71N_aHX4mg3cxL8 zYyui4DZ97|8HqCkZIz)afgBsikzzj?o9MEO=QQ0`>$j^?=3V7Ta*DJnU6nysn+sZd z$=Hh{X0|tLu8>y6s}jx9I9AqR5gGeVyF|8;v&$7cyUE3Foq(!L@TKNbY5i8!hh_FX zs#sX^jk!vh;7gfxhnd;XzH?+GP9n`I1yl9J!dfS!?A0%^2jQ#OVC^49-dmKDNz<&=gru-3^bONeHZRI!BU#3Z{M z+406?iAk2(a5nQ5=Vkrv?e_ zRivzgY&&M|Dg>X|bAhLcGkQYjPW;&yq8=x^)0GLzP%ak2dE6x-8#X6O>xJ8eoqtKE zAD$jrBR|a@gQo@=BRn<8FuR>Dy1d}2L6~G52CTWTHZ!II7YA9}te0+^W)-8`HH^l) z{Kg@(0}DwvcyUV!#nKM zC7qu2h)F5$tC9IOVOyLgt&`W5Jg&x#(g$X9`OK+x;@Xsy7;YZjp2i`BjuQ0HHT3La zrszAtQ-iei0*_%7azZAD-LJ6$&?zNKk*|`DF__F2xKth?$Mk{VW-p1Dk+IqH=&h<&zIE!d%yf%mh-C{Dk5k(RU)9UOqxk)lzGA0pxu#&8w)}trJ zccl9yF}Xk%x|l>TA^FgLcG(v^5)-u^tGkzY6;A`hex%qN(qnpYbW08m5|ivdmd45Q z+a`wwNtW?bgyM(CM8Je2V+QM;Fc~kDV-i7PvD0Pj{_>uT_-DwYrH7nc0j5p+4_Jl! Ul-kR+j{pDw07*qoM6N<$f;J)V#Q*>R literal 0 HcmV?d00001 diff --git a/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea2x.png b/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6332ea8873fe782a1fa62be0116ebf454d3f289a GIT binary patch literal 4782 zcmV;f5>f4mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vRa*8l^p*8xDmy?X!v5<^KuK~#8N?VSg# zEmakUp9+eIQUnA+1qB5al-@)%1_UW0V2LziECdq_1Wd$+Ac-bo)L0P#4Y5RupaKF4 z(v;qd6h(?42m&JZ@_+B1>pQ%=x%bZOb!PU={9p3r+)Lu~+&!~rc3FF^rz|j&;%V}^ z@_BOQk!#2o$>&S{`wDV7xr}^adpO$M%V?k zW$LCZS%ze%$#+WTLB@nY$M}xCSN=<;ZoV!_=e}EhRkBcEOl6)fx0c69p1i3Wtq(HE zXQ;S|TtXT%Coh*waG6`AZmPb?{E21a6XojCm?W%59VL0Hrf#Gm_-A>T^c= zmG{XKSEHJi)i35K@0T8S4Hz!|mhx=rjxkdfBuwnFij6&x0rp6KJ0>*BD?V?$liC7zP~C7D*U>9?ZV&6ft!r|7WN$;m%Q2Nz|&#s zgv~E0IU~YN_-whfEbV&zNPbZMcHwV5q|Y6M<;fq&7ccy+UAXZHJ-|0>z%2X1fR>B1E z*`aR=hF>p`J4sFzwh@m1Yxxps3WcZF=8`kpsS7v>|1N(eKO#AAUJAsO9Vr?9FpNum z_esbBGKPVsKzPMB**Sh88Om|Qw#1Npf8E1vXEQmh8i%{^kf-y5?+&L*`q8F*eJnlU%W3?7o34VZR|7 zjuo@0!NfZCw@1iuZhvW7fXU~ij>WRO{bflESKlGaBS|SH6{p7j3=!0(K^RLjCrDk8 zT>mJESmg;j6xgYMkDSzTVH^f2_@%R?*X}YV~nduyvR?M@}MnI+AC1MQPHo!gYy^ ze3MYq#H(7tFoBE?C1Lm7!>YOA&{_1b_B>f){8}fWArF?RhOR5;H5_$1f7nnYVMD4d z>$~m};O*M9xkwaXL2~d8{WO9&fx$fV{RHN3Ba}b^s=ELxm2;Ed0*YSKgiKG_2=N&TQ^c!R5Z%Y#g51Jp#RC`yI z5R^@&smM=dszIyDIM)?kFO$A7b7L_XW2by>N|ZY=ljWl_VxQ^)>B;&$ zAah7W>E-Jr8Bfe)SyxhXC3Ov|$b6=_%#088Y%hVI5iVUyVM={O71Uq6;7nMn~I37C}jGkcb+01UPam)U*TH;(s~yV{N!634|L5h$<}h6^(6kGieYwlM8;w3&r<4xD*p(o~9PX13PyJ|Gg!DkU!(4XeiA{rF4*p@B&JuQTWER3!8-z*MZ!?ty4+|i8vBV z$Ter!O}p^+;9-?Z?vOi#QaVUP)D~h=k5sy_$2Z>0m@aX8%v=50Kaw($dXDJ;dB0nqVKuj4B6PHU7Ih0H3 zAQ9gq;;@d1fg{hk6p<#jlnxSs^X`^IZ>~it9VFuE@3IEv5RsLJu=my}rGrF-h%7z& zH0=|y0u?cj$)=PJ^2q2j2bc3Ihlt9-x$#^fl+r;WmIa+fu^b{IBZ`R3E~SHzWI7io ziYtdTMxQxEJT$W@rGwlx`pkjD{$9yyA5!*2^u6* zfysF>`OQk|Ae>{4XqauKBYT^N0L6%h6Zb(xY+eW@br3=es85&+Ies0N)jXt*jY!pV zy(}V<7fR|Nj6YAB`Y{VaPN-63n&tH}qOQl!CHI0!K$t>qeF?l)Ixed@XzN>L>RMEh z&0=r%&H*((QjJ&DhAR70EK5TXV$B4R30WOsB3v6^ZCBA|G$*aJHP4j8r35^;^;3nrW&%UXGmu}iH8Gf1em7Uys8|z z&W!*b97oAiV^)<-r=6vV-bF>ktBQQ5OZ~wOtoW0SZGHTTd>1cjf1;CQ;c{0_= zb!64#Gtyxw^M|?H@iJ=91KGs&H3;IBGIHEY7L^Z4NBqtWM&hucCY~k@dr=&NPPJWKFPBA> zcH_4*s){?wf(6UVs1WvXNet+4p9Wy%De8#lxU7= zq}m`yY7BahsQ{QSd|XC`qD*_7?DNXjBx0DEr1+B;_Vje{+tU@o+KKLSfE8=t%0qAJa*UNAwp

Tk@EC3nZPbpXcJTgu1~Z6wg{ z!?NqJX%{{3Ahpt_(v$KIv5$=IB-~hCK11>b$<3Vl+v>_3jiq+eF-RrzNtwE+ITGdC z#r+Y6Kex!#-<0E_(h<5Hg;)MDGIB`4((e(nOT!7iYxFWWL(Ze6J4eUiY0pzXb&>1J zMp&1ITEtmVy(#s#)RpWo%SzJ&s9SiWOkL=@o-ezQK4?|>Ynl2R>Ux`8OPU_Bjf^PF zGc7|55*m~a*;^t**eOipY=}LCaX58HB8r4gOF&-9Rgu<|gzu-mdmZU$2g;JFBbz{& zP!fL>Ia&RpEb)dR7V0N5^_}a=-|9ruJ%=a$6*6@L)RA5LHDqZpq>L&bfkO%ZH)0(b zb$X7s(Whi-d{3snZylL$Z6eKp;QV#ee1skQlH!oKnYpP`-?geN57Sm=U~o=4GH8!% zASJ-u<7YDU9qV|ebolx}VW{V`c_dtxM6$rUBk6BT@&QCfg`2Mp(%`GWDIR z$mZg!r4f#)S;PgBERDI4+<^?~P4hCj!qkshP@A4PnGxsbE`KoIj6Fe8N(f9CO633F?iD{{|TANg$+hBNSZO+ zL1w~D!aO7gcITTU;yeneNXgY}#&8Fj2{%dZIGmCRO-8^*9Q&n%kRHj5;SMqrhF1h0 z=F(&y--!JWmbuMhxP#1uw+GR^xln7oDI(GjF-bRz;dq;wFg&_SzI5Sl^*L5@o}vl1 zm(&@|;r)_KiN?$dyV22!*1F)krCAIQvC?qE3=L1v6S#vIGYjq@X*@SG3vmZAW)|E* zjF|;@5MyS+9VE>VSFub2caWK|+(}NTq2W`63EV+uLI)xAduZG~`ZQy>gQPim^f?rW z3Z?T7*ij=L8`&fileP$5$Rgnu~W|Q%E=i_D3mhT zN`6B=EXOChU6T+RYQ$5uw&~nmrl(K?J+dHw39>oJ&UtR42Qy&U2O*hr>IUnJ_scD$ zF_qa&&HXVY!j+^8Uc89Q8c!=~++th-k&x<9&eW{zP%MzK)abh2NFj;Vl@CezbISCW;Z6td>W)}SP zm_O_`?>ZWbOuShT9nj+wME}My|8?`N& zyzefJX&rKAG5$~8sBQWa$%28&z%e-aY$}(T`mre1mCja@i91L>%s)z8E`Oe655{ER z4wBEaN1vrZ897hXGjRvWhxtc|5M0S*-DKbnlFxOc&(dJonO%01fjdY(r0y*7Epol| zDM8aZjP;3yN-edv>5kHvB4A1NE}6Pfo0fUU*Q7B;v7IcTz|N`Cu~?=^UL&cB+eX=F zYMvAF?!6CFG*rRmy!W>xS<@#O`p#1BCGudorgR#oP!=rsAB@^v|NaK?I{*Lx07*qo IM6N<$f)%z5dH?_b literal 0 HcmV?d00001 diff --git a/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea3x.png b/AvH Plan/Assets.xcassets/ic_idea_psa.imageset/idea3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc65a68877af3d5e503450bb93f282451ea224fe GIT binary patch literal 7940 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 W)|Dp{-7CQ4ngd~B2d_2riu*q+`Ycoc literal 0 HcmV?d00001 diff --git a/AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/Contents.json b/AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/Contents.json new file mode 100644 index 0000000..a6faa93 --- /dev/null +++ b/AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "whiteidea1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "whiteidea2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "whiteidea3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/whiteidea1x.png b/AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/whiteidea1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4196b92ff82c446348ab183c29c88f58e71c0a0d GIT binary patch literal 2714 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 literal 0 HcmV?d00001 diff --git a/AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/whiteidea3x.png b/AvH Plan/Assets.xcassets/ic_idea_psa_white.imageset/whiteidea3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d8040bf9b97fbad5f6ae875b4141d969995acf49 GIT binary patch literal 8064 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 v?Y?~2-RI`iLUXq}E=-UsCSR>><}c@E# - + - + @@ -356,7 +356,7 @@ - + @@ -445,6 +445,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AvH Plan/CustomizationViewController.swift b/AvH Plan/CustomizationViewController.swift index c409085..999e3b3 100644 --- a/AvH Plan/CustomizationViewController.swift +++ b/AvH Plan/CustomizationViewController.swift @@ -32,11 +32,11 @@ class CustomizationViewController: UIViewController, UICollectionViewDataSource, } @IBAction func groupHelpButton(_ sender: UIButton) { - self.present(self.getAlert(for: "grade"), animated: true) + self.present(self.df.getInfoAlert(for: "grade"), animated: true) } @IBAction func courseHelpButton(_ sender: UIButton) { - self.present(self.getAlert(for: "course"), animated: true) + self.present(self.df.getInfoAlert(for: "course"), animated: true) } func textFieldDidBeginEditing(_ textField: UITextField) { @@ -73,7 +73,7 @@ class CustomizationViewController: UIViewController, UICollectionViewDataSource, self.txtCourses.text = prefs.string(forKey: "courses") self.defaultSegments.selectedSegmentIndex = prefs.integer(forKey: "default-plan") - NotificationCenter.default.addObserver(self, selector: #selector(loadList), name:NSNotification.Name(rawValue: "load"), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "load"), object: nil) } @objc func loadList(notification: NSNotification){ @@ -137,11 +137,4 @@ class CustomizationViewController: UIViewController, UICollectionViewDataSource, cell.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) return cell } - - func getAlert(for type: String) -> UIAlertController { - let alert = UIAlertController(title: NSLocalizedString("enter_\(type)_title", comment: ""), message: NSLocalizedString("enter_\(type)_help", comment: ""), preferredStyle: .alert) - alert.addAction(UIAlertAction(title: NSLocalizedString("dismiss", comment: ""), style: .default) { action in - }) - return alert - } } diff --git a/AvH Plan/DataFetcher.swift b/AvH Plan/DataFetcher.swift index f208f5a..928ebb0 100644 --- a/AvH Plan/DataFetcher.swift +++ b/AvH Plan/DataFetcher.swift @@ -400,4 +400,11 @@ class DataFetcher { return nil } } + + func getInfoAlert(for type: String) -> UIAlertController { + let alert = UIAlertController(title: NSLocalizedString("enter_\(type)_title", comment: ""), message: NSLocalizedString("enter_\(type)_help", comment: ""), preferredStyle: .alert) + alert.addAction(UIAlertAction(title: NSLocalizedString("dismiss", comment: ""), style: .default) { action in + }) + return alert + } } diff --git a/AvH Plan/FirstTimeViewController.swift b/AvH Plan/FirstTimeViewController.swift new file mode 100644 index 0000000..bd97998 --- /dev/null +++ b/AvH Plan/FirstTimeViewController.swift @@ -0,0 +1,51 @@ +// +// FirstTimeViewController.swift +// AvH Plan +// +// Created by Deniz Duezgoeren on 21.09.19. +// Copyright © 2019 Deniz Duezgoeren. All rights reserved. +// + +import UIKit + +class FirstTimeViewController: UIViewController { + + + @IBOutlet weak var scrollView: UIScrollView! + let df = DataFetcher.sharedInstance + let prefs = UserDefaults.standard + + @IBAction func gradeInfoButton(_ sender: UIButton) { + self.present(self.df.getInfoAlert(for: "grade"), animated: true) + } + + @IBAction func courseInfoButton(_ sender: UIButton) { + self.present(self.df.getInfoAlert(for: "course"), animated: true) + } + + @IBOutlet weak var nameTextField: UITextField! + @IBOutlet weak var gradeTextField: UITextField! + @IBOutlet weak var courseTextField: UITextField! + @IBOutlet weak var defaultPlanSegmentedControl: UISegmentedControl! + + @IBAction func finishSetupButton(_ sender: UIBarButtonItem) { + self.prefs.set(self.nameTextField.text, forKey: "username") + self.prefs.set(self.gradeTextField.text, forKey: "classes") + self.prefs.set(self.courseTextField.text, forKey: "courses") + self.prefs.set(self.defaultPlanSegmentedControl.selectedSegmentIndex, forKey: "default-plan") + self.prefs.set(true, forKey: "setup_finished") + self.prefs.synchronize() + + if let s = storyboard?.instantiateViewController(withIdentifier: "AppTabBarController") as? CustomTabBarController { + self.present(s, animated: true) + } + } + + + override func viewDidLoad() { + super.viewDidLoad() + + self.scrollView.isDirectionalLockEnabled = true + } + +} diff --git a/AvH Plan/LoginViewController.swift b/AvH Plan/LoginViewController.swift new file mode 100644 index 0000000..57f28cb --- /dev/null +++ b/AvH Plan/LoginViewController.swift @@ -0,0 +1,41 @@ +// +// LoginViewController.swift +// AvH Plan +// +// Created by Deniz Duezgoeren on 21.09.19. +// Copyright © 2019 Deniz Duezgoeren. All rights reserved. +// + +import UIKit +import WebKit + +class LoginViewController: UIViewController, WKNavigationDelegate { + + @IBOutlet weak var webView: WKWebView! + let prefs = UserDefaults.standard + + override func viewDidLoad() { + super.viewDidLoad() + + let request = URLRequest(url: URL(string: "https://307.joomla.schule.bremen.de/index.php/component/users/#top")!) + self.webView.load(request) + self.webView.navigationDelegate = self + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + self.webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in + for cookie in cookies { + if cookie.name == "joomla_user_state" && cookie.value == "logged_in" { + self.success() + } + } + } + } + + private func success() { + self.prefs.set(true, forKey: "logged_in") + if let s = storyboard?.instantiateViewController(withIdentifier: "FirstTime") as? UINavigationController { + self.present(s, animated: true) + } + } +} diff --git a/AvH Plan/PersonalPlanViewController.swift b/AvH Plan/PersonalPlanViewController.swift index ebf9095..5f9e45f 100644 --- a/AvH Plan/PersonalPlanViewController.swift +++ b/AvH Plan/PersonalPlanViewController.swift @@ -10,8 +10,6 @@ import UIKit class PersonalPlanViewController: PlanViewController { - let prefs = UserDefaults.standard - @IBAction func customize(_ sender: UIBarButtonItem) { if let s = storyboard?.instantiateViewController(withIdentifier: "Customize") as? CustomizationViewController { self.present(s, animated: true) diff --git a/AvH Plan/PlanViewController.swift b/AvH Plan/PlanViewController.swift index 63ffc23..2836940 100644 --- a/AvH Plan/PlanViewController.swift +++ b/AvH Plan/PlanViewController.swift @@ -21,6 +21,7 @@ class PlanViewController : UICollectionViewController, UICollectionViewDelegateM var url = "" var indexOfPSA: Int? = nil let cancellations = ["eigenverantwortliches arbeiten", "entfall", "entfällt", "fällt aus", "freisetzung", "vtr. ohne lehrer"] + let prefs = UserDefaults.standard required init?(coder decoder: NSCoder) { super.init(coder: decoder) @@ -28,12 +29,26 @@ class PlanViewController : UICollectionViewController, UICollectionViewDelegateM } override func viewWillAppear(_ animated: Bool) { + + + if !self.prefs.bool(forKey: "logged_in") { + if let s = storyboard?.instantiateViewController(withIdentifier: "Login") as? UINavigationController { + self.present(s, animated: true) + } + } else if !self.prefs.bool(forKey: "setup_finished") { + if let s = storyboard?.instantiateViewController(withIdentifier: "FirstTime") as? UINavigationController { + self.present(s, animated: true) + } + } + super.viewWillAppear(animated) - Messaging.messaging().subscribe(toTopic: "substitutions-ios") - Messaging.messaging().subscribe(toTopic: "substitutions-broadcast") - Crashlytics.sharedInstance().setUserIdentifier(UserDefaults.standard.string(forKey: "username")) - // check if these can be put in AppDelegate + if self.prefs.bool(forKey: "logged_in") { + Messaging.messaging().subscribe(toTopic: "substitutions-ios") + Messaging.messaging().subscribe(toTopic: "substitutions-broadcast") + Crashlytics.sharedInstance().setUserIdentifier(UserDefaults.standard.string(forKey: "username")) + // check if these can be put in AppDelegate + } view.addSubview(collectionView) collectionView.translatesAutoresizingMaskIntoConstraints = true @@ -65,6 +80,7 @@ class PlanViewController : UICollectionViewController, UICollectionViewDelegateM override func viewDidLoad() { super.viewDidLoad() + self.extendedLayoutIncludesOpaqueBars = true self.collectionView.contentInsetAdjustmentBehavior = .always self.df.setTabBarBadge(for: self.tabBarController?.tabBar.items) @@ -128,7 +144,7 @@ class PlanViewController : UICollectionViewController, UICollectionViewDelegateM url = "\(dateString[dateString.index(dateString.startIndex, offsetBy: 3)...])" indexOfPSA = indexPath.item } - image = UIImage(named: "ic_idea_w") + image = UIImage(named: "ic_idea_psa_white") cell.tintView.backgroundColor = #colorLiteral(red: 0, green: 0.4784313725, blue: 1, alpha: 1) cell.group.textColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) cell.course.textColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) @@ -195,9 +211,6 @@ class PlanViewController : UICollectionViewController, UICollectionViewDelegateM courseImage.append(NSAttributedString(string: " ")) let courseString = mutableStrings[2] courseImage.append(courseString) - if psa == true { - courseImage.addAttribute(NSAttributedString.Key.foregroundColor, value: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0), range: NSMakeRange(0, 3)) - } courseText = courseImage } else {