From 9fea8e3bc481add6cb5f9b8b1a51bb92e9d97bfe Mon Sep 17 00:00:00 2001 From: ElEgEv <112943269+ElEgEv@users.noreply.github.com> Date: Tue, 12 Dec 2023 01:06:48 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A7=D1=91-=D1=82=D0=BE=20=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../8.0/executionHistory/executionHistory.bin | Bin 3638452 -> 3796296 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes compose/.gradle/8.0/fileHashes/fileHashes.bin | Bin 441241 -> 448441 bytes .../.gradle/8.0/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.0/fileHashes/resourceHashesCache.bin | Bin 396763 -> 402917 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../buildOutputCleanup/outputFiles.bin | Bin 1328138 -> 1331234 bytes compose/.gradle/file-system.probe | Bin 8 -> 8 bytes compose/.idea/modules/app/pmu-demo.app.iml | 8 - .../ru/ulstu/is/pmu/tank/api/ApiRoutes.kt | 11 ++ .../ru/ulstu/is/pmu/tank/api/ServerService.kt | 184 ++++++++++++++++++ .../tank/api/mediator/NationRemoteMediator.kt | 111 +++++++++++ .../is/pmu/tank/api/model/LevelRemote.kt | 22 +++ .../is/pmu/tank/api/model/NationRemote.kt | 20 ++ .../ulstu/is/pmu/tank/api/model/TankRemote.kt | 38 ++++ .../api/model/TankWithNationAndLevelRemote.kt | 34 ++++ .../ulstu/is/pmu/tank/api/model/UserRemote.kt | 33 ++++ .../tank/api/model/UserTankCrossRefRemote.kt | 9 + .../api/repository/RestLevelRepository.kt | 51 +++++ .../api/repository/RestNationRepository.kt | 84 ++++++++ .../api/repository/RestTankReppository.kt | 66 +++++++ .../tank/api/repository/RestUserRepository.kt | 44 +++++ .../ulstu/is/pmu/tank/composeui/TankList.kt | 4 +- .../tank/composeui/edit/TankEditViewModel.kt | 2 - .../tank/composeui/edit/UserEditViewModel.kt | 17 +- .../tank/composeui/list/TankListViewModel.kt | 21 +- .../java/ru/ulstu/is/pmu/tank/dao/LevelDao.kt | 9 +- .../ru/ulstu/is/pmu/tank/dao/NationDao.kt | 9 + .../ru/ulstu/is/pmu/tank/dao/RemoteKeysDao.kt | 20 ++ .../java/ru/ulstu/is/pmu/tank/dao/TankDao.kt | 18 +- .../java/ru/ulstu/is/pmu/tank/dao/UserDao.kt | 7 +- .../ulstu/is/pmu/tank/database/AppDatabase.kt | 22 +-- .../ru/ulstu/is/pmu/tank/model/RemoteKeys.kt | 25 +++ .../java/ru/ulstu/is/pmu/tank/model/User.kt | 8 +- .../ru/ulstu/is/pmu/tank/model/UserRole.kt | 6 + .../is/pmu/tank/model/UserTankCrossRef.kt | 5 +- .../is/pmu/tank/repository/LevelRepository.kt | 4 +- .../pmu/tank/repository/NationRepository.kt | 5 + .../tank/repository/OfflineLevelRepository.kt | 5 +- .../repository/OfflineNationRepository.kt | 12 +- .../repository/OfflineRemoteKeyRepository.kt | 16 ++ .../tank/repository/OfflineTankRepository.kt | 16 +- .../tank/repository/OfflineUserRepository.kt | 2 +- .../tank/repository/RemoteKeyRepository.kt | 10 + .../is/pmu/tank/repository/TankRepository.kt | 10 +- .../is/pmu/tank/repository/UserRepository.kt | 2 +- .../ru/ulstu/is/pmu/tanks/composeui/Hangar.kt | 29 +-- .../java/ru/ulstu/is/pmu/ui/ImageTools.kt | 21 ++ 48 files changed, 921 insertions(+), 99 deletions(-) delete mode 100644 compose/.idea/modules/app/pmu-demo.app.iml create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/ApiRoutes.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/ServerService.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/mediator/NationRemoteMediator.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/LevelRemote.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/NationRemote.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/TankRemote.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/TankWithNationAndLevelRemote.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/UserRemote.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/UserTankCrossRefRemote.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestLevelRepository.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestNationRepository.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestTankReppository.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestUserRepository.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/RemoteKeysDao.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/RemoteKeys.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/UserRole.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineRemoteKeyRepository.kt create mode 100644 compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/RemoteKeyRepository.kt diff --git a/compose/.gradle/8.0/executionHistory/executionHistory.bin b/compose/.gradle/8.0/executionHistory/executionHistory.bin index 91fe15c0037e26fea90c49f402e9d45538053c5f..67eba2a95e7fddac9c020445b5f5c6b145fab05c 100644 GIT binary patch delta 68513 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

&8C=16S$B^F)CmOL1Fd`#}0RGa-_2>QjyS;06 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Μs}#QkB*%}3FfG$jx{ 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 diff --git a/compose/.gradle/8.0/executionHistory/executionHistory.lock b/compose/.gradle/8.0/executionHistory/executionHistory.lock index e0b3315948f52a5755a9d3bbc2a2e5fc692e743a..50757f91bf991b1b25b20e5b274ac0a19e370888 100644 GIT binary patch literal 17 VcmZQp1S0?d literal 17 VcmZQp0l@_RQz1zfoG% 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

q#sogV;8`BPMT7T`)31Z#Y?+F!MqyCGC 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 z zNx-Qvb-KSgaG=AfwEgw-OI;D(eP#(#seZtwD_9mX$iyJ`0@66z(NrGY;(lqt-cuEJ zYo0*caBiaDa-x2xN}hr4!O*Ij=lkR~KTGa}7~#AH>>>tfV3~~Wq@z)VbG;d?>Z05G zN-|a5Dxj7EBLW1lt!T;G8eAr~PvWIP(Oh>!_Y7cx33g@*P&q3Q%LsrEA{5tEI={Nf z_H~GIOO^MNm#`SPIsHEHVjKDLh4EK|T^D;Q{MvD9(`L}wGhj19Kz4%G#e**Nk@&ik z{bTPNZ^2Ur>P-9h{Cf#iBn{r1B2jB4?r#!xiu1_~v--zE@tdHsHK0@5fD?=bvJIcg z#VR+1ThDo-6Ai4}z!q3eziSWdy#^eDdB%XJAhp?3QT|+vKpcSZ$>fWu7vw<^LK!e|F{b*)>odz*%PCu!?-A zS~k!3S~;(23i_v0s>OiC1lYWMhQB$%vFCa5-$#29tSKEL5kdSA&TVJ zV0zK_-yDl2DyNsXAO7zDGCz$SYV5DcyMix1O(kcjkls?yc=per$v$Ip9_ikQ?g{tzFve+jZ%;d`-#EGhQu9Pz#GDg5RL^_BZ1hz@M)H^W{ea5DY+|7_iE%V!KlYaO9J z1vbOL&1m2R73id%f6en4WUuXZT6*=A)XuU5Hi#-$&gqHyz_hger?|TM>rWfo^B;v5 zIKGpIxpR6P@T?7mL);QuHB)pu-|5M*{o(lnOsSw~bzTQ`(;4sr6}e`EvKkRh_VYT^ zqcu401Cup4?z16^fR_k?PLPES=7H0Vw;w zZSf19zO^6nAGFO{d~g0Ah^)&I@MbQBTRFK~9$8PQb~FAUlgfL886xWm%%vb;2%Pf+ zj%&(${tS8Y@sh6dw&?k0H+Mq|NuL8?H4Ik!z@y0ZE=MbJqkmWF-&FF~UvL}f9Z+2R z?1v~)xB;Zmf=*WE$V%DEv$|sP1hn$5{DIaWKA?dyAYe%b5@J0NE`{>0{+CZpc-aM2bpT{414Ayb&4X^Pko#pb yQ|0rL8(W3Y8h9T}T6wNJTFRp(P1DElCs&-mI<>k+xLY zJJK#BEtUMwx##Bh{p$DopU;Q)Iro|8IqNy&-V&+y-tVGQqlJ`4!5E=BzhF^c9bQ3- zxK6QP!-zT_r}smcSHzDg*fEN8oH8s(d}75Cp?10@uc3PE!BZRRzCZFXt7k z|4_*-aBXR)3cOl@D(KO6h?8{n>!*TS-+oX9FMiCWIDHaf;~0J|EH&X*799WC?oY`> zrZ<&HJNi&^6z%UzwQ}jTD=BA+ei}gSYs zGYv*`@@i8i@r5Zt=xxT1&+J#HDrman&hK?`ia!Z~O}!T1U*i-IG#*wlQ2!@H63N!*EmX zeOh}gcN|6gjpHKw`;6xv?@4*mt^R^?idJ&rw(IGxSDJTz`hX2N{N49-*B+v;%g9jM z=Qu7*kYUmQ2XHwe(14%6DI@R+;Xa9&Bk_C3pxV`@qF)1J^lu3I6XQR%#r=$pA84#r zbEwN1pG>;Vbvv(-?wf$M?Uf*}uk!6JgNt%1mLWKAnT^~b-b7gaVcaId>IW-W$Ui9(L_o6?E8qt6ToOJIs2EI( zA>%G+DGLn%U?Dvy;~+OR#$Xkaa2@!?Ahv0$!-!Zc07LE!WFxMFLBTWz%q(vz`R45jKK zk|vfU3HT`lkqrA&P(8b(5Z+{{#o1^!n}V^7fE0{ipxw~PLWy9sn=29?nZ~&^YlrJK zhvK_lP50g;k})QHBIFoRBH_oY#hV7-UhzOXFVk*PakS(w77qr(ll8J2{M5GX*A1AF zZ?|u~#a|?0eYU*iWt6OQpSF=n%eAi74ra0D4C}26#eVZ_74A)Y(7ANZ)IF!VScd_& zQxa|k3%j6%E~pAYN(eiNcv5vCs8?_`KxGfEGxQj&)X~6Wu?M>YXMgWQ*+4dH35tJE zHiOMhfwDbB*A!^#f^_zhXH&tY3mSpzCv`6oYQt0)ePb_o7Z2CX0Vp>Xh#=x1*A{2@ z!L1-H+Pvh!gYtfjO#x+nxGIkQ& z3#Ogucq(|l6`BvL#B4lSdYD}t!h;^1Q_z)?84a{Ys$*`>pDrX^U zXz7B)>BOnlM55prG@M0~)XH??RBMPq1lU3wNXHJWOaJSMcPwHuXdfmd)4;I{LgS(c z_8un0c96#+?4Vo$`Lm-7(SoxhGYH)@n391-*@*p<$_|PkiFs}#_Jb4bb3b^>LMxJ7 z(nK&M6LZ>#eZeY|aQY^>%oGU=Cwlqp5&g-KMVNI1D9L#v1S<;e2cSF0~r zyX2*MQ3ZdeSWwTV`e+r}z1IKfZal$0P+st4(Q}ru0Q`@ju6A1^V8Zq`W6veyqJBHS zNOt^s#WM<$~{csaPnMc;FJmD#VEQ}6Y%@nD5)XACcl@O}Da5_k7+lk9y4 zEiF~7jH3+l{4ocw_sc##GZ?(=&;C13c`Ro_Qs7~caNxB!o2VU{)q}m$H~Uo^ppXQG zCLNiHPSWm7kf>oNu z7|vsaxa4!Sd!^rb)S=$HaoU$rCHt$q@>wCfGPQ;OhuO#ee`dq~&uj*1cfIJ%tzDXj zQ<9`_XRG&|xP{diPg-)sOZ3|9z5a;&Q;MC*x~tlxzjpW2>U*sx>U(1tmz-~`e> z64eur?N`g2UD-bC>bitsPZ_M#7CvQjwS_x2mDg=w+iT*_7;9Q_sh29tdYCCq@wYa4 z72THR7ZaM7Nk%){vd9dKv|DDOT7ATG+x;c_=O!;*Hm>hqrEF=g{ac!l=$WT~-D*fb z-XhQ_m}zOx8Y1i}4I@}sm#cKJ_3)}UvYPShZ^!HGWyo4(cQW3ebS!sOecr&D=DAys zEc|tC34@e`=P=0m4xQ7s>RU9Aon{nVRhhDaH7SiL%>3vH^)f1+bt7w)>)y}MoBy9k z-Qtdw9)m{c*-n|4LYJEDAO2S-DGbj9JdFh!TH;-XH?^M>{#+XUBh0IT^iia{%YLG0 znCC0!g5$1dXC5sG`t-6Xja8Jun0WfY=DHqfSswSEE_xY!^(UImQM;CepJb{^xbjus zgiA-4|4}Z<5anrt9Lt)@6yWJy_vKDCcjjD53h_@~rg(-$9%O1`ZH#@`i$j{Fw?yT8 zkG$y!WRW{a0X8)JTN_*BEGG!LQDyN`N%p3*w*`_bFUFuzo+-@7y)G%~EGqCYu?Hn^X#s4Pa)i9t!ivzej@o1RR# zd0Z~fGs1lE+k`2O|7oqTZhfPP?1*B{p?3XYTbJaGWsyl>WyaH%G#16^z;yllcD%Ua~-RPQ7=C`-zw>X~7n+PO==Ngj~Cap+5VR6$Z+g6!@HYAY_n| z@EfEB{vT6g4pWu?$JEFm?RpI=y!Q6$mm^cMXSzr)75sHhHnCC}O|sp`>ao?*y3AMo z-z4`>v3&oAe$-{j-&UEMB+k;-a&*WwYxne7VmN-MpvSvUe+xtGy%dsUAG<96z{3ey z8^3HjH25zTSEknSr;&|Hf{SCT+%rcwSm>9qNNCMO^L+h~$#)~K#`S)`TVbFnBdb*w z)fq}WLxxCrC3WlZYtt*14ZC0RaA*H@qgaJ`Os(w6`D9#wqJJM#$00c**9HA8C4tvk0z5dq4GfnaRR$8c9ur}nt<3cj9 zcWZ(#B+~?JXhP1O=yq zo@1ef*55D|2`$na0_g}s!MbB1u}K}O%1|8M^c?S4AV%_3h26)f$I`L5{q;z?3(EdW z6#bt>NC_sdt;gyLtv5j@ViXRnIIQ0>c9)O+<6!4+ryP|Sw@95vfl&j(x=z#(H@2OV zT{Cxh;bLil9l_dXB_+6uga@uvu3gbzHSCS0(T36~&dMxOi($3Vqk0KaVy6+Hs=^V`sV|w;TA?)!QZ2L#;rNbgiz_dWDIc|pR9+r>id7dv-T{F~ z_u2!cJK1G+-`Abo{By*-)g;uGI`}a>GD|%i9Po1Yu8s_#<&z9)?8V|B*Q8 zJG2Zy{z@ZR2Ok(lp==$=+LypPmaQDLn}{O^Kw=H5j^#~^0H<*fK@j$ekVhc9?@3l6 zXkAAr9K1oZnPGJZfWZD}+349!%u|KLKFHc6HX8va2%X(ec*;WWLA8ab)dQ;*?gm}k z_QVMOjx6^9GyPxRRJ5DRwl?HglqjEMpsINq(^CV+92w_2yj1O3)X;%5d$B~j7$TWb zD6s85!Bl&E$zS$9$#49VrKSqGso@Mq$1&3EITyfa8DB$3VfNG$*<0S(UXs*TI;q=r2lJ@ACgg>-9%1Z7>Y*A2z zho89CuAg_?*n96gVIa(1|3a!;%VDS_+bs!IZ#3a`w|M6CXAZwL+!ccNV@;2Yu^0E>xi{dFJR`kTb}J*DiYTEqhVoo>Ty0kJ z(==`-EI0j~kp4DGoix^(c}c{G;s1-!slX#Q3S<{$9b{-^_)Z{x#nsSC4^6H&RZMmn5?ynA`J`9G zP4Qb{VwON8EdJ`!*IjYqjh1HWN{Bzrj4?BIzE%fHnn3A>chBChMg6Zim`!(1uZy;3WuUMJC!44Act_qHDq{S`rP{YP=3OjuFig67 zZ6jIQwDQS-C!>t3p_|}J_x>T)mu5a}^y*k2q*w0A2=3xgnD;M--P?P?d0FR{8@>^I zy=1hR98a|J3lJr|e8trgKFK&AGOgXwH74YCuLa-2$Z`b{K)EwdBoqt6E`jXtOwRC^ z(=?wfKF%sE1S_RF^Ko~%?FQ#I-E7a4 znX=?Yzd^?RZm^b=B1)7LnLrX=xnXx?a&JP18xKus7^3pfz&~x)Uxeo@o=9hYbfSNs zsmYyk37nmEXV;8pgk^G(P@F1&YUXR$UAd{|p}e{7sEXXjb+-psld@-WuM;ALtLV2| z*&}usJ73@YO2Y`g^?SF{YBnpj4!+OgF?;oFw54Ih?A2S(=Gow_zkG%w*d|Rua7qPFQC^nSz7aQ>@V(YL$Fla6h zP4+foDLBt1(xjM^(V7blhG*NH{sx1K{C7y=Pm+F_=#P z^NDFEAZtGFl(0$nh~Z)<1!?23khS;2-&8U}B~kC8r7!AN;XC%<(ob`l^5Xk*v9n1P z+1r#veSq`@sDZ!oEp4-(anyIvgi^C+)kCCDN}}-ajgo8)`q!<>;;f6OJ4Bj<2-anP zusPu!!D>U(2u`xH=wCOEXT7$Gt)C^C-W@zj|F}}qUmdN85)LlpX$c=E+?!IrSbv`L zk!Yor$12lUk!?`B5EbBitS$ejlpi$IyUgfl&34lAB~f3PLp#^pbJJ5kpUhADKHQHx zx$*O2miHSrMn*32eF0Gg<7AN6T_ z5-Xga=alPr<9Is}8?6mSi;zjTr+>;n`D^+3nJQ6*aSOGFvDkh|fvZFjJJx!umv!nt znqg>OV$-(Z5sTDi#LLJbecdg(b)o+@IwF4WV_mfryTT|Gj^I6@=>CL5w#UC5@N1Ug z?FTRPxphMwZbtRl%yQ@!kOHv72| ztBPVhw94<_f9n35#SVqmM_iHX@()sL< z9a(Jn#(e;R**p!cO)tBt>xi2|nm79T9uT(Bz> zxsH*%A3OtiBD*@r{a4S~5cfibMZZHgx3v`4b-ZyB0oj3q*gDHP}yvSU9GI{$j^_5br?E~C-b%>I+@f^!wI=d4>r(;-ZpL)-&!Sa#VSMf zhiiy)KjquG>(gqN9BrG{?$MLfkR%$I8gjYyt!a^*wpq*9{CTyqwVWcBcMmaCY4yK` zKHV`WEG%i|orh07X01IxdI+{ZVySWM;#;=KCZ+?;YbIZLx1J&D$a+SI zhG4IE8!^;FgC#-Xt+x3VroPu#U1!6%tQUl1;Jbf05~s+k4siT=`D)Y9KT5^|WB_hH z*~1Yfp40PN>Ch#-QC#6BmBb&X7f#IDGw9@1i+T1(7`j%~N=X035k-XU(fPembGv)Y zj}HM_Z7W#k#iCgfC&hv2UpGr@Y*!`nWFN)EZQ8JW(f8hH7)N>~aqKj$SpP3a{bHjL z&ox5~>|w0zR*$G~)`GW)5_$%skt7)=o8>&@pT0iHGiXb(5-CcnYA!hcLOsw=$>gcv zLfsFqD@qy<&C=O{D0Wbi#TK+c_2!KdzMemL?%ZC}Yu+q7VfRhljf^I(s*h>05AO*j zT-bl<=9kMRco~059Q7AfoD%NJd9j{hX+aQ0H{Ov8)(lJyf2h+_o9kwui~@X z`hCt``?SNioUp|9!Pi%GF3lNoa%I+*+3}IehD{eUQEZAl(5f~Tl?SD@%<9d~a&u^Q z*mimM8{f=T)zoUzSqY|uNC8((Bn0#~Hlrg(Bf?!7ga#z#D}Xp1%5MzHpWh&H*65SV}ly0*e^ z)tuVvYFpjb2Dop~W{FDik*Bc0th8i<@|L+4qu;9FR0AsI^#r*GU~>sl7XV$-0i8U-W;#RJYfKIwQNF`gdx zEBqbVE0j8*PJxr!Nf5hI8vS1G8ha~w*NYX(d!v1tA3tS9s$K2w+Pq5Ry~Cc?KRH}Ec@8Tg9ex?1h2Qo0i)OUkUbM%m zJn!U$(RauIBXu%{$F+#}%nvwY2#q8yDaZvNH<0;@Obpx-ES8hDI4f! zDcxe@?ZRS};Or_i!pQ2BO){8Mq&jL#FWt4iOFRhHAp%-4cKfZW5Z@EA+$Up440fAk zI+|e7#sq^+K0|F)oiHXgz5nl@=~Gv4WqG5M0-Qy{qm4=*125}7y&*c0tYq-@8mm?a z_Bm)ocX1Wn;be_EacJeSA;wn*knve+kGcm=gYTe!-5S{SGOv6ut>=EJU&mC0sU0Bk zXh(K9H0(pGmfL~MG?~2tT$ZDa8-5VUu7tip%yf$A)Gr`99~KbJpBTKV^b*#7-YO2t-50Z3gT=0e0F2%9c-V>R8TU7|_bq%W zFYoQdVgn!@VO<1%P+a{WWXk?8cb|;7u>>tcP@C(>UdxnEM&9Ay0-lyE-=n7Q>gC>8 zxm)&49*H?Rvf~Jc7PE1xJA9LISV-*D=7>jKa(T}+k0bc4CWJ$k-4oE@{mY?# z-0Z^8!P(75z8gMe?@yS=a-73Dz~-i)m(b19I%-+kjQ1jrY;ui$NMDws0P6Z9@4Xsq z(Z|0{MTHut&b4rVW`hTUEc27TqVIPVLmd zK4(P7E{AMSR;ghnKLJHtFR8y4)oyA|y(7xM;0!x2US+X4q)z{wo-x_C$I3eIQEdgy z(cZ{f>>Je&q)uD!J55Uao~mj&HN3Z(>AvNxRWeMS3b(DlcEaqb)4Kz&&-K5d&(CDB z79h<*BSlTz!jP#7b7!3b%ZH(FLSM6zQ5E6TYY!-|F;B13H4j-mn}ypcBc97`x6{)c=<- zYEa!5%c0x8l(PES?H|33|H_;3F|F6+h6|TxI%i(t#fcvi4mA$3pikJp9Fvc6r%iYl z!`o~&SnP1pJi*BgXj=S?>PNt8__I)!+tw`dOiJgPrLUkyP zo+U9E&=krjj2(+PvFeyh;KD+;f#RS=Y3h11Wja97dfqN<=OVC|5dA|zDnW~RN%3)& z=0X#**%M7(%51+)#x6-L*#?ynfu$>_r_Su&n=U;WZ8)MNZC~W+&l$uOG4F{{%0ECm zjHidLX2lI6Pt-G^N)N4Fxzl|5E(!dx$n@~d*R{t!Gi*|)-3$?Re;^$Z#yhFzvT#_= z=+pP#_Nct@=;n`6tEQ8x;iGs3CC*nAZg+1S&cjkhoE9&6S8CRN=2D*Gl>g#D)swyi zom=ho9e=BD2ad=?08@yr;Sc?2J2!Jr)^ zm&F`xEw+nvKe|)zXG(qg_&cj&N&m!h0(M}p+lXDdj$|1I*Wq4*_Hpq&egC*kPNw&+ zUdAd8A?10ACZ+D>xpJ-J&egQfi5B-dD=O3)(SV5u&`iQ1BjZC`B=A(wg)>RG1-K+J z)rTOXJ}4-ce~Y1P48SSzB6O_gNf#EWp1>x95`S= z;S=>H`d^lxx9?B~4*W40bY;>u{dPAp`gUYu7M#w|5h*-hj&7pj*!9EjQGOmfc(LO8 z-K2weWbR;y1ZqR@*x$3C0~~MoG$**G6AzD4l}qr3#Nqrnd>R zdbm|)zpiJE+`x#UwnAhYrJ?I%KR~v(V#D3@uDfgCRP%V22yJLE3EjKrpsR)o`*|tC zVAcHUkE-uodX9a2%w%{Yi9m48(EE7~!o<}QLhn@scve-7ZbDTy0QYo_v!Q$q94YtN6~3|~X%&3xPF zWy!>h>NA5h;e#@o1MF&64)vbyu4KA$@14P~Oofcb_ik>G=YmFn0cpHZ5#@P8@*kgvGiwK>hU}9>Ert7Wx8ZkH{?pnKI*GSGc=zRv8EQi|b`}jlVGm9mSM;wN zN0wRO+37Zg17FBh@4U0si#erHdhs2_F3c*2tH*4m=p66R@44gv{W-~e-sITF7Hs^PxJd6o?^`}&lIE^NS>ITW<XU;M>~P4r8=URP+@ zK34e7m~10P%V3-)E{68QWTWp249MW26GI#EWrFJi)Jk*;6_CM0Cx%^5c`e`)iVmd@ zXAu3Dp#-sEg_q$&2AV^C)AtXyDe3p~ot|3l{_A@Mtip>#s8${N?N-HW@5kD%ZuJ4RpEC(JKP}10h{&nN9dl&XF`IdTlTv`56gU$IQkhKwG4nF$pcM>AiD2)g$ znIL1;q_Mgj!%*&#;^Y4<_kY{+$ea9m-1h*p@W-d<`|coroCMAq{2k(CA-0sAM7iFlusb=qVvm z%pz5O8t(-$m46xnSf~in@&3>|+bpYsqAbNNcSAz$20M~%7aQ?$GQBiq5mCos+XRkC z*uQ1{&=P8)zpdN0(s6%IFJ?+42|fopXa@&evWX)uFfS%VGdUy)=XBSUIh2iGpprV% zXuhWY-R)~w&MIQKoL-XHO(P;@h5j6wSGO*tXvH`^+^)*d*oco28kM!^w_E#a9Le)P zKXBw3A3Gzn9dTKQ|Jp-1RB>1A#&JyMUVX@Hv`X$V_4@ApcgHdut$ZBS$#|ejY5SMO z?91cvQ=2!seR{rPLXTB5$nwTUoQ+vzWK{4((oM<5USh|yo4*cIu=w!QV$7ZutdfgR zGXy!&bw|*^hwdX=iX3txKxqV;iP0EnBhE_d+>hQnIZhm&1;dWx8j}QHg@r6s0|_j2 z1*#B)rjFq2j1e+?wE5u8Lzm%C;P!zYgZpf>9=1_TD0fPDA^fRW8+iAs-zQepT;?_# zFZ7|>P)pq{eUnEWmYcnogl9J5ISjIVkNCNvZrxV1HLHaeca0&<0$pOnx7kME!|qJx zcBb8)&R)YlQcv=1@g%4KZ%#6fh!sQc90ExoVjgP!OLMTVB(b^>P7rY?@bUzEE#@sWAPBv9 z5yuYQB8VKr)zDe8$s>__aKQT&-|CbPe>h8qSxMYLV(&O|pzofGyOkt%5P7Oho+hHF zSlvxLLyjr0 zB-V(?*2EKJHxG>$`i$_4-f?kl+J}*A*6lz|68TgTyNYnAIWWOUzk`!z47^k0x3^vM zMX~1Ze3rBh+Ix~Fi zkjB`vIyV0E(Lo)?#xz6fDc&jFdG_mn#hQjJ+!ud$P5Z~M^B8RF-xas!De%u@)-Oug4HLxf>YS+Abbyot@=a)#VJ8G`|JucUJB_U zaZaZy^b4^@rfFs!vn3s;DQ zCmtF1jyc%8`p}Hmf$R3Yn?;bZ=q64N)N^xM&1Ix%gXC`I+}qxE#>bIhb0F zUmBjIX-3rMSBL9wo$KvVRGG7mh*hn?w{%3pFoSP&&`NH}4cmQYGo8gQtifZ+-Mi&Q z#1mYID8lt1bqIw#0@<~IqX2oQ1CijHP71^Vbo&n7afFelF{9M(157#1Fxu~f(9=8z zyB8a!cXk}8*9+M^^q{`Y!^e!i!YQ5%H#KfL`t83bnwv z9uQxKdSXD@-fi*P()Z{3os?TqrH;a4+~i^>!r3yWcf|6bl|aGFbRvR@XBhw63rHme zFj-0PHHbSyszV0i5A#L3(_S7+*kbv;W|P+n`FsNtDI?iN%q}8i0ou+my*PX<^ety} zA;_79%$WBfT^&5vJXXBXxZ3B^rYrmBPDGIqwl3U^cuxNHzkWzx)VXSm>FfnAaTR~E55lN-7F #8c?L)((-`cr3(%ju1FWkg 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 bSQ{=OQZK{fXQB0P)(Z~Itr4&;6S)09b+5tV diff --git a/compose/.gradle/8.0/fileHashes/fileHashes.lock b/compose/.gradle/8.0/fileHashes/fileHashes.lock index 01a6d6a65a1100c83be7f2f4a6cca089074afd36..b33bc8d798befe1625b4e4c317c7002323b71fe7 100644 GIT binary patch literal 17 VcmZQ(aBaLGm;b_n0R$Lx6aXk?1Ka=r literal 17 VcmZQ(aBaLGm;b_n0R$LhvH&QL1Qq}Q diff --git a/compose/.gradle/8.0/fileHashes/resourceHashesCache.bin b/compose/.gradle/8.0/fileHashes/resourceHashesCache.bin index 5c6347ebb2cfb9b153d1813091d0fbb56f102ba6..09e3077cffd7f4fb05995d69c4eb17744fce7d3f 100644 GIT binary patch delta 8390 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 delta 1584 zcmXX_dr(wW829_mcVNlVUCQzL2zK#>SqYT^BDNOE3K~*rfHkw0m64B1qs2!h`M^ws zcJ%WxS~ioQ_JD59=Vs+1DFj-|G>Mg@si5?5nF_U0>uB9S?%Z?cp5O2M9^dI^>xWHN z&0QAc+oP=Q*9W@?TlUZ)eihu37`BUtKZo{}5&3A(x!oOYZyQyrAdkZz(G5@qjg@F_c?*{|%4Ul*X=^Kc3T3tIwqXUpVh`@!#H30!=A z7G?1CEV6ie7MXKx!?Imd>MLc(xU3MS9a4139Gy=|O*^~@Ul=?g2408S5 z;FCcq;O!|3?}b#5=KJ7#4KZBcqS@T-GO$Bq$uG?lV6GcRa(WT;lUYS@$iWZK151|9 z1D}#p#W0y<;z9^V@!(QO;#uY;AD2Ria9{}+-J_RryjNS2>(w=oP%zX3%QsI?8`GG;XF)@7H0uQlvs~pRg@fg0{0@u zS8`|(4dL!Z6yW8H4P5n8*zANEGXEvq05YTmcWM6XWdkw$6>J2av;@0kYAMEptbPsa z6hE~B&++UsY?T*R8V){Iffcf>5-T0(d7dXWsSMuQq^fy(v+Cla18St4-iR@A5YOj! zVX~x#(2G*B8_zhT;!9i)?A>p$k{ZzDl>ZgJN)kDUhmczjp^sA!V?Y`YV~oQ77kSSj z{RzLZSo`Gox0u@jPfF5f%B7{CPF(e_yn?)6c3>;l!hQ3@5SL~bf$c`M;9AI3LsOCrBHu_hvY&Ud4QACO{{J*~a3$>WS|lpu{qC{e={?)s7H zxapX&tFVpowKSb1Gl0*w(@c_II;jICXB5@|Z#-ulACY1d-x9eRSm7Url2?t!ky7_3 z#Q;B%jsY(0rfTVbp5E5na>-2TG%s45ec2q{d)X`#t{B1Ym|BnHn&A2D_|aS?c!Q3; z74DF2X?h&;Kk2%a&yCR$IiI1!QSwcuPDH+IHB`u3S=x#G=o-@>$u`yRo12^>WS@S>&WUfv%}&IguhV?cfzCZdd4rOS}3e>StZ mv|O9!Ioh$WOnXzGHM?gpi+8Wp2{_>STF=`ziJ7VQX8a5P)n1(d diff --git a/compose/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/compose/.gradle/buildOutputCleanup/buildOutputCleanup.lock index cc1cf6f010ccd369c8a4a90602a7deb4265e03fe..9d44cfa8f476a848c7320be2454fa9dc06d563d4 100644 GIT binary patch literal 17 VcmZQhF*rNr{gMY+3}CQH3;;Yr1)cx^ literal 17 VcmZQhF*rNr{gMY+3}CR~Jpery26X@c diff --git a/compose/.gradle/buildOutputCleanup/outputFiles.bin b/compose/.gradle/buildOutputCleanup/outputFiles.bin index 967e65cdd5ef9e3d840cae8a163749932ee2f91b..2eadbbbedfba70b07b523f1c8b75f2e11c121131 100644 GIT binary patch delta 8153 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 delta 5669 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 - - - - - - \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/ApiRoutes.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/ApiRoutes.kt new file mode 100644 index 0000000..7594d0b --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/ApiRoutes.kt @@ -0,0 +1,11 @@ +package ru.ulstu.`is`.pmu.tank.api + +object ApiRoutes { + const val BASE = "http://10.0.2.2:8079/" + const val USER = "users" + const val LEVEL = "level" + const val NATION = "nation" + const val TANK = "TANK" + const val USER_TANK = "userTanks" + const val NOT_USER_TANK = "notUserTanks" +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/ServerService.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/ServerService.kt new file mode 100644 index 0000000..6fa34cd --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/ServerService.kt @@ -0,0 +1,184 @@ +package ru.ulstu.`is`.pmu.tank.api + +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Path +import retrofit2.http.Query +import ru.ulstu.`is`.pmu.tank.api.model.LevelRemote +import ru.ulstu.`is`.pmu.tank.api.model.NationRemote +import ru.ulstu.`is`.pmu.tank.api.model.TankRemote +import ru.ulstu.`is`.pmu.tank.api.model.TankWithNationAndLevelRemote +import ru.ulstu.`is`.pmu.tank.api.model.UserRemote +import ru.ulstu.`is`.pmu.tank.api.model.UserTankCrossRefRemote + +interface ServerService { + // :[USER] + + @GET(ApiRoutes.USER) + suspend fun getUserByEmail( + @Query("email") email: String + ): UserRemote + + @POST(ApiRoutes.USER) + suspend fun insertUser( + @Body user: UserRemote + ): UserRemote + + @PUT("${ApiRoutes.USER}/{id}") + suspend fun updateUser( + @Path("id") id: Long, + @Body user: UserRemote + ): UserRemote + + + // ![USER] + + // :[LEVEL] + + @GET(ApiRoutes.LEVEL) + suspend fun getLevels(): List + + @GET("${ApiRoutes.LEVEL}/{id}") + suspend fun getLevel( + @Path("id") id: Long + ): LevelRemote + + @POST(ApiRoutes.LEVEL) + suspend fun insertLevel( + @Body level: LevelRemote + ): LevelRemote + + @PUT("${ApiRoutes.LEVEL}/{id}") + suspend fun updateLevel( + @Path("id") id: Long, + @Body level: LevelRemote + ): LevelRemote + + @DELETE("${ApiRoutes.LEVEL}/{id}") + suspend fun deleteLevel( + @Path("id") id: Long + ): LevelRemote + + // ![LEVEL] + + // :[NATION] + + @GET(ApiRoutes.NATION) + suspend fun getNations( + @Query("_page") page: Int, + @Query("_limit") limit: Int + ): List + + @GET("${ApiRoutes.NATION}/{id}") + suspend fun getNation( + @Path("id") id: Long + ): NationRemote + + @POST(ApiRoutes.NATION) + suspend fun insertNation( + @Body product: NationRemote + ): NationRemote + + @PUT("${ApiRoutes.NATION}/{id}") + suspend fun updateNation( + @Path("id") id: Long, + @Body product: NationRemote + ): NationRemote + + @DELETE("${ApiRoutes.NATION}/{id}") + suspend fun deleteNation( + @Path("id") id: Long + ): NationRemote + + // ![NATION] + + // :[TANK] + + @GET(ApiRoutes.TANK) + suspend fun getTanks(): List + + @GET("${ApiRoutes.TANK}/{id}") + suspend fun getTank( + @Path("id") id: Long + ): TankRemote + + @GET("${ApiRoutes.TANK}/forPurchase") + suspend fun getTanksForPurchase( + @Path("id") userId: Long + ): List + + @GET("${ApiRoutes.TANK}/myHangar") + suspend fun getTanksFromHangar( + @Path("id") userId: Long + ): List + + @POST(ApiRoutes.TANK) + suspend fun insertTank( + @Body tank: TankRemote + ): TankRemote + + @PUT("${ApiRoutes.TANK}/{id}") + suspend fun updateTank( + @Path("id") id: Long, + @Body tank: TankRemote + ): TankRemote + + @DELETE("${ApiRoutes.TANK}/{id}") + suspend fun deleteTank( + @Path("id") id: Long + ): TankRemote + + // ![TANK] + + // :[USER_TANK_CROSS_REF] + + @GET("${ApiRoutes.USER_TANK}?_hangar={userId}") + suspend fun getUserTankCrossRef( + @Path("userId") userId: Long, + ): List + + @POST(ApiRoutes.USER_TANK) + suspend fun insertUserTankCrossRef( + @Body tank: UserTankCrossRefRemote + ) : UserTankCrossRefRemote + + @DELETE("${ApiRoutes.USER_TANK}/deleteMyTank") + suspend fun deleteUserTankCrossRef( + @Body tank: UserTankCrossRefRemote + ): UserTankCrossRefRemote + + // ![USER_TANK_CROSS_REF] + + companion object { + private const val BASE_URL = ApiRoutes.BASE + + @Volatile + private var INSTANCE: ServerService? = null + + fun getInstance(): ServerService { + return INSTANCE ?: synchronized(this) { + val logger = HttpLoggingInterceptor() + logger.level = HttpLoggingInterceptor.Level.BASIC + val client = OkHttpClient.Builder() + .addInterceptor(logger) + .build() + return Retrofit.Builder() + .baseUrl(BASE_URL) + .client(client) + .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) + .build() + .create(ServerService::class.java) + .also { INSTANCE = it } + } + } + } +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/mediator/NationRemoteMediator.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/mediator/NationRemoteMediator.kt new file mode 100644 index 0000000..2191b48 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/mediator/NationRemoteMediator.kt @@ -0,0 +1,111 @@ +package ru.ulstu.`is`.pmu.tank.api.mediator + +import androidx.paging.ExperimentalPagingApi +import androidx.paging.LoadType +import androidx.paging.PagingState +import androidx.paging.RemoteMediator +import androidx.room.withTransaction +import retrofit2.HttpException +import ru.ulstu.`is`.pmu.tank.api.ServerService +import ru.ulstu.`is`.pmu.tank.api.model.toLevel +import ru.ulstu.`is`.pmu.tank.api.model.toNation +import ru.ulstu.`is`.pmu.tank.database.AppDatabase +import ru.ulstu.`is`.pmu.tank.model.Nation +import ru.ulstu.`is`.pmu.tank.model.RemoteKeyType +import ru.ulstu.`is`.pmu.tank.model.RemoteKeys +import ru.ulstu.`is`.pmu.tank.repository.OfflineNationRepository +import ru.ulstu.`is`.pmu.tank.repository.OfflineRemoteKeyRepository +import java.io.IOException + +@OptIn(ExperimentalPagingApi::class) +class NationRemoteMediator( + private val service: ServerService, + private val dbNationRepository: OfflineNationRepository, + private val dbRemoteKeyRepository: OfflineRemoteKeyRepository, + private val database: AppDatabase +) : RemoteMediator() { + + override suspend fun initialize(): InitializeAction { + return InitializeAction.LAUNCH_INITIAL_REFRESH + } + + override suspend fun load( + loadType: LoadType, + state: PagingState + ): MediatorResult { + val page = when (loadType) { + LoadType.REFRESH -> { + val remoteKeys = getRemoteKeyClosestToCurrentPosition(state) + remoteKeys?.nextKey?.minus(1) ?: 1 + } + + LoadType.PREPEND -> { + val remoteKeys = getRemoteKeyForFirstItem(state) + remoteKeys?.prevKey + ?: return MediatorResult.Success(endOfPaginationReached = remoteKeys != null) + } + + LoadType.APPEND -> { + val remoteKeys = getRemoteKeyForLastItem(state) + remoteKeys?.nextKey + ?: return MediatorResult.Success(endOfPaginationReached = remoteKeys != null) + } + } + + try { + val nations = service.getNations(page, state.config.pageSize).map { it.toNation() } + val endOfPaginationReached = nations.isEmpty() + + database.withTransaction { + if (loadType == LoadType.REFRESH) { + dbRemoteKeyRepository.deleteRemoteKey(RemoteKeyType.NATION) + dbNationRepository.deleteNations() + } + + val prevKey = if (page == 1) null else page - 1 + val nextKey = if (endOfPaginationReached) null else page + 1 + val keys = nations.map { + RemoteKeys( + entityId = it.uid!!.toInt(), + type = RemoteKeyType.NATION, + prevKey = prevKey, + nextKey = nextKey + ) + } + + dbRemoteKeyRepository.createRemoteKeys(keys) + dbNationRepository.insertNations(nations) + } + return MediatorResult.Success(endOfPaginationReached = endOfPaginationReached) + } catch (exception: IOException) { + return MediatorResult.Error(exception) + } catch (exception: HttpException) { + return MediatorResult.Error(exception) + } + } + + private suspend fun getRemoteKeyForLastItem(state: PagingState): RemoteKeys? { + return state.pages.lastOrNull { it.data.isNotEmpty() }?.data?.lastOrNull() + ?.let { nation -> + dbRemoteKeyRepository.getAllRemoteKeys(nation.uid!!.toInt(), RemoteKeyType.NATION) + } + } + + private suspend fun getRemoteKeyForFirstItem(state: PagingState): RemoteKeys? { + return state.pages.firstOrNull { it.data.isNotEmpty() }?.data?.firstOrNull() + ?.let { nation -> + dbRemoteKeyRepository.getAllRemoteKeys(nation.uid!!.toInt(), RemoteKeyType.NATION) + } + } + + private suspend fun getRemoteKeyClosestToCurrentPosition( + state: PagingState + ): RemoteKeys? { + return state.anchorPosition?.let { position -> + state.closestItemToPosition(position)?.uid?.let { nationUid -> + dbRemoteKeyRepository.getAllRemoteKeys(nationUid.toInt(), RemoteKeyType.NATION) + } + } + } + +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/LevelRemote.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/LevelRemote.kt new file mode 100644 index 0000000..c5cd2c3 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/LevelRemote.kt @@ -0,0 +1,22 @@ +package ru.ulstu.`is`.pmu.tank.api.model + +import androidx.room.ColumnInfo +import kotlinx.serialization.Serializable +import ru.ulstu.`is`.pmu.tank.model.Level +import ru.ulstu.`is`.pmu.tank.model.Nation + +@Serializable +data class LevelRemote ( + val uid: Long = 0, + val level: Int = 0 +) + +fun LevelRemote.toLevel(): Level = Level( + uid, + level +) + +fun Level.toRemote(): LevelRemote = LevelRemote( + uid!!, + level +) \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/NationRemote.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/NationRemote.kt new file mode 100644 index 0000000..7bc7271 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/NationRemote.kt @@ -0,0 +1,20 @@ +package ru.ulstu.`is`.pmu.tank.api.model + +import kotlinx.serialization.Serializable +import ru.ulstu.`is`.pmu.tank.model.Nation + +@Serializable +data class NationRemote( + val uid: Long = 0, + val nationName: String = "" +) + +fun NationRemote.toNation(): Nation = Nation( + uid, + nationName +) + +fun Nation.toRemote(): NationRemote = NationRemote( + uid!!, + nationName +) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/TankRemote.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/TankRemote.kt new file mode 100644 index 0000000..992c151 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/TankRemote.kt @@ -0,0 +1,38 @@ +package ru.ulstu.`is`.pmu.tank.api.model + +import android.graphics.Bitmap +import com.application.ui.toBase64 +import com.application.ui.toBitmap +import kotlinx.serialization.Serializable +import ru.ulstu.`is`.pmu.tank.model.Tank + +@Serializable +data class TankRemote( + val tankId: Long = 0, + val name: String = "", + val price: Int = 0, + val miniature: String = "", + val imageId: Long = 0, + val levelId: Long = 0, + val nationId: Long = 0, +) + +fun TankRemote.toTank(): Tank = Tank( + tankId = tankId, + name = name, + price = price, + miniature = miniature.toBitmap(), + imageId = imageId, + levelId = levelId, + nationId = nationId +) + +fun Tank.toRemote(): TankRemote = TankRemote( + tankId = tankId!!, + name = name, + price = price, + miniature = miniature.toBase64(), + imageId = imageId, + levelId = levelId!!, + nationId = nationId!! +) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/TankWithNationAndLevelRemote.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/TankWithNationAndLevelRemote.kt new file mode 100644 index 0000000..5f6fd73 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/TankWithNationAndLevelRemote.kt @@ -0,0 +1,34 @@ +package ru.ulstu.`is`.pmu.tank.api.model + +import com.application.ui.toBase64 +import com.application.ui.toBitmap +import kotlinx.serialization.Serializable +import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel + +@Serializable +data class TankWithNationAndLevelRemote( + val tankId: Long, + val name: String, + val price: Int, + val image: String, + val level: Int, + val nationName: String +) + +fun TankWithNationAndLevelRemote.toTankWithNationAndLevel(): TankWithNationAndLevel = TankWithNationAndLevel( + tankId = tankId, + name = name, + price = price, + image = image.toBitmap(), + level = level, + nationName = nationName +) + +fun TankWithNationAndLevel.toRemote(): TankWithNationAndLevelRemote = TankWithNationAndLevelRemote( + tankId = tankId!!, + name = name, + price = price, + image = image.toBase64(), + level = level, + nationName = nationName +) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/UserRemote.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/UserRemote.kt new file mode 100644 index 0000000..9e8feb6 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/UserRemote.kt @@ -0,0 +1,33 @@ +package ru.ulstu.`is`.pmu.tank.api.model + +import kotlinx.serialization.Serializable +import ru.ulstu.`is`.pmu.tank.model.User +import ru.ulstu.`is`.pmu.tank.model.UserRole + +@Serializable +data class UserRemote ( + val id: Long = 0, + val nickname: String = "", + val email: String = " ", + val role: Int = -1, + val password: String = "", + val balance: Int = 0 +) + +fun UserRemote.toUser(): User = User( + userId = id, + nickname = nickname, + email = email, + password = password, + role = enumValues()[role], + balance = balance +) + +fun User.toRemote(): UserRemote = UserRemote( + id = userId, + nickname = nickname, + email = email, + password = password, + role = role.ordinal, + balance = balance +) \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/UserTankCrossRefRemote.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/UserTankCrossRefRemote.kt new file mode 100644 index 0000000..10ee79a --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/model/UserTankCrossRefRemote.kt @@ -0,0 +1,9 @@ +package ru.ulstu.`is`.pmu.tank.api.model + +import kotlinx.serialization.Serializable + +@Serializable +data class UserTankCrossRefRemote ( + val userId: Long = 0, + val tankId: Long = 0 +) \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestLevelRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestLevelRepository.kt new file mode 100644 index 0000000..af69586 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestLevelRepository.kt @@ -0,0 +1,51 @@ +package ru.ulstu.`is`.pmu.tank.api.repository + +import kotlinx.coroutines.flow.Flow +import ru.ulstu.`is`.pmu.tank.api.ServerService +import ru.ulstu.`is`.pmu.tank.api.model.toLevel +import ru.ulstu.`is`.pmu.tank.api.model.toRemote +import ru.ulstu.`is`.pmu.tank.model.Level +import ru.ulstu.`is`.pmu.tank.model.LevelWithTanks +import ru.ulstu.`is`.pmu.tank.repository.LevelRepository +import ru.ulstu.`is`.pmu.tank.repository.OfflineLevelRepository + +class RestLevelRepository( + private val service: ServerService, + private val dbLevelRepository: OfflineLevelRepository, +) : LevelRepository { + override suspend fun getAllLevels(): List { + dbLevelRepository.deleteAll() + val levels = service.getLevels().map { it.toLevel() } + dbLevelRepository.insertMany(levels) + return levels + } + + override suspend fun getSimpleLevel(uid: Long): Level { + TODO("Not yet implemented") + } + + override fun getFullLevel(uid: Long): Flow { + TODO("Not yet implemented") + } + + override suspend fun insertLevel(level: Level) { + service.insertLevel(level.toRemote()) + } + + override suspend fun insertMany(levels: List) { + TODO("Not yet implemented") + } + + override suspend fun updateLevel(level: Level) { + service.updateLevel(level.uid!!, level.toRemote()) + } + + override suspend fun deleteLevel(level: Level) { + service.deleteLevel(level.uid!!) + dbLevelRepository.deleteLevel(level) + } + + override suspend fun deleteAll() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestNationRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestNationRepository.kt new file mode 100644 index 0000000..5b0f4ee --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestNationRepository.kt @@ -0,0 +1,84 @@ +package ru.ulstu.`is`.pmu.tank.api.repository + +import android.util.Log +import androidx.paging.ExperimentalPagingApi +import androidx.paging.Pager +import androidx.paging.PagingConfig +import androidx.paging.PagingData +import androidx.paging.PagingSource +import androidx.paging.map +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import ru.ulstu.`is`.pmu.tank.api.ServerService +import ru.ulstu.`is`.pmu.tank.api.mediator.NationRemoteMediator +import ru.ulstu.`is`.pmu.tank.api.model.NationRemote +import ru.ulstu.`is`.pmu.tank.api.model.toNation +import ru.ulstu.`is`.pmu.tank.api.model.toRemote +import ru.ulstu.`is`.pmu.tank.database.AppContainer +import ru.ulstu.`is`.pmu.tank.database.AppDatabase +import ru.ulstu.`is`.pmu.tank.model.Nation +import ru.ulstu.`is`.pmu.tank.model.NationWithTanks +import ru.ulstu.`is`.pmu.tank.repository.NationRepository +import ru.ulstu.`is`.pmu.tank.repository.OfflineNationRepository +import ru.ulstu.`is`.pmu.tank.repository.OfflineRemoteKeyRepository + +class RestNationRepository( + private val service: ServerService, + private val dbNationRepository: OfflineNationRepository, + private val dbRemoteKeyRepository: OfflineRemoteKeyRepository, + private val database: AppDatabase +) : NationRepository { + override suspend fun getAllNations(): List { + TODO("Not yet implemented") + } + + override suspend fun getAll(): Flow> { + @OptIn(ExperimentalPagingApi::class) + return Pager( + config = PagingConfig( + pageSize = 10, + enablePlaceholders = false + ), + remoteMediator = NationRemoteMediator( + service = service, + dbNationRepository = dbNationRepository, + dbRemoteKeyRepository = dbRemoteKeyRepository, + database = database, + ), + ) { + dbNationRepository.pagingSource() + }.flow + } + + override fun getSimpleNation(uid: Long): Flow { + TODO("Not yet implemented") + } + + override fun getFullNation(uid: Long): Flow { + TODO("Not yet implemented") + } + + override fun pagingSource(): PagingSource { + TODO("Not yet implemented") + } + + override suspend fun insertNation(nation: Nation) { + service.insertNation(nation.toRemote()).toNation() + } + + override suspend fun insertNations(nations: List) { + TODO("Not yet implemented") + } + + override suspend fun updateNation(nation: Nation) { + service.updateNation(nation.uid!!, nation.toRemote()) + } + + override suspend fun deleteNation(nation: Nation) { + service.deleteNation(nation.uid!!) + } + + override suspend fun deleteNations() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestTankReppository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestTankReppository.kt new file mode 100644 index 0000000..3f7b5ec --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestTankReppository.kt @@ -0,0 +1,66 @@ +package ru.ulstu.`is`.pmu.tank.api.repository + +import android.graphics.Bitmap +import kotlinx.coroutines.flow.Flow +import ru.ulstu.`is`.pmu.tank.api.ServerService +import ru.ulstu.`is`.pmu.tank.api.model.toLevel +import ru.ulstu.`is`.pmu.tank.api.model.toRemote +import ru.ulstu.`is`.pmu.tank.api.model.toTank +import ru.ulstu.`is`.pmu.tank.api.model.toTankWithNationAndLevel +import ru.ulstu.`is`.pmu.tank.api.model.toUser +import ru.ulstu.`is`.pmu.tank.model.Tank +import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel +import ru.ulstu.`is`.pmu.tank.model.User +import ru.ulstu.`is`.pmu.tank.repository.OfflineTankRepository +import ru.ulstu.`is`.pmu.tank.repository.OfflineUserRepository +import ru.ulstu.`is`.pmu.tank.repository.TankRepository +import ru.ulstu.`is`.pmu.tank.repository.UserRepository + +class RestTankReppository ( + private val service: ServerService, + private val dbTankRepository: OfflineTankRepository, +) : TankRepository { + override suspend fun getAll(): List { + dbTankRepository.deleteAll() + val tanks = service.getTanks().map { it.toTank() } + dbTankRepository.insertMany(tanks) + return tanks + } + + override suspend fun getForUserAll(userId: Long): List { + return service.getTanksForPurchase(userId).map { it.toTank() } + } + + override suspend fun getTank(uid: Long): Tank { + return service.getTank(uid).toTank() + } + + override suspend fun getUserTanks(uid: Long): List { + return service.getTanksFromHangar(uid).map { it.toTankWithNationAndLevel() } + } + + override suspend fun insertTank(tank: Tank, image: Bitmap) { + service.insertTank(tank.toRemote()) + } + + override suspend fun insertMany(tankList: List) { + TODO("Not yet implemented") + } + + override suspend fun updateTank(tank: Tank, image: Bitmap) { + service.updateTank(tank.tankId!!, tank.toRemote()) + } + + override suspend fun deleteTank(tank: Tank) { + TODO("Not yet implemented") + } + + override suspend fun delete(tankId: Long) { + service.deleteTank(tankId) + dbTankRepository.delete(tankId) + } + + override suspend fun deleteAll() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestUserRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestUserRepository.kt new file mode 100644 index 0000000..12f376e --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/api/repository/RestUserRepository.kt @@ -0,0 +1,44 @@ +package ru.ulstu.`is`.pmu.tank.api.repository + +import kotlinx.coroutines.flow.Flow +import ru.ulstu.`is`.pmu.tank.api.ServerService +import ru.ulstu.`is`.pmu.tank.api.model.toLevel +import ru.ulstu.`is`.pmu.tank.api.model.toRemote +import ru.ulstu.`is`.pmu.tank.api.model.toUser +import ru.ulstu.`is`.pmu.tank.model.Level +import ru.ulstu.`is`.pmu.tank.model.LevelWithTanks +import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel +import ru.ulstu.`is`.pmu.tank.model.User +import ru.ulstu.`is`.pmu.tank.repository.LevelRepository +import ru.ulstu.`is`.pmu.tank.repository.OfflineLevelRepository +import ru.ulstu.`is`.pmu.tank.repository.OfflineUserRepository +import ru.ulstu.`is`.pmu.tank.repository.UserRepository + +class RestUserRepository( + private val service: ServerService, + private val dbUserRepository: OfflineUserRepository, +) : UserRepository { + override fun getAllUsers(): Flow> { + TODO("Not yet implemented") + } + + override suspend fun getSimpleUser(email: String): User { + return service.getUserByEmail(email).toUser() + } + + override fun getFullUser(uid: Long): Flow>> { + TODO("Not yet implemented") + } + + override suspend fun insertUser(user: User) { + service.insertUser(user.toRemote()) + } + + override suspend fun updateUser(user: User) { + service.updateUser(user.userId, user.toRemote()) + } + + override suspend fun deleteUser(user: User) { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/TankList.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/TankList.kt index 5363342..f296e13 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/TankList.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/TankList.kt @@ -73,13 +73,11 @@ fun TankList( viewModel: TankListViewModel = viewModel(factory = AppViewModelProvider.Factory), listNations: NationDropDownViewModel = viewModel(factory = AppViewModelProvider.Factory) ) { - val tankListUiState by viewModel.tankListUiState.collectAsState() - // Lazy Column, Pass the numbers array if (navController != null) { TankList( nations = listNations.nationsListUiState, - listTanks = tankListUiState.tankList + listTanks = viewModel.tankListUiState.tankList ) { uid: Long -> val route = Screen.Constructor.route.replace("{id}", uid.toString()) navController.navigate(route) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/TankEditViewModel.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/TankEditViewModel.kt index 72ea040..79b4ed1 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/TankEditViewModel.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/TankEditViewModel.kt @@ -33,8 +33,6 @@ class TankEditViewModel( viewModelScope.launch { if (tankUid > 0) { tankUiState = tankRepository.getTank(tankUid) - .filterNotNull() - .first() .toUiState(true) } } diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/UserEditViewModel.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/UserEditViewModel.kt index bc01869..b586a00 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/UserEditViewModel.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/UserEditViewModel.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import ru.ulstu.`is`.pmu.tank.model.User +import ru.ulstu.`is`.pmu.tank.model.UserRole import ru.ulstu.`is`.pmu.tank.repository.UserRepository class UserEditViewModel( @@ -22,14 +23,12 @@ class UserEditViewModel( //private val userUid: Long = checkNotNull(savedStateHandle["id"]) - private val userUid: Long = 100L + private val userEmail: String = "egor@mail.ru" init { viewModelScope.launch { - if (userUid > 0) { - userUiState = userRepository.getSimpleUser(userUid) - .filterNotNull() - .first() + if (userEmail.length > 0) { + userUiState = userRepository.getSimpleUser(userEmail) .toUiState(true) } } @@ -44,8 +43,8 @@ class UserEditViewModel( suspend fun saveUser() { if (validateInput()) { - if (userUid > 0) { - userRepository.updateUser(userUiState.userDetails.toUser(userUid)) + if (userEmail.length > 0) { + userRepository.updateUser(userUiState.userDetails.toUser(100L)) } else { userRepository.insertUser(userUiState.userDetails.toUser()) } @@ -57,6 +56,7 @@ class UserEditViewModel( nickname.isNotBlank() && email.isNotBlank() && password.isNotBlank() + && role.value > -1 && balance > 0 } } @@ -71,6 +71,7 @@ data class UserDetails( val nickname: String = "", val email: String = "", val password: String = "", + val role: UserRole = UserRole.USER, val balance: Int = 0, ) @@ -79,6 +80,7 @@ fun UserDetails.toUser(uid: Long = 0): User = User( nickname = nickname, email = email, password = password, + role = role, balance = balance ) @@ -86,6 +88,7 @@ fun User.toDetails(): UserDetails = UserDetails( nickname = nickname, email = email, password = password, + role = role, balance = balance ) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/list/TankListViewModel.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/list/TankListViewModel.kt index 10ff01e..3380ea4 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/list/TankListViewModel.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/list/TankListViewModel.kt @@ -1,5 +1,8 @@ package ru.ulstu.`is`.pmu.tank.composeui.list +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.SharingStarted @@ -15,21 +18,11 @@ class TankListViewModel( private val tankRepository: TankRepository, private var userId: Long = 100L ) : ViewModel() { - val tankListUiState: StateFlow = tankRepository.getForUserAll(userId).map { - TankListUiState(it) - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(stopTimeoutMillis = AppDataContainer.TIMEOUT), - initialValue = TankListUiState() - ) + var tankListUiState by mutableStateOf(TankListUiState()) + private set - val usersTanksUiState: StateFlow = tankRepository.getUserTanks(userId).map { - UserTankListUiState(it) - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(stopTimeoutMillis = AppDataContainer.TIMEOUT), - initialValue = UserTankListUiState() - ) + var usersTanksUiState by mutableStateOf(UserTankListUiState()) + private set suspend fun deleteTank(tank: Tank) { tankRepository.deleteTank(tank) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/LevelDao.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/LevelDao.kt index 2657441..1427d7e 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/LevelDao.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/LevelDao.kt @@ -30,14 +30,21 @@ interface LevelDao { @Query( "SELECT level FROM levels where levels.uid = :uid" ) - open fun getSimpleLevelUid(uid: Long): Flow + open fun getSimpleLevelUid(uid: Long): Level @Insert suspend fun insert(level: Level) + @Insert + suspend fun insertMany(level: List) + + @Update suspend fun update(level: Level) @Delete suspend fun delete(level: Level) + + @Query("DELETE FROM levels") + suspend fun deleteAll() } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/NationDao.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/NationDao.kt index c00cc10..9a7c201 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/NationDao.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/NationDao.kt @@ -23,24 +23,33 @@ interface NationDao { suspend fun getNationsWithTanks(): List //получить конкретную нацию + @Transaction @Query("select * from nations where nations.uid = :uid") fun getNationUid(uid: Long): Flow //получить нацию без списка танков + @Transaction @Query( "SELECT nationName FROM nations where nations.uid = :uid" ) open fun getSimpleNationUid(uid: Long): Flow + @Transaction @Query("SELECT * FROM nations") fun pagingSource(): PagingSource @Insert suspend fun insert(nation: Nation) + @Insert + suspend fun insertMany(nations: List) + @Update suspend fun update(nation: Nation) @Delete suspend fun delete(nation: Nation) + + @Query("DELETE FROM nations") + suspend fun deleteAll() } diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/RemoteKeysDao.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/RemoteKeysDao.kt new file mode 100644 index 0000000..e45a080 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/RemoteKeysDao.kt @@ -0,0 +1,20 @@ +package ru.ulstu.`is`.pmu.tank.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import ru.ulstu.`is`.pmu.tank.model.RemoteKeyType +import ru.ulstu.`is`.pmu.tank.model.RemoteKeys + +@Dao +interface RemoteKeysDao { + @Query("SELECT * FROM remote_keys WHERE entityId = :entityId AND type = :type") + suspend fun getRemoteKeys(entityId: Int, type: RemoteKeyType): RemoteKeys? + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertAll(remoteKey: List) + + @Query("DELETE FROM remote_keys WHERE type = :type") + suspend fun clearRemoteKeys(type: RemoteKeyType) +} diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/TankDao.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/TankDao.kt index ccc5449..a02b0ea 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/TankDao.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/TankDao.kt @@ -16,33 +16,36 @@ import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel @Dao interface TankDao { @Query("select * from tanks GROUP BY nationId, levelId ORDER BY nationId") - fun getAll(): Flow> + fun getAll(): List //получить конкретный танк @Query("select t.*, ti.data from tanks AS t " + "LEFT JOIN tank_images as ti on t.image_id = ti.image_id " + "where t.tankId = :uid") - fun getTankUid(uid: Long): Flow + fun getTankUid(uid: Long): Tank //получаем все танки пользователя по его Id @Query( - "SELECT t.tankId, t.name, t.price, t.image_id, l.level, n.nationName, ti.data AS image FROM UserTankCrossRef AS ut " + + "SELECT t.tankId, t.name, t.price, t.image_id, l.level, n.nationName, ti.data AS image FROM users_tanks AS ut " + "LEFT JOIN tanks as t on ut.tankId = t.tankId " + "LEFT JOIN tank_images as ti on t.image_id = ti.image_id " + "LEFT JOIN levels as l on t.levelId = l.uid " + "LEFT JOIN nations as n on t.nationId = n.uid " + "WHERE ut.userId = :uid GROUP BY t.nationId, t.levelId ORDER BY t.nationId" ) - fun getUserTanks(uid: Long): Flow> + fun getUserTanks(uid: Long): List @Query( - "SELECT t.* FROM tanks AS t WHERE t.tankId NOT IN (SELECT ut.tankId FROM UserTankCrossRef AS ut WHERE ut.userId = :uid)" + "SELECT t.* FROM tanks AS t WHERE t.tankId NOT IN (SELECT ut.tankId FROM users_tanks AS ut WHERE ut.userId = :uid)" ) - fun getNotUserTank(uid: Long): Flow> + fun getNotUserTank(uid: Long): List @Insert suspend fun insert(tank: Tank) + @Insert + suspend fun insertMany(tankList: List) + @Update suspend fun update(tank: Tank) @@ -51,4 +54,7 @@ interface TankDao { @Query("DELETE FROM tanks WHERE tankId = :id") suspend fun delete(id: Long) + + @Query("DELETE FROM tanks") + suspend fun deleteAll() } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/UserDao.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/UserDao.kt index c37cd8e..708a448 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/UserDao.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/UserDao.kt @@ -11,7 +11,6 @@ import ru.ulstu.`is`.pmu.tank.model.Tank import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel import ru.ulstu.`is`.pmu.tank.model.User import ru.ulstu.`is`.pmu.tank.model.UserTankCrossRef -import ru.ulstu.`is`.pmu.tank.model.UserWithTanks @Dao interface UserDao { @@ -21,7 +20,7 @@ interface UserDao { //получить конкретного пользователя @Query( "SELECT u.*, t.*, l.level, n.nationName, ti.data AS image FROM users AS u " + - "LEFT JOIN UserTankCrossRef as ut on u.userId = ut.userId " + + "LEFT JOIN users_tanks as ut on u.userId = ut.userId " + "LEFT JOIN tanks as t on ut.tankId = t.tankId " + "LEFT JOIN tank_images as ti on ut.tankId = ti.image_id " + "LEFT JOIN levels as l on t.levelId = l.uid " + @@ -30,8 +29,8 @@ interface UserDao { ) fun getUserUid(uid: Long): Flow>> - @Query("select * from users where users.userId = :uid") - fun getSimpleUserUid(uid: Long): Flow + @Query("select * from users where users.email = :email") + fun getSimpleUserUid(email: String): User //добавить танк в ангар пользователя @Insert diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/AppDatabase.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/AppDatabase.kt index 953fe39..40cf4a6 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/AppDatabase.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/AppDatabase.kt @@ -20,8 +20,8 @@ import ru.ulstu.`is`.pmu.tank.model.Nation import ru.ulstu.`is`.pmu.tank.model.Tank import ru.ulstu.`is`.pmu.tank.model.TankImage import ru.ulstu.`is`.pmu.tank.model.User +import ru.ulstu.`is`.pmu.tank.model.UserRole import ru.ulstu.`is`.pmu.tank.model.UserTankCrossRef -import ru.ulstu.`is`.pmu.tank.model.UserWithTanks //тут, собственно говоря, всё и мутится с БД :))) @Database(entities = [Nation::class, Level::class, Tank::class, User::class, UserTankCrossRef::class, TankImage::class], version = 1, exportSchema = false) @@ -34,7 +34,7 @@ abstract class AppDatabase : RoomDatabase() { abstract fun tankImageDao() : TankImageDao companion object { - private const val DB_NAME: String = "19-db" + private const val DB_NAME: String = "20-db" @Volatile private var INSTANCE: AppDatabase? = null @@ -129,7 +129,7 @@ abstract class AppDatabase : RoomDatabase() { //Users val userDao = database.userDao() - val user = User(100L,"3tankista73", "egor@mail.ru", "12032003", 10000000) + val user = User(100L,"3tankista73", "egor@mail.ru", "12032003", UserRole.ADMIN, 10000000) userDao.insert(user) @@ -148,14 +148,14 @@ abstract class AppDatabase : RoomDatabase() { AppDatabase::class.java, DB_NAME ) - .addCallback(object : Callback() { - override fun onCreate(db: SupportSQLiteDatabase) { - super.onCreate(db) - CoroutineScope(Dispatchers.IO).launch { - populateDatabase(appContext) - } - } - }) +// .addCallback(object : Callback() { +// override fun onCreate(db: SupportSQLiteDatabase) { +// super.onCreate(db) +// CoroutineScope(Dispatchers.IO).launch { +// populateDatabase(appContext) +// } +// } +// }) .build() .also { INSTANCE = it } } diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/RemoteKeys.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/RemoteKeys.kt new file mode 100644 index 0000000..bb6c382 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/RemoteKeys.kt @@ -0,0 +1,25 @@ +package ru.ulstu.`is`.pmu.tank.model + +import androidx.room.Entity +import androidx.room.PrimaryKey +import androidx.room.TypeConverter +import androidx.room.TypeConverters + +enum class RemoteKeyType(private val type: String) { + NATION(Nation::class.simpleName ?: "Nation"); + + @TypeConverter + fun toRemoteKeyType(value: String) = RemoteKeyType.values().first { it.type == value } + + @TypeConverter + fun fromRemoteKeyType(value: RemoteKeyType) = value.type +} + +@Entity(tableName = "remote_keys") +data class RemoteKeys( + @PrimaryKey val entityId: Int, + @TypeConverters(RemoteKeyType::class) + val type: RemoteKeyType, + val prevKey: Int?, + val nextKey: Int? +) \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/User.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/User.kt index 67cdfef..ef77360 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/User.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/User.kt @@ -17,6 +17,8 @@ data class User ( val email: String, @ColumnInfo(name = "password") val password: String, + @ColumnInfo(name = "role") + val role: UserRole, @ColumnInfo(name = "balance") val balance: Int ){ @@ -25,8 +27,9 @@ data class User ( nickname: String, email: String, password: String, + role: UserRole, balance: Int - ) : this(0L, nickname, email, password, balance) + ) : this(0L, nickname, email, password, UserRole.ADMIN, balance) companion object { fun getUser(index: Long = 0L): User { @@ -35,6 +38,7 @@ data class User ( "3tankista73", "egor@mail.ru", "1234567890!", + UserRole.USER, 10000000 ) } @@ -50,6 +54,7 @@ data class User ( if (nickname != other.nickname) return false if (email != other.email) return false if (password != other.password) return false + if (role != other.role) return false if (balance != other.balance) return false return true @@ -60,6 +65,7 @@ data class User ( result = 31 * result + nickname.hashCode() result = 31 * result + email.hashCode() result = 31 * result + password.hashCode() + result = 31 * result + role.hashCode() result = 31 * result + balance return result } diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/UserRole.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/UserRole.kt new file mode 100644 index 0000000..a0ebe3a --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/UserRole.kt @@ -0,0 +1,6 @@ +package ru.ulstu.`is`.pmu.tank.model + +enum class UserRole(val value: Int) { + USER(0), + ADMIN(1) +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/UserTankCrossRef.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/UserTankCrossRef.kt index f1869f5..d384406 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/UserTankCrossRef.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/UserTankCrossRef.kt @@ -8,7 +8,10 @@ import androidx.room.PrimaryKey import org.jetbrains.annotations.NotNull //many to many for user and tank -@Entity(primaryKeys = ["userId", "tankId"]) +@Entity( + tableName = "users_tanks", + primaryKeys = ["userId", "tankId"] +) data class UserTankCrossRef( val userId: Long, val tankId: Long diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/LevelRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/LevelRepository.kt index 5318242..f508ef1 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/LevelRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/LevelRepository.kt @@ -6,9 +6,11 @@ import ru.ulstu.`is`.pmu.tank.model.LevelWithTanks interface LevelRepository { suspend fun getAllLevels(): List - fun getSimpleLevel(uid: Long): Flow + suspend fun getSimpleLevel(uid: Long): Level fun getFullLevel(uid: Long): Flow suspend fun insertLevel(level: Level) + suspend fun insertMany(levels: List) suspend fun updateLevel(level: Level) suspend fun deleteLevel(level: Level) + suspend fun deleteAll() } diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/NationRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/NationRepository.kt index 1e4bb70..63590cc 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/NationRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/NationRepository.kt @@ -1,16 +1,21 @@ package ru.ulstu.`is`.pmu.tank.repository +import androidx.paging.PagingData import androidx.paging.PagingSource import kotlinx.coroutines.flow.Flow +import ru.ulstu.`is`.pmu.tank.api.model.NationRemote import ru.ulstu.`is`.pmu.tank.model.Nation import ru.ulstu.`is`.pmu.tank.model.NationWithTanks interface NationRepository { suspend fun getAllNations(): List + suspend fun getAll(): Flow> fun getSimpleNation(uid: Long): Flow fun getFullNation(uid: Long): Flow fun pagingSource(): PagingSource suspend fun insertNation(nation: Nation) + suspend fun insertNations(nations: List) suspend fun updateNation(nation: Nation) suspend fun deleteNation(nation: Nation) + suspend fun deleteNations() } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineLevelRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineLevelRepository.kt index 2cfcca0..b50b1d3 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineLevelRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineLevelRepository.kt @@ -8,13 +8,16 @@ import ru.ulstu.`is`.pmu.tank.model.LevelWithTanks class OfflineLevelRepository(private val levelDao: LevelDao) : LevelRepository { override suspend fun getAllLevels(): List = levelDao.getAll() - override fun getSimpleLevel(uid: Long): Flow = levelDao.getSimpleLevelUid(uid) + override suspend fun getSimpleLevel(uid: Long): Level = levelDao.getSimpleLevelUid(uid) override fun getFullLevel(uid: Long): Flow = levelDao.getLevelUid(uid) override suspend fun insertLevel(level: Level) = levelDao.insert(level) + override suspend fun insertMany(levels: List) = levelDao.insertMany(levels) override suspend fun updateLevel(level: Level) = levelDao.update(level) override suspend fun deleteLevel(level: Level) = levelDao.delete(level) + + override suspend fun deleteAll() = levelDao.deleteAll() } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineNationRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineNationRepository.kt index 1490e5f..3bf598f 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineNationRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineNationRepository.kt @@ -1,5 +1,6 @@ package ru.ulstu.`is`.pmu.tank.repository +import androidx.paging.PagingData import androidx.paging.PagingSource import kotlinx.coroutines.flow.Flow import ru.ulstu.`is`.pmu.tank.dao.NationDao @@ -8,16 +9,25 @@ import ru.ulstu.`is`.pmu.tank.model.NationWithTanks class OfflineNationRepository(private val nationDao: NationDao) : NationRepository { override suspend fun getAllNations(): List = nationDao.getAll() + override suspend fun getAll(): Flow> { + TODO("Not yet implemented") + } override fun getSimpleNation(uid: Long): Flow = nationDao.getSimpleNationUid(uid) override fun getFullNation(uid: Long): Flow = nationDao.getNationUid(uid) - override fun pagingSource(): PagingSource = nationDao.pagingSource() + override fun pagingSource(): PagingSource { + return nationDao.pagingSource() + } override suspend fun insertNation(nation: Nation) = nationDao.insert(nation) override suspend fun updateNation(nation: Nation) = nationDao.update(nation) override suspend fun deleteNation(nation: Nation) = nationDao.delete(nation) + + override suspend fun insertNations(nations: List) = nationDao.insertMany(nations) + + override suspend fun deleteNations() = nationDao.deleteAll() } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineRemoteKeyRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineRemoteKeyRepository.kt new file mode 100644 index 0000000..16b995c --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineRemoteKeyRepository.kt @@ -0,0 +1,16 @@ +package ru.ulstu.`is`.pmu.tank.repository + +import ru.ulstu.`is`.pmu.tank.dao.RemoteKeysDao +import ru.ulstu.`is`.pmu.tank.model.RemoteKeyType +import ru.ulstu.`is`.pmu.tank.model.RemoteKeys + +class OfflineRemoteKeyRepository(private val remoteKeysDao: RemoteKeysDao) : RemoteKeyRepository { + override suspend fun getAllRemoteKeys(id: Int, type: RemoteKeyType) = + remoteKeysDao.getRemoteKeys(id, type) + + override suspend fun createRemoteKeys(remoteKeys: List) = + remoteKeysDao.insertAll(remoteKeys) + + override suspend fun deleteRemoteKey(type: RemoteKeyType) = + remoteKeysDao.clearRemoteKeys(type) +} diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineTankRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineTankRepository.kt index 70faccf..ad0ea96 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineTankRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineTankRepository.kt @@ -13,13 +13,13 @@ class OfflineTankRepository( private val tankDao: TankDao, private val tankImageDao: TankImageDao ) : TankRepository { - override fun getAll(): Flow> = tankDao.getAll() + override suspend fun getAll(): List = tankDao.getAll() - override fun getForUserAll(userId: Long): Flow> = tankDao.getNotUserTank(userId) + override suspend fun getForUserAll(userId: Long): List = tankDao.getNotUserTank(userId) - override fun getTank(uid: Long): Flow = tankDao.getTankUid(uid) + override suspend fun getTank(uid: Long): Tank = tankDao.getTankUid(uid) - override fun getUserTanks(uid: Long): Flow> = tankDao.getUserTanks(uid) + override suspend fun getUserTanks(uid: Long): List = tankDao.getUserTanks(uid) override suspend fun insertTank(tank: Tank, image: Bitmap) { val imageId = tankImageDao.insert( @@ -32,6 +32,10 @@ class OfflineTankRepository( tankDao.insert(tank.copy(imageId = imageId)) } + override suspend fun insertMany(tankList: List) { + tankDao.insertMany(tankList) + } + override suspend fun updateTank(tank: Tank, image: Bitmap) { val imageId = tankImageDao.insert( TankImage( @@ -49,4 +53,8 @@ class OfflineTankRepository( override suspend fun delete(tankId: Long) { tankDao.delete(tankId) } + + override suspend fun deleteAll() { + tankDao.deleteAll() + } } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineUserRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineUserRepository.kt index 8287561..6cdeeb5 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineUserRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineUserRepository.kt @@ -8,7 +8,7 @@ import ru.ulstu.`is`.pmu.tank.model.User class OfflineUserRepository(private val userDao: UserDao) : UserRepository { override fun getAllUsers(): Flow> = userDao.getAll() - override fun getSimpleUser(uid: Long): Flow = userDao.getSimpleUserUid(uid) + override suspend fun getSimpleUser(email: String): User = userDao.getSimpleUserUid(email) override fun getFullUser(uid: Long): Flow>> = userDao.getUserUid(uid) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/RemoteKeyRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/RemoteKeyRepository.kt new file mode 100644 index 0000000..2a9942b --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/RemoteKeyRepository.kt @@ -0,0 +1,10 @@ +package ru.ulstu.`is`.pmu.tank.repository + +import ru.ulstu.`is`.pmu.tank.model.RemoteKeyType +import ru.ulstu.`is`.pmu.tank.model.RemoteKeys + +interface RemoteKeyRepository { + suspend fun getAllRemoteKeys(id: Int, type: RemoteKeyType): RemoteKeys? + suspend fun createRemoteKeys(remoteKeys: List) + suspend fun deleteRemoteKey(type: RemoteKeyType) +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/TankRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/TankRepository.kt index 2063e25..37c654b 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/TankRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/TankRepository.kt @@ -7,12 +7,14 @@ import ru.ulstu.`is`.pmu.tank.model.TankExtra import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel interface TankRepository { - fun getAll(): Flow> - fun getForUserAll(userId: Long): Flow> - fun getTank(uid: Long): Flow - fun getUserTanks(uid: Long): Flow> + suspend fun getAll(): List + suspend fun getForUserAll(userId: Long): List + suspend fun getTank(uid: Long): Tank + suspend fun getUserTanks(uid: Long): List suspend fun insertTank(tank: Tank, image: Bitmap) + suspend fun insertMany(tankList: List) suspend fun updateTank(tank: Tank, image: Bitmap) suspend fun deleteTank(tank: Tank) suspend fun delete(tankId: Long) + suspend fun deleteAll() } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/UserRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/UserRepository.kt index bf27a96..7cd761a 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/UserRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/UserRepository.kt @@ -6,7 +6,7 @@ import ru.ulstu.`is`.pmu.tank.model.User interface UserRepository { fun getAllUsers(): Flow> - fun getSimpleUser(uid: Long): Flow + suspend fun getSimpleUser(email: String): User fun getFullUser(uid: Long): Flow>> suspend fun insertUser(user: User) suspend fun updateUser(user: User) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Hangar.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Hangar.kt index d41e25b..a9b7d44 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Hangar.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Hangar.kt @@ -1,14 +1,11 @@ package ru.ulstu.`is`.pmu.tanks.composeui import android.content.res.Configuration -import android.util.Log -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -20,20 +17,12 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.key -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -41,23 +30,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import androidx.navigation.compose.currentBackStackEntryAsState -import androidx.navigation.compose.rememberNavController -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.FlowCollector -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.withContext -import ru.ulstu.`is`.pmu.R -import ru.ulstu.`is`.pmu.composeui.navigation.Screen import ru.ulstu.`is`.pmu.tank.composeui.list.TankListViewModel -import ru.ulstu.`is`.pmu.tank.database.AppDatabase -import ru.ulstu.`is`.pmu.tank.model.Level -import ru.ulstu.`is`.pmu.tank.model.Nation -import ru.ulstu.`is`.pmu.tank.model.Tank import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel -import ru.ulstu.`is`.pmu.tank.model.UserWithTanks -import ru.ulstu.`is`.pmu.tanks.composeui.image.CuteImage import ru.ulstu.`is`.pmu.tanks.composeui.image.Dimensions import ru.ulstu.`is`.pmu.tanks.composeui.image.RoundedCorderImage import ru.ulstu.`is`.pmu.ui.AppViewModelProvider @@ -71,10 +45,9 @@ fun Hangar( viewModel: TankListViewModel = viewModel(factory = AppViewModelProvider.Factory) ){ viewModel.setUserId(100L) - val userTankListUiState by viewModel.usersTanksUiState.collectAsState() //новый вызов основного списка - Hangar(tankList = userTankListUiState.userTankList ) + Hangar(tankList = viewModel.usersTanksUiState.userTankList ) } @OptIn(ExperimentalMaterial3Api::class) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/ui/ImageTools.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/ui/ImageTools.kt index e6d71fc..91ab50d 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/ui/ImageTools.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/ui/ImageTools.kt @@ -1,6 +1,9 @@ package com.application.ui import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.util.Base64 +import java.io.ByteArrayOutputStream import kotlin.math.sqrt const val miniatureBound: Int = 250 @@ -23,4 +26,22 @@ fun Bitmap.resize(bound: Int): Bitmap { val newWidth: Int = (width / factor).toInt() val newHeight: Int = (height / factor).toInt() return Bitmap.createScaledBitmap(this, newWidth, newHeight, false) +} + +fun Bitmap.toByteArray(): ByteArray { + val outputStream = ByteArrayOutputStream() + this.compress(Bitmap.CompressFormat.PNG, 1, outputStream) + return outputStream.toByteArray() +} + +fun Bitmap.toBase64(): String { + return Base64.encodeToString(this.toByteArray(), Base64.DEFAULT) +} + +fun ByteArray.toBitmap(): Bitmap { + return BitmapFactory.decodeByteArray(this, 0, this.size) +} + +fun String.toBitmap(): Bitmap { + return Base64.decode(this, Base64.DEFAULT).toBitmap() } \ No newline at end of file