From 30ec1e2df80972e3eb89f61f9c0894f5926594ef Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 25 Jun 2023 14:27:48 +0300 Subject: [PATCH] Fully automated Forge version list and installation LexManos may feel free to fuck off ngl Also: makes the Arc DNS injector and the Forge installer separate components instead of non-overwritable assets, so that we can actually update them on the user's end --- .../src/main/assets/arc_dns_injector.jar | Bin 13261 -> 0 bytes .../arc_dns_injector/arc_dns_injector.jar | Bin 0 -> 9806 bytes .../forge_installer/forge_installer.jar | Bin 0 -> 78455 bytes .../src/main/assets/components/lwjgl3/version | 2 +- .../main/java/net/kdt/pojavlaunch/Tools.java | 8 +- .../fragments/MainMenuFragment.java | 10 +- .../modloaders/ForgeDownloadListener.java | 7 ++ .../modloaders/ForgeDownloadTask.java | 48 +++++++++ .../modloaders/ForgeDownloaderDialog.java | 94 ++++++++++++++++ .../pojavlaunch/modloaders/ForgeUtils.java | 46 ++++++++ .../modloaders/ForgeVersionListAdapter.java | 102 ++++++++++++++++++ .../modloaders/ForgeVersionListHandler.java | 39 +++++++ .../pojavlaunch/tasks/AsyncAssetManager.java | 3 +- .../net/kdt/pojavlaunch/utils/JREUtils.java | 2 +- .../layout/dialog_expandable_forge_list.xml | 19 ++++ .../src/main/res/values/strings.xml | 3 + arc_dns_injector/build.gradle | 4 +- forge_installer/.gitignore | 42 ++++++++ forge_installer/build.gradle | 25 +++++ .../git/artdeell/forgeinstaller/Agent.java | 98 +++++++++++++++++ .../forgeinstaller/ComponentFilter.java | 7 ++ .../artdeell/forgeinstaller/DialogFilter.java | 11 ++ .../forgeinstaller/MainWindowFilter.java | 13 +++ .../artdeell/forgeinstaller/ProfileFixer.java | 59 ++++++++++ settings.gradle | 1 + 25 files changed, 634 insertions(+), 9 deletions(-) delete mode 100644 app_pojavlauncher/src/main/assets/arc_dns_injector.jar create mode 100644 app_pojavlauncher/src/main/assets/components/arc_dns_injector/arc_dns_injector.jar create mode 100644 app_pojavlauncher/src/main/assets/components/forge_installer/forge_installer.jar create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloadListener.java create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloadTask.java create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloaderDialog.java create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeUtils.java create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeVersionListAdapter.java create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeVersionListHandler.java create mode 100644 app_pojavlauncher/src/main/res/layout/dialog_expandable_forge_list.xml create mode 100644 forge_installer/.gitignore create mode 100644 forge_installer/build.gradle create mode 100644 forge_installer/src/main/java/git/artdeell/forgeinstaller/Agent.java create mode 100644 forge_installer/src/main/java/git/artdeell/forgeinstaller/ComponentFilter.java create mode 100644 forge_installer/src/main/java/git/artdeell/forgeinstaller/DialogFilter.java create mode 100644 forge_installer/src/main/java/git/artdeell/forgeinstaller/MainWindowFilter.java create mode 100644 forge_installer/src/main/java/git/artdeell/forgeinstaller/ProfileFixer.java diff --git a/app_pojavlauncher/src/main/assets/arc_dns_injector.jar b/app_pojavlauncher/src/main/assets/arc_dns_injector.jar deleted file mode 100644 index fe94aba81a2b097bfba92338a4311d60f2262f0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13261 zcma*O1yo#J(ltzQch}$^pmBG1_YmCOHNma1V8PuXxI2xzyF0<%$(O8|dES|f{D1Yj zw@HPaU{U-d&+0e<@#LoHO zF!UMT>ERGyV8qa1V2u9-BkW`>rl2ZqXJu;aV(%nuZffW9!Pv&o**Qw>)M-TwlV6uN zj%>Eq^=sjlv#QMX)^b3DP<%qbF$HC}!VHfI6?1~NEP!eh3Q*?|S!%HSe>f_NUiM13w4{q!sK!B_d&@=x}$&w$L)F?|4mi zhLGoJ4_#fMqJn(qg4lMSrh3q^kr;Gw#pinEZ3U-6j1VMg54}BHKcMXhESM2DZpaPR zjA%y3&Y3X@s;Tk%Q~fA7y$vM`S8_38i&la9XeVK_3)kf4%BRnGAfMV}ddd9ZcmV7n z=r(t>r08te%$whfMjxx__B(JE5Ez#a!1U{7=3elj>A+HWpZk4AqlCmYnLSwZg-^`u z819t+ZO;-DB5ybTrh7J0q1KH2QFWH&r}wwxXqH zEqP8!%x@Y2($tklc-674Zv1ubNyfS!+slVZ!4p>%U2r)PPlid>$e4%#F;AP3>hbPy z(mGBJF&Uc3LbT{b?@^c>8N@Y==wp@_p5!kdQj*-*v33oiScsT>oJrlTmy^y$%{~)I z=?5q>-ucjAvkLO%xp_w|OFIuq6f>Yc`mCAXxdDvgD8w`Sc|gfW3R;W)$XzljTxcSN zgmyn0sk=Wgj;&r$%t70;XB^uZGdCdc&gTf&dQ}I2zX6@H{&a|Q^w{z2&fT7Q0yW;7^$4%O6NuJ$dG77=_2rm zKY?8b7leO<5buFN@#{}<+Cmk#4IRY(+;?GTn6u^sze5d7925KY(3zDG5M_X|={wPzFFNEDS5D72xhs}dI+7a2dJbDRdsZENQ`@|c_Eh`b%& z6xrs;9kR5HQJ!oQcH~Ow!xcSPii~cOoqEPh+V7}*T!Ux}95FFJ$`H9!R6`t1nV=MoWx1~OcKf0#92bukyP z{6dM`l1!Df(V#FO+2LE?tI4xlguA>GPp)@W4ov;#i1*1grEf`FX~u_Iez}lDV#cTL z$lXftD|S7l^>VM;Q{BXj!86lM=-c|n({73Hd4{RBTQW`0YKr#+_xEfzWgK@bgDUZ7IF}WBl*1Ib|Y; zNJty^Tk<69S6jAQ>%2xABoE4gBy@|IirSU~uiGV>_QJXTAsos0(VB(@y|a}Q<5n1E6(qg6mU(3WoT;c?nKkYCLr8sS;Ae^#hR zE;?yRM_3e(S4F4z{_d9OD5g&#)Eflzq3yHwTD zb=d{}ZrFBiUgtf5^GOhU$AQVwY{urye**V z2LnltGjJOy-8woeXY$n^(^5rw{S?X-yUzu(@Ky+QJw_=`b5IEyN}X&pI7Qgts+#3L zuAHvh`5gOx*g6B)ZIb|&@_22K);{3yn)z;qk-&Hi{)4uKZ+I(E$y!^5U(08ctUj8o ztbP9QYFnSo$kvoT*g%6u+u@s;Mo##ui7(ljc>#{+DwC?43m$s`S#;fAkEu z@cFVxvuzK7)3ftwuxfmK4NY6w4*!b^h@Ggjr_z;BL@d;wm4_G<7QM0A$fFR^cz@|1 zO)4gxVD#ehg50^lT(-kwXVFx$gYu9U%>lV2A9TSHP*vf>J;_|OBWmKh+9S#H79@Dg z6+GbD8;nA<*njnz$pn+_LuX_$iP7vOi@=nF?m*GQmjZjZNLOG0dd7S4AG`2lE*}h2 z?HIz1qUza@>c87wWkq*xMn`+5&&2gMQ(83de!|d7$Iq-%Wwnd)V(vUwK2A?etwyd& z**)eo)SAVYqiXi9;Uq2+9SN%n!ApvdCCV3~P}4bwuCPp!ujaE^94)$nHeCW1ru(b) z<1?aK>R^T!8l^l0jV6QpTTx?4k9~7nluGOK%sl@ROrtNyyH6oaG_lA*u;E|?*uYES zJ&DRJL2Nxa1N2!gIn}eRwA%@rPv~@XG0wqqm4I{HEH`vZ%sYQRb;{YsRF2TlWEhrE z3BX&fiyN)7h$F9%Z7J7UukDK4Yr(2E6LlviIXG%)NGfqPjcKf*8NV@MFl{}(&vCk~ zkfZ-7`{O3%WUf2{N+Eo?q3$s0{DHl#tT{-b$-QJABUj-&T~%sXFVVe2@xxP-TM8w5 zc>fUewNJlPVI2dHs8X8t z3~SzpTaw}zXk?fJCCB1sW zu_MfNaX?gz`2O(nq2(GTbShT9Grv22^GG0G`IbGwhKWgd}%2uhnr!tt1r=6#8~ zr%h#uFTR($Iw<)OL0t5qb8?c}@FF+M?{wfDB06E`;RkLd;+@ptY8Hg{E8|(9M?emP zMz6%|K7&U8ewCF*0R8w*q5!*WR+^`T)t;~2=<_NKe?=_sF`u^JJ>ll~b2HO3_HA#+ z&%z+C+dNLCXHE;Bap;6NQTJVQtgP;(u!GfCXZr^ zg>Yi)b8wyzfJU0u0w=EAIi+E+8I|^c0Di1dwnIHHcqQ<&?%v^5MI0KqJLWe{jBEB@ zABZ^nopqEE3mSA(PP3jl_Tna42&}Js2>HqdBLXP~5NfxP^im&e2=d{CMj|%6x{(UL z5QvJGo`ow;_6|8w%_p%qnrLIRMeoYJuu5iT5@_AKyFlT?rux{zvdMHn&QEN;8%l;5 zN_GY3``n0+9+X3vWA}tfU`82h3nX}0pp;Bz)iufBl8#YO-gcbbhATX^yxNwg$`+p7 zxiMy#NUqmPG?vC-&-#RfPI{Unfij?l?4>DlAuiO3o;gvKSbQ%%*=`#1N)aCSj^Z9t`!c69XlKp2fA%iyxaXAm5yGYg+qrisduR9UH>lE=q&EI zsuyn@gxTS|xQu{!NfDmE`L~e?7NZGPa3=JfWT~5EZJm!f`(*$+GC|JjyBHR1cuG#= zbbBoEM^8giK^#Rve@HC1K`Ir}%M#Uqb72%dv3VO$f>bZ0(u3Ewzz-pnSi73~!hW7x z+FMHlKP7e;c6M^TGV{VDBc<*{$(HO5%fJg;2m{Hc$h#k7K&G^bB=2 zd7F6R<{5H+xpTG>e%0Bea?5zFv8h7$=bMAK=}t1m%)+euwIx$`yuK&C(YEW3jh*ZE zjoZMV9hcZ&kRFO6O0KR+%zr{TU>^*VzRjI2;|UQFqs1sPb?NZYX~aOG_Ig%70V5`$ zvo|lnGP@4IANV?y`c9cjJ!;Sup)S}m(PGT|hMWU_dUoFiZ2p`E_rWtji>Zug$AQp_ zstli~M1b3X&Bos-?^WpbBmI(mk^UuZF%byxGz?7N5DyH|h7MrYF84i$N$7rCJi zcvOe#)|!^#cH`NnIQ1QPW&j;U4A_z{XSp*asNaq*p=$l5|zwL)>Ex=R5#=Cmc~?tD=q1IiE^GX@&*Dy@t7bw`W-X+WU%_R=fQuKC=?wU?I!(lCsjOPg*5LZl zt~8p*>tr`u;K&O3MxhTVO-fdAa@X37J)qQ)q1#e)er1x!#SXhqjbAan`horv~v6=n7#s zoJ7G}0SQ}Mt0|J0UA*n49|Oqx=y>EuT->Ukxq{3ZZtqjvy(Drm(&WwNMjo zp=XKbMkPa2bB3)NsNA7CqC6*Mib(jQWhj;X3&uTHYHBJIV^4Vy6HCRGA7AzsS3jFx zk0}zBf<;q+f#qUMaX@gvy!8XSnOfU-(!esh^~no@7Y)!_lceyqPZDZ+?1I8V-A3*} zv4<*1*FzV?{-OYKU7fr@UZ1;QCZ1-FxYuICUmrMUe|bk@5k~rbD+c_Um#e^#oWt?~ z7gv5)AE6Loe@BpR)&xM?GxDkgfrCEiXsWW=FS(o4!uIx~A+e29jAPfH#R;2Qoyi^UuY{E|Q7Yab5>z#Jd zQfS|0mEDNZE&8{NC24ba0AneY;xwBqAOTotyiEZ){%QC;G64GgP%rs^h#P) zbBHp!$B*)q0wO7$Uz?DbZL`{#(-r|Owr_ox4SIl8n;ys5E3#N5M_{Hl!HtD_X8%GG zWP(&Q_34SaP5r{B8{F-v(KzBj)pd?-sBAGo`m>bv`#`IY`!y-nW=y)>jf_Bj?Ogo~1)~BYG^M$dU z+UZu89r+xhDYQF- zrnDN_$@HDOYf*~m3&fepdF5s?B))p{4rL_XEMJ5X4N1U_c$&@l23Z9+~p<( zaiXJ9y`b5r;;!})t@2p4xES@{cWFrN$)oGBBB34=HWl(UQNfkSSuMbtO8p?A2>62g zWf!C6r#O6$_pvF17Ybe0jO*~=`ten5#Kc9^QOgq|Q(zn(!(|1D&Gkff&M7>0{iO+w zkMY_{g4&2scom~Ns4@Ke5(Naq#dpKWFB(7eMTg&)^vL-m>Dl)3KtB<;=s2uWLn!yx z_Tl!w(?K&yCEWGIL&nM=8qc!b%ye*N_wkRZQtBHFiy)u25DX7l9p#aMMcF1@*wXhw zz?q9EZ;FtJKrwe1C}<0{&e!A(_uyUNr2sIFY@y0MOtO0pl8 zqqHbg%YXe_hUq~?6yG^;7D#a{@8k}wVpcDGA=Ue;_fgh>-}=VsLn2?H2e z9VLFnDjxn6W&g@vj#ZF{nGmhqn>rTj7_o^oB^s1P7EnN@;1$Ltjn?Mgy#9h>t>EFj z3lOQP5t+FuE-sHPFOMxQcOV)mHGNOkHXPH?7CB-{5;hArQG-`!ild1-48X=-uVQE` z_CaBN7jpg4V4^En#W(!9y9K}sp53Gmgf z^~Ii5Jc16TGdg++9%&GaUlFBKNhxDbYD!JXf`{o-Mr6K@;mr01{9CY$V|jkIaEECkGa>p%`RR~~Ul~`b4^#2nnW9Vk6Vd~^; zX>a$BWER3F%sH%fd$$_iCAqIdvap>Ovfvc0q$E8|=&+=y;t=3d7Lx(80JzAswWika zcNOZp)austO2T5cWwVO3S8&2&CH2cXD>}L>%Q5wH%UL@0^H0L3&Gw=4U7xg@?%TW% z#(eMBn$JgfQxu6kfnjvw(sV~Iqp}-$)O;?Hp&jQ1H2gz9V0`vyH59#b{0<99rdXk0 zzg=nv`Wa0sB0Z%DPvG4+2WD~};y}MnXX79~B?@IW+MVMEeRVc?DU%f{tE6c(0-q zI~nHg5~oQ*t9DpyK9-tX#3xm00o9wsvHAqalH2}VPT_FFwpvlE!y^6;-r7I;rKT$a zNE4{h>iM`!rJ|{*B@>6H5_T=DoY)w-MS3i)>RkNRUc_-=WsZ=8T5N=KKgJRxyL_U7 z$)ClIfd-vQ4X7@vtvGDGNC=B3r#t4X(Q&yQ(bEZBx8Af!(N7QBz=oWP>l4wR9zwlK zK;kZTIB0}R)xKFGjGXXzw}fg57nBM<^?txLptUS;>yuAI_O`GQQ!$B2J5@fu0aovw z3PIrMmQWjg1Xr_oQOYq~FTsfr!}uH*NG&os2T}Ps;`^srJJi43v>-^B%hq=lu>3$r6wmXK@kVP%=aGrGy#jje>u1<#1_(9%Y?_!U{k*WuAlRu zLI8!tNx3|;BX;oQcUR~YeGK1dxZU(l6Jt!3B-{;h``TOQWZYx>vDK(edq!Kb0;~hn zQKl=RfbmJu!$ch-U<}3GRV{1FIc<#63g{xPd-C*Nkj%PkP9@rMTJyoyC6X2pOlk3g z*T-&IHV8O!Bb9#wtXWLUyVOc=-naXi+($l~Gjp zN}Zlbg!YDWi0Ws{V*y#neZaqt=ugOHNwbin(CKrDH^SsBiB#t-qu0Kz(g9g9mX&Gg zkNx1$IM&jiu;MR6D(9$K?zLhqBhd0qzDqSK#@$B)$+L(6*~Bvk4N)ZWdM#pbjU%eR ziR!|RF$Y*{;~&@Q2H19E_mvc^QR6FBmeMiahdCAw;y^7Ll+eQWd7Nyj0I9;l141&F zrJY*?ax{1&@MrQ0Y0&%1eW>`QP*PmJAj9Kde_oEXU$dLW@nqV_;crrZaO6@rBWLR^ zp$`n#6^X0z{Sn9edC#hqGTJYdr|SGz#9zy1{}Z9dl?W@0AQM7UbCkOOVkzWY?usz1 z9jg3$Oy0d+9yn$!&wwqB*3d^yCY>&K#Krj@As;Mof1IlLT&N#4ye6S5OBwjbI(W_v zDI+*Ay!R=u0tdz3yeZU##-IA;d$&0vzCj!55=OZ!Pd(rZvqCQ&9%#}u*G-|r4L}I{ zk;L$ojFy23a1RnboKg$=ZeEQMCTX{z0OCWm6q zq0}UDV?96uw?XcQ>03Th;a~KT-FQ6;0{M}@J33SZYI1wj2OgSEAL4IsB)_*qcd2M` z%3w9l2wdQ8TJJ_ewsUca4@@I!>+WU*Ql!jc1}ub?qm9N@$@}p5CEE3sHg*rgTurpb zh%s3X4A$c$Wmj^ipkW!kX)N!LW(BM+9VfO_#;8QcjbGQt?|;^>$Tg#!?{_6MwupA1 zZKesnzIwbyj$7e;d++H3x(zhpO9xUYyXS_YIg%7i`3-~XI?Pr#C0Cv)@$ywmYC0wJ ztmPP;^!{+4{y=>|d0}DI2eEr8+ORH6?8|xdJ#^C*Y48=UUdGPo?u+_akJRKEZc(h+ z*t_Q`{vwpl)A5<0&u?-df}1Flz7eV7G*zYZS=Gqbt1m`Hlbq_+s*glTO-uDel)|+2 z`W;2I;wQK47PT+!yS}kmm-<$=xpY8DvQ6AmOn{(|cP=_uDJcTDNb z>-!_MK26|e#Kp9|0_3&E#F}s`17Du}0#MavYBJWKZNX#+RqcG;9@8hdSX7)_XmZg|L+zqTh7t2PgMo zWz(qh-J%Dl@WsA2h#}4;g&QtgvFPcNOIYakN}Zaq$h7JM=iRpH!xX>9xY)AOoP2DF zVY5X-%2~s0et^s=QkJ)cW6XaR<_W*n5f`{0aES>eMm_qGJoQudIV@GL=uP1Lf@A3% z8x!~@>mjT83m9Hex}&n!G@fErNOEULdK!}(4Yy_{rTLvQd!~ZEAAUsI*G|dt<@oXn zGIf@W>0ZR)9=Hi?*7&%Yi*vu*mL}fnGsofiD)cwF}Fis`XJf+Vq>l2Cs-$E#Cs=M7(8av7um;Ms#qC9>q+e zG0-VJiwtK3aSykQPnyW1hUlrlc?VT>xdW))=h zOrt%^>S@z5!a_cQz3K|YC8|*R7z5Ac3b|&PXr)Z_Jvf~tJw{2o35vbu)#0zCDMfq* z!!w4`cu9E)MRJ~G8g3-6r9U-k?h)w^Xg)Lvxkruhz*bgsLnSOMoZofjHb6mDvn(^|v$h)A#gak3YC&VrYF{{>ZUzWZ`)PBZ7hX{0jW( z{!8HhR{>kp-qzOM&iU_oR!uk;wK=@EGaLK;JxWiwHX+!YcaUG<&{-Vo45vsTi4gs% zNNW=MhelcPaLu+yA%%4d*tKk}E3k1K-U&yM(M5_t2DQ-ZBsbh8sIGXOlxAA3DbVL0 zxo^mYUx>D!IqJMziJANH`Lb_fg>*0=SK<`Z_M_IB7b zHd@4bSmhDW#zg94C1MowEK$9}quL6J*~;VAsmT|`U~6AQh2$}co>G&gB0gk8;_E^u zari4czgE08>_gqU`g8m9j7)RjuiI$zo$aRCzU?0D-t~2^r zHR7cF?pU1IqV4c0h)baZ_mCJc7G|p zr663+xOz9uDT=EKRey#OAAZaf9y?xJxvguzL~Gw}cJS%6p{1=>A%&#MvW2W<#8tzG zqhY6#eBQW-8E_m%s=R=vu0tihhGDt*2n3BeW+Z*HML|>v&Btl&qd}E^d%Odw z6)uLagaI40k4v5)@*!dIbHy>^igaUjK28LlQMKz-lVQE)_h{$aTXILeIVwDA@=GT9 zGBD@gZs@=2#53Xnnp*)8;c|NNDB`S)MH~aI7^Kb$Vs~F1jXLGxbfB)H>FvV?c-Z6y z5L?*P9<9E`K;gR?;aq<=2D zT@y5=W|bITQa(#B&wbfN*4pT1see)zX~9J5Yo$3OvJv4?oB@CS2p^)A}yFB={z?HcuzhNeqRDlkNHYOwPCzUe&>)rq>j}YU{K`F zWW&oC=gi&0kV|mjI6IAaVVoph2C{LI-a3|cz2NP*+Qg`usGVTQ@Nqzhpi1_lmz_8X z%tIO9CvH7F{p@~)T(iVDCmzcLA|%e4YSl});KhENSN>QUk5*CybA`rE?98yTcjBWb zB&tUv4(4px6`W+*z_h6``99i+Vt>dT&lA5S5H|Hr2~s+~#m_YBtp40z)}RH?xy?J9 z>%7~eGM%gEYnu&gh&K_0^?h*kQ9EueNoL=3&WH6#!ZV9tPr|$RpP6n%Els^h;BC_4 z(mu}FNz^u?1Yc7L!W`@pr6d1p{p9eesKICq$(q*SC}hPG?E0h@fg2wO)L>!djhIs& zmI8{y&?={gKn{nuVLcGjpFNky@-hb}53AANna*OFs&xia{V;5swCP(9S(pq61{MMz zm}v%-$R(nxgM_#{!U2hm*;%P-$iG#5JiT76>{QH( z*V8CQVnOwLBf>qk!tMhWK6j}PXE9+9BZw0%?|k3&X{J?}Wk7umWV6Yl`NyI3j4^hBmDnfhEKF79qybhYLO1N3iBz%8ywSFW_~ zl7sU??$K!|8WYMGL&oH8lRbl;jMm4|UYUYs~myi0TQB!H-MJ}onXF8!_8^gs@S&O)( zlFbAcXfzN#1iZ*=6!}J*mSYf@z6GAgP6(F?iW69OORora_2oC0mlg-CD{AV&2Qa{g zX7hv@zaY6Fss=GflN$JhwB3?)I+bDyS82c4hh4uk@1O`kKYkblSB(3#_R? zNxUOs7*5wHCxDt`dl^bWy-xKVpOPu$OuIHikuvf6Rz(bPa^1D{(eXmy=6UQb*H5^IA z^F>?}2}z{>gBV|+VqaN$r~l_j@&~!L;Jj^HpAYNZESCZus3bLerXZ4j2bMHVp)e#J zp<^95a`X3^yBJ$?(^nR!;NS}E&oxP!A}|CW&GXkOAJl4xFdo7#b$i~{dbyYyElws7 z#bzUXA*mmGEigDSM6dyYr`uHEi9xXXFHkJtNf_eWF_0BhB4ThA?X%#im)ovZm1ari zVeQxt9uAov2^VT(G_s8xrE&C}y+3Un23S^)G)6jmajo4c&bhDZWiWqrTx5MmVw|54 zLiAMmxWs~p(GZbW)fz(@L*NqE=?!3FiYNVgek*K zKj`11wjZWP#TnB*SD}WZEQ$PcUhA8@t(-ANCyvf^ZkXhirpEqYg-Md!NE?i6hLH8f zS-qxxuTN#5ao6##)`6>I`j$FZ=BcZ5`j0uvq2oD9+cwSQ-l>mkpqQ<>IjiHxyo15Y znd-HUSIAabi+c-?UR(we7p8;kWUT3#M&NnI^oMOJ00jQNuM$g%00oj=iA~eK~Sm`B2&PHp1ZbqMcJ>&K~ zzXt;)*>~WW5dU42@M}l&%TU2ig@3>QB~kci*ng5J{C56r`Tn%O&VRxFNwDxI!*B0@ zs3CqU4E|=nFI@g>_*)+EzYxFm27j~Ph{<2We-RY?FX(Ue!QbpR^!3;9U!Z^2BK*nl zrxxKK9Qpn%@BTBxe^n;@N&RO_^#4&qLH%dyzxJ1ZHAw%-`DZ84|8W{2|9^7+y)Wob z&fgsW_{Dw~%l>A+Z(=;of9CvK>FiIQKTBu-V9NI&`=31jR!IAk_|L8R{}K0-|K|z* ebtC^}qplO@v8W0l)$Uq4bxd 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 literal 0 HcmV?d00001 diff --git a/app_pojavlauncher/src/main/assets/components/lwjgl3/version b/app_pojavlauncher/src/main/assets/components/lwjgl3/version index 92042ee01..750d4da31 100644 --- a/app_pojavlauncher/src/main/assets/components/lwjgl3/version +++ b/app_pojavlauncher/src/main/assets/components/lwjgl3/version @@ -1 +1 @@ -1678189863424 \ No newline at end of file +1687691695259 \ No newline at end of file diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index 306eb7cc0..115486537 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -590,11 +590,15 @@ public final class Tools { } public static void dialogOnUiThread(final Activity activity, final CharSequence title, final CharSequence message) { - activity.runOnUiThread(() -> new AlertDialog.Builder(activity) + activity.runOnUiThread(()->dialog(activity, title, message)); + } + + public static void dialog(final Context context, final CharSequence title, final CharSequence message) { + new AlertDialog.Builder(context) .setTitle(title) .setMessage(message) .setPositiveButton(android.R.string.ok, null) - .show()); + .show(); } public static void openURL(Activity act, String url) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/MainMenuFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/MainMenuFragment.java index 52dbeba07..edc715fa9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/MainMenuFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/MainMenuFragment.java @@ -3,10 +3,9 @@ package net.kdt.pojavlaunch.fragments; import static net.kdt.pojavlaunch.Tools.shareLog; import android.content.Intent; -import android.net.Uri; import android.os.Bundle; -import android.provider.DocumentsContract; import android.view.View; +import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageButton; import android.widget.Toast; @@ -15,12 +14,12 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; - import net.kdt.pojavlaunch.CustomControlsActivity; import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.Tools; import net.kdt.pojavlaunch.extra.ExtraConstants; import net.kdt.pojavlaunch.extra.ExtraCore; +import net.kdt.pojavlaunch.modloaders.ForgeDownloaderDialog; import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper; public class MainMenuFragment extends Fragment { @@ -52,6 +51,11 @@ public class MainMenuFragment extends Fragment { mPlayButton.setOnClickListener(v -> ExtraCore.setValue(ExtraConstants.LAUNCH_GAME, true)); mShareLogsButton.setOnClickListener((v) -> shareLog(requireContext())); + + mNewsButton.setOnLongClickListener((v)->{ + new ForgeDownloaderDialog().show(view.getContext(), (ViewGroup) view); + return true; + }); } private void runInstallerWithConfirmation(boolean isCustomArgs) { if (ProgressKeeper.getTaskCount() == 0) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloadListener.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloadListener.java new file mode 100644 index 000000000..085e227e8 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloadListener.java @@ -0,0 +1,7 @@ +package net.kdt.pojavlaunch.modloaders; + +public interface ForgeDownloadListener { + void onDownloadFinished(); + void onInstallerNotAvailable(); + void onDownloadError(Exception e); +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloadTask.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloadTask.java new file mode 100644 index 000000000..52c9f539a --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloadTask.java @@ -0,0 +1,48 @@ +package net.kdt.pojavlaunch.modloaders; + +import com.kdt.mcgui.ProgressLayout; + +import net.kdt.pojavlaunch.R; +import net.kdt.pojavlaunch.Tools; +import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper; +import net.kdt.pojavlaunch.utils.DownloadUtils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class ForgeDownloadTask implements Runnable, Tools.DownloaderFeedback { + private final String mForgeUrl; + private final String mForgeVersion; + private final File mDestinationFile; + private final ForgeDownloadListener mListener; + public ForgeDownloadTask(ForgeDownloadListener listener, String forgeVersion, File destinationFile) { + this.mListener = listener; + this.mForgeUrl = ForgeUtils.getInstallerUrl(forgeVersion); + this.mForgeVersion = forgeVersion; + this.mDestinationFile = destinationFile; + } + @Override + public void run() { + ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, 0, R.string.forge_dl_progress, mForgeVersion); + try { + byte[] buffer = new byte[8192]; + DownloadUtils.downloadFileMonitored(mForgeUrl, mDestinationFile, buffer, this); + mListener.onDownloadFinished(); + }catch (IOException e) { + if(e instanceof FileNotFoundException) { + mListener.onInstallerNotAvailable(); + }else{ + mListener.onDownloadError(e); + } + } + ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, -1, -1); + } + + @Override + public void updateProgress(int curr, int max) { + int progress100 = (int)(((float)curr / (float)max)*100f); + ProgressKeeper.submitProgress(ProgressLayout.INSTALL_MODPACK, progress100, R.string.forge_dl_progress, mForgeVersion); + } + +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloaderDialog.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloaderDialog.java new file mode 100644 index 000000000..26a96bec6 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeDownloaderDialog.java @@ -0,0 +1,94 @@ +package net.kdt.pojavlaunch.modloaders; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.Looper; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ExpandableListView; +import android.widget.ProgressBar; + +import net.kdt.pojavlaunch.JavaGUILauncherActivity; +import net.kdt.pojavlaunch.R; +import net.kdt.pojavlaunch.Tools; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +public class ForgeDownloaderDialog implements Runnable, ExpandableListView.OnChildClickListener, ForgeDownloadListener { + private final Handler mHandler = new Handler(Looper.getMainLooper()); + private ExpandableListView mExpandableListView; + private ProgressBar mProgressBar; + private AlertDialog mAlertDialog; + private File mDestinationFile; + private Context mContext; + public void show(Context context, ViewGroup root) { + this.mContext = context; + this.mDestinationFile = new File(context.getCacheDir(), "forge-installer.jar"); + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context); + View dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_expandable_forge_list, root, false); + mProgressBar = dialogView.findViewById(R.id.forge_list_progress_bar); + mExpandableListView = dialogView.findViewById(R.id.forge_expandable_version_list); + mExpandableListView.setOnChildClickListener(this); + dialogBuilder.setView(dialogView); + mAlertDialog = dialogBuilder.show(); + new Thread(this).start(); + } + + @Override + public void run() { + try { + List forgeVersions = ForgeUtils.downloadForgeVersions(); + mHandler.post(()->{ + if(forgeVersions != null) { + mProgressBar.setVisibility(View.GONE); + mExpandableListView.setAdapter(new ForgeVersionListAdapter(forgeVersions, LayoutInflater.from(mContext))); + }else{ + mAlertDialog.dismiss(); + } + }); + }catch (IOException e) { + mHandler.post(()->{ + mAlertDialog.dismiss(); + Tools.showError(mContext, e); + }); + } + } + + + + @Override + public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) { + String forgeVersion = (String)expandableListView.getExpandableListAdapter().getChild(i, i1); + new Thread(new ForgeDownloadTask(this, forgeVersion, mDestinationFile)).start(); + mAlertDialog.dismiss(); + return true; + } + + @Override + public void onDownloadFinished() { + Intent intent = new Intent(mContext, JavaGUILauncherActivity.class); + ForgeUtils.addAutoInstallArgs(intent, mDestinationFile, true); // since it's a user-invoked install, we want to create a new profile + mContext.startActivity(intent); + } + + @Override + public void onInstallerNotAvailable() { + mHandler.post(()-> { + mAlertDialog.dismiss(); + Tools.dialog(mContext, + mContext.getString(R.string.global_error), + mContext.getString(R.string.forge_dl_no_installer)); + }); + } + + @Override + public void onDownloadError(Exception e) { + mHandler.post(mAlertDialog::dismiss); + Tools.showError(mContext, e); + } +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeUtils.java new file mode 100644 index 000000000..588b90430 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeUtils.java @@ -0,0 +1,46 @@ +package net.kdt.pojavlaunch.modloaders; + +import android.content.Intent; + +import net.kdt.pojavlaunch.Tools; +import net.kdt.pojavlaunch.utils.DownloadUtils; + +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.util.List; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +public class ForgeUtils { + private static final String FORGE_METADATA_URL = "https://maven.minecraftforge.net/net/minecraftforge/forge/maven-metadata.xml"; + private static final String FORGE_INSTALLER_URL = "https://maven.minecraftforge.net/net/minecraftforge/forge/%1$s/forge-%1$s-installer.jar"; + public static List downloadForgeVersions() throws IOException { + String forgeMetadata = DownloadUtils.downloadString(FORGE_METADATA_URL); + try { + SAXParserFactory parserFactory = SAXParserFactory.newInstance(); + SAXParser parser = parserFactory.newSAXParser(); + ForgeVersionListHandler handler = new ForgeVersionListHandler(); + parser.parse(new InputSource(new StringReader(forgeMetadata)), handler); + return handler.getVersions(); + }catch (SAXException | ParserConfigurationException e) { + e.printStackTrace(); + return null; + } + } + public static String getInstallerUrl(String version) { + return String.format(FORGE_INSTALLER_URL, version); + } + + public static void addAutoInstallArgs(Intent intent, File modInstallerJar, boolean createProfile) { + intent.putExtra("javaArgs", "-javaagent:"+ Tools.DIR_DATA+"/forge_installer/forge_installer.jar" + + (createProfile ? "=NPS" : "") + // No Profile Suppression + " -jar "+modInstallerJar.getAbsolutePath()); + intent.putExtra("skipDetectMod", true); + } +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeVersionListAdapter.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeVersionListAdapter.java new file mode 100644 index 000000000..4b96cd03e --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeVersionListAdapter.java @@ -0,0 +1,102 @@ +package net.kdt.pojavlaunch.modloaders; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; +import android.widget.ExpandableListAdapter; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +public class ForgeVersionListAdapter extends BaseExpandableListAdapter implements ExpandableListAdapter { + private final List mGameVersions; + private final List> mForgeVersions; + private final LayoutInflater mLayoutInflater; + + public ForgeVersionListAdapter(List forgeVersions, LayoutInflater layoutInflater) { + this.mLayoutInflater = layoutInflater; + mGameVersions = new ArrayList<>(); + mForgeVersions = new ArrayList<>(); + for(String version : forgeVersions) { + int dashIndex = version.indexOf("-"); + String gameVersion = version.substring(0, dashIndex); + List versionList; + int gameVersionIndex = mGameVersions.indexOf(gameVersion); + if(gameVersionIndex != -1) versionList = mForgeVersions.get(gameVersionIndex); + else { + versionList = new ArrayList<>(); + mGameVersions.add(gameVersion); + mForgeVersions.add(versionList); + } + versionList.add(version); + } + } + + @Override + public int getGroupCount() { + return mGameVersions.size(); + } + + @Override + public int getChildrenCount(int i) { + return mForgeVersions.get(i).size(); + } + + @Override + public Object getGroup(int i) { + return getGameVersion(i); + } + + @Override + public Object getChild(int i, int i1) { + return getForgeVersion(i, i1); + } + + @Override + public long getGroupId(int i) { + return i; + } + + @Override + public long getChildId(int i, int i1) { + return i1; + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public View getGroupView(int i, boolean b, View convertView, ViewGroup viewGroup) { + if(convertView == null) + convertView = mLayoutInflater.inflate(android.R.layout.simple_expandable_list_item_1, viewGroup, false); + + ((TextView) convertView).setText(getGameVersion(i)); + + return convertView; + } + + @Override + public View getChildView(int i, int i1, boolean b, View convertView, ViewGroup viewGroup) { + if(convertView == null) + convertView = mLayoutInflater.inflate(android.R.layout.simple_expandable_list_item_1, viewGroup, false); + ((TextView) convertView).setText(getForgeVersion(i, i1)); + return convertView; + } + + private String getGameVersion(int i) { + return mGameVersions.get(i); + } + + private String getForgeVersion(int i, int i1){ + return mForgeVersions.get(i).get(i1); + } + + @Override + public boolean isChildSelectable(int i, int i1) { + return true; + } +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeVersionListHandler.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeVersionListHandler.java new file mode 100644 index 000000000..8de024ccd --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/modloaders/ForgeVersionListHandler.java @@ -0,0 +1,39 @@ +package net.kdt.pojavlaunch.modloaders; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import java.util.ArrayList; +import java.util.List; + +public class ForgeVersionListHandler extends DefaultHandler { + private List mForgeVersions; + private StringBuilder mCurrentVersion = null; + @Override + public void startDocument() throws SAXException { + mForgeVersions = new ArrayList<>(); + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + if(mCurrentVersion != null) mCurrentVersion.append(ch, start, length); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if(qName.equals("version")) mCurrentVersion = new StringBuilder(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (qName.equals("version")) { + String version = mCurrentVersion.toString(); + mForgeVersions.add(version); + mCurrentVersion = null; + } + } + public List getVersions() { + return mForgeVersions; + } +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncAssetManager.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncAssetManager.java index dffd6a899..0b13f357d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncAssetManager.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncAssetManager.java @@ -68,7 +68,6 @@ public class AsyncAssetManager { Tools.copyAssetFile(ctx, "launcher_profiles.json", Tools.DIR_GAME_NEW, false); Tools.copyAssetFile(ctx,"resolv.conf",Tools.DIR_DATA, false); - Tools.copyAssetFile(ctx,"arc_dns_injector.jar",Tools.DIR_DATA, false); } catch (IOException e) { Log.e("AsyncAssetManager", "Failed to unpack critical components !"); } @@ -86,6 +85,8 @@ public class AsyncAssetManager { // we repack them to a single file here unpackComponent(ctx, "lwjgl3", false); unpackComponent(ctx, "security", true); + unpackComponent(ctx, "arc_dns_injector", true); + unpackComponent(ctx, "forge_installer", true); } catch (IOException e) { Log.e("AsyncAssetManager", "Failed o unpack components !",e ); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index 6b537a6be..542d724ac 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -352,7 +352,7 @@ public class JREUtils { "-Dfml.earlyprogresswindow=false" //Forge 1.14+ workaround )); if(LauncherPreferences.PREF_ARC_CAPES) { - overridableArguments.add("-javaagent:"+new File(Tools.DIR_DATA,"arc_dns_injector.jar").getAbsolutePath()+"=23.95.137.176"); + overridableArguments.add("-javaagent:"+new File(Tools.DIR_DATA,"arc_dns_injector/arc_dns_injector.jar").getAbsolutePath()+"=23.95.137.176"); } List additionalArguments = new ArrayList<>(); for(String arg : overridableArguments) { diff --git a/app_pojavlauncher/src/main/res/layout/dialog_expandable_forge_list.xml b/app_pojavlauncher/src/main/res/layout/dialog_expandable_forge_list.xml new file mode 100644 index 000000000..39f67a91e --- /dev/null +++ b/app_pojavlauncher/src/main/res/layout/dialog_expandable_forge_list.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index e8059262e..07d94bccf 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -372,4 +372,7 @@ Increase it if the joystick drifts Force renderer to run on the big core Forces the Minecraft render thread to run on the core with the highest max frequency + Downloading installer for %s + Failed to load the version list + Sorry, but this version of Forge does not have an installer, which is not yet supported. diff --git a/arc_dns_injector/build.gradle b/arc_dns_injector/build.gradle index 01240331b..efb772202 100644 --- a/arc_dns_injector/build.gradle +++ b/arc_dns_injector/build.gradle @@ -11,5 +11,7 @@ jar { attributes("Manifest-Version": "1.0", "PreMain-Class": "git.artdeell.arcdns.ArcDNSInjectorAgent") } - destinationDirectory.set(file("../app_pojavlauncher/src/main/assets/")) + File versionFile = file("../app_pojavlauncher/src/main/assets/components/arc_dns_injector/version") + versionFile.write(String.valueOf(new Date().getTime())) + destinationDirectory.set(file("../app_pojavlauncher/src/main/assets/components/arc_dns_injector/")) } diff --git a/forge_installer/.gitignore b/forge_installer/.gitignore new file mode 100644 index 000000000..b63da4551 --- /dev/null +++ b/forge_installer/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/forge_installer/build.gradle b/forge_installer/build.gradle new file mode 100644 index 000000000..d836fede3 --- /dev/null +++ b/forge_installer/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java-library' +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +dependencies { + implementation 'org.json:json:20230618' +} + +jar { + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + File versionFile = file("../app_pojavlauncher/src/main/assets/components/forge_installer/version") + versionFile.write(String.valueOf(new Date().getTime())) + manifest { + attributes("Manifest-Version": "1.0", + "PreMain-Class": "git.artdeell.forgeinstaller.Agent") + } + destinationDirectory.set(file("../app_pojavlauncher/src/main/assets/components/forge_installer/")) +} \ No newline at end of file diff --git a/forge_installer/src/main/java/git/artdeell/forgeinstaller/Agent.java b/forge_installer/src/main/java/git/artdeell/forgeinstaller/Agent.java new file mode 100644 index 000000000..a36d9a2f7 --- /dev/null +++ b/forge_installer/src/main/java/git/artdeell/forgeinstaller/Agent.java @@ -0,0 +1,98 @@ +package git.artdeell.forgeinstaller; + +import java.awt.AWTEvent; +import java.awt.Component; +import java.awt.Container; +import java.awt.EventQueue; +import java.awt.Toolkit; +import java.awt.Window; +import java.awt.event.AWTEventListener; +import java.awt.event.WindowEvent; +import java.lang.instrument.Instrumentation; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.AbstractButton; +import javax.swing.JDialog; +import javax.swing.JOptionPane; + +public class Agent implements AWTEventListener { + private boolean forgeWindowHandled = false; + private final boolean suppressProfileCreation; + + public Agent(boolean ps) { + this.suppressProfileCreation = ps; + } + + @Override + public void eventDispatched(AWTEvent event) { + WindowEvent windowEvent = (WindowEvent) event; + Window window = windowEvent.getWindow(); + if(windowEvent.getID() == WindowEvent.WINDOW_OPENED) { + if(!forgeWindowHandled) { // false at startup, so we will handle the first window as the Forge one + handleForgeWindow(window); + forgeWindowHandled = true; + }else if(window instanceof JDialog) { // expecting a new dialog + handleDialog(window); + } + } + } + + public void handleForgeWindow(Window window) { + List components = new ArrayList<>(); + insertAllComponents(components, window, new MainWindowFilter()); + AbstractButton okButton = null; + for(Component component : components) { + if(component instanceof AbstractButton) { + AbstractButton abstractButton = (AbstractButton) component; + switch(abstractButton.getText()) { + case "OK": + okButton = abstractButton; // store the button, so we can press it after processing other stuff + break; + case "Install client": + abstractButton.doClick(); // It should be the default, but let's make sure + } + + } + } + if(okButton == null) { + System.out.println("Failed to set all the UI components."); + System.exit(17); + }else{ + ProfileFixer.storeProfile(); + EventQueue.invokeLater(okButton::doClick); // do that after forge actually builds its window, otherwise we set the path too fast + } + } + + public void handleDialog(Window window) { + List components = new ArrayList<>(); + insertAllComponents(components, window, new DialogFilter()); // ensure that it's a JOptionPane dialog + if(components.size() == 1) { + // another common trait of them - they only have one option pane in them, + // so we can discard the rest of the dialog structure + JOptionPane optionPane = (JOptionPane) components.get(0); + if(optionPane.getMessageType() == JOptionPane.INFORMATION_MESSAGE) { // forge doesn't emit information messages for other reasons yet + System.out.println("The install was successful!"); + ProfileFixer.reinsertProfile(suppressProfileCreation); + System.exit(0); // again, forge doesn't call exit for some reason, so we do that ourselves here + } + } + } + + public void insertAllComponents(List components, Container parent, ComponentFilter filter) { + int componentCount = parent.getComponentCount(); + for(int i = 0; i < componentCount; i++) { + Component component = parent.getComponent(i); + if(filter.checkComponent(component)) components.add(component); + if(component instanceof Container) { + insertAllComponents(components, (Container) component, filter); + } + } + } + + public static void premain(String args, Instrumentation inst) { + Toolkit.getDefaultToolkit() + .addAWTEventListener(new Agent(!"NPS".equals(args)), // No Profile Suppression + AWTEvent.WINDOW_EVENT_MASK); + } +} diff --git a/forge_installer/src/main/java/git/artdeell/forgeinstaller/ComponentFilter.java b/forge_installer/src/main/java/git/artdeell/forgeinstaller/ComponentFilter.java new file mode 100644 index 000000000..352128b56 --- /dev/null +++ b/forge_installer/src/main/java/git/artdeell/forgeinstaller/ComponentFilter.java @@ -0,0 +1,7 @@ +package git.artdeell.forgeinstaller; + +import java.awt.*; + +public interface ComponentFilter { + boolean checkComponent(Component component); +} diff --git a/forge_installer/src/main/java/git/artdeell/forgeinstaller/DialogFilter.java b/forge_installer/src/main/java/git/artdeell/forgeinstaller/DialogFilter.java new file mode 100644 index 000000000..d528b6946 --- /dev/null +++ b/forge_installer/src/main/java/git/artdeell/forgeinstaller/DialogFilter.java @@ -0,0 +1,11 @@ +package git.artdeell.forgeinstaller; + +import javax.swing.*; +import java.awt.*; + +public class DialogFilter implements ComponentFilter{ + @Override + public boolean checkComponent(Component component) { + return component instanceof JOptionPane; + } +} diff --git a/forge_installer/src/main/java/git/artdeell/forgeinstaller/MainWindowFilter.java b/forge_installer/src/main/java/git/artdeell/forgeinstaller/MainWindowFilter.java new file mode 100644 index 000000000..8f0921637 --- /dev/null +++ b/forge_installer/src/main/java/git/artdeell/forgeinstaller/MainWindowFilter.java @@ -0,0 +1,13 @@ +package git.artdeell.forgeinstaller; + +import javax.swing.*; +import java.awt.*; + +public class MainWindowFilter implements ComponentFilter{ + @Override + public boolean checkComponent(Component component) { + return component instanceof JRadioButton + || component instanceof JTextField + || component instanceof JButton; + } +} diff --git a/forge_installer/src/main/java/git/artdeell/forgeinstaller/ProfileFixer.java b/forge_installer/src/main/java/git/artdeell/forgeinstaller/ProfileFixer.java new file mode 100644 index 000000000..5228c0a2c --- /dev/null +++ b/forge_installer/src/main/java/git/artdeell/forgeinstaller/ProfileFixer.java @@ -0,0 +1,59 @@ +package git.artdeell.forgeinstaller; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.Random; + +public class ProfileFixer { + private static final Random random = new Random(); + private static final Path profilesPath = Paths.get(System.getProperty("user.home"), ".minecraft", "launcher_profiles.json"); + private static JSONObject oldProfile = null; + public static void storeProfile() { + try { + JSONObject minecraftProfiles = new JSONObject( + new String(Files.readAllBytes(profilesPath), + StandardCharsets.UTF_8) + ); + JSONObject profilesArray = minecraftProfiles.getJSONObject("profiles"); + oldProfile = profilesArray.optJSONObject("forge", null); + }catch (IOException | JSONException e) { + System.out.println("Failed to store Forge profile: "+e); + } + } + + private static String pickProfileName() { + return "forge"+random.nextInt(); + } + public static void reinsertProfile(boolean suppressProfileCreation) { + try { + JSONObject minecraftProfiles = new JSONObject( + new String(Files.readAllBytes(profilesPath), + StandardCharsets.UTF_8) + ); + JSONObject profilesArray = minecraftProfiles.getJSONObject("profiles"); + if(oldProfile != null) { + if(suppressProfileCreation) profilesArray.put("forge", oldProfile); // restore the old profile + else { + String name = pickProfileName(); + while(profilesArray.has(name)) name = pickProfileName(); + profilesArray.put(name, oldProfile); // restore the old profile under a new name + } + }else{ + if(suppressProfileCreation) profilesArray.remove("forge"); // remove the new profile + // otherwise it wont be removed + } + minecraftProfiles.put("profiles", profilesArray); + Files.write(profilesPath, minecraftProfiles.toString().getBytes(StandardCharsets.UTF_8), + StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE); + }catch (IOException | JSONException e) { + System.out.println("Failed to restore old Forge profile: "+e); + } + } +} diff --git a/settings.gradle b/settings.gradle index 695595b9e..0f0ae5d15 100644 --- a/settings.gradle +++ b/settings.gradle @@ -19,3 +19,4 @@ include ':jre_lwjgl3glfw' include ':app_pojavlauncher' include ':arc_dns_injector' +include ':forge_installer' \ No newline at end of file