From d9c29c675144d953baa1498390a72ccfe928cc36 Mon Sep 17 00:00:00 2001 From: Fmstrat Date: Fri, 21 Feb 2025 22:12:11 +0000 Subject: [PATCH 01/72] add support for building via a docker container [remote dev] --- .dockerignore | 15 ++++++++ .gitignore | 3 +- docker/Dockerfile | 84 +++++++++++++++++++++++++++++++++++++++++++++ docker/builder.sh | 21 ++++++++++++ docker/mkbuilder.sh | 14 ++++++++ 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 docker/Dockerfile create mode 100755 docker/builder.sh create mode 100755 docker/mkbuilder.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9baa71a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +LICENSE.md +README.md +analysis_options.yaml +android +assets +build +build.sh +data +docker +fastlane +lib +pubspec.lock +pubspec.yaml +sign.sh +test diff --git a/.gitignore b/.gitignore index 12e500c..0349890 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ app.*.map.json /android/app/.cxx # Custom -TODO.txt \ No newline at end of file +TODO.txt +data \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..c00e8df --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,84 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND noninteractive +ENV ANDROID_SDK_ROOT /opt/android-sdk-linux +ENV PATH "${PATH}:/opt/flutter/bin:/root/.pub-cache/bin:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:/opt/android-sdk-linux/platform-tools" + +ENV HOME=/root + +# Prereqs +RUN \ + apt-get update &&\ + apt-get install -y --no-install-recommends \ + bash \ + curl \ + file \ + git 2.x \ + unzip \ + xz-utils \ + zip \ + libglu1-mesa \ + libxi-dev \ + libxmu-dev \ + libglu1-mesa-dev \ + git-lfs \ + openssl \ + wget + +# Build prereqs +RUN \ + apt-get install -y \ + cmake curl git wget unzip libgconf-2-4 gdb libstdc++6 libglu1-mesa fonts-droid-fallback lib32stdc++6 python3 sed \ + cmake ninja-build build-essential libgl1-mesa-dev libegl1-mesa-dev libgles2-mesa-dev clang pkg-config libgtk-3-dev \ + liblzma-dev libmount-dev libblkid-dev libgcrypt20-dev libgpg-error-dev libssl-dev libpng-dev libjpeg-dev \ + libtiff-dev libgif-dev libgtk-3-dev + +# Android SDK prequisites +# https://developer.android.com/studio#command-tools +RUN \ + apt-get install -y --no-install-recommends \ + git \ + git-lfs \ + openssl \ + wget \ + unzip +# Android SDK +RUN \ + wget --quiet https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/tools.zip && \ + mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools && \ + unzip -q /tmp/tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools && \ + mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \ + rm -v /tmp/tools.zip && \ + mkdir -p /root/.android/ && touch /root/.android/repositories.cfg &&\ + apt-get install -y --no-install-recommends openjdk-17-jdk openjdk-17-jre &&\ + yes | sdkmanager --licenses &&\ + sdkmanager --update +# Platform tools +# Get latest with sdkmanager --list +RUN sdkmanager --install "build-tools;33.0.1" +RUN sdkmanager --install "ndk;26.3.11579264" +RUN sdkmanager --install "cmake;3.31.4" +RUN sdkmanager --install platform-tools +RUN sdkmanager --install emulator +RUN sdkmanager --install tools +RUN sdkmanager --install "platforms;android-28" +RUN sdkmanager --install "platforms;android-31" +RUN sdkmanager --install "platforms;android-33" +RUN sdkmanager --install "platforms;android-35" +RUN sdkmanager --install "platforms;android-34" +RUN sdkmanager --install "platforms;android-32" + +# Flutter +ARG DEV_UID=0 +RUN \ + wget --quiet https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.29.0-stable.tar.xz -O /tmp/flutter.tar.xz &&\ + mkdir -p /opt &&\ + cd /opt &&\ + tar xf /tmp/flutter.tar.xz &&\ + rm /tmp/flutter.tar.xz &&\ + git config --global --add safe.directory /opt/flutter &&\ + dart pub global activate cider &&\ + chown -R ${DEV_UID} /opt/flutter +RUN flutter --disable-analytics +RUN flutter upgrade +RUN chmod a+w /opt/flutter/packages -R diff --git a/docker/builder.sh b/docker/builder.sh new file mode 100755 index 0000000..c046ac0 --- /dev/null +++ b/docker/builder.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +cd ${SCRIPT_DIR}/.. +mkdir -p ./data/home +docker run \ + --rm \ + -ti \ + --net host \ + -v "${PWD}/../:${PWD}/../" \ + -w "${PWD}" \ + --name flutter-dev-obtainium \ + --user $(id -u) \ + -v ./data/home:/home/${USER} \ + -e USER=${USER} \ + -e HOME=/home/${USER} \ + -e ANDROID_USER_HOME=${HOME}/.android \ + -e GRADLE_USER_HOME=${HOME}/.gradle \ + -e PS1="${debian_chroot:+($debian_chroot)}${USER}@\h:\w\$ " \ + flutter-builder-obtainium \ No newline at end of file diff --git a/docker/mkbuilder.sh b/docker/mkbuilder.sh new file mode 100755 index 0000000..77fd71c --- /dev/null +++ b/docker/mkbuilder.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +D=$(date +'%Y%m%d.%H%M%S%3N') + +set -e + +cd "${SCRIPT_DIR}/.." +# Create the builder image +docker build \ + -t flutter-builder-obtainium \ + -f ./docker/Dockerfile \ + --build-arg="DEV_UID=$(id -u)" \ + . From 5dab58cc8918619b4b3117a93c53a7b3c17056c9 Mon Sep 17 00:00:00 2001 From: UjuiUjuMandan <125150101+UjuiUjuMandan@users.noreply.github.com> Date: Sun, 27 Apr 2025 23:51:45 +0800 Subject: [PATCH 02/72] Validate Fastlane metadata --- .github/workflows/fastlane.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/fastlane.yml diff --git a/.github/workflows/fastlane.yml b/.github/workflows/fastlane.yml new file mode 100644 index 0000000..b88c5eb --- /dev/null +++ b/.github/workflows/fastlane.yml @@ -0,0 +1,16 @@ +name: Validate Fastlane metadata + +on: + workflow_dispatch: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + go: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Validate Fastlane Supply Metadata + uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2 From 53caa88d6fc5745852980314268414bcfee58961 Mon Sep 17 00:00:00 2001 From: UjuiUjuMandan <125150101+UjuiUjuMandan@users.noreply.github.com> Date: Sun, 27 Apr 2025 23:51:56 +0800 Subject: [PATCH 03/72] ru/title.txt --- fastlane/metadata/android/ru/title.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/ru/title.txt diff --git a/fastlane/metadata/android/ru/title.txt b/fastlane/metadata/android/ru/title.txt new file mode 100644 index 0000000..e980f94 --- /dev/null +++ b/fastlane/metadata/android/ru/title.txt @@ -0,0 +1 @@ +Obtainium From fa6ed32ad5b6e96cfd29f0dbfd5e60073b0bb09a Mon Sep 17 00:00:00 2001 From: UjuiUjuMandan <125150101+UjuiUjuMandan@users.noreply.github.com> Date: Mon, 28 Apr 2025 00:07:46 +0800 Subject: [PATCH 04/72] test symbolic link --- .../en-US/images/phoneScreenshots/1.png | Bin 239280 -> 47 bytes .../en-US/images/phoneScreenshots/2.png | Bin 244222 -> 53 bytes .../en-US/images/phoneScreenshots/3.png | Bin 143732 -> 55 bytes .../en-US/images/phoneScreenshots/4.png | Bin 142079 -> 46 bytes .../en-US/images/phoneScreenshots/5.png | Bin 120691 -> 51 bytes .../en-US/images/phoneScreenshots/6.png | Bin 267760 -> 54 bytes 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 120000 fastlane/metadata/android/en-US/images/phoneScreenshots/1.png mode change 100644 => 120000 fastlane/metadata/android/en-US/images/phoneScreenshots/2.png mode change 100644 => 120000 fastlane/metadata/android/en-US/images/phoneScreenshots/3.png mode change 100644 => 120000 fastlane/metadata/android/en-US/images/phoneScreenshots/4.png mode change 100644 => 120000 fastlane/metadata/android/en-US/images/phoneScreenshots/5.png mode change 100644 => 120000 fastlane/metadata/android/en-US/images/phoneScreenshots/6.png diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png deleted file mode 100644 index ecd7aa823bfc949d1dff06adeae0b66c7234c711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239280 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 S>(uO@D^*caSIm=t;QL<`ejlCy diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png new file mode 120000 index 0000000..c78483b --- /dev/null +++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png @@ -0,0 +1 @@ +../../../../../../assets/screenshots/1.apps.png \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png deleted file mode 100644 index 699bbf7acbab8ce07eec813e4304d35c84744d3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244222 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.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 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png new file mode 120000 index 0000000..3101b70 --- /dev/null +++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png @@ -0,0 +1 @@ +../../../../../../assets/screenshots/2.dark_theme.png \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png deleted file mode 100644 index 04b0ae16954a5d1b9957ad72d31a42e0a8f913e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143732 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
h! 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

m^h+N}>9yM<@VWbuWWjjwe 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 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png new file mode 120000 index 0000000..481e3d9 --- /dev/null +++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png @@ -0,0 +1 @@ +../../../../../../assets/screenshots/3.material_you.png \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png deleted file mode 100644 index 55ae937f7afdd7295f4b9fcf5fb2d7900e1faed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142079 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%0A3)y0(TQ@u;d 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%0Ab z6XN3PE%(YO>hF^UYjdmO%(TqkIT|`D(bu%}%r_DTx9`L03!M3V=C}KOcYUmuzer}> z3VXHe@UUqroPb>RPPpWHEWw!OTNpP_<8oYSz_BAsS-85S@CEv7j9UIKoPlq?CT>OSXK#m2;~udSJFnD~4T z%PpSgGn|X&D<}F0QW%1mfPi+elzD#-&7~lTkB)w8wg23S0}CXI02a&3{|pWyd`@Iy zYQ6w@A@196B`w=)J=@Uhm&!tybfo+NuN`pMBT6Gy+yw@5t$?{e!$sc0hy4K^=jwVq zHZlV8D>gQ!UgQ-m|N4BP0FN()B(Lr6pW1R_OpY4))x7+C92{P+c@duw-9}4%sQmfv zNIy*3T$e(KOV#BwNrIo>P4ZlFJT9VGZ$sys!*GM?_IBbU6i%Sp9qN0V(C4&!JSG)( zVE2bhBbi*Fs=CxzNPn>JFS^HB4e=yHiBN;j**<@b#WaFE|5g~s! zQd(ZV*}A2*b$jT}_?W2ws!w=JgqxL)oAq07Fdd!QEDwU4oqeTI{l~|XgR`xL{_CF6 z)Z(^CExDk~|OskA}NJ?7}?QFU+_hDhN$iVSymn*ebbAmhTwf1}sb)IddCPB(iXY~>0c z^T!tlxn=8JtDMXRj_uE%_po6C(Eg#@n(MLSa*@sT1qIG{`+dan z_PKGcaEU93PfbNSJ>m0jsUdrAALm0A&(ES;;ds*Ruw2Co=$h1b4&S`82a>9bRyN<6 zzI_pqD(HRlXNe)u$(-$=qlWEE7Of<%Ac{La;c0B;=mSwa;M18Ggw>L>VFP^ONQU>3 zXfn(`uZ4XXDpZ#u=r}MQ7_r_R9X#r0J5Rsr&rd@Wg?ySqF6{gqk?nkX!heS#IT}lp zq@|`VHP~0$NA`n25%?|e`*t`dsm($;4J_czGH1rtCv7Y}>B zv4yfZ?jQjYN@y@3ISR2v_p^82bzeF;bugwsbWsEU!^$oW9xv-92h)U7$lDXlMw^*~ zbNqi)RJ7_XM^}S6+RvJv3@P3F(h_7Rr&0>TNw(PR*&eYq)Sr)x&GmSeY1Ch4L}g%| zmlqV;JiYT_-qdRbqRmHI!_nb8yxcebX}u7d**y?}2zjjmt4nqmtI zbPy?x#!_K+Wvg-@2jq*gBXk>_*X97Du#+SK++I+5#B`ha)MBJjisyK?uD~p;9v6tw zyeUbaIkUYL5{kJ#1X!?8gO>|prVY$6J)+5HUy_sO$~yABoDn{I6Q=vO*n2b6@{}T# zLDdn>AJX0c!LX$zOJbAv`=%CR)>NRW4!SNwg$fA<;gXDxk7^fu^BM>K7u%sPhQ2;% zK*Ck;a4pkaPCu7D*8BG_4hg6AZVrY~nE?HJs}I^`78v8~?+Hq+5JQ9NkI1SYBH}-p zi7jUjm6!)hV*oh`Sb#x8p{MIS?q!aL9;$=Io(6VxlHvMms5cfD}6f`CBY(*+F zur{+ava~VfYf?U1CC=gY_BL^v!iN-*;5$5MLPAkd(Qs#aSZH~YLa}g|(47F-vpy#}Ke!cHw0u=7x^`8#&8xXmtl@^7kRK-?-iz|-`%{ht! zVglRg#;>XkE?gIrtOX$SZKP3?B;0E}Q=_5)-}mW<97x~_SY`pJ&(2{*^Q-INxvwPv zNkIkQ80;Ps15JQJ?**`#nKl*%IobK}MyM{mx?A`yUQ#5$3~M5&7GM#dB;PyXirWZ*=gj1JYIfv+GCGaF;t8NXJ`QJ^ zn3%4vt;R%0tEj4QadK8xIJ;E1%=nYHk+-NQ>Ub$< zI!H>#D#pMIpoh8n`9MTh_Sq`GC{4me=YQtyKg`0^`##PpGM1R2V5#);^E*&qS}Jap zllvqv#iyZJmBIfCg&jEgz{R~GAS1rzUUsq7V;%qc4>K(nEiIRXltABfPe&G%VtfhZ z`{RGtiT7W}#s-15k)!+_ncy$^Y%9>*F*g^ia7=IB03|lK3u&3}*MBp|xwrt3M@R?< z(E;2NCRXTC(>lisY}RbB+CF*mxWS8RYiXjRy}hAF?D0MK3$Ed}w5pmfU-{GkgEv>CMi{W&{3!+rv6tqj7{X^jbd zAQD6=3wycj3{TYg5TIeaq|;g~1{Vd0>4?+?FS5g`0Xv}Zb}rd5m~Dh5CTbB#Nnn7j zFTq}zKuxEi@#1)??RxXPX&+lzO^pc8ok@UxG+*0J#_!Q@qJO<%7S5)onLzxjG^(_7 zQxuf}5{jr~9V_znKUrDp)0whT<{RI;zkl!U*2i@xJLDD-X(~pbJbv7fg^T+Ipsn}M z$6;-K?a^GVqK3-FPW4R1=au!D+?bPedun?6$?1%8If0}Dbv6P50=~wi#8}Uz5t1ff z{}R#H6^zS`Mqt+`6i%xxl3bvIM{>zV#>DK+m#b4z>6&C@;}dPRNjb^Fr!D<#EouX8OV1T)-|LwR&KLsC;)TlrZ`e0fzBrI2NG zLN0@pkAy@Azyd}`wdbqihb;elr(`5F%421sGB1xY+|!)iyvf%$B;G+$MB=do_;o;j zfczAU6dqgM-ht2V$0T2fQ2q@%-}R)WhxY_{7$GW-V{V9v{q&- zwY!`KpAAWAX?$90R8HD|2j@#qAn*l()1@4M3s*x6DQFKlm0hb`VO|bJaym*%jvMaG?#jpc5$z!gC(eJ@@lHbGaYTyXYR>NJ z_RK<-5ba^bi#?keH%FJX9Pg7=Lq$c@`=e3+*U<`MlhbTIgD zZV1|M#o=6FF9zZE`_KU~IhU@G5YUANHaVJ_ngThqyu7^c-Q@DGWdytl%t+EOIvSb` z&=w&p57=6441O196w=(l+7l`&oYfTuXHl(3H$SxLPgU%^SN(_*_Fqcyy*Ym}O+vyt z$!ltQCLz(@ws@ep{m&nO$&cnaVLHD%p0i( znAo3j&pvU-q^|8u^9R&K$d3?A%%??pdCw$tfB_oZpL($_ zSValOA9tX2h3aT%#K)fm=NX`oKKys}z>~4o!L9|aLK`b9re>E{uV{cDhBf`S@86#O zT0;9IV-qbb11qcE(sa@;GSs0t;Obd7KRPLW$~pmFMpH>tcmi~0fI#w4E| z?Xp)!qPQ&|b3A+*5BT~S!fK6~N-KH>h8~2=vaqi={@>cV(wx z=HLR3a$-hes;acAhbZ64|GP9Dv1NL?DCwfosQKE6D$weDs}l&i#y|wGp)A;U0hty)hI>{4^IsL zqfS3*-#~%VPx`+;#?zCu7E~#n2*Otx>1E~R62$mCX-kIWw<7%%U04H$u3&-t@8s_< zFFj1xtg$Rf$Vd)d9s}ZJeUB{iNk>1}@^wM7!KQ4M3pJd$p`d|TL?i+{WO1zj#@!nx zfhe8mpFiKeeY?1WiO9(45h&pKn&XB@JaP@|Z*G1s=2ytqb(n?1sqdWk5CtzYD8i4J z1T5 z^q*07(oF*h$@3?d2K5AQ@yMW{ekd%oGP9iM$gnyu5&}+_3ruDpl^rE=&-0zwxVV+Qai{aMhmS-7(gO6OEx7xg^xmI7$*8C* zvh&!DPWP8AJDgNLSC2rf!!SViQSfq$Bd>+&?|V30wYA(sJ|^MHCA z8wXo}zZR&5tc*quG@twVX~6^{l+?-N`AA&CCq%i~taoDygY`K5%YXz>2-+ zt5W9_3 z@LK>Et!RrIkj?QFT$TefU4u?`S=lnc4W$%rv=tAbswCP<uh|de#f|c)4>6}HN8Ydi=|=L7d`$skRn!K_hsSdtGn?8oq&I_vm?%S;g{=s zOpd0Kk~3fs2Hnjgc1G=5=4gQh(j}!ASoQ>c-1kRv!S>LO-b^$!EH|c`O;Wf6P?!PW z*#JUu`q-Xl^9)EOc!jYX9N2*xSxH$rby39Q3w-gaOpY2J3Lrs1C<%Fcr|Kl6q>z%H zStDD7bot$&Z(U`&!lB|v%9sx>uDDWl#+HvUfDN6yOFmMLhMm2%<2BKf}*^;!V~S2AUA-ayTK0MRRVDg#Q{z;7ahKR-=D(mWu&DQ0^C9XA0k?h1-fFs z+G&Lp;U5YYDu7w^n7z9Ab72~)HoP_G%doa?HkiW0!ocwLCAzk@S3b8IKst{wG0B5E zIy;y(h1ocm{9mHW$rZ}8?ys-gL_a4~R#FC6nZ6(a((g2XJO?tdE zKhX~vC(#3J20-KK(8aX0vh-8$Vr>fkY$|Ofe8vdI07f`0EUdE|7zaCp;po*~Qwr0n z*WrrPS|Sca5P~m;7f`9HZC9+Pl{gb95!llst%#uEcsG*Lgzjq<4%Jl3kI=h*w zv(ue8N?Tobl9N|r)6)r|v4i>jN_7CC)~SlUA@}JV84 z1)9(9-bKIs-q?6+{^>T%_+W5j5JTW@hLq^;W^t*h{}T%^zSG$E0ms-5ci|^l*~8PV zYUd@)Bd2o`X>z?U0>0F^A`Sbc6E5Qwe$w+wJ($ns`PX^S9&40t zkW|oK1Nzwp3rHTzjmMduia?PH3SYIk@b)~V0H&t(!X2>`5sXGib+H}NR@ciuSsQf7FzQ$Gd&$hq ze7?(TU}7S6XY1;^9;U7S@PXX`RJTh?`r>?fCaf3Pwcyjq<#K0((xhpqK)p*C`|`~@ z@-HEGS@JQ47D$W)5%D1I@|QBh>EJRo-19v&J0t= zq!tG_<4)H6ZfK#%onT~a?8phM3nJ1d&!G3=Tk7qK(rA$|s1UoJ-a2ewOlxwi2VWu| zp+)Snyy>P7_>}Z+XK}%p9OeU<3CXY*UQ2z1z=?!Kj9e~-mJ`dD7Z;k#Czan$!sLS9 zynUf2^)v;Dc|V{}mqWayrAwQ+f`o7}aIo}vAzR`4=ME=Ne?>+na2jr>(hrt5P2Mya zqdg<2Wp%*A+e9v=A$|q+Mo{v1uw;&n`^?li8Qa=Er8e1^fMGT2&z$(i0U)2MYj9+% zj*xKe8W*vyco}JohK=*1NT-I+XWQDA2R?K1aeZUMW~wY44%HpP@v0A8z!Bp^O=r}yF$*trYg`^$6XTSiMj06AN=YnU466XZHM?z3!hz#ZGO zf5z=~r4t@4hCV#Wqr(fCF0?vNaup=#sdXpXR6tJ~JIMLvJ`XFKtn~dM+tPkN4(ANArdpAu0NMFc!n?toZC@AJr z)$Cpd2x7Un(vS{Y905dla&m(|P*Izz2aqqN{{7&aJ$Qjw$j`p++k)eZ-8FirbmXl= zuB|OCx54av83209tgkr?SZW=@`^rIhnX78XPn{BXWDN-kMW+Vk&fMK0AO~II7XNIFq+ia^MIZBL2~*y>H_S}W#NK|HcWGo# z^{Sr6ohZ^7^kQT@#CnQjBBD`YK!RX3hyS3ov$bv68~^8kAS-(E$Wt#*PY$=2wfH@?CDrBh0k7%lb!#prvlWuvyxuS8S!s|D9&iL{ z`vV*#GIo@I?b&?21((pSoC3~!uYlhVCW&Ck!L6!LhFPBH|+tHuZ=1O1Omqdus7 zdR@(3G#5dwokZDFQ={RUn!lt+qqS>j(NdB=>ViQHhHpQ&L8-<$)!e+B{YGo1(-rQP zki*{`DmB)*TJzo}VV;F1g@2T9lf9fA%lH;7jEwkOy*Q~?ZJ3Xff){38ZN2d+|I&Oa z3*OcNY7jlp;0~`0IaJg$+EnX#I}(Je;gTe_o%ly;L7&#%KziR5llsp$+8$V_+GyLt z$rwt7RE_ad{R}fNu$2VR7fsQ;*MWN3ThWMu*c*TcAU+=-eJ{Br^(97N=;1?BBBZJD!U)@ljCE%V@4dZ-w3@DE58MQ;p1$VwFTm}DT>sT3lT@> z%BAv#gSh0VGwy%X?F{eI!C3I15;>oTmqV^oZf7s&e9PI{-ds#at^_SF-&Jc#7#fOt zi|MpQ?7n@EemQ3HBLqkU2d%gn7~kl@d}~2EJQKzQe5*iwe@-e`5aA_~z0cYozJNbo zyJ@sxZ;u#;dR1p-X13F}+rTRm@J7a4hOG`t7KG;e`&rm^UZDJb_~9Sai_~9bgFG6X z0eUG4tJ^y}<>ee0)O4L$f)n)?&3C>qO}Q@WgN%ZPPhZ^d#a^rv-RQ_|Z~LYw)YjEq za^;ztXw^K_QDpci6&@0Dw7s2Y=9Se`QBfodzUmN1QCmYoB8Sd~#h+hjdz;Kf&Q3Nr zCh8*^Q-s6l^g+){H9Y`_l3ef0iLWwI&Z;OW=^;mBOEc(ioK{BWz1%bkwn62TKMA~m zz6r4Je|a)GoeC@%TAhaLmu=;uT14QfpxjBxNrc^gnT@-82AX?i zW}E+nLKA?iVXw8WG|R`G6wq}|EDRH)92#W@Xm?n@ckJba8(<3Z%jW5QySsz=F~9FJ z?|eb8lht;0{H3qdsHk7>0`S0bBCOg%PFFhAZm52daVzAcEk>oFIUZ=n`FcAZW`k7mw;;1X6!mYORYJ4*euHoB!OU1Pfu$K zu75F-m6u*Vd**L=$Q=vVz^#ei57-1xR@c{`6Zu*@NCiu$ntPAfuKk_B0ptQ$>A+A2 z>$4;_70r~SR;FCUpOl3S42Wv9>Z3cCyVKg16rSD16dK(+dy1LY<0G()C%`ch*PDZxSe(~7C^+Gw1u>kB);{P@zpDWXLw2Z3V_zB z9tX&??JW{_97@(-u=n}hO!j8K0JeYUA5vCUmYkgYhwkp#u@=lGuk4r8l*YezZ}?WI z8QI<4jZMYxhxaQfiQ@UqrwTH4wJX6vA2YKj5oTL+U6|+2d;Pw6Z9kS_#b7+g;R7oq z&w>55pu+nWRVzFg9MbMqe=`8BCnj6n^w{bnqtZ*5IXO<_-PX#&K%#LMb?Dl5U< zjwMpteT;XTDwJ1TOl(av-1kQ8du2=*6#6j2?7@%vn8-*6mn|2ALH1(mw)-^@vCt4~ z>t0zn7+CexXM0tXK0MhB>AtZq7m0XqG3*?mq^Y@c^?k(U(T$OqJO9jB;-umWIb4D2 z%v6*a;zxvE*nW`T;as=u-_BxT35VGC;uybOXg{j6#6{X!7H7?QdX!L+3tU1PCUF`Z zb}Sv=O$spD!UU(>SmbX#!~{eAD1>}}&UO=2fh^Kg!T9Zn7iU+UZ{a)VZuB#Mk%45q zi{%uEjpyskOjEk>>sY*Jsd#SZO`7G}`DJ+_cw$lNi}Rq9X4JKxO{!!D&iR#h9~NfQ zMZ@F@jOgiZ}cWIe9+hU;mMQ7NV1Q6YeYJ7QUErl1#Wy0t%tELt-=U(x8_ zx*nldvrJ7*;ZSl$IlSJ2*RU`h-ubka5(Iguq-SLf=;6QPj`g_MY|ILc{~HKr@G%iEngw(@Qjpkx^xRR%H2;;MnR?bm(Ac&PDUZ7qLeS3*81CNWg6o=cKW)dt_f*r_z__@HO^dK%5&UJ zw`;)9Fzt!G=_XiCPXjv0g;wZ&;r*%HcEf#W5#E7wx=EDMpkRP%pM!a?t`a?X={vIq zVdbQFr>&#nzV-L=b2&YW27mR|0%*YY*SEy=_V3AwO1OIOUl}%Cz9xena@!zSRh26U zDk6pYr58aSE!3!TQ6ARJ$L+Zp0eGOThJb)qxO$){Y!lB$=^MNC5b>?QljXkAUwwavgFdMZ<|$Zh)eIGI{X9?eu6>k$!zobMq$f4b4^2(9i&t z(i5@nLP&8?z!MN(_NFu3%*h0dX`%pO`=bvRyk~So7=os+sj3Q+XErv22AiTKdVg9MpZjG;@2;xm|GjKX^qH={CLMr#k{4 z+UP4Rq~ocjIWx3X*U`}-jUc#56=G#&eH8%c*rR>Xu81n(U%I>GPZ3C)`ERNK7_UFG zg}JXaIJpsHeakE>lMyu(#pZbT=EBJrG=6)-vetmQxxdcmwcfyCt^f-&1qwKm)$i<8 z+^$-QP!Mo_DgWBPS^&=Yz3oL_$o_JNNS{^Rc}R%k*)ygz!xr#zuG7;Wyu;?eA~cO@ zO&43A-9*Fn!Jr0;AJ7!fj^C>4=SF%#fr_kb{qL8^ZacJy8`lzb1)h!lq8X_3_V!L$ z8HW$z+Qh{7Wx$UE$~_@#PGrz?@la!;`s8GCU$aZAzJUo=-q#vqE{EwkITo|E<-F%p zSs<5ka&#mWp*eURhN9yC`@s-45asF4KAm&E+*sX$1M)~r?BTT4Po97N`6rpfX`zCl z9EABxctLdZSk~!m|EGS18{dkms)>ySu%;U0lGpRuOqYC6Rt`OvOs=cHbGVsHc{tmq zFKo_cK764HfV2K4>zy6Gx4f^voVx-Zi>C;_KGna~o@)#i(H82j;6-jz$Im;E$X*SB zi;B6r{eSGebySt{_wR{82oeUMARr>5ARsN>A|Ry#($Xc}t%4vT-3`*+AT2H39Y?x3 zbiR8(PvGO)2&&>Yx_cF_(bZn)0YJUDNWMUpdxXWzS>pD49>#1_9bVZ|GHdv)v zUg=xSdqeCW_uLvrv$C>;@S34OQmafHtI0|k%aV0&*=s|?WvHfwdeo_{a+{V# zg;_-!nW)nD8$tMy6j75UQBlX>8#>^U*lr+MZsch!Ea+)e+j=MAHcV*keTy%bdh)2F zd}-J&pjvHM5*1TxxelA6;mA$^4AOfhkNn~DTo_IfWH|N)X!ixU=`*kWRbvsW^ zYa4TW!YzOt5S9J)R%=62A5Lz%!%;uK5)2_k6h;CTY@rLSZEezb_?wKs+P!=yYi=O$ z`t^+0cWW-S;f{fcoNzBl9TX9Np@04Mt?Dzgj5IM6ltxrJo-tEVO+vJOtWB>6Ess36 z+K`omAF-vPG#c~VaY5An<@?Pd13hcVt}wufzW27|m;vH?q~Rr^tn3JYp*w~>x)+8g zFTN`=ih+tstuh#NExm)2tn9?}F;7hEubY@b4DIAsoHkR(?-TqD>W9tLkEjg{446Ca zkej-kIPMc4P1Hc-OOojP`FXUsAmyb*O~KYD$Q}L#QWBErsE7)#gSCyNj%UQWe`nu| z7mq4S$s%}NOwA46A7(8Y8fJvb%Rg#TRq{^!F##rlhb@dZ@@!dVnJiIfeAR#b0Fw9bf+%>w)K#y!`y#pEV8Z z@~zhvSndDFPSFKmTQL;dEJ+gQ#W2})`GjlU2xQboRCji?1%xZ+7i@GqE4#zhs8YOm z<7z^Vl%m3GhP*?>akAm^at<~vm~;$X41#rnCbDWQVEo0##xxZ%ZoQP0F*{8v3@R*T zS9{%r_BCu^B{Yj#?aEhgVPY|4qBgY}y0fUK{Xu7ECwY%s&nMoNhiW)z#f0GhPc=2M zpN@!28n?|o$(j6JLONVjSSX^bxKo9JUr<^~)Zo{+Fq7g#fpgA*mR;nVV^0(m6jFI$ z)>!2oVoiAe(VbWLkkS6E9l=6^IxI-IPs8D*qHW4^V*f4oLGD_m_44~C)HEDv77~D&T`e zYIIvclIxx^owv>-VYC&nzdn{~8EJtoBO>G0@U;xI1nvCd{ONaPOw3#o`BFA^*7sKC zscC3vzExmRHja%sPK*?^wdF)e)Kvd@{u_dkVMI#@=w#TbG#DRCEmxio6VhBta9>{d zbIAIucDe;rOMa)nY%%q_{GqL_?^~`g{&j2#X>p>|hu~}5ag^oabuw=EPl>(|4GRfj zbxntSGjEao9R-`0}gCmLK1F&cDZt>dM+Uco(6LnK)XejttUIDBzMxc{!`1r+ED@OMcrE;6cvZsCgud)9ZLe9__jGYb-Ti9=RcSn|Oh+Sf~; zvEll^zE;Gf!F0m(qlrH}fi4m+ljHF2^HENF*YdXn1D~Kq7W42m{zv=!7ue^=uMW86 zng;LTb`V!;e;yv{jbFjH*xGW%KYbp@%KB`Vgh%M&)VTjn9e0o~Cq>NSu(^4uWuW4h z%5|27x(3X9GLTqvz$c{+bVO^s_V1EGe@{F4;EqESPs@%>JTJ~Q+|ZZe>(Va`miqO( zpT~uywfgUpC#9xR1_u4-J7XYzH60M+H$s(XiI4ipPiX`_?i%&ev?{- zGbbnYmstmN^e^B}fJl~jGA-H`1ZCj<*>yhXaA{8HNa0HPEdrfK&f~bWYFC?|FZBBiyJ;h(`GDtw!u3xkWU(dr+gZ7a~aEFf|?|J)lZ@0M<@+PBx@dbac75hj!s;Xm9&RQ+>+sHlRke7or!4--?S% z!6(r1^moU=z{u|r;3LGu#5zPvV_}kXbad?EUyyp>=I|(w*;zn+X+qWM@HiPB+TW4U zD50)yu@rCv3`s6#;S9@flKF-0PE$4iQnzjj|8XLLu}5uk|YY_)6-onYOmN zs0ZNSn+AZbMFU|8_WSmP01b;V)fM>>ZD#mo9STqASiT(G*%6?X$A;Uj7C*L@;vMdUIbF;s{AMizEBcq3E;a|ahg#HmQAS0rc zR{HiHs^Ov8{Jnm(lBK>q>t)AkM*^Xj(x$fR>iaGJ7ZfT0U4)^8gYtuHC2SK4WQll& zhK8IJYLHUimdP8Pz*2!DO z>0Z{$MXAVvCr(5>8gyi7{B8l5Ro!TNFk-}FkSrYm9nq;z<0B4;Ed zE@cy&+wH!hu%lm`(S`QLs2~cz)OLysSUF(x_s8xXh+6%vu!f_UFG-M+J ztLXXlYEU~ub6DM4Jp78lwZHq!{Y&CzIPnv&qea(8oJ$9;lao z(>IUy^3K1VQeIxP^Ng;QFLp=xd)*9AL9-kc~`v zC{BF&{@tI@PXP_hB)7`LW^b-iL@zKI$I$IFQh(0*as0E|qCyg>z7n*rg#Wggoa}+V z_7;RoM`nmMrOC?{S#cE^!Rp}8g;7tX)D(C*+7i+0 zMRNbBQ5(67BT}!3{&(pZla+ApMR*~wtsTE25*1=5&3aD56D8++x|o8w=|{^PY|@5x-{6IoiC;&KcDm4EL68d|A0w9yO^U)P~lVF z<$rhQ{e3Q|7QcG=<&!3xkLn1yN7uPEtv-tqr6tQ2kN(Qgo45fF@syJ-C*f{dR9_G2h%L z*x-$X_LY`M6VBOQ+k@{p5?ul&5JJ9(~?u-z7Y5fuesGarLuvKfhiXa_eS8 zDzhU#J2;3M5hbNrQAECW(f*^Mf;G!C8JGew|9<=3p3RT;X(;0PSoO8+0fp6Jiq{_Wx^np?6ii~Fc_UAfs?!r}7A{??R9+czaR-1G+j z#tfR4p;B4li=OAOcDkWEk6uTt-{U`WTU(!7oUZT)PRC>3^p=-zckcD8 z{auznytFX1ZAtz1nYk)XnM(xYwvv3w%o7ZO>+o1Ve%s!$67$_5Ve48g?Zy=!zKmAY zSabdk5tkOdeb4ae^3B7+PO0JFLZM>r$Bs8oDui9iuV`>8i4&vU|9N97XKc zgY645=1*4GZt1%|YOJml4erWRyY;+o?)2i-et1l3wJ`Yv1j_H~>WZ%0AKezS;}s9@ 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 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png new file mode 120000 index 0000000..bbdd89f --- /dev/null +++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png @@ -0,0 +1 @@ +../../../../../../assets/screenshots/5.app_opts.png \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png deleted file mode 100644 index 636eaf289ca1858b2bbcf48c050babfdd2a6ab72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267760 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%0D~9d!riN=Fy_eH1|6;q?R}kEwb1HwbMWgM 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%0Djof^l9fWD=LidMjT`jsJ&H8H{S)I1qU8eYJyPh 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 Date: Mon, 28 Apr 2025 00:12:12 +0800 Subject: [PATCH 05/72] symbolic link --- .../android/en-US/images/featureGraphic.png | Bin 67400 -> 41 bytes .../metadata/android/en-US/images/icon.png | Bin 44689 -> 39 bytes 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 120000 fastlane/metadata/android/en-US/images/featureGraphic.png mode change 100644 => 120000 fastlane/metadata/android/en-US/images/icon.png diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png deleted file mode 100755 index cc4481484c4f5ca25a3937520c9f8eacc5afd7dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67400 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 z 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 diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png new file mode 120000 index 0000000..1c313f1 --- /dev/null +++ b/fastlane/metadata/android/en-US/images/featureGraphic.png @@ -0,0 +1 @@ +../../../../../assets/graphics/banner.png \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png deleted file mode 100644 index 2cbf341fe113895f0e19372f5ec455d6a6c1ab52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44689 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 Date: Mon, 28 Apr 2025 00:24:59 +0800 Subject: [PATCH 06/72] Google Play requires 512x512 --- assets/graphics/icon-512x512.png | Bin 0 -> 44689 bytes fastlane/metadata/android/en-US/images/icon.png | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/graphics/icon-512x512.png diff --git a/assets/graphics/icon-512x512.png b/assets/graphics/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..2cbf341fe113895f0e19372f5ec455d6a6c1ab52 GIT binary patch literal 44689 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 Date: Tue, 29 Apr 2025 17:01:11 +0800 Subject: [PATCH 07/72] Add support for vivo App Store --- README.md | 1 + assets/translations/en.json | 1 + assets/translations/zh.json | 1 + .../android/en-US/full_description.txt | 1 + .../metadata/android/ru/full_description.txt | 1 + lib/app_sources/vivoappstore.dart | 105 ++++++++++++++++++ lib/providers/source_provider.dart | 2 + 7 files changed, 112 insertions(+) create mode 100644 lib/app_sources/vivoappstore.dart diff --git a/README.md b/README.md index 6518041..686b646 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Currently supported App sources: - [Huawei AppGallery](https://appgallery.huawei.com/) - [Tencent App Store](https://sj.qq.com/) - [CoolApk](https://coolapk.com/) + - [vivo App Store](https://h5.appstore.vivo.com.cn/) - [RuStore](https://rustore.ru/) - Jenkins Jobs - [APKMirror](https://apkmirror.com/) (Track-Only) diff --git a/assets/translations/en.json b/assets/translations/en.json index acc31b7..d5c431e 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -321,6 +321,7 @@ "refreshBeforeDownload": "Refresh app details before download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store", "name": "Name", "smartname": "Name (smart)", "sortMethod": "Sort method", diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 4e617a0..bb36a17 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -321,6 +321,7 @@ "refreshBeforeDownload": "下载前刷新应用程序详细信息", "tencentAppStore": "腾讯应用宝", "coolApk": "酷安", + "vivoAppStore": "vivo 应用商店", "name": "名称", "smartname": "姓名(智能)", "sortMethod": "排序方法", diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index d620444..7fed3cf 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -26,6 +26,7 @@
  • Huawei AppGallery
  • Tencent App Store
  • CoolApk
  • +
  • vivo App Store
  • Jenkins Jobs
  • RuStore
  • diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt index 7249abd..d67a272 100644 --- a/fastlane/metadata/android/ru/full_description.txt +++ b/fastlane/metadata/android/ru/full_description.txt @@ -26,6 +26,7 @@
  • Huawei AppGallery
  • Tencent App Store
  • CoolApk
  • +
  • vivo App Store
  • Jenkins Jobs
  • RuStore
  • diff --git a/lib/app_sources/vivoappstore.dart b/lib/app_sources/vivoappstore.dart new file mode 100644 index 0000000..6006746 --- /dev/null +++ b/lib/app_sources/vivoappstore.dart @@ -0,0 +1,105 @@ +import 'dart:convert'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:obtainium/custom_errors.dart'; +import 'package:obtainium/providers/source_provider.dart'; + +class VivoAppStore extends AppSource { + static const appDetailUrl = + 'https://h5coml.vivo.com.cn/h5coml/appdetail_h5/browser_v2/index.html?appId='; + + VivoAppStore() { + name = tr('vivoAppStore'); + hosts = ['h5.appstore.vivo.com.cn', 'h5coml.vivo.com.cn']; + naiveStandardVersionDetection = true; + canSearch = true; + } + + @override + String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { + var vivoAppId = + Uri.parse(url.replaceAll('/#', '')).queryParameters['appId']; + if (vivoAppId == null) { + throw InvalidURLError(name); + } + return '$appDetailUrl$vivoAppId'; + } + + @override + Future tryInferringAppId(String standardUrl, + {Map additionalSettings = const {}}) async { + var json = await getDetailJson(standardUrl, additionalSettings); + return json['package_name']; + } + + @override + Future getLatestAPKDetails( + String standardUrl, Map additionalSettings) async { + var json = await getDetailJson(standardUrl, additionalSettings); + var appName = json['title_zh'].toString(); + var packageName = json['package_name'].toString(); + var versionName = json['version_name'].toString(); + var versionCode = json['version_code'].toString(); + var developer = json['developer'].toString(); + var uploadTime = json['upload_time'].toString(); + var apkUrl = json['download_url'].toString(); + var apkName = '${packageName}_$versionCode.apk'; + return APKDetails( + versionName, [MapEntry(apkName, apkUrl)], AppNames(developer, appName), + releaseDate: DateTime.parse(uploadTime)); + } + + @override + Future?> getRequestHeaders( + Map additionalSettings, + {bool forAPKDownload = false}) async { + return { + 'User-Agent': + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36' + }; + } + + @override + Future>> search(String query, + {Map querySettings = const {}}) async { + var apiBaseUrl = + 'https://h5-api.appstore.vivo.com.cn/h5appstore/search/result-list?app_version=2100&page_index=1&apps_per_page=20&target=local&cfrom=2&key='; + var searchUrl = '$apiBaseUrl${Uri.encodeQueryComponent(query)}'; + var response = await sourceRequest(searchUrl, {}); + if (response.statusCode != 200) { + throw getObtainiumHttpError(response); + } + var json = jsonDecode(response.body); + if (json['code'] != 0 || !json['data']['appSearchResponse']['result']) { + throw NoReleasesError(); + } + Map> results = {}; + var resultsJson = json['data']['appSearchResponse']['value']; + for (var item in (resultsJson as List)) { + results['$appDetailUrl${item['id']}'] = [ + item['title_zh'].toString(), + item['developer'].toString() + ]; + } + return results; + } + + Future> getDetailJson( + String standardUrl, Map additionalSettings) async { + var vivoAppId = Uri.parse(standardUrl).queryParameters['appId']; + var apiBaseUrl = 'https://h5-api.appstore.vivo.com.cn/detail/'; + var params = '?frompage=messageh5&app_version=2100'; + + var detailUrl = '$apiBaseUrl$vivoAppId$params'; + var response = await sourceRequest(detailUrl, additionalSettings); + if (response.statusCode != 200) { + throw getObtainiumHttpError(response); + } + + var json = jsonDecode(response.body); + if (json['id'] == null) { + throw NoReleasesError(); + } + return json; + } +} diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 72bc931..dfa423d 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -31,6 +31,7 @@ import 'package:obtainium/app_sources/sourcehut.dart'; import 'package:obtainium/app_sources/telegramapp.dart'; import 'package:obtainium/app_sources/tencent.dart'; import 'package:obtainium/app_sources/uptodown.dart'; +import 'package:obtainium/app_sources/vivoappstore.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/mass_app_sources/githubstars.dart'; @@ -954,6 +955,7 @@ class SourceProvider { HuaweiAppGallery(), Tencent(), CoolApk(), + VivoAppStore(), Jenkins(), APKMirror(), RuStore(), From 2f54de6d7cad96459c73dfa25ef191aa31d7c40b Mon Sep 17 00:00:00 2001 From: Michael Wood Date: Fri, 2 May 2025 10:29:21 +0200 Subject: [PATCH 08/72] Use built-in method to fix HTML link resolution --- lib/app_sources/html.dart | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index af26cec..b00f73e 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -9,32 +9,7 @@ import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) { - if (ambiguousUrl.startsWith('//')) { - ambiguousUrl = '${referenceAbsoluteUrl.scheme}:$ambiguousUrl'; - } - try { - Uri.parse(ambiguousUrl).origin; - return ambiguousUrl; - } catch (err) { - // is relative - } - var currPathSegments = referenceAbsoluteUrl.path - .split('/') - .where((element) => element.trim().isNotEmpty) - .toList(); - String absoluteUrl; - if (ambiguousUrl.startsWith('/')) { - absoluteUrl = '${referenceAbsoluteUrl.origin}$ambiguousUrl'; - } else if (currPathSegments.isEmpty) { - absoluteUrl = '${referenceAbsoluteUrl.origin}/$ambiguousUrl'; - } else if (ambiguousUrl.split('/').where((e) => e.isNotEmpty).length == 1) { - absoluteUrl = - '${referenceAbsoluteUrl.origin}/${currPathSegments.join('/')}/$ambiguousUrl'; - } else { - absoluteUrl = - '${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - (currPathSegments.last.contains('.') ? 1 : 0)).join('/')}/$ambiguousUrl'; - } - return Uri.parse(absoluteUrl).toString(); + return referenceAbsoluteUrl.resolve(ambiguousUrl).toString(); } int compareAlphaNumeric(String a, String b) { From 8d062f029605c4288358619e0fbd1233e07e5ff9 Mon Sep 17 00:00:00 2001 From: iKirby <6316115+iKirby@users.noreply.github.com> Date: Tue, 6 May 2025 15:52:14 +0800 Subject: [PATCH 09/72] Remove unnecessary custom header --- lib/app_sources/vivoappstore.dart | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lib/app_sources/vivoappstore.dart b/lib/app_sources/vivoappstore.dart index 6006746..b68b694 100644 --- a/lib/app_sources/vivoappstore.dart +++ b/lib/app_sources/vivoappstore.dart @@ -49,16 +49,6 @@ class VivoAppStore extends AppSource { releaseDate: DateTime.parse(uploadTime)); } - @override - Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { - return { - 'User-Agent': - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36' - }; - } - @override Future>> search(String query, {Map querySettings = const {}}) async { From 7a7a6f78e98da9faf304d5433b3ea2aea302c869 Mon Sep 17 00:00:00 2001 From: iKirby <6316115+iKirby@users.noreply.github.com> Date: Tue, 6 May 2025 16:04:03 +0800 Subject: [PATCH 10/72] Indicate vivo App Store is for CN site only --- README.md | 2 +- assets/translations/en.json | 2 +- assets/translations/zh.json | 2 +- fastlane/metadata/android/en-US/full_description.txt | 2 +- fastlane/metadata/android/ru/full_description.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 686b646..b0b3bd9 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Currently supported App sources: - [Huawei AppGallery](https://appgallery.huawei.com/) - [Tencent App Store](https://sj.qq.com/) - [CoolApk](https://coolapk.com/) - - [vivo App Store](https://h5.appstore.vivo.com.cn/) + - [vivo App Store (CN)](https://h5.appstore.vivo.com.cn/) - [RuStore](https://rustore.ru/) - Jenkins Jobs - [APKMirror](https://apkmirror.com/) (Track-Only) diff --git a/assets/translations/en.json b/assets/translations/en.json index d5c431e..9ea7e44 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -321,7 +321,7 @@ "refreshBeforeDownload": "Refresh app details before download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", - "vivoAppStore": "vivo App Store", + "vivoAppStore": "vivo App Store (CN)", "name": "Name", "smartname": "Name (smart)", "sortMethod": "Sort method", diff --git a/assets/translations/zh.json b/assets/translations/zh.json index bb36a17..33e3782 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -321,7 +321,7 @@ "refreshBeforeDownload": "下载前刷新应用程序详细信息", "tencentAppStore": "腾讯应用宝", "coolApk": "酷安", - "vivoAppStore": "vivo 应用商店", + "vivoAppStore": "vivo 应用商店(中国)", "name": "名称", "smartname": "姓名(智能)", "sortMethod": "排序方法", diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 7fed3cf..ecdd345 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -26,7 +26,7 @@
  • Huawei AppGallery
  • Tencent App Store
  • CoolApk
  • -
  • vivo App Store
  • +
  • vivo App Store (CN)
  • Jenkins Jobs
  • RuStore
  • diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt index d67a272..61e9331 100644 --- a/fastlane/metadata/android/ru/full_description.txt +++ b/fastlane/metadata/android/ru/full_description.txt @@ -26,7 +26,7 @@
  • Huawei AppGallery
  • Tencent App Store
  • CoolApk
  • -
  • vivo App Store
  • +
  • vivo App Store (CN)
  • Jenkins Jobs
  • RuStore
  • From 26bca6df64cc686e968880e578c9fbc3b2adc45c Mon Sep 17 00:00:00 2001 From: iKirby <6316115+iKirby@users.noreply.github.com> Date: Tue, 6 May 2025 16:18:31 +0800 Subject: [PATCH 11/72] Fix parsing vivo app id from URL when using source override --- lib/app_sources/vivoappstore.dart | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/app_sources/vivoappstore.dart b/lib/app_sources/vivoappstore.dart index b68b694..fbd512e 100644 --- a/lib/app_sources/vivoappstore.dart +++ b/lib/app_sources/vivoappstore.dart @@ -17,11 +17,7 @@ class VivoAppStore extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { - var vivoAppId = - Uri.parse(url.replaceAll('/#', '')).queryParameters['appId']; - if (vivoAppId == null) { - throw InvalidURLError(name); - } + var vivoAppId = parseVivoAppId(url); return '$appDetailUrl$vivoAppId'; } @@ -76,20 +72,26 @@ class VivoAppStore extends AppSource { Future> getDetailJson( String standardUrl, Map additionalSettings) async { - var vivoAppId = Uri.parse(standardUrl).queryParameters['appId']; + var vivoAppId = parseVivoAppId(standardUrl); var apiBaseUrl = 'https://h5-api.appstore.vivo.com.cn/detail/'; var params = '?frompage=messageh5&app_version=2100'; - var detailUrl = '$apiBaseUrl$vivoAppId$params'; var response = await sourceRequest(detailUrl, additionalSettings); if (response.statusCode != 200) { throw getObtainiumHttpError(response); } - var json = jsonDecode(response.body); if (json['id'] == null) { throw NoReleasesError(); } return json; } + + String parseVivoAppId(String url) { + var appId = Uri.parse(url.replaceAll('/#', '')).queryParameters['appId']; + if (appId == null) { + throw InvalidURLError(name); + } + return appId; + } } From 9ce74beda51181e4400f658612e96f21d2f1df10 Mon Sep 17 00:00:00 2001 From: iKirby <6316115+iKirby@users.noreply.github.com> Date: Tue, 6 May 2025 16:56:13 +0800 Subject: [PATCH 12/72] Add appId empty check --- lib/app_sources/vivoappstore.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app_sources/vivoappstore.dart b/lib/app_sources/vivoappstore.dart index fbd512e..9b55ce2 100644 --- a/lib/app_sources/vivoappstore.dart +++ b/lib/app_sources/vivoappstore.dart @@ -89,7 +89,7 @@ class VivoAppStore extends AppSource { String parseVivoAppId(String url) { var appId = Uri.parse(url.replaceAll('/#', '')).queryParameters['appId']; - if (appId == null) { + if (appId == null || appId.isEmpty) { throw InvalidURLError(name); } return appId; From 1d69e42949dc3916dc81857a248239feafa29606 Mon Sep 17 00:00:00 2001 From: Michael Wood Date: Mon, 12 May 2025 13:18:16 +0200 Subject: [PATCH 13/72] Add allowOverride app source option --- lib/app_sources/coolapk.dart | 3 ++- lib/pages/add_app.dart | 10 ++++++++-- lib/providers/source_provider.dart | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/app_sources/coolapk.dart b/lib/app_sources/coolapk.dart index 01027da..741ec26 100644 --- a/lib/app_sources/coolapk.dart +++ b/lib/app_sources/coolapk.dart @@ -13,6 +13,7 @@ class CoolApk extends AppSource { hosts = ['www.coolapk.com', 'api2.coolapk.com']; allowSubDomains = true; naiveStandardVersionDetection = true; + allowOverride = false; } @override @@ -170,4 +171,4 @@ class CoolApk extends AppSource { return {'deviceCode': deviceCode, 'token': finalToken}; } -} \ No newline at end of file +} diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index 41d9f9c..327819a 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -407,8 +407,14 @@ class AddAppPageState extends State { defaultValue: pickedSourceOverride ?? '', [ MapEntry('', tr('none')), - ...sourceProvider.sources.map( - (s) => MapEntry(s.runtimeType.toString(), s.name)) + ...sourceProvider.sources + .where((s) => + s.allowOverride || + (pickedSource != null && + pickedSource.runtimeType == + s.runtimeType)) + .map((s) => + MapEntry(s.runtimeType.toString(), s.name)) ], label: tr('overrideSource')) ] diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 72bc931..a9852d6 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -586,6 +586,7 @@ abstract class AppSource { bool appIdInferIsOptional = false; bool allowSubDomains = false; bool naiveStandardVersionDetection = false; + bool allowOverride = true; bool neverAutoSelect = false; bool showReleaseDateAsVersionToggle = false; bool versionDetectionDisallowed = false; From b2742dd904c41b4acb52702ad3cd616f9e117adb Mon Sep 17 00:00:00 2001 From: bernikr Date: Wed, 14 May 2025 16:17:22 +0200 Subject: [PATCH 14/72] allow apkpure links for apks with no variant listt --- lib/app_sources/apkpure.dart | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 982c409..8894422 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -128,7 +128,21 @@ class APKPure extends AppSource { .toList() ?? []; if (apkUrls.isEmpty) { - throw NoAPKError(); + var link = + html.querySelector("a.download-start-btn")?.attributes['href']; + RegExp downloadLinkRegEx = RegExp( + r'^https:\/\/d\.[^/]+\/b\/([^/]+)\/[^/?]+\?versionCode=([0-9]+).$', + caseSensitive: false); + RegExpMatch? match = downloadLinkRegEx.firstMatch(link ?? ''); + if (match == null) { + throw NoAPKError(); + } + String type = match.group(1)!; + String versionCode = match.group(2)!; + apkUrls = [ + MapEntry('$appId-$versionCode-.${type.toLowerCase()}', + 'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode') + ]; } String version = Uri.parse(link).pathSegments.last; String? author; From 6c3a496be11a6dba412f23308cb28056193246b7 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 00:42:38 -0400 Subject: [PATCH 15/72] Add missing update ownership permission (#2078) --- android/app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d461e3b..6400b9b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -69,6 +69,7 @@ + From ab3489f60d58069e709b53f136b6bbae7b6a1ddd Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 00:51:22 -0400 Subject: [PATCH 16/72] Update colour picker component to pick up layout fix (#2258) --- pubspec.lock | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 34730b9..181d33d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -312,10 +312,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "8986dec4581b4bcd4b6df5d75a2ea0bede3db802f500635d05fa8be298f9467f" + sha256: "77f8e81d22d2a07d0dee2c62e1dda71dc1da73bf43bb2d45af09727406167964" url: "https://pub.dev" source: hosted - version: "10.1.2" + version: "10.1.9" fixnum: dependency: transitive description: @@ -328,10 +328,10 @@ packages: dependency: "direct main" description: name: flex_color_picker - sha256: c083b79f1c57eaeed9f464368be376951230b3cb1876323b784626152a86e480 + sha256: "8f753a1a026a13ea5cc5eddbae3ceb886f2537569ab2e5208efb1e3bb5af72ff" url: "https://pub.dev" source: hosted - version: "3.7.0" + version: "3.7.1" flex_seed_scheme: dependency: transitive description: @@ -498,10 +498,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "634622a3a826d67cb05c0e3e576d1812c430fa98404e95b60b131775c73d76ec" + sha256: "08fb8315236099ff8e90cb87bb2b935e0a724a3af1623000a9cec930468e0f27" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.7+1" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -540,10 +540,10 @@ packages: dependency: transitive description: name: fraction - sha256: "7804c9a73d26bd3d5ccf52b7225eecd0af4e33b310729726dc8f8bb14c217716" + sha256: dd487c01c0bfdcccc44d15250b24b4bee94b6981e01e8c41007a1b02f395ea01 url: "https://pub.dev" source: hosted - version: "5.0.4" + version: "5.0.5" gtk: dependency: transitive description: @@ -572,10 +572,10 @@ packages: dependency: "direct main" description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" http_parser: dependency: transitive description: @@ -868,10 +868,10 @@ packages: dependency: "direct main" description: name: provider - sha256: "489024f942069c2920c844ee18bb3d467c69e48955a4f32d1677f71be103e310" + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "6.1.5" share_plus: dependency: "direct main" description: @@ -1075,10 +1075,10 @@ packages: dependency: transitive description: name: timezone - sha256: ffc9d5f4d1193534ef051f9254063fa53d588609418c84299956c3db9383587d + sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1 url: "https://pub.dev" source: hosted - version: "0.10.0" + version: "0.10.1" typed_data: dependency: transitive description: @@ -1195,42 +1195,42 @@ packages: dependency: "direct main" description: name: webview_flutter - sha256: caf0f5a1012aa3c2d33c4215adc72dc1194bb59a2d3ed901f457965626805e66 + sha256: "62d763c27ce7f6cef04b3bec01c85a28d60149bffd155884aa4b8fd4941ea2e4" url: "https://pub.dev" source: hosted - version: "4.11.0" + version: "4.12.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: "6b0eae02b7604954b80ee9a29507ac38f5de74b712faa6fee33abc1cdedc1b21" + sha256: "5ece28a317a9f76ad5ee17c78dbacc8a491687cec85ee19c1643761bf8d678ef" url: "https://pub.dev" source: hosted - version: "4.4.2" + version: "4.6.0" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "18b1640839cf6546784a524c72aded5b6e86b23e7167dc2311cc96f7658b64bd" + sha256: "7cb32b21825bd65569665c32bb00a34ded5779786d6201f5350979d2d529940d" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.13.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: c9f9be526fa0d3347374ceaa05c4b3acb85f4f112abd62f7d74b7d301fa515ff + sha256: "6af7d1908c9c89311c2dffcc2c9b51b88a6f055ba16fa0aa8a04cbb1c3afc9ce" url: "https://pub.dev" source: hosted - version: "3.20.0" + version: "3.21.0" win32: dependency: transitive description: name: win32 - sha256: dc6ecaa00a7c708e5b4d10ee7bec8c270e9276dfcab1783f57e9962d7884305f + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" url: "https://pub.dev" source: hosted - version: "5.12.0" + version: "5.13.0" win32_registry: dependency: transitive description: @@ -1264,5 +1264,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.7.2 <4.0.0" flutter: ">=3.27.0" From 34848794e47124396053ad1ee3882f3acc164733 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 00:53:02 -0400 Subject: [PATCH 17/72] Fix a few more title case lines (#2284) --- assets/translations/en.json | 4 ++-- lib/pages/apps.dart | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index acc31b7..b2a70b2 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -327,8 +327,8 @@ "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", "removeAppQuestion": { - "one": "Remove App?", - "other": "Remove Apps?" + "one": "Remove app?", + "other": "Remove apps?" }, "tooManyRequestsTryAgainInMinutes": { "one": "Too many requests (rate limited) - try again in {} minute", diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 59f046e..0725830 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -671,6 +671,7 @@ class AppsPageState extends State { formItems.add(GeneratedFormSwitch('updates', label: tr('updateX', args: [ plural('apps', existingUpdateIdsAllOrSelected.length) + .toLowerCase() ]), defaultValue: true)); } @@ -678,6 +679,7 @@ class AppsPageState extends State { formItems.add(GeneratedFormSwitch('installs', label: tr('installX', args: [ plural('apps', newInstallIdsAllOrSelected.length) + .toLowerCase() ]), defaultValue: existingUpdateIdsAllOrSelected.isEmpty)); } @@ -696,7 +698,8 @@ class AppsPageState extends State { newInstallIdsAllOrSelected.length + trackOnlyUpdateIdsAllOrSelected.length; return GeneratedFormModal( - title: tr('changeX', args: [plural('apps', totalApps)]), + title: tr('changeX', + args: [plural('apps', totalApps).toLowerCase()]), items: formItems.map((e) => [e]).toList(), initValid: true, ); From 51ed211b3d4c15404de60f73c96a5891769951b4 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 01:06:03 -0400 Subject: [PATCH 18/72] Added battery optimization notice to welcome message (#2291) --- assets/translations/bs.json | 1 + assets/translations/ca.json | 1 + assets/translations/cs.json | 1 + assets/translations/da.json | 1 + assets/translations/de.json | 1 + assets/translations/en-EO.json | 1 + assets/translations/en.json | 1 + assets/translations/es.json | 1 + assets/translations/fa.json | 1 + assets/translations/fr.json | 1 + assets/translations/hu.json | 1 + assets/translations/id.json | 1 + assets/translations/it.json | 1 + assets/translations/ja.json | 1 + assets/translations/ko.json | 1 + assets/translations/nl.json | 1 + assets/translations/pl.json | 1 + assets/translations/pt-BR.json | 1 + assets/translations/pt.json | 1 + assets/translations/ru.json | 1 + assets/translations/sv.json | 1 + assets/translations/tr.json | 1 + assets/translations/uk.json | 1 + assets/translations/vi.json | 1 + assets/translations/zh-Hant-TW.json | 1 + assets/translations/zh.json | 1 + lib/pages/home.dart | 25 +++++++++++++++++++++++++ 27 files changed, 51 insertions(+) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index ded59c7..93115fe 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -326,6 +326,7 @@ "sortMethod": "Sort Method", "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Želite li ukloniti aplikaciju?", "other": "Želite li ukloniti aplikacije?" diff --git a/assets/translations/ca.json b/assets/translations/ca.json index 331b25f..2b2d9af 100644 --- a/assets/translations/ca.json +++ b/assets/translations/ca.json @@ -326,6 +326,7 @@ "sortMethod": "Mètode d'ordenació", "welcome": "Benvinguda", "documentationLinksNote": "La pàgina GitHub d'Obtainium enllaçada a sota conté enllaços a vídeos, articles, debats i altres recursos que t'ajudaran a entendre com usar l'aplicació.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "¿Suprimeixo l'aplicació?", "other": "¿Suprimeixo les aplicacions?" diff --git a/assets/translations/cs.json b/assets/translations/cs.json index ccebf11..13acf9b 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -326,6 +326,7 @@ "sortMethod": "Metoda třídění", "welcome": "Vítejte na", "documentationLinksNote": "Níže odkazovaná stránka Obtainium GitHub obsahuje odkazy na videa, články, diskuse a další zdroje, které vám pomohou pochopit, jak aplikaci používat.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/da.json b/assets/translations/da.json index 60729a6..fb5e92e 100644 --- a/assets/translations/da.json +++ b/assets/translations/da.json @@ -326,6 +326,7 @@ "sortMethod": "Sorteringsmetode", "welcome": "Velkommen", "documentationLinksNote": "Obtainiums GitHub-side, som der linkes til nedenfor, indeholder links til videoer, artikler, diskussioner og andre ressourcer, som kan hjælpe dig med at forstå, hvordan du bruger appen.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Fjern app?", "other": "Fjern apps?" diff --git a/assets/translations/de.json b/assets/translations/de.json index a61f53c..1013106 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -326,6 +326,7 @@ "sortMethod": "Sortierverfahren", "welcome": "Willkommen", "documentationLinksNote": "Die unten verlinkte GitHub-Seite von Obtainium enthält Links zu Videos, Artikeln, Diskussionen und anderen Ressourcen, die Ihnen helfen werden, die Verwendung der App zu verstehen.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en-EO.json b/assets/translations/en-EO.json index 9ceabcc..2f1826c 100644 --- a/assets/translations/en-EO.json +++ b/assets/translations/en-EO.json @@ -326,6 +326,7 @@ "sortMethod": "Sort Method", "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Forigi la aplikaĵon?", "other": "Forigi la aplikaĵojn?" diff --git a/assets/translations/en.json b/assets/translations/en.json index b2a70b2..9c5f43a 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -326,6 +326,7 @@ "sortMethod": "Sort method", "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Remove app?", "other": "Remove apps?" diff --git a/assets/translations/es.json b/assets/translations/es.json index 188543b..0e9d905 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -326,6 +326,7 @@ "sortMethod": "Método de clasificación", "welcome": "Bienvenido", "documentationLinksNote": "La página GitHub de Obtainium enlazada a continuación contiene enlaces a vídeos, artículos, debates y otros recursos que te ayudarán a entender cómo utilizar la aplicación.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "¿Eliminar aplicación?", "other": "¿Eliminar aplicaciones?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index 508e1f6..e91875e 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -326,6 +326,7 @@ "sortMethod": "Sort Method", "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index d8f6269..0f4e313 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -326,6 +326,7 @@ "sortMethod": "Méthode de tri", "welcome": "Bienvenue", "documentationLinksNote": "La page GitHub d'Obtainium, dont le lien figure ci-dessous, contient des liens vers des vidéos, des articles, des discussions et d'autres ressources qui vous aideront à comprendre comment utiliser l'application.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 4993ba9..d1b3d1f 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -326,6 +326,7 @@ "sortMethod": "Rendezési eljárás", "welcome": "Üdvözöljük!", "documentationLinksNote": "Az alábbi hivatkozás az Obtainium GitHub oldalára vezet, amely további videók, cikkek, beszélgetések és egyéb források hivatkozásait tartalmazza, amelyek segítenek megérteni az alkalmazás használatát.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazásokat?" diff --git a/assets/translations/id.json b/assets/translations/id.json index a102dd4..17f3313 100644 --- a/assets/translations/id.json +++ b/assets/translations/id.json @@ -326,6 +326,7 @@ "sortMethod": "Metode Penyortiran", "welcome": "Selamat datang.", "documentationLinksNote": "Halaman GitHub Obtainium yang ditautkan di bawah ini berisi tautan ke video, artikel, diskusi, dan sumber daya lain yang akan membantu Anda memahami cara menggunakan aplikasi.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Hapus aplikasi?", "other": "Hapus aplikasi?" diff --git a/assets/translations/it.json b/assets/translations/it.json index ad121b5..e0ede2f 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -326,6 +326,7 @@ "sortMethod": "Metodo di ordinamento", "welcome": "Benvenuti", "documentationLinksNote": "La pagina GitHub di Obtainium collegata qui sotto contiene collegamenti a video, articoli, discussioni e altre risorse che vi aiuteranno a capire come utilizzare l'applicazione.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index a1aed20..f1c7419 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -326,6 +326,7 @@ "sortMethod": "ソート方法", "welcome": "ようこそ", "documentationLinksNote": "以下のリンクにあるObtainium GitHubページには、ビデオ、記事、ディスカッション、その他のリソースへのリンクがあり、アプリの使い方を理解するのに役立ちます。", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/ko.json b/assets/translations/ko.json index 15a1604..ad34de9 100644 --- a/assets/translations/ko.json +++ b/assets/translations/ko.json @@ -326,6 +326,7 @@ "sortMethod": "정렬 방법", "welcome": "환영", "documentationLinksNote": "아래에 링크된 Obtainium 깃허브 페이지에는 앱 사용 방법을 이해하는 데 도움이 되는 동영상, 기사, 토론 및 기타 리소스에 대한 링크가 포함되어 있습니다.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "앱을 제거하시겠습니까?", "other": "앱을 제거하시겠습니까?" diff --git a/assets/translations/nl.json b/assets/translations/nl.json index 50799c6..a069052 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -326,6 +326,7 @@ "sortMethod": "Sorteermethode", "welcome": "Welkom", "documentationLinksNote": "De GitHub pagina van Obtainium waarnaar hieronder wordt gelinkt bevat links naar video's, artikelen, discussies en andere bronnen die je zullen helpen begrijpen hoe je de app kunt gebruiken.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "App verwijderen?", "other": "Apps verwijderen?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 16381e7..7cb65cf 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -326,6 +326,7 @@ "sortMethod": "Metoda sortowania", "welcome": "Witamy", "documentationLinksNote": "Strona Obtainium GitHub, do której link znajduje się poniżej, zawiera linki do filmów, artykułów, dyskusji i innych zasobów, które pomogą ci zrozumieć, jak korzystać z aplikacji.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt-BR.json b/assets/translations/pt-BR.json index f2219aa..8578f5c 100644 --- a/assets/translations/pt-BR.json +++ b/assets/translations/pt-BR.json @@ -326,6 +326,7 @@ "sortMethod": "Método de ordenação", "welcome": "Boas vindas", "documentationLinksNote": "A página do Obtainium no GitHub visível abaixo contém links de vídeos, artigos, discussões, e outros recursos que podem te ajudar ao usar o app.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Remover app?", "other": "Remover apps?" diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 9e13db4..21125d9 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -326,6 +326,7 @@ "sortMethod": "Método de ordenação", "welcome": "Bem-vindo", "documentationLinksNote": "A página do Obtainium no GitHub com a ligação abaixo contém ligações para vídeos, artigos, discussões e outros recursos que o ajudarão a compreender como utilizar a aplicação.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Remover aplicativo?", "other": "Remover aplicativos?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 3bbab8b..9a8af88 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -326,6 +326,7 @@ "sortMethod": "Метод сортировки", "welcome": "Добро пожаловать", "documentationLinksNote": "На странице Obtainium GitHub, ссылка на которую приведена ниже, содержатся ссылки на видео, статьи, обсуждения и другие ресурсы, которые помогут вам понять, как пользоваться приложением.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/assets/translations/sv.json b/assets/translations/sv.json index 6a0381f..11117a2 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -326,6 +326,7 @@ "sortMethod": "Sorteringsmetod", "welcome": "Välkommen", "documentationLinksNote": "Obtainium GitHub-sidan som länkas nedan innehåller länkar till videor, artiklar, diskussioner och andra resurser som hjälper dig att förstå hur du använder appen.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Ta Bort App?", "other": "Ta Bort Appar?" diff --git a/assets/translations/tr.json b/assets/translations/tr.json index bfe5d2e..9b1e6c8 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -326,6 +326,7 @@ "sortMethod": "Sıralama Yöntemi", "welcome": "Hoş geldiniz", "documentationLinksNote": "Aşağıda bağlantısı verilen Obtainium GitHub sayfası, uygulamayı nasıl kullanacağınızı anlamanıza yardımcı olacak videolara, makalelere, tartışmalara ve diğer kaynaklara bağlantılar içerir.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Uygulamayı Kaldır?", "other": "Uygulamaları Kaldır?" diff --git a/assets/translations/uk.json b/assets/translations/uk.json index e360727..cd20fc6 100644 --- a/assets/translations/uk.json +++ b/assets/translations/uk.json @@ -326,6 +326,7 @@ "sortMethod": "Метод сортування", "welcome": "Ласкаво просимо.", "documentationLinksNote": "Сторінка Obtainium на GitHub, посилання на яку наведено нижче, містить посилання на відео, статті, дискусії та інші ресурси, які допоможуть вам зрозуміти, як користуватися додатком.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Видалити застосунок?", "other": "Видалити застосунки?" diff --git a/assets/translations/vi.json b/assets/translations/vi.json index 5b557fe..b63d108 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -326,6 +326,7 @@ "sortMethod": "Sort Method", "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "Gỡ ứng dụng?", "other": "Gỡ ứng dụng?" diff --git a/assets/translations/zh-Hant-TW.json b/assets/translations/zh-Hant-TW.json index 1d9772b..92d6527 100644 --- a/assets/translations/zh-Hant-TW.json +++ b/assets/translations/zh-Hant-TW.json @@ -326,6 +326,7 @@ "sortMethod": "排序方式", "welcome": "歡迎", "documentationLinksNote": "下方連結的 Obtainium GitHub 頁面包含影片、文章、討論及其他資源,能幫助你瞭解如何使用這款應用程式。", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "移除應用程式?", "other": "移除應用程式?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 4e617a0..f4f408f 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -326,6 +326,7 @@ "sortMethod": "排序方法", "welcome": "欢迎光临", "documentationLinksNote": "下面链接的 Obtainium GitHub 页面包含视频、文章、讨论和其他资源的链接,可帮助您了解如何使用该应用程序。", + "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 41c22e1..171f696 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:android_intent_plus/android_intent.dart'; import 'package:animations/animations.dart'; import 'package:app_links/app_links.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -80,6 +81,30 @@ class _HomePageState extends State { decoration: TextDecoration.underline, fontWeight: FontWeight.bold), )), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(tr('batteryOptimizationNote')), + GestureDetector( + onTap: () { + final intent = AndroidIntent( + action: + 'android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS', + package: + obtainiumId, // Replace with your app's package name + ); + + intent.launch(); + }, + child: Text( + tr('settings'), + style: const TextStyle( + decoration: TextDecoration.underline, + fontWeight: FontWeight.bold), + ), + ) + ], + ) ], ), actions: [ From 104a19bc32da9c53198fcf05e586f0052aa6830f Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 01:10:07 -0400 Subject: [PATCH 19/72] Add allowOverride = false to vivo store --- lib/app_sources/vivoappstore.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/app_sources/vivoappstore.dart b/lib/app_sources/vivoappstore.dart index 9b55ce2..68f41cd 100644 --- a/lib/app_sources/vivoappstore.dart +++ b/lib/app_sources/vivoappstore.dart @@ -13,6 +13,7 @@ class VivoAppStore extends AppSource { hosts = ['h5.appstore.vivo.com.cn', 'h5coml.vivo.com.cn']; naiveStandardVersionDetection = true; canSearch = true; + allowOverride = false; } @override From 19710cf7ad9a24afa7e5316b38057a62aa84e799 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 01:11:00 -0400 Subject: [PATCH 20/72] Increment version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2ffab17..741f40f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.52+2309 +version: 1.1.53+2310 environment: sdk: ^3.6.0 From add2574c2529565d8bef56984d66d98407a21753 Mon Sep 17 00:00:00 2001 From: summoner001 Date: Sat, 17 May 2025 14:45:58 +0200 Subject: [PATCH 21/72] Update hu.json Translate new string --- assets/translations/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/hu.json b/assets/translations/hu.json index d1b3d1f..ea42c58 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -326,7 +326,7 @@ "sortMethod": "Rendezési eljárás", "welcome": "Üdvözöljük!", "documentationLinksNote": "Az alábbi hivatkozás az Obtainium GitHub oldalára vezet, amely további videók, cikkek, beszélgetések és egyéb források hivatkozásait tartalmazza, amelyek segítenek megérteni az alkalmazás használatát.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Megjegyzés: A háttérfrissítések megbízhatóbban működhetnek, ha kikapcsolja a rendszer akkumulátor-optimalizálását az Obtainium számára.", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazásokat?" From b41b9d3109cb15b76c2b4e488c6c4171045fd62c Mon Sep 17 00:00:00 2001 From: bernikr Date: Sat, 17 May 2025 15:49:28 +0200 Subject: [PATCH 22/72] bugfix: invalid version codes for some apkpure links --- lib/app_sources/apkpure.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 8894422..37742a2 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -131,7 +131,7 @@ class APKPure extends AppSource { var link = html.querySelector("a.download-start-btn")?.attributes['href']; RegExp downloadLinkRegEx = RegExp( - r'^https:\/\/d\.[^/]+\/b\/([^/]+)\/[^/?]+\?versionCode=([0-9]+).$', + r'^https:\/\/d\.[^/]+\/b\/([^/]+)\/[^/?]+\?versionCode=([0-9]+)$', caseSensitive: false); RegExpMatch? match = downloadLinkRegEx.firstMatch(link ?? ''); if (match == null) { From c1ddc57126261ab3af6a3d7941d170312812472f Mon Sep 17 00:00:00 2001 From: Cambrells Date: Sat, 17 May 2025 20:55:15 +0200 Subject: [PATCH 23/72] Updated ca.json --- assets/translations/ca.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/ca.json b/assets/translations/ca.json index 2b2d9af..bc54638 100644 --- a/assets/translations/ca.json +++ b/assets/translations/ca.json @@ -326,7 +326,7 @@ "sortMethod": "Mètode d'ordenació", "welcome": "Benvinguda", "documentationLinksNote": "La pàgina GitHub d'Obtainium enllaçada a sota conté enllaços a vídeos, articles, debats i altres recursos que t'ajudaran a entendre com usar l'aplicació.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Tingues present que les descàrregues en segon pla funcionaran millor si inhabilites l'optimització de bateria per a Obtainium.", "removeAppQuestion": { "one": "¿Suprimeixo l'aplicació?", "other": "¿Suprimeixo les aplicacions?" From 8201348995bf590dc1700eff04844762d3f2af74 Mon Sep 17 00:00:00 2001 From: summoner001 Date: Sat, 17 May 2025 21:01:05 +0200 Subject: [PATCH 24/72] Fix separete spelling --- assets/translations/hu.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/translations/hu.json b/assets/translations/hu.json index ea42c58..b140dee 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -28,11 +28,11 @@ "githubStarredRepos": "Csillagozott GitHub tárolók", "uname": "Felhasználónév", "wrongArgNum": "A megadott argumentumok száma nem megfelelő", - "xIsTrackOnly": "A(z) {} csak nyomon-követhető", + "xIsTrackOnly": "A(z) {} csak nyomon követhető", "source": "Forrás", "app": "Alkalmazás", - "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások „csak nyomon-követhetők”.", - "youPickedTrackOnly": "„Csak nyomon-követés” opciót választotta.", + "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások „csak nyomon követhetők”.", + "youPickedTrackOnly": "„Csak nyomon követés” opciót választotta.", "trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.", "cancelled": "Visszavonva", "appAlreadyAdded": "Az alkalmazás már hozzá van adva", @@ -45,7 +45,7 @@ "search": "Keresés", "additionalOptsFor": "További lehetőségek a következőhöz: {}", "supportedSources": "Támogatott források", - "trackOnlyInBrackets": "(Csak nyomon-követés)", + "trackOnlyInBrackets": "(Csak nyomon követés)", "searchableInBrackets": "(Kereshető)", "appsString": "Alkalmazások", "noApps": "Nincsenek alkalmazások", @@ -63,7 +63,7 @@ "removeSelectedApps": "A kiválasztott alkalmazások eltávolítása", "updateX": "{} frissítése", "installX": "{} telepítése", - "markXTrackOnlyAsUpdated": "Megjelölés: {}\n(Csak nyomon-követés)\nFrissítettként", + "markXTrackOnlyAsUpdated": "Megjelölés: {}\n(Csak nyomon követés)\nFrissítettként", "changeX": "{}-változás", "installUpdateApps": "Alkalmazások telepítése/frissítése", "installUpdateSelectedApps": "A kiválasztott alkalmazások telepítése/frissítése", @@ -143,7 +143,7 @@ "warning": "Figyelem", "sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása a(z) „{}” tároló, de a kiadási csomag innen származik: „{}”. Folytatja?", "updatesAvailable": "Frissítések érhetők el", - "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy egy vagy több, az Obtainium által nyomon-követett alkalmazáshoz frissítések állnak rendelkezésre", + "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy egy vagy több, az Obtainium által nyomon követett alkalmazáshoz frissítések állnak rendelkezésre", "noNewUpdates": "Nincsenek új frissítések.", "xHasAnUpdate": "A(z) {} frissítést kapott.", "appsUpdated": "Alkalmazások frissítve", @@ -162,7 +162,7 @@ "checkingForUpdates": "Frissítések ellenőrzése", "checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések ellenőrzésekor jelenik meg", "pleaseAllowInstallPerm": "Engedélyezze az Obtainiumnak az alkalmazások telepítését", - "trackOnly": "Csak nyomon-követés", + "trackOnly": "Csak nyomon követés", "errorWithHttpStatusCode": "Hiba {}", "versionCorrectionDisabled": "Verzió-korrekció letiltva (úgy tűnik, hogy a bővítmény nem működik)", "unknown": "Ismeretlen", @@ -224,7 +224,7 @@ "autoLinkFilterByArch": "Ha lehetséges, próbálja meg a hivatkozásokat CPU-architektúra szerint szűrni", "overrideSource": "Forrás felülírása", "dontShowAgain": "Ne jelenítse meg ezt többé", - "dontShowTrackOnlyWarnings": "Ne jelenítse meg a „Csak nyomon-követés” figyelmeztetést", + "dontShowTrackOnlyWarnings": "Ne jelenítse meg a „Csak nyomon követés” figyelmeztetést", "dontShowAPKOriginWarnings": "Ne jelenítse meg az APK eredetére vonatkozó figyelmeztetéseket", "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített alkalmazásokat az alkalmazásnézet aljára", "gitlabPATLabel": "GitLab személyes hozzáférési token", @@ -287,7 +287,7 @@ "downloadingXNotifChannel": "A(z) {} letöltése", "completeAppInstallationNotifChannel": "Teljes alkalmazás telepítés", "checkingForUpdatesNotifChannel": "Frissítések ellenőrzése", - "onlyCheckInstalledOrTrackOnlyApps": "Csak a telepített és a csak nyomon-követhető alkalmazások frissítéseinek ellenőrzése", + "onlyCheckInstalledOrTrackOnlyApps": "Csak a telepített és a csak nyomon követhető alkalmazások frissítéseinek ellenőrzése", "supportFixedAPKURL": "Támogatja a rögzített APK webcímeket", "selectX": "{} kiválasztása", "parallelDownloads": "Párhuzamos letöltések engedélyezése", From f78beff5d8428df5771e7193004c5d32ef9a8241 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 20:58:32 -0400 Subject: [PATCH 25/72] Attempt to fix RuStore charset bug (#2294) --- lib/app_sources/rustore.dart | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/app_sources/rustore.dart b/lib/app_sources/rustore.dart index 365cfe7..6214dbe 100644 --- a/lib/app_sources/rustore.dart +++ b/lib/app_sources/rustore.dart @@ -33,6 +33,16 @@ class RuStore extends AppSource { return Uri.parse(standardUrl).pathSegments.last; } + Future decodeString(String str) async { + try { + return (await CharsetDetector.autoDecode( + Uint8List.fromList(str.codeUnits))) + .string; + } catch (e) { + return str; + } + } + @override Future getLatestAPKDetails( String standardUrl, @@ -73,17 +83,9 @@ class RuStore extends AppSource { throw NoAPKError(); } - appName = (await CharsetDetector.autoDecode( - Uint8List.fromList(appName.codeUnits))) - .string; - author = - (await CharsetDetector.autoDecode(Uint8List.fromList(author.codeUnits))) - .string; - changeLog = changeLog != null - ? (await CharsetDetector.autoDecode( - Uint8List.fromList(changeLog.codeUnits))) - .string - : null; + appName = await decodeString(appName); + author = await decodeString(author); + changeLog = changeLog != null ? await decodeString(changeLog) : null; return APKDetails( version, From 1a058a1959e98b39329eb68c95affeca3936e523 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 20:59:19 -0400 Subject: [PATCH 26/72] Increment version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 741f40f..4f262a5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.53+2310 +version: 1.1.54+2311 environment: sdk: ^3.6.0 From 195c0d1f113d2a3bf3f5255594f4d5dddae09ff4 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 May 2025 21:56:32 -0400 Subject: [PATCH 27/72] Update Kotlin version (to enable Docker builder) + update Dockerfile --- android/settings.gradle | 2 +- docker/Dockerfile | 16 +++++++++------- docker/builder.sh | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/android/settings.gradle b/android/settings.gradle index b9e43bd..4aa0f8d 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -19,7 +19,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false + id "org.jetbrains.kotlin.android" version "2.1.21" apply false } include ":app" diff --git a/docker/Dockerfile b/docker/Dockerfile index c00e8df..f3ea808 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -42,9 +42,10 @@ RUN \ openssl \ wget \ unzip + # Android SDK RUN \ - wget --quiet https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/tools.zip && \ + wget --quiet https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -O /tmp/tools.zip && \ mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools && \ unzip -q /tmp/tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools && \ mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \ @@ -53,25 +54,26 @@ RUN \ apt-get install -y --no-install-recommends openjdk-17-jdk openjdk-17-jre &&\ yes | sdkmanager --licenses &&\ sdkmanager --update -# Platform tools + + # Platform tools # Get latest with sdkmanager --list RUN sdkmanager --install "build-tools;33.0.1" RUN sdkmanager --install "ndk;26.3.11579264" -RUN sdkmanager --install "cmake;3.31.4" +RUN sdkmanager --install "cmake;4.0.2" RUN sdkmanager --install platform-tools RUN sdkmanager --install emulator RUN sdkmanager --install tools RUN sdkmanager --install "platforms;android-28" RUN sdkmanager --install "platforms;android-31" -RUN sdkmanager --install "platforms;android-33" -RUN sdkmanager --install "platforms;android-35" -RUN sdkmanager --install "platforms;android-34" RUN sdkmanager --install "platforms;android-32" +RUN sdkmanager --install "platforms;android-33" +RUN sdkmanager --install "platforms;android-34" +RUN sdkmanager --install "platforms;android-35" # Flutter ARG DEV_UID=0 RUN \ - wget --quiet https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.29.0-stable.tar.xz -O /tmp/flutter.tar.xz &&\ + wget --quiet https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.29.3-stable.tar.xz -O /tmp/flutter.tar.xz &&\ mkdir -p /opt &&\ cd /opt &&\ tar xf /tmp/flutter.tar.xz &&\ diff --git a/docker/builder.sh b/docker/builder.sh index c046ac0..f5c1c16 100755 --- a/docker/builder.sh +++ b/docker/builder.sh @@ -8,11 +8,11 @@ docker run \ --rm \ -ti \ --net host \ - -v "${PWD}/../:${PWD}/../" \ + -v "${PWD}/../:${PWD}/../":z \ -w "${PWD}" \ --name flutter-dev-obtainium \ --user $(id -u) \ - -v ./data/home:/home/${USER} \ + -v ./data/home:/home/${USER}:z \ -e USER=${USER} \ -e HOME=/home/${USER} \ -e ANDROID_USER_HOME=${HOME}/.android \ From 99e3b8ac4fdb3b9d686a6588c696dd2683d5abb9 Mon Sep 17 00:00:00 2001 From: Hussain <124243263+Hussain96o@users.noreply.github.com> Date: Sun, 18 May 2025 20:35:06 +0300 Subject: [PATCH 28/72] Create ar.json Create an Arabic language file --- assets/translations/ar.json | 391 ++++++++++++++++++++++++++++++++++++ 1 file changed, 391 insertions(+) create mode 100644 assets/translations/ar.json diff --git a/assets/translations/ar.json b/assets/translations/ar.json new file mode 100644 index 0000000..7796604 --- /dev/null +++ b/assets/translations/ar.json @@ -0,0 +1,391 @@ +{ + "invalidURLForSource": "رابط تطبيق {} غير صالح", + "noReleaseFound": "تعذر العثور على إصدار مناسب", + "noVersionFound": "تعذر تحديد إصدار التطبيق", + "urlMatchesNoSource": "الرابط لا يتطابق مع مصدر معروف", + "cantInstallOlderVersion": "لا يمكن تثبيت إصدار أقدم من التطبيق", + "appIdMismatch": "معرّف الحزمة المحملة لا يتطابق مع معرّف التطبيق الحالي", + "functionNotImplemented": "هذه الوظيفة غير مطبقة في هذا الصنف", + "placeholder": "عنصر نائب", + "someErrors": "حدثت بعض الأخطاء", + "unexpectedError": "خطأ غير متوقع", + "ok": "موافق", + "and": "و", + "githubPATLabel": "رمز الوصول الشخصي لـ GitHub (يزيد من الحد المسموح)", + "includePrereleases": "تضمين الإصدارات الأولية", + "fallbackToOlderReleases": "الرجوع إلى الإصدارات الأقدم", + "filterReleaseTitlesByRegEx": "تصفية عناوين الإصدارات باستخدام تعبير نمطي", + "invalidRegEx": "تعبير نمطي غير صالح", + "noDescription": "لا يوجد وصف", + "cancel": "إلغاء", + "continue": "متابعة", + "requiredInBrackets": "(مطلوب)", + "dropdownNoOptsError": "خطأ: يجب أن يحتوي القائمة المنسدلة على خيار واحد على الأقل", + "colour": "لون", + "standard": "قياسي", + "custom": "مخصص", + "useMaterialYou": "استخدم Material You", + "githubStarredRepos": "مستودعات GitHub المفضلة", + "uname": "اسم المستخدم", + "wrongArgNum": "عدد وسائط غير صحيح", + "xIsTrackOnly": "{} للتعقب فقط", + "source": "المصدر", + "app": "التطبيق", + "appsFromSourceAreTrackOnly": "تطبيقات هذا المصدر للتعقب فقط.", + "youPickedTrackOnly": "لقد اخترت خيار 'التعقب فقط'.", + "trackOnlyAppDescription": "سيتم تعقب التطبيق للتحديثات، لكن Obtainium لن يتمكن من تنزيله أو تثبيته.", + "cancelled": "تم الإلغاء", + "appAlreadyAdded": "التطبيق مضاف بالفعل", + "alreadyUpToDateQuestion": "التطبيق محدث بالفعل؟", + "addApp": "إضافة تطبيق", + "appSourceURL": "رابط مصدر التطبيق", + "error": "خطأ", + "add": "إضافة", + "searchSomeSourcesLabel": "بحث (بعض المصادر فقط)", + "search": "بحث", + "additionalOptsFor": "خيارات إضافية لـ {}", + "supportedSources": "المصادر المدعومة", + "trackOnlyInBrackets": "(للتعقب فقط)", + "searchableInBrackets": "(قابل للبحث)", + "appsString": "التطبيقات", + "noApps": "لا توجد تطبيقات", + "noAppsForFilter": "لا توجد تطبيقات تطابق الفلتر", + "byX": "بواسطة {}", + "percentProgress": "التقدم: {}%", + "pleaseWait": "يرجى الانتظار", + "updateAvailable": "تحديث متاح", + "notInstalled": "غير مثبت", + "pseudoVersion": "إصدار وهمي", + "selectAll": "تحديد الكل", + "deselectX": "إلغاء تحديد {}", + "xWillBeRemovedButRemainInstalled": "سيتم إزالة {} من Obtainium لكنه سيظل مثبتًا على الجهاز.", + "removeSelectedAppsQuestion": "إزالة التطبيقات المحددة؟", + "removeSelectedApps": "إزالة التطبيقات المحددة", + "updateX": "تحديث {}", + "installX": "تثبيت {}", + "markXTrackOnlyAsUpdated": "تعليم {}\n(للتعقب فقط)\nكمحدث", + "changeX": "تغيير {}", + "installUpdateApps": "تثبيت/تحديث التطبيقات", + "installUpdateSelectedApps": "تثبيت/تحديث التطبيقات المحددة", + "markXSelectedAppsAsUpdated": "تعليم {} تطبيقات محددة كمحدثة؟", + "no": "لا", + "yes": "نعم", + "markSelectedAppsUpdated": "تعليم التطبيقات المحددة كمحدثة", + "pinToTop": "تثبيت في الأعلى", + "unpinFromTop": "إلغاء التثبيت من الأعلى", + "resetInstallStatusForSelectedAppsQuestion": "إعادة تعيين حالة التثبيت للتطبيقات المحددة؟", + "installStatusOfXWillBeResetExplanation": "سيتم إعادة تعيين حالة التثبيت لأي تطبيقات محددة.\n\nقد يساعد هذا عندما يكون إصدار التطبيق المعروض في Obtainium غير صحيح بسبب فشل التحديثات أو مشاكل أخرى.", + "customLinkMessage": "هذه الروابط تعمل على الأجهزة التي بها Obtainium مثبتًا", + "shareAppConfigLinks": "مشاركة تكوين التطبيق كرابط HTML", + "shareSelectedAppURLs": "مشاركة روابط التطبيقات المحددة", + "resetInstallStatus": "إعادة تعيين حالة التثبيت", + "more": "المزيد", + "removeOutdatedFilter": "إزالة فلتر التطبيقات غير المحدثة", + "showOutdatedOnly": "عرض التطبيقات غير المحدثة فقط", + "filter": "تصفية", + "filterApps": "تصفية التطبيقات", + "appName": "اسم التطبيق", + "author": "المؤلف", + "upToDateApps": "تطبيقات محدثة", + "nonInstalledApps": "تطبيقات غير مثبتة", + "importExport": "استيراد/تصدير", + "settings": "الإعدادات", + "exportedTo": "تم التصدير إلى {}", + "obtainiumExport": "تصدير Obtainium", + "invalidInput": "إدخال غير صالح", + "importedX": "تم استيراد {}", + "obtainiumImport": "استيراد Obtainium", + "importFromURLList": "استيراد من قائمة الروابط", + "searchQuery": "استعلام البحث", + "appURLList": "قائمة روابط التطبيقات", + "line": "سطر", + "searchX": "بحث {}", + "noResults": "لا توجد نتائج", + "importX": "استيراد {}", + "importedAppsIdDisclaimer": "قد تظهر التطبيقات المستوردة بشكل غير صحيح كـ \"غير مثبتة\".\nلإصلاح هذا، قم بإعادة تثبيتها عبر Obtainium.\nهذا لا يؤثر على بيانات التطبيق.\n\nينطبق فقط على طرق الاستيراد عبر الروابط أو الطرف الثالث.", + "importErrors": "أخطاء الاستيراد", + "importedXOfYApps": "تم استيراد {} من {} تطبيقات.", + "followingURLsHadErrors": "حدثت أخطاء في الروابط التالية:", + "selectURL": "اختر رابطًا", + "selectURLs": "اختر روابط", + "pick": "اختر", + "theme": "المظهر", + "dark": "مظلم", + "light": "فاتح", + "followSystem": "اتباع النظام", + "followSystemThemeExplanation": "اتباع مظهر النظام ممكن فقط باستخدام تطبيقات طرف ثالث", + "useBlackTheme": "استخدام المظهر الأسود الداكن بالكامل", + "appSortBy": "ترتيب التطبيقات حسب", + "authorName": "المؤلف/الاسم", + "nameAuthor": "الاسم/المؤلف", + "asAdded": "كما تمت إضافتها", + "appSortOrder": "ترتيب التطبيقات", + "ascending": "تصاعدي", + "descending": "تنازلي", + "bgUpdateCheckInterval": "فترة التحقق من التحديثات في الخلفية", + "neverManualOnly": "أبدًا - يدوي فقط", + "appearance": "المظهر", + "showWebInAppView": "عرض صفحة الويب المصدر في عرض التطبيق", + "pinUpdates": "تثبيت التحديثات في أعلى قائمة التطبيقات", + "updates": "التحديثات", + "sourceSpecific": "خاص بالمصدر", + "appSource": "مصدر التطبيق", + "noLogs": "لا توجد سجلات", + "appLogs": "سجلات التطبيق", + "close": "إغلاق", + "share": "مشاركة", + "appNotFound": "التطبيق غير موجود", + "obtainiumExportHyphenatedLowercase": "تصدير-obtainium", + "pickAnAPK": "اختر ملف APK", + "appHasMoreThanOnePackage": "{} يحتوي على أكثر من حزمة:", + "deviceSupportsXArch": "جهازك يدعم بنية المعالج {}.", + "deviceSupportsFollowingArchs": "جهازك يدعم بنى المعالج التالية:", + "warning": "تحذير", + "sourceIsXButPackageFromYPrompt": "مصدر التطبيق هو '{}' لكن الحزمة تأتي من '{}'. هل تتابع؟", + "updatesAvailable": "تحديثات متاحة", + "updatesAvailableNotifDescription": "يخطر المستخدم بوجود تحديثات لواحد أو أكثر من التطبيقات التي يتعقبها Obtainium", + "noNewUpdates": "لا توجد تحديثات جديدة.", + "xHasAnUpdate": "{} لديه تحديث.", + "appsUpdated": "تم تحديث التطبيقات", + "appsNotUpdated": "فشل تحديث التطبيقات", + "appsUpdatedNotifDescription": "يخطر المستخدم بأن تحديثات لواحد أو أكثر من التطبيقات تم تطبيقها في الخلفية", + "xWasUpdatedToY": "تم تحديث {} إلى {}.", + "xWasNotUpdatedToY": "فشل تحديث {} إلى {}.", + "errorCheckingUpdates": "خطأ في التحقق من التحديثات", + "errorCheckingUpdatesNotifDescription": "إشعار يظهر عند فشل التحقق من التحديثات في الخلفية", + "appsRemoved": "تمت إزالة التطبيقات", + "appsRemovedNotifDescription": "يخطر المستخدم بأنه تمت إزالة واحد أو أكثر من التطبيقات بسبب أخطاء أثناء تحميلها", + "xWasRemovedDueToErrorY": "تمت إزالة {} بسبب هذا الخطأ: {}", + "completeAppInstallation": "إكمال تثبيت التطبيق", + "obtainiumMustBeOpenToInstallApps": "يجب فتح Obtainium لتثبيت التطبيقات", + "completeAppInstallationNotifDescription": "يطلب من المستخدم العودة إلى Obtainium لإكمال تثبيت التطبيق", + "checkingForUpdates": "جاري التحقق من التحديثات", + "checkingForUpdatesNotifDescription": "إشعار مؤقت يظهر عند التحقق من التحديثات", + "pleaseAllowInstallPerm": "يرجى السماح لـ Obtainium بتثبيت التطبيقات", + "trackOnly": "للتعقب فقط", + "errorWithHttpStatusCode": "خطأ {}", + "versionCorrectionDisabled": "تعطيل تصحيح الإصدار (يبدو أن الملحق لا يعمل)", + "unknown": "غير معروف", + "none": "لا شيء", + "never": "أبدًا", + "latestVersionX": "الأحدث: {}", + "installedVersionX": "المثبت: {}", + "lastUpdateCheckX": "آخر تحقق من التحديثات: {}", + "remove": "إزالة", + "yesMarkUpdated": "نعم، تعليم كمحدث", + "fdroid": "F-Droid الرسمي", + "appIdOrName": "معرّف التطبيق أو الاسم", + "appId": "معرّف التطبيق", + "appWithIdOrNameNotFound": "لم يتم العثور على تطبيق بهذا المعرّف أو الاسم", + "reposHaveMultipleApps": "قد تحتوي المستودعات على عدة تطبيقات", + "fdroidThirdPartyRepo": "مستودع F-Droid طرف ثالث", + "install": "تثبيت", + "markInstalled": "تعليم كمثبت", + "update": "تحديث", + "markUpdated": "تعليم كمحدث", + "additionalOptions": "خيارات إضافية", + "disableVersionDetection": "تعطيل اكتشاف الإصدار", + "noVersionDetectionExplanation": "يجب استخدام هذا الخيار فقط للتطبيقات التي لا يعمل فيها اكتشاف الإصدار بشكل صحيح.", + "downloadingX": "جاري تنزيل {}", + "downloadX": "تنزيل {}", + "downloadedX": "تم تنزيل {}", + "releaseAsset": "ملف الإصدار", + "downloadNotifDescription": "يخطر المستخدم بالتقدم في تنزيل التطبيق", + "noAPKFound": "لم يتم العثور على ملف APK", + "noVersionDetection": "لا يوجد اكتشاف للإصدار", + "categorize": "تصنيف", + "categories": "التصنيفات", + "category": "تصنيف", + "noCategory": "بدون تصنيف", + "noCategories": "لا توجد تصنيفات", + "deleteCategoriesQuestion": "حذف التصنيفات؟", + "categoryDeleteWarning": "سيتم تعيين جميع التطبيقات في التصنيفات المحذوفة كغير مصنفة.", + "addCategory": "إضافة تصنيف", + "label": "تسمية", + "language": "اللغة", + "copiedToClipboard": "تم النسخ إلى الحافظة", + "storagePermissionDenied": "تم رفض إذن التخزين", + "selectedCategorizeWarning": "سيؤدي هذا إلى استبدال أي إعدادات تصنيف موجودة للتطبيقات المحددة.", + "filterAPKsByRegEx": "تصفية ملفات APK باستخدام تعبير نمطي", + "removeFromObtainium": "إزالة من Obtainium", + "uninstallFromDevice": "إلغاء التثبيت من الجهاز", + "onlyWorksWithNonVersionDetectApps": "يعمل فقط مع التطبيقات التي تم تعطيل اكتشاف الإصدار لها.", + "releaseDateAsVersion": "استخدام تاريخ الإصدار كسلسلة إصدار", + "releaseTitleAsVersion": "استخدام عنوان الإصدار كسلسلة إصدار", + "releaseDateAsVersionExplanation": "يجب استخدام هذا الخيار فقط للتطبيقات التي لا يعمل فيها اكتشاف الإصدار بشكل صحيح، ولكن تاريخ الإصدار متاح.", + "changes": "التغييرات", + "releaseDate": "تاريخ الإصدار", + "importFromURLsInFile": "استيراد من روابط في ملف (مثل OPML)", + "versionDetectionExplanation": "تنسيق سلسلة الإصدار مع الإصدار المكتشف من النظام", + "versionDetection": "اكتشاف الإصدار", + "standardVersionDetection": "اكتشاف الإصدار القياسي", + "groupByCategory": "التجميع حسب التصنيف", + "autoApkFilterByArch": "محاولة تصفية ملفات APK حسب بنية المعالج إذا أمكن", + "autoLinkFilterByArch": "محاولة تصفية الروابط حسب بنية المعالج إذا أمكن", + "overrideSource": "تجاوز المصدر", + "dontShowAgain": "عدم إظهار هذا مرة أخرى", + "dontShowTrackOnlyWarnings": "عدم إظهار تحذيرات 'للتعقب فقط'", + "dontShowAPKOriginWarnings": "عدم إظهار تحذيرات مصدر APK", + "moveNonInstalledAppsToBottom": "نقل التطبيقات غير المثبتة إلى أسفل قائمة التطبيقات", + "gitlabPATLabel": "رمز الوصول الشخصي لـ GitLab", + "about": "حول", + "requiresCredentialsInSettings": "{} يحتاج إلى بيانات اعتماد إضافية (في الإعدادات)", + "checkOnStart": "التحقق من التحديثات عند البدء", + "tryInferAppIdFromCode": "محاولة استنتاج معرّف التطبيق من الكود المصدري", + "removeOnExternalUninstall": "إزالة التطبيقات المثبتة خارجيًا تلقائيًا", + "pickHighestVersionCode": "تحديد أعلى إصدار تلقائيًا", + "checkUpdateOnDetailPage": "التحقق من التحديثات عند فتح صفحة التفاصيل", + "disablePageTransitions": "تعطيل انتقالات الصفحات", + "reversePageTransitions": "عكس انتقالات الصفحات", + "minStarCount": "الحد الأدنى لعدد النجوم", + "addInfoBelow": "أضف هذه المعلومات أدناه.", + "addInfoInSettings": "أضف هذه المعلومات في الإعدادات.", + "githubSourceNote": "يمكن تجنب الحد المسموح لـ GitHub باستخدام مفتاح API.", + "sortByLastLinkSegment": "الفرز حسب الجزء الأخير من الرابط فقط", + "filterReleaseNotesByRegEx": "تصفية ملاحظات الإصدار باستخدام تعبير نمطي", + "customLinkFilterRegex": "تصفية روابط APK المخصصة باستخدام تعبير نمطي (افتراضيًا '.apk$')", + "appsPossiblyUpdated": "تمت محاولة تحديث التطبيقات", + "appsPossiblyUpdatedNotifDescription": "يخطر المستخدم بأن تحديثات لواحد أو أكثر من التطبيقات قد تم تطبيقها في الخلفية", + "xWasPossiblyUpdatedToY": "{} قد تم تحديثه إلى {}.", + "enableBackgroundUpdates": "تمكين التحديثات في الخلفية", + "backgroundUpdateReqsExplanation": "قد لا تكون التحديثات في الخلفية ممكنة لجميع التطبيقات.", + "backgroundUpdateLimitsExplanation": "يمكن تحديد نجاح التثبيت في الخلفية فقط عند فتح Obtainium.", + "verifyLatestTag": "التحقق من علامة 'الأحدث'", + "intermediateLinkRegex": "تصفية للوصول إلى رابط 'وسيط'", + "filterByLinkText": "تصفية الروابط حسب نص الرابط", + "intermediateLinkNotFound": "لم يتم العثور على رابط وسيط", + "intermediateLink": "رابط وسيط", + "exemptFromBackgroundUpdates": "إعفاء من التحديثات في الخلفية (إذا تم تمكينها)", + "bgUpdatesOnWiFiOnly": "تعطيل التحديثات في الخلفية عند عدم الاتصال بشبكة Wi-Fi", + "bgUpdatesWhileChargingOnly": "تعطيل التحديثات في الخلفية عند عدم الشحن", + "autoSelectHighestVersionCode": "تحديد أعلى إصدار تلقائيًا", + "versionExtractionRegEx": "تعبير نمطي لاستخراج الإصدار", + "trimVersionString": "قص سلسلة الإصدار باستخدام تعبير نمطي", + "matchGroupToUseForX": "مجموعة المطابقة لاستخدامها لـ \"{}\"", + "matchGroupToUse": "مجموعة المطابقة لاستخدامها في تعبير استخراج الإصدار", + "highlightTouchTargets": "تمييز أهداف اللمس الأقل وضوحًا", + "pickExportDir": "اختر دليل التصدير", + "autoExportOnChanges": "تصدير تلقائي عند التغييرات", + "includeSettings": "تضمين الإعدادات", + "filterVersionsByRegEx": "تصفية الإصدارات باستخدام تعبير نمطي", + "trySelectingSuggestedVersionCode": "محاولة تحديد الإصدار المقترح تلقائيًا", + "dontSortReleasesList": "الحفاظ على ترتيب الإصدارات من API", + "reverseSort": "فرز عكسي", + "takeFirstLink": "أخذ أول رابط", + "skipSort": "تخطي الفرز", + "debugMenu": "قائمة التصحيح", + "bgTaskStarted": "بدأت المهمة في الخلفية - تحقق من السجلات.", + "runBgCheckNow": "تشغيل التحقق من التحديثات في الخلفية الآن", + "versionExtractWholePage": "تطبيق تعبير استخراج الإصدار على الصفحة بأكملها", + "installing": "جاري التثبيت", + "skipUpdateNotifications": "تخطي إشعارات التحديث", + "updatesAvailableNotifChannel": "تحديثات متاحة", + "appsUpdatedNotifChannel": "تم تحديث التطبيقات", + "appsPossiblyUpdatedNotifChannel": "تمت محاولة تحديث التطبيقات", + "errorCheckingUpdatesNotifChannel": "خطأ في التحقق من التحديثات", + "appsRemovedNotifChannel": "تمت إزالة التطبيقات", + "downloadingXNotifChannel": "جاري تنزيل {}", + "completeAppInstallationNotifChannel": "إكمال تثبيت التطبيق", + "checkingForUpdatesNotifChannel": "جاري التحقق من التحديثات", + "onlyCheckInstalledOrTrackOnlyApps": "التحقق فقط من التطبيقات المثبتة أو للتعقب فقط", + "supportFixedAPKURL": "دعم روابط APK الثابتة", + "selectX": "اختر {}", + "parallelDownloads": "السماح بالتنزيل المتوازي", + "useShizuku": "استخدم Shizuku أو Sui للتثبيت", + "shizukuBinderNotFound": "خدمة Shizuku غير قيد التشغيل", + "shizukuOld": "إصدار قديم من Shizuku (<11) - قم بتحديثه", + "shizukuOldAndroidWithADB": "Shizuku يعمل على إصدار أندرويد < 8.1 مع ADB - قم بتحديث أندرويد أو استخدم Sui بدلاً من ذلك", + "shizukuPretendToBeGooglePlay": "تعيين Google Play كمصدر التثبيت (إذا تم استخدام Shizuku)", + "useSystemFont": "استخدم خط النظام", + "useVersionCodeAsOSVersion": "استخدم versionCode كإصدار مكتشف من النظام", + "requestHeader": "رأس الطلب", + "useLatestAssetDateAsReleaseDate": "استخدام أحدث تاريخ تحميل كتاريخ إصدار", + "defaultPseudoVersioningMethod": "طريقة الإصدار الوهمي الافتراضية", + "partialAPKHash": "جزء من تجزئة APK", + "APKLinkHash": "تجزئة رابط APK", + "directAPKLink": "رابط APK مباشر", + "pseudoVersionInUse": "يتم استخدام إصدار وهمي", + "installed": "مثبت", + "latest": "الأحدث", + "invertRegEx": "عكس التعبير النمطي", + "note": "ملاحظة", + "selfHostedNote": "يمكن استخدام القائمة المنسدلة \"{}\" للوصول إلى نسخ مخصصة/مستضافة ذاتيًا لأي مصدر.", + "badDownload": "تعذر تحليل ملف APK (تنزيل غير متوافق أو غير مكتمل)", + "beforeNewInstallsShareToAppVerifier": "مشاركة التطبيقات الجديدة مع AppVerifier (إذا كان متاحًا)", + "appVerifierInstructionToast": "شارك مع AppVerifier، ثم عد هنا عندما تكون جاهزًا.", + "wiki": "المساعدة/ويكي", + "crowdsourcedConfigsLabel": "تكوينات التطبيقات المقدمة من الجمهور (استخدم على مسؤوليتك)", + "crowdsourcedConfigsShort": "تكوينات التطبيقات المقدمة من الجمهور", + "allowInsecure": "السماح بطلبات HTTP غير الآمنة", + "stayOneVersionBehind": "البقاء بإصدار واحد خلف الأحدث", + "refreshBeforeDownload": "تحديث تفاصيل التطبيق قبل التنزيل", + "tencentAppStore": "متجر Tencent للتطبيقات", + "coolApk": "CoolApk", + "vivoAppStore": "متجر vivo للتطبيقات (CN)", + "name": "الاسم", + "smartname": "الاسم (ذكي)", + "sortMethod": "طريقة الفرز", + "welcome": "مرحبًا", + "documentationLinksNote": "تحتوي صفحة Obtainium على GitHub المرتبطة أدناه على روابط لمقاطع فيديو، مقالات، مناقشات وموارد أخرى ستساعدك على فهم كيفية استخدام التطبيق.", + "batteryOptimizationNote": "لاحظ أن التنزيلات في الخلفية قد تعمل بشكل أكثر موثوقية إذا قمت بتعطيل تحسينات بطارية النظام لـ Obtainium.", + "removeAppQuestion": { + "one": "إزالة التطبيق؟", + "other": "إزالة التطبيقات؟" + }, + "tooManyRequestsTryAgainInMinutes": { + "one": "طلبات كثيرة جدًا (تم تحديد المعدل) - حاول مرة أخرى بعد {} دقيقة", + "other": "طلبات كثيرة جدًا (تم تحديد المعدل) - حاول مرة أخرى بعد {} دقائق" + }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "واجه التحقق من التحديثات في الخلفية {}، سيتم جدولة محاولة أخرى بعد {} دقيقة", + "other": "واجه التحقق من التحديثات في الخلفية {}، سيتم جدولة محاولة أخرى بعد {} دقائق" + }, + "bgCheckFoundUpdatesWillNotifyIfNeeded": { + "one": "وجد التحقق من التحديثات في الخلفية {} تحديث - سيتم إخطار المستخدم إذا لزم الأمر", + "other": "وجد التحقق من التحديثات في الخلفية {} تحديثات - سيتم إخطار المستخدم إذا لزم الأمر" + }, + "apps": { + "one": "{} تطبيق", + "other": "{} تطبيقات" + }, + "url": { + "one": "{} رابط", + "other": "{} روابط" + }, + "minute": { + "one": "{} دقيقة", + "other": "{} دقائق" + }, + "hour": { + "one": "{} ساعة", + "other": "{} ساعات" + }, + "day": { + "one": "{} يوم", + "other": "{} أيام" + }, + "clearedNLogsBeforeXAfterY": { + "one": "تم مسح {n} سجل (قبل = {before}, بعد = {after})", + "other": "تم مسح {n} سجلات (قبل = {before}, بعد = {after})" + }, + "xAndNMoreUpdatesAvailable": { + "one": "{} وتطبيق واحد آخر لديه تحديثات.", + "other": "{} و{} تطبيقات أخرى لديها تحديثات." + }, + "xAndNMoreUpdatesInstalled": { + "one": "{} وتطبيق واحد آخر تم تحديثه.", + "other": "{} و{} تطبيقات أخرى تم تحديثها." + }, + "xAndNMoreUpdatesFailed": { + "one": "فشل تحديث {} وتطبيق واحد آخر.", + "other": "فشل تحديث {} و{} تطبيقات أخرى." + }, + "xAndNMoreUpdatesPossiblyInstalled": { + "one": "{} وتطبيق واحد آخر قد تم تحديثه.", + "other": "{} و{} تطبيقات أخرى قد تم تحديثها." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" + } +} From 3345b26fa9d580bb47b3e2f52d605c63326171cf Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 18:17:32 +0200 Subject: [PATCH 29/72] rewrite apkpure source to use api instead of web scraping --- lib/app_sources/apkpure.dart | 239 ++++++++++++++-------------------- lib/app_sources/uptodown.dart | 16 ++- 2 files changed, 114 insertions(+), 141 deletions(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 37742a2..db6c929 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -1,24 +1,18 @@ +import 'dart:convert'; + import 'package:device_info_plus/device_info_plus.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:html/parser.dart'; -import 'package:obtainium/app_sources/html.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; -parseDateTimeMMMddCommayyyy(String? dateString) { - DateTime? releaseDate; - try { - releaseDate = dateString != null - ? DateFormat('MMM dd, yyyy').parse(dateString) - : null; - releaseDate = dateString != null && releaseDate == null - ? DateFormat('MMMM dd, yyyy').parse(dateString) - : releaseDate; - } catch (err) { - // ignore +extension Unique on List { + List unique([Id Function(E element)? id, bool inplace = true]) { + final ids = Set(); + var list = inplace ? this : List.from(this); + list.retainWhere((x) => ids.add(id != null ? id(x) : x as Id)); + return list; } - return releaseDate; } class APKPure extends AppSource { @@ -35,6 +29,10 @@ class APKPure extends AppSource { [ GeneratedFormSwitch('stayOneVersionBehind', label: tr('stayOneVersionBehind'), defaultValue: false) + ], + [ + GeneratedFormSwitch('selectNewestApk', + label: tr('selectNewestApk'), defaultValue: true) ] ]; } @@ -65,109 +63,65 @@ class APKPure extends AppSource { return Uri.parse(standardUrl).pathSegments.last; } - getDetailsForVersionLink( - String standardUrl, - String appId, - String host, - List supportedArchs, - String link, + getDetailsForVersion(List versionVariants, List supportedArchs, Map additionalSettings) async { - var res = await sourceRequest(link, additionalSettings); - if (res.statusCode == 200) { - var html = parse(res.body); - var apksDiv = - html.querySelector('#version-list div div.show-more-content'); - DateTime? topReleaseDate; - var apkUrls = apksDiv - ?.querySelectorAll('div.group-title') - .map((e) { - String architectureString = e.text.trim(); - if (architectureString.toLowerCase() == 'unlimited' || - architectureString.toLowerCase() == 'universal') { - architectureString = ''; - } - List architectures = architectureString - .split(',') - .map((e) => e.trim()) - .where((e) => e.isNotEmpty) - .toList(); - // Only take the first APK for each architecture, ignore others for now, for simplicity - // Unclear why there can even be multiple APKs for the same version and arch - var apkInfo = e.nextElementSibling?.querySelector('div.info'); - String? versionCode = RegExp('[0-9]+') - .firstMatch( - apkInfo?.querySelector('div.info-top .code')?.text ?? - '') - ?.group(0) - ?.trim(); - var types = apkInfo - ?.querySelectorAll('div.info-top span.tag') - .map((e) => e.text.trim()) - .map((t) => t == 'APKs' ? 'APK' : t) ?? - []; - String type = types.isEmpty ? 'APK' : types.first; - String? dateString = apkInfo - ?.querySelector('div.info-bottom span.time') - ?.text - .trim(); - DateTime? releaseDate = parseDateTimeMMMddCommayyyy(dateString); - if (additionalSettings['autoApkFilterByArch'] == true && - architectures.isNotEmpty && - architectures - .where((a) => supportedArchs.contains(a)) - .isEmpty) { - return const MapEntry('', ''); - } - topReleaseDate ??= - releaseDate; // Just use the release date of the first APK in the list as the release date for this version - return MapEntry( - '$appId-$versionCode-$architectureString.${type.toLowerCase()}', - 'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode'); - }) - .where((e) => e.key.isNotEmpty) - .toList() ?? - []; - if (apkUrls.isEmpty) { - var link = - html.querySelector("a.download-start-btn")?.attributes['href']; - RegExp downloadLinkRegEx = RegExp( - r'^https:\/\/d\.[^/]+\/b\/([^/]+)\/[^/?]+\?versionCode=([0-9]+)$', - caseSensitive: false); - RegExpMatch? match = downloadLinkRegEx.firstMatch(link ?? ''); - if (match == null) { - throw NoAPKError(); - } - String type = match.group(1)!; - String versionCode = match.group(2)!; - apkUrls = [ - MapEntry('$appId-$versionCode-.${type.toLowerCase()}', - 'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode') - ]; - } - String version = Uri.parse(link).pathSegments.last; - String? author; - try { - author = html - .querySelector('span.info-sdk') - ?.text - .trim() - .substring(version.length + 4) ?? - Uri.parse(standardUrl).pathSegments.reversed.last; - } catch (e) { - author = html.querySelector('span.info-sdk')?.text.trim() ?? - Uri.parse(standardUrl).pathSegments.reversed.last; - } - String appName = - html.querySelector('h1.info-title')?.text.trim() ?? appId; - String? changeLog = html - .querySelector('div.module.change-log') - ?.innerHtml - .trim() - .replaceAll("
    ", " \n"); - return APKDetails(version, apkUrls, AppNames(author, appName), - releaseDate: topReleaseDate, changeLog: changeLog); + var apkUrls = versionVariants + .map((e) { + String appId = e['package_name']; + String versionCode = e['version_code']; + + List architectures = e['native_code']?.cast(); + String architectureString = architectures.join(','); + if (additionalSettings['autoApkFilterByArch'] == true && + architectures.isNotEmpty && + architectures.where((a) => supportedArchs.contains(a)).isEmpty) { + return null; + } + + String type = e['asset']['type']; + if (e['is_a_p_ks'] == true) { + type = 'APK'; + } + + return MapEntry( + '$appId-$versionCode-$architectureString.${type.toLowerCase()}', + 'https://d.cdnpure.com/b/$type/$appId?versionCode=$versionCode&nc=$architectureString'); + }) + .nonNulls + .toList() + .unique((e) => e.key); + + // get version details from first variant + var v = versionVariants.first; + String version = v['version_name']; + String author = v['developer']; + String appName = v['title']; + DateTime releaseDate = DateTime.parse(v['update_date']); + String? changeLog = v['whatsnew']; + if (changeLog != null && changeLog.isEmpty) { + changeLog = null; + } + + if (additionalSettings['selectNewestApk'] == true) { + apkUrls = [apkUrls.first]; + } + + return APKDetails(version, apkUrls, AppNames(author, appName), + releaseDate: releaseDate, changeLog: changeLog); + } + + @override + Future?> getRequestHeaders( + Map additionalSettings, + {bool forAPKDownload = false}) async { + if (forAPKDownload) { + return null; } else { - throw getObtainiumHttpError(res); + return { + "Ual-Access-Businessid": "projecta", + "Ual-Access-ProjectA": + '{"device_info":{"os_ver":"${((await DeviceInfoPlugin().androidInfo).version.sdkInt)}"}}', + }; } } @@ -177,41 +131,46 @@ class APKPure extends AppSource { Map additionalSettings, ) async { String appId = (await tryInferringAppId(standardUrl))!; - String host = Uri.parse(standardUrl).host; - var res0 = await sourceRequest('$standardUrl/versions', additionalSettings); - var decodedStandardUrl = standardUrl; - try { - decodedStandardUrl = Uri.decodeFull(decodedStandardUrl); - } catch (e) { - // + List supportedArchs = + (await DeviceInfoPlugin().androidInfo).supportedAbis; + + // request versions from API + var res = await sourceRequest( + "https://tapi.pureapk.com/v3/get_app_his_version?package_name=$appId&hl=en", + additionalSettings); + if (res.statusCode != 200) { + throw getObtainiumHttpError(res); } - var versionLinks = await grabLinksCommon(res0, { - 'skipSort': true, - 'customLinkFilterRegex': '$decodedStandardUrl/download/[^/]+\$' - }); + List> apks = + jsonDecode(res.body)['version_list'].cast>(); - var supportedArchs = (await DeviceInfoPlugin().androidInfo).supportedAbis; + // group by version + List versions = apks + .fold>>>({}, + (Map>> val, + Map element) { + String v = element['version_name']; + if (!val.containsKey(v)) { + val[v] = []; + } + val[v]?.add(element); + return val; + }) + .values + .toList(); - if (additionalSettings['autoApkFilterByArch'] != true) { - // No need to request multiple versions when we're not going to filter them (always pick the top one) - versionLinks = versionLinks.sublist(0, 1); - } - if (versionLinks.isEmpty) { - throw NoReleasesError(); - } - - for (var i = 0; i < versionLinks.length; i++) { - var link = versionLinks[i]; + for (var i = 0; i < versions.length; i++) { + var v = versions[i]; try { if (i == 0 && additionalSettings['stayOneVersionBehind'] == true) { throw NoReleasesError(); } - return await getDetailsForVersionLink(standardUrl, appId, host, - supportedArchs, link.key, additionalSettings); + return await getDetailsForVersion( + v, supportedArchs, additionalSettings); } catch (e) { if (additionalSettings['fallbackToOlderReleases'] != true || - i == versionLinks.length - 1) { + i == versions.length - 1) { rethrow; } } diff --git a/lib/app_sources/uptodown.dart b/lib/app_sources/uptodown.dart index fa447b8..134b64c 100644 --- a/lib/app_sources/uptodown.dart +++ b/lib/app_sources/uptodown.dart @@ -1,9 +1,23 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:html/parser.dart'; -import 'package:obtainium/app_sources/apkpure.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; +parseDateTimeMMMddCommayyyy(String? dateString) { + DateTime? releaseDate; + try { + releaseDate = dateString != null + ? DateFormat('MMM dd, yyyy').parse(dateString) + : null; + releaseDate = dateString != null && releaseDate == null + ? DateFormat('MMMM dd, yyyy').parse(dateString) + : releaseDate; + } catch (err) { + // ignore + } + return releaseDate; +} + class Uptodown extends AppSource { Uptodown() { hosts = ['uptodown.com']; From ae2dad01ff938864e650fa4c8b356ac3d85b6d58 Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 18:29:45 +0200 Subject: [PATCH 30/72] rename newst apk option --- lib/app_sources/apkpure.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index db6c929..cab50d7 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -31,8 +31,8 @@ class APKPure extends AppSource { label: tr('stayOneVersionBehind'), defaultValue: false) ], [ - GeneratedFormSwitch('selectNewestApk', - label: tr('selectNewestApk'), defaultValue: true) + GeneratedFormSwitch('useFirstApkOfVersion', + label: tr('useFirstApkOfVersion'), defaultValue: true) ] ]; } @@ -102,7 +102,7 @@ class APKPure extends AppSource { changeLog = null; } - if (additionalSettings['selectNewestApk'] == true) { + if (additionalSettings['useFirstApkOfVersion'] == true) { apkUrls = [apkUrls.first]; } From d8c9cd65791b27f3bc3593d56a132c730c880cff Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 18:34:15 +0200 Subject: [PATCH 31/72] apkpure: detect 'universal' and 'unlimited' architectures --- lib/app_sources/apkpure.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index cab50d7..1c66fb0 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -72,6 +72,10 @@ class APKPure extends AppSource { List architectures = e['native_code']?.cast(); String architectureString = architectures.join(','); + if (architectures.contains("universal") || + architectures.contains("unlimited")) { + architectures = []; + } if (additionalSettings['autoApkFilterByArch'] == true && architectures.isNotEmpty && architectures.where((a) => supportedArchs.contains(a)).isEmpty) { From 6e0819b0a7b664cab191ecc8957c7bf56c17916a Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 18:39:18 +0200 Subject: [PATCH 32/72] apkpure: only use nc query param if not empty --- lib/app_sources/apkpure.dart | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 1c66fb0..4a57552 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -87,9 +87,18 @@ class APKPure extends AppSource { type = 'APK'; } + var downloadUri = Uri.parse("https://d.cdnpure.com/b/$type/$appId"); + var queryParameters = { + "versionCode": versionCode, + }; + if (architectureString.isNotEmpty) { + queryParameters["nc"] = architectureString; + } + downloadUri = downloadUri.replace(queryParameters: queryParameters); + return MapEntry( '$appId-$versionCode-$architectureString.${type.toLowerCase()}', - 'https://d.cdnpure.com/b/$type/$appId?versionCode=$versionCode&nc=$architectureString'); + downloadUri.toString()); }) .nonNulls .toList() From ee9b0e710ca8e8b985e0628a03c174291f9954bb Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 18:42:55 +0200 Subject: [PATCH 33/72] apkpure: properly throw NoAPKError if none found --- lib/app_sources/apkpure.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 4a57552..8c1bb7a 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -104,6 +104,10 @@ class APKPure extends AppSource { .toList() .unique((e) => e.key); + if (apkUrls.isEmpty) { + throw NoAPKError(); + } + // get version details from first variant var v = versionVariants.first; String version = v['version_name']; From 369127806f226e754cb6ba13943697db947d0c4e Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 19:00:54 +0200 Subject: [PATCH 34/72] apkpure: throw NoReleasesError when version list is empty --- lib/app_sources/apkpure.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 8c1bb7a..e4b0bc9 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -177,6 +177,10 @@ class APKPure extends AppSource { .values .toList(); + if (versions.isEmpty) { + throw NoReleasesError(); + } + for (var i = 0; i < versions.length; i++) { var v = versions[i]; try { From 5b6299496ff5eecba1cc440a7cab226033e2f03c Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 19:14:11 +0200 Subject: [PATCH 35/72] apkpure: determine APK/XAPK only by asset type, ignore APKs apks install resulted in "incompatible" error with some apps on testing --- lib/app_sources/apkpure.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index e4b0bc9..9ac3171 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -83,9 +83,6 @@ class APKPure extends AppSource { } String type = e['asset']['type']; - if (e['is_a_p_ks'] == true) { - type = 'APK'; - } var downloadUri = Uri.parse("https://d.cdnpure.com/b/$type/$appId"); var queryParameters = { From 47a6e0dc7c613a8de459e777efcbd08141cddf20 Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 19:24:33 +0200 Subject: [PATCH 36/72] apkpure: improve typing --- lib/app_sources/apkpure.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 9ac3171..836c8c2 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -63,7 +63,9 @@ class APKPure extends AppSource { return Uri.parse(standardUrl).pathSegments.last; } - getDetailsForVersion(List versionVariants, List supportedArchs, + getDetailsForVersion( + List> versionVariants, + List supportedArchs, Map additionalSettings) async { var apkUrls = versionVariants .map((e) { @@ -160,7 +162,7 @@ class APKPure extends AppSource { jsonDecode(res.body)['version_list'].cast>(); // group by version - List versions = apks + List>> versions = apks .fold>>>({}, (Map>> val, Map element) { From b2d6752b809d0d10e4521eabf30360b0c47267a1 Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 21:10:18 +0200 Subject: [PATCH 37/72] apkpure: use provided asset download links --- lib/app_sources/apkpure.dart | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 836c8c2..e2c5a9c 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -85,19 +85,11 @@ class APKPure extends AppSource { } String type = e['asset']['type']; - - var downloadUri = Uri.parse("https://d.cdnpure.com/b/$type/$appId"); - var queryParameters = { - "versionCode": versionCode, - }; - if (architectureString.isNotEmpty) { - queryParameters["nc"] = architectureString; - } - downloadUri = downloadUri.replace(queryParameters: queryParameters); + String downloadUri = e['asset']['url']; return MapEntry( '$appId-$versionCode-$architectureString.${type.toLowerCase()}', - downloadUri.toString()); + downloadUri); }) .nonNulls .toList() From 3890785fc7e3d9b02a72c6cb34a07c25c24293df Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Mon, 19 May 2025 15:19:34 -0400 Subject: [PATCH 38/72] Add Arabic to language menu --- lib/main.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/main.dart b/lib/main.dart index 6d04931..031828b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -48,6 +48,7 @@ List> supportedLocales = const [ MapEntry(Locale('in'), 'Bahasa Indonesia'), MapEntry(Locale('ko'), '한국어'), MapEntry(Locale('ca'), 'Català'), + MapEntry(Locale('ar'), 'عربى'), ]; const fallbackLocale = Locale('en'); const localeDir = 'assets/translations'; From 6d28d15d4f3415105d9ba5bf984b5cc23d423fcb Mon Sep 17 00:00:00 2001 From: bernikr Date: Mon, 19 May 2025 21:47:04 +0200 Subject: [PATCH 39/72] add translations --- assets/translations/bs.json | 2 ++ assets/translations/ca.json | 2 ++ assets/translations/cs.json | 2 ++ assets/translations/da.json | 2 ++ assets/translations/de.json | 2 ++ assets/translations/en-EO.json | 2 ++ assets/translations/en.json | 1 + assets/translations/es.json | 2 ++ assets/translations/fa.json | 2 ++ assets/translations/fr.json | 2 ++ assets/translations/hu.json | 2 ++ assets/translations/id.json | 2 ++ assets/translations/it.json | 2 ++ assets/translations/ja.json | 2 ++ assets/translations/ko.json | 2 ++ assets/translations/nl.json | 2 ++ assets/translations/pl.json | 2 ++ assets/translations/pt-BR.json | 2 ++ assets/translations/pt.json | 2 ++ assets/translations/ru.json | 2 ++ assets/translations/sv.json | 2 ++ assets/translations/tr.json | 2 ++ assets/translations/uk.json | 2 ++ assets/translations/vi.json | 2 ++ assets/translations/zh-Hant-TW.json | 2 ++ assets/translations/zh.json | 1 + 26 files changed, 50 insertions(+) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 93115fe..9ccd50c 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Crowdsourced App Configurations", "allowInsecure": "Allow insecure HTTP requests", "stayOneVersionBehind": "Stay one version behind latest", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Refresh app details before download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Name", "smartname": "Name (Smart)", "sortMethod": "Sort Method", diff --git a/assets/translations/ca.json b/assets/translations/ca.json index bc54638..5b91004 100644 --- a/assets/translations/ca.json +++ b/assets/translations/ca.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Configuració de les aplicacions crowdsourcing", "allowInsecure": "Permet les sol·licituds HTTP insegures", "stayOneVersionBehind": "Roman a la versió anterior a l'última", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Actualitza les dades de l'aplicació abans de descarregar-la", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Nom", "smartname": "Nom (smart)", "sortMethod": "Mètode d'ordenació", diff --git a/assets/translations/cs.json b/assets/translations/cs.json index 13acf9b..3da39f2 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Konfigurace aplikací s využitím crowdsourcingu", "allowInsecure": "Povolení nezabezpečených požadavků HTTP", "stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Obnovení údajů o aplikaci před stažením", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Název", "smartname": "Název (Smart)", "sortMethod": "Metoda třídění", diff --git a/assets/translations/da.json b/assets/translations/da.json index fb5e92e..1b788a7 100644 --- a/assets/translations/da.json +++ b/assets/translations/da.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Crowdsourcede app-konfigurationer", "allowInsecure": "Tillad usikre HTTP-anmodninger", "stayOneVersionBehind": "Forbliv én version bagud den seneste", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Opdater app-detaljer før download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Navn", "smartname": "Navn (Smart)", "sortMethod": "Sorteringsmetode", diff --git a/assets/translations/de.json b/assets/translations/de.json index 1013106..9f1165d 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Crowdsourced App-Konfigurationen", "allowInsecure": "Unsichere HTTP-Anfragen zulassen", "stayOneVersionBehind": "Eine Version hinter der neuesten Version bleiben", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "App-Details vor dem Download aktualisieren", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Name", "smartname": "Name (Smart)", "sortMethod": "Sortierverfahren", diff --git a/assets/translations/en-EO.json b/assets/translations/en-EO.json index 2f1826c..a298994 100644 --- a/assets/translations/en-EO.json +++ b/assets/translations/en-EO.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Crowdsourced App Configurations", "allowInsecure": "Allow insecure HTTP requests", "stayOneVersionBehind": "Stay one version behind latest", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Refresh app details before download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Name", "smartname": "Name (Smart)", "sortMethod": "Sort Method", diff --git a/assets/translations/en.json b/assets/translations/en.json index 3565d0a..5473a27 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -318,6 +318,7 @@ "crowdsourcedConfigsShort": "Crowdsourced app configurations", "allowInsecure": "Allow insecure HTTP requests", "stayOneVersionBehind": "Stay one version behind latest", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Refresh app details before download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", diff --git a/assets/translations/es.json b/assets/translations/es.json index 0e9d905..fe50f2b 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Configuración de aplicaciones por crowdsourcing", "allowInsecure": "Permitir peticiones HTTP inseguras", "stayOneVersionBehind": "Mantenerse una versión por detrás de la última", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Actualiza los datos de la aplicación antes de descargarla", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Nombre", "smartname": "Nombre (Smart)", "sortMethod": "Método de clasificación", diff --git a/assets/translations/fa.json b/assets/translations/fa.json index e91875e..b4a7c85 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "تنظیمات برنامه های مشارکت جمعی", "allowInsecure": "درخواست های HTTP ناامن را مجاز کنید", "stayOneVersionBehind": "یک نسخه از آخرین نسخه پشت سر بگذارید", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "قبل از دانلود، جزئیات برنامه را بازخوانی کنید", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Name", "smartname": "Name (Smart)", "sortMethod": "Sort Method", diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 0f4e313..c249bb9 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Applications communautaires", "allowInsecure": "Autoriser les requêtes HTTP non sécurisées", "stayOneVersionBehind": "Rester une version en arrière de la dernière", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Actualiser les détails de l'application avant de la télécharger", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Nom", "smartname": "Nom (Smart)", "sortMethod": "Méthode de tri", diff --git a/assets/translations/hu.json b/assets/translations/hu.json index b140dee..0112a62 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Alkalmazáslista", "allowInsecure": "Nem biztonságos HTTP-kérések engedélyezése", "stayOneVersionBehind": "Maradjon egy verzióval a legújabb mögött", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Az alkalmazás adatainak frissítése a letöltés előtt", "tencentAppStore": "Tencent Appstore", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Név", "smartname": "Név (Okos)", "sortMethod": "Rendezési eljárás", diff --git a/assets/translations/id.json b/assets/translations/id.json index 17f3313..2cbe350 100644 --- a/assets/translations/id.json +++ b/assets/translations/id.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Konfigurasi Aplikasi Crowdsourced", "allowInsecure": "Izinkan permintaan HTTP yang tidak aman", "stayOneVersionBehind": "Tetap satu versi di belakang versi terbaru", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Segarkan detail aplikasi sebelum mengunduh", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Nama", "smartname": "Nama (Cerdas)", "sortMethod": "Metode Penyortiran", diff --git a/assets/translations/it.json b/assets/translations/it.json index e0ede2f..34f28f4 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Configurazioni di app in crowdsourcing", "allowInsecure": "Consentire le richieste HTTP non sicure", "stayOneVersionBehind": "Rimanere una versione indietro rispetto alla più recente", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Aggiornare i dettagli dell'app prima del download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Nome", "smartname": "Nome (intelligente)", "sortMethod": "Metodo di ordinamento", diff --git a/assets/translations/ja.json b/assets/translations/ja.json index f1c7419..8ef458d 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "クラウドソーシングによるアプリの設定", "allowInsecure": "安全でないHTTPリクエストを許可する", "stayOneVersionBehind": "最新のバージョンから1つ前のものを使用する", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "ダウンロード前にアプリの詳細を更新する", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "名称", "smartname": "名前(スマート)", "sortMethod": "ソート方法", diff --git a/assets/translations/ko.json b/assets/translations/ko.json index ad34de9..4ce75a3 100644 --- a/assets/translations/ko.json +++ b/assets/translations/ko.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "크라우드소싱 앱 구성", "allowInsecure": "안전하지 않은 HTTP 요청 허용", "stayOneVersionBehind": "최신 버전보다 한 버전 뒤에 머무르기", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "다운로드 전에 앱 세부 정보 새로 고침", "tencentAppStore": "텐센트 앱 스토어", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "이름", "smartname": "이름(스마트)", "sortMethod": "정렬 방법", diff --git a/assets/translations/nl.json b/assets/translations/nl.json index a069052..edc53ae 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "App-configuraties door menigte", "allowInsecure": "Onveilige HTTP-verzoeken toestaan", "stayOneVersionBehind": "Blijf een versie achter op de nieuwste", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Vernieuw app details voor download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Naam", "smartname": "Naam (Slim)", "sortMethod": "Sorteermethode", diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 7cb65cf..ad13b6b 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Baza konfiguracji", "allowInsecure": "Zezwalaj na niezabezpieczone żądania HTTP", "stayOneVersionBehind": "Pozostań jedną wersję w tyle za najnowszą", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Odśwież szczegóły aplikacji przed pobraniem", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Nazwa", "smartname": "Nazwa (Smart)", "sortMethod": "Metoda sortowania", diff --git a/assets/translations/pt-BR.json b/assets/translations/pt-BR.json index 8578f5c..bd85a05 100644 --- a/assets/translations/pt-BR.json +++ b/assets/translations/pt-BR.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Configurações de app da comunidade", "allowInsecure": "Permitir solicitações de HTTP inseguras", "stayOneVersionBehind": "Ficar uma versão antes da mais recente", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Atualizar detalhes do app antes de baixar", "tencentAppStore": "Loja de Apps da Tencent", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Nome", "smartname": "Nome (inteligente)", "sortMethod": "Método de ordenação", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 21125d9..ec08032 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Configurações de aplicações com base em crowdsourcing", "allowInsecure": "Permitir pedidos HTTP inseguros", "stayOneVersionBehind": "Manter-se uma versão atrás da mais recente", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Atualizar os detalhes da aplicação antes da transferência", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Nome", "smartname": "Nome (Smart)", "sortMethod": "Método de ordenação", diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 9a8af88..43c80db 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Конфиги приложений с помощью краудсорсинга", "allowInsecure": "Разрешить небезопасные HTTP-запросы", "stayOneVersionBehind": "Не отставайте от последней версии", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Имя", "smartname": "Имя (умное)", "sortMethod": "Метод сортировки", diff --git a/assets/translations/sv.json b/assets/translations/sv.json index 11117a2..733b5b2 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Appkonfigurationer med hjälp av crowdsourcing", "allowInsecure": "Tillåt osäkra HTTP-förfrågningar", "stayOneVersionBehind": "Håll dig en version bakom den senaste", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Uppdatera appdetaljerna före nedladdning", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Namn", "smartname": "Namn (Smart)", "sortMethod": "Sorteringsmetod", diff --git a/assets/translations/tr.json b/assets/translations/tr.json index 9b1e6c8..d1eb71e 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Kitle Kaynaklı Uygulama Yapılandırmaları", "allowInsecure": "Güvensiz HTTP isteklerine izin ver", "stayOneVersionBehind": "En son sürümün bir sürüm gerisinde kalın", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "İndirmeden önce uygulama ayrıntılarını yenileyin", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "İsim", "smartname": "İsim (Akıllı)", "sortMethod": "Sıralama Yöntemi", diff --git a/assets/translations/uk.json b/assets/translations/uk.json index cd20fc6..892bf2d 100644 --- a/assets/translations/uk.json +++ b/assets/translations/uk.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Налаштування краудсорсингових додатків", "allowInsecure": "Дозволити незахищені HTTP-запити", "stayOneVersionBehind": "Залишайтеся на одну версію актуальнішою", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Оновіть інформацію про програму перед завантаженням", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Ім'я", "smartname": "Ім'я (Smart)", "sortMethod": "Метод сортування", diff --git a/assets/translations/vi.json b/assets/translations/vi.json index b63d108..7beaf56 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "Crowdsourced App Configurations", "allowInsecure": "Allow insecure HTTP requests", "stayOneVersionBehind": "Stay one version behind latest", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "Refresh app details before download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "Name", "smartname": "Name (Smart)", "sortMethod": "Sort Method", diff --git a/assets/translations/zh-Hant-TW.json b/assets/translations/zh-Hant-TW.json index 92d6527..832855e 100644 --- a/assets/translations/zh-Hant-TW.json +++ b/assets/translations/zh-Hant-TW.json @@ -318,9 +318,11 @@ "crowdsourcedConfigsShort": "群眾外包的應用程式設定", "allowInsecure": "允許不安全的 HTTP 請求", "stayOneVersionBehind": "保持比最新版本落後一個版本", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "下載前刷新應用程式詳細資訊", "tencentAppStore": "騰訊應用寶", "coolApk": "CoolApk", + "vivoAppStore": "vivo App Store (CN)", "name": "名稱", "smartname": "名稱(智慧)", "sortMethod": "排序方式", diff --git a/assets/translations/zh.json b/assets/translations/zh.json index eb07843..51af4b4 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -318,6 +318,7 @@ "crowdsourcedConfigsShort": "众包应用程序配置", "allowInsecure": "允许不安全的 HTTP 请求", "stayOneVersionBehind": "比最新版本晚一个版本", + "useFirstApkOfVersion": "Auto-select first of multiple APKs", "refreshBeforeDownload": "下载前刷新应用程序详细信息", "tencentAppStore": "腾讯应用宝", "coolApk": "酷安", From 51c7acf4665a712fc62e78b04ccf10dba11430e6 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Mon, 19 May 2025 15:53:51 -0400 Subject: [PATCH 40/72] Update ar language name --- lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 031828b..b1e8953 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -48,7 +48,7 @@ List> supportedLocales = const [ MapEntry(Locale('in'), 'Bahasa Indonesia'), MapEntry(Locale('ko'), '한국어'), MapEntry(Locale('ca'), 'Català'), - MapEntry(Locale('ar'), 'عربى'), + MapEntry(Locale('ar'), 'العربية'), ]; const fallbackLocale = Locale('en'); const localeDir = 'assets/translations'; From 9fe33737eb619939bcb69bf16309a66af4573609 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Mon, 19 May 2025 15:55:02 -0400 Subject: [PATCH 41/72] Upgrade packages, increment version --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 181d33d..56380bf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1203,10 +1203,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: "5ece28a317a9f76ad5ee17c78dbacc8a491687cec85ee19c1643761bf8d678ef" + sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.7.0" webview_flutter_platform_interface: dependency: transitive description: @@ -1219,10 +1219,10 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "6af7d1908c9c89311c2dffcc2c9b51b88a6f055ba16fa0aa8a04cbb1c3afc9ce" + sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 url: "https://pub.dev" source: hosted - version: "3.21.0" + version: "3.22.0" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4f262a5..988c837 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.54+2311 +version: 1.1.55+2312 environment: sdk: ^3.6.0 From bd32a10de7cebec1b8f16c9147108b444db45c90 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Mon, 19 May 2025 17:51:11 -0400 Subject: [PATCH 42/72] Update translations --- assets/translations/ar.json | 1 + assets/translations/cs.json | 6 +++--- assets/translations/da.json | 4 ++-- assets/translations/de.json | 4 ++-- assets/translations/es.json | 4 ++-- assets/translations/fr.json | 4 ++-- assets/translations/hu.json | 2 +- assets/translations/id.json | 4 ++-- assets/translations/it.json | 4 ++-- assets/translations/ja.json | 4 ++-- assets/translations/ko.json | 4 ++-- assets/translations/nl.json | 4 ++-- assets/translations/pl.json | 4 ++-- assets/translations/pt-BR.json | 18 +++++++++--------- assets/translations/pt.json | 4 ++-- assets/translations/ru.json | 4 ++-- assets/translations/standardize.js | 4 ++++ assets/translations/sv.json | 4 ++-- assets/translations/tr.json | 4 ++-- assets/translations/uk.json | 4 ++-- assets/translations/zh.json | 4 ++-- 21 files changed, 50 insertions(+), 45 deletions(-) diff --git a/assets/translations/ar.json b/assets/translations/ar.json index 7796604..b310e98 100644 --- a/assets/translations/ar.json +++ b/assets/translations/ar.json @@ -318,6 +318,7 @@ "crowdsourcedConfigsShort": "تكوينات التطبيقات المقدمة من الجمهور", "allowInsecure": "السماح بطلبات HTTP غير الآمنة", "stayOneVersionBehind": "البقاء بإصدار واحد خلف الأحدث", + "useFirstApkOfVersion": "التحديد التلقائي الأول من بين عدة ملفات APK", "refreshBeforeDownload": "تحديث تفاصيل التطبيق قبل التنزيل", "tencentAppStore": "متجر Tencent للتطبيقات", "coolApk": "CoolApk", diff --git a/assets/translations/cs.json b/assets/translations/cs.json index 3da39f2..ee1515c 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -36,7 +36,7 @@ "trackOnlyAppDescription": "Aplikace je sledována kvůli aktualizacím, ale Obtainium ji nebude stahovat ani instalovat.", "cancelled": "Zrušeno", "appAlreadyAdded": "Aplikace již přidána", - "alreadyUpToDateQuestion": "App already up to date?", + "alreadyUpToDateQuestion": "Aplikace je již aktualizovaná?", "addApp": "Přidat aplikaci", "appSourceURL": "Zdrojová adresa URL aplikace", "error": "Chyba", @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Konfigurace aplikací s využitím crowdsourcingu", "allowInsecure": "Povolení nezabezpečených požadavků HTTP", "stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Automatický výběr prvního z více souborů APK", "refreshBeforeDownload": "Obnovení údajů o aplikaci před stažením", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Metoda třídění", "welcome": "Vítejte na", "documentationLinksNote": "Níže odkazovaná stránka Obtainium GitHub obsahuje odkazy na videa, články, diskuse a další zdroje, které vám pomohou pochopit, jak aplikaci používat.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Všimněte si, že stahování na pozadí může fungovat spolehlivěji, pokud vypnete optimalizaci baterie operačního systému pro Obtainium.", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/da.json b/assets/translations/da.json index 1b788a7..34772bd 100644 --- a/assets/translations/da.json +++ b/assets/translations/da.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Crowdsourcede app-konfigurationer", "allowInsecure": "Tillad usikre HTTP-anmodninger", "stayOneVersionBehind": "Forbliv én version bagud den seneste", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Vælg automatisk den første af flere APK'er", "refreshBeforeDownload": "Opdater app-detaljer før download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Sorteringsmetode", "welcome": "Velkommen", "documentationLinksNote": "Obtainiums GitHub-side, som der linkes til nedenfor, indeholder links til videoer, artikler, diskussioner og andre ressourcer, som kan hjælpe dig med at forstå, hvordan du bruger appen.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Bemærk, at baggrundsdownloads kan fungere mere pålideligt, hvis du deaktiverer OS-batterioptimering for Obtainium.", "removeAppQuestion": { "one": "Fjern app?", "other": "Fjern apps?" diff --git a/assets/translations/de.json b/assets/translations/de.json index 9f1165d..337329f 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Crowdsourced App-Konfigurationen", "allowInsecure": "Unsichere HTTP-Anfragen zulassen", "stayOneVersionBehind": "Eine Version hinter der neuesten Version bleiben", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Automatische Auswahl der ersten von mehreren APKs", "refreshBeforeDownload": "App-Details vor dem Download aktualisieren", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Sortierverfahren", "welcome": "Willkommen", "documentationLinksNote": "Die unten verlinkte GitHub-Seite von Obtainium enthält Links zu Videos, Artikeln, Diskussionen und anderen Ressourcen, die Ihnen helfen werden, die Verwendung der App zu verstehen.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Beachten Sie, dass Downloads im Hintergrund möglicherweise zuverlässiger funktionieren, wenn Sie die Batterieoptimierung des Betriebssystems für Obtainium deaktivieren.", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/es.json b/assets/translations/es.json index fe50f2b..d9687b7 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Configuración de aplicaciones por crowdsourcing", "allowInsecure": "Permitir peticiones HTTP inseguras", "stayOneVersionBehind": "Mantenerse una versión por detrás de la última", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Auto-selección del primero de múltiples APKs", "refreshBeforeDownload": "Actualiza los datos de la aplicación antes de descargarla", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Método de clasificación", "welcome": "Bienvenido", "documentationLinksNote": "La página GitHub de Obtainium enlazada a continuación contiene enlaces a vídeos, artículos, debates y otros recursos que te ayudarán a entender cómo utilizar la aplicación.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Ten en cuenta que las descargas en segundo plano pueden funcionar de forma más fiable si desactivas las optimizaciones de batería del sistema operativo para Obtainium.", "removeAppQuestion": { "one": "¿Eliminar aplicación?", "other": "¿Eliminar aplicaciones?" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index c249bb9..f1e681b 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Applications communautaires", "allowInsecure": "Autoriser les requêtes HTTP non sécurisées", "stayOneVersionBehind": "Rester une version en arrière de la dernière", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Sélection automatique du premier APK parmi plusieurs", "refreshBeforeDownload": "Actualiser les détails de l'application avant de la télécharger", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Méthode de tri", "welcome": "Bienvenue", "documentationLinksNote": "La page GitHub d'Obtainium, dont le lien figure ci-dessous, contient des liens vers des vidéos, des articles, des discussions et d'autres ressources qui vous aideront à comprendre comment utiliser l'application.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Notez que les téléchargements en arrière-plan peuvent fonctionner de manière plus fiable si vous désactivez les optimisations de la batterie du système d'exploitation pour Obtainium.", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 0112a62..28aafbd 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Alkalmazáslista", "allowInsecure": "Nem biztonságos HTTP-kérések engedélyezése", "stayOneVersionBehind": "Maradjon egy verzióval a legújabb mögött", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Több APK közül az első automatikus kiválasztása", "refreshBeforeDownload": "Az alkalmazás adatainak frissítése a letöltés előtt", "tencentAppStore": "Tencent Appstore", "coolApk": "CoolApk", diff --git a/assets/translations/id.json b/assets/translations/id.json index 2cbe350..c4263fe 100644 --- a/assets/translations/id.json +++ b/assets/translations/id.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Konfigurasi Aplikasi Crowdsourced", "allowInsecure": "Izinkan permintaan HTTP yang tidak aman", "stayOneVersionBehind": "Tetap satu versi di belakang versi terbaru", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Pilih otomatis yang pertama dari beberapa APK", "refreshBeforeDownload": "Segarkan detail aplikasi sebelum mengunduh", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Metode Penyortiran", "welcome": "Selamat datang.", "documentationLinksNote": "Halaman GitHub Obtainium yang ditautkan di bawah ini berisi tautan ke video, artikel, diskusi, dan sumber daya lain yang akan membantu Anda memahami cara menggunakan aplikasi.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Perhatikan bahwa unduhan latar belakang dapat bekerja lebih andal jika Anda menonaktifkan optimasi baterai OS untuk Obtainium.", "removeAppQuestion": { "one": "Hapus aplikasi?", "other": "Hapus aplikasi?" diff --git a/assets/translations/it.json b/assets/translations/it.json index 34f28f4..38f3d24 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Configurazioni di app in crowdsourcing", "allowInsecure": "Consentire le richieste HTTP non sicure", "stayOneVersionBehind": "Rimanere una versione indietro rispetto alla più recente", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Selezione automatica del primo di più APK", "refreshBeforeDownload": "Aggiornare i dettagli dell'app prima del download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Metodo di ordinamento", "welcome": "Benvenuti", "documentationLinksNote": "La pagina GitHub di Obtainium collegata qui sotto contiene collegamenti a video, articoli, discussioni e altre risorse che vi aiuteranno a capire come utilizzare l'applicazione.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Si noti che i download in background potrebbero funzionare in modo più affidabile se si disabilita l'ottimizzazione della batteria del sistema operativo per Obtainium.", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 8ef458d..b121104 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "クラウドソーシングによるアプリの設定", "allowInsecure": "安全でないHTTPリクエストを許可する", "stayOneVersionBehind": "最新のバージョンから1つ前のものを使用する", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "複数のAPKから最初のAPKを自動選択する", "refreshBeforeDownload": "ダウンロード前にアプリの詳細を更新する", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "ソート方法", "welcome": "ようこそ", "documentationLinksNote": "以下のリンクにあるObtainium GitHubページには、ビデオ、記事、ディスカッション、その他のリソースへのリンクがあり、アプリの使い方を理解するのに役立ちます。", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "ObtainiumのOSバッテリー最適化を無効にすると、バックグラウンドダウンロードがより確実に動作するようになります。", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/ko.json b/assets/translations/ko.json index 4ce75a3..16d9b29 100644 --- a/assets/translations/ko.json +++ b/assets/translations/ko.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "크라우드소싱 앱 구성", "allowInsecure": "안전하지 않은 HTTP 요청 허용", "stayOneVersionBehind": "최신 버전보다 한 버전 뒤에 머무르기", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "여러 앱 중 첫 번째 앱 자동 선택", "refreshBeforeDownload": "다운로드 전에 앱 세부 정보 새로 고침", "tencentAppStore": "텐센트 앱 스토어", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "정렬 방법", "welcome": "환영", "documentationLinksNote": "아래에 링크된 Obtainium 깃허브 페이지에는 앱 사용 방법을 이해하는 데 도움이 되는 동영상, 기사, 토론 및 기타 리소스에 대한 링크가 포함되어 있습니다.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Obtainium의 OS 배터리 최적화를 비활성화하면 백그라운드 다운로드가 더 안정적으로 작동할 수 있습니다.", "removeAppQuestion": { "one": "앱을 제거하시겠습니까?", "other": "앱을 제거하시겠습니까?" diff --git a/assets/translations/nl.json b/assets/translations/nl.json index edc53ae..6d925b8 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "App-configuraties door menigte", "allowInsecure": "Onveilige HTTP-verzoeken toestaan", "stayOneVersionBehind": "Blijf een versie achter op de nieuwste", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Automatisch de eerste van meerdere APK's selecteren", "refreshBeforeDownload": "Vernieuw app details voor download", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Sorteermethode", "welcome": "Welkom", "documentationLinksNote": "De GitHub pagina van Obtainium waarnaar hieronder wordt gelinkt bevat links naar video's, artikelen, discussies en andere bronnen die je zullen helpen begrijpen hoe je de app kunt gebruiken.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Merk op dat downloads op de achtergrond mogelijk betrouwbaarder werken als je de batterijoptimalisatie van het besturingssysteem voor Obtainium uitschakelt.", "removeAppQuestion": { "one": "App verwijderen?", "other": "Apps verwijderen?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index ad13b6b..9bfd668 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Baza konfiguracji", "allowInsecure": "Zezwalaj na niezabezpieczone żądania HTTP", "stayOneVersionBehind": "Pozostań jedną wersję w tyle za najnowszą", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Automatyczny wybór pierwszego z wielu plików APK", "refreshBeforeDownload": "Odśwież szczegóły aplikacji przed pobraniem", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Metoda sortowania", "welcome": "Witamy", "documentationLinksNote": "Strona Obtainium GitHub, do której link znajduje się poniżej, zawiera linki do filmów, artykułów, dyskusji i innych zasobów, które pomogą ci zrozumieć, jak korzystać z aplikacji.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Należy pamiętać, że pobieranie w tle może działać bardziej niezawodnie po wyłączeniu optymalizacji baterii systemu operacyjnego dla Obtainium.", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt-BR.json b/assets/translations/pt-BR.json index bd85a05..df9fb0d 100644 --- a/assets/translations/pt-BR.json +++ b/assets/translations/pt-BR.json @@ -30,7 +30,7 @@ "wrongArgNum": "Número errado de argumentos fornecidos", "xIsTrackOnly": "{} é somente de rastreio", "source": "Fonte", - "app": "App", + "app": "Aplicativo", "appsFromSourceAreTrackOnly": "Apps desta fonte são somente para rastreamento.", "youPickedTrackOnly": "Você selecionou a opção de somente rastreamento.", "trackOnlyAppDescription": "As atualizações do app serão rastreadas, mas o Obtainium não baixará ou instalará elas.", @@ -47,7 +47,7 @@ "supportedSources": "Fontes suportadas", "trackOnlyInBrackets": "(somente rastreamento)", "searchableInBrackets": "(pesquisável)", - "appsString": "Apps", + "appsString": "Aplicativos", "noApps": "Nenhum app", "noAppsForFilter": "Nenhum app pro filtro", "byX": "Por {}", @@ -318,17 +318,17 @@ "crowdsourcedConfigsShort": "Configurações de app da comunidade", "allowInsecure": "Permitir solicitações de HTTP inseguras", "stayOneVersionBehind": "Ficar uma versão antes da mais recente", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Seleção automática do primeiro de vários APKs", "refreshBeforeDownload": "Atualizar detalhes do app antes de baixar", "tencentAppStore": "Loja de Apps da Tencent", "coolApk": "CoolApk", - "vivoAppStore": "vivo App Store (CN)", + "vivoAppStore": "Vivo App Store (CN)", "name": "Nome", "smartname": "Nome (inteligente)", "sortMethod": "Método de ordenação", "welcome": "Boas vindas", "documentationLinksNote": "A página do Obtainium no GitHub visível abaixo contém links de vídeos, artigos, discussões, e outros recursos que podem te ajudar ao usar o app.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Observe que os downloads em segundo plano podem funcionar de forma mais confiável se você desativar as otimizações de bateria do sistema operacional para o Obtainium.", "removeAppQuestion": { "one": "Remover app?", "other": "Remover apps?" @@ -342,8 +342,8 @@ "other": "A busca de atualizações em segundo plano encontrou um {}, será agendado uma nova tentativa em {} minutos" }, "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "BG update checking found {} update - will notify user if needed", - "other": "BG update checking found {} updates - will notify user if needed" + "one": "Verificação da atualização do BG encontrada {} atualização - notificará o usuário se necessário", + "other": "Verificação de atualização do BG encontrou atualizações {} - notificará o usuário se necessário" }, "apps": { "one": "{} app", @@ -366,8 +366,8 @@ "other": "{} dias" }, "clearedNLogsBeforeXAfterY": { - "one": "Cleared {n} log (before = {before}, after = {after})", - "other": "Cleared {n} logs (before = {before}, after = {after})" + "one": "Limpou {n} registros (before = {before}, after = {after})", + "other": "Limpou {n} registros (antes = {before}, depois = {after})" }, "xAndNMoreUpdatesAvailable": { "one": "{} e mais 1 app têm atualizações.", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index ec08032..4172ca5 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Configurações de aplicações com base em crowdsourcing", "allowInsecure": "Permitir pedidos HTTP inseguros", "stayOneVersionBehind": "Manter-se uma versão atrás da mais recente", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Seleção automática do primeiro de vários APKs", "refreshBeforeDownload": "Atualizar os detalhes da aplicação antes da transferência", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Método de ordenação", "welcome": "Bem-vindo", "documentationLinksNote": "A página do Obtainium no GitHub com a ligação abaixo contém ligações para vídeos, artigos, discussões e outros recursos que o ajudarão a compreender como utilizar a aplicação.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Note que os downloads em segundo plano podem funcionar de forma mais fiável se desativar as optimizações da bateria do SO para o Obtainium.", "removeAppQuestion": { "one": "Remover aplicativo?", "other": "Remover aplicativos?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 43c80db..60e5e44 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Конфиги приложений с помощью краудсорсинга", "allowInsecure": "Разрешить небезопасные HTTP-запросы", "stayOneVersionBehind": "Не отставайте от последней версии", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Автоматический выбор первого из нескольких APK", "refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Метод сортировки", "welcome": "Добро пожаловать", "documentationLinksNote": "На странице Obtainium GitHub, ссылка на которую приведена ниже, содержатся ссылки на видео, статьи, обсуждения и другие ресурсы, которые помогут вам понять, как пользоваться приложением.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Обратите внимание, что фоновая загрузка может работать более надежно, если отключить оптимизацию батареи ОС для Obtainium.", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/assets/translations/standardize.js b/assets/translations/standardize.js index e2ef3ff..69f3ef3 100644 --- a/assets/translations/standardize.js +++ b/assets/translations/standardize.js @@ -16,6 +16,10 @@ const neverAutoTranslate = { placeholder: ['pl'], importExport: ['fr'], url: ['fr'], + vivoAppStore: ['cs', 'ja', 'ko'], + coolapk: ['ja'], + obtainiumImport: ['nl'], + appLogs: ['nl'], tencentAppStore: ['*'] } diff --git a/assets/translations/sv.json b/assets/translations/sv.json index 733b5b2..646c385 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Appkonfigurationer med hjälp av crowdsourcing", "allowInsecure": "Tillåt osäkra HTTP-förfrågningar", "stayOneVersionBehind": "Håll dig en version bakom den senaste", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Välj automatiskt den första av flera APK:er", "refreshBeforeDownload": "Uppdatera appdetaljerna före nedladdning", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Sorteringsmetod", "welcome": "Välkommen", "documentationLinksNote": "Obtainium GitHub-sidan som länkas nedan innehåller länkar till videor, artiklar, diskussioner och andra resurser som hjälper dig att förstå hur du använder appen.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Observera att nedladdningar i bakgrunden kan fungera mer tillförlitligt om du inaktiverar OS-batterioptimeringar för Obtainium.", "removeAppQuestion": { "one": "Ta Bort App?", "other": "Ta Bort Appar?" diff --git a/assets/translations/tr.json b/assets/translations/tr.json index d1eb71e..324e99b 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Kitle Kaynaklı Uygulama Yapılandırmaları", "allowInsecure": "Güvensiz HTTP isteklerine izin ver", "stayOneVersionBehind": "En son sürümün bir sürüm gerisinde kalın", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Birden fazla APK arasından ilkini otomatik seçme", "refreshBeforeDownload": "İndirmeden önce uygulama ayrıntılarını yenileyin", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Sıralama Yöntemi", "welcome": "Hoş geldiniz", "documentationLinksNote": "Aşağıda bağlantısı verilen Obtainium GitHub sayfası, uygulamayı nasıl kullanacağınızı anlamanıza yardımcı olacak videolara, makalelere, tartışmalara ve diğer kaynaklara bağlantılar içerir.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Obtainium için işletim sistemi pil optimizasyonlarını devre dışı bırakırsanız arka planda indirmelerin daha güvenilir şekilde çalışabileceğini unutmayın.", "removeAppQuestion": { "one": "Uygulamayı Kaldır?", "other": "Uygulamaları Kaldır?" diff --git a/assets/translations/uk.json b/assets/translations/uk.json index 892bf2d..7a0b3ed 100644 --- a/assets/translations/uk.json +++ b/assets/translations/uk.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Налаштування краудсорсингових додатків", "allowInsecure": "Дозволити незахищені HTTP-запити", "stayOneVersionBehind": "Залишайтеся на одну версію актуальнішою", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "Автоматичний вибір першого з декількох APK", "refreshBeforeDownload": "Оновіть інформацію про програму перед завантаженням", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", @@ -328,7 +328,7 @@ "sortMethod": "Метод сортування", "welcome": "Ласкаво просимо.", "documentationLinksNote": "Сторінка Obtainium на GitHub, посилання на яку наведено нижче, містить посилання на відео, статті, дискусії та інші ресурси, які допоможуть вам зрозуміти, як користуватися додатком.", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "Зауважте, що фонові завантаження можуть працювати надійніше, якщо ви вимкнете оптимізацію батареї ОС для Obtainium.", "removeAppQuestion": { "one": "Видалити застосунок?", "other": "Видалити застосунки?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 51af4b4..f8789a9 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "众包应用程序配置", "allowInsecure": "允许不安全的 HTTP 请求", "stayOneVersionBehind": "比最新版本晚一个版本", - "useFirstApkOfVersion": "Auto-select first of multiple APKs", + "useFirstApkOfVersion": "从多个 APK 中自动选择第一个", "refreshBeforeDownload": "下载前刷新应用程序详细信息", "tencentAppStore": "腾讯应用宝", "coolApk": "酷安", @@ -328,7 +328,7 @@ "sortMethod": "排序方法", "welcome": "欢迎光临", "documentationLinksNote": "下面链接的 Obtainium GitHub 页面包含视频、文章、讨论和其他资源的链接,可帮助您了解如何使用该应用程序。", - "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "batteryOptimizationNote": "请注意,如果为 Obtainium 禁用操作系统电池优化功能,后台下载可能会更稳定。", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" From 9758f8b391bb8fbcdd8226c0a740cad218a0303b Mon Sep 17 00:00:00 2001 From: summoner001 Date: Tue, 20 May 2025 08:02:03 +0200 Subject: [PATCH 43/72] Update hu.json Translate new string --- assets/translations/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 28aafbd..aff5aa7 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -318,7 +318,7 @@ "crowdsourcedConfigsShort": "Alkalmazáslista", "allowInsecure": "Nem biztonságos HTTP-kérések engedélyezése", "stayOneVersionBehind": "Maradjon egy verzióval a legújabb mögött", - "useFirstApkOfVersion": "Több APK közül az első automatikus kiválasztása", + "useFirstApkOfVersion": "A legelső APK automatikus kiválasztása, ha több APK is található", "refreshBeforeDownload": "Az alkalmazás adatainak frissítése a letöltés előtt", "tencentAppStore": "Tencent Appstore", "coolApk": "CoolApk", From f67cfeb23144c21c44356db0d51a9b1f9616da64 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 25 May 2025 14:58:57 -0400 Subject: [PATCH 44/72] Support Debian-style standard versions (#2314) --- lib/providers/apps_provider.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 3fe46be..7f125b6 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -70,7 +70,6 @@ class DownloadedXApkDir { } List generateStandardVersionRegExStrings() { - // TODO: Look into RegEx for non-Latin characters / non-Arabic numerals var basics = [ '[0-9]+', '[0-9]+\\.[0-9]+', @@ -78,7 +77,7 @@ List generateStandardVersionRegExStrings() { '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+' ]; var preSuffixes = ['-', '\\+']; - var suffixes = ['alpha', 'beta', 'ose']; + var suffixes = ['alpha', 'beta', 'ose', '[0-9]+']; var finals = ['\\+[0-9]+', '[0-9]+']; List results = []; for (var b in basics) { From c2465484362493f01133399064fb239cd44195dc Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 25 May 2025 15:03:31 -0400 Subject: [PATCH 45/72] Search should not select any sources by default --- lib/providers/settings_provider.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index a73c218..e49e8e3 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -470,7 +470,7 @@ class SettingsProvider with ChangeNotifier { } List get searchDeselected { - return prefs?.getStringList('searchDeselected') ?? []; + return prefs?.getStringList('searchDeselected') ?? SourceProvider().sources.map((s) => s.name).toList(); } set searchDeselected(List list) { From 4f27e25a2314fc20e7425324129ba4a5611c1d67 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 30 May 2025 21:52:59 -0400 Subject: [PATCH 46/72] Experiment with smarter version detection (#2324) DO NOT merge without thorough testing --- lib/providers/apps_provider.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 7f125b6..172b6ff 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -1335,7 +1335,11 @@ class AppsProvider with ChangeNotifier { var templateVersionFormats = findStandardFormatsForVersion(templateVersion, true); var comparisonVersionFormats = - findStandardFormatsForVersion(comparisonVersion, false); + findStandardFormatsForVersion(comparisonVersion, true); + if (comparisonVersionFormats.isEmpty) { + comparisonVersionFormats = + findStandardFormatsForVersion(comparisonVersion, false); + } var commonStandardFormats = templateVersionFormats.intersection(comparisonVersionFormats); if (commonStandardFormats.isEmpty) { From 3edaa143e427a31745a78208534d4e53fb25adc6 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 30 May 2025 22:29:32 -0400 Subject: [PATCH 47/72] Minor UI tweak (pseudo-version in italics on apps page instead of readout) --- lib/pages/app.dart | 4 +--- lib/pages/apps.dart | 7 +++++-- lib/providers/source_provider.dart | 5 +++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/pages/app.dart b/lib/pages/app.dart index ff60517..1c856b8 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -100,9 +100,7 @@ class _AppPageState extends State { bool isVersionDetectionStandard = app?.app.additionalSettings['versionDetection'] == true; - bool installedVersionIsEstimate = trackOnly || - (app?.app.installedVersion != null && - app?.app.additionalSettings['versionDetection'] != true); + bool installedVersionIsEstimate = app?.app != null ? isVersionPseudo(app!.app) : false; if (app != null && !_wasWebViewOpened) { _wasWebViewOpened = true; diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 0725830..e4ee468 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -447,7 +447,7 @@ class AppsPageState extends State { } getVersionText(int appIndex) { - return '${listedApps[appIndex].app.installedVersion ?? tr('notInstalled')}${listedApps[appIndex].app.additionalSettings['trackOnly'] == true ? ' ${tr('pseudoVersion')}' : ''}'; + return listedApps[appIndex].app.installedVersion ?? tr('notInstalled'); } getChangesButtonString(int appIndex, bool hasChangeLogFn) { @@ -503,7 +503,10 @@ class AppsPageState extends State { MediaQuery.of(context).size.width / 4), child: Text(getVersionText(index), overflow: TextOverflow.ellipsis, - textAlign: TextAlign.end)), + textAlign: TextAlign.end, + style: isVersionPseudo(listedApps[index].app) + ? TextStyle(fontStyle: FontStyle.italic) + : null)), ]), Row( mainAxisSize: MainAxisSize.min, diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 0f08d78..1555074 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -940,6 +940,11 @@ List> filterApks( return apkUrls; } +isVersionPseudo(App app) => + app.additionalSettings['trackOnly'] == true || + (app.installedVersion != null && + app.additionalSettings['versionDetection'] != true); + class SourceProvider { // Add more source classes here so they are available via the service List get sources => [ From 63e71624f931eef45b65ead6ec1a1b85727904b5 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 30 May 2025 23:48:14 -0400 Subject: [PATCH 48/72] Better error message for file deletion failures (#2298) --- assets/translations/ar.json | 1 + assets/translations/bs.json | 1 + assets/translations/ca.json | 1 + assets/translations/cs.json | 1 + assets/translations/da.json | 1 + assets/translations/de.json | 1 + assets/translations/en-EO.json | 1 + assets/translations/en.json | 1 + assets/translations/es.json | 1 + assets/translations/fa.json | 1 + assets/translations/fr.json | 1 + assets/translations/hu.json | 1 + assets/translations/id.json | 1 + assets/translations/it.json | 1 + assets/translations/ja.json | 3 ++- assets/translations/ko.json | 1 + assets/translations/nl.json | 1 + assets/translations/pl.json | 1 + assets/translations/pt-BR.json | 1 + assets/translations/pt.json | 1 + assets/translations/ru.json | 1 + assets/translations/sv.json | 1 + assets/translations/tr.json | 1 + assets/translations/uk.json | 1 + assets/translations/vi.json | 1 + assets/translations/zh-Hant-TW.json | 1 + assets/translations/zh.json | 1 + lib/providers/apps_provider.dart | 20 ++++++++++++++------ 28 files changed, 42 insertions(+), 7 deletions(-) diff --git a/assets/translations/ar.json b/assets/translations/ar.json index b310e98..0b91225 100644 --- a/assets/translations/ar.json +++ b/assets/translations/ar.json @@ -329,6 +329,7 @@ "welcome": "مرحبًا", "documentationLinksNote": "تحتوي صفحة Obtainium على GitHub المرتبطة أدناه على روابط لمقاطع فيديو، مقالات، مناقشات وموارد أخرى ستساعدك على فهم كيفية استخدام التطبيق.", "batteryOptimizationNote": "لاحظ أن التنزيلات في الخلفية قد تعمل بشكل أكثر موثوقية إذا قمت بتعطيل تحسينات بطارية النظام لـ Obtainium.", + "fileDeletionError": "فشل حذف الملف (حاول حذفه يدويًا ثم حاول مرة أخرى): \"{}\"", "removeAppQuestion": { "one": "إزالة التطبيق؟", "other": "إزالة التطبيقات؟" diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 9ccd50c..cf9891e 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -329,6 +329,7 @@ "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", "removeAppQuestion": { "one": "Želite li ukloniti aplikaciju?", "other": "Želite li ukloniti aplikacije?" diff --git a/assets/translations/ca.json b/assets/translations/ca.json index 5b91004..14933d9 100644 --- a/assets/translations/ca.json +++ b/assets/translations/ca.json @@ -329,6 +329,7 @@ "welcome": "Benvinguda", "documentationLinksNote": "La pàgina GitHub d'Obtainium enllaçada a sota conté enllaços a vídeos, articles, debats i altres recursos que t'ajudaran a entendre com usar l'aplicació.", "batteryOptimizationNote": "Tingues present que les descàrregues en segon pla funcionaran millor si inhabilites l'optimització de bateria per a Obtainium.", + "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", "removeAppQuestion": { "one": "¿Suprimeixo l'aplicació?", "other": "¿Suprimeixo les aplicacions?" diff --git a/assets/translations/cs.json b/assets/translations/cs.json index ee1515c..8011feb 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -329,6 +329,7 @@ "welcome": "Vítejte na", "documentationLinksNote": "Níže odkazovaná stránka Obtainium GitHub obsahuje odkazy na videa, články, diskuse a další zdroje, které vám pomohou pochopit, jak aplikaci používat.", "batteryOptimizationNote": "Všimněte si, že stahování na pozadí může fungovat spolehlivěji, pokud vypnete optimalizaci baterie operačního systému pro Obtainium.", + "fileDeletionError": "Soubor se nepodařilo odstranit (zkuste jej odstranit ručně a pak to zkuste znovu): \"{}\"", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/da.json b/assets/translations/da.json index 34772bd..e9b40b6 100644 --- a/assets/translations/da.json +++ b/assets/translations/da.json @@ -329,6 +329,7 @@ "welcome": "Velkommen", "documentationLinksNote": "Obtainiums GitHub-side, som der linkes til nedenfor, indeholder links til videoer, artikler, diskussioner og andre ressourcer, som kan hjælpe dig med at forstå, hvordan du bruger appen.", "batteryOptimizationNote": "Bemærk, at baggrundsdownloads kan fungere mere pålideligt, hvis du deaktiverer OS-batterioptimering for Obtainium.", + "fileDeletionError": "Kunne ikke slette filen (prøv at slette den manuelt og prøv igen): \"{}\"", "removeAppQuestion": { "one": "Fjern app?", "other": "Fjern apps?" diff --git a/assets/translations/de.json b/assets/translations/de.json index 337329f..f95e98f 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -329,6 +329,7 @@ "welcome": "Willkommen", "documentationLinksNote": "Die unten verlinkte GitHub-Seite von Obtainium enthält Links zu Videos, Artikeln, Diskussionen und anderen Ressourcen, die Ihnen helfen werden, die Verwendung der App zu verstehen.", "batteryOptimizationNote": "Beachten Sie, dass Downloads im Hintergrund möglicherweise zuverlässiger funktionieren, wenn Sie die Batterieoptimierung des Betriebssystems für Obtainium deaktivieren.", + "fileDeletionError": "Die Datei konnte nicht gelöscht werden (versuchen Sie, sie manuell zu löschen und versuchen Sie es dann erneut): \"{}\"", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en-EO.json b/assets/translations/en-EO.json index a298994..2fe0dfa 100644 --- a/assets/translations/en-EO.json +++ b/assets/translations/en-EO.json @@ -329,6 +329,7 @@ "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", "removeAppQuestion": { "one": "Forigi la aplikaĵon?", "other": "Forigi la aplikaĵojn?" diff --git a/assets/translations/en.json b/assets/translations/en.json index 5473a27..7dde0a2 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -329,6 +329,7 @@ "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", "removeAppQuestion": { "one": "Remove app?", "other": "Remove apps?" diff --git a/assets/translations/es.json b/assets/translations/es.json index d9687b7..2e89168 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -329,6 +329,7 @@ "welcome": "Bienvenido", "documentationLinksNote": "La página GitHub de Obtainium enlazada a continuación contiene enlaces a vídeos, artículos, debates y otros recursos que te ayudarán a entender cómo utilizar la aplicación.", "batteryOptimizationNote": "Ten en cuenta que las descargas en segundo plano pueden funcionar de forma más fiable si desactivas las optimizaciones de batería del sistema operativo para Obtainium.", + "fileDeletionError": "No se ha podido eliminar el archivo (intente eliminarlo manualmente y vuelva a intentarlo): \"{}\"", "removeAppQuestion": { "one": "¿Eliminar aplicación?", "other": "¿Eliminar aplicaciones?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index b4a7c85..22d7cd3 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -329,6 +329,7 @@ "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index f1e681b..8dc1de8 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -329,6 +329,7 @@ "welcome": "Bienvenue", "documentationLinksNote": "La page GitHub d'Obtainium, dont le lien figure ci-dessous, contient des liens vers des vidéos, des articles, des discussions et d'autres ressources qui vous aideront à comprendre comment utiliser l'application.", "batteryOptimizationNote": "Notez que les téléchargements en arrière-plan peuvent fonctionner de manière plus fiable si vous désactivez les optimisations de la batterie du système d'exploitation pour Obtainium.", + "fileDeletionError": "Échec de la suppression du fichier (essayez de le supprimer manuellement puis réessayez) : \"{}\"", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index aff5aa7..4683a54 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -329,6 +329,7 @@ "welcome": "Üdvözöljük!", "documentationLinksNote": "Az alábbi hivatkozás az Obtainium GitHub oldalára vezet, amely további videók, cikkek, beszélgetések és egyéb források hivatkozásait tartalmazza, amelyek segítenek megérteni az alkalmazás használatát.", "batteryOptimizationNote": "Megjegyzés: A háttérfrissítések megbízhatóbban működhetnek, ha kikapcsolja a rendszer akkumulátor-optimalizálását az Obtainium számára.", + "fileDeletionError": "Nem sikerült törölni a fájlt (próbálja meg kézzel törölni, majd próbálja meg újra): \"{}\"", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazásokat?" diff --git a/assets/translations/id.json b/assets/translations/id.json index c4263fe..a4669de 100644 --- a/assets/translations/id.json +++ b/assets/translations/id.json @@ -329,6 +329,7 @@ "welcome": "Selamat datang.", "documentationLinksNote": "Halaman GitHub Obtainium yang ditautkan di bawah ini berisi tautan ke video, artikel, diskusi, dan sumber daya lain yang akan membantu Anda memahami cara menggunakan aplikasi.", "batteryOptimizationNote": "Perhatikan bahwa unduhan latar belakang dapat bekerja lebih andal jika Anda menonaktifkan optimasi baterai OS untuk Obtainium.", + "fileDeletionError": "Gagal menghapus file (coba hapus secara manual, lalu coba lagi): \"{}\"", "removeAppQuestion": { "one": "Hapus aplikasi?", "other": "Hapus aplikasi?" diff --git a/assets/translations/it.json b/assets/translations/it.json index 38f3d24..32b46dd 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -329,6 +329,7 @@ "welcome": "Benvenuti", "documentationLinksNote": "La pagina GitHub di Obtainium collegata qui sotto contiene collegamenti a video, articoli, discussioni e altre risorse che vi aiuteranno a capire come utilizzare l'applicazione.", "batteryOptimizationNote": "Si noti che i download in background potrebbero funzionare in modo più affidabile se si disabilita l'ottimizzazione della batteria del sistema operativo per Obtainium.", + "fileDeletionError": "Errore nell'eliminazione del file (provare a cancellarlo manualmente e poi riprovare): \"{}\"", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index b121104..d8cb150 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -321,7 +321,7 @@ "useFirstApkOfVersion": "複数のAPKから最初のAPKを自動選択する", "refreshBeforeDownload": "ダウンロード前にアプリの詳細を更新する", "tencentAppStore": "Tencent App Store", - "coolApk": "CoolApk", + "coolApk": "クールApk", "vivoAppStore": "vivo App Store (CN)", "name": "名称", "smartname": "名前(スマート)", @@ -329,6 +329,7 @@ "welcome": "ようこそ", "documentationLinksNote": "以下のリンクにあるObtainium GitHubページには、ビデオ、記事、ディスカッション、その他のリソースへのリンクがあり、アプリの使い方を理解するのに役立ちます。", "batteryOptimizationNote": "ObtainiumのOSバッテリー最適化を無効にすると、バックグラウンドダウンロードがより確実に動作するようになります。", + "fileDeletionError": "ファイルの削除に失敗しました(手動で削除してから再試行してください):\"{}\"", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/ko.json b/assets/translations/ko.json index 16d9b29..8d9567c 100644 --- a/assets/translations/ko.json +++ b/assets/translations/ko.json @@ -329,6 +329,7 @@ "welcome": "환영", "documentationLinksNote": "아래에 링크된 Obtainium 깃허브 페이지에는 앱 사용 방법을 이해하는 데 도움이 되는 동영상, 기사, 토론 및 기타 리소스에 대한 링크가 포함되어 있습니다.", "batteryOptimizationNote": "Obtainium의 OS 배터리 최적화를 비활성화하면 백그라운드 다운로드가 더 안정적으로 작동할 수 있습니다.", + "fileDeletionError": "파일을 삭제하지 못했습니다(수동으로 삭제한 후 다시 시도하세요): \"{}\"", "removeAppQuestion": { "one": "앱을 제거하시겠습니까?", "other": "앱을 제거하시겠습니까?" diff --git a/assets/translations/nl.json b/assets/translations/nl.json index 6d925b8..c932eff 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -329,6 +329,7 @@ "welcome": "Welkom", "documentationLinksNote": "De GitHub pagina van Obtainium waarnaar hieronder wordt gelinkt bevat links naar video's, artikelen, discussies en andere bronnen die je zullen helpen begrijpen hoe je de app kunt gebruiken.", "batteryOptimizationNote": "Merk op dat downloads op de achtergrond mogelijk betrouwbaarder werken als je de batterijoptimalisatie van het besturingssysteem voor Obtainium uitschakelt.", + "fileDeletionError": "Bestand is niet verwijderd (probeer het handmatig te verwijderen en probeer het opnieuw): \"{}\"", "removeAppQuestion": { "one": "App verwijderen?", "other": "Apps verwijderen?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 9bfd668..fdb04c3 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -329,6 +329,7 @@ "welcome": "Witamy", "documentationLinksNote": "Strona Obtainium GitHub, do której link znajduje się poniżej, zawiera linki do filmów, artykułów, dyskusji i innych zasobów, które pomogą ci zrozumieć, jak korzystać z aplikacji.", "batteryOptimizationNote": "Należy pamiętać, że pobieranie w tle może działać bardziej niezawodnie po wyłączeniu optymalizacji baterii systemu operacyjnego dla Obtainium.", + "fileDeletionError": "Nie udało się usunąć pliku (spróbuj usunąć go ręcznie, a następnie spróbuj ponownie): \"{}\"", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt-BR.json b/assets/translations/pt-BR.json index df9fb0d..7ea3ed0 100644 --- a/assets/translations/pt-BR.json +++ b/assets/translations/pt-BR.json @@ -329,6 +329,7 @@ "welcome": "Boas vindas", "documentationLinksNote": "A página do Obtainium no GitHub visível abaixo contém links de vídeos, artigos, discussões, e outros recursos que podem te ajudar ao usar o app.", "batteryOptimizationNote": "Observe que os downloads em segundo plano podem funcionar de forma mais confiável se você desativar as otimizações de bateria do sistema operacional para o Obtainium.", + "fileDeletionError": "Falha ao excluir o arquivo (tente excluí-lo manualmente e tente novamente): \"{}\"", "removeAppQuestion": { "one": "Remover app?", "other": "Remover apps?" diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 4172ca5..b9daf09 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -329,6 +329,7 @@ "welcome": "Bem-vindo", "documentationLinksNote": "A página do Obtainium no GitHub com a ligação abaixo contém ligações para vídeos, artigos, discussões e outros recursos que o ajudarão a compreender como utilizar a aplicação.", "batteryOptimizationNote": "Note que os downloads em segundo plano podem funcionar de forma mais fiável se desativar as optimizações da bateria do SO para o Obtainium.", + "fileDeletionError": "Falha ao eliminar o ficheiro (tente eliminá-lo manualmente e depois tente novamente): \"{}\"", "removeAppQuestion": { "one": "Remover aplicativo?", "other": "Remover aplicativos?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 60e5e44..881fe7c 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -329,6 +329,7 @@ "welcome": "Добро пожаловать", "documentationLinksNote": "На странице Obtainium GitHub, ссылка на которую приведена ниже, содержатся ссылки на видео, статьи, обсуждения и другие ресурсы, которые помогут вам понять, как пользоваться приложением.", "batteryOptimizationNote": "Обратите внимание, что фоновая загрузка может работать более надежно, если отключить оптимизацию батареи ОС для Obtainium.", + "fileDeletionError": "Не удалось удалить файл (попробуйте удалить его вручную, а затем повторите попытку): \"{}\"", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/assets/translations/sv.json b/assets/translations/sv.json index 646c385..08d43cb 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -329,6 +329,7 @@ "welcome": "Välkommen", "documentationLinksNote": "Obtainium GitHub-sidan som länkas nedan innehåller länkar till videor, artiklar, diskussioner och andra resurser som hjälper dig att förstå hur du använder appen.", "batteryOptimizationNote": "Observera att nedladdningar i bakgrunden kan fungera mer tillförlitligt om du inaktiverar OS-batterioptimeringar för Obtainium.", + "fileDeletionError": "Misslyckades med att radera filen (försök radera den manuellt och försök sedan igen): \"{}\"", "removeAppQuestion": { "one": "Ta Bort App?", "other": "Ta Bort Appar?" diff --git a/assets/translations/tr.json b/assets/translations/tr.json index 324e99b..fd9ae84 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -329,6 +329,7 @@ "welcome": "Hoş geldiniz", "documentationLinksNote": "Aşağıda bağlantısı verilen Obtainium GitHub sayfası, uygulamayı nasıl kullanacağınızı anlamanıza yardımcı olacak videolara, makalelere, tartışmalara ve diğer kaynaklara bağlantılar içerir.", "batteryOptimizationNote": "Obtainium için işletim sistemi pil optimizasyonlarını devre dışı bırakırsanız arka planda indirmelerin daha güvenilir şekilde çalışabileceğini unutmayın.", + "fileDeletionError": "Dosya silinemedi (elle silmeyi deneyin ve sonra tekrar deneyin): \"{}\"", "removeAppQuestion": { "one": "Uygulamayı Kaldır?", "other": "Uygulamaları Kaldır?" diff --git a/assets/translations/uk.json b/assets/translations/uk.json index 7a0b3ed..942dcc4 100644 --- a/assets/translations/uk.json +++ b/assets/translations/uk.json @@ -329,6 +329,7 @@ "welcome": "Ласкаво просимо.", "documentationLinksNote": "Сторінка Obtainium на GitHub, посилання на яку наведено нижче, містить посилання на відео, статті, дискусії та інші ресурси, які допоможуть вам зрозуміти, як користуватися додатком.", "batteryOptimizationNote": "Зауважте, що фонові завантаження можуть працювати надійніше, якщо ви вимкнете оптимізацію батареї ОС для Obtainium.", + "fileDeletionError": "Не вдалося видалити файл (спробуйте видалити його вручну, а потім спробуйте ще раз): \"{}\"", "removeAppQuestion": { "one": "Видалити застосунок?", "other": "Видалити застосунки?" diff --git a/assets/translations/vi.json b/assets/translations/vi.json index 7beaf56..412c5c1 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -329,6 +329,7 @@ "welcome": "Welcome", "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", "removeAppQuestion": { "one": "Gỡ ứng dụng?", "other": "Gỡ ứng dụng?" diff --git a/assets/translations/zh-Hant-TW.json b/assets/translations/zh-Hant-TW.json index 832855e..8088303 100644 --- a/assets/translations/zh-Hant-TW.json +++ b/assets/translations/zh-Hant-TW.json @@ -329,6 +329,7 @@ "welcome": "歡迎", "documentationLinksNote": "下方連結的 Obtainium GitHub 頁面包含影片、文章、討論及其他資源,能幫助你瞭解如何使用這款應用程式。", "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", + "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", "removeAppQuestion": { "one": "移除應用程式?", "other": "移除應用程式?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index f8789a9..015f2ca 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -329,6 +329,7 @@ "welcome": "欢迎光临", "documentationLinksNote": "下面链接的 Obtainium GitHub 页面包含视频、文章、讨论和其他资源的链接,可帮助您了解如何使用该应用程序。", "batteryOptimizationNote": "请注意,如果为 Obtainium 禁用操作系统电池优化功能,后台下载可能会更稳定。", + "fileDeletionError": "删除文件失败(尝试手动删除,然后再试一次):\"{}\"", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 172b6ff..be14f75 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -234,6 +234,14 @@ Future checkETagHeader(String url, .toString(); } +deleteFile(File file) { + try { + file.deleteSync(recursive: true); + } on PathAccessException catch (e) { + throw ObtainiumError(tr('fileDeletionError', args: [e.path ?? tr('unknown')])); + } +} + Future downloadFile(String url, String fileName, bool fileNameHasExt, Function? onProgress, String destDir, {bool useExisting = true, @@ -348,7 +356,7 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, reqHeaders.addAll({'range': 'bytes=$rangeStart-${fullContentLength - 1}'}); sink = tempDownloadedFile.openWrite(mode: FileMode.writeOnlyAppend); } else if (tempDownloadedFile.existsSync()) { - tempDownloadedFile.deleteSync(recursive: true); + deleteFile(tempDownloadedFile); } var responseWithClient = await sourceRequestStreamResponse('GET', url, reqHeaders, {}); @@ -404,7 +412,7 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, onProgress(progress); } if (response.statusCode < 200 || response.statusCode > 299) { - tempDownloadedFile.deleteSync(recursive: true); + deleteFile(tempDownloadedFile); throw response.reasonPhrase; } if (tempDownloadedFile.existsSync()) { @@ -797,9 +805,9 @@ class AppsProvider with ChangeNotifier { await pm.getPackageArchiveInfo(archiveFilePath: file.file.path); if (newInfo == null) { try { - file.file.deleteSync(recursive: true); + deleteFile(file.file); for (var a in additionalAPKs) { - a.file.deleteSync(recursive: true); + deleteFile(a.file); } } catch (e) { // @@ -839,7 +847,7 @@ class AppsProvider with ChangeNotifier { bool installed = false; if (code != null && code != 0 && code != 3) { try { - file.file.deleteSync(recursive: true); + deleteFile(file.file); } catch (e) { // } finally { @@ -1511,7 +1519,7 @@ class AppsProvider with ChangeNotifier { await Future.wait(appIds.map((appId) async { File file = File('${(await getAppsDir()).path}/$appId.json'); if (file.existsSync()) { - file.deleteSync(recursive: true); + deleteFile(file); } apkFiles .where( From 43efc044d700c5328bab106d2b39a1acb06f0d0b Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 31 May 2025 00:09:56 -0400 Subject: [PATCH 49/72] Upgrade packages, increment version, improve build.sh --- .flutter | 2 +- build.sh | 24 ++++++++++++++++++++++-- pubspec.lock | 36 ++++++++++++++++++------------------ pubspec.yaml | 4 ++-- 4 files changed, 43 insertions(+), 23 deletions(-) diff --git a/.flutter b/.flutter index ea121f8..b25305a 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit ea121f8859e4b13e47a8f845e4586164519588bc +Subproject commit b25305a8832cfc6ba632a7f87ad455e319dccce8 diff --git a/build.sh b/build.sh index 4bf3c48..4257d2a 100755 --- a/build.sh +++ b/build.sh @@ -2,15 +2,35 @@ # Convenience script CURR_DIR="$(pwd)" -trap "cd "$CURR_DIR"" EXIT +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" +trap "cd \"$CURR_DIR\"" EXIT +cd "$SCRIPT_DIR" if [ -z "$1" ]; then git fetch && git merge origin/main && git push # Typically run after a PR to main, so bring dev up to date fi + +# Update local Flutter +git submodule update --remote cd .flutter git fetch -git checkout "$(flutter --version | head -2 | tail -1 | awk '{print $4}')" # Ensure included Flutter submodule version equals my environment +git checkout stable +git pull +FLUTTER_GIT_URL="https://github.com/flutter/flutter/" ./bin/flutter upgrade cd .. + +# Keep global Flutter, if any, in sync +if [ -f ~/flutter/bin/flutter ]; then + cd ~/flutter + ./bin/flutter channel stable + ./bin/flutter upgrade + cd "$SCRIPT_DIR" +fi + +if [ -z "$(which flutter)" ]; then + export PATH="$PATH:$SCRIPT_DIR/.flutter/bin" +fi + rm ./build/app/outputs/flutter-apk/* 2>/dev/null # Get rid of older builds if any flutter build apk --flavor normal && flutter build apk --split-per-abi --flavor normal # Build (both split and combined APKs) for file in ./build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done diff --git a/pubspec.lock b/pubspec.lock index 56380bf..32a9665 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -96,10 +96,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" background_fetch: dependency: "direct main" description: @@ -288,10 +288,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -461,10 +461,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.0" flutter_local_notifications: dependency: "direct main" description: @@ -596,10 +596,10 @@ packages: dependency: transitive description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" json_annotation: dependency: transitive description: @@ -612,10 +612,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: @@ -636,10 +636,10 @@ packages: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.0.0" markdown: dependency: "direct main" description: @@ -949,7 +949,7 @@ packages: description: path: "." ref: master - resolved-ref: "8784c39b909324df8913dd30fa416b8a50d55f49" + resolved-ref: "89cdb5434a7ac7510f6bcdb60e1d51a27ee2f40b" url: "https://github.com/AlexBacich/shared-storage" source: git version: "0.7.0" @@ -1179,10 +1179,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.0" web: dependency: transitive description: @@ -1195,10 +1195,10 @@ packages: dependency: "direct main" description: name: webview_flutter - sha256: "62d763c27ce7f6cef04b3bec01c85a28d60149bffd155884aa4b8fd4941ea2e4" + sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba url: "https://pub.dev" source: hosted - version: "4.12.0" + version: "4.13.0" webview_flutter_android: dependency: transitive description: @@ -1264,5 +1264,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.7.2 <4.0.0" + dart: ">=3.8.0 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 988c837..ce25144 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.55+2312 +version: 1.1.56+2313 environment: sdk: ^3.6.0 @@ -98,7 +98,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^5.0.0 + flutter_lints: ^6.0.0 flutter_launcher_icons: android: "ic_launcher" From 8bec3cf053088b515be7270136c85c17fb0bf120 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 31 May 2025 03:35:29 -0400 Subject: [PATCH 50/72] Update Android-side Gradle stuff + dependencies + upgrade all Flutter packages to latest --- android/app/build.gradle | 105 ----------------- android/app/build.gradle.kts | 107 ++++++++++++++++++ .../dev/imranr/obtainium/MainActivity.kt | 2 +- android/build.gradle | 22 ---- android/build.gradle.kts | 25 ++++ android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 25 ---- android/settings.gradle.kts | 25 ++++ pubspec.lock | 70 +----------- pubspec.yaml | 59 +++++----- 11 files changed, 190 insertions(+), 254 deletions(-) delete mode 100644 android/app/build.gradle create mode 100644 android/app/build.gradle.kts delete mode 100644 android/build.gradle create mode 100644 android/build.gradle.kts delete mode 100644 android/settings.gradle create mode 100644 android/settings.gradle.kts diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index d6c5d7b..0000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,105 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} - -android { - namespace = "dev.imranr.obtainium" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "dev.imranr.obtainium" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 24 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - flavorDimensions "flavor" - - productFlavors { - normal { - dimension "flavor" - applicationIdSuffix "" - } - fdroid { - dimension "flavor" - applicationIdSuffix ".fdroid" - } - } - - signingConfigs { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword keystoreProperties['storePassword'] - } - } - - buildTypes { - release { - signingConfig signingConfigs.release - } - debug { - applicationIdSuffix = ".debug" - versionNameSuffix = "-debug" - } - } -} - -flutter { - source = "../.." -} - -ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3] -import com.android.build.OutputFile -android.applicationVariants.all { variant -> - variant.outputs.each { output -> - def abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI)) - if (abiVersionCode != null) { - output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode - } else { - output.versionCodeOverride = variant.versionCode * 10 - } - } -} \ No newline at end of file diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..b144dc3 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,107 @@ +import java.io.FileInputStream +import java.util.Properties +import com.android.build.api.variant.FilterConfiguration.FilterType.* + +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +val localProperties = Properties() +val localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.reader(Charsets.UTF_8).use { reader -> + localProperties.load(reader) + } +} + +var flutterVersionCode = localProperties.getProperty("flutter.versionCode") ?: "1" +var flutterVersionName = localProperties.getProperty("flutter.versionName") ?: "1.0" + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + +android { + namespace = "dev.imranr.obtainium" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + isCoreLibraryDesugaringEnabled = true + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + applicationId = "dev.imranr.obtainium" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 24 + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInt() + versionName = flutterVersionName + } + + flavorDimensions("flavor") + + productFlavors { + create("normal") { + dimension = "flavor" + applicationIdSuffix = "" + } + create("fdroid") { + dimension = "flavor" + applicationIdSuffix = ".fdroid" + } + } + + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"].toString() + keyPassword = keystoreProperties["keyPassword"].toString() + storeFile = keystoreProperties["storeFile"]?.let { file(it) } + storePassword = keystoreProperties["storePassword"].toString() + } + } + + buildTypes { + getByName("release") { + signingConfig = signingConfigs.getByName("release") + } + getByName("debug") { + applicationIdSuffix = ".debug" + versionNameSuffix = "-debug" + } + } +} + +val abiCodes = mapOf("x86_64" to 1, "armeabi-v7a" to 2, "arm64-v8a" to 3) + +androidComponents { + onVariants { variant -> + variant.outputs.forEach { output -> + val name = output.filters.find { it.filterType == ABI }?.identifier + val baseAbiCode = abiCodes[name] + if (baseAbiCode != null) { + output.versionCode.set(baseAbiCode + ((output.versionCode.get() ?: 0) * 10)) + } + } + } +} + +dependencies { + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") +} + +flutter { + source = "../.." +} diff --git a/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt b/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt index 09cd313..71920ac 100644 --- a/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt +++ b/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt @@ -2,4 +2,4 @@ package dev.imranr.obtainium import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index b3f11e5..0000000 --- a/android/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - maven { - // [required] background_fetch - url "${project(':background_fetch').projectDir}/libs" - } - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..72266b6 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,25 @@ +allprojects { + repositories { + google() + mavenCentral() + maven { + // [required] background_fetch + url = uri("${project(":background_fetch").projectDir}/libs") + } + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle.properties b/android/gradle.properties index 2597170..f018a61 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6..ac3b479 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index 4aa0f8d..0000000 --- a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "2.1.21" apply false -} - -include ":app" diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..ab39a10 --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.3" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/pubspec.lock b/pubspec.lock index 32a9665..2980b59 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -76,14 +76,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" - archive: - dependency: transitive - description: - name: archive - sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.dev" - source: hosted - version: "4.0.7" args: dependency: transitive description: @@ -148,22 +140,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.dev" - source: hosted - version: "0.4.2" clock: dependency: transitive description: @@ -449,16 +425,8 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c - url: "https://pub.dev" - source: hosted - version: "0.14.3" flutter_lints: - dependency: "direct dev" + dependency: "direct main" description: name: flutter_lints sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" @@ -511,7 +479,7 @@ packages: source: hosted version: "2.0.28" flutter_test: - dependency: "direct dev" + dependency: transitive description: flutter source: sdk version: "0.0.0" @@ -584,14 +552,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" - image: - dependency: transitive - description: - name: image - sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.dev" - source: hosted - version: "4.5.4" intl: dependency: transitive description: @@ -600,14 +560,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.2" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" - source: hosted - version: "4.9.0" leak_tracker: dependency: transitive description: @@ -856,14 +808,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.10.2+1" - posix: - dependency: transitive - description: - name: posix - sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 - url: "https://pub.dev" - source: hosted - version: "6.0.2" provider: dependency: "direct main" description: @@ -1255,14 +1199,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.3.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" sdks: - dart: ">=3.8.0 <4.0.0" + dart: ">=3.8.1 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index ce25144..ed9261e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.1.56+2313 environment: - sdk: ^3.6.0 + sdk: ^3.8.1 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -33,22 +33,22 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.5 - path_provider: ^2.0.11 + cupertino_icons: ^1.0.8 + path_provider: ^2.1.5 flutter_fgbg: ^0.7.1 - flutter_local_notifications: ^18.0.0 - provider: ^6.0.3 - http: ^1.0.0 - webview_flutter: ^4.0.0 - dynamic_color: ^1.5.4 - html: ^0.15.0 - shared_preferences: ^2.0.15 - url_launcher: ^6.1.5 + flutter_local_notifications: ^18.0.1 + provider: ^6.1.5 + http: ^1.4.0 + webview_flutter: ^4.13.0 + dynamic_color: ^1.7.0 + html: ^0.15.6 + shared_preferences: ^2.5.3 + url_launcher: ^6.3.1 permission_handler: ^12.0.0+1 - fluttertoast: ^8.0.9 - device_info_plus: ^11.0.0 - file_picker: ^10.0.0 - animations: ^2.0.4 + fluttertoast: ^8.2.12 + device_info_plus: ^11.4.0 + file_picker: ^10.1.9 + animations: ^2.0.11 android_package_installer: # TODO: See if PR will be accepted (dev may not be active), else remove this comment git: url: https://github.com/ImranR98/android_package_installer @@ -58,23 +58,23 @@ dependencies: url: https://github.com/ImranR98/android_package_manager ref: master share_plus: ^11.0.0 - sqflite: ^2.2.0+3 - easy_localization: ^3.0.1 - android_intent_plus: ^5.0.1 - flutter_markdown: ^0.7.1 - flutter_archive: ^6.0.0 + sqflite: ^2.4.2 + easy_localization: ^3.0.7+1 + android_intent_plus: ^5.3.0 + flutter_markdown: ^0.7.7+1 + flutter_archive: ^6.0.3 hsluv: ^1.1.3 - connectivity_plus: ^6.0.1 + connectivity_plus: ^6.1.4 shared_storage: # TODO: Is this maintained? git: url: https://github.com/AlexBacich/shared-storage ref: master - crypto: ^3.0.3 + crypto: ^3.0.6 bcrypt: ^1.1.3 - app_links: ^6.0.1 - background_fetch: ^1.2.1 + app_links: ^6.4.0 + background_fetch: ^1.3.8 equations: ^5.0.2 - flex_color_picker: ^3.4.1 + flex_color_picker: ^3.7.1 android_system_font: git: url: https://github.com/re7gog/android_system_font @@ -83,15 +83,10 @@ dependencies: git: url: https://github.com/wilver06w/shizuku_apk_installer ref: master - - markdown: any + markdown: ^7.3.0 flutter_typeahead: ^5.2.0 - battery_plus: ^6.1.0 + battery_plus: ^6.2.1 flutter_charset_detector: ^5.0.0 -dev_dependencies: - flutter_test: - sdk: flutter - flutter_launcher_icons: ^0.14.1 # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is From 0a30bf6d8e999f502f70f47367cf839831599e64 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 31 May 2025 03:57:16 -0400 Subject: [PATCH 51/72] Update to Java 21 + hardcode NDK to avoid warnings --- .github/workflows/release.yml | 2 +- android/app/build.gradle.kts | 2 +- docker/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 22362c2..a4386c1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/setup-java@v4 with: distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '17' + java-version: '21' - name: Flutter Doctor id: flutter_doctor diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index b144dc3..985d2ad 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -29,7 +29,7 @@ if (keystorePropertiesFile.exists()) { android { namespace = "dev.imranr.obtainium" compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion + ndkVersion = "27.0.12077973" // 'flutter.ndkVersion' produces warnings (TODO can/should we switch back?) compileOptions { isCoreLibraryDesugaringEnabled = true diff --git a/docker/Dockerfile b/docker/Dockerfile index f3ea808..b92aa42 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -51,7 +51,7 @@ RUN \ mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \ rm -v /tmp/tools.zip && \ mkdir -p /root/.android/ && touch /root/.android/repositories.cfg &&\ - apt-get install -y --no-install-recommends openjdk-17-jdk openjdk-17-jre &&\ + apt-get install -y --no-install-recommends openjdk-21-jdk openjdk-21-jre &&\ yes | sdkmanager --licenses &&\ sdkmanager --update From f6587ae8da33b551c3448e7f036c82fa250042f3 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 31 May 2025 04:02:55 -0400 Subject: [PATCH 52/72] Fix GH workflow --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a4386c1..d767af9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,7 +44,7 @@ jobs: - name: Build APKs run: | - sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle + sed -i 's/signingConfig = signingConfigs.getByName("release")//g' android/app/build.gradle.kts flutter build apk --flavor normal && flutter build apk --split-per-abi --flavor normal for file in build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done flutter build apk --flavor fdroid -t lib/main_fdroid.dart && flutter build apk --split-per-abi --flavor fdroid -t lib/main_fdroid.dart From 092f81cb00c77edf5527fd0cae981a677aff66a1 Mon Sep 17 00:00:00 2001 From: Cambrells Date: Sat, 31 May 2025 11:51:49 +0200 Subject: [PATCH 53/72] Update Catalan Translation --- assets/translations/ca.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/ca.json b/assets/translations/ca.json index 14933d9..93d3d0d 100644 --- a/assets/translations/ca.json +++ b/assets/translations/ca.json @@ -329,7 +329,7 @@ "welcome": "Benvinguda", "documentationLinksNote": "La pàgina GitHub d'Obtainium enllaçada a sota conté enllaços a vídeos, articles, debats i altres recursos que t'ajudaran a entendre com usar l'aplicació.", "batteryOptimizationNote": "Tingues present que les descàrregues en segon pla funcionaran millor si inhabilites l'optimització de bateria per a Obtainium.", - "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", + "fileDeletionError": "No s'ha pogut suprimir el fitxer (intenta suprimir-lo manualment i torna-ho a provar): \"{}\"", "removeAppQuestion": { "one": "¿Suprimeixo l'aplicació?", "other": "¿Suprimeixo les aplicacions?" From 81c9f4ad472fb97ccaa633af40b98085738acd01 Mon Sep 17 00:00:00 2001 From: Giannis Lagodimos <62063308+lagodimos@users.noreply.github.com> Date: Sat, 31 May 2025 14:35:31 +0300 Subject: [PATCH 54/72] Format json file also when exporting selected apps --- lib/pages/apps.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index e4ee468..4ef8cf9 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -911,7 +911,8 @@ class AppsPageState extends State { onPressed: selectedAppIds.isEmpty ? null : () { - var exportJSON = jsonEncode( + var encoder = const JsonEncoder.withIndent(" "); + var exportJSON = encoder.convert( appsProvider.generateExportJSON( appIds: selectedApps .map((e) => e.id) From 5f971dcddb6904282db968169539cb1d29745e58 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 13 Jun 2025 16:49:59 -0400 Subject: [PATCH 55/72] HTML bugfix: Incorrect URL resolution on redirected pages (#2315) --- lib/app_sources/html.dart | 7 +++++++ lib/providers/apps_provider.dart | 4 ++-- lib/providers/source_provider.dart | 12 ++++++------ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index b00f73e..9037f6d 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -9,6 +9,13 @@ import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) { + try { + if (Uri.parse(ambiguousUrl).isAbsolute) { + return ambiguousUrl; // #2315 + } + } catch (e) { + // + } return referenceAbsoluteUrl.resolve(ambiguousUrl).toString(); } diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index be14f75..ad506f0 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -360,8 +360,8 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, } var responseWithClient = await sourceRequestStreamResponse('GET', url, reqHeaders, {}); - HttpClient responseClient = responseWithClient.key; - HttpClientResponse response = responseWithClient.value; + HttpClient responseClient = responseWithClient.value.key; + HttpClientResponse response = responseWithClient.value.value; sink ??= tempDownloadedFile.openWrite(mode: FileMode.writeOnly); // Perform the download diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 1555074..72d88cd 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -511,7 +511,7 @@ HttpClient createHttpClient(bool insecure) { return client; } -Future> sourceRequestStreamResponse( +Future>> sourceRequestStreamResponse( String method, String url, Map? requestHeaders, @@ -551,7 +551,7 @@ Future> sourceRequestStreamResponse( } } - return MapEntry(httpClient, response); + return MapEntry(currentUrl, MapEntry(httpClient, response)); } throw ObtainiumError('Too many redirects ($maxRedirects)'); } @@ -637,14 +637,14 @@ abstract class AppSource { {bool followRedirects = true, Object? postBody}) async { var method = postBody == null ? 'GET' : 'POST'; var requestHeaders = await getRequestHeaders(additionalSettings); - var streamedResponseAndClient = await sourceRequestStreamResponse( + var streamedResponseUrlWithResponseAndClient = await sourceRequestStreamResponse( method, url, requestHeaders, additionalSettings, followRedirects: followRedirects, postBody: postBody); return await httpClientResponseStreamToFinalResponse( - streamedResponseAndClient.key, + streamedResponseUrlWithResponseAndClient.value.key, method, - url, - streamedResponseAndClient.value); + streamedResponseUrlWithResponseAndClient.key.toString(), + streamedResponseUrlWithResponseAndClient.value.value); } void runOnAddAppInputChange(String inputUrl) { From e0c69b9cf42527dcc2dc8b437bb523f8049fbf86 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 13 Jun 2025 16:53:36 -0400 Subject: [PATCH 56/72] Lint all files --- lib/app_sources/apkcombo.dart | 42 +- lib/app_sources/apkmirror.dart | 72 +- lib/app_sources/apkpure.dart | 87 +- lib/app_sources/aptoide.dart | 30 +- lib/app_sources/codeberg.dart | 25 +- lib/app_sources/coolapk.dart | 71 +- lib/app_sources/directAPKLink.dart | 43 +- lib/app_sources/fdroid.dart | 144 +- lib/app_sources/fdroidrepo.dart | 110 +- lib/app_sources/github.dart | 488 ++++--- lib/app_sources/gitlab.dart | 141 +- lib/app_sources/html.dart | 268 ++-- lib/app_sources/huaweiappgallery.dart | 42 +- lib/app_sources/izzyondroid.dart | 32 +- lib/app_sources/jenkins.dart | 28 +- lib/app_sources/mullvad.dart | 24 +- lib/app_sources/neutroncode.dart | 32 +- lib/app_sources/rustore.dart | 48 +- lib/app_sources/sourceforge.dart | 35 +- lib/app_sources/sourcehut.dart | 65 +- lib/app_sources/telegramapp.dart | 18 +- lib/app_sources/tencent.dart | 43 +- lib/app_sources/uptodown.dart | 53 +- lib/app_sources/vivoappstore.dart | 29 +- lib/components/custom_app_bar.dart | 5 +- lib/components/generated_form.dart | 821 ++++++----- lib/components/generated_form_modal.dart | 62 +- lib/custom_errors.dart | 103 +- lib/main.dart | 222 +-- lib/main_fdroid.dart | 2 +- lib/mass_app_sources/githubstars.dart | 25 +- lib/pages/add_app.dart | 916 ++++++------ lib/pages/app.dart | 821 ++++++----- lib/pages/apps.dart | 1389 ++++++++++-------- lib/pages/home.dart | 320 ++-- lib/pages/import_export.dart | 1289 +++++++++-------- lib/pages/settings.dart | 1611 +++++++++++---------- lib/providers/apps_provider.dart | 1461 +++++++++++-------- lib/providers/logs_provider.dart | 49 +- lib/providers/notifications_provider.dart | 316 ++-- lib/providers/settings_provider.dart | 19 +- lib/providers/source_provider.dart | 797 +++++----- 42 files changed, 6864 insertions(+), 5334 deletions(-) diff --git a/lib/app_sources/apkcombo.dart b/lib/app_sources/apkcombo.dart index b63afa6..71fc596 100644 --- a/lib/app_sources/apkcombo.dart +++ b/lib/app_sources/apkcombo.dart @@ -12,8 +12,9 @@ class APKCombo extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+', + caseSensitive: false, + ); var match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -22,25 +23,30 @@ class APKCombo extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return Uri.parse(standardUrl).pathSegments.last; } @override Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { + Map additionalSettings, { + bool forAPKDownload = false, + }) async { return { "User-Agent": "curl/8.0.1", "Accept": "*/*", "Connection": "keep-alive", - "Host": hosts[0] + "Host": hosts[0], }; } Future>> getApkUrls( - String standardUrl, Map additionalSettings) async { + String standardUrl, + Map additionalSettings, + ) async { var res = await sourceRequest('$standardUrl/download/apk', {}); if (res.statusCode != 200) { throw getObtainiumHttpError(res); @@ -65,7 +71,9 @@ class APKCombo extends AppSource { String verCode = e.querySelector('.info .header .vercode')?.text.trim() ?? ''; return MapEntry( - arch != null ? '$arch-$verCode.apk' : '', url ?? ''); + arch != null ? '$arch-$verCode.apk' : '', + url ?? '', + ); }).toList(); }) .reduce((value, element) => [...value, ...element]) @@ -74,8 +82,11 @@ class APKCombo extends AppSource { } @override - Future apkUrlPrefetchModifier(String apkUrl, String standardUrl, - Map additionalSettings) async { + Future apkUrlPrefetchModifier( + String apkUrl, + String standardUrl, + Map additionalSettings, + ) async { var freshURLs = await getApkUrls(standardUrl, additionalSettings); var path2Match = Uri.parse(apkUrl).path; for (var url in freshURLs) { @@ -116,9 +127,10 @@ class APKCombo extends AppSource { } } return APKDetails( - version, - await getApkUrls(standardUrl, additionalSettings), - AppNames(author, appName), - releaseDate: releaseDate); + version, + await getApkUrls(standardUrl, additionalSettings), + AppNames(author, appName), + releaseDate: releaseDate, + ); } } diff --git a/lib/app_sources/apkmirror.dart b/lib/app_sources/apkmirror.dart index ad398e8..11c4fa3 100644 --- a/lib/app_sources/apkmirror.dart +++ b/lib/app_sources/apkmirror.dart @@ -17,37 +17,44 @@ class APKMirror extends AppSource { additionalSourceAppSpecificSettingFormItems = [ [ - GeneratedFormSwitch('fallbackToOlderReleases', - label: tr('fallbackToOlderReleases'), defaultValue: true) + GeneratedFormSwitch( + 'fallbackToOlderReleases', + label: tr('fallbackToOlderReleases'), + defaultValue: true, + ), ], [ - GeneratedFormTextField('filterReleaseTitlesByRegEx', - label: tr('filterReleaseTitlesByRegEx'), - required: false, - additionalValidators: [ - (value) { - return regExValidator(value); - } - ]) - ] + GeneratedFormTextField( + 'filterReleaseTitlesByRegEx', + label: tr('filterReleaseTitlesByRegEx'), + required: false, + additionalValidators: [ + (value) { + return regExValidator(value); + }, + ], + ), + ], ]; } @override Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { + Map additionalSettings, { + bool forAPKDownload = false, + }) async { return { "User-Agent": - "Obtainium/${(await getInstalledInfo(obtainiumId))?.versionName ?? '1.0.0'}" + "Obtainium/${(await getInstalledInfo(obtainiumId))?.versionName ?? '1.0.0'}", }; } @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/apk/[^/]+/[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/apk/[^/]+/[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -68,12 +75,14 @@ class APKMirror extends AppSource { additionalSettings['fallbackToOlderReleases'] == true; String? regexFilter = (additionalSettings['filterReleaseTitlesByRegEx'] as String?) - ?.isNotEmpty == - true - ? additionalSettings['filterReleaseTitlesByRegEx'] - : null; - Response res = - await sourceRequest('$standardUrl/feed/', additionalSettings); + ?.isNotEmpty == + true + ? additionalSettings['filterReleaseTitlesByRegEx'] + : null; + Response res = await sourceRequest( + '$standardUrl/feed/', + additionalSettings, + ); if (res.statusCode == 200) { var items = parse(res.body).querySelectorAll('item'); dynamic targetRelease; @@ -95,11 +104,14 @@ class APKMirror extends AppSource { .split(' ') .sublist(0, 5) .join(' '); - DateTime? releaseDate = - dateString != null ? HttpDate.parse('$dateString GMT') : null; + DateTime? releaseDate = dateString != null + ? HttpDate.parse('$dateString GMT') + : null; String? version = titleString - ?.substring(RegExp('[0-9]').firstMatch(titleString)?.start ?? 0, - RegExp(' by ').allMatches(titleString).last.start) + ?.substring( + RegExp('[0-9]').firstMatch(titleString)?.start ?? 0, + RegExp(' by ').allMatches(titleString).last.start, + ) .trim(); if (version == null || version.isEmpty) { version = titleString; @@ -107,8 +119,12 @@ class APKMirror extends AppSource { if (version == null || version.isEmpty) { throw NoVersionError(); } - return APKDetails(version, [], getAppNames(standardUrl), - releaseDate: releaseDate); + return APKDetails( + version, + [], + getAppNames(standardUrl), + releaseDate: releaseDate, + ); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index e2c5a9c..888ab51 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -23,33 +23,44 @@ class APKPure extends AppSource { showReleaseDateAsVersionToggle = true; additionalSourceAppSpecificSettingFormItems = [ [ - GeneratedFormSwitch('fallbackToOlderReleases', - label: tr('fallbackToOlderReleases'), defaultValue: true) + GeneratedFormSwitch( + 'fallbackToOlderReleases', + label: tr('fallbackToOlderReleases'), + defaultValue: true, + ), ], [ - GeneratedFormSwitch('stayOneVersionBehind', - label: tr('stayOneVersionBehind'), defaultValue: false) + GeneratedFormSwitch( + 'stayOneVersionBehind', + label: tr('stayOneVersionBehind'), + defaultValue: false, + ), ], [ - GeneratedFormSwitch('useFirstApkOfVersion', - label: tr('useFirstApkOfVersion'), defaultValue: true) - ] + GeneratedFormSwitch( + 'useFirstApkOfVersion', + label: tr('useFirstApkOfVersion'), + defaultValue: true, + ), + ], ]; } @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegExB = RegExp( - '^https?://m.${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+', - caseSensitive: false); + '^https?://m.${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegExB.firstMatch(url); if (match != null) { var uri = Uri.parse(url); url = 'https://${uri.host.substring(2)}${uri.path}'; } RegExp standardUrlRegExA = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+', + caseSensitive: false, + ); match = standardUrlRegExA.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -58,15 +69,18 @@ class APKPure extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return Uri.parse(standardUrl).pathSegments.last; } getDetailsForVersion( - List> versionVariants, - List supportedArchs, - Map additionalSettings) async { + List> versionVariants, + List supportedArchs, + Map additionalSettings, + ) async { var apkUrls = versionVariants .map((e) { String appId = e['package_name']; @@ -88,8 +102,9 @@ class APKPure extends AppSource { String downloadUri = e['asset']['url']; return MapEntry( - '$appId-$versionCode-$architectureString.${type.toLowerCase()}', - downloadUri); + '$appId-$versionCode-$architectureString.${type.toLowerCase()}', + downloadUri, + ); }) .nonNulls .toList() @@ -114,14 +129,20 @@ class APKPure extends AppSource { apkUrls = [apkUrls.first]; } - return APKDetails(version, apkUrls, AppNames(author, appName), - releaseDate: releaseDate, changeLog: changeLog); + return APKDetails( + version, + apkUrls, + AppNames(author, appName), + releaseDate: releaseDate, + changeLog: changeLog, + ); } @override Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { + Map additionalSettings, { + bool forAPKDownload = false, + }) async { if (forAPKDownload) { return null; } else { @@ -145,19 +166,22 @@ class APKPure extends AppSource { // request versions from API var res = await sourceRequest( - "https://tapi.pureapk.com/v3/get_app_his_version?package_name=$appId&hl=en", - additionalSettings); + "https://tapi.pureapk.com/v3/get_app_his_version?package_name=$appId&hl=en", + additionalSettings, + ); if (res.statusCode != 200) { throw getObtainiumHttpError(res); } - List> apks = - jsonDecode(res.body)['version_list'].cast>(); + List> apks = jsonDecode( + res.body, + )['version_list'].cast>(); // group by version List>> versions = apks - .fold>>>({}, - (Map>> val, - Map element) { + .fold>>>({}, ( + Map>> val, + Map element, + ) { String v = element['version_name']; if (!val.containsKey(v)) { val[v] = []; @@ -179,7 +203,10 @@ class APKPure extends AppSource { throw NoReleasesError(); } return await getDetailsForVersion( - v, supportedArchs, additionalSettings); + v, + supportedArchs, + additionalSettings, + ); } catch (e) { if (additionalSettings['fallbackToOlderReleases'] != true || i == versions.length - 1) { diff --git a/lib/app_sources/aptoide.dart b/lib/app_sources/aptoide.dart index b545d8a..7a1ee5b 100644 --- a/lib/app_sources/aptoide.dart +++ b/lib/app_sources/aptoide.dart @@ -16,8 +16,9 @@ class Aptoide extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}', - caseSensitive: false); + '^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -26,14 +27,20 @@ class Aptoide extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return (await getAppDetailsJSON( - standardUrl, additionalSettings))['package']; + standardUrl, + additionalSettings, + ))['package']; } Future> getAppDetailsJSON( - String standardUrl, Map additionalSettings) async { + String standardUrl, + Map additionalSettings, + ) async { var res = await sourceRequest(standardUrl, additionalSettings); if (res.statusCode != 200) { throw getObtainiumHttpError(res); @@ -46,7 +53,9 @@ class Aptoide extends AppSource { throw NoReleasesError(); } var res2 = await sourceRequest( - 'https://ws2.aptoide.com/api/7/getApp/app_id/$id', additionalSettings); + 'https://ws2.aptoide.com/api/7/getApp/app_id/$id', + additionalSettings, + ); if (res2.statusCode != 200) { throw getObtainiumHttpError(res); } @@ -76,7 +85,10 @@ class Aptoide extends AppSource { } return APKDetails( - version, getApkUrlsFromUrls([apkUrl]), AppNames(author, appName), - releaseDate: relDate); + version, + getApkUrlsFromUrls([apkUrl]), + AppNames(author, appName), + releaseDate: relDate, + ); } } diff --git a/lib/app_sources/codeberg.dart b/lib/app_sources/codeberg.dart index e2899c3..d54cfe5 100644 --- a/lib/app_sources/codeberg.dart +++ b/lib/app_sources/codeberg.dart @@ -18,8 +18,9 @@ class Codeberg extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -36,8 +37,9 @@ class Codeberg extends AppSource { String standardUrl, Map additionalSettings, ) async { - return await gh.getLatestAPKDetailsCommon2(standardUrl, additionalSettings, - (bool useTagUrl) async { + return await gh.getLatestAPKDetailsCommon2(standardUrl, additionalSettings, ( + bool useTagUrl, + ) async { return 'https://${hosts[0]}/api/v1/repos${standardUrl.substring('https://${hosts[0]}'.length)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100'; }, null); } @@ -49,12 +51,15 @@ class Codeberg extends AppSource { } @override - Future>> search(String query, - {Map querySettings = const {}}) async { + Future>> search( + String query, { + Map querySettings = const {}, + }) async { return gh.searchCommon( - query, - 'https://${hosts[0]}/api/v1/repos/search?q=${Uri.encodeQueryComponent(query)}&limit=100', - 'data', - querySettings: querySettings); + query, + 'https://${hosts[0]}/api/v1/repos/search?q=${Uri.encodeQueryComponent(query)}&limit=100', + 'data', + querySettings: querySettings, + ); } } diff --git a/lib/app_sources/coolapk.dart b/lib/app_sources/coolapk.dart index 741ec26..4d2bf2c 100644 --- a/lib/app_sources/coolapk.dart +++ b/lib/app_sources/coolapk.dart @@ -19,8 +19,9 @@ class CoolApk extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - r'^https?://(www\.)?coolapk\.com/apk/[^/]+', - caseSensitive: false); + r'^https?://(www\.)?coolapk\.com/apk/[^/]+', + caseSensitive: false, + ); var match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -30,17 +31,19 @@ class CoolApk extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { String appId = Uri.parse(standardUrl).pathSegments.last; return appId; } @override Future getLatestAPKDetails( - String standardUrl, - Map additionalSettings, - ) async { + String standardUrl, + Map additionalSettings, + ) async { String appId = (await tryInferringAppId(standardUrl))!; String apiUrl = 'https://api2.coolapk.com'; @@ -65,13 +68,19 @@ class CoolApk extends AppSource { String changelog = detail['changelog']?.toString() ?? ''; int? releaseDate = detail['lastupdate'] != null ? (detail['lastupdate'] is int - ? detail['lastupdate'] * 1000 - : int.parse(detail['lastupdate'].toString()) * 1000) + ? detail['lastupdate'] * 1000 + : int.parse(detail['lastupdate'].toString()) * 1000) : null; String aid = detail['id'].toString(); // get apk url - String apkUrl = await _getLatestApkUrl(apiUrl, appId, aid, version, headers); + String apkUrl = await _getLatestApkUrl( + apiUrl, + appId, + aid, + version, + headers, + ); if (apkUrl.isEmpty) { throw NoAPKError(); } @@ -89,8 +98,13 @@ class CoolApk extends AppSource { ); } - Future _getLatestApkUrl(String apiUrl, String appId, String aid, - String version, Map? headers) async { + Future _getLatestApkUrl( + String apiUrl, + String appId, + String aid, + String version, + Map? headers, + ) async { String url = '$apiUrl/v6/apk/download?pn=$appId&aid=$aid'; var res = await sourceRequest(url, {}, followRedirects: false); if (res.statusCode >= 300 && res.statusCode < 400) { @@ -102,13 +116,14 @@ class CoolApk extends AppSource { @override Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { + Map additionalSettings, { + bool forAPKDownload = false, + }) async { var tokenPair = _getToken(); // CoolAPK header return { 'User-Agent': - 'Dalvik/2.1.0 (Linux; U; Android 9; MI 8 SE MIUI/9.5.9) (#Build; Xiaomi; MI 8 SE; PKQ1.181121.001; 9) +CoolMarket/12.4.2-2208241-universal', + 'Dalvik/2.1.0 (Linux; U; Android 9; MI 8 SE MIUI/9.5.9) (#Build; Xiaomi; MI 8 SE; PKQ1.181121.001; 9) +CoolMarket/12.4.2-2208241-universal', 'X-App-Id': 'com.coolapk.market', 'X-Requested-With': 'XMLHttpRequest', 'X-Sdk-Int': '30', @@ -128,14 +143,15 @@ class CoolApk extends AppSource { Map _getToken() { final rand = Random(); - String randHexString(int n) => - List.generate(n, (_) => rand.nextInt(256).toRadixString(16).padLeft(2, '0')) - .join() - .toUpperCase(); + String randHexString(int n) => List.generate( + n, + (_) => rand.nextInt(256).toRadixString(16).padLeft(2, '0'), + ).join().toUpperCase(); - String randMacAddress() => - List.generate(6, (_) => rand.nextInt(256).toRadixString(16).padLeft(2, '0')) - .join(':'); + String randMacAddress() => List.generate( + 6, + (_) => rand.nextInt(256).toRadixString(16).padLeft(2, '0'), + ).join(':'); // 加密算法来自 https://github.com/XiaoMengXinX/FuckCoolapkTokenV2、https://github.com/Coolapk-UWP/Coolapk-UWP // device @@ -147,11 +163,13 @@ class CoolApk extends AppSource { const buildNumber = 'SQ1D.220105.007'; // generate deviceCode - String deviceCode = - base64.encode('$aid; ; ; $mac; $manufactor; $brand; $model; $buildNumber'.codeUnits); + String deviceCode = base64.encode( + '$aid; ; ; $mac; $manufactor; $brand; $model; $buildNumber'.codeUnits, + ); // generate timestamp - String timeStamp = (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(); + String timeStamp = (DateTime.now().millisecondsSinceEpoch ~/ 1000) + .toString(); String base64TimeStamp = base64.encode(timeStamp.codeUnits); String md5TimeStamp = md5.convert(timeStamp.codeUnits).toString(); String md5DeviceCode = md5.convert(deviceCode.codeUnits).toString(); @@ -164,7 +182,8 @@ class CoolApk extends AppSource { String md5Token = md5.convert(token.codeUnits).toString(); // generate salt and hash - String bcryptSalt = '\$2a\$10\$${base64TimeStamp.substring(0, 14)}/${md5Token.substring(0, 6)}u'; + String bcryptSalt = + '\$2a\$10\$${base64TimeStamp.substring(0, 14)}/${md5Token.substring(0, 6)}u'; String bcryptResult = BCrypt.hashpw(md5Base64Token, bcryptSalt); String reBcryptResult = bcryptResult.replaceRange(0, 3, '\$2y'); String finalToken = 'v2${base64.encode(reBcryptResult.codeUnits)}'; diff --git a/lib/app_sources/directAPKLink.dart b/lib/app_sources/directAPKLink.dart index 5fc4d3a..5be1483 100644 --- a/lib/app_sources/directAPKLink.dart +++ b/lib/app_sources/directAPKLink.dart @@ -11,20 +11,23 @@ class DirectAPKLink extends AppSource { name = tr('directAPKLink'); additionalSourceAppSpecificSettingFormItems = [ ...html.additionalSourceAppSpecificSettingFormItems - .where((element) => element - .where((element) => element.key == 'requestHeader') - .isNotEmpty) + .where( + (element) => element + .where((element) => element.key == 'requestHeader') + .isNotEmpty, + ) .toList(), [ GeneratedFormDropdown( - 'defaultPseudoVersioningMethod', - [ - MapEntry('partialAPKHash', tr('partialAPKHash')), - MapEntry('ETag', 'ETag') - ], - label: tr('defaultPseudoVersioningMethod'), - defaultValue: 'partialAPKHash') - ] + 'defaultPseudoVersioningMethod', + [ + MapEntry('partialAPKHash', tr('partialAPKHash')), + MapEntry('ETag', 'ETag'), + ], + label: tr('defaultPseudoVersioningMethod'), + defaultValue: 'partialAPKHash', + ), + ], ]; excludeCommonSettingKeys = [ 'versionExtractionRegEx', @@ -32,7 +35,7 @@ class DirectAPKLink extends AppSource { 'versionDetection', 'useVersionCodeAsOSVersion', 'apkFilterRegEx', - 'autoApkFilterByArch' + 'autoApkFilterByArch', ]; } @@ -51,10 +54,13 @@ class DirectAPKLink extends AppSource { @override Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) { - return html.getRequestHeaders(additionalSettings, - forAPKDownload: forAPKDownload); + Map additionalSettings, { + bool forAPKDownload = false, + }) { + return html.getRequestHeaders( + additionalSettings, + forAPKDownload: forAPKDownload, + ); } @override @@ -62,8 +68,9 @@ class DirectAPKLink extends AppSource { String standardUrl, Map additionalSettings, ) async { - var additionalSettingsNew = - getDefaultValuesFromFormItems(html.combinedAppSpecificSettingFormItems); + var additionalSettingsNew = getDefaultValuesFromFormItems( + html.combinedAppSpecificSettingFormItems, + ); for (var s in additionalSettings.keys) { if (additionalSettingsNew.containsKey(s)) { additionalSettingsNew[s] = additionalSettings[s]; diff --git a/lib/app_sources/fdroid.dart b/lib/app_sources/fdroid.dart index 25c7175..6d20a02 100644 --- a/lib/app_sources/fdroid.dart +++ b/lib/app_sources/fdroid.dart @@ -17,22 +17,28 @@ class FDroid extends AppSource { canSearch = true; additionalSourceAppSpecificSettingFormItems = [ [ - GeneratedFormTextField('filterVersionsByRegEx', - label: tr('filterVersionsByRegEx'), - required: false, - additionalValidators: [ - (value) { - return regExValidator(value); - } - ]) + GeneratedFormTextField( + 'filterVersionsByRegEx', + label: tr('filterVersionsByRegEx'), + required: false, + additionalValidators: [ + (value) { + return regExValidator(value); + }, + ], + ), ], [ - GeneratedFormSwitch('trySelectingSuggestedVersionCode', - label: tr('trySelectingSuggestedVersionCode')) + GeneratedFormSwitch( + 'trySelectingSuggestedVersionCode', + label: tr('trySelectingSuggestedVersionCode'), + ), ], [ - GeneratedFormSwitch('autoSelectHighestVersionCode', - label: tr('autoSelectHighestVersionCode')) + GeneratedFormSwitch( + 'autoSelectHighestVersionCode', + label: tr('autoSelectHighestVersionCode'), + ), ], ]; } @@ -40,16 +46,18 @@ class FDroid extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegExB = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+packages/+[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+packages/+[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegExB.firstMatch(url); if (match != null) { url = 'https://${Uri.parse(match.group(0)!).host}/packages/${Uri.parse(url).pathSegments.where((s) => s.trim().isNotEmpty).last}'; } RegExp standardUrlRegExA = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/+packages/+[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/+packages/+[^/]+', + caseSensitive: false, + ); match = standardUrlRegExA.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -58,8 +66,10 @@ class FDroid extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return Uri.parse(standardUrl).pathSegments.last; } @@ -71,22 +81,28 @@ class FDroid extends AppSource { String? appId = await tryInferringAppId(standardUrl); String host = Uri.parse(standardUrl).host; var details = getAPKUrlsFromFDroidPackagesAPIResponse( - await sourceRequest( - 'https://$host/api/v1/packages/$appId', additionalSettings), - 'https://$host/repo/$appId', - standardUrl, - name, - additionalSettings: additionalSettings); + await sourceRequest( + 'https://$host/api/v1/packages/$appId', + additionalSettings, + ), + 'https://$host/repo/$appId', + standardUrl, + name, + additionalSettings: additionalSettings, + ); if (!hostChanged) { try { var res = await sourceRequest( - 'https://gitlab.com/fdroid/fdroiddata/-/raw/master/metadata/$appId.yml', - additionalSettings); + 'https://gitlab.com/fdroid/fdroiddata/-/raw/master/metadata/$appId.yml', + additionalSettings, + ); var lines = res.body.split('\n'); var authorLines = lines.where((l) => l.startsWith('AuthorName: ')); if (authorLines.isNotEmpty) { - details.names.author = - authorLines.first.split(': ').sublist(1).join(': '); + details.names.author = authorLines.first + .split(': ') + .sublist(1) + .join(': '); } var changelogUrls = lines .where((l) => l.startsWith('Changelog: ')) @@ -110,9 +126,9 @@ class FDroid extends AppSource { if ((isGitHub || isGitLab) && (details.changeLog?.indexOf('/blob/') ?? -1) >= 0) { details.changeLog = (await sourceRequest( - details.changeLog!.replaceFirst('/blob/', '/raw/'), - additionalSettings)) - .body; + details.changeLog!.replaceFirst('/blob/', '/raw/'), + additionalSettings, + )).body; } } } catch (e) { @@ -126,10 +142,14 @@ class FDroid extends AppSource { } @override - Future>> search(String query, - {Map querySettings = const {}}) async { + Future>> search( + String query, { + Map querySettings = const {}, + }) async { Response res = await sourceRequest( - 'https://search.${hosts[0]}/?q=${Uri.encodeQueryComponent(query)}', {}); + 'https://search.${hosts[0]}/?q=${Uri.encodeQueryComponent(query)}', + {}, + ); if (res.statusCode == 200) { Map> urlsWithDescriptions = {}; parse(res.body).querySelectorAll('.package-header').forEach((e) { @@ -145,7 +165,7 @@ class FDroid extends AppSource { urlsWithDescriptions[url] = [ e.querySelector('.package-name')?.text.trim() ?? '', e.querySelector('.package-summary')?.text.trim() ?? - tr('noDescription') + tr('noDescription'), ]; } }); @@ -156,29 +176,36 @@ class FDroid extends AppSource { } APKDetails getAPKUrlsFromFDroidPackagesAPIResponse( - Response res, String apkUrlPrefix, String standardUrl, String sourceName, - {Map additionalSettings = const {}}) { + Response res, + String apkUrlPrefix, + String standardUrl, + String sourceName, { + Map additionalSettings = const {}, + }) { var autoSelectHighestVersionCode = additionalSettings['autoSelectHighestVersionCode'] == true; var trySelectingSuggestedVersionCode = additionalSettings['trySelectingSuggestedVersionCode'] == true; var filterVersionsByRegEx = (additionalSettings['filterVersionsByRegEx'] as String?)?.isNotEmpty == - true - ? additionalSettings['filterVersionsByRegEx'] - : null; + true + ? additionalSettings['filterVersionsByRegEx'] + : null; var apkFilterRegEx = (additionalSettings['apkFilterRegEx'] as String?)?.isNotEmpty == true - ? additionalSettings['apkFilterRegEx'] - : null; + ? additionalSettings['apkFilterRegEx'] + : null; if (res.statusCode == 200) { var response = jsonDecode(res.body); List releases = response['packages'] ?? []; if (apkFilterRegEx != null) { releases = releases.where((rel) { String apk = '${apkUrlPrefix}_${rel['versionCode']}.apk'; - return filterApks([MapEntry(apk, apk)], apkFilterRegEx, false) - .isNotEmpty; + return filterApks( + [MapEntry(apk, apk)], + apkFilterRegEx, + false, + ).isNotEmpty; }).toList(); } if (releases.isEmpty) { @@ -191,8 +218,10 @@ class FDroid extends AppSource { if (trySelectingSuggestedVersionCode && response['suggestedVersionCode'] != null && filterVersionsByRegEx == null) { - var suggestedReleases = releases.where((element) => - element['versionCode'] == response['suggestedVersionCode']); + var suggestedReleases = releases.where( + (element) => + element['versionCode'] == response['suggestedVersionCode'], + ); if (suggestedReleases.isNotEmpty) { releaseChoices = suggestedReleases; version = suggestedReleases.first['versionName']; @@ -203,8 +232,9 @@ class FDroid extends AppSource { version = null; releaseChoices = []; for (var i = 0; i < releases.length; i++) { - if (RegExp(filterVersionsByRegEx!) - .hasMatch(releases[i]['versionName'])) { + if (RegExp( + filterVersionsByRegEx!, + ).hasMatch(releases[i]['versionName'])) { version = releases[i]['versionName']; } } @@ -219,8 +249,9 @@ class FDroid extends AppSource { } // If a suggested release was not already picked, pick all those with the selected version if (releaseChoices.isEmpty) { - releaseChoices = - releases.where((element) => element['versionName'] == version); + releaseChoices = releases.where( + (element) => element['versionName'] == version, + ); } // For the remaining releases, use the toggles to auto-select one if possible if (releaseChoices.length > 1) { @@ -228,8 +259,10 @@ class FDroid extends AppSource { releaseChoices = [releaseChoices.first]; } else if (trySelectingSuggestedVersionCode && response['suggestedVersionCode'] != null) { - var suggestedReleases = releaseChoices.where((element) => - element['versionCode'] == response['suggestedVersionCode']); + var suggestedReleases = releaseChoices.where( + (element) => + element['versionCode'] == response['suggestedVersionCode'], + ); if (suggestedReleases.isNotEmpty) { releaseChoices = suggestedReleases; } @@ -241,8 +274,11 @@ class FDroid extends AppSource { List apkUrls = releaseChoices .map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk') .toList(); - return APKDetails(version, getApkUrlsFromUrls(apkUrls.toSet().toList()), - AppNames(sourceName, Uri.parse(standardUrl).pathSegments.last)); + return APKDetails( + version, + getApkUrlsFromUrls(apkUrls.toSet().toList()), + AppNames(sourceName, Uri.parse(standardUrl).pathSegments.last), + ); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/fdroidrepo.dart b/lib/app_sources/fdroidrepo.dart index c8cc536..7d452aa 100644 --- a/lib/app_sources/fdroidrepo.dart +++ b/lib/app_sources/fdroidrepo.dart @@ -15,15 +15,20 @@ class FDroidRepo extends AppSource { additionalSourceAppSpecificSettingFormItems = [ [ - GeneratedFormTextField('appIdOrName', - label: tr('appIdOrName'), - hint: tr('reposHaveMultipleApps'), - required: true) + GeneratedFormTextField( + 'appIdOrName', + label: tr('appIdOrName'), + hint: tr('reposHaveMultipleApps'), + required: true, + ), ], [ - GeneratedFormSwitch('pickHighestVersionCode', - label: tr('pickHighestVersionCode'), defaultValue: false) - ] + GeneratedFormSwitch( + 'pickHighestVersionCode', + label: tr('pickHighestVersionCode'), + defaultValue: false, + ), + ], ]; } @@ -54,8 +59,10 @@ class FDroidRepo extends AppSource { } @override - Future>> search(String query, - {Map querySettings = const {}}) async { + Future>> search( + String query, { + Map querySettings = const {}, + }) async { String? url = querySettings['url']; if (url == null) { throw NoReleasesError(); @@ -73,11 +80,8 @@ class FDroidRepo extends AppSource { appId.contains(query) || appName.contains(query) || appDesc.contains(query)) { - results[ - '${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}?appId=$appId'] = [ - appName, - appDesc - ]; + results['${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}?appId=$appId'] = + [appName, appDesc]; } }); return results; @@ -90,21 +94,21 @@ class FDroidRepo extends AppSource { void runOnAddAppInputChange(String userInput) { additionalSourceAppSpecificSettingFormItems = additionalSourceAppSpecificSettingFormItems.map((row) { - row = row.map((item) { - if (item.key == 'appIdOrName') { - try { - var appId = Uri.parse(userInput).queryParameters['appId']; - if (appId != null && item is GeneratedFormTextField) { - item.required = false; + row = row.map((item) { + if (item.key == 'appIdOrName') { + try { + var appId = Uri.parse(userInput).queryParameters['appId']; + if (appId != null && item is GeneratedFormTextField) { + item.required = false; + } + } catch (e) { + // + } } - } catch (e) { - // - } - } - return item; - }).toList(); - return row; - }).toList(); + return item; + }).toList(); + return row; + }).toList(); } @override @@ -119,8 +123,11 @@ class FDroidRepo extends AppSource { if (appId != null) { app.url = uri .replace( - queryParameters: Map.fromEntries( - [...uri.queryParameters.entries, MapEntry('appId', appId)])) + queryParameters: Map.fromEntries([ + ...uri.queryParameters.entries, + MapEntry('appId', appId), + ]), + ) .toString(); app.additionalSettings['appIdOrName'] = appId; app.id = appId; @@ -133,8 +140,9 @@ class FDroidRepo extends AppSource { Map additionalSettings, ) async { var res = await sourceRequest( - '$url${url.endsWith('/index.xml') ? '' : '/index.xml'}', - additionalSettings); + '$url${url.endsWith('/index.xml') ? '' : '/index.xml'}', + additionalSettings, + ); if (res.statusCode != 200) { var base = url.endsWith('/index.xml') ? url.split('/').reversed.toList().sublist(1).reversed.join('/') @@ -142,7 +150,9 @@ class FDroidRepo extends AppSource { res = await sourceRequest('$base/repo/index.xml', additionalSettings); if (res.statusCode != 200) { res = await sourceRequest( - '$base/fdroid/repo/index.xml', additionalSettings); + '$base/fdroid/repo/index.xml', + additionalSettings, + ); } } return res; @@ -164,8 +174,10 @@ class FDroidRepo extends AppSource { throw NoReleasesError(); } additionalSettings['appIdOrName'] = appIdOrName; - var res = - await sourceRequestWithURLVariants(standardUrl, additionalSettings); + var res = await sourceRequestWithURLVariants( + standardUrl, + additionalSettings, + ); if (res.statusCode == 200) { var body = parse(res.body); var foundApps = body.querySelectorAll('application').where((element) { @@ -202,24 +214,32 @@ class FDroidRepo extends AppSource { throw NoVersionError(); } var latestVersionReleases = releases - .where((element) => - element.querySelector('version')?.innerHtml == latestVersion && - element.querySelector('apkname') != null) + .where( + (element) => + element.querySelector('version')?.innerHtml == latestVersion && + element.querySelector('apkname') != null, + ) .toList(); if (latestVersionReleases.length > 1 && pickHighestVersionCode) { latestVersionReleases.sort((e1, e2) { - return int.parse(e2.querySelector('versioncode')!.innerHtml) - .compareTo(int.parse(e1.querySelector('versioncode')!.innerHtml)); + return int.parse( + e2.querySelector('versioncode')!.innerHtml, + ).compareTo(int.parse(e1.querySelector('versioncode')!.innerHtml)); }); latestVersionReleases = [latestVersionReleases[0]]; } List apkUrls = latestVersionReleases - .map((e) => - '${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}') + .map( + (e) => + '${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}', + ) .toList(); - return APKDetails(latestVersion, getApkUrlsFromUrls(apkUrls), - AppNames(authorName, appName), - releaseDate: releaseDate); + return APKDetails( + latestVersion, + getApkUrlsFromUrls(apkUrls), + AppNames(authorName, appName), + releaseDate: releaseDate, + ); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index f2490cc..667e93e 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -19,145 +19,185 @@ class GitHub extends AppSource { showReleaseDateAsVersionToggle = true; sourceConfigSettingFormItems = [ - GeneratedFormTextField('github-creds', - label: tr('githubPATLabel'), - password: true, - required: false, - belowWidgets: [ - const SizedBox( - height: 4, + GeneratedFormTextField( + 'github-creds', + label: tr('githubPATLabel'), + password: true, + required: false, + belowWidgets: [ + const SizedBox(height: 4), + GestureDetector( + onTap: () { + launchUrlString( + 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token', + mode: LaunchMode.externalApplication, + ); + }, + child: Text( + tr('about'), + style: const TextStyle( + decoration: TextDecoration.underline, + fontSize: 12, + ), ), - GestureDetector( - onTap: () { - launchUrlString( - 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token', - mode: LaunchMode.externalApplication); - }, - child: Text( - tr('about'), - style: const TextStyle( - decoration: TextDecoration.underline, fontSize: 12), - )), - const SizedBox( - height: 4, - ), - ]) + ), + const SizedBox(height: 4), + ], + ), ]; additionalSourceAppSpecificSettingFormItems = [ [ - GeneratedFormSwitch('includePrereleases', - label: tr('includePrereleases'), defaultValue: false) + GeneratedFormSwitch( + 'includePrereleases', + label: tr('includePrereleases'), + defaultValue: false, + ), ], [ - GeneratedFormSwitch('fallbackToOlderReleases', - label: tr('fallbackToOlderReleases'), defaultValue: true) + GeneratedFormSwitch( + 'fallbackToOlderReleases', + label: tr('fallbackToOlderReleases'), + defaultValue: true, + ), ], [ - GeneratedFormTextField('filterReleaseTitlesByRegEx', - label: tr('filterReleaseTitlesByRegEx'), - required: false, - additionalValidators: [ - (value) { - return regExValidator(value); - } - ]) + GeneratedFormTextField( + 'filterReleaseTitlesByRegEx', + label: tr('filterReleaseTitlesByRegEx'), + required: false, + additionalValidators: [ + (value) { + return regExValidator(value); + }, + ], + ), ], [ - GeneratedFormTextField('filterReleaseNotesByRegEx', - label: tr('filterReleaseNotesByRegEx'), - required: false, - additionalValidators: [ - (value) { - return regExValidator(value); - } - ]) + GeneratedFormTextField( + 'filterReleaseNotesByRegEx', + label: tr('filterReleaseNotesByRegEx'), + required: false, + additionalValidators: [ + (value) { + return regExValidator(value); + }, + ], + ), ], [GeneratedFormSwitch('verifyLatestTag', label: tr('verifyLatestTag'))], [ GeneratedFormDropdown( - 'sortMethodChoice', - [ - MapEntry('date', tr('releaseDate')), - MapEntry('smartname', tr('smartname')), - MapEntry('none', tr('none')), - MapEntry('smartname-datefallback', - '${tr('smartname')} x ${tr('releaseDate')}'), - MapEntry('name', tr('name')), - ], - label: tr('sortMethod'), - defaultValue: 'date') + 'sortMethodChoice', + [ + MapEntry('date', tr('releaseDate')), + MapEntry('smartname', tr('smartname')), + MapEntry('none', tr('none')), + MapEntry( + 'smartname-datefallback', + '${tr('smartname')} x ${tr('releaseDate')}', + ), + MapEntry('name', tr('name')), + ], + label: tr('sortMethod'), + defaultValue: 'date', + ), ], [ - GeneratedFormSwitch('useLatestAssetDateAsReleaseDate', - label: tr('useLatestAssetDateAsReleaseDate'), defaultValue: false) + GeneratedFormSwitch( + 'useLatestAssetDateAsReleaseDate', + label: tr('useLatestAssetDateAsReleaseDate'), + defaultValue: false, + ), ], [ - GeneratedFormSwitch('releaseTitleAsVersion', - label: tr('releaseTitleAsVersion'), defaultValue: false) - ] + GeneratedFormSwitch( + 'releaseTitleAsVersion', + label: tr('releaseTitleAsVersion'), + defaultValue: false, + ), + ], ]; canSearch = true; searchQuerySettingFormItems = [ - GeneratedFormTextField('minStarCount', - label: tr('minStarCount'), - defaultValue: '0', - additionalValidators: [ - (value) { - try { - int.parse(value ?? '0'); - } catch (e) { - return tr('invalidInput'); - } - return null; + GeneratedFormTextField( + 'minStarCount', + label: tr('minStarCount'), + defaultValue: '0', + additionalValidators: [ + (value) { + try { + int.parse(value ?? '0'); + } catch (e) { + return tr('invalidInput'); } - ]) + return null; + }, + ], + ), ]; } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { const possibleBuildGradleLocations = [ '/app/build.gradle', 'android/app/build.gradle', - 'src/app/build.gradle' + 'src/app/build.gradle', ]; for (var path in possibleBuildGradleLocations) { try { var res = await sourceRequest( - '${await convertStandardUrlToAPIUrl(standardUrl, additionalSettings)}/contents/$path', - additionalSettings); + '${await convertStandardUrlToAPIUrl(standardUrl, additionalSettings)}/contents/$path', + additionalSettings, + ); if (res.statusCode == 200) { try { var body = jsonDecode(res.body); var trimmedLines = utf8 - .decode(base64 - .decode(body['content'].toString().split('\n').join(''))) + .decode( + base64.decode( + body['content'].toString().split('\n').join(''), + ), + ) .split('\n') .map((e) => e.trim()); - var appIds = trimmedLines.where((l) => - l.startsWith('applicationId "') || - l.startsWith('applicationId \'')); - appIds = appIds.map((appId) => appId - .split(appId.startsWith('applicationId "') ? '"' : '\'')[1]); - appIds = appIds.map((appId) { - if (appId.startsWith('\${') && appId.endsWith('}')) { - appId = trimmedLines - .where((l) => l.startsWith( - 'def ${appId.substring(2, appId.length - 1)}')) - .first; - appId = appId.split(appId.contains('"') ? '"' : '\'')[1]; - } - return appId; - }).where((appId) => appId.isNotEmpty); + var appIds = trimmedLines.where( + (l) => + l.startsWith('applicationId "') || + l.startsWith('applicationId \''), + ); + appIds = appIds.map( + (appId) => appId.split( + appId.startsWith('applicationId "') ? '"' : '\'', + )[1], + ); + appIds = appIds + .map((appId) { + if (appId.startsWith('\${') && appId.endsWith('}')) { + appId = trimmedLines + .where( + (l) => l.startsWith( + 'def ${appId.substring(2, appId.length - 1)}', + ), + ) + .first; + appId = appId.split(appId.contains('"') ? '"' : '\'')[1]; + } + return appId; + }) + .where((appId) => appId.isNotEmpty); if (appIds.length == 1) { return appIds.first; } } catch (err) { LogsProvider().add( - 'Error parsing build.gradle from ${res.request!.url.toString()}: ${err.toString()}'); + 'Error parsing build.gradle from ${res.request!.url.toString()}: ${err.toString()}', + ); } } } catch (err) { @@ -170,8 +210,9 @@ class GitHub extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -181,8 +222,9 @@ class GitHub extends AppSource { @override Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { + Map additionalSettings, { + bool forAPKDownload = false, + }) async { var token = await getTokenIfAny(additionalSettings); var headers = {}; if (token != null && token.isNotEmpty) { @@ -201,14 +243,17 @@ class GitHub extends AppSource { Future getTokenIfAny(Map additionalSettings) async { SettingsProvider settingsProvider = SettingsProvider(); await settingsProvider.initializeSettings(); - var sourceConfig = - await getSourceConfigValues(additionalSettings, settingsProvider); + var sourceConfig = await getSourceConfigValues( + additionalSettings, + settingsProvider, + ); String? creds = sourceConfig['github-creds']; if (creds != null) { var userNameEndIndex = creds.indexOf(':'); if (userNameEndIndex > 0) { creds = creds.substring( - userNameEndIndex + 1); // For old username-included token inputs + userNameEndIndex + 1, + ); // For old username-included token inputs } return creds; } else { @@ -228,31 +273,36 @@ class GitHub extends AppSource { 'https://api.${hosts[0]}'; Future convertStandardUrlToAPIUrl( - String standardUrl, Map additionalSettings) async => + String standardUrl, + Map additionalSettings, + ) async => '${await getAPIHost(additionalSettings)}/repos${standardUrl.substring('https://${hosts[0]}'.length)}'; @override String? changeLogPageFromStandardUrl(String standardUrl) => '$standardUrl/releases'; - Future getLatestAPKDetailsCommon(String requestUrl, - String standardUrl, Map additionalSettings, - {Function(Response)? onHttpErrorCode}) async { + Future getLatestAPKDetailsCommon( + String requestUrl, + String standardUrl, + Map additionalSettings, { + Function(Response)? onHttpErrorCode, + }) async { bool includePrereleases = additionalSettings['includePrereleases'] == true; bool fallbackToOlderReleases = additionalSettings['fallbackToOlderReleases'] == true; String? regexFilter = (additionalSettings['filterReleaseTitlesByRegEx'] as String?) - ?.isNotEmpty == - true - ? additionalSettings['filterReleaseTitlesByRegEx'] - : null; + ?.isNotEmpty == + true + ? additionalSettings['filterReleaseTitlesByRegEx'] + : null; String? regexNotesFilter = (additionalSettings['filterReleaseNotesByRegEx'] as String?) - ?.isNotEmpty == - true - ? additionalSettings['filterReleaseNotesByRegEx'] - : null; + ?.isNotEmpty == + true + ? additionalSettings['filterReleaseNotesByRegEx'] + : null; bool verifyLatestTag = additionalSettings['verifyLatestTag'] == true; bool useLatestAssetDateAsReleaseDate = additionalSettings['useLatestAssetDateAsReleaseDate'] == true; @@ -262,8 +312,9 @@ class GitHub extends AppSource { if (verifyLatestTag) { var temp = requestUrl.split('?'); Response res = await sourceRequest( - '${temp[0]}/latest${temp.length > 1 ? '?${temp.sublist(1).join('?')}' : ''}', - additionalSettings); + '${temp[0]}/latest${temp.length > 1 ? '?${temp.sublist(1).join('?')}' : ''}', + additionalSettings, + ); if (res.statusCode != 200) { if (onHttpErrorCode != null) { onHttpErrorCode(res); @@ -278,8 +329,10 @@ class GitHub extends AppSource { if (latestRelease != null) { var latestTag = latestRelease['tag_name'] ?? latestRelease['name']; if (releases - .where((element) => - (element['tag_name'] ?? element['name']) == latestTag) + .where( + (element) => + (element['tag_name'] ?? element['name']) == latestTag, + ) .isEmpty) { releases = [latestRelease, ...releases]; } @@ -299,10 +352,10 @@ class GitHub extends AppSource { DateTime? getPublishDateFromRelease(dynamic rel) => rel?['published_at'] != null - ? DateTime.parse(rel['published_at']) - : rel?['commit']?['created'] != null - ? DateTime.parse(rel['commit']['created']) - : null; + ? DateTime.parse(rel['published_at']) + : rel?['commit']?['created'] != null + ? DateTime.parse(rel['commit']['created']) + : null; DateTime? getNewestAssetDateFromRelease(dynamic rel) { var allAssets = rel['assets'] as List?; var filteredAssets = rel['filteredAssets'] as List?; @@ -323,8 +376,8 @@ class GitHub extends AppSource { DateTime? getReleaseDateFromRelease(dynamic rel, bool useAssetDate) => !useAssetDate - ? getPublishDateFromRelease(rel) - : getNewestAssetDateFromRelease(rel); + ? getPublishDateFromRelease(rel) + : getNewestAssetDateFromRelease(rel); if (sortMethod == 'none') { releases = releases.reversed.toList(); @@ -340,29 +393,40 @@ class GitHub extends AppSource { } else { var nameA = a['tag_name'] ?? a['name']; var nameB = b['tag_name'] ?? b['name']; - var stdFormats = findStandardFormatsForVersion(nameA, false) - .intersection(findStandardFormatsForVersion(nameB, false)); + var stdFormats = findStandardFormatsForVersion( + nameA, + false, + ).intersection(findStandardFormatsForVersion(nameB, false)); if (sortMethod == 'date' || (sortMethod == 'smartname-datefallback' && stdFormats.isEmpty)) { return (getReleaseDateFromRelease( - a, useLatestAssetDateAsReleaseDate) ?? + a, + useLatestAssetDateAsReleaseDate, + ) ?? DateTime(1)) - .compareTo(getReleaseDateFromRelease( - b, useLatestAssetDateAsReleaseDate) ?? - DateTime(0)); + .compareTo( + getReleaseDateFromRelease( + b, + useLatestAssetDateAsReleaseDate, + ) ?? + DateTime(0), + ); } else { if (sortMethod != 'name' && stdFormats.isNotEmpty) { var reg = RegExp(stdFormats.last); var matchA = reg.firstMatch(nameA); var matchB = reg.firstMatch(nameB); return compareAlphaNumeric( - (nameA as String).substring(matchA!.start, matchA.end), - (nameB as String).substring(matchB!.start, matchB.end)); + (nameA as String).substring(matchA!.start, matchA.end), + (nameB as String).substring(matchB!.start, matchB.end), + ); } else { // 'name' return compareAlphaNumeric( - (nameA as String), (nameB as String)); + (nameA as String), + (nameB as String), + ); } } } @@ -374,9 +438,11 @@ class GitHub extends AppSource { latestRelease != (releases[releases.length - 1]['tag_name'] ?? releases[0]['name'])) { - var ind = releases.indexWhere((element) => - (latestRelease['tag_name'] ?? latestRelease['name']) == - (element['tag_name'] ?? element['name'])); + var ind = releases.indexWhere( + (element) => + (latestRelease['tag_name'] ?? latestRelease['name']) == + (element['tag_name'] ?? element['name']), + ); if (ind >= 0) { releases.add(releases.removeAt(ind)); } @@ -404,8 +470,9 @@ class GitHub extends AppSource { continue; } if (regexNotesFilter != null && - !RegExp(regexNotesFilter) - .hasMatch(((releases[i]['body'] as String?) ?? '').trim())) { + !RegExp( + regexNotesFilter, + ).hasMatch(((releases[i]['body'] as String?) ?? '').trim())) { continue; } var allAssetsWithUrls = findReleaseAssetUrls(releases[i]); @@ -413,24 +480,31 @@ class GitHub extends AppSource { .map((e) => e['final_url'] as MapEntry) .toList(); var apkAssetsWithUrls = allAssetsWithUrls - .where((element) => - (element['final_url'] as MapEntry) - .key - .toLowerCase() - .endsWith('.apk')) + .where( + (element) => (element['final_url'] as MapEntry) + .key + .toLowerCase() + .endsWith('.apk'), + ) .toList(); var filteredApkUrls = filterApks( - apkAssetsWithUrls - .map((e) => e['final_url'] as MapEntry) - .toList(), - additionalSettings['apkFilterRegEx'], - additionalSettings['invertAPKFilter']); + apkAssetsWithUrls + .map((e) => e['final_url'] as MapEntry) + .toList(), + additionalSettings['apkFilterRegEx'], + additionalSettings['invertAPKFilter'], + ); var filteredApks = apkAssetsWithUrls - .where((e) => filteredApkUrls - .where((e2) => - e2.key == (e['final_url'] as MapEntry).key) - .isNotEmpty) + .where( + (e) => filteredApkUrls + .where( + (e2) => + e2.key == + (e['final_url'] as MapEntry).key, + ) + .isNotEmpty, + ) .toList(); if (filteredApks.isEmpty && additionalSettings['trackOnly'] != true) { @@ -441,17 +515,23 @@ class GitHub extends AppSource { targetRelease['filteredAssets'] = filteredApks; targetRelease['version'] = additionalSettings['releaseTitleAsVersion'] == true - ? nameToFilter - : targetRelease['tag_name'] ?? targetRelease['name']; + ? nameToFilter + : targetRelease['tag_name'] ?? targetRelease['name']; if (targetRelease['tarball_url'] != null) { - allAssetUrls.add(MapEntry( + allAssetUrls.add( + MapEntry( (targetRelease['version'] ?? 'source') + '.tar.gz', - targetRelease['tarball_url'])); + targetRelease['tarball_url'], + ), + ); } if (targetRelease['zipball_url'] != null) { - allAssetUrls.add(MapEntry( + allAssetUrls.add( + MapEntry( (targetRelease['version'] ?? 'source') + '.zip', - targetRelease['zipball_url'])); + targetRelease['zipball_url'], + ), + ); } targetRelease['allAssetUrls'] = allAssetUrls; break; @@ -462,19 +542,22 @@ class GitHub extends AppSource { String? version = targetRelease['version']; DateTime? releaseDate = getReleaseDateFromRelease( - targetRelease, useLatestAssetDateAsReleaseDate); + targetRelease, + useLatestAssetDateAsReleaseDate, + ); if (version == null) { throw NoVersionError(); } var changeLog = (targetRelease['body'] ?? '').toString(); return APKDetails( - version, - targetRelease['apkUrls'] as List>, - getAppNames(standardUrl), - releaseDate: releaseDate, - changeLog: changeLog.isEmpty ? null : changeLog, - allAssetUrls: - targetRelease['allAssetUrls'] as List>); + version, + targetRelease['apkUrls'] as List>, + getAppNames(standardUrl), + releaseDate: releaseDate, + changeLog: changeLog.isEmpty ? null : changeLog, + allAssetUrls: + targetRelease['allAssetUrls'] as List>, + ); } else { if (onHttpErrorCode != null) { onHttpErrorCode(res); @@ -484,19 +567,26 @@ class GitHub extends AppSource { } getLatestAPKDetailsCommon2( - String standardUrl, - Map additionalSettings, - Future Function(bool) reqUrlGenerator, - dynamic Function(Response)? onHttpErrorCode) async { + String standardUrl, + Map additionalSettings, + Future Function(bool) reqUrlGenerator, + dynamic Function(Response)? onHttpErrorCode, + ) async { try { return await getLatestAPKDetailsCommon( - await reqUrlGenerator(false), standardUrl, additionalSettings, - onHttpErrorCode: onHttpErrorCode); + await reqUrlGenerator(false), + standardUrl, + additionalSettings, + onHttpErrorCode: onHttpErrorCode, + ); } catch (err) { if (err is NoReleasesError && additionalSettings['trackOnly'] == true) { return await getLatestAPKDetailsCommon( - await reqUrlGenerator(true), standardUrl, additionalSettings, - onHttpErrorCode: onHttpErrorCode); + await reqUrlGenerator(true), + standardUrl, + additionalSettings, + onHttpErrorCode: onHttpErrorCode, + ); } else { rethrow; } @@ -508,12 +598,16 @@ class GitHub extends AppSource { String standardUrl, Map additionalSettings, ) async { - return await getLatestAPKDetailsCommon2(standardUrl, additionalSettings, - (bool useTagUrl) async { - return '${await convertStandardUrlToAPIUrl(standardUrl, additionalSettings)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100'; - }, (Response res) { - rateLimitErrorCheck(res); - }); + return await getLatestAPKDetailsCommon2( + standardUrl, + additionalSettings, + (bool useTagUrl) async { + return '${await convertStandardUrlToAPIUrl(standardUrl, additionalSettings)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100'; + }, + (Response res) { + rateLimitErrorCheck(res); + }, + ); } AppNames getAppNames(String standardUrl) { @@ -523,9 +617,12 @@ class GitHub extends AppSource { } Future>> searchCommon( - String query, String requestUrl, String rootProp, - {Function(Response)? onHttpErrorCode, - Map querySettings = const {}}) async { + String query, + String requestUrl, + String rootProp, { + Function(Response)? onHttpErrorCode, + Map querySettings = const {}, + }) async { Response res = await sourceRequest(requestUrl, {}); if (res.statusCode == 200) { int minStarCount = querySettings['minStarCount'] != null @@ -540,8 +637,8 @@ class GitHub extends AppSource { ((e['archived'] == true ? '[ARCHIVED] ' : '') + (e['description'] != null ? e['description'] as String - : tr('noDescription'))) - ] + : tr('noDescription'))), + ], }); } } @@ -555,22 +652,27 @@ class GitHub extends AppSource { } @override - Future>> search(String query, - {Map querySettings = const {}}) async { + Future>> search( + String query, { + Map querySettings = const {}, + }) async { return searchCommon( - query, - '${await getAPIHost({})}/search/repositories?q=${Uri.encodeQueryComponent(query)}&per_page=100', - 'items', onHttpErrorCode: (Response res) { - rateLimitErrorCheck(res); - }, querySettings: querySettings); + query, + '${await getAPIHost({})}/search/repositories?q=${Uri.encodeQueryComponent(query)}&per_page=100', + 'items', + onHttpErrorCode: (Response res) { + rateLimitErrorCheck(res); + }, + querySettings: querySettings, + ); } rateLimitErrorCheck(Response res) { if (res.headers['x-ratelimit-remaining'] == '0') { throw RateLimitError( - (int.parse(res.headers['x-ratelimit-reset'] ?? '1800000000') / - 60000000) - .round()); + (int.parse(res.headers['x-ratelimit-reset'] ?? '1800000000') / 60000000) + .round(), + ); } } } diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 4c0cd2f..fab4421 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -18,36 +18,41 @@ class GitLab extends AppSource { showReleaseDateAsVersionToggle = true; sourceConfigSettingFormItems = [ - GeneratedFormTextField('gitlab-creds', - label: tr('gitlabPATLabel'), - password: true, - required: false, - belowWidgets: [ - const SizedBox( - height: 4, + GeneratedFormTextField( + 'gitlab-creds', + label: tr('gitlabPATLabel'), + password: true, + required: false, + belowWidgets: [ + const SizedBox(height: 4), + GestureDetector( + onTap: () { + launchUrlString( + 'https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token', + mode: LaunchMode.externalApplication, + ); + }, + child: Text( + tr('about'), + style: const TextStyle( + decoration: TextDecoration.underline, + fontSize: 12, + ), ), - GestureDetector( - onTap: () { - launchUrlString( - 'https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token', - mode: LaunchMode.externalApplication); - }, - child: Text( - tr('about'), - style: const TextStyle( - decoration: TextDecoration.underline, fontSize: 12), - )), - const SizedBox( - height: 4, - ) - ]) + ), + const SizedBox(height: 4), + ], + ), ]; additionalSourceAppSpecificSettingFormItems = [ [ - GeneratedFormSwitch('fallbackToOlderReleases', - label: tr('fallbackToOlderReleases'), defaultValue: true) - ] + GeneratedFormSwitch( + 'fallbackToOlderReleases', + label: tr('fallbackToOlderReleases'), + defaultValue: true, + ), + ], ]; } @@ -55,11 +60,13 @@ class GitLab extends AppSource { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { var urlSegments = url.split('/'); var cutOffIndex = urlSegments.indexWhere((s) => s == '-'); - url = - urlSegments.sublist(0, cutOffIndex <= 0 ? null : cutOffIndex).join('/'); + url = urlSegments + .sublist(0, cutOffIndex <= 0 ? null : cutOffIndex) + .join('/'); RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+(/[^((\b/\b)|(\b/-/\b))]+){1,20}', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+(/[^((\b/\b)|(\b/-/\b))]+){1,20}', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -70,15 +77,19 @@ class GitLab extends AppSource { Future getPATIfAny(Map additionalSettings) async { SettingsProvider settingsProvider = SettingsProvider(); await settingsProvider.initializeSettings(); - var sourceConfig = - await getSourceConfigValues(additionalSettings, settingsProvider); + var sourceConfig = await getSourceConfigValues( + additionalSettings, + settingsProvider, + ); String? creds = sourceConfig['gitlab-creds']; return creds != null && creds.isNotEmpty ? creds : null; } @override - Future>> search(String query, - {Map querySettings = const {}}) async { + Future>> search( + String query, { + Map querySettings = const {}, + }) async { var url = 'https://${hosts[0]}/api/v4/projects?search=${Uri.encodeQueryComponent(query)}'; var res = await sourceRequest(url, {}); @@ -90,7 +101,7 @@ class GitLab extends AppSource { for (var element in json) { results['https://${hosts[0]}/${element['path_with_namespace']}'] = [ element['name_with_namespace'], - element['description'] ?? tr('noDescription') + element['description'] ?? tr('noDescription'), ]; } return results; @@ -102,8 +113,9 @@ class GitLab extends AppSource { @override Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { + Map additionalSettings, { + bool forAPKDownload = false, + }) async { // Change headers to pacify, e.g. cloudflare protection // Related to: (#1397, #1389, #1384, #1382, #1381, #1380, #1359, #854, #785, #697) var headers = {}; @@ -116,8 +128,11 @@ class GitLab extends AppSource { } @override - Future apkUrlPrefetchModifier(String apkUrl, String standardUrl, - Map additionalSettings) async { + Future apkUrlPrefetchModifier( + String apkUrl, + String standardUrl, + Map additionalSettings, + ) async { String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; return '$apkUrl${(Uri.parse(apkUrl).query.isEmpty ? '?' : '&')}$optionalAuth'; @@ -139,8 +154,9 @@ class GitLab extends AppSource { // Get project ID Response res0 = await sourceRequest( - 'https://${hosts[0]}/api/v4/projects/$projectUriComponent?$optionalAuth', - additionalSettings); + 'https://${hosts[0]}/api/v4/projects/$projectUriComponent?$optionalAuth', + additionalSettings, + ); if (res0.statusCode != 200) { throw getObtainiumHttpError(res0); } @@ -151,8 +167,9 @@ class GitLab extends AppSource { // Request data from REST API Response res = await sourceRequest( - 'https://${hosts[0]}/api/v4/projects/$projectUriComponent/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth', - additionalSettings); + 'https://${hosts[0]}/api/v4/projects/$projectUriComponent/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth', + additionalSettings, + ); if (res.statusCode != 200) { throw getObtainiumHttpError(res); } @@ -166,11 +183,13 @@ class GitLab extends AppSource { var url = (e['direct_asset_url'] ?? e['url'] ?? '') as String; var parsedUrl = url.isNotEmpty ? Uri.parse(url) : null; return MapEntry( - (e['name'] ?? - (parsedUrl != null && parsedUrl.pathSegments.isNotEmpty - ? parsedUrl.pathSegments.last - : 'unknown')) as String, - (e['direct_asset_url'] ?? e['url'] ?? '') as String); + (e['name'] ?? + (parsedUrl != null && parsedUrl.pathSegments.isNotEmpty + ? parsedUrl.pathSegments.last + : 'unknown')) + as String, + (e['direct_asset_url'] ?? e['url'] ?? '') as String, + ); }) .where((s) => s.key.isNotEmpty) .toList(); @@ -193,11 +212,15 @@ class GitLab extends AppSource { } var releaseDateString = e['released_at'] ?? e['created_at'] ?? e['commit']?['created_at']; - DateTime? releaseDate = - releaseDateString != null ? DateTime.parse(releaseDateString) : null; - return APKDetails(e['tag_name'] ?? e['name'], apkUrls.entries.toList(), - AppNames(names.author, names.name.split('/').last), - releaseDate: releaseDate); + DateTime? releaseDate = releaseDateString != null + ? DateTime.parse(releaseDateString) + : null; + return APKDetails( + e['tag_name'] ?? e['name'], + apkUrls.entries.toList(), + AppNames(names.author, names.name.split('/').last), + releaseDate: releaseDate, + ); }); if (apkDetailsList.isEmpty) { throw NoReleasesError(); @@ -208,8 +231,9 @@ class GitLab extends AppSource { bool fallbackToOlderReleases = additionalSettings['fallbackToOlderReleases'] == true; if (finalResult.apkUrls.isEmpty && fallbackToOlderReleases && !trackOnly) { - apkDetailsList = - apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList(); + apkDetailsList = apkDetailsList + .where((e) => e.apkUrls.isNotEmpty) + .toList(); finalResult = apkDetailsList.first; } @@ -218,10 +242,13 @@ class GitLab extends AppSource { } finalResult.apkUrls = finalResult.apkUrls.map((apkUrl) { - if (RegExp('^$standardUrl/-/jobs/[0-9]+/artifacts/file/[^/]+') - .hasMatch(apkUrl.value)) { + if (RegExp( + '^$standardUrl/-/jobs/[0-9]+/artifacts/file/[^/]+', + ).hasMatch(apkUrl.value)) { return MapEntry( - apkUrl.key, apkUrl.value.replaceFirst('/file/', '/raw/')); + apkUrl.key, + apkUrl.value.replaceFirst('/file/', '/raw/'), + ); } else { return apkUrl; } diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index 9037f6d..437cb6f 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -100,28 +100,37 @@ bool _isNumeric(String s) { return s.codeUnitAt(0) >= 48 && s.codeUnitAt(0) <= 57; } -List> getLinksInLines(String lines) => RegExp( - r'(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?') - .allMatches(lines) - .map((match) => - MapEntry(match.group(0)!, match.group(0)?.split('/').last ?? '')) - .toList(); +List> getLinksInLines(String lines) => + RegExp( + r'(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?', + ) + .allMatches(lines) + .map( + (match) => + MapEntry(match.group(0)!, match.group(0)?.split('/').last ?? ''), + ) + .toList(); // Given an HTTP response, grab some links according to the common additional settings // (those that apply to intermediate and final steps) Future>> grabLinksCommon( - Response res, Map additionalSettings) async { + Response res, + Map additionalSettings, +) async { if (res.statusCode != 200) { throw getObtainiumHttpError(res); } var html = parse(res.body); List> allLinks = html .querySelectorAll('a') - .map((element) => MapEntry( + .map( + (element) => MapEntry( element.attributes['href'] ?? '', element.text.isNotEmpty ? element.text - : (element.attributes['href'] ?? '').split('/').last)) + : (element.attributes['href'] ?? '').split('/').last, + ), + ) .where((element) => element.key.isNotEmpty) .map((e) => MapEntry(ensureAbsoluteUrl(e.key, res.request!.url), e.value)) .toList(); @@ -134,9 +143,13 @@ Future>> grabLinksCommon( var jsonStrings = collectAllStringsFromJSONObject(jsonDecode(res.body)); allLinks = getLinksInLines(jsonStrings.join('\n')); if (allLinks.isEmpty) { - allLinks = getLinksInLines(jsonStrings.map((l) { - return ensureAbsoluteUrl(l, res.request!.url); - }).join('\n')); + allLinks = getLinksInLines( + jsonStrings + .map((l) { + return ensureAbsoluteUrl(l, res.request!.url); + }) + .join('\n'), + ); } } catch (e) { // @@ -165,17 +178,20 @@ Future>> grabLinksCommon( } catch (e) { // Some links may not have valid encoding } - return Uri.parse(filterLinkByText ? element.value : link) - .path - .toLowerCase() - .endsWith('.apk'); + return Uri.parse( + filterLinkByText ? element.value : link, + ).path.toLowerCase().endsWith('.apk'); }).toList(); } if (!skipSort) { - links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true - ? compareAlphaNumeric(a.key.split('/').where((e) => e.isNotEmpty).last, - b.key.split('/').where((e) => e.isNotEmpty).last) - : compareAlphaNumeric(a.key, b.key)); + links.sort( + (a, b) => additionalSettings['sortByLastLinkSegment'] == true + ? compareAlphaNumeric( + a.key.split('/').where((e) => e.isNotEmpty).last, + b.key.split('/').where((e) => e.isNotEmpty).last, + ) + : compareAlphaNumeric(a.key, b.key), + ); } if (additionalSettings['reverseSort'] == true) { links = links.reversed.toList(); @@ -201,102 +217,119 @@ class HTML extends AppSource { var finalStepFormitems = [ [ - GeneratedFormTextField('customLinkFilterRegex', - label: tr('customLinkFilterRegex'), - hint: 'download/(.*/)?(android|apk|mobile)', - required: false, - additionalValidators: [ - (value) { - return regExValidator(value); - } - ]) + GeneratedFormTextField( + 'customLinkFilterRegex', + label: tr('customLinkFilterRegex'), + hint: 'download/(.*/)?(android|apk|mobile)', + required: false, + additionalValidators: [ + (value) { + return regExValidator(value); + }, + ], + ), ], [ - GeneratedFormSwitch('versionExtractWholePage', - label: tr('versionExtractWholePage')) - ] + GeneratedFormSwitch( + 'versionExtractWholePage', + label: tr('versionExtractWholePage'), + ), + ], ]; var commonFormItems = [ [GeneratedFormSwitch('filterByLinkText', label: tr('filterByLinkText'))], [GeneratedFormSwitch('skipSort', label: tr('skipSort'))], [GeneratedFormSwitch('reverseSort', label: tr('takeFirstLink'))], [ - GeneratedFormSwitch('sortByLastLinkSegment', - label: tr('sortByLastLinkSegment')) + GeneratedFormSwitch( + 'sortByLastLinkSegment', + label: tr('sortByLastLinkSegment'), + ), ], ]; var intermediateFormItems = [ [ - GeneratedFormTextField('customLinkFilterRegex', - label: tr('intermediateLinkRegex'), - hint: '([0-9]+.)*[0-9]+/\$', - required: true, - additionalValidators: [(value) => regExValidator(value)]) + GeneratedFormTextField( + 'customLinkFilterRegex', + label: tr('intermediateLinkRegex'), + hint: '([0-9]+.)*[0-9]+/\$', + required: true, + additionalValidators: [(value) => regExValidator(value)], + ), ], [ - GeneratedFormSwitch('autoLinkFilterByArch', - label: tr('autoLinkFilterByArch'), defaultValue: false) + GeneratedFormSwitch( + 'autoLinkFilterByArch', + label: tr('autoLinkFilterByArch'), + defaultValue: false, + ), ], ]; HTML() { additionalSourceAppSpecificSettingFormItems = [ [ - GeneratedFormSubForm( - 'intermediateLink', [...intermediateFormItems, ...commonFormItems], - label: tr('intermediateLink')) + GeneratedFormSubForm('intermediateLink', [ + ...intermediateFormItems, + ...commonFormItems, + ], label: tr('intermediateLink')), ], finalStepFormitems[0], ...commonFormItems, ...finalStepFormitems.sublist(1), [ GeneratedFormSubForm( - 'requestHeader', + 'requestHeader', + [ [ - [ - GeneratedFormTextField('requestHeader', - label: tr('requestHeader'), - required: false, - additionalValidators: [ - (value) { - if ((value ?? 'empty:valid') - .split(':') - .map((e) => e.trim()) - .where((e) => e.isNotEmpty) - .length < - 2) { - return tr('invalidInput'); - } - return null; - } - ]) - ] + GeneratedFormTextField( + 'requestHeader', + label: tr('requestHeader'), + required: false, + additionalValidators: [ + (value) { + if ((value ?? 'empty:valid') + .split(':') + .map((e) => e.trim()) + .where((e) => e.isNotEmpty) + .length < + 2) { + return tr('invalidInput'); + } + return null; + }, + ], + ), ], - label: tr('requestHeader'), - defaultValue: [ - { - 'requestHeader': - 'User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36' - } - ]) + ], + label: tr('requestHeader'), + defaultValue: [ + { + 'requestHeader': + 'User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36', + }, + ], + ), ], [ GeneratedFormDropdown( - 'defaultPseudoVersioningMethod', - [ - MapEntry('partialAPKHash', tr('partialAPKHash')), - MapEntry('APKLinkHash', tr('APKLinkHash')), - MapEntry('ETag', 'ETag') - ], - label: tr('defaultPseudoVersioningMethod'), - defaultValue: 'partialAPKHash') - ] + 'defaultPseudoVersioningMethod', + [ + MapEntry('partialAPKHash', tr('partialAPKHash')), + MapEntry('APKLinkHash', tr('APKLinkHash')), + MapEntry('ETag', 'ETag'), + ], + label: tr('defaultPseudoVersioningMethod'), + defaultValue: 'partialAPKHash', + ), + ], ]; } @override Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { + Map additionalSettings, { + bool forAPKDownload = false, + }) async { if (additionalSettings.isNotEmpty) { if (additionalSettings['requestHeader']?.isNotEmpty != true) { additionalSettings['requestHeader'] = []; @@ -336,8 +369,9 @@ class HTML extends AppSource { .toList(); for (int i = 0; i < (additionalSettings['intermediateLink'].length); i++) { var intLinks = await grabLinksCommon( - await sourceRequest(currentUrl, additionalSettings), - additionalSettings['intermediateLink'][i]); + await sourceRequest(currentUrl, additionalSettings), + additionalSettings['intermediateLink'][i], + ); if (intLinks.isEmpty) { throw NoReleasesError(note: currentUrl); } else { @@ -353,11 +387,17 @@ class HTML extends AppSource { String versionExtractionWholePageString = currentUrl; if (additionalSettings['directAPKLink'] != true) { Response res = await sourceRequest(currentUrl, additionalSettings); - versionExtractionWholePageString = - res.body.split('\r\n').join('\n').split('\n').join('\\n'); + versionExtractionWholePageString = res.body + .split('\r\n') + .join('\n') + .split('\n') + .join('\\n'); links = await grabLinksCommon(res, additionalSettings); - links = filterApks(links, additionalSettings['apkFilterRegEx'], - additionalSettings['invertAPKFilter']); + links = filterApks( + links, + additionalSettings['apkFilterRegEx'], + additionalSettings['invertAPKFilter'], + ); if (links.isEmpty) { throw NoReleasesError(note: currentUrl); } @@ -373,37 +413,45 @@ class HTML extends AppSource { } String? version; version = extractVersion( - additionalSettings['versionExtractionRegEx'] as String?, - additionalSettings['matchGroupToUse'] as String?, - additionalSettings['versionExtractWholePage'] == true - ? versionExtractionWholePageString - : relDecoded); - var apkReqHeaders = - await getRequestHeaders(additionalSettings, forAPKDownload: true); + additionalSettings['versionExtractionRegEx'] as String?, + additionalSettings['matchGroupToUse'] as String?, + additionalSettings['versionExtractWholePage'] == true + ? versionExtractionWholePageString + : relDecoded, + ); + var apkReqHeaders = await getRequestHeaders( + additionalSettings, + forAPKDownload: true, + ); if (version == null && additionalSettings['defaultPseudoVersioningMethod'] == 'ETag') { - version = await checkETagHeader(rel, - headers: apkReqHeaders, - allowInsecure: additionalSettings['allowInsecure'] == true); + version = await checkETagHeader( + rel, + headers: apkReqHeaders, + allowInsecure: additionalSettings['allowInsecure'] == true, + ); if (version == null) { throw NoVersionError(); } } version ??= additionalSettings['defaultPseudoVersioningMethod'] == 'APKLinkHash' - ? rel.hashCode.toString() - : (await checkPartialDownloadHashDynamic(rel, - headers: apkReqHeaders, - allowInsecure: additionalSettings['allowInsecure'] == true)) - .toString(); + ? rel.hashCode.toString() + : (await checkPartialDownloadHashDynamic( + rel, + headers: apkReqHeaders, + allowInsecure: additionalSettings['allowInsecure'] == true, + )).toString(); return APKDetails( - version, - [rel].map((e) { - var uri = Uri.parse(e); - var fileName = - uri.pathSegments.isNotEmpty ? uri.pathSegments.last : uri.origin; - return MapEntry('${e.hashCode}-$fileName', e); - }).toList(), - AppNames(uri.host, tr('app'))); + version, + [rel].map((e) { + var uri = Uri.parse(e); + var fileName = uri.pathSegments.isNotEmpty + ? uri.pathSegments.last + : uri.origin; + return MapEntry('${e.hashCode}-$fileName', e); + }).toList(), + AppNames(uri.host, tr('app')), + ); } } diff --git a/lib/app_sources/huaweiappgallery.dart b/lib/app_sources/huaweiappgallery.dart index 0716597..2d09e60 100644 --- a/lib/app_sources/huaweiappgallery.dart +++ b/lib/app_sources/huaweiappgallery.dart @@ -14,8 +14,9 @@ class HuaweiAppGallery extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}(/#)?/(app|appdl)/[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}(/#)?/(app|appdl)/[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -27,9 +28,14 @@ class HuaweiAppGallery extends AppSource { 'https://${hosts[0].replaceAll('appgallery.huawei', 'appgallery.cloud.huawei')}/appdl/${standardUrl.split('/').last}'; requestAppdlRedirect( - String dlUrl, Map additionalSettings) async { - Response res = - await sourceRequest(dlUrl, additionalSettings, followRedirects: false); + String dlUrl, + Map additionalSettings, + ) async { + Response res = await sourceRequest( + dlUrl, + additionalSettings, + followRedirects: false, + ); if (res.statusCode == 200 || res.statusCode == 302 || res.statusCode == 304) { @@ -53,8 +59,10 @@ class HuaweiAppGallery extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { String dlUrl = getDlUrl(standardUrl); Response res = await requestAppdlRedirect(dlUrl, additionalSettings); return res.headers['location'] != null @@ -76,8 +84,11 @@ class HuaweiAppGallery extends AppSource { if (appId.isEmpty) { throw NoReleasesError(); } - var relDateStr = - res.headers['location']?.split('?')[0].split('.').reversed.toList()[1]; + var relDateStr = res.headers['location'] + ?.split('?')[0] + .split('.') + .reversed + .toList()[1]; if (relDateStr == null || relDateStr.length != 10) { throw NoVersionError(); } @@ -88,10 +99,15 @@ class HuaweiAppGallery extends AppSource { relDateStrAdj.insert((i + i ~/ 2 - 1), '-'); i += 2; } - var relDate = - DateFormat('yy-MM-dd-HH-mm', 'en_US').parse(relDateStrAdj.join('')); + var relDate = DateFormat( + 'yy-MM-dd-HH-mm', + 'en_US', + ).parse(relDateStrAdj.join('')); return APKDetails( - relDateStr, [MapEntry('$appId.apk', dlUrl)], AppNames(name, appId), - releaseDate: relDate); + relDateStr, + [MapEntry('$appId.apk', dlUrl)], + AppNames(name, appId), + releaseDate: relDate, + ); } } diff --git a/lib/app_sources/izzyondroid.dart b/lib/app_sources/izzyondroid.dart index 2960c6e..a6134ad 100644 --- a/lib/app_sources/izzyondroid.dart +++ b/lib/app_sources/izzyondroid.dart @@ -16,13 +16,15 @@ class IzzyOnDroid extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegExA = RegExp( - '^https?://android.${getSourceRegex(hosts)}/repo/apk/[^/]+', - caseSensitive: false); + '^https?://android.${getSourceRegex(hosts)}/repo/apk/[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegExA.firstMatch(url); if (match == null) { RegExp standardUrlRegExB = RegExp( - '^https?://apt.${getSourceRegex(hosts)}/fdroid/index/apk/[^/]+', - caseSensitive: false); + '^https?://apt.${getSourceRegex(hosts)}/fdroid/index/apk/[^/]+', + caseSensitive: false, + ); match = standardUrlRegExB.firstMatch(url); } if (match == null) { @@ -32,8 +34,10 @@ class IzzyOnDroid extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return fd.tryInferringAppId(standardUrl); } @@ -44,12 +48,14 @@ class IzzyOnDroid extends AppSource { ) async { String? appId = await tryInferringAppId(standardUrl); return fd.getAPKUrlsFromFDroidPackagesAPIResponse( - await sourceRequest( - 'https://apt.izzysoft.de/fdroid/api/v1/packages/$appId', - additionalSettings), - 'https://android.izzysoft.de/frepo/$appId', - standardUrl, - name, - additionalSettings: additionalSettings); + await sourceRequest( + 'https://apt.izzysoft.de/fdroid/api/v1/packages/$appId', + additionalSettings, + ), + 'https://android.izzysoft.de/frepo/$appId', + standardUrl, + name, + additionalSettings: additionalSettings, + ); } } diff --git a/lib/app_sources/jenkins.dart b/lib/app_sources/jenkins.dart index 39a4f79..763eed6 100644 --- a/lib/app_sources/jenkins.dart +++ b/lib/app_sources/jenkins.dart @@ -31,14 +31,17 @@ class Jenkins extends AppSource { ) async { standardUrl = trimJobUrl(standardUrl); Response res = await sourceRequest( - '$standardUrl/lastSuccessfulBuild/api/json', additionalSettings); + '$standardUrl/lastSuccessfulBuild/api/json', + additionalSettings, + ); if (res.statusCode == 200) { var json = jsonDecode(res.body); var releaseDate = json['timestamp'] == null ? null : DateTime.fromMillisecondsSinceEpoch(json['timestamp'] as int); - var version = - json['number'] == null ? null : (json['number'] as int).toString(); + var version = json['number'] == null + ? null + : (json['number'] as int).toString(); if (version == null) { throw NoVersionError(); } @@ -51,16 +54,21 @@ class Jenkins extends AppSource { return path == null ? const MapEntry('', '') : MapEntry( - (e['fileName'] ?? e['relativePath']) as String, path); + (e['fileName'] ?? e['relativePath']) as String, + path, + ); }) - .where((url) => - url.value.isNotEmpty && url.key.toLowerCase().endsWith('.apk')) + .where( + (url) => + url.value.isNotEmpty && url.key.toLowerCase().endsWith('.apk'), + ) .toList(); return APKDetails( - version, - apkUrls, - releaseDate: releaseDate, - AppNames(Uri.parse(standardUrl).host, standardUrl.split('/').last)); + version, + apkUrls, + releaseDate: releaseDate, + AppNames(Uri.parse(standardUrl).host, standardUrl.split('/').last), + ); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/mullvad.dart b/lib/app_sources/mullvad.dart index 3980930..9838392 100644 --- a/lib/app_sources/mullvad.dart +++ b/lib/app_sources/mullvad.dart @@ -12,8 +12,9 @@ class Mullvad extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -31,7 +32,9 @@ class Mullvad extends AppSource { Map additionalSettings, ) async { Response res = await sourceRequest( - '$standardUrl/en/download/android', additionalSettings); + '$standardUrl/en/download/android', + additionalSettings, + ); if (res.statusCode == 200) { var versions = parse(res.body) .querySelectorAll('p') @@ -53,17 +56,18 @@ class Mullvad extends AppSource { String? changeLog; try { changeLog = (await GitHub().getLatestAPKDetails( - 'https://github.com/mullvad/mullvadvpn-app', - {'fallbackToOlderReleases': true})) - .changeLog; + 'https://github.com/mullvad/mullvadvpn-app', + {'fallbackToOlderReleases': true}, + )).changeLog; } catch (e) { // Ignore } return APKDetails( - versions[0], - getApkUrlsFromUrls(['https://mullvad.net/download/app/apk/latest']), - AppNames(name, 'Mullvad-VPN'), - changeLog: changeLog); + versions[0], + getApkUrlsFromUrls(['https://mullvad.net/download/app/apk/latest']), + AppNames(name, 'Mullvad-VPN'), + changeLog: changeLog, + ); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/neutroncode.dart b/lib/app_sources/neutroncode.dart index cc3d501..8efca3d 100644 --- a/lib/app_sources/neutroncode.dart +++ b/lib/app_sources/neutroncode.dart @@ -12,8 +12,9 @@ class NeutronCode extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/downloads/file/[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/downloads/file/[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -89,24 +90,31 @@ class NeutronCode extends AppSource { if (filename == null) { throw NoReleasesError(); } - var version = - http.querySelector('.pd-version-txt')?.nextElementSibling?.innerHtml; + var version = http + .querySelector('.pd-version-txt') + ?.nextElementSibling + ?.innerHtml; if (version == null) { throw NoVersionError(); } String? apkUrl = 'https://${hosts[0]}/download/$filename'; - var dateStringOriginal = - http.querySelector('.pd-date-txt')?.nextElementSibling?.innerHtml; + var dateStringOriginal = http + .querySelector('.pd-date-txt') + ?.nextElementSibling + ?.innerHtml; var dateString = dateStringOriginal != null ? (customDateParse(dateStringOriginal)) : null; var changeLogElements = http.querySelectorAll('.pd-fdesc p'); - return APKDetails(version, getApkUrlsFromUrls([apkUrl]), - AppNames(runtimeType.toString(), name ?? standardUrl.split('/').last), - releaseDate: dateString != null ? DateTime.parse(dateString) : null, - changeLog: changeLogElements.isNotEmpty - ? changeLogElements.last.innerHtml - : null); + return APKDetails( + version, + getApkUrlsFromUrls([apkUrl]), + AppNames(runtimeType.toString(), name ?? standardUrl.split('/').last), + releaseDate: dateString != null ? DateTime.parse(dateString) : null, + changeLog: changeLogElements.isNotEmpty + ? changeLogElements.last.innerHtml + : null, + ); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/rustore.dart b/lib/app_sources/rustore.dart index 6214dbe..22222d4 100644 --- a/lib/app_sources/rustore.dart +++ b/lib/app_sources/rustore.dart @@ -18,8 +18,9 @@ class RuStore extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/catalog/app/+[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/catalog/app/+[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -28,16 +29,18 @@ class RuStore extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return Uri.parse(standardUrl).pathSegments.last; } Future decodeString(String str) async { try { return (await CharsetDetector.autoDecode( - Uint8List.fromList(str.codeUnits))) - .string; + Uint8List.fromList(str.codeUnits), + )).string; } catch (e) { return str; } @@ -50,8 +53,9 @@ class RuStore extends AppSource { ) async { String? appId = await tryInferringAppId(standardUrl); Response res0 = await sourceRequest( - 'https://backapi.rustore.ru/applicationData/overallInfo/$appId', - additionalSettings); + 'https://backapi.rustore.ru/applicationData/overallInfo/$appId', + additionalSettings, + ); if (res0.statusCode != 200) { throw getObtainiumHttpError(res0); } @@ -74,10 +78,11 @@ class RuStore extends AppSource { } Response res1 = await sourceRequest( - 'https://backapi.rustore.ru/applicationData/download-link', - additionalSettings, - followRedirects: false, - postBody: {"appId": appDetails['appId'], "firstInstall": true}); + 'https://backapi.rustore.ru/applicationData/download-link', + additionalSettings, + followRedirects: false, + postBody: {"appId": appDetails['appId'], "firstInstall": true}, + ); var downloadDetails = jsonDecode(res1.body)['body']; if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) { throw NoAPKError(); @@ -88,13 +93,16 @@ class RuStore extends AppSource { changeLog = changeLog != null ? await decodeString(changeLog) : null; return APKDetails( - version, - getApkUrlsFromUrls([ - (downloadDetails['apkUrl'] as String) - .replaceAll(RegExp('\\.zip\$'), '.apk') - ]), - AppNames(author, appName), - releaseDate: relDate, - changeLog: changeLog); + version, + getApkUrlsFromUrls([ + (downloadDetails['apkUrl'] as String).replaceAll( + RegExp('\\.zip\$'), + '.apk', + ), + ]), + AppNames(author, appName), + releaseDate: relDate, + changeLog: changeLog, + ); } } diff --git a/lib/app_sources/sourceforge.dart b/lib/app_sources/sourceforge.dart index 50fc76a..5f04b0a 100644 --- a/lib/app_sources/sourceforge.dart +++ b/lib/app_sources/sourceforge.dart @@ -11,23 +11,27 @@ class SourceForge extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { var sourceRegex = getSourceRegex(hosts); - RegExp standardUrlRegExC = - RegExp('^https?://(www\\.)?$sourceRegex/p/.+', caseSensitive: false); + RegExp standardUrlRegExC = RegExp( + '^https?://(www\\.)?$sourceRegex/p/.+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegExC.firstMatch(url); if (match != null) { url = 'https://${Uri.parse(match.group(0)!).host}/projects/${url.substring(Uri.parse(match.group(0)!).host.length + '/projects/'.length + 1)}'; } RegExp standardUrlRegExB = RegExp( - '^https?://(www\\.)?$sourceRegex/projects/[^/]+', - caseSensitive: false); + '^https?://(www\\.)?$sourceRegex/projects/[^/]+', + caseSensitive: false, + ); match = standardUrlRegExB.firstMatch(url); if (match != null && match.group(0) == url) { url = '$url/files'; } RegExp standardUrlRegExA = RegExp( - '^https?://(www\\.)?$sourceRegex/projects/[^/]+/files(/.+)?', - caseSensitive: false); + '^https?://(www\\.)?$sourceRegex/projects/[^/]+/files(/.+)?', + caseSensitive: false, + ); match = standardUrlRegExA.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -46,8 +50,9 @@ class SourceForge extends AppSource { standardUri = Uri.parse(standardUrl); } Response res = await sourceRequest( - '${standardUri.origin}/${standardUri.pathSegments.sublist(0, 2).join('/')}/rss?path=/', - additionalSettings); + '${standardUri.origin}/${standardUri.pathSegments.sublist(0, 2).join('/')}/rss?path=/', + additionalSettings, + ); if (res.statusCode == 200) { var parsedHtml = parse(res.body); var allDownloadLinks = parsedHtml @@ -74,9 +79,10 @@ class SourceForge extends AppSource { if (version != null) { try { var extractedVersion = extractVersion( - additionalSettings['versionExtractionRegEx'] as String?, - additionalSettings['matchGroupToUse'] as String?, - version); + additionalSettings['versionExtractionRegEx'] as String?, + additionalSettings['matchGroupToUse'] as String?, + version, + ); if (extractedVersion != null) { version = extractedVersion; } @@ -111,8 +117,11 @@ class SourceForge extends AppSource { .where((element) => getVersion(element) == version) .toList(); var segments = standardUrl.split('/'); - return APKDetails(version, getApkUrlsFromUrls(apkUrlList), - AppNames(name, segments[segments.indexOf('files') - 1])); + return APKDetails( + version, + getApkUrlsFromUrls(apkUrlList), + AppNames(name, segments[segments.indexOf('files') - 1]), + ); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/sourcehut.dart b/lib/app_sources/sourcehut.dart index fbe423d..4aa7448 100644 --- a/lib/app_sources/sourcehut.dart +++ b/lib/app_sources/sourcehut.dart @@ -13,17 +13,21 @@ class SourceHut extends AppSource { additionalSourceAppSpecificSettingFormItems = [ [ - GeneratedFormSwitch('fallbackToOlderReleases', - label: tr('fallbackToOlderReleases'), defaultValue: true) - ] + GeneratedFormSwitch( + 'fallbackToOlderReleases', + label: tr('fallbackToOlderReleases'), + defaultValue: true, + ), + ], ]; } @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', - caseSensitive: false); + '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -52,8 +56,10 @@ class SourceHut extends AppSource { String appName = standardUri.pathSegments.last; bool fallbackToOlderReleases = additionalSettings['fallbackToOlderReleases'] == true; - Response res = - await sourceRequest('$standardUrl/refs/rss.xml', additionalSettings); + Response res = await sourceRequest( + '$standardUrl/refs/rss.xml', + additionalSettings, + ); if (res.statusCode == 200) { var parsedHtml = parse(res.body); List apkDetailsList = []; @@ -63,10 +69,10 @@ class SourceHut extends AppSource { ind++; String releasePage = // querySelector('link') fails for some reason entry - .querySelector('guid') // Luckily guid is identical - ?.innerHtml - .trim() ?? - ''; + .querySelector('guid') // Luckily guid is identical + ?.innerHtml + .trim() ?? + ''; if (!releasePage.startsWith('$standardUrl/refs')) { continue; } @@ -84,8 +90,9 @@ class SourceHut extends AppSource { ? DateFormat('E, dd MMM yyyy HH:mm:ss Z').parse(releaseDateString) : null; releaseDate = releaseDateString != null - ? DateFormat('EEE, dd MMM yyyy HH:mm:ss Z') - .parse(releaseDateString) + ? DateFormat( + 'EEE, dd MMM yyyy HH:mm:ss Z', + ).parse(releaseDateString) : null; } catch (e) { // ignore @@ -93,27 +100,35 @@ class SourceHut extends AppSource { var res2 = await sourceRequest(releasePage, additionalSettings); List> apkUrls = []; if (res2.statusCode == 200) { - apkUrls = getApkUrlsFromUrls(parse(res2.body) - .querySelectorAll('a') - .map((e) => e.attributes['href'] ?? '') - .where((e) => e.toLowerCase().endsWith('.apk')) - .map((e) => ensureAbsoluteUrl(e, standardUri)) - .toList()); + apkUrls = getApkUrlsFromUrls( + parse(res2.body) + .querySelectorAll('a') + .map((e) => e.attributes['href'] ?? '') + .where((e) => e.toLowerCase().endsWith('.apk')) + .map((e) => ensureAbsoluteUrl(e, standardUri)) + .toList(), + ); } - apkDetailsList.add(APKDetails( + apkDetailsList.add( + APKDetails( version, apkUrls, - AppNames(entry.querySelector('author')?.innerHtml.trim() ?? appName, - appName), - releaseDate: releaseDate)); + AppNames( + entry.querySelector('author')?.innerHtml.trim() ?? appName, + appName, + ), + releaseDate: releaseDate, + ), + ); } if (apkDetailsList.isEmpty) { throw NoReleasesError(); } if (fallbackToOlderReleases) { if (additionalSettings['trackOnly'] != true) { - apkDetailsList = - apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList(); + apkDetailsList = apkDetailsList + .where((e) => e.apkUrls.isNotEmpty) + .toList(); } if (apkDetailsList.isEmpty) { throw NoReleasesError(); diff --git a/lib/app_sources/telegramapp.dart b/lib/app_sources/telegramapp.dart index 3bdf307..943cb4c 100644 --- a/lib/app_sources/telegramapp.dart +++ b/lib/app_sources/telegramapp.dart @@ -20,12 +20,15 @@ class TelegramApp extends AppSource { String standardUrl, Map additionalSettings, ) async { - Response res = - await sourceRequest('https://t.me/s/TAndroidAPK', additionalSettings); + Response res = await sourceRequest( + 'https://t.me/s/TAndroidAPK', + additionalSettings, + ); if (res.statusCode == 200) { var http = parse(res.body); - var messages = - http.querySelectorAll('.tgme_widget_message_text.js-message_text'); + var messages = http.querySelectorAll( + '.tgme_widget_message_text.js-message_text', + ); var version = messages.isNotEmpty ? messages.last.innerHtml.split('\n').first.trim().split(' ').first : null; @@ -33,10 +36,9 @@ class TelegramApp extends AppSource { throw NoVersionError(); } String? apkUrl = 'https://telegram.org/dl/android/apk'; - return APKDetails( - version, - [MapEntry('telegram-$version.apk', apkUrl)], - AppNames('Telegram', 'Telegram')); + return APKDetails(version, [ + MapEntry('telegram-$version.apk', apkUrl), + ], AppNames('Telegram', 'Telegram')); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/tencent.dart b/lib/app_sources/tencent.dart index 3e85301..1fa3ac0 100644 --- a/lib/app_sources/tencent.dart +++ b/lib/app_sources/tencent.dart @@ -15,8 +15,9 @@ class Tencent extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://${getSourceRegex(hosts)}/appdetail/[^/]+', - caseSensitive: false); + '^https?://${getSourceRegex(hosts)}/appdetail/[^/]+', + caseSensitive: false, + ); var match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -25,8 +26,10 @@ class Tencent extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return Uri.parse(standardUrl).pathSegments.last; } @@ -36,18 +39,16 @@ class Tencent extends AppSource { Map additionalSettings, ) async { String appId = (await tryInferringAppId(standardUrl))!; - String baseHost = Uri.parse(standardUrl) - .host - .split('.') - .reversed - .toList() - .sublist(0, 2) - .reversed - .join('.'); + String baseHost = Uri.parse( + standardUrl, + ).host.split('.').reversed.toList().sublist(0, 2).reversed.join('.'); var res = await sourceRequest( - 'https://upage.html5.$baseHost/wechat-apkinfo', additionalSettings, - followRedirects: false, postBody: {"packagename": appId}); + 'https://upage.html5.$baseHost/wechat-apkinfo', + additionalSettings, + followRedirects: false, + postBody: {"packagename": appId}, + ); if (res.statusCode == 200) { var json = jsonDecode(res.body); @@ -64,14 +65,18 @@ class Tencent extends AppSource { var author = json['app_detail_records'][appId]['app_info']['author']; var releaseDate = json['app_detail_records'][appId]['app_info']['update_time']; - var apkName = Uri.parse(apkUrl).queryParameters['fsname'] ?? + var apkName = + Uri.parse(apkUrl).queryParameters['fsname'] ?? '${appId}_$version.apk'; return APKDetails( - version, [MapEntry(apkName, apkUrl)], AppNames(author, appName), - releaseDate: releaseDate != null - ? DateTime.fromMillisecondsSinceEpoch(releaseDate * 1000) - : null); + version, + [MapEntry(apkName, apkUrl)], + AppNames(author, appName), + releaseDate: releaseDate != null + ? DateTime.fromMillisecondsSinceEpoch(releaseDate * 1000) + : null, + ); } else { throw getObtainiumHttpError(res); } diff --git a/lib/app_sources/uptodown.dart b/lib/app_sources/uptodown.dart index 134b64c..3dbee4c 100644 --- a/lib/app_sources/uptodown.dart +++ b/lib/app_sources/uptodown.dart @@ -30,8 +30,9 @@ class Uptodown extends AppSource { @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( - '^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}', - caseSensitive: false); + '^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}', + caseSensitive: false, + ); RegExpMatch? match = standardUrlRegEx.firstMatch(url); if (match == null) { throw InvalidURLError(name); @@ -40,14 +41,20 @@ class Uptodown extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return (await getAppDetailsFromPage( - standardUrl, additionalSettings))['appId']; + standardUrl, + additionalSettings, + ))['appId']; } Future> getAppDetailsFromPage( - String standardUrl, Map additionalSettings) async { + String standardUrl, + Map additionalSettings, + ) async { var res = await sourceRequest(standardUrl, additionalSettings); if (res.statusCode != 200) { throw getObtainiumHttpError(res); @@ -63,8 +70,9 @@ class Uptodown extends AppSource { .toList(); String? appId = detailElements.elementAtOrNull(0); String? dateStr = detailElements.elementAtOrNull(6); - String? fileId = - html.querySelector('#detail-app-name')?.attributes['data-file-id']; + String? fileId = html + .querySelector('#detail-app-name') + ?.attributes['data-file-id']; String? extension = detailElements.elementAtOrNull(7)?.toLowerCase(); return Map.fromEntries([ MapEntry('version', version), @@ -73,7 +81,7 @@ class Uptodown extends AppSource { MapEntry('author', author), MapEntry('dateStr', dateStr), MapEntry('fileId', fileId), - MapEntry('extension', extension) + MapEntry('extension', extension), ]); } @@ -82,8 +90,10 @@ class Uptodown extends AppSource { String standardUrl, Map additionalSettings, ) async { - var appDetails = - await getAppDetailsFromPage(standardUrl, additionalSettings); + var appDetails = await getAppDetailsFromPage( + standardUrl, + additionalSettings, + ); var version = appDetails['version']; var appId = appDetails['appId']; var fileId = appDetails['fileId']; @@ -105,21 +115,28 @@ class Uptodown extends AppSource { if (dateStr != null) { relDate = parseDateTimeMMMddCommayyyy(dateStr); } - return APKDetails(version, [MapEntry('$appId.$extension', apkUrl)], - AppNames(author, appName), - releaseDate: relDate); + return APKDetails( + version, + [MapEntry('$appId.$extension', apkUrl)], + AppNames(author, appName), + releaseDate: relDate, + ); } @override - Future apkUrlPrefetchModifier(String apkUrl, String standardUrl, - Map additionalSettings) async { + Future apkUrlPrefetchModifier( + String apkUrl, + String standardUrl, + Map additionalSettings, + ) async { var res = await sourceRequest(apkUrl, additionalSettings); if (res.statusCode != 200) { throw getObtainiumHttpError(res); } var html = parse(res.body); - var finalUrlKey = - html.querySelector('#detail-download-button')?.attributes['data-url']; + var finalUrlKey = html + .querySelector('#detail-download-button') + ?.attributes['data-url']; if (finalUrlKey == null) { throw NoAPKError(); } diff --git a/lib/app_sources/vivoappstore.dart b/lib/app_sources/vivoappstore.dart index 68f41cd..278ca3c 100644 --- a/lib/app_sources/vivoappstore.dart +++ b/lib/app_sources/vivoappstore.dart @@ -23,15 +23,19 @@ class VivoAppStore extends AppSource { } @override - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { var json = await getDetailJson(standardUrl, additionalSettings); return json['package_name']; } @override Future getLatestAPKDetails( - String standardUrl, Map additionalSettings) async { + String standardUrl, + Map additionalSettings, + ) async { var json = await getDetailJson(standardUrl, additionalSettings); var appName = json['title_zh'].toString(); var packageName = json['package_name'].toString(); @@ -42,13 +46,18 @@ class VivoAppStore extends AppSource { var apkUrl = json['download_url'].toString(); var apkName = '${packageName}_$versionCode.apk'; return APKDetails( - versionName, [MapEntry(apkName, apkUrl)], AppNames(developer, appName), - releaseDate: DateTime.parse(uploadTime)); + versionName, + [MapEntry(apkName, apkUrl)], + AppNames(developer, appName), + releaseDate: DateTime.parse(uploadTime), + ); } @override - Future>> search(String query, - {Map querySettings = const {}}) async { + Future>> search( + String query, { + Map querySettings = const {}, + }) async { var apiBaseUrl = 'https://h5-api.appstore.vivo.com.cn/h5appstore/search/result-list?app_version=2100&page_index=1&apps_per_page=20&target=local&cfrom=2&key='; var searchUrl = '$apiBaseUrl${Uri.encodeQueryComponent(query)}'; @@ -65,14 +74,16 @@ class VivoAppStore extends AppSource { for (var item in (resultsJson as List)) { results['$appDetailUrl${item['id']}'] = [ item['title_zh'].toString(), - item['developer'].toString() + item['developer'].toString(), ]; } return results; } Future> getDetailJson( - String standardUrl, Map additionalSettings) async { + String standardUrl, + Map additionalSettings, + ) async { var vivoAppId = parseVivoAppId(standardUrl); var apiBaseUrl = 'https://h5-api.appstore.vivo.com.cn/detail/'; var params = '?frompage=messageh5&app_version=2100'; diff --git a/lib/components/custom_app_bar.dart b/lib/components/custom_app_bar.dart index 47e08d2..425883f 100644 --- a/lib/components/custom_app_bar.dart +++ b/lib/components/custom_app_bar.dart @@ -20,8 +20,9 @@ class _CustomAppBarState extends State { titlePadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16), title: Text( widget.title, - style: - TextStyle(color: Theme.of(context).textTheme.bodyMedium!.color), + style: TextStyle( + color: Theme.of(context).textTheme.bodyMedium!.color, + ), ), ), ); diff --git a/lib/components/generated_form.dart b/lib/components/generated_form.dart index e9dcc0b..27c2db5 100644 --- a/lib/components/generated_form.dart +++ b/lib/components/generated_form.dart @@ -16,11 +16,13 @@ abstract class GeneratedFormItem { dynamic ensureType(dynamic val); GeneratedFormItem clone(); - GeneratedFormItem(this.key, - {this.label = 'Input', - this.belowWidgets = const [], - this.defaultValue, - this.additionalValidators = const []}); + GeneratedFormItem( + this.key, { + this.label = 'Input', + this.belowWidgets = const [], + this.defaultValue, + this.additionalValidators = const [], + }); } class GeneratedFormTextField extends GeneratedFormItem { @@ -31,18 +33,19 @@ class GeneratedFormTextField extends GeneratedFormItem { late TextInputType? textInputType; late List? autoCompleteOptions; - GeneratedFormTextField(super.key, - {super.label, - super.belowWidgets, - String super.defaultValue = '', - List super.additionalValidators = - const [], - this.required = true, - this.max = 1, - this.hint, - this.password = false, - this.textInputType, - this.autoCompleteOptions}); + GeneratedFormTextField( + super.key, { + super.label, + super.belowWidgets, + String super.defaultValue = '', + List super.additionalValidators = const [], + this.required = true, + this.max = 1, + this.hint, + this.password = false, + this.textInputType, + this.autoCompleteOptions, + }); @override String ensureType(val) { @@ -51,16 +54,18 @@ class GeneratedFormTextField extends GeneratedFormItem { @override GeneratedFormTextField clone() { - return GeneratedFormTextField(key, - label: label, - belowWidgets: belowWidgets, - defaultValue: defaultValue, - additionalValidators: List.from(additionalValidators), - required: required, - max: max, - hint: hint, - password: password, - textInputType: textInputType); + return GeneratedFormTextField( + key, + label: label, + belowWidgets: belowWidgets, + defaultValue: defaultValue, + additionalValidators: List.from(additionalValidators), + required: required, + max: max, + hint: hint, + password: password, + textInputType: textInputType, + ); } } @@ -91,8 +96,9 @@ class GeneratedFormDropdown extends GeneratedFormItem { label: label, belowWidgets: belowWidgets, defaultValue: defaultValue, - disabledOptKeys: - disabledOptKeys != null ? List.from(disabledOptKeys!) : null, + disabledOptKeys: disabledOptKeys != null + ? List.from(disabledOptKeys!) + : null, additionalValidators: List.from(additionalValidators), ); } @@ -117,12 +123,14 @@ class GeneratedFormSwitch extends GeneratedFormItem { @override GeneratedFormSwitch clone() { - return GeneratedFormSwitch(key, - label: label, - belowWidgets: belowWidgets, - defaultValue: defaultValue, - disabled: false, - additionalValidators: List.from(additionalValidators)); + return GeneratedFormSwitch( + key, + label: label, + belowWidgets: belowWidgets, + defaultValue: defaultValue, + disabled: false, + additionalValidators: List.from(additionalValidators), + ); } } @@ -132,17 +140,20 @@ class GeneratedFormTagInput extends GeneratedFormItem { late WrapAlignment alignment; late String emptyMessage; late bool showLabelWhenNotEmpty; - GeneratedFormTagInput(super.key, - {super.label, - super.belowWidgets, - Map> super.defaultValue = const {}, - List> value)> - super.additionalValidators = const [], - this.deleteConfirmationMessage, - this.singleSelect = false, - this.alignment = WrapAlignment.start, - this.emptyMessage = 'Input', - this.showLabelWhenNotEmpty = true}); + GeneratedFormTagInput( + super.key, { + super.label, + super.belowWidgets, + Map> super.defaultValue = const {}, + List> value)> + super.additionalValidators = + const [], + this.deleteConfirmationMessage, + this.singleSelect = false, + this.alignment = WrapAlignment.start, + this.emptyMessage = 'Input', + this.showLabelWhenNotEmpty = true, + }); @override Map> ensureType(val) { @@ -151,25 +162,30 @@ class GeneratedFormTagInput extends GeneratedFormItem { @override GeneratedFormTagInput clone() { - return GeneratedFormTagInput(key, - label: label, - belowWidgets: belowWidgets, - defaultValue: defaultValue, - additionalValidators: List.from(additionalValidators), - deleteConfirmationMessage: deleteConfirmationMessage, - singleSelect: singleSelect, - alignment: alignment, - emptyMessage: emptyMessage, - showLabelWhenNotEmpty: showLabelWhenNotEmpty); + return GeneratedFormTagInput( + key, + label: label, + belowWidgets: belowWidgets, + defaultValue: defaultValue, + additionalValidators: List.from(additionalValidators), + deleteConfirmationMessage: deleteConfirmationMessage, + singleSelect: singleSelect, + alignment: alignment, + emptyMessage: emptyMessage, + showLabelWhenNotEmpty: showLabelWhenNotEmpty, + ); } } -typedef OnValueChanges = void Function( - Map values, bool valid, bool isBuilding); +typedef OnValueChanges = + void Function(Map values, bool valid, bool isBuilding); class GeneratedForm extends StatefulWidget { - const GeneratedForm( - {super.key, required this.items, required this.onValueChanges}); + const GeneratedForm({ + super.key, + required this.items, + required this.onValueChanges, + }); final List> items; final OnValueChanges onValueChanges; @@ -179,7 +195,8 @@ class GeneratedForm extends StatefulWidget { } List> cloneFormItems( - List> items) { + List> items, +) { List> clonedItems = []; for (var row in items) { List clonedRow = []; @@ -194,8 +211,13 @@ List> cloneFormItems( class GeneratedFormSubForm extends GeneratedFormItem { final List> items; - GeneratedFormSubForm(super.key, this.items, - {super.label, super.belowWidgets, super.defaultValue = const []}); + GeneratedFormSubForm( + super.key, + this.items, { + super.label, + super.belowWidgets, + super.defaultValue = const [], + }); @override ensureType(val) { @@ -204,8 +226,13 @@ class GeneratedFormSubForm extends GeneratedFormItem { @override GeneratedFormSubForm clone() { - return GeneratedFormSubForm(key, cloneFormItems(items), - label: label, belowWidgets: belowWidgets, defaultValue: defaultValue); + return GeneratedFormSubForm( + key, + cloneFormItems(items), + label: label, + belowWidgets: belowWidgets, + defaultValue: defaultValue, + ); } } @@ -220,13 +247,18 @@ Color generateRandomLightColor() { // Map from HPLuv color space to RGB, use constant saturation=100, lightness=70 final List rgbValuesDbl = Hsluv.hpluvToRgb([hue, 100, 70]); // Map RBG values from 0-1 to 0-255: - final List rgbValues = - rgbValuesDbl.map((rgb) => (rgb * 255).toInt()).toList(); + final List rgbValues = rgbValuesDbl + .map((rgb) => (rgb * 255).toInt()) + .toList(); return Color.fromARGB(255, rgbValues[0], rgbValues[1], rgbValues[2]); } -int generateRandomNumber(int seed1, - {int seed2 = 0, int seed3 = 0, max = 10000}) { +int generateRandomNumber( + int seed1, { + int seed2 = 0, + int seed3 = 0, + max = 10000, +}) { int combinedSeed = seed1.hashCode ^ seed2.hashCode ^ seed3.hashCode; Random random = Random(combinedSeed); int randomNumber = random.nextInt(max); @@ -297,9 +329,9 @@ class _GeneratedFormState extends State { }); }, decoration: InputDecoration( - helperText: - formItem.label + (formItem.required ? ' *' : ''), - hintText: formItem.hint), + helperText: formItem.label + (formItem.required ? ' *' : ''), + hintText: formItem.hint, + ), minLines: formItem.max <= 1 ? null : formItem.max, maxLines: formItem.max <= 1 ? 1 : formItem.max, validator: (value) { @@ -339,23 +371,26 @@ class _GeneratedFormState extends State { return Text(tr('dropdownNoOptsError')); } return DropdownButtonFormField( - decoration: InputDecoration(labelText: formItem.label), - value: values[formItem.key], - items: formItem.opts!.map((e2) { - var enabled = - formItem.disabledOptKeys?.contains(e2.key) != true; - return DropdownMenuItem( - value: e2.key, - enabled: enabled, - child: Opacity( - opacity: enabled ? 1 : 0.5, child: Text(e2.value))); - }).toList(), - onChanged: (value) { - setState(() { - values[formItem.key] = value ?? formItem.opts!.first.key; - someValueChanged(); - }); + decoration: InputDecoration(labelText: formItem.label), + value: values[formItem.key], + items: formItem.opts!.map((e2) { + var enabled = formItem.disabledOptKeys?.contains(e2.key) != true; + return DropdownMenuItem( + value: e2.key, + enabled: enabled, + child: Opacity( + opacity: enabled ? 1 : 0.5, + child: Text(e2.value), + ), + ); + }).toList(), + onChanged: (value) { + setState(() { + values[formItem.key] = value ?? formItem.opts!.first.key; + someValueChanged(); }); + }, + ); } else if (formItem is GeneratedFormSubForm) { values[formItem.key] = []; for (Map v @@ -394,33 +429,33 @@ class _GeneratedFormState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Flexible(child: Text(widget.items[r][e].label)), - const SizedBox( - width: 8, - ), + const SizedBox(width: 8), Switch( - value: values[fieldKey], - onChanged: - (widget.items[r][e] as GeneratedFormSwitch).disabled - ? null - : (value) { - setState(() { - values[fieldKey] = value; - someValueChanged(); - }); - }) + value: values[fieldKey], + onChanged: (widget.items[r][e] as GeneratedFormSwitch).disabled + ? null + : (value) { + setState(() { + values[fieldKey] = value; + someValueChanged(); + }); + }, + ), ], ); } else if (widget.items[r][e] is GeneratedFormTagInput) { onAddPressed() { showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: widget.items[r][e].label, - items: [ - [GeneratedFormTextField('label', label: tr('label'))] - ]); - }).then((value) { + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: widget.items[r][e].label, + items: [ + [GeneratedFormTextField('label', label: tr('label'))], + ], + ); + }, + ).then((value) { String? label = value?['label']; if (label != null) { setState(() { @@ -434,8 +469,10 @@ class _GeneratedFormState extends State { var someSelected = temp.entries .where((element) => element.value.value) .isNotEmpty; - temp[label] = MapEntry(generateRandomLightColor().value, - !(someSelected && singleSelect)); + temp[label] = MapEntry( + generateRandomLightColor().value, + !(someSelected && singleSelect), + ); values[fieldKey] = temp; someValueChanged(); } @@ -444,236 +481,274 @@ class _GeneratedFormState extends State { }); } - formInputs[r][e] = - Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - if ((values[fieldKey] as Map>?) - ?.isNotEmpty == - true && - (widget.items[r][e] as GeneratedFormTagInput) - .showLabelWhenNotEmpty) - Column( - crossAxisAlignment: - (widget.items[r][e] as GeneratedFormTagInput).alignment == - WrapAlignment.center - ? CrossAxisAlignment.center - : CrossAxisAlignment.stretch, + formInputs[r][e] = Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if ((values[fieldKey] as Map>?) + ?.isNotEmpty == + true && + (widget.items[r][e] as GeneratedFormTagInput) + .showLabelWhenNotEmpty) + Column( + crossAxisAlignment: + (widget.items[r][e] as GeneratedFormTagInput).alignment == + WrapAlignment.center + ? CrossAxisAlignment.center + : CrossAxisAlignment.stretch, + children: [ + Text(widget.items[r][e].label), + const SizedBox(height: 8), + ], + ), + Wrap( + alignment: + (widget.items[r][e] as GeneratedFormTagInput).alignment, + crossAxisAlignment: WrapCrossAlignment.center, children: [ - Text(widget.items[r][e].label), - const SizedBox( - height: 8, - ), - ], - ), - Wrap( - alignment: - (widget.items[r][e] as GeneratedFormTagInput).alignment, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - // (values[fieldKey] as Map>?) - // ?.isEmpty == - // true - // ? Text( - // (widget.items[r][e] as GeneratedFormTagInput) - // .emptyMessage, - // ) - // : const SizedBox.shrink(), - ...(values[fieldKey] as Map>?) - ?.entries - .map((e2) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: ChoiceChip( - label: Text(e2.key), - backgroundColor: Color(e2.value.key).withAlpha(50), - selectedColor: Color(e2.value.key), - visualDensity: VisualDensity.compact, - selected: e2.value.value, - onSelected: (value) { - setState(() { - (values[fieldKey] as Map>)[e2.key] = - MapEntry( - (values[fieldKey] as Map>)[e2.key]! - .key, - value); - if ((widget.items[r][e] - as GeneratedFormTagInput) - .singleSelect && - value == true) { - for (var key in (values[fieldKey] - as Map>) - .keys) { - if (key != e2.key) { - (values[fieldKey] as Map< - String, - MapEntry>)[key] = MapEntry( - (values[fieldKey] as Map>)[key]! - .key, - false); + // (values[fieldKey] as Map>?) + // ?.isEmpty == + // true + // ? Text( + // (widget.items[r][e] as GeneratedFormTagInput) + // .emptyMessage, + // ) + // : const SizedBox.shrink(), + ...(values[fieldKey] as Map>?) + ?.entries + .map((e2) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4, + ), + child: ChoiceChip( + label: Text(e2.key), + backgroundColor: Color( + e2.value.key, + ).withAlpha(50), + selectedColor: Color(e2.value.key), + visualDensity: VisualDensity.compact, + selected: e2.value.value, + onSelected: (value) { + setState(() { + (values[fieldKey] + as Map>)[e2 + .key] = MapEntry( + (values[fieldKey] + as Map< + String, + MapEntry + >)[e2.key]! + .key, + value, + ); + if ((widget.items[r][e] + as GeneratedFormTagInput) + .singleSelect && + value == true) { + for (var key + in (values[fieldKey] + as Map< + String, + MapEntry + >) + .keys) { + if (key != e2.key) { + (values[fieldKey] + as Map< + String, + MapEntry + >)[key] = MapEntry( + (values[fieldKey] + as Map< + String, + MapEntry + >)[key]! + .key, + false, + ); + } + } } - } - } - someValueChanged(); - }); - }, - )); - }) ?? - [const SizedBox.shrink()], - (values[fieldKey] as Map>?) - ?.values - .where((e) => e.value) - .length == - 1 - ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: IconButton( - onPressed: () { - setState(() { - var temp = values[fieldKey] - as Map>; - // get selected category str where bool is true - final oldEntry = temp.entries - .firstWhere((entry) => entry.value.value); - // generate new color, ensure it is not the same - int newColor = oldEntry.value.key; - while (oldEntry.value.key == newColor) { - newColor = generateRandomLightColor().value; - } - // Update entry with new color, remain selected - temp.update(oldEntry.key, - (old) => MapEntry(newColor, old.value)); - values[fieldKey] = temp; - someValueChanged(); - }); - }, - icon: const Icon(Icons.format_color_fill_rounded), - visualDensity: VisualDensity.compact, - tooltip: tr('colour'), - )) - : const SizedBox.shrink(), - (values[fieldKey] as Map>?) - ?.values - .where((e) => e.value) - .isNotEmpty == - true - ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: IconButton( - onPressed: () { - fn() { + someValueChanged(); + }); + }, + ), + ); + }) ?? + [const SizedBox.shrink()], + (values[fieldKey] as Map>?) + ?.values + .where((e) => e.value) + .length == + 1 + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: IconButton( + onPressed: () { setState(() { - var temp = values[fieldKey] - as Map>; - temp.removeWhere((key, value) => value.value); + var temp = + values[fieldKey] + as Map>; + // get selected category str where bool is true + final oldEntry = temp.entries.firstWhere( + (entry) => entry.value.value, + ); + // generate new color, ensure it is not the same + int newColor = oldEntry.value.key; + while (oldEntry.value.key == newColor) { + newColor = generateRandomLightColor().value; + } + // Update entry with new color, remain selected + temp.update( + oldEntry.key, + (old) => MapEntry(newColor, old.value), + ); values[fieldKey] = temp; someValueChanged(); }); - } + }, + icon: const Icon(Icons.format_color_fill_rounded), + visualDensity: VisualDensity.compact, + tooltip: tr('colour'), + ), + ) + : const SizedBox.shrink(), + (values[fieldKey] as Map>?) + ?.values + .where((e) => e.value) + .isNotEmpty == + true + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: IconButton( + onPressed: () { + fn() { + setState(() { + var temp = + values[fieldKey] + as Map>; + temp.removeWhere((key, value) => value.value); + values[fieldKey] = temp; + someValueChanged(); + }); + } - if ((widget.items[r][e] as GeneratedFormTagInput) - .deleteConfirmationMessage != - null) { - var message = - (widget.items[r][e] as GeneratedFormTagInput) - .deleteConfirmationMessage!; - showDialog?>( + if ((widget.items[r][e] as GeneratedFormTagInput) + .deleteConfirmationMessage != + null) { + var message = + (widget.items[r][e] + as GeneratedFormTagInput) + .deleteConfirmationMessage!; + showDialog?>( context: context, builder: (BuildContext ctx) { return GeneratedFormModal( - title: message.key, - message: message.value, - items: const []); - }).then((value) { - if (value != null) { - fn(); - } - }); - } else { - fn(); - } - }, - icon: const Icon(Icons.remove), - visualDensity: VisualDensity.compact, - tooltip: tr('remove'), - )) - : const SizedBox.shrink(), - (values[fieldKey] as Map>?) - ?.isEmpty == - true - ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: TextButton.icon( - onPressed: onAddPressed, - icon: const Icon(Icons.add), - label: Text( + title: message.key, + message: message.value, + items: const [], + ); + }, + ).then((value) { + if (value != null) { + fn(); + } + }); + } else { + fn(); + } + }, + icon: const Icon(Icons.remove), + visualDensity: VisualDensity.compact, + tooltip: tr('remove'), + ), + ) + : const SizedBox.shrink(), + (values[fieldKey] as Map>?) + ?.isEmpty == + true + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: TextButton.icon( + onPressed: onAddPressed, + icon: const Icon(Icons.add), + label: Text( (widget.items[r][e] as GeneratedFormTagInput) - .label), - )) - : Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: IconButton( - onPressed: onAddPressed, - icon: const Icon(Icons.add), - visualDensity: VisualDensity.compact, - tooltip: tr('add'), - )), - ], - ) - ]); + .label, + ), + ), + ) + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: IconButton( + onPressed: onAddPressed, + icon: const Icon(Icons.add), + visualDensity: VisualDensity.compact, + tooltip: tr('add'), + ), + ), + ], + ), + ], + ); } else if (widget.items[r][e] is GeneratedFormSubForm) { List subformColumn = []; - var compact = (widget.items[r][e] as GeneratedFormSubForm) - .items - .length == - 1 && + var compact = + (widget.items[r][e] as GeneratedFormSubForm).items.length == 1 && (widget.items[r][e] as GeneratedFormSubForm).items[0].length == 1; for (int i = 0; i < values[fieldKey].length; i++) { - var internalFormKey = ValueKey(generateRandomNumber( + var internalFormKey = ValueKey( + generateRandomNumber( values[fieldKey].length, seed2: i, - seed3: forceUpdateKeyCount)); - subformColumn.add(Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!compact) - const SizedBox( - height: 16, + seed3: forceUpdateKeyCount, + ), + ); + subformColumn.add( + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!compact) const SizedBox(height: 16), + if (!compact) + Text( + '${(widget.items[r][e] as GeneratedFormSubForm).label} (${i + 1})', + style: const TextStyle(fontWeight: FontWeight.bold), + ), + GeneratedForm( + key: internalFormKey, + items: + cloneFormItems( + (widget.items[r][e] as GeneratedFormSubForm) + .items, + ) + .map( + (x) => x.map((y) { + y.defaultValue = values[fieldKey]?[i]?[y.key]; + y.key = '${y.key.toString()},$internalFormKey'; + return y; + }).toList(), + ) + .toList(), + onValueChanges: (values, valid, isBuilding) { + values = values.map( + (key, value) => MapEntry(key.split(',')[0], value), + ); + if (valid) { + this.values[fieldKey]?[i] = values; + } + someValueChanged( + isBuilding: isBuilding, + forceInvalid: !valid, + ); + }, ), - if (!compact) - Text( - '${(widget.items[r][e] as GeneratedFormSubForm).label} (${i + 1})', - style: const TextStyle(fontWeight: FontWeight.bold), - ), - GeneratedForm( - key: internalFormKey, - items: cloneFormItems( - (widget.items[r][e] as GeneratedFormSubForm).items) - .map((x) => x.map((y) { - y.defaultValue = values[fieldKey]?[i]?[y.key]; - y.key = '${y.key.toString()},$internalFormKey'; - return y; - }).toList()) - .toList(), - onValueChanges: (values, valid, isBuilding) { - values = values.map( - (key, value) => MapEntry(key.split(',')[0], value)); - if (valid) { - this.values[fieldKey]?[i] = values; - } - someValueChanged( - isBuilding: isBuilding, forceInvalid: !valid); - }, - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton.icon( + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton.icon( style: TextButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.error), + foregroundColor: Theme.of(context).colorScheme.error, + ), onPressed: (values[fieldKey].length > 0) ? () { var temp = List.from(values[fieldKey]); @@ -686,33 +761,40 @@ class _GeneratedFormState extends State { label: Text( '${(widget.items[r][e] as GeneratedFormSubForm).label} (${i + 1})', ), - icon: const Icon( - Icons.delete_outline_rounded, - )) - ], - ) - ], - )); + icon: const Icon(Icons.delete_outline_rounded), + ), + ], + ), + ], + ), + ); } - subformColumn.add(Padding( - padding: const EdgeInsets.only(bottom: 0, top: 8), - child: Row( - children: [ - Expanded( + subformColumn.add( + Padding( + padding: const EdgeInsets.only(bottom: 0, top: 8), + child: Row( + children: [ + Expanded( child: ElevatedButton.icon( - onPressed: () { - values[fieldKey].add(getDefaultValuesFromFormItems( - (widget.items[r][e] as GeneratedFormSubForm) - .items)); - forceUpdateKeyCount++; - someValueChanged(); - }, - icon: const Icon(Icons.add), - label: Text((widget.items[r][e] as GeneratedFormSubForm) - .label))), - ], + onPressed: () { + values[fieldKey].add( + getDefaultValuesFromFormItems( + (widget.items[r][e] as GeneratedFormSubForm).items, + ), + ); + forceUpdateKeyCount++; + someValueChanged(); + }, + icon: const Icon(Icons.add), + label: Text( + (widget.items[r][e] as GeneratedFormSubForm).label, + ), + ), + ), + ], + ), ), - )); + ); formInputs[r][e] = Column(children: subformColumn); } } @@ -726,38 +808,43 @@ class _GeneratedFormState extends State { height: widget.items[rowInputs.key - 1][0] is GeneratedFormSwitch ? 8 : 25, - ) + ), ]); } List rowItems = []; rowInputs.value.asMap().entries.forEach((rowInput) { if (rowInput.key > 0) { - rowItems.add(const SizedBox( - width: 20, - )); + rowItems.add(const SizedBox(width: 20)); } - rowItems.add(Expanded( + rowItems.add( + Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - rowInput.value, - ...widget.items[rowInputs.key][rowInput.key].belowWidgets - ]))); + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + rowInput.value, + ...widget.items[rowInputs.key][rowInput.key].belowWidgets, + ], + ), + ), + ); }); rows.add(rowItems); }); return Form( - key: _formKey, - child: Column( - children: [ - ...rows.map((row) => Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [...row.map((e) => e)], - )) - ], - )); + key: _formKey, + child: Column( + children: [ + ...rows.map( + (row) => Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [...row.map((e) => e)], + ), + ), + ], + ), + ); } } diff --git a/lib/components/generated_form_modal.dart b/lib/components/generated_form_modal.dart index 838b187..118cba2 100644 --- a/lib/components/generated_form_modal.dart +++ b/lib/components/generated_form_modal.dart @@ -4,15 +4,16 @@ import 'package:flutter/services.dart'; import 'package:obtainium/components/generated_form.dart'; class GeneratedFormModal extends StatefulWidget { - const GeneratedFormModal( - {super.key, - required this.title, - required this.items, - this.initValid = false, - this.message = '', - this.additionalWidgets = const [], - this.singleNullReturnButton, - this.primaryActionColour}); + const GeneratedFormModal({ + super.key, + required this.title, + required this.items, + this.initValid = false, + this.message = '', + this.additionalWidgets = const [], + this.singleNullReturnButton, + this.primaryActionColour, + }); final String title; final String message; @@ -41,14 +42,12 @@ class _GeneratedFormModalState extends State { return AlertDialog( scrollable: true, title: Text(widget.title), - content: - Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - if (widget.message.isNotEmpty) Text(widget.message), - if (widget.message.isNotEmpty) - const SizedBox( - height: 16, - ), - GeneratedForm( + content: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (widget.message.isNotEmpty) Text(widget.message), + if (widget.message.isNotEmpty) const SizedBox(height: 16), + GeneratedForm( items: widget.items, onValueChanges: (values, valid, isBuilding) { if (isBuilding) { @@ -60,23 +59,29 @@ class _GeneratedFormModalState extends State { this.valid = valid; }); } - }), - if (widget.additionalWidgets.isNotEmpty) ...widget.additionalWidgets - ]), + }, + ), + if (widget.additionalWidgets.isNotEmpty) ...widget.additionalWidgets, + ], + ), actions: [ TextButton( - onPressed: () { - Navigator.of(context).pop(null); - }, - child: Text(widget.singleNullReturnButton == null + onPressed: () { + Navigator.of(context).pop(null); + }, + child: Text( + widget.singleNullReturnButton == null ? tr('cancel') - : widget.singleNullReturnButton!)), + : widget.singleNullReturnButton!, + ), + ), widget.singleNullReturnButton == null ? TextButton( style: widget.primaryActionColour == null ? null : TextButton.styleFrom( - foregroundColor: widget.primaryActionColour), + foregroundColor: widget.primaryActionColour, + ), onPressed: !valid ? null : () { @@ -85,8 +90,9 @@ class _GeneratedFormModalState extends State { Navigator.of(context).pop(values); } }, - child: Text(tr('continue'))) - : const SizedBox.shrink() + child: Text(tr('continue')), + ) + : const SizedBox.shrink(), ], ); } diff --git a/lib/custom_errors.dart b/lib/custom_errors.dart index 529f5fa..0ecdf74 100644 --- a/lib/custom_errors.dart +++ b/lib/custom_errors.dart @@ -20,23 +20,24 @@ class ObtainiumError { class RateLimitError extends ObtainiumError { late int remainingMinutes; RateLimitError(this.remainingMinutes) - : super(plural('tooManyRequestsTryAgainInMinutes', remainingMinutes)); + : super(plural('tooManyRequestsTryAgainInMinutes', remainingMinutes)); } class InvalidURLError extends ObtainiumError { InvalidURLError(String sourceName) - : super(tr('invalidURLForSource', args: [sourceName])); + : super(tr('invalidURLForSource', args: [sourceName])); } class CredsNeededError extends ObtainiumError { CredsNeededError(String sourceName) - : super(tr('requiresCredentialsInSettings', args: [sourceName])); + : super(tr('requiresCredentialsInSettings', args: [sourceName])); } class NoReleasesError extends ObtainiumError { NoReleasesError({String? note}) - : super( - '${tr('noReleaseFound')}${note?.isNotEmpty == true ? '\n\n$note' : ''}'); + : super( + '${tr('noReleaseFound')}${note?.isNotEmpty == true ? '\n\n$note' : ''}', + ); } class NoAPKError extends ObtainiumError { @@ -57,7 +58,7 @@ class DowngradeError extends ObtainiumError { class InstallError extends ObtainiumError { InstallError(int code) - : super(PackageInstallerStatus.byCode(code).name.substring(7)); + : super(PackageInstallerStatus.byCode(code).name.substring(7)); } class IDChangedError extends ObtainiumError { @@ -93,8 +94,11 @@ class MultiAppMultiError extends ObtainiumError { String errorString(String appId, {bool includeIdsWithNames = false}) => '${appIdNames.containsKey(appId) ? '${appIdNames[appId]}${includeIdsWithNames ? ' ($appId)' : ''}' : appId}: ${rawErrors[appId].toString()}'; - String errorsAppsString(String errString, List appIds, - {bool includeIdsWithNames = false}) => + String errorsAppsString( + String errString, + List appIds, { + bool includeIdsWithNames = false, + }) => '$errString [${list2FriendlyString(appIds.map((id) => appIdNames.containsKey(id) == true ? '${appIdNames[id]}${includeIdsWithNames ? ' ($id)' : ''}' : id).toList())}]'; @override @@ -104,38 +108,45 @@ class MultiAppMultiError extends ObtainiumError { } showMessage(dynamic e, BuildContext context, {bool isError = false}) { - Provider.of(context, listen: false) - .add(e.toString(), level: isError ? LogLevels.error : LogLevels.info); + Provider.of( + context, + listen: false, + ).add(e.toString(), level: isError ? LogLevels.error : LogLevels.info); if (e is String || (e is ObtainiumError && !e.unexpected)) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(e.toString())), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toString()))); } else { showDialog( - context: context, - builder: (BuildContext ctx) { - return AlertDialog( - scrollable: true, - title: Text(e is MultiAppMultiError + context: context, + builder: (BuildContext ctx) { + return AlertDialog( + scrollable: true, + title: Text( + e is MultiAppMultiError ? tr(isError ? 'someErrors' : 'updates') - : tr(isError ? 'unexpectedError' : 'unknown')), - content: GestureDetector( - onLongPress: () { - Clipboard.setData(ClipboardData(text: e.toString())); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(tr('copiedToClipboard')), - )); - }, - child: Text(e.toString())), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(null); - }, - child: Text(tr('ok'))), - ], - ); - }); + : tr(isError ? 'unexpectedError' : 'unknown'), + ), + content: GestureDetector( + onLongPress: () { + Clipboard.setData(ClipboardData(text: e.toString())); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(tr('copiedToClipboard')))); + }, + child: Text(e.toString()), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(null); + }, + child: Text(tr('ok')), + ), + ], + ); + }, + ); } } @@ -147,14 +158,16 @@ String list2FriendlyString(List list) { return list.length == 2 ? '${list[0]} ${tr('and')} ${list[1]}' : list - .asMap() - .entries - .map((e) => - e.value + - (e.key == list.length - 1 - ? '' - : e.key == list.length - 2 + .asMap() + .entries + .map( + (e) => + e.value + + (e.key == list.length - 1 + ? '' + : e.key == list.length - 2 ? ' and ' - : ', ')) - .join(''); + : ', '), + ) + .join(''); } diff --git a/lib/main.dart b/lib/main.dart index b1e8953..10c00b2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -43,8 +43,10 @@ List> supportedLocales = const [ MapEntry(Locale('tr'), 'Türkçe'), MapEntry(Locale('uk'), 'Українська'), MapEntry(Locale('da'), 'Dansk'), - MapEntry(Locale('en', 'EO'), - 'Esperanto'), // https://github.com/aissat/easy_localization/issues/220#issuecomment-846035493 + MapEntry( + Locale('en', 'EO'), + 'Esperanto', + ), // https://github.com/aissat/easy_localization/issues/220#issuecomment-846035493 MapEntry(Locale('in'), 'Bahasa Indonesia'), MapEntry(Locale('ko'), '한국어'), MapEntry(Locale('ca'), 'Català'), @@ -76,9 +78,11 @@ Future loadTranslations() async { }, ); await controller.loadTranslations(); - Localization.load(controller.locale, - translations: controller.translations, - fallbackTranslations: controller.fallbackTranslations); + Localization.load( + controller.locale, + translations: controller.translations, + fallbackTranslations: controller.fallbackTranslations, + ); } @pragma('vm:entry-point') @@ -97,10 +101,12 @@ void backgroundFetchHeadlessTask(HeadlessTask task) async { void main() async { WidgetsFlutterBinding.ensureInitialized(); try { - ByteData data = - await PlatformAssetBundle().load('assets/ca/lets-encrypt-r3.pem'); - SecurityContext.defaultContext - .setTrustedCertificatesBytes(data.buffer.asUint8List()); + ByteData data = await PlatformAssetBundle().load( + 'assets/ca/lets-encrypt-r3.pem', + ); + SecurityContext.defaultContext.setTrustedCertificatesBytes( + data.buffer.asUint8List(), + ); } catch (e) { // Already added, do nothing (see #375) } @@ -113,20 +119,23 @@ void main() async { } final np = NotificationsProvider(); await np.initialize(); - runApp(MultiProvider( - providers: [ - ChangeNotifierProvider(create: (context) => AppsProvider()), - ChangeNotifierProvider(create: (context) => SettingsProvider()), - Provider(create: (context) => np), - Provider(create: (context) => LogsProvider()) - ], - child: EasyLocalization( + runApp( + MultiProvider( + providers: [ + ChangeNotifierProvider(create: (context) => AppsProvider()), + ChangeNotifierProvider(create: (context) => SettingsProvider()), + Provider(create: (context) => np), + Provider(create: (context) => LogsProvider()), + ], + child: EasyLocalization( supportedLocales: supportedLocales.map((e) => e.key).toList(), path: localeDir, fallbackLocale: fallbackLocale, useOnlyLangCode: false, - child: const Obtainium()), - )); + child: const Obtainium(), + ), + ), + ); BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask); } @@ -148,22 +157,26 @@ class _ObtainiumState extends State { Future initPlatformState() async { await BackgroundFetch.configure( - BackgroundFetchConfig( - minimumFetchInterval: 15, - stopOnTerminate: false, - startOnBoot: true, - enableHeadless: true, - requiresBatteryNotLow: false, - requiresCharging: false, - requiresStorageNotLow: false, - requiresDeviceIdle: false, - requiredNetworkType: NetworkType.ANY), (String taskId) async { - await bgUpdateCheck(taskId, null); - BackgroundFetch.finish(taskId); - }, (String taskId) async { - context.read().add('BG update task timed out.'); - BackgroundFetch.finish(taskId); - }); + BackgroundFetchConfig( + minimumFetchInterval: 15, + stopOnTerminate: false, + startOnBoot: true, + enableHeadless: true, + requiresBatteryNotLow: false, + requiresCharging: false, + requiresStorageNotLow: false, + requiresDeviceIdle: false, + requiredNetworkType: NetworkType.ANY, + ), + (String taskId) async { + await bgUpdateCheck(taskId, null); + BackgroundFetch.finish(taskId); + }, + (String taskId) async { + context.read().add('BG update task timed out.'); + BackgroundFetch.finish(taskId); + }, + ); if (!mounted) return; } @@ -183,30 +196,33 @@ class _ObtainiumState extends State { // If this is the first run, ask for notification permissions and add Obtainium to the Apps list Permission.notification.request(); if (!fdroid) { - getInstalledInfo(obtainiumId).then((value) { - if (value?.versionName != null) { - appsProvider.saveApps([ - App( - obtainiumId, - obtainiumUrl, - 'ImranR98', - 'Obtainium', - value!.versionName, - value.versionName!, - [], - 0, - { - 'versionDetection': true, - 'apkFilterRegEx': 'fdroid', - 'invertAPKFilter': true - }, - null, - false) - ], onlyIfExists: false); - } - }).catchError((err) { - print(err); - }); + getInstalledInfo(obtainiumId) + .then((value) { + if (value?.versionName != null) { + appsProvider.saveApps([ + App( + obtainiumId, + obtainiumUrl, + 'ImranR98', + 'Obtainium', + value!.versionName, + value.versionName!, + [], + 0, + { + 'versionDetection': true, + 'apkFilterRegEx': 'fdroid', + 'invertAPKFilter': true, + }, + null, + false, + ), + ], onlyIfExists: false); + } + }) + .catchError((err) { + print(err); + }); } } if (!supportedLocales.map((e) => e.key).contains(context.locale) || @@ -221,32 +237,35 @@ class _ObtainiumState extends State { }); return DynamicColorBuilder( - builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) { - // Decide on a colour/brightness scheme based on OS and user settings - ColorScheme lightColorScheme; - ColorScheme darkColorScheme; - if (lightDynamic != null && - darkDynamic != null && - settingsProvider.useMaterialYou) { - lightColorScheme = lightDynamic.harmonized(); - darkColorScheme = darkDynamic.harmonized(); - } else { - lightColorScheme = - ColorScheme.fromSeed(seedColor: settingsProvider.themeColor); - darkColorScheme = ColorScheme.fromSeed( + builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) { + // Decide on a colour/brightness scheme based on OS and user settings + ColorScheme lightColorScheme; + ColorScheme darkColorScheme; + if (lightDynamic != null && + darkDynamic != null && + settingsProvider.useMaterialYou) { + lightColorScheme = lightDynamic.harmonized(); + darkColorScheme = darkDynamic.harmonized(); + } else { + lightColorScheme = ColorScheme.fromSeed( seedColor: settingsProvider.themeColor, - brightness: Brightness.dark); - } + ); + darkColorScheme = ColorScheme.fromSeed( + seedColor: settingsProvider.themeColor, + brightness: Brightness.dark, + ); + } - // set the background and surface colors to pure black in the amoled theme - if (settingsProvider.useBlackTheme) { - darkColorScheme = - darkColorScheme.copyWith(surface: Colors.black).harmonized(); - } + // set the background and surface colors to pure black in the amoled theme + if (settingsProvider.useBlackTheme) { + darkColorScheme = darkColorScheme + .copyWith(surface: Colors.black) + .harmonized(); + } - if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont(); + if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont(); - return MaterialApp( + return MaterialApp( title: 'Obtainium', localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, @@ -254,22 +273,31 @@ class _ObtainiumState extends State { navigatorKey: globalNavigatorKey, debugShowCheckedModeBanner: false, theme: ThemeData( - useMaterial3: true, - colorScheme: settingsProvider.theme == ThemeSettings.dark - ? darkColorScheme - : lightColorScheme, - fontFamily: - settingsProvider.useSystemFont ? 'SystemFont' : 'Montserrat'), + useMaterial3: true, + colorScheme: settingsProvider.theme == ThemeSettings.dark + ? darkColorScheme + : lightColorScheme, + fontFamily: settingsProvider.useSystemFont + ? 'SystemFont' + : 'Montserrat', + ), darkTheme: ThemeData( - useMaterial3: true, - colorScheme: settingsProvider.theme == ThemeSettings.light - ? lightColorScheme - : darkColorScheme, - fontFamily: - settingsProvider.useSystemFont ? 'SystemFont' : 'Montserrat'), - home: Shortcuts(shortcuts: { - LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), - }, child: const HomePage())); - }); + useMaterial3: true, + colorScheme: settingsProvider.theme == ThemeSettings.light + ? lightColorScheme + : darkColorScheme, + fontFamily: settingsProvider.useSystemFont + ? 'SystemFont' + : 'Montserrat', + ), + home: Shortcuts( + shortcuts: { + LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), + }, + child: const HomePage(), + ), + ); + }, + ); } } diff --git a/lib/main_fdroid.dart b/lib/main_fdroid.dart index 7fb8a28..93c0f66 100644 --- a/lib/main_fdroid.dart +++ b/lib/main_fdroid.dart @@ -3,4 +3,4 @@ import 'main.dart' as m; void main() async { m.fdroid = true; m.main(); -} \ No newline at end of file +} diff --git a/lib/mass_app_sources/githubstars.dart b/lib/mass_app_sources/githubstars.dart index 4a7ac61..94647bd 100644 --- a/lib/mass_app_sources/githubstars.dart +++ b/lib/mass_app_sources/githubstars.dart @@ -14,11 +14,15 @@ class GitHubStars implements MassAppUrlSource { late List requiredArgs = [tr('uname')]; Future>> getOnePageOfUserStarredUrlsWithDescriptions( - String username, int page) async { + String username, + int page, + ) async { Response res = await get( - Uri.parse( - 'https://api.github.com/users/$username/starred?per_page=100&page=$page'), - headers: await GitHub().getRequestHeaders({})); + Uri.parse( + 'https://api.github.com/users/$username/starred?per_page=100&page=$page', + ), + headers: await GitHub().getRequestHeaders({}), + ); if (res.statusCode == 200) { Map> urlsWithDescriptions = {}; for (var e in (jsonDecode(res.body) as List)) { @@ -27,8 +31,8 @@ class GitHubStars implements MassAppUrlSource { e['full_name'] as String, e['description'] != null ? e['description'] as String - : tr('noDescription') - ] + : tr('noDescription'), + ], }); } return urlsWithDescriptions; @@ -41,15 +45,18 @@ class GitHubStars implements MassAppUrlSource { @override Future>> getUrlsWithDescriptions( - List args) async { + List args, + ) async { if (args.length != requiredArgs.length) { throw ObtainiumError(tr('wrongArgNum')); } Map> urlsWithDescriptions = {}; var page = 1; while (true) { - var pageUrls = - await getOnePageOfUserStarredUrlsWithDescriptions(args[0], page++); + var pageUrls = await getOnePageOfUserStarredUrlsWithDescriptions( + args[0], + page++, + ); urlsWithDescriptions.addAll(pageUrls); if (pageUrls.length < 100) { break; diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index 327819a..6251737 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -51,8 +51,13 @@ class AddAppPageState extends State { } } - changeUserInput(String input, bool valid, bool isBuilding, - {bool updateUrlInput = false, String? overrideSource}) { + changeUserInput( + String input, + bool valid, + bool isBuilding, { + bool updateUrlInput = false, + String? overrideSource, + }) { userInput = input; if (!isBuilding) { setState(() { @@ -69,8 +74,10 @@ class AddAppPageState extends State { ? pickedSource?.hosts[0] : null; var source = valid - ? sourceProvider.getSource(userInput, - overrideSource: pickedSourceOverride) + ? sourceProvider.getSource( + userInput, + overrideSource: pickedSourceOverride, + ) : null; if (pickedSource.runtimeType != source.runtimeType || overrideChanged || @@ -79,7 +86,8 @@ class AddAppPageState extends State { pickedSource?.runOnAddAppInputChange(userInput); additionalSettings = source != null ? getDefaultValuesFromFormItems( - source.combinedAppSpecificSettingFormItems) + source.combinedAppSpecificSettingFormItems, + ) : {}; additionalSettingsValid = source != null ? !sourceProvider.ifRequiredAppSpecificSettingsExist(source) @@ -94,32 +102,38 @@ class AddAppPageState extends State { Widget build(BuildContext context) { AppsProvider appsProvider = context.read(); SettingsProvider settingsProvider = context.watch(); - NotificationsProvider notificationsProvider = - context.read(); + NotificationsProvider notificationsProvider = context + .read(); bool doingSomething = gettingAppInfo || searching; - Future getTrackOnlyConfirmationIfNeeded(bool userPickedTrackOnly, - {bool ignoreHideSetting = false}) async { + Future getTrackOnlyConfirmationIfNeeded( + bool userPickedTrackOnly, { + bool ignoreHideSetting = false, + }) async { var useTrackOnly = userPickedTrackOnly || pickedSource!.enforceTrackOnly; if (useTrackOnly && (!settingsProvider.hideTrackOnlyWarning || ignoreHideSetting)) { // ignore: use_build_context_synchronously var values = await showDialog( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - initValid: true, - title: tr('xIsTrackOnly', args: [ - pickedSource!.enforceTrackOnly ? tr('source') : tr('app') - ]), - items: [ - [GeneratedFormSwitch('hide', label: tr('dontShowAgain'))] + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + initValid: true, + title: tr( + 'xIsTrackOnly', + args: [ + pickedSource!.enforceTrackOnly ? tr('source') : tr('app'), ], - message: - '${pickedSource!.enforceTrackOnly ? tr('appsFromSourceAreTrackOnly') : tr('youPickedTrackOnly')}\n\n${tr('trackOnlyAppDescription')}', - ); - }); + ), + items: [ + [GeneratedFormSwitch('hide', label: tr('dontShowAgain'))], + ], + message: + '${pickedSource!.enforceTrackOnly ? tr('appsFromSourceAreTrackOnly') : tr('youPickedTrackOnly')}\n\n${tr('trackOnlyAppDescription')}', + ); + }, + ); if (values != null) { settingsProvider.hideTrackOnlyWarning = values['hide'] == true; } @@ -130,18 +144,20 @@ class AddAppPageState extends State { } getReleaseDateAsVersionConfirmationIfNeeded( - bool userPickedTrackOnly) async { + bool userPickedTrackOnly, + ) async { return (!(additionalSettings['releaseDateAsVersion'] == true && // ignore: use_build_context_synchronously await showDialog( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: tr('releaseDateAsVersion'), - items: const [], - message: tr('releaseDateAsVersionExplanation'), - ); - }) == + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: tr('releaseDateAsVersion'), + items: const [], + message: tr('releaseDateAsVersionExplanation'), + ); + }, + ) == null)); } @@ -154,27 +170,38 @@ class AddAppPageState extends State { App? app; if ((await getTrackOnlyConfirmationIfNeeded(userPickedTrackOnly)) && (await getReleaseDateAsVersionConfirmationIfNeeded( - userPickedTrackOnly))) { + userPickedTrackOnly, + ))) { var trackOnly = pickedSource!.enforceTrackOnly || userPickedTrackOnly; app = await sourceProvider.getApp( - pickedSource!, userInput.trim(), additionalSettings, - trackOnlyOverride: trackOnly, - sourceIsOverriden: pickedSourceOverride != null, - inferAppIdIfOptional: inferAppIdIfOptional); + pickedSource!, + userInput.trim(), + additionalSettings, + trackOnlyOverride: trackOnly, + sourceIsOverriden: pickedSourceOverride != null, + inferAppIdIfOptional: inferAppIdIfOptional, + ); // Only download the APK here if you need to for the package ID if (isTempId(app) && app.additionalSettings['trackOnly'] != true) { // ignore: use_build_context_synchronously - var apkUrl = - await appsProvider.confirmAppFileUrl(app, context, false); + var apkUrl = await appsProvider.confirmAppFileUrl( + app, + context, + false, + ); if (apkUrl == null) { throw ObtainiumError(tr('cancelled')); } - app.preferredApkIndex = - app.apkUrls.map((e) => e.value).toList().indexOf(apkUrl.value); + app.preferredApkIndex = app.apkUrls + .map((e) => e.value) + .toList() + .indexOf(apkUrl.value); // ignore: use_build_context_synchronously var downloadedArtifact = await appsProvider.downloadApp( - app, globalNavigatorKey.currentContext, - notificationsProvider: notificationsProvider); + app, + globalNavigatorKey.currentContext, + notificationsProvider: notificationsProvider, + ); DownloadedApk? downloadedFile; DownloadedXApkDir? downloadedDir; if (downloadedArtifact is DownloadedApk) { @@ -195,8 +222,10 @@ class AddAppPageState extends State { await appsProvider.saveApps([app], onlyIfExists: false); } if (app != null) { - Navigator.push(globalNavigatorKey.currentContext ?? context, - MaterialPageRoute(builder: (context) => AppPage(appId: app!.id))); + Navigator.push( + globalNavigatorKey.currentContext ?? context, + MaterialPageRoute(builder: (context) => AppPage(appId: app!.id)), + ); } } catch (e) { showError(e, context); @@ -211,57 +240,63 @@ class AddAppPageState extends State { } Widget getUrlInputRow() => Row( - children: [ - Expanded( - child: GeneratedForm( - key: Key(urlInputKey.toString()), - items: [ - [ - GeneratedFormTextField('appSourceURL', - label: tr('appSourceURL'), - defaultValue: userInput, - additionalValidators: [ - (value) { - try { - sourceProvider - .getSource(value ?? '', - overrideSource: pickedSourceOverride) - .standardizeUrl(value ?? ''); - } catch (e) { - return e is String - ? e - : e is ObtainiumError - ? e.toString() - : tr('error'); - } - return null; - } - ]) - ] - ], - onValueChanges: (values, valid, isBuilding) { - changeUserInput( - values['appSourceURL']!, valid, isBuilding); - })), - const SizedBox( - width: 16, - ), - gettingAppInfo - ? const CircularProgressIndicator() - : ElevatedButton( - onPressed: doingSomething || - pickedSource == null || - (pickedSource!.combinedAppSpecificSettingFormItems - .isNotEmpty && - !additionalSettingsValid) - ? null - : () { - HapticFeedback.selectionClick(); - addApp(); - }, - child: Text(tr('add'))) - ], - ); + children: [ + Expanded( + child: GeneratedForm( + key: Key(urlInputKey.toString()), + items: [ + [ + GeneratedFormTextField( + 'appSourceURL', + label: tr('appSourceURL'), + defaultValue: userInput, + additionalValidators: [ + (value) { + try { + sourceProvider + .getSource( + value ?? '', + overrideSource: pickedSourceOverride, + ) + .standardizeUrl(value ?? ''); + } catch (e) { + return e is String + ? e + : e is ObtainiumError + ? e.toString() + : tr('error'); + } + return null; + }, + ], + ), + ], + ], + onValueChanges: (values, valid, isBuilding) { + changeUserInput(values['appSourceURL']!, valid, isBuilding); + }, + ), + ), + const SizedBox(width: 16), + gettingAppInfo + ? const CircularProgressIndicator() + : ElevatedButton( + onPressed: + doingSomething || + pickedSource == null || + (pickedSource! + .combinedAppSpecificSettingFormItems + .isNotEmpty && + !additionalSettingsValid) + ? null + : () { + HapticFeedback.selectionClick(); + addApp(); + }, + child: Text(tr('add')), + ), + ], + ); runSearch({bool filtered = true}) async { setState(() { @@ -272,82 +307,94 @@ class AddAppPageState extends State { sourceStrings[s.name] = [s.name]; }); try { - var searchSources = await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return SelectionModal( - title: tr('selectX', args: [plural('source', 2)]), - entries: sourceStrings, - selectedByDefault: true, - onlyOneSelectionAllowed: false, - titlesAreLinks: false, - deselectThese: settingsProvider.searchDeselected, - ); - }) ?? + var searchSources = + await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return SelectionModal( + title: tr('selectX', args: [plural('source', 2)]), + entries: sourceStrings, + selectedByDefault: true, + onlyOneSelectionAllowed: false, + titlesAreLinks: false, + deselectThese: settingsProvider.searchDeselected, + ); + }, + ) ?? []; if (searchSources.isNotEmpty) { settingsProvider.searchDeselected = sourceStrings.keys .where((s) => !searchSources.contains(s)) .toList(); - List>>?> results = - (await Future.wait(sourceProvider.sources - .where((e) => searchSources.contains(e.name)) - .map((e) async { - try { - Map? querySettings = {}; - if (e.includeAdditionalOptsInMainSearch) { - querySettings = await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: tr('searchX', args: [e.name]), - items: [ - ...e.searchQuerySettingFormItems.map((e) => [e]), - [ - GeneratedFormTextField('url', - label: e.hosts.isNotEmpty - ? tr('overrideSource') - : plural('url', 1).substring(2), - autoCompleteOptions: [ - ...(e.hosts.isNotEmpty ? [e.hosts[0]] : []), - ...appsProvider.apps.values - .where((a) => - sourceProvider - .getSource(a.app.url, - overrideSource: - a.app.overrideSource) - .runtimeType == - e.runtimeType) - .map((a) { - var uri = Uri.parse(a.app.url); - return '${uri.origin}${uri.path}'; - }) - ], - defaultValue: - e.hosts.isNotEmpty ? e.hosts[0] : '', - required: true) - ], - ], + List>>?> + results = (await Future.wait( + sourceProvider.sources + .where((e) => searchSources.contains(e.name)) + .map((e) async { + try { + Map? querySettings = {}; + if (e.includeAdditionalOptsInMainSearch) { + querySettings = await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: tr('searchX', args: [e.name]), + items: [ + ...e.searchQuerySettingFormItems.map((e) => [e]), + [ + GeneratedFormTextField( + 'url', + label: e.hosts.isNotEmpty + ? tr('overrideSource') + : plural('url', 1).substring(2), + autoCompleteOptions: [ + ...(e.hosts.isNotEmpty ? [e.hosts[0]] : []), + ...appsProvider.apps.values + .where( + (a) => + sourceProvider + .getSource( + a.app.url, + overrideSource: + a.app.overrideSource, + ) + .runtimeType == + e.runtimeType, + ) + .map((a) { + var uri = Uri.parse(a.app.url); + return '${uri.origin}${uri.path}'; + }), + ], + defaultValue: e.hosts.isNotEmpty + ? e.hosts[0] + : '', + required: true, + ), + ], + ], + ); + }, ); - }); - if (querySettings == null) { - return null; - } - } - return MapEntry(e.runtimeType.toString(), - await e.search(searchQuery, querySettings: querySettings)); - } catch (err) { - if (err is! CredsNeededError) { - rethrow; - } else { - err.unexpected = true; - showError(err, context); - return null; - } - } - }))) - .where((a) => a != null) - .toList(); + if (querySettings == null) { + return null; + } + } + return MapEntry( + e.runtimeType.toString(), + await e.search(searchQuery, querySettings: querySettings), + ); + } catch (err) { + if (err is! CredsNeededError) { + rethrow; + } else { + err.unexpected = true; + showError(err, context); + return null; + } + } + }), + )).where((a) => a != null).toList(); // Interleave results instead of simple reduce Map>> res = {}; @@ -379,11 +426,17 @@ class AddAppPageState extends State { selectedByDefault: false, onlyOneSelectionAllowed: true, ); - }); + }, + ); if (selectedUrls != null && selectedUrls.isNotEmpty) { var sourceName = res[selectedUrls[0]]?.key; - changeUserInput(selectedUrls[0], true, false, - updateUrlInput: true, overrideSource: sourceName); + changeUserInput( + selectedUrls[0], + true, + false, + updateUrlInput: true, + overrideSource: sourceName, + ); } } } catch (e) { @@ -395,33 +448,39 @@ class AddAppPageState extends State { } } - Widget getHTMLSourceOverrideDropdown() => Column(children: [ - Row( - children: [ - Expanded( - child: GeneratedForm( + Widget getHTMLSourceOverrideDropdown() => Column( + children: [ + Row( + children: [ + Expanded( + child: GeneratedForm( items: [ [ GeneratedFormDropdown( - 'overrideSource', - defaultValue: pickedSourceOverride ?? '', - [ - MapEntry('', tr('none')), - ...sourceProvider.sources - .where((s) => + 'overrideSource', + defaultValue: pickedSourceOverride ?? '', + [ + MapEntry('', tr('none')), + ...sourceProvider.sources + .where( + (s) => s.allowOverride || (pickedSource != null && pickedSource.runtimeType == - s.runtimeType)) - .map((s) => - MapEntry(s.runtimeType.toString(), s.name)) - ], - label: tr('overrideSource')) - ] + s.runtimeType), + ) + .map( + (s) => MapEntry(s.runtimeType.toString(), s.name), + ), + ], + label: tr('overrideSource'), + ), + ], ], onValueChanges: (values, valid, isBuilding) { fn() { - pickedSourceOverride = (values['overrideSource'] == null || + pickedSourceOverride = + (values['overrideSource'] == null || values['overrideSource'] == '') ? null : values['overrideSource']; @@ -436,13 +495,13 @@ class AddAppPageState extends State { } changeUserInput(userInput, valid, isBuilding); }, - )) - ], - ), - const SizedBox( - height: 16, - ) - ]); + ), + ), + ], + ), + const SizedBox(height: 16), + ], + ); bool shouldShowSearchBar() => sourceProvider.sources.where((e) => e.canSearch).isNotEmpty && @@ -450,249 +509,260 @@ class AddAppPageState extends State { userInput.isEmpty; Widget getSearchBarRow() => Row( - children: [ - Expanded( - child: GeneratedForm( - items: [ - [ - GeneratedFormTextField('searchSomeSources', - label: tr('searchSomeSourcesLabel'), required: false), - ] - ], - onValueChanges: (values, valid, isBuilding) { - if (values.isNotEmpty && valid && !isBuilding) { - setState(() { - searchQuery = values['searchSomeSources']!.trim(); - }); - } - }), - ), - const SizedBox( - width: 16, - ), - searching - ? const CircularProgressIndicator() - : ElevatedButton( - onPressed: searchQuery.isEmpty || doingSomething - ? null - : () { - runSearch(); - }, - child: Text(tr('search'))) - ], - ); + children: [ + Expanded( + child: GeneratedForm( + items: [ + [ + GeneratedFormTextField( + 'searchSomeSources', + label: tr('searchSomeSourcesLabel'), + required: false, + ), + ], + ], + onValueChanges: (values, valid, isBuilding) { + if (values.isNotEmpty && valid && !isBuilding) { + setState(() { + searchQuery = values['searchSomeSources']!.trim(); + }); + } + }, + ), + ), + const SizedBox(width: 16), + searching + ? const CircularProgressIndicator() + : ElevatedButton( + onPressed: searchQuery.isEmpty || doingSomething + ? null + : () { + runSearch(); + }, + child: Text(tr('search')), + ), + ], + ); Widget getAdditionalOptsCol() => Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const SizedBox( - height: 16, - ), - Text( - tr('additionalOptsFor', - args: [pickedSource?.name ?? tr('source')]), - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold)), - const SizedBox( - height: 16, - ), - GeneratedForm( - key: Key( - '${pickedSource.runtimeType.toString()}-${pickedSource?.hostChanged.toString()}-${pickedSource?.hostIdenticalDespiteAnyChange.toString()}'), - items: [ - ...pickedSource!.combinedAppSpecificSettingFormItems, - ...(pickedSourceOverride != null - ? pickedSource!.sourceConfigSettingFormItems - .map((e) => [e]) - : []) - ], - onValueChanges: (values, valid, isBuilding) { - if (!isBuilding) { - setState(() { - additionalSettings = values; - additionalSettingsValid = valid; - }); - } - }), - Column( - children: [ - const SizedBox( - height: 16, - ), - CategoryEditorSelector( - alignment: WrapAlignment.start, - onSelected: (categories) { - pickedCategories = categories; - }), - ], - ), - if (pickedSource != null && pickedSource!.appIdInferIsOptional) - GeneratedForm( - key: const Key('inferAppIdIfOptional'), - items: [ - [ - GeneratedFormSwitch('inferAppIdIfOptional', - label: tr('tryInferAppIdFromCode'), - defaultValue: inferAppIdIfOptional) - ] - ], - onValueChanges: (values, valid, isBuilding) { - if (!isBuilding) { - setState(() { - inferAppIdIfOptional = values['inferAppIdIfOptional']; - }); - } - }), - if (pickedSource != null && pickedSource!.enforceTrackOnly) - GeneratedForm( - key: Key( - '${pickedSource.runtimeType.toString()}-${pickedSource?.hostChanged.toString()}-${pickedSource?.hostIdenticalDespiteAnyChange.toString()}-appId'), - items: [ - [ - GeneratedFormTextField('appId', - label: '${tr('appId')} - ${tr('custom')}', - required: false, - additionalValidators: [ - (value) { - if (value == null || value.isEmpty) { - return null; - } - final isValid = RegExp( - r'^([A-Za-z]{1}[A-Za-z\d_]*\.)+[A-Za-z][A-Za-z\d_]*$') - .hasMatch(value); - if (!isValid) { - return tr('invalidInput'); - } - return null; - } - ]), - ] - ], - onValueChanges: (values, valid, isBuilding) { - if (!isBuilding) { - setState(() { - additionalSettings['appId'] = values['appId']; - }); - } - }), + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: 16), + Text( + tr('additionalOptsFor', args: [pickedSource?.name ?? tr('source')]), + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 16), + GeneratedForm( + key: Key( + '${pickedSource.runtimeType.toString()}-${pickedSource?.hostChanged.toString()}-${pickedSource?.hostIdenticalDespiteAnyChange.toString()}', + ), + items: [ + ...pickedSource!.combinedAppSpecificSettingFormItems, + ...(pickedSourceOverride != null + ? pickedSource!.sourceConfigSettingFormItems.map((e) => [e]) + : []), ], - ); + onValueChanges: (values, valid, isBuilding) { + if (!isBuilding) { + setState(() { + additionalSettings = values; + additionalSettingsValid = valid; + }); + } + }, + ), + Column( + children: [ + const SizedBox(height: 16), + CategoryEditorSelector( + alignment: WrapAlignment.start, + onSelected: (categories) { + pickedCategories = categories; + }, + ), + ], + ), + if (pickedSource != null && pickedSource!.appIdInferIsOptional) + GeneratedForm( + key: const Key('inferAppIdIfOptional'), + items: [ + [ + GeneratedFormSwitch( + 'inferAppIdIfOptional', + label: tr('tryInferAppIdFromCode'), + defaultValue: inferAppIdIfOptional, + ), + ], + ], + onValueChanges: (values, valid, isBuilding) { + if (!isBuilding) { + setState(() { + inferAppIdIfOptional = values['inferAppIdIfOptional']; + }); + } + }, + ), + if (pickedSource != null && pickedSource!.enforceTrackOnly) + GeneratedForm( + key: Key( + '${pickedSource.runtimeType.toString()}-${pickedSource?.hostChanged.toString()}-${pickedSource?.hostIdenticalDespiteAnyChange.toString()}-appId', + ), + items: [ + [ + GeneratedFormTextField( + 'appId', + label: '${tr('appId')} - ${tr('custom')}', + required: false, + additionalValidators: [ + (value) { + if (value == null || value.isEmpty) { + return null; + } + final isValid = RegExp( + r'^([A-Za-z]{1}[A-Za-z\d_]*\.)+[A-Za-z][A-Za-z\d_]*$', + ).hasMatch(value); + if (!isValid) { + return tr('invalidInput'); + } + return null; + }, + ], + ), + ], + ], + onValueChanges: (values, valid, isBuilding) { + if (!isBuilding) { + setState(() { + additionalSettings['appId'] = values['appId']; + }); + } + }, + ), + ], + ); Widget getSourcesListWidget() => Padding( - padding: const EdgeInsets.all(16), - child: Wrap( - direction: Axis.horizontal, - alignment: WrapAlignment.spaceBetween, - spacing: 12, - children: [ - GestureDetector( - onTap: () { - showDialog( - context: context, - builder: (context) { - return GeneratedFormModal( - singleNullReturnButton: tr('ok'), - title: tr('supportedSources'), - items: const [], - additionalWidgets: [ - ...sourceProvider.sources.map( - (e) => Padding( - padding: - const EdgeInsets.symmetric(vertical: 4), - child: GestureDetector( - onTap: e.hosts.isNotEmpty - ? () { - launchUrlString( - 'https://${e.hosts[0]}', - mode: LaunchMode - .externalApplication); - } - : null, - child: Text( - '${e.name}${e.enforceTrackOnly ? ' ${tr('trackOnlyInBrackets')}' : ''}${e.canSearch ? ' ${tr('searchableInBrackets')}' : ''}', - style: TextStyle( - decoration: e.hosts.isNotEmpty - ? TextDecoration.underline - : TextDecoration.none), - ))), + padding: const EdgeInsets.all(16), + child: Wrap( + direction: Axis.horizontal, + alignment: WrapAlignment.spaceBetween, + spacing: 12, + children: [ + GestureDetector( + onTap: () { + showDialog( + context: context, + builder: (context) { + return GeneratedFormModal( + singleNullReturnButton: tr('ok'), + title: tr('supportedSources'), + items: const [], + additionalWidgets: [ + ...sourceProvider.sources.map( + (e) => Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: GestureDetector( + onTap: e.hosts.isNotEmpty + ? () { + launchUrlString( + 'https://${e.hosts[0]}', + mode: LaunchMode.externalApplication, + ); + } + : null, + child: Text( + '${e.name}${e.enforceTrackOnly ? ' ${tr('trackOnlyInBrackets')}' : ''}${e.canSearch ? ' ${tr('searchableInBrackets')}' : ''}', + style: TextStyle( + decoration: e.hosts.isNotEmpty + ? TextDecoration.underline + : TextDecoration.none, + ), ), - const SizedBox( - height: 16, - ), - Text( - '${tr('note')}:', - style: - const TextStyle(fontWeight: FontWeight.bold), - ), - const SizedBox( - height: 4, - ), - Text(tr('selfHostedNote', - args: [tr('overrideSource')])), - ], - ); - }, - ); - }, - child: Text( - tr('supportedSources'), - style: const TextStyle( - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - fontStyle: FontStyle.italic), - )), - GestureDetector( - onTap: () { - launchUrlString('https://apps.obtainium.imranr.dev/', - mode: LaunchMode.externalApplication); + ), + ), + ), + const SizedBox(height: 16), + Text( + '${tr('note')}:', + style: const TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox(height: 4), + Text(tr('selfHostedNote', args: [tr('overrideSource')])), + ], + ); }, - child: Text( - tr('crowdsourcedConfigsShort'), - style: const TextStyle( - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - fontStyle: FontStyle.italic), - ), + ); + }, + child: Text( + tr('supportedSources'), + style: const TextStyle( + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline, + fontStyle: FontStyle.italic, ), - ], + ), ), - ); + GestureDetector( + onTap: () { + launchUrlString( + 'https://apps.obtainium.imranr.dev/', + mode: LaunchMode.externalApplication, + ); + }, + child: Text( + tr('crowdsourcedConfigsShort'), + style: const TextStyle( + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline, + fontStyle: FontStyle.italic, + ), + ), + ), + ], + ), + ); return Scaffold( - backgroundColor: Theme.of(context).colorScheme.surface, - bottomNavigationBar: - pickedSource == null ? getSourcesListWidget() : null, - body: CustomScrollView(shrinkWrap: true, slivers: [ + backgroundColor: Theme.of(context).colorScheme.surface, + bottomNavigationBar: pickedSource == null ? getSourcesListWidget() : null, + body: CustomScrollView( + shrinkWrap: true, + slivers: [ CustomAppBar(title: tr('addApp')), SliverToBoxAdapter( child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - getUrlInputRow(), - const SizedBox( - height: 16, - ), - if (pickedSource != null) getHTMLSourceOverrideDropdown(), - if (shouldShowSearchBar()) getSearchBarRow(), - if (pickedSource != null) - FutureBuilder( - builder: (ctx, val) { - return val.data != null && val.data!.isNotEmpty - ? Text( - val.data!, - style: - Theme.of(context).textTheme.bodySmall, - ) - : const SizedBox(); - }, - future: pickedSource?.getSourceNote()), - if (pickedSource != null) getAdditionalOptsCol(), - ])), - ) - ])); + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + getUrlInputRow(), + const SizedBox(height: 16), + if (pickedSource != null) getHTMLSourceOverrideDropdown(), + if (shouldShowSearchBar()) getSearchBarRow(), + if (pickedSource != null) + FutureBuilder( + builder: (ctx, val) { + return val.data != null && val.data!.isNotEmpty + ? Text( + val.data!, + style: Theme.of(context).textTheme.bodySmall, + ) + : const SizedBox(); + }, + future: pickedSource?.getSourceNote(), + ), + if (pickedSource != null) getAdditionalOptsCol(), + ], + ), + ), + ), + ], + ), + ); } } diff --git a/lib/pages/app.dart b/lib/pages/app.dart index 1c856b8..27068ce 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -40,13 +40,15 @@ class _AppPageState extends State { onWebResourceError: (WebResourceError error) { if (error.isForMainFrame == true) { showError( - ObtainiumError(error.description, unexpected: true), context); + ObtainiumError(error.description, unexpected: true), + context, + ); } }, onNavigationRequest: (NavigationRequest request) => request.url.startsWith("rustore://") - ? NavigationDecision.prevent - : NavigationDecision.navigate, + ? NavigationDecision.prevent + : NavigationDecision.navigate, ), ); } @@ -85,8 +87,10 @@ class _AppPageState extends State { var sourceProvider = SourceProvider(); AppInMemory? app = appsProvider.apps[widget.appId]?.deepCopy(); var source = app != null - ? sourceProvider.getSource(app.app.url, - overrideSource: app.app.overrideSource) + ? sourceProvider.getSource( + app.app.url, + overrideSource: app.app.overrideSource, + ) : null; if (!areDownloadsRunning && prevApp == null && @@ -100,7 +104,9 @@ class _AppPageState extends State { bool isVersionDetectionStandard = app?.app.additionalSettings['versionDetection'] == true; - bool installedVersionIsEstimate = app?.app != null ? isVersionPseudo(app!.app) : false; + bool installedVersionIsEstimate = app?.app != null + ? isVersionPseudo(app!.app) + : false; if (app != null && !_wasWebViewOpened) { _wasWebViewOpened = true; @@ -122,11 +128,14 @@ class _AppPageState extends State { if (!upToDate) { versionLines += '\n${app?.app.latestVersion} ${tr('latest')}'; } - String infoLines = tr('lastUpdateCheckX', args: [ - app?.app.lastUpdateCheck == null - ? tr('never') - : '${app?.app.lastUpdateCheck?.toLocal()}' - ]); + String infoLines = tr( + 'lastUpdateCheckX', + args: [ + app?.app.lastUpdateCheck == null + ? tr('never') + : '${app?.app.lastUpdateCheck?.toLocal()}', + ], + ); if (trackOnly) { infoLines = '${tr('xIsTrackOnly', args: [tr('app')])}\n$infoLines'; } @@ -146,15 +155,14 @@ class _AppPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 24), child: Column( children: [ - const SizedBox( - height: 8, + const SizedBox(height: 8), + Text( + versionLines, + textAlign: TextAlign.start, + style: Theme.of( + context, + ).textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.bold), ), - Text(versionLines, - textAlign: TextAlign.start, - style: Theme.of(context) - .textTheme - .bodyLarge! - .copyWith(fontWeight: FontWeight.bold)), changeLogFn != null || app?.app.releaseDate != null ? GestureDetector( onTap: changeLogFn, @@ -163,21 +171,19 @@ class _AppPageState extends State { ? tr('changes') : app!.app.releaseDate!.toLocal().toString(), textAlign: TextAlign.center, - style: - Theme.of(context).textTheme.labelSmall!.copyWith( - decoration: changeLogFn != null - ? TextDecoration.underline - : null, - fontStyle: changeLogFn != null - ? FontStyle.italic - : null, - ), + style: Theme.of(context).textTheme.labelSmall! + .copyWith( + decoration: changeLogFn != null + ? TextDecoration.underline + : null, + fontStyle: changeLogFn != null + ? FontStyle.italic + : null, + ), ), ) : const SizedBox.shrink(), - const SizedBox( - height: 8, - ), + const SizedBox(height: 8), ], ), ), @@ -189,101 +195,108 @@ class _AppPageState extends State { if (app?.app.apkUrls.isNotEmpty == true || app?.app.otherAssetUrls.isNotEmpty == true) GestureDetector( - onTap: app?.app == null || updating - ? null - : () async { - try { - await appsProvider - .downloadAppAssets([app!.app.id], context); - } catch (e) { - showError(e, context); - } - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: settingsProvider.highlightTouchTargets - ? (Theme.of(context).brightness == - Brightness.light - ? Theme.of(context).primaryColor - : Theme.of(context).primaryColorLight) - .withAlpha(Theme.of(context).brightness == - Brightness.light - ? 20 - : 40) - : null), - padding: settingsProvider.highlightTouchTargets - ? const EdgeInsetsDirectional.fromSTEB(12, 6, 12, 6) - : const EdgeInsetsDirectional.fromSTEB(0, 6, 0, 6), - margin: - const EdgeInsetsDirectional.fromSTEB(0, 6, 0, 0), - child: Text( - tr('downloadX', - args: [tr('releaseAsset').toLowerCase()]), - textAlign: TextAlign.center, - style: - Theme.of(context).textTheme.labelSmall!.copyWith( - decoration: TextDecoration.underline, - fontStyle: FontStyle.italic, - ), - )) - ], - )), - const SizedBox( - height: 48, - ), + onTap: app?.app == null || updating + ? null + : () async { + try { + await appsProvider.downloadAppAssets([ + app!.app.id, + ], context); + } catch (e) { + showError(e, context); + } + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: settingsProvider.highlightTouchTargets + ? (Theme.of(context).brightness == Brightness.light + ? Theme.of(context).primaryColor + : Theme.of(context).primaryColorLight) + .withAlpha( + Theme.of(context).brightness == + Brightness.light + ? 20 + : 40, + ) + : null, + ), + padding: settingsProvider.highlightTouchTargets + ? const EdgeInsetsDirectional.fromSTEB(12, 6, 12, 6) + : const EdgeInsetsDirectional.fromSTEB(0, 6, 0, 6), + margin: const EdgeInsetsDirectional.fromSTEB(0, 6, 0, 0), + child: Text( + tr('downloadX', args: [tr('releaseAsset').toLowerCase()]), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.labelSmall!.copyWith( + decoration: TextDecoration.underline, + fontStyle: FontStyle.italic, + ), + ), + ), + ], + ), + ), + const SizedBox(height: 48), CategoryEditorSelector( - alignment: WrapAlignment.center, - preselected: app?.app.categories != null - ? app!.app.categories.toSet() - : {}, - onSelected: (categories) { - if (app != null) { - app.app.categories = categories; - appsProvider.saveApps([app.app]); - } - }), + alignment: WrapAlignment.center, + preselected: app?.app.categories != null + ? app!.app.categories.toSet() + : {}, + onSelected: (categories) { + if (app != null) { + app.app.categories = categories; + appsProvider.saveApps([app.app]); + } + }, + ), if (app?.app.additionalSettings['about'] is String && app?.app.additionalSettings['about'].isNotEmpty) Column( mainAxisSize: MainAxisSize.min, children: [ - const SizedBox( - height: 48, - ), + const SizedBox(height: 48), GestureDetector( - onLongPress: () { - Clipboard.setData(ClipboardData( - text: app?.app.additionalSettings['about'] ?? '')); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(tr('copiedToClipboard')), - )); - }, - child: Markdown( - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - styleSheet: MarkdownStyleSheet( - blockquoteDecoration: - BoxDecoration(color: Theme.of(context).cardColor), - textAlign: WrapAlignment.center), - data: app?.app.additionalSettings['about'], - onTapLink: (text, href, title) { - if (href != null) { - launchUrlString(href, - mode: LaunchMode.externalApplication); - } - }, - extensionSet: md.ExtensionSet( - md.ExtensionSet.gitHubFlavored.blockSyntaxes, - [ - md.EmojiSyntax(), - ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes - ], + onLongPress: () { + Clipboard.setData( + ClipboardData( + text: app?.app.additionalSettings['about'] ?? '', ), - )) + ); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(tr('copiedToClipboard'))), + ); + }, + child: Markdown( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + styleSheet: MarkdownStyleSheet( + blockquoteDecoration: BoxDecoration( + color: Theme.of(context).cardColor, + ), + textAlign: WrapAlignment.center, + ), + data: app?.app.additionalSettings['about'], + onTapLink: (text, href, title) { + if (href != null) { + launchUrlString( + href, + mode: LaunchMode.externalApplication, + ); + } + }, + extensionSet: md.ExtensionSet( + md.ExtensionSet.gitHubFlavored.blockSyntaxes, + [ + md.EmojiSyntax(), + ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes, + ], + ), + ), + ), ], ), ], @@ -291,132 +304,143 @@ class _AppPageState extends State { } getFullInfoColumn({bool small = false}) => Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox(height: small ? 5 : 20), - FutureBuilder( - future: - appsProvider.updateAppIcon(app?.app.id, ignoreCache: true), - builder: (ctx, val) { - return app?.icon != null - ? Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: app == null - ? null - : () => pm.openApp(app.app.id), - child: Image.memory( - app!.icon!, - height: small ? 70 : 150, - gaplessPlayback: true, - ), - ) - ]) - : Container(); - }), - SizedBox( - height: small ? 10 : 25, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox(height: small ? 5 : 20), + FutureBuilder( + future: appsProvider.updateAppIcon(app?.app.id, ignoreCache: true), + builder: (ctx, val) { + return app?.icon != null + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: app == null + ? null + : () => pm.openApp(app.app.id), + child: Image.memory( + app!.icon!, + height: small ? 70 : 150, + gaplessPlayback: true, + ), + ), + ], + ) + : Container(); + }, + ), + SizedBox(height: small ? 10 : 25), + Text( + app?.name ?? tr('app'), + textAlign: TextAlign.center, + style: small + ? Theme.of(context).textTheme.displaySmall + : Theme.of(context).textTheme.displayLarge, + ), + Text( + tr('byX', args: [app?.author ?? tr('unknown')]), + textAlign: TextAlign.center, + style: small + ? Theme.of(context).textTheme.headlineSmall + : Theme.of(context).textTheme.headlineMedium, + ), + const SizedBox(height: 24), + GestureDetector( + onTap: () { + if (app?.app.url != null) { + launchUrlString( + app?.app.url ?? '', + mode: LaunchMode.externalApplication, + ); + } + }, + onLongPress: () { + Clipboard.setData(ClipboardData(text: app?.app.url ?? '')); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(tr('copiedToClipboard')))); + }, + child: Text( + app?.app.url ?? '', + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.labelSmall!.copyWith( + decoration: TextDecoration.underline, + fontStyle: FontStyle.italic, ), - Text( - app?.name ?? tr('app'), - textAlign: TextAlign.center, - style: small - ? Theme.of(context).textTheme.displaySmall - : Theme.of(context).textTheme.displayLarge, - ), - Text(tr('byX', args: [app?.author ?? tr('unknown')]), - textAlign: TextAlign.center, - style: small - ? Theme.of(context).textTheme.headlineSmall - : Theme.of(context).textTheme.headlineMedium), - const SizedBox( - height: 24, - ), - GestureDetector( - onTap: () { - if (app?.app.url != null) { - launchUrlString(app?.app.url ?? '', - mode: LaunchMode.externalApplication); - } - }, - onLongPress: () { - Clipboard.setData(ClipboardData(text: app?.app.url ?? '')); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(tr('copiedToClipboard')), - )); - }, - child: Text( - app?.app.url ?? '', - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.labelSmall!.copyWith( - decoration: TextDecoration.underline, - fontStyle: FontStyle.italic), - )), - Text( - app?.app.id ?? '', - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.labelSmall, - ), - getInfoColumn(), - const SizedBox(height: 150) - ], - ); + ), + ), + Text( + app?.app.id ?? '', + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.labelSmall, + ), + getInfoColumn(), + const SizedBox(height: 150), + ], + ); getAppWebView() => app != null ? WebViewWidget( key: ObjectKey(_webViewController), controller: _webViewController - ..setBackgroundColor(Theme.of(context).colorScheme.surface)) + ..setBackgroundColor(Theme.of(context).colorScheme.surface), + ) : Container(); showMarkUpdatedDialog() { return showDialog( - context: context, - builder: (BuildContext ctx) { - return AlertDialog( - title: Text(tr('alreadyUpToDateQuestion')), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text(tr('no'))), - TextButton( - onPressed: () { - HapticFeedback.selectionClick(); - var updatedApp = app?.app; - if (updatedApp != null) { - updatedApp.installedVersion = updatedApp.latestVersion; - appsProvider.saveApps([updatedApp]); - } - Navigator.of(context).pop(); - }, - child: Text(tr('yesMarkUpdated'))) - ], - ); - }); + context: context, + builder: (BuildContext ctx) { + return AlertDialog( + title: Text(tr('alreadyUpToDateQuestion')), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(tr('no')), + ), + TextButton( + onPressed: () { + HapticFeedback.selectionClick(); + var updatedApp = app?.app; + if (updatedApp != null) { + updatedApp.installedVersion = updatedApp.latestVersion; + appsProvider.saveApps([updatedApp]); + } + Navigator.of(context).pop(); + }, + child: Text(tr('yesMarkUpdated')), + ), + ], + ); + }, + ); } showAdditionalOptionsDialog() async { return await showDialog?>( - context: context, - builder: (BuildContext ctx) { - var items = - (source?.combinedAppSpecificSettingFormItems ?? []).map((row) { - row = row.map((e) { - if (app?.app.additionalSettings[e.key] != null) { - e.defaultValue = app?.app.additionalSettings[e.key]; - } - return e; - }).toList(); - return row; + context: context, + builder: (BuildContext ctx) { + var items = (source?.combinedAppSpecificSettingFormItems ?? []).map(( + row, + ) { + row = row.map((e) { + if (app?.app.additionalSettings[e.key] != null) { + e.defaultValue = app?.app.additionalSettings[e.key]; + } + return e; }).toList(); + return row; + }).toList(); - return GeneratedFormModal( - title: tr('additionalOptions'), items: items); - }); + return GeneratedFormModal( + title: tr('additionalOptions'), + items: items, + ); + }, + ); } handleAdditionalOptionChanges(Map? values) { @@ -430,18 +454,18 @@ class _AppPageState extends State { } var versionDetectionEnabled = app.app.additionalSettings['versionDetection'] == true && - originalSettings['versionDetection'] != true; + originalSettings['versionDetection'] != true; var releaseDateVersionEnabled = app.app.additionalSettings['releaseDateAsVersion'] == true && - originalSettings['releaseDateAsVersion'] != true; + originalSettings['releaseDateAsVersion'] != true; var releaseDateVersionDisabled = app.app.additionalSettings['releaseDateAsVersion'] != true && - originalSettings['releaseDateAsVersion'] == true; + originalSettings['releaseDateAsVersion'] == true; if (releaseDateVersionEnabled) { if (app.app.releaseDate != null) { bool isUpdated = app.app.installedVersion == app.app.latestVersion; - app.app.latestVersion = - app.app.releaseDate!.microsecondsSinceEpoch.toString(); + app.app.latestVersion = app.app.releaseDate!.microsecondsSinceEpoch + .toString(); if (isUpdated) { app.app.installedVersion = app.app.latestVersion; } @@ -461,172 +485,195 @@ class _AppPageState extends State { } getInstallOrUpdateButton() => TextButton( - onPressed: !updating && - (app?.app.installedVersion == null || - app?.app.installedVersion != app?.app.latestVersion) && - !areDownloadsRunning - ? () async { - try { - var successMessage = app?.app.installedVersion == null - ? tr('installed') - : tr('appsUpdated'); - HapticFeedback.heavyImpact(); - var res = await appsProvider.downloadAndInstallLatestApps( - app?.app.id != null ? [app!.app.id] : [], - globalNavigatorKey.currentContext, - ); - if (res.isNotEmpty && !trackOnly) { - // ignore: use_build_context_synchronously - showMessage(successMessage, context); - } - if (res.isNotEmpty && mounted) { - Navigator.of(context).pop(); - } - } catch (e) { + onPressed: + !updating && + (app?.app.installedVersion == null || + app?.app.installedVersion != app?.app.latestVersion) && + !areDownloadsRunning + ? () async { + try { + var successMessage = app?.app.installedVersion == null + ? tr('installed') + : tr('appsUpdated'); + HapticFeedback.heavyImpact(); + var res = await appsProvider.downloadAndInstallLatestApps( + app?.app.id != null ? [app!.app.id] : [], + globalNavigatorKey.currentContext, + ); + if (res.isNotEmpty && !trackOnly) { // ignore: use_build_context_synchronously - showError(e, context); + showMessage(successMessage, context); } + if (res.isNotEmpty && mounted) { + Navigator.of(context).pop(); + } + } catch (e) { + // ignore: use_build_context_synchronously + showError(e, context); } - : null, - child: Text(app?.app.installedVersion == null + } + : null, + child: Text( + app?.app.installedVersion == null ? !trackOnly - ? tr('install') - : tr('markInstalled') + ? tr('install') + : tr('markInstalled') : !trackOnly - ? tr('update') - : tr('markUpdated'))); + ? tr('update') + : tr('markUpdated'), + ), + ); getBottomSheetMenu() => Padding( - padding: - EdgeInsets.fromLTRB(0, 0, 0, MediaQuery.of(context).padding.bottom), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(16, 8, 16, 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - if (source != null && - source.combinedAppSpecificSettingFormItems.isNotEmpty) - IconButton( - onPressed: app?.downloadProgress != null || updating - ? null - : () async { - var values = - await showAdditionalOptionsDialog(); - handleAdditionalOptionChanges(values); - }, - tooltip: tr('additionalOptions'), - icon: const Icon(Icons.edit)), - if (app != null && app.installedInfo != null) - IconButton( - onPressed: () { - appsProvider.openAppSettings(app.app.id); + padding: EdgeInsets.fromLTRB( + 0, + 0, + 0, + MediaQuery.of(context).padding.bottom, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(16, 8, 16, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + if (source != null && + source.combinedAppSpecificSettingFormItems.isNotEmpty) + IconButton( + onPressed: app?.downloadProgress != null || updating + ? null + : () async { + var values = await showAdditionalOptionsDialog(); + handleAdditionalOptionChanges(values); }, - icon: const Icon(Icons.settings), - tooltip: tr('settings'), - ), - if (app != null && settingsProvider.showAppWebpage) - IconButton( - onPressed: () { - showDialog( - context: context, - builder: (BuildContext ctx) { - return AlertDialog( - scrollable: true, - content: getFullInfoColumn(small: true), - title: Text(app.name), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text(tr('continue'))) - ], - ); - }); - }, - icon: const Icon(Icons.more_horiz), - tooltip: tr('more')), - if (app?.app.installedVersion != null && - app?.app.installedVersion != app?.app.latestVersion && - !isVersionDetectionStandard && - !trackOnly) - IconButton( - onPressed: app?.downloadProgress != null || updating - ? null - : showMarkUpdatedDialog, - tooltip: tr('markUpdated'), - icon: const Icon(Icons.done)), - if ((!isVersionDetectionStandard || trackOnly) && - app?.app.installedVersion != null && - app?.app.installedVersion == app?.app.latestVersion) - IconButton( - onPressed: app?.app == null || updating - ? null - : () { - app!.app.installedVersion = null; - appsProvider.saveApps([app.app]); - }, - icon: const Icon(Icons.restore_rounded), - tooltip: tr('resetInstallStatus')), - const SizedBox(width: 16.0), - Expanded(child: getInstallOrUpdateButton()), - const SizedBox(width: 16.0), - IconButton( - onPressed: app?.downloadProgress != null || updating - ? null - : () { - appsProvider - .removeAppsWithModal( - context, app != null ? [app.app] : []) - .then((value) { - if (value == true) { - Navigator.of(context).pop(); - } - }); - }, - tooltip: tr('remove'), - icon: const Icon(Icons.delete_outline), - ), - ])), - if (app?.downloadProgress != null) - Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 0, 0), - child: LinearProgressIndicator( - value: app!.downloadProgress! >= 0 - ? app.downloadProgress! / 100 - : null)) - ], - )); + tooltip: tr('additionalOptions'), + icon: const Icon(Icons.edit), + ), + if (app != null && app.installedInfo != null) + IconButton( + onPressed: () { + appsProvider.openAppSettings(app.app.id); + }, + icon: const Icon(Icons.settings), + tooltip: tr('settings'), + ), + if (app != null && settingsProvider.showAppWebpage) + IconButton( + onPressed: () { + showDialog( + context: context, + builder: (BuildContext ctx) { + return AlertDialog( + scrollable: true, + content: getFullInfoColumn(small: true), + title: Text(app.name), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(tr('continue')), + ), + ], + ); + }, + ); + }, + icon: const Icon(Icons.more_horiz), + tooltip: tr('more'), + ), + if (app?.app.installedVersion != null && + app?.app.installedVersion != app?.app.latestVersion && + !isVersionDetectionStandard && + !trackOnly) + IconButton( + onPressed: app?.downloadProgress != null || updating + ? null + : showMarkUpdatedDialog, + tooltip: tr('markUpdated'), + icon: const Icon(Icons.done), + ), + if ((!isVersionDetectionStandard || trackOnly) && + app?.app.installedVersion != null && + app?.app.installedVersion == app?.app.latestVersion) + IconButton( + onPressed: app?.app == null || updating + ? null + : () { + app!.app.installedVersion = null; + appsProvider.saveApps([app.app]); + }, + icon: const Icon(Icons.restore_rounded), + tooltip: tr('resetInstallStatus'), + ), + const SizedBox(width: 16.0), + Expanded(child: getInstallOrUpdateButton()), + const SizedBox(width: 16.0), + IconButton( + onPressed: app?.downloadProgress != null || updating + ? null + : () { + appsProvider + .removeAppsWithModal( + context, + app != null ? [app.app] : [], + ) + .then((value) { + if (value == true) { + Navigator.of(context).pop(); + } + }); + }, + tooltip: tr('remove'), + icon: const Icon(Icons.delete_outline), + ), + ], + ), + ), + if (app?.downloadProgress != null) + Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 0), + child: LinearProgressIndicator( + value: app!.downloadProgress! >= 0 + ? app.downloadProgress! / 100 + : null, + ), + ), + ], + ), + ); appScreenAppBar() => AppBar( - leading: IconButton( - icon: const Icon(Icons.arrow_back), - onPressed: () { - Navigator.pop(context); - }, - ), - ); + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () { + Navigator.pop(context); + }, + ), + ); return Scaffold( - appBar: settingsProvider.showAppWebpage ? AppBar() : appScreenAppBar(), - backgroundColor: Theme.of(context).colorScheme.surface, - body: RefreshIndicator( - child: settingsProvider.showAppWebpage - ? getAppWebView() - : CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Column(children: [getFullInfoColumn()])), - ], + appBar: settingsProvider.showAppWebpage ? AppBar() : appScreenAppBar(), + backgroundColor: Theme.of(context).colorScheme.surface, + body: RefreshIndicator( + child: settingsProvider.showAppWebpage + ? getAppWebView() + : CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Column(children: [getFullInfoColumn()]), ), - onRefresh: () async { - if (app != null) { - getUpdate(app.app.id); - } - }), - bottomSheet: getBottomSheetMenu()); + ], + ), + onRefresh: () async { + if (app != null) { + getUpdate(app.app.id); + } + }, + ), + bottomSheet: getBottomSheetMenu(), + ); } } diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 4ef8cf9..e029420 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -26,78 +26,91 @@ class AppsPage extends StatefulWidget { State createState() => AppsPageState(); } -showChangeLogDialog(BuildContext context, App app, String? changesUrl, - AppSource appSource, String changeLog) { +showChangeLogDialog( + BuildContext context, + App app, + String? changesUrl, + AppSource appSource, + String changeLog, +) { showDialog( - context: context, - builder: (BuildContext context) { - return GeneratedFormModal( - title: tr('changes'), - items: const [], - message: app.latestVersion, - additionalWidgets: [ - changesUrl != null - ? GestureDetector( - child: Text( - changesUrl, - style: const TextStyle( - decoration: TextDecoration.underline, - fontStyle: FontStyle.italic), + context: context, + builder: (BuildContext context) { + return GeneratedFormModal( + title: tr('changes'), + items: const [], + message: app.latestVersion, + additionalWidgets: [ + changesUrl != null + ? GestureDetector( + child: Text( + changesUrl, + style: const TextStyle( + decoration: TextDecoration.underline, + fontStyle: FontStyle.italic, ), - onTap: () { - launchUrlString(changesUrl, - mode: LaunchMode.externalApplication); - }, - ) - : const SizedBox.shrink(), - changesUrl != null - ? const SizedBox( - height: 16, - ) - : const SizedBox.shrink(), - appSource.changeLogIfAnyIsMarkDown - ? SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 350, - child: Markdown( - styleSheet: MarkdownStyleSheet( - blockquoteDecoration: BoxDecoration( - color: Theme.of(context).cardColor)), - data: changeLog, - onTapLink: (text, href, title) { - if (href != null) { - launchUrlString( - href.startsWith('http://') || - href.startsWith('https://') - ? href - : '${Uri.parse(app.url).origin}/$href', - mode: LaunchMode.externalApplication); - } - }, - extensionSet: md.ExtensionSet( - md.ExtensionSet.gitHubFlavored.blockSyntaxes, - [ - md.EmojiSyntax(), - ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes - ], + ), + onTap: () { + launchUrlString( + changesUrl, + mode: LaunchMode.externalApplication, + ); + }, + ) + : const SizedBox.shrink(), + changesUrl != null + ? const SizedBox(height: 16) + : const SizedBox.shrink(), + appSource.changeLogIfAnyIsMarkDown + ? SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 350, + child: Markdown( + styleSheet: MarkdownStyleSheet( + blockquoteDecoration: BoxDecoration( + color: Theme.of(context).cardColor, ), - )) - : Text(changeLog), - ], - singleNullReturnButton: tr('ok'), - ); - }); + ), + data: changeLog, + onTapLink: (text, href, title) { + if (href != null) { + launchUrlString( + href.startsWith('http://') || + href.startsWith('https://') + ? href + : '${Uri.parse(app.url).origin}/$href', + mode: LaunchMode.externalApplication, + ); + } + }, + extensionSet: md.ExtensionSet( + md.ExtensionSet.gitHubFlavored.blockSyntaxes, + [ + md.EmojiSyntax(), + ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes, + ], + ), + ), + ) + : Text(changeLog), + ], + singleNullReturnButton: tr('ok'), + ); + }, + ); } getChangeLogFn(BuildContext context, App app) { - AppSource appSource = - SourceProvider().getSource(app.url, overrideSource: app.overrideSource); + AppSource appSource = SourceProvider().getSource( + app.url, + overrideSource: app.overrideSource, + ); String? changesUrl = appSource.changeLogPageFromStandardUrl(app.url); String? changeLog = app.changeLog; if (changeLog?.split('\n').length == 1) { if (RegExp( - '(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?') - .hasMatch(changeLog!)) { + '(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?', + ).hasMatch(changeLog!)) { if (changesUrl == null) { changesUrl = changeLog; changeLog = null; @@ -118,8 +131,10 @@ getChangeLogFn(BuildContext context, App app) { class AppsPageState extends State { AppsFilter filter = AppsFilter(); final AppsFilter neutralFilter = AppsFilter(); - var updatesOnlyFilter = - AppsFilter(includeUptodate: false, includeNonInstalled: false); + var updatesOnlyFilter = AppsFilter( + includeUptodate: false, + includeNonInstalled: false, + ); Set selectedAppIds = {}; DateTime? refreshingSince; @@ -161,14 +176,17 @@ class AppsPageState extends State { setState(() { refreshingSince = DateTime.now(); }); - return appsProvider.checkUpdates().catchError((e) { - showError(e is Map ? e['errors'] : e, context); - return []; - }).whenComplete(() { - setState(() { - refreshingSince = null; - }); - }); + return appsProvider + .checkUpdates() + .catchError((e) { + showError(e is Map ? e['errors'] : e, context); + return []; + }) + .whenComplete(() { + setState(() { + refreshingSince = null; + }); + }); } if (!appsProvider.loadingApps && @@ -234,8 +252,10 @@ class AppsPageState extends State { } if (filter.sourceFilter.isNotEmpty && sourceProvider - .getSource(app.app.url, - overrideSource: app.app.overrideSource) + .getSource( + app.app.url, + overrideSource: app.app.overrideSource, + ) .runtimeType .toString() != filter.sourceFilter) { @@ -247,15 +267,19 @@ class AppsPageState extends State { listedApps.sort((a, b) { int result = 0; if (settingsProvider.sortColumn == SortColumnSettings.authorName) { - result = ((a.author + a.name).toLowerCase()) - .compareTo((b.author + b.name).toLowerCase()); + result = ((a.author + a.name).toLowerCase()).compareTo( + (b.author + b.name).toLowerCase(), + ); } else if (settingsProvider.sortColumn == SortColumnSettings.nameAuthor) { - result = ((a.name + a.author).toLowerCase()) - .compareTo((b.name + b.author).toLowerCase()); + result = ((a.name + a.author).toLowerCase()).compareTo( + (b.name + b.author).toLowerCase(), + ); } else if (settingsProvider.sortColumn == SortColumnSettings.releaseDate) { - result = (a.app.releaseDate)?.compareTo( - b.app.releaseDate ?? DateTime.fromMicrosecondsSinceEpoch(0)) ?? + result = + (a.app.releaseDate)?.compareTo( + b.app.releaseDate ?? DateTime.fromMicrosecondsSinceEpoch(0), + ) ?? 0; } return result; @@ -268,15 +292,19 @@ class AppsPageState extends State { var existingUpdates = appsProvider.findExistingUpdates(installedOnly: true); var existingUpdateIdsAllOrSelected = existingUpdates - .where((element) => selectedAppIds.isEmpty - ? listedApps.where((a) => a.app.id == element).isNotEmpty - : selectedAppIds.map((e) => e).contains(element)) + .where( + (element) => selectedAppIds.isEmpty + ? listedApps.where((a) => a.app.id == element).isNotEmpty + : selectedAppIds.map((e) => e).contains(element), + ) .toList(); var newInstallIdsAllOrSelected = appsProvider .findExistingUpdates(nonInstalledOnly: true) - .where((element) => selectedAppIds.isEmpty - ? listedApps.where((a) => a.app.id == element).isNotEmpty - : selectedAppIds.map((e) => e).contains(element)) + .where( + (element) => selectedAppIds.isEmpty + ? listedApps.where((a) => a.app.id == element).isNotEmpty + : selectedAppIds.map((e) => e).contains(element), + ) .toList(); List trackOnlyUpdateIdsAllOrSelected = []; @@ -331,11 +359,12 @@ class AppsPageState extends State { listedApps = [...tempPinned, ...tempNotPinned]; List getListedCategories() { - var temp = listedApps - .map((e) => e.app.categories.isNotEmpty ? e.app.categories : [null]); + var temp = listedApps.map( + (e) => e.app.categories.isNotEmpty ? e.app.categories : [null], + ); return temp.isNotEmpty ? { - ...temp.reduce((v, e) => [...v, ...e]) + ...temp.reduce((v, e) => [...v, ...e]), }.toList() : []; } @@ -345,8 +374,8 @@ class AppsPageState extends State { return a != null && b != null ? a.toLowerCase().compareTo(b.toLowerCase()) : a == null - ? 1 - : -1; + ? 1 + : -1; }); Set selectedApps = listedApps @@ -358,92 +387,106 @@ class AppsPageState extends State { return [ if (listedApps.isEmpty) SliverFillRemaining( - child: Center( - child: Text( - appsProvider.apps.isEmpty - ? appsProvider.loadingApps - ? tr('pleaseWait') - : tr('noApps') - : tr('noAppsForFilter'), - style: Theme.of(context).textTheme.headlineMedium, - textAlign: TextAlign.center, - ))), + child: Center( + child: Text( + appsProvider.apps.isEmpty + ? appsProvider.loadingApps + ? tr('pleaseWait') + : tr('noApps') + : tr('noAppsForFilter'), + style: Theme.of(context).textTheme.headlineMedium, + textAlign: TextAlign.center, + ), + ), + ), if (refreshingSince != null || appsProvider.loadingApps) SliverToBoxAdapter( child: LinearProgressIndicator( value: appsProvider.loadingApps ? null : appsProvider - .getAppValues() - .where((element) => !(element.app.lastUpdateCheck - ?.isBefore(refreshingSince!) ?? - true)) - .length / - (appsProvider.apps.isNotEmpty - ? appsProvider.apps.length - : 1), + .getAppValues() + .where( + (element) => + !(element.app.lastUpdateCheck?.isBefore( + refreshingSince!, + ) ?? + true), + ) + .length / + (appsProvider.apps.isNotEmpty + ? appsProvider.apps.length + : 1), ), - ) + ), ]; } getUpdateButton(int appIndex) { return IconButton( - visualDensity: VisualDensity.compact, - color: Theme.of(context).colorScheme.primary, - tooltip: - listedApps[appIndex].app.additionalSettings['trackOnly'] == true - ? tr('markUpdated') - : tr('update'), - onPressed: appsProvider.areDownloadsRunning() - ? null - : () { - appsProvider.downloadAndInstallLatestApps( - [listedApps[appIndex].app.id], - globalNavigatorKey.currentContext).catchError((e) { - showError(e, context); - return []; - }); - }, - icon: Icon( - listedApps[appIndex].app.additionalSettings['trackOnly'] == true - ? Icons.check_circle_outline - : Icons.install_mobile)); + visualDensity: VisualDensity.compact, + color: Theme.of(context).colorScheme.primary, + tooltip: + listedApps[appIndex].app.additionalSettings['trackOnly'] == true + ? tr('markUpdated') + : tr('update'), + onPressed: appsProvider.areDownloadsRunning() + ? null + : () { + appsProvider + .downloadAndInstallLatestApps([ + listedApps[appIndex].app.id, + ], globalNavigatorKey.currentContext) + .catchError((e) { + showError(e, context); + return []; + }); + }, + icon: Icon( + listedApps[appIndex].app.additionalSettings['trackOnly'] == true + ? Icons.check_circle_outline + : Icons.install_mobile, + ), + ); } getAppIcon(int appIndex) { return FutureBuilder( - future: appsProvider.updateAppIcon(listedApps[appIndex].app.id), - builder: (ctx, val) { - return listedApps[appIndex].icon != null - ? Image.memory( - listedApps[appIndex].icon!, - gaplessPlayback: true, - opacity: AlwaysStoppedAnimation( - listedApps[appIndex].installedInfo == null ? 0.6 : 1), - ) - : Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Transform( - alignment: Alignment.center, - transform: Matrix4.rotationZ(0.31), - child: Padding( - padding: const EdgeInsets.all(15), - child: Image( - image: const AssetImage( - 'assets/graphics/icon_small.png'), - color: Theme.of(context).brightness == - Brightness.dark - ? Colors.white.withOpacity(0.4) - : Colors.white.withOpacity(0.3), - colorBlendMode: BlendMode.modulate, - gaplessPlayback: true, - ), - )), - ]); - }); + future: appsProvider.updateAppIcon(listedApps[appIndex].app.id), + builder: (ctx, val) { + return listedApps[appIndex].icon != null + ? Image.memory( + listedApps[appIndex].icon!, + gaplessPlayback: true, + opacity: AlwaysStoppedAnimation( + listedApps[appIndex].installedInfo == null ? 0.6 : 1, + ), + ) + : Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Transform( + alignment: Alignment.center, + transform: Matrix4.rotationZ(0.31), + child: Padding( + padding: const EdgeInsets.all(15), + child: Image( + image: const AssetImage( + 'assets/graphics/icon_small.png', + ), + color: Theme.of(context).brightness == Brightness.dark + ? Colors.white.withOpacity(0.4) + : Colors.white.withOpacity(0.3), + colorBlendMode: BlendMode.modulate, + gaplessPlayback: true, + ), + ), + ), + ], + ); + }, + ); } getVersionText(int appIndex) { @@ -453,15 +496,17 @@ class AppsPageState extends State { getChangesButtonString(int appIndex, bool hasChangeLogFn) { return listedApps[appIndex].app.releaseDate == null ? hasChangeLogFn - ? tr('changes') - : '' - : DateFormat('yyyy-MM-dd') - .format(listedApps[appIndex].app.releaseDate!.toLocal()); + ? tr('changes') + : '' + : DateFormat( + 'yyyy-MM-dd', + ).format(listedApps[appIndex].app.releaseDate!.toLocal()); } getSingleAppHorizTile(int index) { var showChangesFn = getChangeLogFn(context, listedApps[index].app); - var hasUpdate = listedApps[index].app.installedVersion != null && + var hasUpdate = + listedApps[index].app.installedVersion != null && listedApps[index].app.installedVersion != listedApps[index].app.latestVersion; Widget trailingRow = Row( @@ -469,168 +514,195 @@ class AppsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ hasUpdate ? getUpdateButton(index) : const SizedBox.shrink(), - hasUpdate - ? const SizedBox( - width: 5, - ) - : const SizedBox.shrink(), + hasUpdate ? const SizedBox(width: 5) : const SizedBox.shrink(), GestureDetector( - onTap: showChangesFn, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: settingsProvider.highlightTouchTargets && - showChangesFn != null - ? (Theme.of(context).brightness == Brightness.light - ? Theme.of(context).primaryColor - : Theme.of(context).primaryColorLight) - .withAlpha(Theme.of(context).brightness == - Brightness.light - ? 20 - : 40) - : null), - padding: settingsProvider.highlightTouchTargets - ? const EdgeInsetsDirectional.fromSTEB(12, 0, 12, 0) - : const EdgeInsetsDirectional.fromSTEB(24, 0, 0, 0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row(mainAxisSize: MainAxisSize.min, children: [ - Container( - constraints: BoxConstraints( - maxWidth: - MediaQuery.of(context).size.width / 4), - child: Text(getVersionText(index), - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.end, - style: isVersionPseudo(listedApps[index].app) - ? TextStyle(fontStyle: FontStyle.italic) - : null)), - ]), - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - getChangesButtonString( - index, showChangesFn != null), - style: TextStyle( - fontStyle: FontStyle.italic, - decoration: showChangesFn != null - ? TextDecoration.underline - : TextDecoration.none), + onTap: showChangesFn, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: + settingsProvider.highlightTouchTargets && + showChangesFn != null + ? (Theme.of(context).brightness == Brightness.light + ? Theme.of(context).primaryColor + : Theme.of(context).primaryColorLight) + .withAlpha( + Theme.of(context).brightness == Brightness.light + ? 20 + : 40, ) - ], + : null, + ), + padding: settingsProvider.highlightTouchTargets + ? const EdgeInsetsDirectional.fromSTEB(12, 0, 12, 0) + : const EdgeInsetsDirectional.fromSTEB(24, 0, 0, 0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + constraints: BoxConstraints( + maxWidth: MediaQuery.of(context).size.width / 4, + ), + child: Text( + getVersionText(index), + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.end, + style: isVersionPseudo(listedApps[index].app) + ? TextStyle(fontStyle: FontStyle.italic) + : null, + ), ), ], - ))) + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + getChangesButtonString(index, showChangesFn != null), + style: TextStyle( + fontStyle: FontStyle.italic, + decoration: showChangesFn != null + ? TextDecoration.underline + : TextDecoration.none, + ), + ), + ], + ), + ], + ), + ), + ), ], ); - var transparent = - Theme.of(context).colorScheme.surface.withAlpha(0).value; + var transparent = Theme.of( + context, + ).colorScheme.surface.withAlpha(0).value; List stops = [ - ...listedApps[index].app.categories.asMap().entries.map((e) => - ((e.key / (listedApps[index].app.categories.length - 1)) - 0.0001)), - 1 + ...listedApps[index].app.categories.asMap().entries.map( + (e) => + ((e.key / (listedApps[index].app.categories.length - 1)) - + 0.0001), + ), + 1, ]; if (stops.length == 2) { stops[0] = 0.9999; } return Container( - decoration: BoxDecoration( - gradient: LinearGradient( - stops: stops, - begin: const Alignment(-1, 0), - end: const Alignment(-0.97, 0), - colors: [ - ...listedApps[index].app.categories.map((e) => - Color(settingsProvider.categories[e] ?? transparent) - .withAlpha(255)), - Color(transparent) - ])), - child: ListTile( - tileColor: listedApps[index].app.pinned - ? Colors.grey.withOpacity(0.1) - : Colors.transparent, - selectedTileColor: Theme.of(context) - .colorScheme - .primary - .withOpacity(listedApps[index].app.pinned ? 0.2 : 0.1), - selected: - selectedAppIds.map((e) => e).contains(listedApps[index].app.id), - onLongPress: () { - toggleAppSelected(listedApps[index].app); - }, - leading: getAppIcon(index), - title: Text( - maxLines: 1, - listedApps[index].name, - style: TextStyle( - overflow: TextOverflow.ellipsis, - fontWeight: listedApps[index].app.pinned - ? FontWeight.bold - : FontWeight.normal, + decoration: BoxDecoration( + gradient: LinearGradient( + stops: stops, + begin: const Alignment(-1, 0), + end: const Alignment(-0.97, 0), + colors: [ + ...listedApps[index].app.categories.map( + (e) => Color( + settingsProvider.categories[e] ?? transparent, + ).withAlpha(255), ), + Color(transparent), + ], + ), + ), + child: ListTile( + tileColor: listedApps[index].app.pinned + ? Colors.grey.withOpacity(0.1) + : Colors.transparent, + selectedTileColor: Theme.of(context).colorScheme.primary.withOpacity( + listedApps[index].app.pinned ? 0.2 : 0.1, + ), + selected: selectedAppIds + .map((e) => e) + .contains(listedApps[index].app.id), + onLongPress: () { + toggleAppSelected(listedApps[index].app); + }, + leading: getAppIcon(index), + title: Text( + maxLines: 1, + listedApps[index].name, + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontWeight: listedApps[index].app.pinned + ? FontWeight.bold + : FontWeight.normal, ), - subtitle: Text(tr('byX', args: [listedApps[index].author]), - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - fontWeight: listedApps[index].app.pinned - ? FontWeight.bold - : FontWeight.normal)), - trailing: listedApps[index].downloadProgress != null - ? SizedBox( - child: Text( + ), + subtitle: Text( + tr('byX', args: [listedApps[index].author]), + maxLines: 1, + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontWeight: listedApps[index].app.pinned + ? FontWeight.bold + : FontWeight.normal, + ), + ), + trailing: listedApps[index].downloadProgress != null + ? SizedBox( + child: Text( listedApps[index].downloadProgress! >= 0 - ? tr('percentProgress', args: [ - listedApps[index] - .downloadProgress! - .toInt() - .toString() - ]) + ? tr( + 'percentProgress', + args: [ + listedApps[index].downloadProgress! + .toInt() + .toString(), + ], + ) : tr('installing'), textAlign: (listedApps[index].downloadProgress! >= 0) ? TextAlign.start : TextAlign.end, - )) - : trailingRow, - onTap: () { - if (selectedAppIds.isNotEmpty) { - toggleAppSelected(listedApps[index].app); - } else { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - AppPage(appId: listedApps[index].app.id)), - ); - } - }, - )); + ), + ) + : trailingRow, + onTap: () { + if (selectedAppIds.isNotEmpty) { + toggleAppSelected(listedApps[index].app); + } else { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + AppPage(appId: listedApps[index].app.id), + ), + ); + } + }, + ), + ); } getCategoryCollapsibleTile(int index) { var tiles = listedApps .asMap() .entries - .where((e) => - e.value.app.categories.contains(listedCategories[index]) || - e.value.app.categories.isEmpty && listedCategories[index] == null) + .where( + (e) => + e.value.app.categories.contains(listedCategories[index]) || + e.value.app.categories.isEmpty && + listedCategories[index] == null, + ) .map((e) => getSingleAppHorizTile(e.key)) .toList(); capFirstChar(String str) => str[0].toUpperCase() + str.substring(1); return ExpansionTile( - initiallyExpanded: true, - title: Text( - capFirstChar(listedCategories[index] ?? tr('noCategory')), - style: const TextStyle(fontWeight: FontWeight.bold), - ), - controlAffinity: ListTileControlAffinity.leading, - trailing: Text(tiles.length.toString()), - children: tiles); + initiallyExpanded: true, + title: Text( + capFirstChar(listedCategories[index] ?? tr('noCategory')), + style: const TextStyle(fontWeight: FontWeight.bold), + ), + controlAffinity: ListTileControlAffinity.leading, + trailing: Text(tiles.length.toString()), + children: tiles, + ); } getSelectAllButton() { @@ -644,7 +716,8 @@ class AppsPageState extends State { Icons.select_all_outlined, color: Theme.of(context).colorScheme.primary, ), - label: Text(listedApps.length.toString())) + label: Text(listedApps.length.toString()), + ) : TextButton.icon( style: const ButtonStyle(visualDensity: VisualDensity.compact), onPressed: () { @@ -658,7 +731,8 @@ class AppsPageState extends State { : Icons.deselect_outlined, color: Theme.of(context).colorScheme.primary, ), - label: Text(selectedAppIds.length.toString())); + label: Text(selectedAppIds.length.toString()), + ); } getMassObtainFunction() { @@ -671,42 +745,72 @@ class AppsPageState extends State { HapticFeedback.heavyImpact(); List formItems = []; if (existingUpdateIdsAllOrSelected.isNotEmpty) { - formItems.add(GeneratedFormSwitch('updates', - label: tr('updateX', args: [ - plural('apps', existingUpdateIdsAllOrSelected.length) - .toLowerCase() - ]), - defaultValue: true)); + formItems.add( + GeneratedFormSwitch( + 'updates', + label: tr( + 'updateX', + args: [ + plural( + 'apps', + existingUpdateIdsAllOrSelected.length, + ).toLowerCase(), + ], + ), + defaultValue: true, + ), + ); } if (newInstallIdsAllOrSelected.isNotEmpty) { - formItems.add(GeneratedFormSwitch('installs', - label: tr('installX', args: [ - plural('apps', newInstallIdsAllOrSelected.length) - .toLowerCase() - ]), - defaultValue: existingUpdateIdsAllOrSelected.isEmpty)); + formItems.add( + GeneratedFormSwitch( + 'installs', + label: tr( + 'installX', + args: [ + plural( + 'apps', + newInstallIdsAllOrSelected.length, + ).toLowerCase(), + ], + ), + defaultValue: existingUpdateIdsAllOrSelected.isEmpty, + ), + ); } if (trackOnlyUpdateIdsAllOrSelected.isNotEmpty) { - formItems.add(GeneratedFormSwitch('trackonlies', - label: tr('markXTrackOnlyAsUpdated', args: [ - plural('apps', trackOnlyUpdateIdsAllOrSelected.length) - ]), - defaultValue: existingUpdateIdsAllOrSelected.isEmpty && - newInstallIdsAllOrSelected.isEmpty)); + formItems.add( + GeneratedFormSwitch( + 'trackonlies', + label: tr( + 'markXTrackOnlyAsUpdated', + args: [ + plural('apps', trackOnlyUpdateIdsAllOrSelected.length), + ], + ), + defaultValue: + existingUpdateIdsAllOrSelected.isEmpty && + newInstallIdsAllOrSelected.isEmpty, + ), + ); } showDialog?>( - context: context, - builder: (BuildContext ctx) { - var totalApps = existingUpdateIdsAllOrSelected.length + - newInstallIdsAllOrSelected.length + - trackOnlyUpdateIdsAllOrSelected.length; - return GeneratedFormModal( - title: tr('changeX', - args: [plural('apps', totalApps).toLowerCase()]), - items: formItems.map((e) => [e]).toList(), - initValid: true, - ); - }).then((values) async { + context: context, + builder: (BuildContext ctx) { + var totalApps = + existingUpdateIdsAllOrSelected.length + + newInstallIdsAllOrSelected.length + + trackOnlyUpdateIdsAllOrSelected.length; + return GeneratedFormModal( + title: tr( + 'changeX', + args: [plural('apps', totalApps).toLowerCase()], + ), + items: formItems.map((e) => [e]).toList(), + initValid: true, + ); + }, + ).then((values) async { if (values != null) { if (values.isEmpty) { values = getDefaultValuesFromFormItems([formItems]); @@ -726,15 +830,18 @@ class AppsPageState extends State { } appsProvider .downloadAndInstallLatestApps( - toInstall, globalNavigatorKey.currentContext) + toInstall, + globalNavigatorKey.currentContext, + ) .catchError((e) { - showError(e, context); - return []; - }).then((value) { - if (value.isNotEmpty && shouldInstallUpdates) { - showMessage(tr('appsUpdated'), context); - } - }); + showError(e, context); + return []; + }) + .then((value) { + if (value.isNotEmpty && shouldInstallUpdates) { + showMessage(tr('appsUpdated'), context); + } + }); } }); }; @@ -758,42 +865,47 @@ class AppsPageState extends State { } var cont = true; if (showPrompt) { - cont = await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: tr('categorize'), - items: const [], - initValid: true, - message: tr('selectedCategorizeWarning'), - ); - }) != + cont = + await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: tr('categorize'), + items: const [], + initValid: true, + message: tr('selectedCategorizeWarning'), + ); + }, + ) != null; } if (cont) { // ignore: use_build_context_synchronously await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: tr('categorize'), - items: const [], - initValid: true, - singleNullReturnButton: tr('continue'), - additionalWidgets: [ - CategoryEditorSelector( - preselected: !showPrompt ? preselected ?? {} : {}, - showLabelWhenNotEmpty: false, - onSelected: (categories) { - appsProvider.saveApps(selectedApps.map((e) { + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: tr('categorize'), + items: const [], + initValid: true, + singleNullReturnButton: tr('continue'), + additionalWidgets: [ + CategoryEditorSelector( + preselected: !showPrompt ? preselected ?? {} : {}, + showLabelWhenNotEmpty: false, + onSelected: (categories) { + appsProvider.saveApps( + selectedApps.map((e) { e.categories = categories; return e; - }).toList()); - }, - ) - ], - ); - }); + }).toList(), + ); + }, + ), + ], + ); + }, + ); } } catch (err) { showError(err, context); @@ -803,179 +915,199 @@ class AppsPageState extends State { showMassMarkDialog() { return showDialog( - context: context, - builder: (BuildContext ctx) { - return AlertDialog( - title: Text(tr('markXSelectedAppsAsUpdated', - args: [selectedAppIds.length.toString()])), - content: Text( - tr('onlyWorksWithNonVersionDetectApps'), - style: const TextStyle( - fontWeight: FontWeight.bold, fontStyle: FontStyle.italic), + context: context, + builder: (BuildContext ctx) { + return AlertDialog( + title: Text( + tr( + 'markXSelectedAppsAsUpdated', + args: [selectedAppIds.length.toString()], ), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text(tr('no'))), - TextButton( - onPressed: () { - HapticFeedback.selectionClick(); - appsProvider.saveApps(selectedApps.map((a) { - if (a.installedVersion != null && - !appsProvider.isVersionDetectionPossible( - appsProvider.apps[a.id])) { - a.installedVersion = a.latestVersion; - } - return a; - }).toList()); + ), + content: Text( + tr('onlyWorksWithNonVersionDetectApps'), + style: const TextStyle( + fontWeight: FontWeight.bold, + fontStyle: FontStyle.italic, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(tr('no')), + ), + TextButton( + onPressed: () { + HapticFeedback.selectionClick(); + appsProvider.saveApps( + selectedApps.map((a) { + if (a.installedVersion != null && + !appsProvider.isVersionDetectionPossible( + appsProvider.apps[a.id], + )) { + a.installedVersion = a.latestVersion; + } + return a; + }).toList(), + ); - Navigator.of(context).pop(); - }, - child: Text(tr('yes'))) - ], - ); - }).whenComplete(() { + Navigator.of(context).pop(); + }, + child: Text(tr('yes')), + ), + ], + ); + }, + ).whenComplete(() { Navigator.of(context).pop(); }); } pinSelectedApps() { var pinStatus = selectedApps.where((element) => element.pinned).isEmpty; - appsProvider.saveApps(selectedApps.map((e) { - e.pinned = pinStatus; - return e; - }).toList()); + appsProvider.saveApps( + selectedApps.map((e) { + e.pinned = pinStatus; + return e; + }).toList(), + ); Navigator.of(context).pop(); } showMoreOptionsDialog() { return showDialog( - context: context, - builder: (BuildContext ctx) { - return AlertDialog( - scrollable: true, - content: Padding( - padding: const EdgeInsets.only(top: 6), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - TextButton( - onPressed: pinSelectedApps, - child: Text(selectedApps - .where((element) => element.pinned) - .isEmpty - ? tr('pinToTop') - : tr('unpinFromTop'))), - const Divider(), - TextButton( - onPressed: () { + context: context, + builder: (BuildContext ctx) { + return AlertDialog( + scrollable: true, + content: Padding( + padding: const EdgeInsets.only(top: 6), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + TextButton( + onPressed: pinSelectedApps, + child: Text( + selectedApps.where((element) => element.pinned).isEmpty + ? tr('pinToTop') + : tr('unpinFromTop'), + ), + ), + const Divider(), + TextButton( + onPressed: () { + String urls = ''; + for (var a in selectedApps) { + urls += '${a.url}\n'; + } + urls = urls.substring(0, urls.length - 1); + Share.share( + urls, + subject: 'Obtainium - ${tr('appsString')}', + ); + Navigator.of(context).pop(); + }, + child: Text(tr('shareSelectedAppURLs')), + ), + const Divider(), + TextButton( + onPressed: selectedAppIds.isEmpty + ? null + : () { String urls = ''; for (var a in selectedApps) { - urls += '${a.url}\n'; + urls += + 'https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/${Uri.encodeComponent(jsonEncode({'id': a.id, 'url': a.url, 'author': a.author, 'name': a.name, 'preferredApkIndex': a.preferredApkIndex, 'additionalSettings': jsonEncode(a.additionalSettings), 'overrideSource': a.overrideSource}))}\n\n'; } - urls = urls.substring(0, urls.length - 1); - Share.share(urls, - subject: 'Obtainium - ${tr('appsString')}'); - Navigator.of(context).pop(); + Share.share( + urls, + subject: 'Obtainium - ${tr('appsString')}', + ); }, - child: Text(tr('shareSelectedAppURLs'))), - const Divider(), - TextButton( - onPressed: selectedAppIds.isEmpty - ? null - : () { - String urls = ''; - for (var a in selectedApps) { - urls += - 'https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/${Uri.encodeComponent(jsonEncode({ - 'id': a.id, - 'url': a.url, - 'author': a.author, - 'name': a.name, - 'preferredApkIndex': - a.preferredApkIndex, - 'additionalSettings': - jsonEncode(a.additionalSettings), - 'overrideSource': a.overrideSource - }))}\n\n'; - } - Share.share(urls, - subject: - 'Obtainium - ${tr('appsString')}'); - }, - child: Text(tr('shareAppConfigLinks'))), - const Divider(), - TextButton( - onPressed: selectedAppIds.isEmpty - ? null - : () { - var encoder = const JsonEncoder.withIndent(" "); - var exportJSON = encoder.convert( - appsProvider.generateExportJSON( - appIds: selectedApps - .map((e) => e.id) - .toList(), - overrideExportSettings: false)); - String fn = - '${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}-count-${selectedApps.length}'; - XFile f = XFile.fromData( - Uint8List.fromList( - utf8.encode(exportJSON)), - mimeType: 'application/json', - name: fn); - Share.shareXFiles([f], - fileNameOverrides: ['$fn.json']); - }, - child: Text( - '${tr('share')} - ${tr('obtainiumExport')}')), - const Divider(), - TextButton( - onPressed: () { - appsProvider - .downloadAppAssets( - selectedApps.map((e) => e.id).toList(), - globalNavigatorKey.currentContext ?? - context) - .catchError((e) => showError( - e, - globalNavigatorKey.currentContext ?? - context)); - Navigator.of(context).pop(); + child: Text(tr('shareAppConfigLinks')), + ), + const Divider(), + TextButton( + onPressed: selectedAppIds.isEmpty + ? null + : () { + var encoder = const JsonEncoder.withIndent(" "); + var exportJSON = encoder.convert( + appsProvider.generateExportJSON( + appIds: selectedApps.map((e) => e.id).toList(), + overrideExportSettings: false, + ), + ); + String fn = + '${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}-count-${selectedApps.length}'; + XFile f = XFile.fromData( + Uint8List.fromList(utf8.encode(exportJSON)), + mimeType: 'application/json', + name: fn, + ); + Share.shareXFiles( + [f], + fileNameOverrides: ['$fn.json'], + ); }, - child: Text(tr('downloadX', - args: [tr('releaseAsset').toLowerCase()]))), - const Divider(), - TextButton( - onPressed: appsProvider.areDownloadsRunning() - ? null - : showMassMarkDialog, - child: Text(tr('markSelectedAppsUpdated'))), - ]), + child: Text('${tr('share')} - ${tr('obtainiumExport')}'), + ), + const Divider(), + TextButton( + onPressed: () { + appsProvider + .downloadAppAssets( + selectedApps.map((e) => e.id).toList(), + globalNavigatorKey.currentContext ?? context, + ) + .catchError( + (e) => showError( + e, + globalNavigatorKey.currentContext ?? context, + ), + ); + Navigator.of(context).pop(); + }, + child: Text( + tr('downloadX', args: [tr('releaseAsset').toLowerCase()]), + ), + ), + const Divider(), + TextButton( + onPressed: appsProvider.areDownloadsRunning() + ? null + : showMassMarkDialog, + child: Text(tr('markSelectedAppsUpdated')), + ), + ], ), - ); - }); + ), + ); + }, + ); } getMainBottomButtons() { return [ IconButton( - visualDensity: VisualDensity.compact, - onPressed: getMassObtainFunction(), - tooltip: selectedAppIds.isEmpty - ? tr('installUpdateApps') - : tr('installUpdateSelectedApps'), - icon: const Icon( - Icons.file_download_outlined, - )), + visualDensity: VisualDensity.compact, + onPressed: getMassObtainFunction(), + tooltip: selectedAppIds.isEmpty + ? tr('installUpdateApps') + : tr('installUpdateSelectedApps'), + icon: const Icon(Icons.file_download_outlined), + ), IconButton( visualDensity: VisualDensity.compact, onPressed: selectedAppIds.isEmpty ? null : () { appsProvider.removeAppsWithModal( - context, selectedApps.toList()); + context, + selectedApps.toList(), + ); }, tooltip: tr('removeSelectedApps'), icon: const Icon(Icons.delete_outline_outlined), @@ -997,64 +1129,75 @@ class AppsPageState extends State { showFilterDialog() async { var values = await showDialog?>( - context: context, - builder: (BuildContext ctx) { - var vals = filter.toFormValuesMap(); - return GeneratedFormModal( - initValid: true, - title: tr('filterApps'), - items: [ - [ - GeneratedFormTextField('appName', - label: tr('appName'), - required: false, - defaultValue: vals['appName']), - GeneratedFormTextField('author', - label: tr('author'), - required: false, - defaultValue: vals['author']) - ], - [ - GeneratedFormTextField('appId', - label: tr('appId'), - required: false, - defaultValue: vals['appId']) - ], - [ - GeneratedFormSwitch('upToDateApps', - label: tr('upToDateApps'), - defaultValue: vals['upToDateApps']) - ], - [ - GeneratedFormSwitch('nonInstalledApps', - label: tr('nonInstalledApps'), - defaultValue: vals['nonInstalledApps']) - ], - [ - GeneratedFormDropdown( - 'sourceFilter', - label: tr('appSource'), - defaultValue: filter.sourceFilter, - [ - MapEntry('', tr('none')), - ...sourceProvider.sources.map( - (e) => MapEntry(e.runtimeType.toString(), e.name)) - ]) - ] - ], - additionalWidgets: [ - const SizedBox( - height: 16, + context: context, + builder: (BuildContext ctx) { + var vals = filter.toFormValuesMap(); + return GeneratedFormModal( + initValid: true, + title: tr('filterApps'), + items: [ + [ + GeneratedFormTextField( + 'appName', + label: tr('appName'), + required: false, + defaultValue: vals['appName'], + ), + GeneratedFormTextField( + 'author', + label: tr('author'), + required: false, + defaultValue: vals['author'], ), - CategoryEditorSelector( - preselected: filter.categoryFilter, - onSelected: (categories) { - filter.categoryFilter = categories.toSet(); - }, - ) ], - ); - }); + [ + GeneratedFormTextField( + 'appId', + label: tr('appId'), + required: false, + defaultValue: vals['appId'], + ), + ], + [ + GeneratedFormSwitch( + 'upToDateApps', + label: tr('upToDateApps'), + defaultValue: vals['upToDateApps'], + ), + ], + [ + GeneratedFormSwitch( + 'nonInstalledApps', + label: tr('nonInstalledApps'), + defaultValue: vals['nonInstalledApps'], + ), + ], + [ + GeneratedFormDropdown( + 'sourceFilter', + label: tr('appSource'), + defaultValue: filter.sourceFilter, + [ + MapEntry('', tr('none')), + ...sourceProvider.sources.map( + (e) => MapEntry(e.runtimeType.toString(), e.name), + ), + ], + ), + ], + ], + additionalWidgets: [ + const SizedBox(height: 16), + CategoryEditorSelector( + preselected: filter.categoryFilter, + onSelected: (categories) { + filter.categoryFilter = categories.toSet(); + }, + ), + ], + ); + }, + ); if (values != null) { setState(() { filter.setFormValuesFromMap(values); @@ -1068,30 +1211,30 @@ class AppsPageState extends State { children: [ getSelectAllButton(), IconButton( - color: Theme.of(context).colorScheme.primary, - style: const ButtonStyle(visualDensity: VisualDensity.compact), - tooltip: isFilterOff - ? tr('filterApps') - : '${tr('filter')} - ${tr('remove')}', - onPressed: isFilterOff - ? showFilterDialog - : () { - setState(() { - filter = AppsFilter(); - }); - }, - icon: Icon(isFilterOff - ? Icons.search_rounded - : Icons.search_off_rounded)), - const SizedBox( - width: 10, + color: Theme.of(context).colorScheme.primary, + style: const ButtonStyle(visualDensity: VisualDensity.compact), + tooltip: isFilterOff + ? tr('filterApps') + : '${tr('filter')} - ${tr('remove')}', + onPressed: isFilterOff + ? showFilterDialog + : () { + setState(() { + filter = AppsFilter(); + }); + }, + icon: Icon( + isFilterOff ? Icons.search_rounded : Icons.search_off_rounded, + ), ), + const SizedBox(width: 10), const VerticalDivider(), Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: getMainBottomButtons(), - )), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: getMainBottomButtons(), + ), + ), ], ); } @@ -1101,38 +1244,45 @@ class AppsPageState extends State { !(listedCategories.isEmpty || (listedCategories.length == 1 && listedCategories[0] == null)) ? SliverList( - delegate: - SliverChildBuilderDelegate((BuildContext context, int index) { - return getCategoryCollapsibleTile(index); - }, childCount: listedCategories.length)) + delegate: SliverChildBuilderDelegate(( + BuildContext context, + int index, + ) { + return getCategoryCollapsibleTile(index); + }, childCount: listedCategories.length), + ) : SliverList( - delegate: - SliverChildBuilderDelegate((BuildContext context, int index) { - return getSingleAppHorizTile(index); - }, childCount: listedApps.length)); + delegate: SliverChildBuilderDelegate(( + BuildContext context, + int index, + ) { + return getSingleAppHorizTile(index); + }, childCount: listedApps.length), + ); } return Scaffold( backgroundColor: Theme.of(context).colorScheme.surface, body: RefreshIndicator( - key: _refreshIndicatorKey, - onRefresh: refresh, - child: Scrollbar( - interactive: true, - controller: scrollController, - child: CustomScrollView( - physics: const AlwaysScrollableScrollPhysics(), - controller: scrollController, - slivers: [ - CustomAppBar(title: tr('appsString')), - ...getLoadingWidgets(), - getDisplayedList() - ]))), + key: _refreshIndicatorKey, + onRefresh: refresh, + child: Scrollbar( + interactive: true, + controller: scrollController, + child: CustomScrollView( + physics: const AlwaysScrollableScrollPhysics(), + controller: scrollController, + slivers: [ + CustomAppBar(title: tr('appsString')), + ...getLoadingWidgets(), + getDisplayedList(), + ], + ), + ), + ), persistentFooterButtons: appsProvider.apps.isEmpty ? null - : [ - getFilterButtonsRow(), - ], + : [getFilterButtonsRow()], ); } } @@ -1146,14 +1296,15 @@ class AppsFilter { late Set categoryFilter; late String sourceFilter; - AppsFilter( - {this.nameFilter = '', - this.authorFilter = '', - this.idFilter = '', - this.includeUptodate = true, - this.includeNonInstalled = true, - this.categoryFilter = const {}, - this.sourceFilter = ''}); + AppsFilter({ + this.nameFilter = '', + this.authorFilter = '', + this.idFilter = '', + this.includeUptodate = true, + this.includeNonInstalled = true, + this.categoryFilter = const {}, + this.sourceFilter = '', + }); Map toFormValuesMap() { return { @@ -1162,7 +1313,7 @@ class AppsFilter { 'appId': idFilter, 'upToDateApps': includeUptodate, 'nonInstalledApps': includeNonInstalled, - 'sourceFilter': sourceFilter + 'sourceFilter': sourceFilter, }; } diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 171f696..ee45ed2 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -43,13 +43,22 @@ class _HomePageState extends State { bool isLinkActivity = false; List pages = [ - NavigationPageItem(tr('appsString'), Icons.apps, - AppsPage(key: GlobalKey())), NavigationPageItem( - tr('addApp'), Icons.add, AddAppPage(key: GlobalKey())), + tr('appsString'), + Icons.apps, + AppsPage(key: GlobalKey()), + ), NavigationPageItem( - tr('importExport'), Icons.import_export, const ImportExportPage()), - NavigationPageItem(tr('settings'), Icons.settings, const SettingsPage()) + tr('addApp'), + Icons.add, + AddAppPage(key: GlobalKey()), + ), + NavigationPageItem( + tr('importExport'), + Icons.import_export, + const ImportExportPage(), + ), + NavigationPageItem(tr('settings'), Icons.settings, const SettingsPage()), ]; @override @@ -60,63 +69,69 @@ class _HomePageState extends State { var sp = context.read(); if (!sp.welcomeShown) { await showDialog( - context: context, - builder: (BuildContext ctx) { - return AlertDialog( - title: Text(tr('welcome')), - content: Column( - mainAxisSize: MainAxisSize.min, - spacing: 20, - children: [ - Text(tr('documentationLinksNote')), - GestureDetector( + context: context, + builder: (BuildContext ctx) { + return AlertDialog( + title: Text(tr('welcome')), + content: Column( + mainAxisSize: MainAxisSize.min, + spacing: 20, + children: [ + Text(tr('documentationLinksNote')), + GestureDetector( + onTap: () { + launchUrlString( + 'https://github.com/ImranR98/Obtainium/blob/main/README.md', + mode: LaunchMode.externalApplication, + ); + }, + child: Text( + 'https://github.com/ImranR98/Obtainium/blob/main/README.md', + style: const TextStyle( + decoration: TextDecoration.underline, + fontWeight: FontWeight.bold, + ), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(tr('batteryOptimizationNote')), + GestureDetector( onTap: () { - launchUrlString( - 'https://github.com/ImranR98/Obtainium/blob/main/README.md', - mode: LaunchMode.externalApplication); + final intent = AndroidIntent( + action: + 'android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS', + package: + obtainiumId, // Replace with your app's package name + ); + + intent.launch(); }, child: Text( - 'https://github.com/ImranR98/Obtainium/blob/main/README.md', + tr('settings'), style: const TextStyle( - decoration: TextDecoration.underline, - fontWeight: FontWeight.bold), - )), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(tr('batteryOptimizationNote')), - GestureDetector( - onTap: () { - final intent = AndroidIntent( - action: - 'android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS', - package: - obtainiumId, // Replace with your app's package name - ); - - intent.launch(); - }, - child: Text( - tr('settings'), - style: const TextStyle( - decoration: TextDecoration.underline, - fontWeight: FontWeight.bold), + decoration: TextDecoration.underline, + fontWeight: FontWeight.bold, ), - ) - ], - ) - ], - ), - actions: [ - TextButton( - onPressed: () { - sp.welcomeShown = true; - Navigator.of(context).pop(null); - }, - child: Text(tr('ok'))), + ), + ), + ], + ), ], - ); - }); + ), + actions: [ + TextButton( + onPressed: () { + sp.welcomeShown = true; + Navigator.of(context).pop(null); + }, + child: Text(tr('ok')), + ), + ], + ); + }, + ); } }); } @@ -126,13 +141,12 @@ class _HomePageState extends State { goToAddApp(String data) async { switchToPage(1); - while ( - (pages[1].widget.key as GlobalKey?)?.currentState == - null) { + while ((pages[1].widget.key as GlobalKey?) + ?.currentState == + null) { await Future.delayed(const Duration(microseconds: 1)); } - (pages[1].widget.key as GlobalKey?) - ?.currentState + (pages[1].widget.key as GlobalKey?)?.currentState ?.linkFn(data); } @@ -146,44 +160,49 @@ class _HomePageState extends State { } else if (action == 'app' || action == 'apps') { var dataStr = Uri.decodeComponent(data); if (await showDialog( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: tr('importX', args: [ - action == 'app' ? tr('app') : tr('appsString') - ]), - items: const [], - additionalWidgets: [ - ExpansionTile( - title: const Text('Raw JSON'), - children: [ - Text( - dataStr, - style: const TextStyle(fontFamily: 'monospace'), - ) - ], - ) - ], - ); - }) != + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: tr( + 'importX', + args: [action == 'app' ? tr('app') : tr('appsString')], + ), + items: const [], + additionalWidgets: [ + ExpansionTile( + title: const Text('Raw JSON'), + children: [ + Text( + dataStr, + style: const TextStyle(fontFamily: 'monospace'), + ), + ], + ), + ], + ); + }, + ) != null) { // ignore: use_build_context_synchronously var appsProvider = context.read(); - var result = await appsProvider.import(action == 'app' - ? '{ "apps": [$dataStr] }' - : '{ "apps": $dataStr }'); + var result = await appsProvider.import( + action == 'app' + ? '{ "apps": [$dataStr] }' + : '{ "apps": $dataStr }', + ); // ignore: use_build_context_synchronously showMessage( - tr('importedX', args: [plural('apps', result.key.length)]), - context); + tr('importedX', args: [plural('apps', result.key.length)]), + context, + ); await appsProvider .checkUpdates(specificIds: result.key.map((e) => e.id).toList()) .catchError((e) { - if (e is Map && e['errors'] is MultiAppMultiError) { - showError(e['errors'].toString(), context); - } - return []; - }); + if (e is Map && e['errors'] is MultiAppMultiError) { + showError(e['errors'].toString(), context); + } + return []; + }); } } else { throw ObtainiumError(tr('unknown')); @@ -211,7 +230,8 @@ class _HomePageState extends State { } setIsReversing(int targetIndex) { - bool reversing = selectedIndexHistory.isNotEmpty && + bool reversing = + selectedIndexHistory.isNotEmpty && selectedIndexHistory.last > targetIndex; setState(() { isReversing = reversing; @@ -259,65 +279,71 @@ class _HomePageState extends State { prevIsLoading = appsProvider.loadingApps; return WillPopScope( - child: Scaffold( - backgroundColor: Theme.of(context).colorScheme.surface, - body: PageTransitionSwitcher( - duration: Duration( - milliseconds: - settingsProvider.disablePageTransitions ? 0 : 300), - reverse: settingsProvider.reversePageTransitions - ? !isReversing - : isReversing, - transitionBuilder: ( - Widget child, - Animation animation, - Animation secondaryAnimation, - ) { - return SharedAxisTransition( - animation: animation, - secondaryAnimation: secondaryAnimation, - transitionType: SharedAxisTransitionType.horizontal, - child: child, - ); - }, - child: pages - .elementAt(selectedIndexHistory.isEmpty - ? 0 - : selectedIndexHistory.last) - .widget, + child: Scaffold( + backgroundColor: Theme.of(context).colorScheme.surface, + body: PageTransitionSwitcher( + duration: Duration( + milliseconds: settingsProvider.disablePageTransitions ? 0 : 300, ), - bottomNavigationBar: NavigationBar( - destinations: pages - .map((e) => - NavigationDestination(icon: Icon(e.icon), label: e.title)) - .toList(), - onDestinationSelected: (int index) async { - HapticFeedback.selectionClick(); - switchToPage(index); - }, - selectedIndex: + reverse: settingsProvider.reversePageTransitions + ? !isReversing + : isReversing, + transitionBuilder: + ( + Widget child, + Animation animation, + Animation secondaryAnimation, + ) { + return SharedAxisTransition( + animation: animation, + secondaryAnimation: secondaryAnimation, + transitionType: SharedAxisTransitionType.horizontal, + child: child, + ); + }, + child: pages + .elementAt( selectedIndexHistory.isEmpty ? 0 : selectedIndexHistory.last, - ), + ) + .widget, ), - onWillPop: () async { - if (isLinkActivity && - selectedIndexHistory.length == 1 && - selectedIndexHistory.last == 1) { - return true; - } - setIsReversing(selectedIndexHistory.length >= 2 + bottomNavigationBar: NavigationBar( + destinations: pages + .map( + (e) => + NavigationDestination(icon: Icon(e.icon), label: e.title), + ) + .toList(), + onDestinationSelected: (int index) async { + HapticFeedback.selectionClick(); + switchToPage(index); + }, + selectedIndex: selectedIndexHistory.isEmpty + ? 0 + : selectedIndexHistory.last, + ), + ), + onWillPop: () async { + if (isLinkActivity && + selectedIndexHistory.length == 1 && + selectedIndexHistory.last == 1) { + return true; + } + setIsReversing( + selectedIndexHistory.length >= 2 ? selectedIndexHistory.reversed.toList()[1] - : 0); - if (selectedIndexHistory.isNotEmpty) { - setState(() { - selectedIndexHistory.removeLast(); - }); - return false; - } - return !(pages[0].widget.key as GlobalKey) - .currentState - ?.clearSelected(); - }); + : 0, + ); + if (selectedIndexHistory.isNotEmpty) { + setState(() { + selectedIndexHistory.removeLast(); + }); + return false; + } + return !(pages[0].widget.key as GlobalKey).currentState + ?.clearSelected(); + }, + ); } @override diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index 2503f6e..cfe4beb 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -45,60 +45,72 @@ class _ImportExportPageState extends State { urlListImport({String? initValue, bool overrideInitValid = false}) { showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - initValid: overrideInitValid, - title: tr('importFromURLList'), - items: [ - [ - GeneratedFormTextField('appURLList', - defaultValue: initValue ?? '', - label: tr('appURLList'), - max: 7, - additionalValidators: [ - (dynamic value) { - if (value != null && value.isNotEmpty) { - var lines = value.trim().split('\n'); - for (int i = 0; i < lines.length; i++) { - try { - sourceProvider.getSource(lines[i]); - } catch (e) { - return '${tr('line')} ${i + 1}: $e'; - } - } + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + initValid: overrideInitValid, + title: tr('importFromURLList'), + items: [ + [ + GeneratedFormTextField( + 'appURLList', + defaultValue: initValue ?? '', + label: tr('appURLList'), + max: 7, + additionalValidators: [ + (dynamic value) { + if (value != null && value.isNotEmpty) { + var lines = value.trim().split('\n'); + for (int i = 0; i < lines.length; i++) { + try { + sourceProvider.getSource(lines[i]); + } catch (e) { + return '${tr('line')} ${i + 1}: $e'; } - return null; } - ]) - ] + } + return null; + }, + ], + ), ], - ); - }).then((values) { + ], + ); + }, + ).then((values) { if (values != null) { var urls = (values['appURLList'] as String).split('\n'); setState(() { importInProgress = true; }); - appsProvider.addAppsByURL(urls).then((errors) { - if (errors.isEmpty) { - showMessage(tr('importedX', args: [plural('apps', urls.length)]), - context); - } else { - showDialog( - context: context, - builder: (BuildContext ctx) { - return ImportErrorDialog( - urlsLength: urls.length, errors: errors); - }); - } - }).catchError((e) { - showError(e, context); - }).whenComplete(() { - setState(() { - importInProgress = false; - }); - }); + appsProvider + .addAppsByURL(urls) + .then((errors) { + if (errors.isEmpty) { + showMessage( + tr('importedX', args: [plural('apps', urls.length)]), + context, + ); + } else { + showDialog( + context: context, + builder: (BuildContext ctx) { + return ImportErrorDialog( + urlsLength: urls.length, + errors: errors, + ); + }, + ); + } + }) + .catchError((e) { + showError(e, context); + }) + .whenComplete(() { + setState(() { + importInProgress = false; + }); + }); } }); } @@ -107,213 +119,250 @@ class _ImportExportPageState extends State { HapticFeedback.selectionClick(); appsProvider .export( - pickOnly: - pickOnly || (await settingsProvider.getExportDir()) == null, - sp: settingsProvider) + pickOnly: + pickOnly || (await settingsProvider.getExportDir()) == null, + sp: settingsProvider, + ) .then((String? result) { - if (result != null) { - showMessage(tr('exportedTo', args: [result]), context); - } - }).catchError((e) { - showError(e, context); - }); + if (result != null) { + showMessage(tr('exportedTo', args: [result]), context); + } + }) + .catchError((e) { + showError(e, context); + }); } runObtainiumImport() { HapticFeedback.selectionClick(); - FilePicker.platform.pickFiles().then((result) { - setState(() { - importInProgress = true; - }); - if (result != null) { - String data = File(result.files.single.path!).readAsStringSync(); - try { - jsonDecode(data); - } catch (e) { - throw ObtainiumError(tr('invalidInput')); - } - appsProvider.import(data).then((value) { - var cats = settingsProvider.categories; - appsProvider.apps.forEach((key, value) { - for (var c in value.app.categories) { - if (!cats.containsKey(c)) { - cats[c] = generateRandomLightColor().value; - } - } + FilePicker.platform + .pickFiles() + .then((result) { + setState(() { + importInProgress = true; + }); + if (result != null) { + String data = File(result.files.single.path!).readAsStringSync(); + try { + jsonDecode(data); + } catch (e) { + throw ObtainiumError(tr('invalidInput')); + } + appsProvider.import(data).then((value) { + var cats = settingsProvider.categories; + appsProvider.apps.forEach((key, value) { + for (var c in value.app.categories) { + if (!cats.containsKey(c)) { + cats[c] = generateRandomLightColor().value; + } + } + }); + appsProvider.addMissingCategories(settingsProvider); + showMessage( + '${tr('importedX', args: [plural('apps', value.key.length)])}${value.value ? ' + ${tr('settings')}' : ''}', + context, + ); + }); + } else { + // User canceled the picker + } + }) + .catchError((e) { + showError(e, context); + }) + .whenComplete(() { + setState(() { + importInProgress = false; }); - appsProvider.addMissingCategories(settingsProvider); - showMessage( - '${tr('importedX', args: [ - plural('apps', value.key.length) - ])}${value.value ? ' + ${tr('settings')}' : ''}', - context); }); - } else { - // User canceled the picker - } - }).catchError((e) { - showError(e, context); - }).whenComplete(() { - setState(() { - importInProgress = false; - }); - }); } runUrlImport() { FilePicker.platform.pickFiles().then((result) { if (result != null) { urlListImport( - overrideInitValid: true, - initValue: RegExp('https?://[^"]+') - .allMatches( - File(result.files.single.path!).readAsStringSync()) - .map((e) => e.input.substring(e.start, e.end)) - .toSet() - .toList() - .where((url) { - try { - sourceProvider.getSource(url); - return true; - } catch (e) { - return false; - } - }).join('\n')); + overrideInitValid: true, + initValue: RegExp('https?://[^"]+') + .allMatches(File(result.files.single.path!).readAsStringSync()) + .map((e) => e.input.substring(e.start, e.end)) + .toSet() + .toList() + .where((url) { + try { + sourceProvider.getSource(url); + return true; + } catch (e) { + return false; + } + }) + .join('\n'), + ); } }); } runSourceSearch(AppSource source) { () async { - var values = await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: tr('searchX', args: [source.name]), - items: [ - [ - GeneratedFormTextField('searchQuery', + var values = await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: tr('searchX', args: [source.name]), + items: [ + [ + GeneratedFormTextField( + 'searchQuery', label: tr('searchQuery'), - required: source.name != FDroidRepo().name) - ], - ...source.searchQuerySettingFormItems.map((e) => [e]), - [ - GeneratedFormTextField('url', + required: source.name != FDroidRepo().name, + ), + ], + ...source.searchQuerySettingFormItems.map((e) => [e]), + [ + GeneratedFormTextField( + 'url', label: source.hosts.isNotEmpty ? tr('overrideSource') : plural('url', 1).substring(2), - defaultValue: - source.hosts.isNotEmpty ? source.hosts[0] : '', - required: true) + defaultValue: source.hosts.isNotEmpty + ? source.hosts[0] + : '', + required: true, + ), + ], ], - ], + ); + }, + ); + if (values != null) { + setState(() { + importInProgress = true; + }); + if (source.hosts.isEmpty || values['url'] != source.hosts[0]) { + source = sourceProvider.getSource( + values['url'], + overrideSource: source.runtimeType.toString(), + ); + } + var urlsWithDescriptions = await source.search( + values['searchQuery'] as String, + querySettings: values, ); - }); - if (values != null) { - setState(() { - importInProgress = true; - }); - if (source.hosts.isEmpty || values['url'] != source.hosts[0]) { - source = sourceProvider.getSource(values['url'], - overrideSource: source.runtimeType.toString()); - } - var urlsWithDescriptions = await source - .search(values['searchQuery'] as String, querySettings: values); - if (urlsWithDescriptions.isNotEmpty) { - var selectedUrls = - // ignore: use_build_context_synchronously - await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return SelectionModal( - entries: urlsWithDescriptions, - selectedByDefault: false, - ); - }); - if (selectedUrls != null && selectedUrls.isNotEmpty) { - var errors = await appsProvider.addAppsByURL(selectedUrls, - sourceOverride: source); - if (errors.isEmpty) { - // ignore: use_build_context_synchronously - showMessage( - tr('importedX', - args: [plural('apps', selectedUrls.length)]), - context); + if (urlsWithDescriptions.isNotEmpty) { + var selectedUrls = + // ignore: use_build_context_synchronously + await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return SelectionModal( + entries: urlsWithDescriptions, + selectedByDefault: false, + ); + }, + ); + if (selectedUrls != null && selectedUrls.isNotEmpty) { + var errors = await appsProvider.addAppsByURL( + selectedUrls, + sourceOverride: source, + ); + if (errors.isEmpty) { + // ignore: use_build_context_synchronously + showMessage( + tr( + 'importedX', + args: [plural('apps', selectedUrls.length)], + ), + context, + ); + } else { + // ignore: use_build_context_synchronously + showDialog( + context: context, + builder: (BuildContext ctx) { + return ImportErrorDialog( + urlsLength: selectedUrls.length, + errors: errors, + ); + }, + ); + } + } } else { - // ignore: use_build_context_synchronously - showDialog( - context: context, - builder: (BuildContext ctx) { - return ImportErrorDialog( - urlsLength: selectedUrls.length, errors: errors); - }); + throw ObtainiumError(tr('noResults')); } } - } else { - throw ObtainiumError(tr('noResults')); - } - } - }() + }() .catchError((e) { - showError(e, context); - }).whenComplete(() { - setState(() { - importInProgress = false; - }); - }); + showError(e, context); + }) + .whenComplete(() { + setState(() { + importInProgress = false; + }); + }); } runMassSourceImport(MassAppUrlSource source) { () async { - var values = await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: tr('importX', args: [source.name]), - items: source.requiredArgs - .map((e) => [GeneratedFormTextField(e, label: e)]) - .toList(), + var values = await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: tr('importX', args: [source.name]), + items: source.requiredArgs + .map((e) => [GeneratedFormTextField(e, label: e)]) + .toList(), + ); + }, + ); + if (values != null) { + setState(() { + importInProgress = true; + }); + var urlsWithDescriptions = await source.getUrlsWithDescriptions( + values.values.map((e) => e.toString()).toList(), ); - }); - if (values != null) { - setState(() { - importInProgress = true; - }); - var urlsWithDescriptions = await source.getUrlsWithDescriptions( - values.values.map((e) => e.toString()).toList()); - var selectedUrls = - // ignore: use_build_context_synchronously - await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return SelectionModal(entries: urlsWithDescriptions); - }); - if (selectedUrls != null) { - var errors = await appsProvider.addAppsByURL(selectedUrls); - if (errors.isEmpty) { - // ignore: use_build_context_synchronously - showMessage( - tr('importedX', args: [plural('apps', selectedUrls.length)]), - context); - } else { - // ignore: use_build_context_synchronously - showDialog( - context: context, - builder: (BuildContext ctx) { - return ImportErrorDialog( - urlsLength: selectedUrls.length, errors: errors); - }); + var selectedUrls = + // ignore: use_build_context_synchronously + await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return SelectionModal(entries: urlsWithDescriptions); + }, + ); + if (selectedUrls != null) { + var errors = await appsProvider.addAppsByURL(selectedUrls); + if (errors.isEmpty) { + // ignore: use_build_context_synchronously + showMessage( + tr( + 'importedX', + args: [plural('apps', selectedUrls.length)], + ), + context, + ); + } else { + // ignore: use_build_context_synchronously + showDialog( + context: context, + builder: (BuildContext ctx) { + return ImportErrorDialog( + urlsLength: selectedUrls.length, + errors: errors, + ); + }, + ); + } + } } - } - } - }() + }() .catchError((e) { - showError(e, context); - }).whenComplete(() { - setState(() { - importInProgress = false; - }); - }); + showError(e, context); + }) + .whenComplete(() { + setState(() { + importInProgress = false; + }); + }); } var sourceStrings = >{}; @@ -322,228 +371,231 @@ class _ImportExportPageState extends State { }); return Scaffold( - backgroundColor: Theme.of(context).colorScheme.surface, - body: CustomScrollView(slivers: [ + backgroundColor: Theme.of(context).colorScheme.surface, + body: CustomScrollView( + slivers: [ CustomAppBar(title: tr('importExport')), SliverFillRemaining( - child: Padding( - padding: - const EdgeInsets.symmetric(vertical: 8, horizontal: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - FutureBuilder( - future: settingsProvider.getExportDir(), - builder: (context, snapshot) { - return Column( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + FutureBuilder( + future: settingsProvider.getExportDir(), + builder: (context, snapshot) { + return Column( + children: [ + Row( children: [ - Row( - children: [ - Expanded( - child: TextButton( - style: outlineButtonStyle, - onPressed: appsProvider.apps.isEmpty || - importInProgress - ? null - : () { - runObtainiumExport(pickOnly: true); - }, - child: Text(tr('pickExportDir'), - textAlign: TextAlign.center), - )), - const SizedBox( - width: 16, + Expanded( + child: TextButton( + style: outlineButtonStyle, + onPressed: + appsProvider.apps.isEmpty || + importInProgress + ? null + : () { + runObtainiumExport(pickOnly: true); + }, + child: Text( + tr('pickExportDir'), + textAlign: TextAlign.center, ), - Expanded( - child: TextButton( - style: outlineButtonStyle, - onPressed: appsProvider.apps.isEmpty || - importInProgress || - snapshot.data == null - ? null - : runObtainiumExport, - child: Text(tr('obtainiumExport'), - textAlign: TextAlign.center), - )), - ], - ), - const SizedBox( - height: 8, - ), - Row( - children: [ - Expanded( - child: TextButton( - style: outlineButtonStyle, - onPressed: importInProgress - ? null - : runObtainiumImport, - child: Text(tr('obtainiumImport'), - textAlign: TextAlign.center))), - ], - ), - if (snapshot.data != null) - Column( - children: [ - const SizedBox(height: 16), - GeneratedForm( - items: [ - [ - GeneratedFormSwitch( - 'autoExportOnChanges', - label: tr('autoExportOnChanges'), - defaultValue: settingsProvider - .autoExportOnChanges, - ) - ], - [ - GeneratedFormSwitch( - 'exportSettings', - label: tr('includeSettings'), - defaultValue: settingsProvider - .exportSettings, - ) - ] - ], - onValueChanges: - (value, valid, isBuilding) { - if (valid && !isBuilding) { - if (value['autoExportOnChanges'] != - null) { - settingsProvider - .autoExportOnChanges = value[ - 'autoExportOnChanges'] == - true; - } - if (value['exportSettings'] != - null) { - settingsProvider.exportSettings = - value['exportSettings'] == - true; - } - } - }), - ], ), + ), + const SizedBox(width: 16), + Expanded( + child: TextButton( + style: outlineButtonStyle, + onPressed: + appsProvider.apps.isEmpty || + importInProgress || + snapshot.data == null + ? null + : runObtainiumExport, + child: Text( + tr('obtainiumExport'), + textAlign: TextAlign.center, + ), + ), + ), ], - ); - }, - ), - if (importInProgress) - const Column( - children: [ - SizedBox( - height: 14, - ), - LinearProgressIndicator(), - SizedBox( - height: 14, - ), - ], - ) - else - Column( - children: [ - const Divider( - height: 32, - ), - Row( + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: TextButton( + style: outlineButtonStyle, + onPressed: importInProgress + ? null + : runObtainiumImport, + child: Text( + tr('obtainiumImport'), + textAlign: TextAlign.center, + ), + ), + ), + ], + ), + if (snapshot.data != null) + Column( children: [ - Expanded( - child: TextButton( - onPressed: importInProgress - ? null - : () async { - var searchSourceName = - await showDialog< - List?>( - context: context, - builder: - (BuildContext - ctx) { - return SelectionModal( - title: tr( - 'selectX', - args: [ - tr('source') - ]), - entries: - sourceStrings, - selectedByDefault: - false, - onlyOneSelectionAllowed: - true, - titlesAreLinks: - false, - ); - }) ?? - []; - var searchSource = - sourceProvider.sources - .where((e) => - searchSourceName - .contains( - e.name)) - .toList(); - if (searchSource.isNotEmpty) { - runSourceSearch( - searchSource[0]); - } - }, - child: Text(tr('searchX', args: [ - tr('source').toLowerCase() - ])))), + const SizedBox(height: 16), + GeneratedForm( + items: [ + [ + GeneratedFormSwitch( + 'autoExportOnChanges', + label: tr('autoExportOnChanges'), + defaultValue: settingsProvider + .autoExportOnChanges, + ), + ], + [ + GeneratedFormSwitch( + 'exportSettings', + label: tr('includeSettings'), + defaultValue: + settingsProvider.exportSettings, + ), + ], + ], + onValueChanges: (value, valid, isBuilding) { + if (valid && !isBuilding) { + if (value['autoExportOnChanges'] != + null) { + settingsProvider.autoExportOnChanges = + value['autoExportOnChanges'] == + true; + } + if (value['exportSettings'] != null) { + settingsProvider.exportSettings = + value['exportSettings'] == true; + } + } + }, + ), ], ), - const SizedBox(height: 8), - TextButton( - onPressed: - importInProgress ? null : urlListImport, + ], + ); + }, + ), + if (importInProgress) + const Column( + children: [ + SizedBox(height: 14), + LinearProgressIndicator(), + SizedBox(height: 14), + ], + ) + else + Column( + children: [ + const Divider(height: 32), + Row( + children: [ + Expanded( + child: TextButton( + onPressed: importInProgress + ? null + : () async { + var searchSourceName = + await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return SelectionModal( + title: tr( + 'selectX', + args: [tr('source')], + ), + entries: sourceStrings, + selectedByDefault: false, + onlyOneSelectionAllowed: true, + titlesAreLinks: false, + ); + }, + ) ?? + []; + var searchSource = sourceProvider + .sources + .where( + (e) => searchSourceName.contains( + e.name, + ), + ) + .toList(); + if (searchSource.isNotEmpty) { + runSourceSearch(searchSource[0]); + } + }, child: Text( - tr('importFromURLList'), - )), - const SizedBox(height: 8), - TextButton( - onPressed: - importInProgress ? null : runUrlImport, - child: Text( - tr('importFromURLsInFile'), - )), + tr( + 'searchX', + args: [tr('source').toLowerCase()], + ), + ), + ), + ), ], ), - ...sourceProvider.massUrlSources.map((source) => Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const SizedBox(height: 8), - TextButton( - onPressed: importInProgress - ? null - : () { - runMassSourceImport(source); - }, - child: Text( - tr('importX', args: [source.name]))) - ])), - const Spacer(), - const Divider( - height: 32, - ), - Text(tr('importedAppsIdDisclaimer'), - textAlign: TextAlign.center, - style: const TextStyle( - fontStyle: FontStyle.italic, fontSize: 12)), - const SizedBox( - height: 8, - ), - ], - ))) - ])); + const SizedBox(height: 8), + TextButton( + onPressed: importInProgress ? null : urlListImport, + child: Text(tr('importFromURLList')), + ), + const SizedBox(height: 8), + TextButton( + onPressed: importInProgress ? null : runUrlImport, + child: Text(tr('importFromURLsInFile')), + ), + ], + ), + ...sourceProvider.massUrlSources.map( + (source) => Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: 8), + TextButton( + onPressed: importInProgress + ? null + : () { + runMassSourceImport(source); + }, + child: Text(tr('importX', args: [source.name])), + ), + ], + ), + ), + const Spacer(), + const Divider(height: 32), + Text( + tr('importedAppsIdDisclaimer'), + textAlign: TextAlign.center, + style: const TextStyle( + fontStyle: FontStyle.italic, + fontSize: 12, + ), + ), + const SizedBox(height: 8), + ], + ), + ), + ), + ], + ), + ); } } class ImportErrorDialog extends StatefulWidget { - const ImportErrorDialog( - {super.key, required this.urlsLength, required this.errors}); + const ImportErrorDialog({ + super.key, + required this.urlsLength, + required this.errors, + }); final int urlsLength; final List> errors; @@ -558,41 +610,43 @@ class _ImportErrorDialogState extends State { return AlertDialog( scrollable: true, title: Text(tr('importErrors')), - content: - Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Text( - tr('importedXOfYApps', args: [ - (widget.urlsLength - widget.errors.length).toString(), - widget.urlsLength.toString() - ]), - style: Theme.of(context).textTheme.bodyLarge, - ), - const SizedBox(height: 16), - Text( - tr('followingURLsHadErrors'), - style: Theme.of(context).textTheme.bodyLarge, - ), - ...widget.errors.map((e) { - return Column( + content: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + tr( + 'importedXOfYApps', + args: [ + (widget.urlsLength - widget.errors.length).toString(), + widget.urlsLength.toString(), + ], + ), + style: Theme.of(context).textTheme.bodyLarge, + ), + const SizedBox(height: 16), + Text( + tr('followingURLsHadErrors'), + style: Theme.of(context).textTheme.bodyLarge, + ), + ...widget.errors.map((e) { + return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - const SizedBox( - height: 16, - ), + const SizedBox(height: 16), Text(e[0]), - Text( - e[1], - style: const TextStyle(fontStyle: FontStyle.italic), - ) - ]); - }) - ]), + Text(e[1], style: const TextStyle(fontStyle: FontStyle.italic)), + ], + ); + }), + ], + ), actions: [ TextButton( - onPressed: () { - Navigator.of(context).pop(null); - }, - child: Text(tr('ok'))) + onPressed: () { + Navigator.of(context).pop(null); + }, + child: Text(tr('ok')), + ), ], ); } @@ -600,14 +654,15 @@ class _ImportErrorDialogState extends State { // ignore: must_be_immutable class SelectionModal extends StatefulWidget { - SelectionModal( - {super.key, - required this.entries, - this.selectedByDefault = true, - this.onlyOneSelectionAllowed = false, - this.titlesAreLinks = true, - this.title, - this.deselectThese = const []}); + SelectionModal({ + super.key, + required this.entries, + this.selectedByDefault = true, + this.onlyOneSelectionAllowed = false, + this.titlesAreLinks = true, + this.title, + this.deselectThese = const [], + }); String? title; Map> entries; @@ -628,11 +683,12 @@ class _SelectionModalState extends State { super.initState(); for (var entry in widget.entries.entries) { entrySelections.putIfAbsent( - entry, - () => - widget.selectedByDefault && - !widget.onlyOneSelectionAllowed && - !widget.deselectThese.contains(entry.key)); + entry, + () => + widget.selectedByDefault && + !widget.onlyOneSelectionAllowed && + !widget.deselectThese.contains(entry.key), + ); } if (widget.selectedByDefault && widget.onlyOneSelectionAllowed) { selectOnlyOne(widget.entries.entries.first.key); @@ -658,8 +714,10 @@ class _SelectionModalState extends State { entrySelections.forEach((key, value) { var searchableText = key.value.isEmpty ? key.key : key.value[0]; if (filterRegex.isEmpty || - RegExp(filterRegex, caseSensitive: false) - .hasMatch(searchableText)) { + RegExp( + filterRegex, + caseSensitive: false, + ).hasMatch(searchableText)) { filteredEntrySelections.putIfAbsent(key, () => value); } }); @@ -667,19 +725,22 @@ class _SelectionModalState extends State { return AlertDialog( scrollable: true, title: Text(widget.title ?? tr('pick')), - content: Column(children: [ - GeneratedForm( + content: Column( + children: [ + GeneratedForm( items: [ [ - GeneratedFormTextField('filter', - label: tr('filter'), - required: false, - additionalValidators: [ - (value) { - return regExValidator(value); - } - ]) - ] + GeneratedFormTextField( + 'filter', + label: tr('filter'), + required: false, + additionalValidators: [ + (value) { + return regExValidator(value); + }, + ], + ), + ], ], onValueChanges: (value, valid, isBuilding) { if (valid && !isBuilding) { @@ -689,25 +750,28 @@ class _SelectionModalState extends State { }); } } - }), - ...filteredEntrySelections.keys.map((entry) { - selectThis(bool? value) { - setState(() { - value ??= false; - if (value! && widget.onlyOneSelectionAllowed) { - selectOnlyOne(entry.key); - } else { - entrySelections[entry] = value!; - } - }); - } + }, + ), + ...filteredEntrySelections.keys.map((entry) { + selectThis(bool? value) { + setState(() { + value ??= false; + if (value! && widget.onlyOneSelectionAllowed) { + selectOnlyOne(entry.key); + } else { + entrySelections[entry] = value!; + } + }); + } - var urlLink = GestureDetector( + var urlLink = GestureDetector( onTap: !widget.titlesAreLinks ? null : () { - launchUrlString(entry.key, - mode: LaunchMode.externalApplication); + launchUrlString( + entry.key, + mode: LaunchMode.externalApplication, + ); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -715,131 +779,146 @@ class _SelectionModalState extends State { Text( entry.value.isEmpty ? entry.key : entry.value[0], style: TextStyle( - decoration: widget.titlesAreLinks - ? TextDecoration.underline - : null, - fontWeight: FontWeight.bold), + decoration: widget.titlesAreLinks + ? TextDecoration.underline + : null, + fontWeight: FontWeight.bold, + ), textAlign: TextAlign.start, ), if (widget.titlesAreLinks) Text( Uri.parse(entry.key).host, style: const TextStyle( - decoration: TextDecoration.underline, fontSize: 12), - ) - ], - )); - - var descriptionText = entry.value.length <= 1 - ? const SizedBox.shrink() - : Text( - entry.value[1].length > 128 - ? '${entry.value[1].substring(0, 128)}...' - : entry.value[1], - style: const TextStyle( - fontStyle: FontStyle.italic, fontSize: 12), - ); - - var selectedEntries = - entrySelections.entries.where((e) => e.value).toList(); - - var singleSelectTile = ListTile( - title: GestureDetector( - onTap: widget.titlesAreLinks - ? null - : () { - selectThis(!(entrySelections[entry] ?? false)); - }, - child: urlLink, - ), - subtitle: entry.value.length <= 1 - ? null - : GestureDetector( - onTap: () { - setState(() { - selectOnlyOne(entry.key); - }); - }, - child: descriptionText, - ), - leading: Radio( - value: entry.key, - groupValue: selectedEntries.isEmpty - ? null - : selectedEntries.first.key.key, - onChanged: (value) { - setState(() { - selectOnlyOne(entry.key); - }); - }, - ), - ); - - var multiSelectTile = Row(children: [ - Checkbox( - value: entrySelections[entry], - onChanged: (value) { - selectThis(value); - }), - const SizedBox( - width: 8, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const SizedBox( - height: 8, - ), - GestureDetector( - onTap: widget.titlesAreLinks - ? null - : () { - selectThis(!(entrySelections[entry] ?? false)); - }, - child: urlLink, - ), - entry.value.length <= 1 - ? const SizedBox.shrink() - : GestureDetector( - onTap: () { - selectThis(!(entrySelections[entry] ?? false)); - }, - child: descriptionText, + decoration: TextDecoration.underline, + fontSize: 12, ), - const SizedBox( - height: 8, - ) - ], - )) - ]); + ), + ], + ), + ); - return widget.onlyOneSelectionAllowed - ? singleSelectTile - : multiSelectTile; - }) - ]), + var descriptionText = entry.value.length <= 1 + ? const SizedBox.shrink() + : Text( + entry.value[1].length > 128 + ? '${entry.value[1].substring(0, 128)}...' + : entry.value[1], + style: const TextStyle( + fontStyle: FontStyle.italic, + fontSize: 12, + ), + ); + + var selectedEntries = entrySelections.entries + .where((e) => e.value) + .toList(); + + var singleSelectTile = ListTile( + title: GestureDetector( + onTap: widget.titlesAreLinks + ? null + : () { + selectThis(!(entrySelections[entry] ?? false)); + }, + child: urlLink, + ), + subtitle: entry.value.length <= 1 + ? null + : GestureDetector( + onTap: () { + setState(() { + selectOnlyOne(entry.key); + }); + }, + child: descriptionText, + ), + leading: Radio( + value: entry.key, + groupValue: selectedEntries.isEmpty + ? null + : selectedEntries.first.key.key, + onChanged: (value) { + setState(() { + selectOnlyOne(entry.key); + }); + }, + ), + ); + + var multiSelectTile = Row( + children: [ + Checkbox( + value: entrySelections[entry], + onChanged: (value) { + selectThis(value); + }, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 8), + GestureDetector( + onTap: widget.titlesAreLinks + ? null + : () { + selectThis(!(entrySelections[entry] ?? false)); + }, + child: urlLink, + ), + entry.value.length <= 1 + ? const SizedBox.shrink() + : GestureDetector( + onTap: () { + selectThis(!(entrySelections[entry] ?? false)); + }, + child: descriptionText, + ), + const SizedBox(height: 8), + ], + ), + ), + ], + ); + + return widget.onlyOneSelectionAllowed + ? singleSelectTile + : multiSelectTile; + }), + ], + ), actions: [ TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text(tr('cancel'))), + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(tr('cancel')), + ), TextButton( - onPressed: entrySelections.values.where((b) => b).isEmpty - ? null - : () { - Navigator.of(context).pop(entrySelections.entries + onPressed: entrySelections.values.where((b) => b).isEmpty + ? null + : () { + Navigator.of(context).pop( + entrySelections.entries .where((entry) => entry.value) .map((e) => e.key.key) - .toList()); - }, - child: Text(widget.onlyOneSelectionAllowed + .toList(), + ); + }, + child: Text( + widget.onlyOneSelectionAllowed ? tr('pick') - : tr('selectX', args: [ - entrySelections.values.where((b) => b).length.toString() - ]))) + : tr( + 'selectX', + args: [ + entrySelections.values.where((b) => b).length.toString(), + ], + ), + ), + ), ], ); } diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 65495e9..b102f61 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -38,7 +38,7 @@ class _SettingsPageState extends State { 4320, 10080, 20160, - 43200 + 43200, ]; int updateInterval = 0; late SplineInterpolation updateIntervalInterpolator; // 🤓 @@ -46,14 +46,15 @@ class _SettingsPageState extends State { bool showIntervalLabel = true; final Map, String> colorsNameMap = , String>{ - ColorTools.createPrimarySwatch(obtainiumThemeColor): 'Obtainium' - }; + ColorTools.createPrimarySwatch(obtainiumThemeColor): 'Obtainium', + }; void initUpdateIntervalInterpolator() { List nodes = []; for (final (index, element) in updateIntervalNodes.indexed) { nodes.add( - InterpolationNode(x: index.toDouble() + 1, y: element.toDouble())); + InterpolationNode(x: index.toDouble() + 1, y: element.toDouble()), + ); } updateIntervalInterpolator = SplineInterpolation(nodes: nodes); } @@ -103,13 +104,16 @@ class _SettingsPageState extends State { processIntervalSliderValue(settingsProvider.updateIntervalSliderVal); var followSystemThemeExplanation = FutureBuilder( - builder: (ctx, val) { - return ((val.data?.version.sdkInt ?? 30) < 29) - ? Text(tr('followSystemThemeExplanation'), - style: Theme.of(context).textTheme.labelSmall) - : const SizedBox.shrink(); - }, - future: DeviceInfoPlugin().androidInfo); + builder: (ctx, val) { + return ((val.data?.version.sdkInt ?? 30) < 29) + ? Text( + tr('followSystemThemeExplanation'), + style: Theme.of(context).textTheme.labelSmall, + ) + : const SizedBox.shrink(); + }, + future: DeviceInfoPlugin().androidInfo, + ); Future colorPickerDialog() async { return ColorPicker( @@ -131,10 +135,12 @@ class _SettingsPageState extends State { }, pickerTypeLabels: { ColorPickerType.custom: tr('standard'), - ColorPickerType.wheel: tr('custom') + ColorPickerType.wheel: tr('custom'), }, - title: Text(tr('selectX', args: [tr('colour')]), - style: Theme.of(context).textTheme.titleLarge), + title: Text( + tr('selectX', args: [tr('colour')]), + style: Theme.of(context).textTheme.titleLarge, + ), wheelDiameter: 192, wheelSquareBorderRadius: 32, width: 48, @@ -148,132 +154,142 @@ class _SettingsPageState extends State { showColorName: true, materialNameTextStyle: Theme.of(context).textTheme.bodySmall, colorNameTextStyle: Theme.of(context).textTheme.bodySmall, - copyPasteBehavior: - const ColorPickerCopyPasteBehavior(longPressMenu: true), + copyPasteBehavior: const ColorPickerCopyPasteBehavior( + longPressMenu: true, + ), ).showPickerDialog( context, - transitionBuilder: (BuildContext context, Animation a1, - Animation a2, Widget widget) { - final double curvedValue = Curves.easeInCubic.transform(a1.value); - return Transform( - alignment: Alignment.center, - transform: Matrix4.diagonal3Values(curvedValue, curvedValue, 1), - child: Opacity(opacity: curvedValue, child: widget), - ); - }, + transitionBuilder: + ( + BuildContext context, + Animation a1, + Animation a2, + Widget widget, + ) { + final double curvedValue = Curves.easeInCubic.transform(a1.value); + return Transform( + alignment: Alignment.center, + transform: Matrix4.diagonal3Values(curvedValue, curvedValue, 1), + child: Opacity(opacity: curvedValue, child: widget), + ); + }, transitionDuration: const Duration(milliseconds: 250), ); } var colorPicker = ListTile( - dense: true, - contentPadding: EdgeInsets.zero, - title: Text(tr('selectX', args: [tr('colour')])), - subtitle: Text( - "${ColorTools.nameThatColor(settingsProvider.themeColor)} " - "(${ColorTools.materialNameAndCode(settingsProvider.themeColor, colorSwatchNameMap: colorsNameMap)})"), - trailing: ColorIndicator( - width: 40, - height: 40, - borderRadius: 20, - color: settingsProvider.themeColor, - onSelectFocus: false, - onSelect: () async { - final Color colorBeforeDialog = settingsProvider.themeColor; - if (!(await colorPickerDialog())) { - setState(() { - settingsProvider.themeColor = colorBeforeDialog; - }); - } - })); + dense: true, + contentPadding: EdgeInsets.zero, + title: Text(tr('selectX', args: [tr('colour')])), + subtitle: Text( + "${ColorTools.nameThatColor(settingsProvider.themeColor)} " + "(${ColorTools.materialNameAndCode(settingsProvider.themeColor, colorSwatchNameMap: colorsNameMap)})", + ), + trailing: ColorIndicator( + width: 40, + height: 40, + borderRadius: 20, + color: settingsProvider.themeColor, + onSelectFocus: false, + onSelect: () async { + final Color colorBeforeDialog = settingsProvider.themeColor; + if (!(await colorPickerDialog())) { + setState(() { + settingsProvider.themeColor = colorBeforeDialog; + }); + } + }, + ), + ); var useMaterialThemeSwitch = FutureBuilder( - builder: (ctx, val) { - return ((val.data?.version.sdkInt ?? 0) >= 31) - ? Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible(child: Text(tr('useMaterialYou'))), - Switch( - value: settingsProvider.useMaterialYou, - onChanged: (value) { - settingsProvider.useMaterialYou = value; - }) - ], - ) - : const SizedBox.shrink(); - }, - future: DeviceInfoPlugin().androidInfo); + builder: (ctx, val) { + return ((val.data?.version.sdkInt ?? 0) >= 31) + ? Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('useMaterialYou'))), + Switch( + value: settingsProvider.useMaterialYou, + onChanged: (value) { + settingsProvider.useMaterialYou = value; + }, + ), + ], + ) + : const SizedBox.shrink(); + }, + future: DeviceInfoPlugin().androidInfo, + ); var sortDropdown = DropdownButtonFormField( - isExpanded: true, - decoration: InputDecoration(labelText: tr('appSortBy')), - value: settingsProvider.sortColumn, - items: [ - DropdownMenuItem( - value: SortColumnSettings.authorName, - child: Text(tr('authorName')), - ), - DropdownMenuItem( - value: SortColumnSettings.nameAuthor, - child: Text(tr('nameAuthor')), - ), - DropdownMenuItem( - value: SortColumnSettings.added, - child: Text(tr('asAdded')), - ), - DropdownMenuItem( - value: SortColumnSettings.releaseDate, - child: Text(tr('releaseDate')), - ) - ], - onChanged: (value) { - if (value != null) { - settingsProvider.sortColumn = value; - } - }); + isExpanded: true, + decoration: InputDecoration(labelText: tr('appSortBy')), + value: settingsProvider.sortColumn, + items: [ + DropdownMenuItem( + value: SortColumnSettings.authorName, + child: Text(tr('authorName')), + ), + DropdownMenuItem( + value: SortColumnSettings.nameAuthor, + child: Text(tr('nameAuthor')), + ), + DropdownMenuItem( + value: SortColumnSettings.added, + child: Text(tr('asAdded')), + ), + DropdownMenuItem( + value: SortColumnSettings.releaseDate, + child: Text(tr('releaseDate')), + ), + ], + onChanged: (value) { + if (value != null) { + settingsProvider.sortColumn = value; + } + }, + ); var orderDropdown = DropdownButtonFormField( - isExpanded: true, - decoration: InputDecoration(labelText: tr('appSortOrder')), - value: settingsProvider.sortOrder, - items: [ - DropdownMenuItem( - value: SortOrderSettings.ascending, - child: Text(tr('ascending')), - ), - DropdownMenuItem( - value: SortOrderSettings.descending, - child: Text(tr('descending')), - ), - ], - onChanged: (value) { - if (value != null) { - settingsProvider.sortOrder = value; - } - }); + isExpanded: true, + decoration: InputDecoration(labelText: tr('appSortOrder')), + value: settingsProvider.sortOrder, + items: [ + DropdownMenuItem( + value: SortOrderSettings.ascending, + child: Text(tr('ascending')), + ), + DropdownMenuItem( + value: SortOrderSettings.descending, + child: Text(tr('descending')), + ), + ], + onChanged: (value) { + if (value != null) { + settingsProvider.sortOrder = value; + } + }, + ); var localeDropdown = DropdownButtonFormField( - decoration: InputDecoration(labelText: tr('language')), - value: settingsProvider.forcedLocale, - items: [ - DropdownMenuItem( - value: null, - child: Text(tr('followSystem')), - ), - ...supportedLocales.map((e) => DropdownMenuItem( - value: e.key, - child: Text(e.value), - )) - ], - onChanged: (value) { - settingsProvider.forcedLocale = value; - if (value != null) { - context.setLocale(value); - } else { - settingsProvider.resetLocaleSafe(context); - } - }); + decoration: InputDecoration(labelText: tr('language')), + value: settingsProvider.forcedLocale, + items: [ + DropdownMenuItem(value: null, child: Text(tr('followSystem'))), + ...supportedLocales.map( + (e) => DropdownMenuItem(value: e.key, child: Text(e.value)), + ), + ], + onChanged: (value) { + settingsProvider.forcedLocale = value; + if (value != null) { + context.setLocale(value); + } else { + settingsProvider.resetLocaleSafe(context); + } + }, + ); var intervalSlider = Slider( value: settingsProvider.updateIntervalSliderVal, @@ -302,630 +318,662 @@ class _SettingsPageState extends State { var sourceSpecificFields = sourceProvider.sources.map((e) { if (e.sourceConfigSettingFormItems.isNotEmpty) { return GeneratedForm( - items: e.sourceConfigSettingFormItems.map((e) { - e.defaultValue = settingsProvider.getSettingString(e.key); - return [e]; - }).toList(), - onValueChanges: (values, valid, isBuilding) { - if (valid && !isBuilding) { - values.forEach((key, value) { - settingsProvider.setSettingString(key, value); - }); - } - }); + items: e.sourceConfigSettingFormItems.map((e) { + e.defaultValue = settingsProvider.getSettingString(e.key); + return [e]; + }).toList(), + onValueChanges: (values, valid, isBuilding) { + if (valid && !isBuilding) { + values.forEach((key, value) { + settingsProvider.setSettingString(key, value); + }); + } + }, + ); } else { return Container(); } }); - const height8 = SizedBox( - height: 8, - ); + const height8 = SizedBox(height: 8); - const height16 = SizedBox( - height: 16, - ); + const height16 = SizedBox(height: 16); - const height32 = SizedBox( - height: 32, - ); + const height32 = SizedBox(height: 32); return Scaffold( - backgroundColor: Theme.of(context).colorScheme.surface, - body: CustomScrollView(slivers: [ + backgroundColor: Theme.of(context).colorScheme.surface, + body: CustomScrollView( + slivers: [ CustomAppBar(title: tr('settings')), SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.all(16), - child: settingsProvider.prefs == null - ? const SizedBox() - : Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - tr('updates'), - style: TextStyle( - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary), + child: Padding( + padding: const EdgeInsets.all(16), + child: settingsProvider.prefs == null + ? const SizedBox() + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + tr('updates'), + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + //intervalDropdown, + height16, + if (showIntervalLabel) + SizedBox( + child: Text( + "${tr('bgUpdateCheckInterval')}: $updateIntervalLabel", ), - //intervalDropdown, - height16, - if (showIntervalLabel) - SizedBox( - child: Text( - "${tr('bgUpdateCheckInterval')}: $updateIntervalLabel")) - else - const SizedBox(height: 16), - intervalSlider, - FutureBuilder( - builder: (ctx, val) { - return (settingsProvider.updateInterval > - 0) && - (((val.data?.version.sdkInt ?? 0) >= - 30) || - settingsProvider.useShizuku) - ? Column( - crossAxisAlignment: - CrossAxisAlignment.start, + ) + else + const SizedBox(height: 16), + intervalSlider, + FutureBuilder( + builder: (ctx, val) { + return (settingsProvider.updateInterval > 0) && + (((val.data?.version.sdkInt ?? 0) >= 30) || + settingsProvider.useShizuku) + ? Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + tr('enableBackgroundUpdates'), + ), + ), + Switch( + value: settingsProvider + .enableBackgroundUpdates, + onChanged: (value) { + settingsProvider + .enableBackgroundUpdates = + value; + }, + ), + ], + ), + height8, + Text( + tr('backgroundUpdateReqsExplanation'), + style: Theme.of( + context, + ).textTheme.labelSmall, + ), + Text( + tr('backgroundUpdateLimitsExplanation'), + style: Theme.of( + context, + ).textTheme.labelSmall, + ), + height8, + if (settingsProvider + .enableBackgroundUpdates) + Column( children: [ + height16, Row( mainAxisAlignment: MainAxisAlignment .spaceBetween, children: [ Flexible( - child: Text(tr( - 'enableBackgroundUpdates'))), + child: Text( + tr('bgUpdatesOnWiFiOnly'), + ), + ), Switch( - value: settingsProvider - .enableBackgroundUpdates, - onChanged: (value) { - settingsProvider - .enableBackgroundUpdates = - value; - }) + value: settingsProvider + .bgUpdatesOnWiFiOnly, + onChanged: (value) { + settingsProvider + .bgUpdatesOnWiFiOnly = + value; + }, + ), ], ), - height8, - Text(tr('backgroundUpdateReqsExplanation'), - style: Theme.of(context) - .textTheme - .labelSmall), - Text(tr('backgroundUpdateLimitsExplanation'), - style: Theme.of(context) - .textTheme - .labelSmall), - height8, - if (settingsProvider - .enableBackgroundUpdates) - Column( - children: [ - height16, - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Flexible( - child: Text(tr( - 'bgUpdatesOnWiFiOnly'))), - Switch( - value: settingsProvider - .bgUpdatesOnWiFiOnly, - onChanged: (value) { - settingsProvider - .bgUpdatesOnWiFiOnly = - value; - }) - ], + height16, + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Flexible( + child: Text( + tr( + 'bgUpdatesWhileChargingOnly', + ), ), - height16, - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Flexible( - child: Text(tr( - 'bgUpdatesWhileChargingOnly'))), - Switch( - value: settingsProvider - .bgUpdatesWhileChargingOnly, - onChanged: (value) { - settingsProvider - .bgUpdatesWhileChargingOnly = - value; - }) - ], - ), - ], - ), + ), + Switch( + value: settingsProvider + .bgUpdatesWhileChargingOnly, + onChanged: (value) { + settingsProvider + .bgUpdatesWhileChargingOnly = + value; + }, + ), + ], + ), ], - ) - : const SizedBox.shrink(); - }, - future: DeviceInfoPlugin().androidInfo), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible(child: Text(tr('checkOnStart'))), - Switch( - value: settingsProvider.checkOnStart, - onChanged: (value) { - settingsProvider.checkOnStart = value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text(tr('checkUpdateOnDetailPage'))), - Switch( - value: settingsProvider - .checkUpdateOnDetailPage, - onChanged: (value) { - settingsProvider.checkUpdateOnDetailPage = - value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text(tr( - 'onlyCheckInstalledOrTrackOnlyApps'))), - Switch( - value: settingsProvider - .onlyCheckInstalledOrTrackOnlyApps, - onChanged: (value) { - settingsProvider - .onlyCheckInstalledOrTrackOnlyApps = - value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: - Text(tr('removeOnExternalUninstall'))), - Switch( - value: settingsProvider - .removeOnExternalUninstall, - onChanged: (value) { - settingsProvider - .removeOnExternalUninstall = value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible(child: Text(tr('parallelDownloads'))), - Switch( - value: settingsProvider.parallelDownloads, - onChanged: (value) { - settingsProvider.parallelDownloads = - value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text(tr( - 'beforeNewInstallsShareToAppVerifier')), - GestureDetector( - onTap: () { - launchUrlString( - 'https://github.com/soupslurpr/AppVerifier', - mode: LaunchMode - .externalApplication); - }, - child: Text( - tr('about'), - style: const TextStyle( - decoration: - TextDecoration.underline, - fontSize: 12), - )), - ], - )), - Switch( - value: settingsProvider - .beforeNewInstallsShareToAppVerifier, - onChanged: (value) { - settingsProvider - .beforeNewInstallsShareToAppVerifier = - value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible(child: Text(tr('useShizuku'))), - Switch( - value: settingsProvider.useShizuku, - onChanged: (useShizuku) { - if (useShizuku) { - ShizukuApkInstaller.checkPermission() - .then((resCode) { - settingsProvider.useShizuku = - resCode!.startsWith('granted'); - switch (resCode) { - case 'binder_not_found': - showError( - ObtainiumError(tr( - 'shizukuBinderNotFound')), - context); - case 'old_shizuku': - showError( - ObtainiumError( - tr('shizukuOld')), - context); - case 'old_android_with_adb': - showError( - ObtainiumError(tr( - 'shizukuOldAndroidWithADB')), - context); - case 'denied': - showError( - ObtainiumError( - tr('cancelled')), - context); - } - }); - } else { - settingsProvider.useShizuku = false; - } - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text( - tr('shizukuPretendToBeGooglePlay'))), - Switch( - value: settingsProvider - .shizukuPretendToBeGooglePlay, - onChanged: (value) { - settingsProvider - .shizukuPretendToBeGooglePlay = value; - }) - ], - ), - height32, - Text( - tr('sourceSpecific'), - style: TextStyle( - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary), - ), - ...sourceSpecificFields, - height32, - Text( - tr('appearance'), - style: TextStyle( - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary), - ), - DropdownButtonFormField( - decoration: - InputDecoration(labelText: tr('theme')), - value: settingsProvider.theme, - items: [ - DropdownMenuItem( - value: ThemeSettings.system, - child: Text(tr('followSystem')), - ), - DropdownMenuItem( - value: ThemeSettings.light, - child: Text(tr('light')), - ), - DropdownMenuItem( - value: ThemeSettings.dark, - child: Text(tr('dark')), + ), + ], ) - ], - onChanged: (value) { - if (value != null) { - settingsProvider.theme = value; - } - }), - height8, - if (settingsProvider.theme == ThemeSettings.system) - followSystemThemeExplanation, - height16, - if (settingsProvider.theme != ThemeSettings.light) - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Flexible(child: Text(tr('useBlackTheme'))), - Switch( - value: settingsProvider.useBlackTheme, - onChanged: (value) { - settingsProvider.useBlackTheme = - value; - }) - ]), - height8, - useMaterialThemeSwitch, - if (!settingsProvider.useMaterialYou) colorPicker, - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded(child: sortDropdown), - const SizedBox( - width: 16, - ), - Expanded(child: orderDropdown), - ], + : const SizedBox.shrink(); + }, + future: DeviceInfoPlugin().androidInfo, + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('checkOnStart'))), + Switch( + value: settingsProvider.checkOnStart, + onChanged: (value) { + settingsProvider.checkOnStart = value; + }, ), - height16, - localeDropdown, - FutureBuilder( - builder: (ctx, val) { - return (val.data?.version.sdkInt ?? 0) >= 34 - ? Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - height16, - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Flexible( - child: Text(tr( - 'useSystemFont'))), - Switch( - value: settingsProvider - .useSystemFont, - onChanged: - (useSystemFont) { - if (useSystemFont) { - NativeFeatures - .loadSystemFont() - .then((val) { - settingsProvider - .useSystemFont = - true; - }); - } else { - settingsProvider - .useSystemFont = - false; - } - }) - ]) - ]) - : const SizedBox.shrink(); - }, - future: DeviceInfoPlugin().androidInfo), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible(child: Text(tr('showWebInAppView'))), - Switch( - value: settingsProvider.showAppWebpage, - onChanged: (value) { - settingsProvider.showAppWebpage = value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible(child: Text(tr('pinUpdates'))), - Switch( - value: settingsProvider.pinUpdates, - onChanged: (value) { - settingsProvider.pinUpdates = value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text( - tr('moveNonInstalledAppsToBottom'))), - Switch( - value: settingsProvider.buryNonInstalled, - onChanged: (value) { - settingsProvider.buryNonInstalled = value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible(child: Text(tr('groupByCategory'))), - Switch( - value: settingsProvider.groupByCategory, - onChanged: (value) { - settingsProvider.groupByCategory = value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: - Text(tr('dontShowTrackOnlyWarnings'))), - Switch( - value: - settingsProvider.hideTrackOnlyWarning, - onChanged: (value) { - settingsProvider.hideTrackOnlyWarning = - value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: - Text(tr('dontShowAPKOriginWarnings'))), - Switch( - value: - settingsProvider.hideAPKOriginWarning, - onChanged: (value) { - settingsProvider.hideAPKOriginWarning = - value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text(tr('disablePageTransitions'))), - Switch( - value: - settingsProvider.disablePageTransitions, - onChanged: (value) { - settingsProvider.disablePageTransitions = - value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text(tr('reversePageTransitions'))), - Switch( - value: - settingsProvider.reversePageTransitions, - onChanged: settingsProvider - .disablePageTransitions - ? null - : (value) { - settingsProvider - .reversePageTransitions = value; - }) - ], - ), - height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Text(tr('highlightTouchTargets'))), - Switch( - value: - settingsProvider.highlightTouchTargets, - onChanged: (value) { - settingsProvider.highlightTouchTargets = - value; - }) - ], - ), - height32, - Text( - tr('categories'), - style: TextStyle( - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary), - ), - height16, - const CategoryEditorSelector( - showLabelWhenNotEmpty: false, - ) ], - ))), + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text(tr('checkUpdateOnDetailPage')), + ), + Switch( + value: settingsProvider.checkUpdateOnDetailPage, + onChanged: (value) { + settingsProvider.checkUpdateOnDetailPage = + value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + tr('onlyCheckInstalledOrTrackOnlyApps'), + ), + ), + Switch( + value: settingsProvider + .onlyCheckInstalledOrTrackOnlyApps, + onChanged: (value) { + settingsProvider + .onlyCheckInstalledOrTrackOnlyApps = + value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text(tr('removeOnExternalUninstall')), + ), + Switch( + value: settingsProvider.removeOnExternalUninstall, + onChanged: (value) { + settingsProvider.removeOnExternalUninstall = + value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('parallelDownloads'))), + Switch( + value: settingsProvider.parallelDownloads, + onChanged: (value) { + settingsProvider.parallelDownloads = value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + tr('beforeNewInstallsShareToAppVerifier'), + ), + GestureDetector( + onTap: () { + launchUrlString( + 'https://github.com/soupslurpr/AppVerifier', + mode: LaunchMode.externalApplication, + ); + }, + child: Text( + tr('about'), + style: const TextStyle( + decoration: TextDecoration.underline, + fontSize: 12, + ), + ), + ), + ], + ), + ), + Switch( + value: settingsProvider + .beforeNewInstallsShareToAppVerifier, + onChanged: (value) { + settingsProvider + .beforeNewInstallsShareToAppVerifier = + value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('useShizuku'))), + Switch( + value: settingsProvider.useShizuku, + onChanged: (useShizuku) { + if (useShizuku) { + ShizukuApkInstaller.checkPermission().then(( + resCode, + ) { + settingsProvider.useShizuku = resCode! + .startsWith('granted'); + switch (resCode) { + case 'binder_not_found': + showError( + ObtainiumError( + tr('shizukuBinderNotFound'), + ), + context, + ); + case 'old_shizuku': + showError( + ObtainiumError(tr('shizukuOld')), + context, + ); + case 'old_android_with_adb': + showError( + ObtainiumError( + tr('shizukuOldAndroidWithADB'), + ), + context, + ); + case 'denied': + showError( + ObtainiumError(tr('cancelled')), + context, + ); + } + }); + } else { + settingsProvider.useShizuku = false; + } + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text(tr('shizukuPretendToBeGooglePlay')), + ), + Switch( + value: + settingsProvider.shizukuPretendToBeGooglePlay, + onChanged: (value) { + settingsProvider.shizukuPretendToBeGooglePlay = + value; + }, + ), + ], + ), + height32, + Text( + tr('sourceSpecific'), + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + ...sourceSpecificFields, + height32, + Text( + tr('appearance'), + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + DropdownButtonFormField( + decoration: InputDecoration(labelText: tr('theme')), + value: settingsProvider.theme, + items: [ + DropdownMenuItem( + value: ThemeSettings.system, + child: Text(tr('followSystem')), + ), + DropdownMenuItem( + value: ThemeSettings.light, + child: Text(tr('light')), + ), + DropdownMenuItem( + value: ThemeSettings.dark, + child: Text(tr('dark')), + ), + ], + onChanged: (value) { + if (value != null) { + settingsProvider.theme = value; + } + }, + ), + height8, + if (settingsProvider.theme == ThemeSettings.system) + followSystemThemeExplanation, + height16, + if (settingsProvider.theme != ThemeSettings.light) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('useBlackTheme'))), + Switch( + value: settingsProvider.useBlackTheme, + onChanged: (value) { + settingsProvider.useBlackTheme = value; + }, + ), + ], + ), + height8, + useMaterialThemeSwitch, + if (!settingsProvider.useMaterialYou) colorPicker, + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: sortDropdown), + const SizedBox(width: 16), + Expanded(child: orderDropdown), + ], + ), + height16, + localeDropdown, + FutureBuilder( + builder: (ctx, val) { + return (val.data?.version.sdkInt ?? 0) >= 34 + ? Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + height16, + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text(tr('useSystemFont')), + ), + Switch( + value: + settingsProvider.useSystemFont, + onChanged: (useSystemFont) { + if (useSystemFont) { + NativeFeatures.loadSystemFont() + .then((val) { + settingsProvider + .useSystemFont = + true; + }); + } else { + settingsProvider.useSystemFont = + false; + } + }, + ), + ], + ), + ], + ) + : const SizedBox.shrink(); + }, + future: DeviceInfoPlugin().androidInfo, + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('showWebInAppView'))), + Switch( + value: settingsProvider.showAppWebpage, + onChanged: (value) { + settingsProvider.showAppWebpage = value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('pinUpdates'))), + Switch( + value: settingsProvider.pinUpdates, + onChanged: (value) { + settingsProvider.pinUpdates = value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text(tr('moveNonInstalledAppsToBottom')), + ), + Switch( + value: settingsProvider.buryNonInstalled, + onChanged: (value) { + settingsProvider.buryNonInstalled = value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('groupByCategory'))), + Switch( + value: settingsProvider.groupByCategory, + onChanged: (value) { + settingsProvider.groupByCategory = value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text(tr('dontShowTrackOnlyWarnings')), + ), + Switch( + value: settingsProvider.hideTrackOnlyWarning, + onChanged: (value) { + settingsProvider.hideTrackOnlyWarning = value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text(tr('dontShowAPKOriginWarnings')), + ), + Switch( + value: settingsProvider.hideAPKOriginWarning, + onChanged: (value) { + settingsProvider.hideAPKOriginWarning = value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('disablePageTransitions'))), + Switch( + value: settingsProvider.disablePageTransitions, + onChanged: (value) { + settingsProvider.disablePageTransitions = value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('reversePageTransitions'))), + Switch( + value: settingsProvider.reversePageTransitions, + onChanged: settingsProvider.disablePageTransitions + ? null + : (value) { + settingsProvider.reversePageTransitions = + value; + }, + ), + ], + ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('highlightTouchTargets'))), + Switch( + value: settingsProvider.highlightTouchTargets, + onChanged: (value) { + settingsProvider.highlightTouchTargets = value; + }, + ), + ], + ), + height32, + Text( + tr('categories'), + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + height16, + const CategoryEditorSelector( + showLabelWhenNotEmpty: false, + ), + ], + ), + ), + ), SliverToBoxAdapter( child: Column( children: [ - const Divider( - height: 32, - ), + const Divider(height: 32), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ IconButton( onPressed: () { - launchUrlString(settingsProvider.sourceUrl, - mode: LaunchMode.externalApplication); + launchUrlString( + settingsProvider.sourceUrl, + mode: LaunchMode.externalApplication, + ); }, icon: const Icon(Icons.code), tooltip: tr('appSource'), ), IconButton( onPressed: () { - launchUrlString('https://wiki.obtainium.imranr.dev/', - mode: LaunchMode.externalApplication); + launchUrlString( + 'https://wiki.obtainium.imranr.dev/', + mode: LaunchMode.externalApplication, + ); }, icon: const Icon(Icons.help_outline_rounded), tooltip: tr('wiki'), ), IconButton( onPressed: () { - launchUrlString('https://apps.obtainium.imranr.dev/', - mode: LaunchMode.externalApplication); + launchUrlString( + 'https://apps.obtainium.imranr.dev/', + mode: LaunchMode.externalApplication, + ); }, icon: const Icon(Icons.apps_rounded), tooltip: tr('crowdsourcedConfigsLabel'), ), IconButton( - onPressed: () { - context.read().get().then((logs) { - if (logs.isEmpty) { - showMessage( - ObtainiumError(tr('noLogs')), context); - } else { - showDialog( - context: context, - builder: (BuildContext ctx) { - return const LogsDialog(); - }); - } - }); - }, - icon: const Icon(Icons.bug_report_outlined), - tooltip: tr('appLogs')) + onPressed: () { + context.read().get().then((logs) { + if (logs.isEmpty) { + showMessage(ObtainiumError(tr('noLogs')), context); + } else { + showDialog( + context: context, + builder: (BuildContext ctx) { + return const LogsDialog(); + }, + ); + } + }); + }, + icon: const Icon(Icons.bug_report_outlined), + tooltip: tr('appLogs'), + ), ], ), - const SizedBox( - height: 16, - ) + const SizedBox(height: 16), ], ), - ) - ])); + ), + ], + ), + ); } } @@ -947,11 +995,11 @@ class _LogsDialogState extends State { logsProvider .get(after: DateTime.now().subtract(Duration(days: days))) .then((value) { - setState(() { - String l = value.map((e) => e.toString()).join('\n\n'); - logString = l.isNotEmpty ? l : tr('noLogs'); - }); - }); + setState(() { + String l = value.map((e) => e.toString()).join('\n\n'); + logString = l.isNotEmpty ? l : tr('noLogs'); + }); + }); } if (logString == null) { @@ -964,53 +1012,57 @@ class _LogsDialogState extends State { content: Column( children: [ DropdownButtonFormField( - value: days.first, - items: days - .map((e) => DropdownMenuItem( - value: e, - child: Text(plural('day', e)), - )) - .toList(), - onChanged: (d) { - filterLogs(d ?? 7); - }), - const SizedBox( - height: 32, + value: days.first, + items: days + .map( + (e) => + DropdownMenuItem(value: e, child: Text(plural('day', e))), + ) + .toList(), + onChanged: (d) { + filterLogs(d ?? 7); + }, ), - Text(logString ?? '') + const SizedBox(height: 32), + Text(logString ?? ''), ], ), actions: [ TextButton( - onPressed: () async { - var cont = (await showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: tr('appLogs'), - items: const [], - initValid: true, - message: tr('removeFromObtainium'), - ); - })) != - null; - if (cont) { - logsProvider.clear(); - Navigator.of(context).pop(); - } - }, - child: Text(tr('remove'))), - TextButton( - onPressed: () { + onPressed: () async { + var cont = + (await showDialog?>( + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + title: tr('appLogs'), + items: const [], + initValid: true, + message: tr('removeFromObtainium'), + ); + }, + )) != + null; + if (cont) { + logsProvider.clear(); Navigator.of(context).pop(); - }, - child: Text(tr('close'))), + } + }, + child: Text(tr('remove')), + ), TextButton( - onPressed: () { - Share.share(logString ?? '', subject: tr('appLogs')); - Navigator.of(context).pop(); - }, - child: Text(tr('share'))) + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(tr('close')), + ), + TextButton( + onPressed: () { + Share.share(logString ?? '', subject: tr('appLogs')); + Navigator.of(context).pop(); + }, + child: Text(tr('share')), + ), ], ); } @@ -1022,13 +1074,14 @@ class CategoryEditorSelector extends StatefulWidget { final Set preselected; final WrapAlignment alignment; final bool showLabelWhenNotEmpty; - const CategoryEditorSelector( - {super.key, - this.onSelected, - this.singleSelect = false, - this.preselected = const {}, - this.alignment = WrapAlignment.start, - this.showLabelWhenNotEmpty = true}); + const CategoryEditorSelector({ + super.key, + this.onSelected, + this.singleSelect = false, + this.preselected = const {}, + this.alignment = WrapAlignment.start, + this.showLabelWhenNotEmpty = true, + }); @override State createState() => _CategoryEditorSelectorState(); @@ -1041,38 +1094,48 @@ class _CategoryEditorSelectorState extends State { Widget build(BuildContext context) { var settingsProvider = context.watch(); var appsProvider = context.watch(); - storedValues = settingsProvider.categories.map((key, value) => MapEntry( + storedValues = settingsProvider.categories.map( + (key, value) => MapEntry( key, - MapEntry(value, - storedValues[key]?.value ?? widget.preselected.contains(key)))); + MapEntry( + value, + storedValues[key]?.value ?? widget.preselected.contains(key), + ), + ), + ); return GeneratedForm( - items: [ - [ - GeneratedFormTagInput('categories', - label: tr('categories'), - emptyMessage: tr('noCategories'), - defaultValue: storedValues, - alignment: widget.alignment, - deleteConfirmationMessage: MapEntry( - tr('deleteCategoriesQuestion'), - tr('categoryDeleteWarning')), - singleSelect: widget.singleSelect, - showLabelWhenNotEmpty: widget.showLabelWhenNotEmpty) - ] + items: [ + [ + GeneratedFormTagInput( + 'categories', + label: tr('categories'), + emptyMessage: tr('noCategories'), + defaultValue: storedValues, + alignment: widget.alignment, + deleteConfirmationMessage: MapEntry( + tr('deleteCategoriesQuestion'), + tr('categoryDeleteWarning'), + ), + singleSelect: widget.singleSelect, + showLabelWhenNotEmpty: widget.showLabelWhenNotEmpty, + ), ], - onValueChanges: ((values, valid, isBuilding) { - if (!isBuilding) { - storedValues = - values['categories'] as Map>; - settingsProvider.setCategories( - storedValues.map((key, value) => MapEntry(key, value.key)), - appsProvider: appsProvider); - if (widget.onSelected != null) { - widget.onSelected!(storedValues.keys - .where((k) => storedValues[k]!.value) - .toList()); - } + ], + onValueChanges: ((values, valid, isBuilding) { + if (!isBuilding) { + storedValues = + values['categories'] as Map>; + settingsProvider.setCategories( + storedValues.map((key, value) => MapEntry(key, value.key)), + appsProvider: appsProvider, + ); + if (widget.onSelected != null) { + widget.onSelected!( + storedValues.keys.where((k) => storedValues[k]!.value).toList(), + ); } - })); + } + }), + ); } } diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index ad506f0..769be36 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -74,7 +74,7 @@ List generateStandardVersionRegExStrings() { '[0-9]+', '[0-9]+\\.[0-9]+', '[0-9]+\\.[0-9]+\\.[0-9]+', - '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+' + '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+', ]; var preSuffixes = ['-', '\\+']; var suffixes = ['alpha', 'beta', 'ose', '[0-9]+']; @@ -103,8 +103,9 @@ Set findStandardFormatsForVersion(String version, bool strict) { // If !strict, even a substring match is valid Set results = {}; for (var pattern in standardVersionRegExStrings) { - if (RegExp('${strict ? '^' : ''}$pattern${strict ? '\$' : ''}') - .hasMatch(version)) { + if (RegExp( + '${strict ? '^' : ''}$pattern${strict ? '\$' : ''}', + ).hasMatch(version)) { results.add(pattern); } } @@ -127,8 +128,10 @@ moveStrToEnd(List arr, String str, {String? strB}) { } List> moveStrToEndMapEntryWithCount( - List> arr, MapEntry str, - {MapEntry? strB}) { + List> arr, + MapEntry str, { + MapEntry? strB, +}) { MapEntry? temp; arr.removeWhere((element) { bool resA = element.key == str.key; @@ -146,30 +149,45 @@ List> moveStrToEndMapEntryWithCount( return arr; } -Future downloadFileWithRetry(String url, String fileName, - bool fileNameHasExt, Function? onProgress, String destDir, - {bool useExisting = true, - Map? headers, - int retries = 3, - bool allowInsecure = false, - LogsProvider? logs}) async { +Future downloadFileWithRetry( + String url, + String fileName, + bool fileNameHasExt, + Function? onProgress, + String destDir, { + bool useExisting = true, + Map? headers, + int retries = 3, + bool allowInsecure = false, + LogsProvider? logs, +}) async { try { return await downloadFile( - url, fileName, fileNameHasExt, onProgress, destDir, - useExisting: useExisting, - headers: headers, - allowInsecure: allowInsecure, - logs: logs); + url, + fileName, + fileNameHasExt, + onProgress, + destDir, + useExisting: useExisting, + headers: headers, + allowInsecure: allowInsecure, + logs: logs, + ); } catch (e) { if (retries > 0 && e is ClientException) { await Future.delayed(const Duration(seconds: 5)); return await downloadFileWithRetry( - url, fileName, fileNameHasExt, onProgress, destDir, - useExisting: useExisting, - headers: headers, - retries: (retries - 1), - allowInsecure: allowInsecure, - logs: logs); + url, + fileName, + fileNameHasExt, + onProgress, + destDir, + useExisting: useExisting, + headers: headers, + retries: (retries - 1), + allowInsecure: allowInsecure, + logs: logs, + ); } else { rethrow; } @@ -183,17 +201,27 @@ String hashListOfLists(List> data) { return hash.hashCode.toString(); } -Future checkPartialDownloadHashDynamic(String url, - {int startingSize = 1024, - int lowerLimit = 128, - Map? headers, - bool allowInsecure = false}) async { +Future checkPartialDownloadHashDynamic( + String url, { + int startingSize = 1024, + int lowerLimit = 128, + Map? headers, + bool allowInsecure = false, +}) async { for (int i = startingSize; i >= lowerLimit; i -= 256) { List ab = await Future.wait([ - checkPartialDownloadHash(url, i, - headers: headers, allowInsecure: allowInsecure), - checkPartialDownloadHash(url, i, - headers: headers, allowInsecure: allowInsecure) + checkPartialDownloadHash( + url, + i, + headers: headers, + allowInsecure: allowInsecure, + ), + checkPartialDownloadHash( + url, + i, + headers: headers, + allowInsecure: allowInsecure, + ), ]); if (ab[0] == ab[1]) { return ab[0]; @@ -202,8 +230,12 @@ Future checkPartialDownloadHashDynamic(String url, throw NoVersionError(); } -Future checkPartialDownloadHash(String url, int bytesToGrab, - {Map? headers, bool allowInsecure = false}) async { +Future checkPartialDownloadHash( + String url, + int bytesToGrab, { + Map? headers, + bool allowInsecure = false, +}) async { var req = Request('GET', Uri.parse(url)); if (headers != null) { req.headers.addAll(headers); @@ -218,8 +250,11 @@ Future checkPartialDownloadHash(String url, int bytesToGrab, return hashListOfLists(bytes); } -Future checkETagHeader(String url, - {Map? headers, bool allowInsecure = false}) async { +Future checkETagHeader( + String url, { + Map? headers, + bool allowInsecure = false, +}) async { // Send the initial request but cancel it as soon as you have the headers var reqHeaders = headers ?? {}; var req = Request('GET', Uri.parse(url)); @@ -238,16 +273,23 @@ deleteFile(File file) { try { file.deleteSync(recursive: true); } on PathAccessException catch (e) { - throw ObtainiumError(tr('fileDeletionError', args: [e.path ?? tr('unknown')])); + throw ObtainiumError( + tr('fileDeletionError', args: [e.path ?? tr('unknown')]), + ); } } -Future downloadFile(String url, String fileName, bool fileNameHasExt, - Function? onProgress, String destDir, - {bool useExisting = true, - Map? headers, - bool allowInsecure = false, - LogsProvider? logs}) async { +Future downloadFile( + String url, + String fileName, + bool fileNameHasExt, + Function? onProgress, + String destDir, { + bool useExisting = true, + Map? headers, + bool allowInsecure = false, + LogsProvider? logs, +}) async { // Send the initial request but cancel it as soon as you have the headers var reqHeaders = headers ?? {}; var req = Request('GET', Uri.parse(url)); @@ -311,7 +353,8 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, bool tempFileExists = tempDownloadedFile.existsSync(); if (tempFileExists && useExisting) { logs?.add( - 'Partial download exists - will wait: ${tempDownloadedFile.uri.pathSegments.last}'); + 'Partial download exists - will wait: ${tempDownloadedFile.uri.pathSegments.last}', + ); bool isDownloading = true; int currentTempFileSize = await tempDownloadedFile.length(); bool shouldReturn = false; @@ -322,10 +365,12 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, if (newTempFileSize > currentTempFileSize) { currentTempFileSize = newTempFileSize; logs?.add( - 'Existing partial download still in progress: ${tempDownloadedFile.uri.pathSegments.last}'); + 'Existing partial download still in progress: ${tempDownloadedFile.uri.pathSegments.last}', + ); } else { logs?.add( - 'Ignoring existing partial download: ${tempDownloadedFile.uri.pathSegments.last}'); + 'Ignoring existing partial download: ${tempDownloadedFile.uri.pathSegments.last}', + ); break; } } else { @@ -334,11 +379,13 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, } if (shouldReturn) { logs?.add( - 'Existing partial download completed - not repeating: ${tempDownloadedFile.uri.pathSegments.last}'); + 'Existing partial download completed - not repeating: ${tempDownloadedFile.uri.pathSegments.last}', + ); return downloadedFile; } else { logs?.add( - 'Existing partial download not in progress: ${tempDownloadedFile.uri.pathSegments.last}'); + 'Existing partial download not in progress: ${tempDownloadedFile.uri.pathSegments.last}', + ); } } @@ -358,8 +405,12 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, } else if (tempDownloadedFile.existsSync()) { deleteFile(tempDownloadedFile); } - var responseWithClient = - await sourceRequestStreamResponse('GET', url, reqHeaders, {}); + var responseWithClient = await sourceRequestStreamResponse( + 'GET', + url, + reqHeaders, + {}, + ); HttpClient responseClient = responseWithClient.value.key; HttpClientResponse response = responseWithClient.value.value; sink ??= tempDownloadedFile.openWrite(mode: FileMode.writeOnly); @@ -391,20 +442,22 @@ Future downloadFile(String url, String fileName, bool fileNameHasExt, } return chunk; }) - .transform(StreamTransformer, List>.fromHandlers( - handleData: (List data, EventSink> s) { - downloadBuffer.add(data); - if (downloadBuffer.length >= downloadBufferSize) { - s.add(downloadBuffer.takeBytes()); - } - }, - handleDone: (EventSink> s) { - if (downloadBuffer.isNotEmpty) { - s.add(downloadBuffer.takeBytes()); - } - s.close(); - }, - )) + .transform( + StreamTransformer, List>.fromHandlers( + handleData: (List data, EventSink> s) { + downloadBuffer.add(data); + if (downloadBuffer.length >= downloadBufferSize) { + s.add(downloadBuffer.takeBytes()); + } + }, + handleDone: (EventSink> s) { + if (downloadBuffer.isNotEmpty) { + s.add(downloadBuffer.takeBytes()); + } + s.close(); + }, + ), + ) .pipe(sink); await sink.close(); progress = null; @@ -426,8 +479,10 @@ Future> getAllInstalledInfo() async { return await pm.getInstalledPackages() ?? []; } -Future getInstalledInfo(String? packageName, - {bool printErr = true}) async { +Future getInstalledInfo( + String? packageName, { + bool printErr = true, +}) async { if (packageName != null) { try { return await pm.getPackageInfo(packageName: packageName); @@ -476,13 +531,15 @@ class AppsProvider with ChangeNotifier { iconsCacheDir.createSync(); } } else { - APKDir = - Directory('${(await getExternalStorageDirectory())!.path}/apks'); + APKDir = Directory( + '${(await getExternalStorageDirectory())!.path}/apks', + ); if (!APKDir.existsSync()) { APKDir.createSync(); } - iconsCacheDir = - Directory('${(await getExternalStorageDirectory())!.path}/icons'); + iconsCacheDir = Directory( + '${(await getExternalStorageDirectory())!.path}/icons', + ); if (!iconsCacheDir.existsSync()) { iconsCacheDir.createSync(); } @@ -495,16 +552,20 @@ class AppsProvider with ChangeNotifier { APKDir.listSync() .where((element) => element.statSync().modified.isBefore(cutoff)) .forEach((partialApk) { - if (!areDownloadsRunning()) { - partialApk.delete(recursive: true); - } - }); + if (!areDownloadsRunning()) { + partialApk.delete(recursive: true); + } + }); } }(); } - Future handleAPKIDChange(App app, PackageInfo newInfo, - File downloadedFile, String downloadUrl) async { + Future handleAPKIDChange( + App app, + PackageInfo newInfo, + File downloadedFile, + String downloadUrl, + ) async { // If the APK package ID is different from the App ID, it is either new (using a placeholder ID) or the ID has changed // The former case should be handled (give the App its real ID), the latter is a security issue var isTempIdBool = isTempId(app); @@ -517,31 +578,39 @@ class AppsProvider with ChangeNotifier { var originalAppId = app.id; app.id = newInfo.packageName!; downloadedFile = downloadedFile.renameSync( - '${downloadedFile.parent.path}/${app.id}-${downloadUrl.hashCode}.${downloadedFile.path.split('.').last}'); + '${downloadedFile.parent.path}/${app.id}-${downloadUrl.hashCode}.${downloadedFile.path.split('.').last}', + ); if (apps[originalAppId] != null) { await removeApps([originalAppId]); - await saveApps([app], - onlyIfExists: !isTempIdBool && !idChangeWasAllowed); + await saveApps([ + app, + ], onlyIfExists: !isTempIdBool && !idChangeWasAllowed); } } return downloadedFile; } - Future downloadApp(App app, BuildContext? context, - {NotificationsProvider? notificationsProvider, - bool useExisting = true}) async { + Future downloadApp( + App app, + BuildContext? context, { + NotificationsProvider? notificationsProvider, + bool useExisting = true, + }) async { var notifId = DownloadNotification(app.finalName, 0).id; if (apps[app.id] != null) { apps[app.id]!.downloadProgress = 0; notifyListeners(); } try { - AppSource source = SourceProvider() - .getSource(app.url, overrideSource: app.overrideSource); + AppSource source = SourceProvider().getSource( + app.url, + overrideSource: app.overrideSource, + ); String downloadUrl = await source.apkUrlPrefetchModifier( - app.apkUrls[app.preferredApkIndex].value, - app.url, - app.additionalSettings); + app.apkUrls[app.preferredApkIndex].value, + app.url, + app.additionalSettings, + ); var notif = DownloadNotification(app.finalName, 100); notificationsProvider?.cancel(notif.id); int? prevProg; @@ -550,25 +619,32 @@ class AppsProvider with ChangeNotifier { fileNameNoExt = '$fileNameNoExt.${app.apkUrls[app.preferredApkIndex].key.split('.').last}'; } - var headers = await source.getRequestHeaders(app.additionalSettings, - forAPKDownload: true); + var headers = await source.getRequestHeaders( + app.additionalSettings, + forAPKDownload: true, + ); var downloadedFile = await downloadFileWithRetry( - downloadUrl, fileNameNoExt, source.urlsAlwaysHaveExtension, - headers: headers, (double? progress) { - int? prog = progress?.ceil(); - if (apps[app.id] != null) { - apps[app.id]!.downloadProgress = progress; - notifyListeners(); - } - notif = DownloadNotification(app.finalName, prog ?? 100); - if (prog != null && prevProg != prog) { - notificationsProvider?.notify(notif); - } - prevProg = prog; - }, APKDir.path, - useExisting: useExisting, - allowInsecure: app.additionalSettings['allowInsecure'] == true, - logs: logs); + downloadUrl, + fileNameNoExt, + source.urlsAlwaysHaveExtension, + headers: headers, + (double? progress) { + int? prog = progress?.ceil(); + if (apps[app.id] != null) { + apps[app.id]!.downloadProgress = progress; + notifyListeners(); + } + notif = DownloadNotification(app.finalName, prog ?? 100); + if (prog != null && prevProg != prog) { + notificationsProvider?.notify(notif); + } + prevProg = prog; + }, + APKDir.path, + useExisting: useExisting, + allowInsecure: app.additionalSettings['allowInsecure'] == true, + logs: logs, + ); // Set to 90 for remaining steps, will make null in 'finally' if (apps[app.id] != null) { apps[app.id]!.downloadProgress = -1; @@ -581,7 +657,8 @@ class AppsProvider with ChangeNotifier { Directory? xapkDir; if (isAPK) { newInfo = await pm.getPackageArchiveInfo( - archiveFilePath: downloadedFile.path); + archiveFilePath: downloadedFile.path, + ); } else { // Assume XAPK String xapkDirPath = '${downloadedFile.path}-dir'; @@ -601,16 +678,14 @@ class AppsProvider with ChangeNotifier { return res; }); if (temp != null) { - apks = [ - temp!, - ...apks, - ]; + apks = [temp!, ...apks]; } for (var i = 0; i < apks.length; i++) { try { - newInfo = - await pm.getPackageArchiveInfo(archiveFilePath: apks[i].path); + newInfo = await pm.getPackageArchiveInfo( + archiveFilePath: apks[i].path, + ); if (newInfo != null) { break; } @@ -625,8 +700,12 @@ class AppsProvider with ChangeNotifier { downloadedFile.delete(); throw ObtainiumError('Could not get ID from APK'); } - downloadedFile = - await handleAPKIDChange(app, newInfo, downloadedFile, downloadUrl); + downloadedFile = await handleAPKIDChange( + app, + newInfo, + downloadedFile, + downloadUrl, + ); // Delete older versions of the file if any for (var file in downloadedFile.parent.listSync()) { var fn = file.path.split('/').last; @@ -671,17 +750,20 @@ class AppsProvider with ChangeNotifier { String? installerPackageName; try { installerPackageName = osInfo.version.sdkInt >= 30 - ? (await pm.getInstallSourceInfo(packageName: app.id)) - ?.installingPackageName + ? (await pm.getInstallSourceInfo( + packageName: app.id, + ))?.installingPackageName : (await pm.getInstallerPackageName(packageName: app.id)); } catch (e) { logs.add( - 'Failed to get installed package details: ${app.id} (${e.toString()})'); + 'Failed to get installed package details: ${app.id} (${e.toString()})', + ); return false; // App probably not installed } - int? targetSDK = - (await getInstalledInfo(app.id))?.applicationInfo?.targetSdkVersion; + int? targetSDK = (await getInstalledInfo( + app.id, + ))?.applicationInfo?.targetSdkVersion; // The APK should target a new enough API // https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int) if (!(targetSDK != null && targetSDK >= (osInfo.version.sdkInt - 3))) { @@ -709,11 +791,13 @@ class AppsProvider with ChangeNotifier { } Future waitForUserToReturnToForeground(BuildContext context) async { - NotificationsProvider notificationsProvider = - context.read(); + NotificationsProvider notificationsProvider = context + .read(); if (!isForeground) { - await notificationsProvider.notify(completeInstallationNotification, - cancelExisting: true); + await notificationsProvider.notify( + completeInstallationNotification, + cancelExisting: true, + ); while (await FGBGEvents.instance.stream.first != FGBGType.foreground) {} await notificationsProvider.cancel(completeInstallationNotification.id); } @@ -724,13 +808,17 @@ class AppsProvider with ChangeNotifier { Future unzipFile(String filePath, String destinationPath) async { await ZipFile.extractToDirectory( - zipFile: File(filePath), destinationDir: Directory(destinationPath)); + zipFile: File(filePath), + destinationDir: Directory(destinationPath), + ); } Future installXApkDir( - DownloadedXApkDir dir, BuildContext? firstTimeWithContext, - {bool needsBGWorkaround = false, - bool shizukuPretendToBeGooglePlay = false}) async { + DownloadedXApkDir dir, + BuildContext? firstTimeWithContext, { + bool needsBGWorkaround = false, + bool shizukuPretendToBeGooglePlay = false, + }) async { // We don't know which APKs in an XAPK are supported by the user's device // So we try installing all of them and assume success if at least one installed // If 0 APKs installed, throw the first install error encountered @@ -738,9 +826,10 @@ class AppsProvider with ChangeNotifier { try { MultiAppMultiError errors = MultiAppMultiError(); List APKFiles = []; - for (var file in dir.extracted - .listSync(recursive: true, followLinks: false) - .whereType()) { + for (var file + in dir.extracted + .listSync(recursive: true, followLinks: false) + .whereType()) { if (file.path.toLowerCase().endsWith('.apk')) { APKFiles.add(file); } else if (file.path.toLowerCase().endsWith('.obb')) { @@ -757,20 +846,19 @@ class AppsProvider with ChangeNotifier { return res; }); if (temp != null) { - APKFiles = [ - temp!, - ...APKFiles, - ]; + APKFiles = [temp!, ...APKFiles]; } try { await installApk( - DownloadedApk(dir.appId, APKFiles[0]), firstTimeWithContext, - needsBGWorkaround: needsBGWorkaround, - shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay, - additionalAPKs: APKFiles.sublist(1) - .map((a) => DownloadedApk(dir.appId, a)) - .toList()); + DownloadedApk(dir.appId, APKFiles[0]), + firstTimeWithContext, + needsBGWorkaround: needsBGWorkaround, + shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay, + additionalAPKs: APKFiles.sublist( + 1, + ).map((a) => DownloadedApk(dir.appId, a)).toList(), + ); somethingInstalled = true; dir.file.delete(recursive: true); } catch (e) { @@ -787,22 +875,28 @@ class AppsProvider with ChangeNotifier { } Future installApk( - DownloadedApk file, BuildContext? firstTimeWithContext, - {bool needsBGWorkaround = false, - bool shizukuPretendToBeGooglePlay = false, - List additionalAPKs = const []}) async { + DownloadedApk file, + BuildContext? firstTimeWithContext, { + bool needsBGWorkaround = false, + bool shizukuPretendToBeGooglePlay = false, + List additionalAPKs = const [], + }) async { if (firstTimeWithContext != null && settingsProvider.beforeNewInstallsShareToAppVerifier && (await getInstalledInfo('dev.soupslurpr.appverifier')) != null) { - XFile f = XFile.fromData(file.file.readAsBytesSync(), - mimeType: 'application/vnd.android.package-archive'); + XFile f = XFile.fromData( + file.file.readAsBytesSync(), + mimeType: 'application/vnd.android.package-archive', + ); Fluttertoast.showToast( - msg: tr('appVerifierInstructionToast'), - toastLength: Toast.LENGTH_LONG); + msg: tr('appVerifierInstructionToast'), + toastLength: Toast.LENGTH_LONG, + ); await Share.shareXFiles([f]); } - var newInfo = - await pm.getPackageArchiveInfo(archiveFilePath: file.file.path); + var newInfo = await pm.getPackageArchiveInfo( + archiveFilePath: file.file.path, + ); if (newInfo == null) { try { deleteFile(file.file); @@ -817,7 +911,8 @@ class AppsProvider with ChangeNotifier { } PackageInfo? appInfo = await getInstalledInfo(apps[file.appId]!.app.id); logs.add( - 'Installing "${newInfo.packageName}" version "${newInfo.versionName}" versionCode "${newInfo.versionCode}"${appInfo != null ? ' (from existing version "${appInfo.versionName}" versionCode "${appInfo.versionCode}")' : ''}'); + 'Installing "${newInfo.packageName}" version "${newInfo.versionName}" versionCode "${newInfo.versionCode}"${appInfo != null ? ' (from existing version "${appInfo.versionName}" versionCode "${appInfo.versionCode}")' : ''}', + ); if (appInfo != null && newInfo.versionCode! < appInfo.versionCode! && !(await canDowngradeApps())) { @@ -831,18 +926,22 @@ class AppsProvider with ChangeNotifier { // TODO: When fixed, update this function and the calls to it accordingly apps[file.appId]!.app.installedVersion = apps[file.appId]!.app.latestVersion; - await saveApps([apps[file.appId]!.app], - attemptToCorrectInstallStatus: false); + await saveApps([ + apps[file.appId]!.app, + ], attemptToCorrectInstallStatus: false); } int? code; if (!settingsProvider.useShizuku) { var allAPKs = [file.file.path]; allAPKs.addAll(additionalAPKs.map((a) => a.file.path)); code = await AndroidPackageInstaller.installApk( - apkFilePath: allAPKs.join(',')); + apkFilePath: allAPKs.join(','), + ); } else { - code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(), - shizukuPretendToBeGooglePlay ? "com.android.vending" : ""); + code = await ShizukuApkInstaller.installAPK( + file.file.uri.toString(), + shizukuPretendToBeGooglePlay ? "com.android.vending" : "", + ); } bool installed = false; if (code != null && code != 0 && code != 3) { @@ -884,39 +983,46 @@ class AppsProvider with ChangeNotifier { void uninstallApp(String appId) async { var intent = AndroidIntent( - action: 'android.intent.action.DELETE', - data: 'package:$appId', - flags: [Flag.FLAG_ACTIVITY_NEW_TASK], - package: 'vnd.android.package-archive'); + action: 'android.intent.action.DELETE', + data: 'package:$appId', + flags: [Flag.FLAG_ACTIVITY_NEW_TASK], + package: 'vnd.android.package-archive', + ); await intent.launch(); } Future?> confirmAppFileUrl( - App app, BuildContext? context, bool pickAnyAsset, - {bool evenIfSingleChoice = false}) async { + App app, + BuildContext? context, + bool pickAnyAsset, { + bool evenIfSingleChoice = false, + }) async { var urlsToSelectFrom = app.apkUrls; if (pickAnyAsset) { urlsToSelectFrom = [...urlsToSelectFrom, ...app.otherAssetUrls]; } // If the App has more than one APK, the user should pick one (if context provided) - MapEntry? appFileUrl = urlsToSelectFrom[ - app.preferredApkIndex >= 0 ? app.preferredApkIndex : 0]; + MapEntry? appFileUrl = + urlsToSelectFrom[app.preferredApkIndex >= 0 + ? app.preferredApkIndex + : 0]; // get device supported architecture List archs = (await DeviceInfoPlugin().androidInfo).supportedAbis; if ((urlsToSelectFrom.length > 1 || evenIfSingleChoice) && context != null) { appFileUrl = await showDialog( - // ignore: use_build_context_synchronously - context: context, - builder: (BuildContext ctx) { - return AppFilePicker( - app: app, - initVal: appFileUrl, - archs: archs, - pickAnyAsset: pickAnyAsset, - ); - }); + // ignore: use_build_context_synchronously + context: context, + builder: (BuildContext ctx) { + return AppFilePicker( + app: app, + initVal: appFileUrl, + archs: archs, + pickAnyAsset: pickAnyAsset, + ); + }, + ); } getHost(String url) { var temp = Uri.parse(url).host.split('.'); @@ -929,12 +1035,15 @@ class AppsProvider with ChangeNotifier { context != null) { if (!(settingsProvider.hideAPKOriginWarning) && await showDialog( - // ignore: use_build_context_synchronously - context: context, - builder: (BuildContext ctx) { - return APKOriginWarningDialog( - sourceUrl: app.url, apkUrl: appFileUrl!.value); - }) != + // ignore: use_build_context_synchronously + context: context, + builder: (BuildContext ctx) { + return APKOriginWarningDialog( + sourceUrl: app.url, + apkUrl: appFileUrl!.value, + ); + }, + ) != true) { appFileUrl = null; } @@ -948,10 +1057,12 @@ class AppsProvider with ChangeNotifier { // If user input is needed and the App is in the background, a notification is sent to get the user's attention // Returns an array of Ids for Apps that were successfully downloaded, regardless of installation result Future> downloadAndInstallLatestApps( - List appIds, BuildContext? context, - {NotificationsProvider? notificationsProvider, - bool forceParallelDownloads = false, - bool useExisting = true}) async { + List appIds, + BuildContext? context, { + NotificationsProvider? notificationsProvider, + bool forceParallelDownloads = false, + bool useExisting = true, + }) async { notificationsProvider = notificationsProvider ?? context?.read(); List appsToInstall = []; @@ -975,9 +1086,7 @@ class AppsProvider with ChangeNotifier { apkUrl = await confirmAppFileUrl(apps[id]!.app, context, false); } if (apkUrl != null) { - int urlInd = apps[id]! - .app - .apkUrls + int urlInd = apps[id]!.app.apkUrls .map((e) => e.value) .toList() .indexOf(apkUrl.value); @@ -994,66 +1103,91 @@ class AppsProvider with ChangeNotifier { } } // Mark all specified track-only apps as latest - saveApps(trackOnlyAppsToUpdate.map((e) { - var a = apps[e]!.app; - a.installedVersion = a.latestVersion; - return a; - }).toList()); + saveApps( + trackOnlyAppsToUpdate.map((e) { + var a = apps[e]!.app; + a.installedVersion = a.latestVersion; + return a; + }).toList(), + ); // Prepare to download+install Apps MultiAppMultiError errors = MultiAppMultiError(); List installedIds = []; // Move Obtainium to the end of the line (let all other apps update first) - appsToInstall = - moveStrToEnd(appsToInstall, obtainiumId, strB: obtainiumTempId); + appsToInstall = moveStrToEnd( + appsToInstall, + obtainiumId, + strB: obtainiumTempId, + ); - Future installFn(String id, bool willBeSilent, - DownloadedApk? downloadedFile, DownloadedXApkDir? downloadedDir) async { + Future installFn( + String id, + bool willBeSilent, + DownloadedApk? downloadedFile, + DownloadedXApkDir? downloadedDir, + ) async { apps[id]?.downloadProgress = -1; notifyListeners(); try { bool sayInstalled = true; - var contextIfNewInstall = - apps[id]?.installedInfo == null ? context : null; + var contextIfNewInstall = apps[id]?.installedInfo == null + ? context + : null; bool needBGWorkaround = willBeSilent && context == null && !settingsProvider.useShizuku; - bool shizukuPretendToBeGooglePlay = settingsProvider - .shizukuPretendToBeGooglePlay || + bool shizukuPretendToBeGooglePlay = + settingsProvider.shizukuPretendToBeGooglePlay || apps[id]!.app.additionalSettings['shizukuPretendToBeGooglePlay'] == true; if (downloadedFile != null) { if (needBGWorkaround) { // ignore: use_build_context_synchronously - installApk(downloadedFile, contextIfNewInstall, - needsBGWorkaround: true, - shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay); + installApk( + downloadedFile, + contextIfNewInstall, + needsBGWorkaround: true, + shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay, + ); } else { // ignore: use_build_context_synchronously - sayInstalled = await installApk(downloadedFile, contextIfNewInstall, - shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay); + sayInstalled = await installApk( + downloadedFile, + contextIfNewInstall, + shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay, + ); } } else { if (needBGWorkaround) { // ignore: use_build_context_synchronously - installXApkDir(downloadedDir!, contextIfNewInstall, - needsBGWorkaround: true); + installXApkDir( + downloadedDir!, + contextIfNewInstall, + needsBGWorkaround: true, + ); } else { // ignore: use_build_context_synchronously sayInstalled = await installXApkDir( - downloadedDir!, contextIfNewInstall, - shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay); + downloadedDir!, + contextIfNewInstall, + shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay, + ); } } if (willBeSilent && context == null) { if (!settingsProvider.useShizuku) { - notificationsProvider?.notify(SilentUpdateAttemptNotification( - [apps[id]!.app], - id: id.hashCode)); + notificationsProvider?.notify( + SilentUpdateAttemptNotification([apps[id]!.app], id: id.hashCode), + ); } else { - notificationsProvider?.notify(SilentUpdateNotification( - [apps[id]!.app], sayInstalled, - id: id.hashCode)); + notificationsProvider?.notify( + SilentUpdateNotification( + [apps[id]!.app], + sayInstalled, + id: id.hashCode, + ), + ); } } if (sayInstalled) { @@ -1065,17 +1199,22 @@ class AppsProvider with ChangeNotifier { } } - Future> downloadFn(String id, - {bool skipInstalls = false}) async { + Future> downloadFn( + String id, { + bool skipInstalls = false, + }) async { bool willBeSilent = false; DownloadedApk? downloadedFile; DownloadedXApkDir? downloadedDir; try { var downloadedArtifact = // ignore: use_build_context_synchronously - await downloadApp(apps[id]!.app, context, - notificationsProvider: notificationsProvider, - useExisting: useExisting); + await downloadApp( + apps[id]!.app, + context, + notificationsProvider: notificationsProvider, + useExisting: useExisting, + ); if (downloadedArtifact is DownloadedApk) { downloadedFile = downloadedArtifact; } else { @@ -1110,7 +1249,7 @@ class AppsProvider with ChangeNotifier { 'id': id, 'willBeSilent': willBeSilent, 'downloadedFile': downloadedFile, - 'downloadedDir': downloadedDir + 'downloadedDir': downloadedDir, }; } @@ -1121,16 +1260,18 @@ class AppsProvider with ChangeNotifier { } } else { downloadResults = await Future.wait( - appsToInstall.map((id) => downloadFn(id, skipInstalls: true))); + appsToInstall.map((id) => downloadFn(id, skipInstalls: true)), + ); } for (var res in downloadResults) { if (!errors.appIdNames.containsKey(res['id'])) { try { await installFn( - res['id'] as String, - res['willBeSilent'] as bool, - res['downloadedFile'] as DownloadedApk?, - res['downloadedDir'] as DownloadedXApkDir?); + res['id'] as String, + res['willBeSilent'] as bool, + res['downloadedFile'] as DownloadedApk?, + res['downloadedDir'] as DownloadedXApkDir?, + ); } catch (e) { var id = res['id'] as String; errors.add(id, e, appName: apps[id]?.name); @@ -1146,10 +1287,12 @@ class AppsProvider with ChangeNotifier { } Future> downloadAppAssets( - List appIds, BuildContext context, - {bool forceParallelDownloads = false}) async { - NotificationsProvider notificationsProvider = - context.read(); + List appIds, + BuildContext context, { + bool forceParallelDownloads = false, + }) async { + NotificationsProvider notificationsProvider = context + .read(); List, App>> filesToDownload = []; for (var id in appIds) { if (apps[id] == null) { @@ -1165,15 +1308,23 @@ class AppsProvider with ChangeNotifier { apps[id]!.app.otherAssetUrls.isNotEmpty) { // ignore: use_build_context_synchronously MapEntry? tempFileUrl = await confirmAppFileUrl( - apps[id]!.app, context, true, - evenIfSingleChoice: true); + apps[id]!.app, + context, + true, + evenIfSingleChoice: true, + ); if (tempFileUrl != null) { fileUrl = MapEntry( - tempFileUrl.key, - await (SourceProvider().getSource(apps[id]!.app.url, - overrideSource: apps[id]!.app.overrideSource)) - .apkUrlPrefetchModifier(tempFileUrl.value, apps[id]!.app.url, - apps[id]!.app.additionalSettings)); + tempFileUrl.key, + await (SourceProvider().getSource( + apps[id]!.app.url, + overrideSource: apps[id]!.app.overrideSource, + )).apkUrlPrefetchModifier( + tempFileUrl.value, + apps[id]!.app.url, + apps[id]!.app.additionalSettings, + ), + ); } } if (fileUrl != null) { @@ -1188,21 +1339,29 @@ class AppsProvider with ChangeNotifier { Future downloadFn(MapEntry fileUrl, App app) async { try { String downloadPath = '${await getStorageRootPath()}/Download'; - await downloadFile(fileUrl.value, fileUrl.key, true, - (double? progress) { - notificationsProvider - .notify(DownloadNotification(fileUrl.key, progress?.ceil() ?? 0)); - }, downloadPath, - headers: await SourceProvider() - .getSource(app.url, overrideSource: app.overrideSource) - .getRequestHeaders(app.additionalSettings, - forAPKDownload: - fileUrl.key.endsWith('.apk') ? true : false), - useExisting: false, - allowInsecure: app.additionalSettings['allowInsecure'] == true, - logs: logs); - notificationsProvider - .notify(DownloadedNotification(fileUrl.key, fileUrl.value)); + await downloadFile( + fileUrl.value, + fileUrl.key, + true, + (double? progress) { + notificationsProvider.notify( + DownloadNotification(fileUrl.key, progress?.ceil() ?? 0), + ); + }, + downloadPath, + headers: await SourceProvider() + .getSource(app.url, overrideSource: app.overrideSource) + .getRequestHeaders( + app.additionalSettings, + forAPKDownload: fileUrl.key.endsWith('.apk') ? true : false, + ), + useExisting: false, + allowInsecure: app.additionalSettings['allowInsecure'] == true, + logs: logs, + ); + notificationsProvider.notify( + DownloadedNotification(fileUrl.key, fileUrl.value), + ); } catch (e) { errors.add(fileUrl.key, e); } finally { @@ -1215,8 +1374,11 @@ class AppsProvider with ChangeNotifier { await downloadFn(urlWithApp.key, urlWithApp.value); } } else { - await Future.wait(filesToDownload - .map((urlWithApp) => downloadFn(urlWithApp.key, urlWithApp.value))); + await Future.wait( + filesToDownload.map( + (urlWithApp) => downloadFn(urlWithApp.key, urlWithApp.value), + ), + ); } if (errors.idsByErrorString.isNotEmpty) { throw errors; @@ -1225,8 +1387,9 @@ class AppsProvider with ChangeNotifier { } Future getAppsDir() async { - Directory appsDir = - Directory('${(await getExternalStorageDirectory())!.path}/app_data'); + Directory appsDir = Directory( + '${(await getExternalStorageDirectory())!.path}/app_data', + ); if (!appsDir.existsSync()) { appsDir.createSync(); } @@ -1237,20 +1400,22 @@ class AppsProvider with ChangeNotifier { if (app?.app == null) { return false; } - var source = SourceProvider() - .getSource(app!.app.url, overrideSource: app.app.overrideSource); + var source = SourceProvider().getSource( + app!.app.url, + overrideSource: app.app.overrideSource, + ); var naiveStandardVersionDetection = app.app.additionalSettings['naiveStandardVersionDetection'] == true || - source.naiveStandardVersionDetection; + source.naiveStandardVersionDetection; String? realInstalledVersion = app.app.additionalSettings['useVersionCodeAsOSVersion'] == true - ? app.installedInfo?.versionCode.toString() - : app.installedInfo?.versionName; + ? app.installedInfo?.versionCode.toString() + : app.installedInfo?.versionName; bool isHTMLWithNoVersionDetection = (source.runtimeType == HTML().runtimeType && - (app.app.additionalSettings['versionExtractionRegEx'] as String?) - ?.isNotEmpty != - true); + (app.app.additionalSettings['versionExtractionRegEx'] as String?) + ?.isNotEmpty != + true); bool isDirectAPKLink = source.runtimeType == DirectAPKLink().runtimeType; return app.app.additionalSettings['trackOnly'] != true && app.app.additionalSettings['releaseDateAsVersion'] != true && @@ -1259,7 +1424,9 @@ class AppsProvider with ChangeNotifier { realInstalledVersion != null && app.app.installedVersion != null && (reconcileVersionDifferences( - realInstalledVersion, app.app.installedVersion!) != + realInstalledVersion, + app.app.installedVersion!, + ) != null || naiveStandardVersionDetection); } @@ -1267,20 +1434,22 @@ class AppsProvider with ChangeNotifier { // Given an App and it's on-device info... // Reconcile unexpected differences between its reported installed version, real installed version, and reported latest version App? getCorrectedInstallStatusAppIfPossible( - App app, PackageInfo? installedInfo) { + App app, + PackageInfo? installedInfo, + ) { var modded = false; var trackOnly = app.additionalSettings['trackOnly'] == true; var versionDetectionIsStandard = app.additionalSettings['versionDetection'] == true; var naiveStandardVersionDetection = app.additionalSettings['naiveStandardVersionDetection'] == true || - SourceProvider() - .getSource(app.url, overrideSource: app.overrideSource) - .naiveStandardVersionDetection; + SourceProvider() + .getSource(app.url, overrideSource: app.overrideSource) + .naiveStandardVersionDetection; String? realInstalledVersion = app.additionalSettings['useVersionCodeAsOSVersion'] == true - ? installedInfo?.versionCode.toString() - : installedInfo?.versionName; + ? installedInfo?.versionCode.toString() + : installedInfo?.versionName; // FIRST, COMPARE THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE ONE IS NULL if (installedInfo == null && app.installedVersion != null && !trackOnly) { // App says it's installed but isn't really (and isn't track only) - set to not installed @@ -1298,7 +1467,9 @@ class AppsProvider with ChangeNotifier { // App's reported version and real version don't match (and it uses standard version detection) // If they share a standard format (and are still different under it), update the reported version accordingly var correctedInstalledVersion = reconcileVersionDifferences( - realInstalledVersion, app.installedVersion!); + realInstalledVersion, + app.installedVersion!, + ); if (correctedInstalledVersion?.key == false) { app.installedVersion = correctedInstalledVersion!.value; modded = true; @@ -1313,8 +1484,10 @@ class AppsProvider with ChangeNotifier { versionDetectionIsStandard) { // App's reported installed and latest versions don't match (and it uses standard version detection) // If they share a standard format, make sure the App's reported installed version uses that format - var correctedInstalledVersion = - reconcileVersionDifferences(app.installedVersion!, app.latestVersion); + var correctedInstalledVersion = reconcileVersionDifferences( + app.installedVersion!, + app.latestVersion, + ); if (correctedInstalledVersion?.key == true) { app.installedVersion = correctedInstalledVersion!.value; modded = true; @@ -1324,7 +1497,8 @@ class AppsProvider with ChangeNotifier { if (installedInfo != null && versionDetectionIsStandard && !isVersionDetectionPossible( - AppInMemory(app, null, installedInfo, null))) { + AppInMemory(app, null, installedInfo, null), + )) { app.additionalSettings['versionDetection'] = false; app.installedVersion = app.latestVersion; logs.add('Could not reconcile version formats for: ${app.id}'); @@ -1335,27 +1509,39 @@ class AppsProvider with ChangeNotifier { } MapEntry? reconcileVersionDifferences( - String templateVersion, String comparisonVersion) { + String templateVersion, + String comparisonVersion, + ) { // Returns null if the versions don't share a common standard format // Returns if they share a common format and are equal // Returns if they share a common format but are not equal // templateVersion must fully match a standard format, while comparisonVersion can have a substring match - var templateVersionFormats = - findStandardFormatsForVersion(templateVersion, true); - var comparisonVersionFormats = - findStandardFormatsForVersion(comparisonVersion, true); + var templateVersionFormats = findStandardFormatsForVersion( + templateVersion, + true, + ); + var comparisonVersionFormats = findStandardFormatsForVersion( + comparisonVersion, + true, + ); if (comparisonVersionFormats.isEmpty) { - comparisonVersionFormats = - findStandardFormatsForVersion(comparisonVersion, false); + comparisonVersionFormats = findStandardFormatsForVersion( + comparisonVersion, + false, + ); } - var commonStandardFormats = - templateVersionFormats.intersection(comparisonVersionFormats); + var commonStandardFormats = templateVersionFormats.intersection( + comparisonVersionFormats, + ); if (commonStandardFormats.isEmpty) { return null; } for (String pattern in commonStandardFormats) { if (doStringsMatchUnderRegEx( - pattern, comparisonVersion, templateVersion)) { + pattern, + comparisonVersion, + templateVersion, + )) { return MapEntry(true, comparisonVersion); } } @@ -1368,7 +1554,7 @@ class AppsProvider with ChangeNotifier { var m2 = r.firstMatch(value2); return m1 != null && m2 != null ? value1.substring(m1.start, m1.end) == - value2.substring(m2.start, m2.end) + value2.substring(m2.start, m2.end) : false; } @@ -1382,70 +1568,90 @@ class AppsProvider with ChangeNotifier { List> errors = []; var installedAppsData = await getAllInstalledInfo(); List removedAppIds = []; - await Future.wait((await getAppsDir()) // Parse Apps from JSON - .listSync() - .map((item) async { - App? app; - if (item.path.toLowerCase().endsWith('.json') && - (singleId == null || - item.path.split('/').last.toLowerCase() == - '${singleId.toLowerCase()}.json')) { - try { - app = App.fromJson(jsonDecode(File(item.path).readAsStringSync())); - } catch (err) { - if (err is FormatException) { - logs.add('Corrupt JSON when loading App (will be ignored): $e'); - item.renameSync('${item.path}.corrupt'); - } else { - rethrow; - } - } - } - if (app != null) { - // Save the app to the in-memory list without grabbing any OS info first - apps.update( - app.id, - (value) => AppInMemory( - app!, value.downloadProgress, value.installedInfo, value.icon), - ifAbsent: () => AppInMemory(app!, null, null, null)); - notifyListeners(); - try { - // Try getting the app's source to ensure no invalid apps get loaded - sp.getSource(app.url, overrideSource: app.overrideSource); - // If the app is installed, grab its OS data and reconcile install statuses - PackageInfo? installedInfo; - try { - installedInfo = - installedAppsData.firstWhere((i) => i.packageName == app!.id); - } catch (e) { - // If the app isn't installed the above throws an error - } - // Reconcile differences between the installed and recorded install info - var moddedApp = - getCorrectedInstallStatusAppIfPossible(app, installedInfo); - if (moddedApp != null) { - app = moddedApp; - // Note the app ID if it was uninstalled externally - if (moddedApp.installedVersion == null) { - removedAppIds.add(moddedApp.id); + await Future.wait( + (await getAppsDir()) // Parse Apps from JSON + .listSync() + .map((item) async { + App? app; + if (item.path.toLowerCase().endsWith('.json') && + (singleId == null || + item.path.split('/').last.toLowerCase() == + '${singleId.toLowerCase()}.json')) { + try { + app = App.fromJson( + jsonDecode(File(item.path).readAsStringSync()), + ); + } catch (err) { + if (err is FormatException) { + logs.add( + 'Corrupt JSON when loading App (will be ignored): $e', + ); + item.renameSync('${item.path}.corrupt'); + } else { + rethrow; + } + } } - } - // Update the app in memory with install info and corrections - apps.update( - app.id, - (value) => AppInMemory( - app!, value.downloadProgress, installedInfo, value.icon), - ifAbsent: () => AppInMemory(app!, null, installedInfo, null)); - notifyListeners(); - } catch (e) { - errors.add([app!.id, app.finalName, e.toString()]); - } - } - })); + if (app != null) { + // Save the app to the in-memory list without grabbing any OS info first + apps.update( + app.id, + (value) => AppInMemory( + app!, + value.downloadProgress, + value.installedInfo, + value.icon, + ), + ifAbsent: () => AppInMemory(app!, null, null, null), + ); + notifyListeners(); + try { + // Try getting the app's source to ensure no invalid apps get loaded + sp.getSource(app.url, overrideSource: app.overrideSource); + // If the app is installed, grab its OS data and reconcile install statuses + PackageInfo? installedInfo; + try { + installedInfo = installedAppsData.firstWhere( + (i) => i.packageName == app!.id, + ); + } catch (e) { + // If the app isn't installed the above throws an error + } + // Reconcile differences between the installed and recorded install info + var moddedApp = getCorrectedInstallStatusAppIfPossible( + app, + installedInfo, + ); + if (moddedApp != null) { + app = moddedApp; + // Note the app ID if it was uninstalled externally + if (moddedApp.installedVersion == null) { + removedAppIds.add(moddedApp.id); + } + } + // Update the app in memory with install info and corrections + apps.update( + app.id, + (value) => AppInMemory( + app!, + value.downloadProgress, + installedInfo, + value.icon, + ), + ifAbsent: () => AppInMemory(app!, null, installedInfo, null), + ); + notifyListeners(); + } catch (e) { + errors.add([app!.id, app.finalName, e.toString()]); + } + } + }), + ); if (errors.isNotEmpty) { removeApps(errors.map((e) => e[0]).toList()); NotificationsProvider().notify( - AppsRemovedNotification(errors.map((e) => [e[1], e[2]]).toList())); + AppsRemovedNotification(errors.map((e) => [e[1], e[2]]).toList()), + ); } // Delete externally uninstalled Apps if needed if (removedAppIds.isNotEmpty) { @@ -1471,66 +1677,86 @@ class AppsProvider with ChangeNotifier { } if (icon != null) { apps.update( - apps[appId]!.app.id, - (value) => AppInMemory(apps[appId]!.app, value.downloadProgress, - value.installedInfo, icon), - ifAbsent: () => AppInMemory( - apps[appId]!.app, null, apps[appId]?.installedInfo, icon)); + apps[appId]!.app.id, + (value) => AppInMemory( + apps[appId]!.app, + value.downloadProgress, + value.installedInfo, + icon, + ), + ifAbsent: () => AppInMemory( + apps[appId]!.app, + null, + apps[appId]?.installedInfo, + icon, + ), + ); notifyListeners(); } } } - Future saveApps(List apps, - {bool attemptToCorrectInstallStatus = true, - bool onlyIfExists = true}) async { + Future saveApps( + List apps, { + bool attemptToCorrectInstallStatus = true, + bool onlyIfExists = true, + }) async { attemptToCorrectInstallStatus = attemptToCorrectInstallStatus; - await Future.wait(apps.map((a) async { - var app = a.deepCopy(); - PackageInfo? info = await getInstalledInfo(app.id); - var icon = await info?.applicationInfo?.getAppIcon(); - app.name = await (info?.applicationInfo?.getAppLabel()) ?? app.name; - if (attemptToCorrectInstallStatus) { - app = getCorrectedInstallStatusAppIfPossible(app, info) ?? app; - } - if (!onlyIfExists || this.apps.containsKey(app.id)) { - String filePath = '${(await getAppsDir()).path}/${app.id}.json'; - File('$filePath.tmp') - .writeAsStringSync(jsonEncode(app.toJson())); // #2089 - File('$filePath.tmp').renameSync(filePath); - } - try { - this.apps.update(app.id, - (value) => AppInMemory(app, value.downloadProgress, info, icon), - ifAbsent: - onlyIfExists ? null : () => AppInMemory(app, null, info, icon)); - } catch (e) { - if (e is! ArgumentError || e.name != 'key') { - rethrow; + await Future.wait( + apps.map((a) async { + var app = a.deepCopy(); + PackageInfo? info = await getInstalledInfo(app.id); + var icon = await info?.applicationInfo?.getAppIcon(); + app.name = await (info?.applicationInfo?.getAppLabel()) ?? app.name; + if (attemptToCorrectInstallStatus) { + app = getCorrectedInstallStatusAppIfPossible(app, info) ?? app; } - } - })); + if (!onlyIfExists || this.apps.containsKey(app.id)) { + String filePath = '${(await getAppsDir()).path}/${app.id}.json'; + File( + '$filePath.tmp', + ).writeAsStringSync(jsonEncode(app.toJson())); // #2089 + File('$filePath.tmp').renameSync(filePath); + } + try { + this.apps.update( + app.id, + (value) => AppInMemory(app, value.downloadProgress, info, icon), + ifAbsent: onlyIfExists + ? null + : () => AppInMemory(app, null, info, icon), + ); + } catch (e) { + if (e is! ArgumentError || e.name != 'key') { + rethrow; + } + } + }), + ); notifyListeners(); export(isAuto: true); } Future removeApps(List appIds) async { var apkFiles = APKDir.listSync(); - await Future.wait(appIds.map((appId) async { - File file = File('${(await getAppsDir()).path}/$appId.json'); - if (file.existsSync()) { - deleteFile(file); - } - apkFiles - .where( - (element) => element.path.split('/').last.startsWith('$appId-')) - .forEach((element) { - element.delete(recursive: true); - }); - if (apps.containsKey(appId)) { - apps.remove(appId); - } - })); + await Future.wait( + appIds.map((appId) async { + File file = File('${(await getAppsDir()).path}/$appId.json'); + if (file.existsSync()) { + deleteFile(file); + } + apkFiles + .where( + (element) => element.path.split('/').last.startsWith('$appId-'), + ) + .forEach((element) { + element.delete(recursive: true); + }); + if (apps.containsKey(appId)) { + apps.remove(appId); + } + }), + ); if (appIds.isNotEmpty) { notifyListeners(); export(isAuto: true); @@ -1539,31 +1765,39 @@ class AppsProvider with ChangeNotifier { Future removeAppsWithModal(BuildContext context, List apps) async { var showUninstallOption = apps - .where((a) => - a.installedVersion != null && - a.additionalSettings['trackOnly'] != true) + .where( + (a) => + a.installedVersion != null && + a.additionalSettings['trackOnly'] != true, + ) .isNotEmpty; var values = await showDialog( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - primaryActionColour: Theme.of(context).colorScheme.error, - title: plural('removeAppQuestion', apps.length), - items: !showUninstallOption - ? [] - : [ - [ - GeneratedFormSwitch('rmAppEntry', - label: tr('removeFromObtainium'), defaultValue: true) - ], - [ - GeneratedFormSwitch('uninstallApp', - label: tr('uninstallFromDevice')) - ] + context: context, + builder: (BuildContext ctx) { + return GeneratedFormModal( + primaryActionColour: Theme.of(context).colorScheme.error, + title: plural('removeAppQuestion', apps.length), + items: !showUninstallOption + ? [] + : [ + [ + GeneratedFormSwitch( + 'rmAppEntry', + label: tr('removeFromObtainium'), + defaultValue: true, + ), ], - initValid: true, - ); - }); + [ + GeneratedFormSwitch( + 'uninstallApp', + label: tr('uninstallFromDevice'), + ), + ], + ], + initValid: true, + ); + }, + ); if (values != null) { bool uninstall = values['uninstallApp'] == true && showUninstallOption; bool remove = values['rmAppEntry'] == true || !showUninstallOption; @@ -1608,11 +1842,14 @@ class AppsProvider with ChangeNotifier { App? currentApp = apps[appId]!.app; SourceProvider sourceProvider = SourceProvider(); App newApp = await sourceProvider.getApp( - sourceProvider.getSource(currentApp.url, - overrideSource: currentApp.overrideSource), + sourceProvider.getSource( currentApp.url, - currentApp.additionalSettings, - currentApp: currentApp); + overrideSource: currentApp.overrideSource, + ), + currentApp.url, + currentApp.additionalSettings, + currentApp: currentApp, + ); if (currentApp.preferredApkIndex < newApp.apkUrls.length) { newApp.preferredApkIndex = currentApp.preferredApkIndex; } @@ -1620,14 +1857,17 @@ class AppsProvider with ChangeNotifier { return newApp.latestVersion != currentApp.latestVersion ? newApp : null; } - List getAppsSortedByUpdateCheckTime( - {DateTime? ignoreAppsCheckedAfter, - bool onlyCheckInstalledOrTrackOnlyApps = false}) { + List getAppsSortedByUpdateCheckTime({ + DateTime? ignoreAppsCheckedAfter, + bool onlyCheckInstalledOrTrackOnlyApps = false, + }) { List appIds = apps.values - .where((app) => - app.app.lastUpdateCheck == null || - ignoreAppsCheckedAfter == null || - app.app.lastUpdateCheck!.isBefore(ignoreAppsCheckedAfter)) + .where( + (app) => + app.app.lastUpdateCheck == null || + ignoreAppsCheckedAfter == null || + app.app.lastUpdateCheck!.isBefore(ignoreAppsCheckedAfter), + ) .where((app) { if (!onlyCheckInstalledOrTrackOnlyApps) { return true; @@ -1638,18 +1878,24 @@ class AppsProvider with ChangeNotifier { }) .map((e) => e.app.id) .toList(); - appIds.sort((a, b) => - (apps[a]!.app.lastUpdateCheck ?? DateTime.fromMicrosecondsSinceEpoch(0)) - .compareTo(apps[b]!.app.lastUpdateCheck ?? - DateTime.fromMicrosecondsSinceEpoch(0))); + appIds.sort( + (a, b) => + (apps[a]!.app.lastUpdateCheck ?? + DateTime.fromMicrosecondsSinceEpoch(0)) + .compareTo( + apps[b]!.app.lastUpdateCheck ?? + DateTime.fromMicrosecondsSinceEpoch(0), + ), + ); return appIds; } - Future> checkUpdates( - {DateTime? ignoreAppsCheckedAfter, - bool throwErrorsForRetry = false, - List? specificIds, - SettingsProvider? sp}) async { + Future> checkUpdates({ + DateTime? ignoreAppsCheckedAfter, + bool throwErrorsForRetry = false, + List? specificIds, + SettingsProvider? sp, + }) async { SettingsProvider settingsProvider = sp ?? this.settingsProvider; List updates = []; MultiAppMultiError errors = MultiAppMultiError(); @@ -1657,27 +1903,31 @@ class AppsProvider with ChangeNotifier { gettingUpdates = true; try { List appIds = getAppsSortedByUpdateCheckTime( - ignoreAppsCheckedAfter: ignoreAppsCheckedAfter, - onlyCheckInstalledOrTrackOnlyApps: - settingsProvider.onlyCheckInstalledOrTrackOnlyApps); + ignoreAppsCheckedAfter: ignoreAppsCheckedAfter, + onlyCheckInstalledOrTrackOnlyApps: + settingsProvider.onlyCheckInstalledOrTrackOnlyApps, + ); if (specificIds != null) { appIds = appIds.where((aId) => specificIds.contains(aId)).toList(); } - await Future.wait(appIds.map((appId) async { - App? newApp; - try { - newApp = await checkUpdate(appId); - } catch (e) { - if ((e is RateLimitError || e is SocketException) && - throwErrorsForRetry) { - rethrow; + await Future.wait( + appIds.map((appId) async { + App? newApp; + try { + newApp = await checkUpdate(appId); + } catch (e) { + if ((e is RateLimitError || e is SocketException) && + throwErrorsForRetry) { + rethrow; + } + errors.add(appId, e, appName: apps[appId]?.name); } - errors.add(appId, e, appName: apps[appId]?.name); - } - if (newApp != null) { - updates.add(newApp); - } - }), eagerError: true); + if (newApp != null) { + updates.add(newApp); + } + }), + eagerError: true, + ); } finally { gettingUpdates = false; } @@ -1691,8 +1941,10 @@ class AppsProvider with ChangeNotifier { return updates; } - List findExistingUpdates( - {bool installedOnly = false, bool nonInstalledOnly = false}) { + List findExistingUpdates({ + bool installedOnly = false, + bool nonInstalledOnly = false, + }) { List updateAppIds = []; List appIds = apps.keys.toList(); for (int i = 0; i < appIds.length; i++) { @@ -1710,8 +1962,10 @@ class AppsProvider with ChangeNotifier { return updateAppIds; } - Map generateExportJSON( - {List? appIds, bool? overrideExportSettings}) { + Map generateExportJSON({ + List? appIds, + bool? overrideExportSettings, + }) { Map finalExport = {}; finalExport['apps'] = apps.values .where((e) { @@ -1729,17 +1983,21 @@ class AppsProvider with ChangeNotifier { } if (shouldExportSettings) { finalExport['settings'] = Map.fromEntries( - (settingsProvider.prefs - ?.getKeys() - .map((key) => MapEntry(key, settingsProvider.prefs?.get(key))) - .toList()) ?? - []); + (settingsProvider.prefs + ?.getKeys() + .map((key) => MapEntry(key, settingsProvider.prefs?.get(key))) + .toList()) ?? + [], + ); } return finalExport; } - Future export( - {bool pickOnly = false, isAuto = false, SettingsProvider? sp}) async { + Future export({ + bool pickOnly = false, + isAuto = false, + SettingsProvider? sp, + }) async { SettingsProvider settingsProvider = sp ?? this.settingsProvider; var exportDir = await settingsProvider.getExportDir(); if (isAuto) { @@ -1770,16 +2028,19 @@ class AppsProvider with ChangeNotifier { if (!pickOnly) { var encoder = const JsonEncoder.withIndent(" "); Map finalExport = generateExportJSON(); - var result = await saf.createFile(exportDir, - displayName: - '${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}${isAuto ? '-auto' : ''}.json', - mimeType: 'application/json', - bytes: Uint8List.fromList(utf8.encode(encoder.convert(finalExport)))); + var result = await saf.createFile( + exportDir, + displayName: + '${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}${isAuto ? '-auto' : ''}.json', + mimeType: 'application/json', + bytes: Uint8List.fromList(utf8.encode(encoder.convert(finalExport))), + ); if (result == null) { throw ObtainiumError(tr('unexpectedError')); } - returnPath = - exportDir.pathSegments.join('/').replaceFirst('tree/primary:', '/'); + returnPath = exportDir.pathSegments + .join('/') + .replaceFirst('tree/primary:', '/'); } return returnPath; } @@ -1798,8 +2059,8 @@ class AppsProvider with ChangeNotifier { var installedInfo = await getInstalledInfo(a.id, printErr: false); a.installedVersion = a.additionalSettings['useVersionCodeAsOSVersion'] == true - ? installedInfo?.versionCode.toString() - : installedInfo?.versionName; + ? installedInfo?.versionCode.toString() + : installedInfo?.versionName; } await saveApps(importedApps, onlyIfExists: false); notifyListeners(); @@ -1813,15 +2074,19 @@ class AppsProvider with ChangeNotifier { } else if (value is bool) { settingsProvider.prefs?.setBool(key, value); } else if (value is List) { - settingsProvider.prefs - ?.setStringList(key, value.map((e) => e as String).toList()); + settingsProvider.prefs?.setStringList( + key, + value.map((e) => e as String).toList(), + ); } else { settingsProvider.prefs?.setString(key, value as String); } }); } return MapEntry, bool>( - importedApps, newFormat && decodedJSON['settings'] != null); + importedApps, + newFormat && decodedJSON['settings'] != null, + ); } @override @@ -1830,11 +2095,15 @@ class AppsProvider with ChangeNotifier { super.dispose(); } - Future>> addAppsByURL(List urls, - {AppSource? sourceOverride}) async { - List results = await SourceProvider().getAppsByURLNaive(urls, - alreadyAddedUrls: apps.values.map((e) => e.app.url).toList(), - sourceOverride: sourceOverride); + Future>> addAppsByURL( + List urls, { + AppSource? sourceOverride, + }) async { + List results = await SourceProvider().getAppsByURLNaive( + urls, + alreadyAddedUrls: apps.values.map((e) => e.app.url).toList(), + sourceOverride: sourceOverride, + ); List pps = results[0]; Map errorsMap = results[1]; for (var app in pps) { @@ -1844,19 +2113,21 @@ class AppsProvider with ChangeNotifier { await saveApps([app], onlyIfExists: false); } } - List> errors = - errorsMap.keys.map((e) => [e, errorsMap[e].toString()]).toList(); + List> errors = errorsMap.keys + .map((e) => [e, errorsMap[e].toString()]) + .toList(); return errors; } } class AppFilePicker extends StatefulWidget { - const AppFilePicker( - {super.key, - required this.app, - this.initVal, - this.archs, - this.pickAnyAsset = false}); + const AppFilePicker({ + super.key, + required this.app, + this.initVal, + this.archs, + this.pickAnyAsset = false, + }); final App app; final MapEntry? initVal; @@ -1879,16 +2150,21 @@ class _AppFilePickerState extends State { } return AlertDialog( scrollable: true, - title: Text(widget.pickAnyAsset - ? tr('selectX', args: [tr('releaseAsset').toLowerCase()]) - : tr('pickAnAPK')), - content: Column(children: [ - urlsToSelectFrom.length > 1 - ? Text(tr('appHasMoreThanOnePackage', args: [widget.app.finalName])) - : const SizedBox.shrink(), - const SizedBox(height: 16), - ...urlsToSelectFrom.map( - (u) => RadioListTile( + title: Text( + widget.pickAnyAsset + ? tr('selectX', args: [tr('releaseAsset').toLowerCase()]) + : tr('pickAnAPK'), + ), + content: Column( + children: [ + urlsToSelectFrom.length > 1 + ? Text( + tr('appHasMoreThanOnePackage', args: [widget.app.finalName]), + ) + : const SizedBox.shrink(), + const SizedBox(height: 16), + ...urlsToSelectFrom.map( + (u) => RadioListTile( title: Text(u.key), value: u.value, groupValue: fileUrl!.value, @@ -1896,42 +2172,47 @@ class _AppFilePickerState extends State { setState(() { fileUrl = urlsToSelectFrom.where((e) => e.value == val).first; }); - }), - ), - if (widget.archs != null) - const SizedBox( - height: 16, + }, + ), ), - if (widget.archs != null) - Text( - widget.archs!.length == 1 - ? tr('deviceSupportsXArch', args: [widget.archs![0]]) - : tr('deviceSupportsFollowingArchs') + - list2FriendlyString( - widget.archs!.map((e) => '\'$e\'').toList()), - style: const TextStyle(fontStyle: FontStyle.italic, fontSize: 12), - ), - ]), + if (widget.archs != null) const SizedBox(height: 16), + if (widget.archs != null) + Text( + widget.archs!.length == 1 + ? tr('deviceSupportsXArch', args: [widget.archs![0]]) + : tr('deviceSupportsFollowingArchs') + + list2FriendlyString( + widget.archs!.map((e) => '\'$e\'').toList(), + ), + style: const TextStyle(fontStyle: FontStyle.italic, fontSize: 12), + ), + ], + ), actions: [ TextButton( - onPressed: () { - Navigator.of(context).pop(null); - }, - child: Text(tr('cancel'))), + onPressed: () { + Navigator.of(context).pop(null); + }, + child: Text(tr('cancel')), + ), TextButton( - onPressed: () { - HapticFeedback.selectionClick(); - Navigator.of(context).pop(fileUrl); - }, - child: Text(tr('continue'))) + onPressed: () { + HapticFeedback.selectionClick(); + Navigator.of(context).pop(fileUrl); + }, + child: Text(tr('continue')), + ), ], ); } } class APKOriginWarningDialog extends StatefulWidget { - const APKOriginWarningDialog( - {super.key, required this.sourceUrl, required this.apkUrl}); + const APKOriginWarningDialog({ + super.key, + required this.sourceUrl, + required this.apkUrl, + }); final String sourceUrl; final String apkUrl; @@ -1946,22 +2227,29 @@ class _APKOriginWarningDialogState extends State { return AlertDialog( scrollable: true, title: Text(tr('warning')), - content: Text(tr('sourceIsXButPackageFromYPrompt', args: [ - Uri.parse(widget.sourceUrl).host, - Uri.parse(widget.apkUrl).host - ])), + content: Text( + tr( + 'sourceIsXButPackageFromYPrompt', + args: [ + Uri.parse(widget.sourceUrl).host, + Uri.parse(widget.apkUrl).host, + ], + ), + ), actions: [ TextButton( - onPressed: () { - Navigator.of(context).pop(null); - }, - child: Text(tr('cancel'))), + onPressed: () { + Navigator.of(context).pop(null); + }, + child: Text(tr('cancel')), + ), TextButton( - onPressed: () { - HapticFeedback.selectionClick(); - Navigator.of(context).pop(true); - }, - child: Text(tr('continue'))) + onPressed: () { + HapticFeedback.selectionClick(); + Navigator.of(context).pop(true); + }, + child: Text(tr('continue')), + ), ], ); } @@ -2007,41 +2295,54 @@ Future bgUpdateCheck(String taskId, Map? params) async { params ??= {}; - bool firstEverUpdateTask = DateTime.fromMillisecondsSinceEpoch(0) - .compareTo(appsProvider.settingsProvider.lastCompletedBGCheckTime) == + bool firstEverUpdateTask = + DateTime.fromMillisecondsSinceEpoch( + 0, + ).compareTo(appsProvider.settingsProvider.lastCompletedBGCheckTime) == 0; List> toCheck = >[ ...(params['toCheck'] - ?.map((entry) => MapEntry( - entry['key'] as String, entry['value'] as int)) + ?.map( + (entry) => MapEntry( + entry['key'] as String, + entry['value'] as int, + ), + ) .toList() ?? appsProvider .getAppsSortedByUpdateCheckTime( - ignoreAppsCheckedAfter: params['toCheck'] == null - ? firstEverUpdateTask + ignoreAppsCheckedAfter: params['toCheck'] == null + ? firstEverUpdateTask ? null : appsProvider.settingsProvider.lastCompletedBGCheckTime - : null, - onlyCheckInstalledOrTrackOnlyApps: appsProvider - .settingsProvider.onlyCheckInstalledOrTrackOnlyApps) - .map((e) => MapEntry(e, 0))) + : null, + onlyCheckInstalledOrTrackOnlyApps: appsProvider + .settingsProvider + .onlyCheckInstalledOrTrackOnlyApps, + ) + .map((e) => MapEntry(e, 0))), ]; List> toInstall = >[ ...(params['toInstall'] - ?.map((entry) => MapEntry( - entry['key'] as String, entry['value'] as int)) + ?.map( + (entry) => MapEntry( + entry['key'] as String, + entry['value'] as int, + ), + ) .toList() ?? - (>>[])) + (>>[])), ]; - var networkRestricted = appsProvider.settingsProvider.bgUpdatesOnWiFiOnly && + var networkRestricted = + appsProvider.settingsProvider.bgUpdatesOnWiFiOnly && !netResult.contains(ConnectivityResult.wifi) && !netResult.contains(ConnectivityResult.ethernet); var chargingRestricted = appsProvider.settingsProvider.bgUpdatesWhileChargingOnly && - (await Battery().batteryState) != BatteryState.charging; + (await Battery().batteryState) != BatteryState.charging; if (networkRestricted) { logs.add('BG update task: Network restriction in effect.'); @@ -2060,15 +2361,18 @@ Future bgUpdateCheck(String taskId, Map? params) async { // After grouping the updates, we take care of toNotify and toThrow first // Then we run the function again in install mode (toCheck is empty) - var enoughTimePassed = appsProvider.settingsProvider.updateInterval != 0 && + var enoughTimePassed = + appsProvider.settingsProvider.updateInterval != 0 && appsProvider.settingsProvider.lastCompletedBGCheckTime .add( - Duration(minutes: appsProvider.settingsProvider.updateInterval)) + Duration(minutes: appsProvider.settingsProvider.updateInterval), + ) .isBefore(DateTime.now()); if (!enoughTimePassed) { // ignore: avoid_print print( - 'BG update task: Too early for another check (last check was ${appsProvider.settingsProvider.lastCompletedBGCheckTime.toIso8601String()}, interval is ${appsProvider.settingsProvider.updateInterval}).'); + 'BG update task: Too early for another check (last check was ${appsProvider.settingsProvider.lastCompletedBGCheckTime.toIso8601String()}, interval is ${appsProvider.settingsProvider.updateInterval}).', + ); return; } @@ -2082,25 +2386,28 @@ Future bgUpdateCheck(String taskId, Map? params) async { []; // All apps that got errors while checking var retryAfterXSeconds = 0; MultiAppMultiError? - errors; // All errors including those that will lead to a retry + errors; // All errors including those that will lead to a retry MultiAppMultiError toThrow = MultiAppMultiError(); // All errors that will not lead to a retry, just a notification CheckingUpdatesNotification notif = CheckingUpdatesNotification( - plural('apps', toCheck.length)); // The notif. to show while checking + plural('apps', toCheck.length), + ); // The notif. to show while checking try { // Check for updates notificationsProvider.notify(notif, cancelExisting: true); updates = await appsProvider.checkUpdates( - specificIds: toCheck.map((e) => e.key).toList(), - sp: appsProvider.settingsProvider); + specificIds: toCheck.map((e) => e.key).toList(), + sp: appsProvider.settingsProvider, + ); } catch (e) { if (e is Map) { updates = e['updates']; errors = e['errors']; errors!.rawErrors.forEach((key, err) { logs.add( - 'BG update task: Got error on checking for $key \'${err.toString()}\'.'); + 'BG update task: Got error on checking for $key \'${err.toString()}\'.', + ); var toCheckApp = toCheck.where((element) => element.key == key).first; if (toCheckApp.value < maxAttempts) { @@ -2109,8 +2416,8 @@ Future bgUpdateCheck(String taskId, Map? params) async { int minRetryIntervalForThisApp = err is RateLimitError ? (err.remainingMinutes * 60) : e is ClientException - ? (15 * 60) - : (toCheckApp.value + 1); + ? (15 * 60) + : (toCheckApp.value + 1); if (minRetryIntervalForThisApp > maxRetryWaitSeconds) { minRetryIntervalForThisApp = maxRetryWaitSeconds; } @@ -2151,16 +2458,20 @@ Future bgUpdateCheck(String taskId, Map? params) async { // Send the error notifications (grouped by error string) if (toThrow.rawErrors.isNotEmpty) { for (var element in toThrow.idsByErrorString.entries) { - notificationsProvider.notify(ErrorCheckingUpdatesNotification( + notificationsProvider.notify( + ErrorCheckingUpdatesNotification( errors!.errorsAppsString(element.key, element.value), - id: Random().nextInt(10000))); + id: Random().nextInt(10000), + ), + ); } } // if there are update checks to retry, schedule a retry task logs.add('BG update task: Done checking for updates.'); if (toRetry.isNotEmpty) { logs.add( - 'BG update task $taskId: Will retry in $retryAfterXSeconds seconds.'); + 'BG update task $taskId: Will retry in $retryAfterXSeconds seconds.', + ); return await bgUpdateCheck(taskId, { 'toCheck': toRetry .map((entry) => {'key': entry.key, 'value': entry.value}) @@ -2176,7 +2487,7 @@ Future bgUpdateCheck(String taskId, Map? params) async { 'toCheck': [], 'toInstall': toInstall .map((entry) => {'key': entry.key, 'value': entry.value}) - .toList() + .toList(), }); } } else { @@ -2185,8 +2496,9 @@ Future bgUpdateCheck(String taskId, Map? params) async { if (toInstall.isEmpty && !networkRestricted && !chargingRestricted) { var temp = appsProvider.findExistingUpdates(installedOnly: true); for (var i = 0; i < temp.length; i++) { - if (await appsProvider - .canInstallSilently(appsProvider.apps[temp[i]]!.app)) { + if (await appsProvider.canInstallSilently( + appsProvider.apps[temp[i]]!.app, + )) { toInstall.add(MapEntry(temp[i], 0)); } } @@ -2202,14 +2514,17 @@ Future bgUpdateCheck(String taskId, Map? params) async { // Loop through all updates and install each try { await appsProvider.downloadAndInstallLatestApps( - toInstall.map((e) => e.key).toList(), null, - notificationsProvider: notificationsProvider, - forceParallelDownloads: true); + toInstall.map((e) => e.key).toList(), + null, + notificationsProvider: notificationsProvider, + forceParallelDownloads: true, + ); } catch (e) { if (e is MultiAppMultiError) { e.idsByErrorString.forEach((key, value) { - notificationsProvider.notify(ErrorCheckingUpdatesNotification( - e.errorsAppsString(key, value))); + notificationsProvider.notify( + ErrorCheckingUpdatesNotification(e.errorsAppsString(key, value)), + ); }); } else { // We don't expect to ever get here in any situation so no need to catch (but log it in case) diff --git a/lib/providers/logs_provider.dart b/lib/providers/logs_provider.dart index 8dab366..a719bd4 100644 --- a/lib/providers/logs_provider.dart +++ b/lib/providers/logs_provider.dart @@ -22,7 +22,7 @@ class Log { idColumn: id, levelColumn: level.index, messageColumn: message, - timestampColumn: timestamp.millisecondsSinceEpoch + timestampColumn: timestamp.millisecondsSinceEpoch, }; return map; } @@ -33,8 +33,9 @@ class Log { id = map[idColumn] as int; level = LogLevels.values.elementAt(map[levelColumn] as int); message = map[messageColumn] as String; - timestamp = - DateTime.fromMillisecondsSinceEpoch(map[timestampColumn] as int); + timestamp = DateTime.fromMillisecondsSinceEpoch( + map[timestampColumn] as int, + ); } @override @@ -51,16 +52,19 @@ class LogsProvider { Database? db; Future getDB() async { - db ??= await openDatabase(dbPath, version: 1, - onCreate: (Database db, int version) async { - await db.execute(''' + db ??= await openDatabase( + dbPath, + version: 1, + onCreate: (Database db, int version) async { + await db.execute(''' create table if not exists $logTable ( $idColumn integer primary key autoincrement, $levelColumn integer not null, $messageColumn text not null, $timestampColumn integer not null) '''); - }); + }, + ); return db!; } @@ -75,27 +79,38 @@ create table if not exists $logTable ( Future> get({DateTime? before, DateTime? after}) async { var where = getWhereDates(before: before, after: after); - return (await (await getDB()) - .query(logTable, where: where.key, whereArgs: where.value)) - .map((e) => Log.fromMap(e)) - .toList(); + return (await (await getDB()).query( + logTable, + where: where.key, + whereArgs: where.value, + )).map((e) => Log.fromMap(e)).toList(); } Future clear({DateTime? before, DateTime? after}) async { var where = getWhereDates(before: before, after: after); - var res = await (await getDB()) - .delete(logTable, where: where.key, whereArgs: where.value); + var res = await (await getDB()).delete( + logTable, + where: where.key, + whereArgs: where.value, + ); if (res > 0) { - add(plural('clearedNLogsBeforeXAfterY', res, + add( + plural( + 'clearedNLogsBeforeXAfterY', + res, namedArgs: {'before': before.toString(), 'after': after.toString()}, - name: 'n')); + name: 'n', + ), + ); } return res; } } -MapEntry?> getWhereDates( - {DateTime? before, DateTime? after}) { +MapEntry?> getWhereDates({ + DateTime? before, + DateTime? after, +}) { List where = []; List whereArgs = []; if (before != null) { diff --git a/lib/providers/notifications_provider.dart b/lib/providers/notifications_provider.dart index bc329cf..0f126ce 100644 --- a/lib/providers/notifications_provider.dart +++ b/lib/providers/notifications_provider.dart @@ -20,91 +20,116 @@ class ObtainiumNotification { bool onlyAlertOnce; String? payload; - ObtainiumNotification(this.id, this.title, this.message, this.channelCode, - this.channelName, this.channelDescription, this.importance, - {this.onlyAlertOnce = false, this.progPercent, this.payload}); + ObtainiumNotification( + this.id, + this.title, + this.message, + this.channelCode, + this.channelName, + this.channelDescription, + this.importance, { + this.onlyAlertOnce = false, + this.progPercent, + this.payload, + }); } class UpdateNotification extends ObtainiumNotification { UpdateNotification(List updates, {int? id}) - : super( - id ?? 2, - tr('updatesAvailable'), - '', - 'UPDATES_AVAILABLE', - tr('updatesAvailableNotifChannel'), - tr('updatesAvailableNotifDescription'), - Importance.max) { + : super( + id ?? 2, + tr('updatesAvailable'), + '', + 'UPDATES_AVAILABLE', + tr('updatesAvailableNotifChannel'), + tr('updatesAvailableNotifDescription'), + Importance.max, + ) { message = updates.isEmpty ? tr('noNewUpdates') : updates.length == 1 - ? tr('xHasAnUpdate', args: [updates[0].finalName]) - : plural('xAndNMoreUpdatesAvailable', updates.length - 1, - args: [updates[0].finalName, (updates.length - 1).toString()]); + ? tr('xHasAnUpdate', args: [updates[0].finalName]) + : plural( + 'xAndNMoreUpdatesAvailable', + updates.length - 1, + args: [updates[0].finalName, (updates.length - 1).toString()], + ); } } class SilentUpdateNotification extends ObtainiumNotification { SilentUpdateNotification(List updates, bool succeeded, {int? id}) - : super( - id ?? 3, - succeeded ? tr('appsUpdated') : tr('appsNotUpdated'), - '', - 'APPS_UPDATED', - tr('appsUpdatedNotifChannel'), - tr('appsUpdatedNotifDescription'), - Importance.defaultImportance) { + : super( + id ?? 3, + succeeded ? tr('appsUpdated') : tr('appsNotUpdated'), + '', + 'APPS_UPDATED', + tr('appsUpdatedNotifChannel'), + tr('appsUpdatedNotifDescription'), + Importance.defaultImportance, + ) { message = updates.length == 1 - ? tr(succeeded ? 'xWasUpdatedToY' : 'xWasNotUpdatedToY', - args: [updates[0].finalName, updates[0].latestVersion]) + ? tr( + succeeded ? 'xWasUpdatedToY' : 'xWasNotUpdatedToY', + args: [updates[0].finalName, updates[0].latestVersion], + ) : plural( succeeded ? 'xAndNMoreUpdatesInstalled' : "xAndNMoreUpdatesFailed", updates.length - 1, - args: [updates[0].finalName, (updates.length - 1).toString()]); + args: [updates[0].finalName, (updates.length - 1).toString()], + ); } } class SilentUpdateAttemptNotification extends ObtainiumNotification { SilentUpdateAttemptNotification(List updates, {int? id}) - : super( - id ?? 3, - tr('appsPossiblyUpdated'), - '', - 'APPS_POSSIBLY_UPDATED', - tr('appsPossiblyUpdatedNotifChannel'), - tr('appsPossiblyUpdatedNotifDescription'), - Importance.defaultImportance) { + : super( + id ?? 3, + tr('appsPossiblyUpdated'), + '', + 'APPS_POSSIBLY_UPDATED', + tr('appsPossiblyUpdatedNotifChannel'), + tr('appsPossiblyUpdatedNotifDescription'), + Importance.defaultImportance, + ) { message = updates.length == 1 - ? tr('xWasPossiblyUpdatedToY', - args: [updates[0].finalName, updates[0].latestVersion]) - : plural('xAndNMoreUpdatesPossiblyInstalled', updates.length - 1, - args: [updates[0].finalName, (updates.length - 1).toString()]); + ? tr( + 'xWasPossiblyUpdatedToY', + args: [updates[0].finalName, updates[0].latestVersion], + ) + : plural( + 'xAndNMoreUpdatesPossiblyInstalled', + updates.length - 1, + args: [updates[0].finalName, (updates.length - 1).toString()], + ); } } class ErrorCheckingUpdatesNotification extends ObtainiumNotification { ErrorCheckingUpdatesNotification(String error, {int? id}) - : super( - id ?? 5, - tr('errorCheckingUpdates'), - error, - 'BG_UPDATE_CHECK_ERROR', - tr('errorCheckingUpdatesNotifChannel'), - tr('errorCheckingUpdatesNotifDescription'), - Importance.high, - payload: "${tr('errorCheckingUpdates')}\n$error"); + : super( + id ?? 5, + tr('errorCheckingUpdates'), + error, + 'BG_UPDATE_CHECK_ERROR', + tr('errorCheckingUpdatesNotifChannel'), + tr('errorCheckingUpdatesNotifDescription'), + Importance.high, + payload: "${tr('errorCheckingUpdates')}\n$error", + ); } class AppsRemovedNotification extends ObtainiumNotification { AppsRemovedNotification(List> namedReasons) - : super( - 6, - tr('appsRemoved'), - '', - 'APPS_REMOVED', - tr('appsRemovedNotifChannel'), - tr('appsRemovedNotifDescription'), - Importance.max) { + : super( + 6, + tr('appsRemoved'), + '', + 'APPS_REMOVED', + tr('appsRemovedNotifChannel'), + tr('appsRemovedNotifDescription'), + Importance.max, + ) { message = ''; for (var r in namedReasons) { message += '${tr('xWasRemovedDueToErrorY', args: [r[0], r[1]])} \n'; @@ -115,49 +140,53 @@ class AppsRemovedNotification extends ObtainiumNotification { class DownloadNotification extends ObtainiumNotification { DownloadNotification(String appName, int progPercent) - : super( - appName.hashCode, - tr('downloadingX', args: [appName]), - '', - 'APP_DOWNLOADING', - tr('downloadingXNotifChannel', args: [tr('app')]), - tr('downloadNotifDescription'), - Importance.low, - onlyAlertOnce: true, - progPercent: progPercent); + : super( + appName.hashCode, + tr('downloadingX', args: [appName]), + '', + 'APP_DOWNLOADING', + tr('downloadingXNotifChannel', args: [tr('app')]), + tr('downloadNotifDescription'), + Importance.low, + onlyAlertOnce: true, + progPercent: progPercent, + ); } class DownloadedNotification extends ObtainiumNotification { DownloadedNotification(String fileName, String downloadUrl) - : super( - downloadUrl.hashCode, - tr('downloadedX', args: [fileName]), - '', - 'FILE_DOWNLOADED', - tr('downloadedXNotifChannel', args: [tr('app')]), - tr('downloadedX', args: [tr('app')]), - Importance.defaultImportance); + : super( + downloadUrl.hashCode, + tr('downloadedX', args: [fileName]), + '', + 'FILE_DOWNLOADED', + tr('downloadedXNotifChannel', args: [tr('app')]), + tr('downloadedX', args: [tr('app')]), + Importance.defaultImportance, + ); } final completeInstallationNotification = ObtainiumNotification( - 1, - tr('completeAppInstallation'), - tr('obtainiumMustBeOpenToInstallApps'), - 'COMPLETE_INSTALL', - tr('completeAppInstallationNotifChannel'), - tr('completeAppInstallationNotifDescription'), - Importance.max); + 1, + tr('completeAppInstallation'), + tr('obtainiumMustBeOpenToInstallApps'), + 'COMPLETE_INSTALL', + tr('completeAppInstallationNotifChannel'), + tr('completeAppInstallationNotifDescription'), + Importance.max, +); class CheckingUpdatesNotification extends ObtainiumNotification { CheckingUpdatesNotification(String appName) - : super( - 4, - tr('checkingForUpdates'), - appName, - 'BG_UPDATE_CHECK', - tr('checkingForUpdatesNotifChannel'), - tr('checkingForUpdatesNotifDescription'), - Importance.min); + : super( + 4, + tr('checkingForUpdates'), + appName, + 'BG_UPDATE_CHECK', + tr('checkingForUpdatesNotifChannel'), + tr('checkingForUpdatesNotifDescription'), + Importance.min, + ); } class NotificationsProvider { @@ -173,13 +202,15 @@ class NotificationsProvider { Importance.max: Priority.max, Importance.min: Priority.min, Importance.none: Priority.min, - Importance.unspecified: Priority.defaultPriority + Importance.unspecified: Priority.defaultPriority, }; Future initialize() async { - isInitialized = await notifications.initialize( + isInitialized = + await notifications.initialize( const InitializationSettings( - android: AndroidInitializationSettings('ic_notification')), + android: AndroidInitializationSettings('ic_notification'), + ), onDidReceiveNotificationResponse: (NotificationResponse response) { _showNotificationPayload(response.payload); }, @@ -188,11 +219,13 @@ class NotificationsProvider { } checkLaunchByNotif() async { - final NotificationAppLaunchDetails? launchDetails = - await notifications.getNotificationAppLaunchDetails(); + final NotificationAppLaunchDetails? launchDetails = await notifications + .getNotificationAppLaunchDetails(); if (launchDetails?.didNotificationLaunchApp ?? false) { - _showNotificationPayload(launchDetails!.notificationResponse?.payload, - doublePop: true); + _showNotificationPayload( + launchDetails!.notificationResponse?.payload, + doublePop: true, + ); } } @@ -207,13 +240,14 @@ class NotificationsProvider { content: Text(content), actions: [ TextButton( - onPressed: () { + onPressed: () { + Navigator.of(context).pop(null); + if (doublePop) { Navigator.of(context).pop(null); - if (doublePop) { - Navigator.of(context).pop(null); - } - }, - child: Text(tr('ok'))), + } + }, + child: Text(tr('ok')), + ), ], ), ), @@ -229,17 +263,18 @@ class NotificationsProvider { } Future notifyRaw( - int id, - String title, - String message, - String channelCode, - String channelName, - String channelDescription, - Importance importance, - {bool cancelExisting = false, - int? progPercent, - bool onlyAlertOnce = false, - String? payload}) async { + int id, + String title, + String message, + String channelCode, + String channelName, + String channelDescription, + Importance importance, { + bool cancelExisting = false, + int? progPercent, + bool onlyAlertOnce = false, + String? payload, + }) async { if (cancelExisting) { await cancel(id); } @@ -247,29 +282,42 @@ class NotificationsProvider { await initialize(); } await notifications.show( - id, - title, - message, - NotificationDetails( - android: AndroidNotificationDetails(channelCode, channelName, - channelDescription: channelDescription, - importance: importance, - priority: importanceToPriority[importance]!, - groupKey: '$obtainiumId.$channelCode', - progress: progPercent ?? 0, - maxProgress: 100, - showProgress: progPercent != null, - onlyAlertOnce: onlyAlertOnce, - indeterminate: progPercent != null && progPercent < 0)), - payload: payload); + id, + title, + message, + NotificationDetails( + android: AndroidNotificationDetails( + channelCode, + channelName, + channelDescription: channelDescription, + importance: importance, + priority: importanceToPriority[importance]!, + groupKey: '$obtainiumId.$channelCode', + progress: progPercent ?? 0, + maxProgress: 100, + showProgress: progPercent != null, + onlyAlertOnce: onlyAlertOnce, + indeterminate: progPercent != null && progPercent < 0, + ), + ), + payload: payload, + ); } - Future notify(ObtainiumNotification notif, - {bool cancelExisting = false}) => - notifyRaw(notif.id, notif.title, notif.message, notif.channelCode, - notif.channelName, notif.channelDescription, notif.importance, - cancelExisting: cancelExisting, - onlyAlertOnce: notif.onlyAlertOnce, - progPercent: notif.progPercent, - payload: notif.payload); + Future notify( + ObtainiumNotification notif, { + bool cancelExisting = false, + }) => notifyRaw( + notif.id, + notif.title, + notif.message, + notif.channelCode, + notif.channelName, + notif.channelDescription, + notif.importance, + cancelExisting: cancelExisting, + onlyAlertOnce: notif.onlyAlertOnce, + progPercent: notif.progPercent, + payload: notif.payload, + ); } diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index e49e8e3..7870908 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -58,8 +58,8 @@ class SettingsProvider with ChangeNotifier { } ThemeSettings get theme { - return ThemeSettings - .values[prefs?.getInt('theme') ?? ThemeSettings.system.index]; + return ThemeSettings.values[prefs?.getInt('theme') ?? + ThemeSettings.system.index]; } set theme(ThemeSettings t) { @@ -123,8 +123,8 @@ class SettingsProvider with ChangeNotifier { } SortColumnSettings get sortColumn { - return SortColumnSettings.values[ - prefs?.getInt('sortColumn') ?? SortColumnSettings.nameAuthor.index]; + return SortColumnSettings.values[prefs?.getInt('sortColumn') ?? + SortColumnSettings.nameAuthor.index]; } set sortColumn(SortColumnSettings s) { @@ -133,8 +133,8 @@ class SettingsProvider with ChangeNotifier { } SortOrderSettings get sortOrder { - return SortOrderSettings.values[ - prefs?.getInt('sortOrder') ?? SortOrderSettings.ascending.index]; + return SortOrderSettings.values[prefs?.getInt('sortOrder') ?? + SortOrderSettings.ascending.index]; } set sortOrder(SortOrderSettings s) { @@ -171,7 +171,9 @@ class SettingsProvider with ChangeNotifier { while (!(await Permission.requestInstallPackages.isGranted)) { // Explicit request as InstallPlugin request sometimes bugged Fluttertoast.showToast( - msg: tr('pleaseAllowInstallPerm'), toastLength: Toast.LENGTH_LONG); + msg: tr('pleaseAllowInstallPerm'), + toastLength: Toast.LENGTH_LONG, + ); if ((await Permission.requestInstallPackages.request()) == PermissionStatus.granted) { return true; @@ -470,7 +472,8 @@ class SettingsProvider with ChangeNotifier { } List get searchDeselected { - return prefs?.getStringList('searchDeselected') ?? SourceProvider().sources.map((s) => s.name).toList(); + return prefs?.getStringList('searchDeselected') ?? + SourceProvider().sources.map((s) => s.name).toList(); } set searchDeselected(List list) { diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 72d88cd..9c6a14d 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -53,8 +53,14 @@ class APKDetails { late String? changeLog; late List> allAssetUrls; - APKDetails(this.version, this.apkUrls, this.names, - {this.releaseDate, this.changeLog, this.allAssetUrls = const []}); + APKDetails( + this.version, + this.apkUrls, + this.names, { + this.releaseDate, + this.changeLog, + this.allAssetUrls = const [], + }); } stringMapListTo2DList(List> mapList) => @@ -66,16 +72,21 @@ assumed2DlistToStringMapList(List arr) => // App JSON schema has changed multiple times over the many versions of Obtainium // This function takes an App JSON and modifies it if needed to conform to the latest (current) version appJSONCompatibilityModifiers(Map json) { - var source = SourceProvider() - .getSource(json['url'], overrideSource: json['overrideSource']); - var formItems = source.combinedAppSpecificSettingFormItems - .reduce((value, element) => [...value, ...element]); - Map additionalSettings = - getDefaultValuesFromFormItems([formItems]); + var source = SourceProvider().getSource( + json['url'], + overrideSource: json['overrideSource'], + ); + var formItems = source.combinedAppSpecificSettingFormItems.reduce( + (value, element) => [...value, ...element], + ); + Map additionalSettings = getDefaultValuesFromFormItems([ + formItems, + ]); Map originalAdditionalSettings = {}; if (json['additionalSettings'] != null) { - originalAdditionalSettings = - Map.from(jsonDecode(json['additionalSettings'])); + originalAdditionalSettings = Map.from( + jsonDecode(json['additionalSettings']), + ); additionalSettings.addEntries(originalAdditionalSettings.entries); } // If needed, migrate old-style additionalData to newer-style additionalSettings (V1) @@ -127,12 +138,14 @@ appJSONCompatibilityModifiers(Map json) { // Ensure additionalSettings are correctly typed for (var item in formItems) { if (additionalSettings[item.key] != null) { - additionalSettings[item.key] = - item.ensureType(additionalSettings[item.key]); + additionalSettings[item.key] = item.ensureType( + additionalSettings[item.key], + ); } } - int preferredApkIndex = - json['preferredApkIndex'] == null ? 0 : json['preferredApkIndex'] as int; + int preferredApkIndex = json['preferredApkIndex'] == null + ? 0 + : json['preferredApkIndex'] as int; if (preferredApkIndex < 0) { preferredApkIndex = 0; } @@ -145,9 +158,9 @@ appJSONCompatibilityModifiers(Map json) { apkUrls = getApkUrlsFromUrls(List.from(apkUrlJson)); } catch (e) { apkUrls = assumed2DlistToStringMapList(List.from(apkUrlJson)); - apkUrls = List.from(apkUrlJson) - .map((e) => MapEntry(e[0] as String, e[1] as String)) - .toList(); + apkUrls = List.from( + apkUrlJson, + ).map((e) => MapEntry(e[0] as String, e[1] as String)).toList(); } json['apkUrls'] = jsonEncode(stringMapListTo2DList(apkUrls)); } @@ -173,22 +186,23 @@ appJSONCompatibilityModifiers(Map json) { 'customLinkFilterRegex': originalAdditionalSettings['intermediateLinkRegex'], 'filterByLinkText': - originalAdditionalSettings['intermediateLinkByText'] - } + originalAdditionalSettings['intermediateLinkByText'], + }, ]; } if ((additionalSettings['intermediateLink']?.length ?? 0) > 0) { additionalSettings['intermediateLink'] = additionalSettings['intermediateLink'].where((e) { - return e['customLinkFilterRegex']?.isNotEmpty == true; - }).toList(); + return e['customLinkFilterRegex']?.isNotEmpty == true; + }).toList(); } // Steam source apps should be converted to HTML (#1244) var legacySteamSourceApps = ['steam', 'steam-chat-app']; if (legacySteamSourceApps.contains(additionalSettings['app'] ?? '')) { json['url'] = '${json['url']}/mobile'; var replacementAdditionalSettings = getDefaultValuesFromFormItems( - HTML().combinedAppSpecificSettingFormItems); + HTML().combinedAppSpecificSettingFormItems, + ); for (var s in replacementAdditionalSettings.keys) { if (additionalSettings.containsKey(s)) { replacementAdditionalSettings[s] = additionalSettings[s]; @@ -212,7 +226,8 @@ appJSONCompatibilityModifiers(Map json) { json['lastUpdateCheck'] != null) { json['url'] = 'https://updates.signal.org/android/latest.json'; var replacementAdditionalSettings = getDefaultValuesFromFormItems( - HTML().combinedAppSpecificSettingFormItems); + HTML().combinedAppSpecificSettingFormItems, + ); replacementAdditionalSettings['versionExtractionRegEx'] = '\\d+.\\d+.\\d+'; additionalSettings = replacementAdditionalSettings; @@ -228,7 +243,8 @@ appJSONCompatibilityModifiers(Map json) { json['lastUpdateCheck'] != null) { json['url'] = 'https://whatsapp.com/android'; var replacementAdditionalSettings = getDefaultValuesFromFormItems( - HTML().combinedAppSpecificSettingFormItems); + HTML().combinedAppSpecificSettingFormItems, + ); replacementAdditionalSettings['refreshBeforeDownload'] = true; additionalSettings = replacementAdditionalSettings; } @@ -243,25 +259,26 @@ appJSONCompatibilityModifiers(Map json) { json['lastUpdateCheck'] != null) { json['url'] = 'https://www.videolan.org/vlc/download-android.html'; var replacementAdditionalSettings = getDefaultValuesFromFormItems( - HTML().combinedAppSpecificSettingFormItems); + HTML().combinedAppSpecificSettingFormItems, + ); replacementAdditionalSettings['refreshBeforeDownload'] = true; replacementAdditionalSettings['intermediateLink'] = >[ - { - 'customLinkFilterRegex': 'APK', - 'filterByLinkText': true, - 'skipSort': false, - 'reverseSort': false, - 'sortByLastLinkSegment': false - }, - { - 'customLinkFilterRegex': 'arm64-v8a\\.apk\$', - 'filterByLinkText': false, - 'skipSort': false, - 'reverseSort': false, - 'sortByLastLinkSegment': false - } - ]; + { + 'customLinkFilterRegex': 'APK', + 'filterByLinkText': true, + 'skipSort': false, + 'reverseSort': false, + 'sortByLastLinkSegment': false, + }, + { + 'customLinkFilterRegex': 'arm64-v8a\\.apk\$', + 'filterByLinkText': false, + 'skipSort': false, + 'reverseSort': false, + 'sortByLastLinkSegment': false, + }, + ]; replacementAdditionalSettings['versionExtractionRegEx'] = '/vlc-android/([^/]+)/'; replacementAdditionalSettings['matchGroupToUse'] = "1"; @@ -277,8 +294,9 @@ appJSONCompatibilityModifiers(Map json) { json['overrideSource'] = FDroid().runtimeType.toString(); } else if (overrideSourceWasUndefined) { // Similar to above, but for third-party F-Droid repos - RegExpMatch? match = RegExp('^https?://.+/fdroid/([^/]+(/|\\?)|[^/]+\$)') - .firstMatch(json['url'] as String); + RegExpMatch? match = RegExp( + '^https?://.+/fdroid/([^/]+(/|\\?)|[^/]+\$)', + ).firstMatch(json['url'] as String); if (match != null) { json['overrideSource'] = FDroidRepo().runtimeType.toString(); } @@ -305,23 +323,24 @@ class App { late String? overrideSource; bool allowIdChange = false; App( - this.id, - this.url, - this.author, - this.name, - this.installedVersion, - this.latestVersion, - this.apkUrls, - this.preferredApkIndex, - this.additionalSettings, - this.lastUpdateCheck, - this.pinned, - {this.categories = const [], - this.releaseDate, - this.changeLog, - this.overrideSource, - this.allowIdChange = false, - this.otherAssetUrls = const []}); + this.id, + this.url, + this.author, + this.name, + this.installedVersion, + this.latestVersion, + this.apkUrls, + this.preferredApkIndex, + this.additionalSettings, + this.lastUpdateCheck, + this.pinned, { + this.categories = const [], + this.releaseDate, + this.changeLog, + this.overrideSource, + this.allowIdChange = false, + this.otherAssetUrls = const [], + }); @override String toString() { @@ -330,8 +349,8 @@ class App { String? get overrideName => additionalSettings['appName']?.toString().trim().isNotEmpty == true - ? additionalSettings['appName'] - : null; + ? additionalSettings['appName'] + : null; String get finalName { return overrideName ?? name; @@ -339,31 +358,32 @@ class App { String? get overrideAuthor => additionalSettings['appAuthor']?.toString().trim().isNotEmpty == true - ? additionalSettings['appAuthor'] - : null; + ? additionalSettings['appAuthor'] + : null; String get finalAuthor { return overrideAuthor ?? author; } App deepCopy() => App( - id, - url, - author, - name, - installedVersion, - latestVersion, - apkUrls, - preferredApkIndex, - Map.from(additionalSettings), - lastUpdateCheck, - pinned, - categories: categories, - changeLog: changeLog, - releaseDate: releaseDate, - overrideSource: overrideSource, - allowIdChange: allowIdChange, - otherAssetUrls: otherAssetUrls); + id, + url, + author, + name, + installedVersion, + latestVersion, + apkUrls, + preferredApkIndex, + Map.from(additionalSettings), + lastUpdateCheck, + pinned, + categories: categories, + changeLog: changeLog, + releaseDate: releaseDate, + overrideSource: overrideSource, + allowIdChange: allowIdChange, + otherAssetUrls: otherAssetUrls, + ); factory App.fromJson(Map json) { Map originalJSON = Map.from(json); @@ -372,7 +392,8 @@ class App { } catch (e) { json = originalJSON; LogsProvider().add( - 'Error running JSON compat modifiers: ${e.toString()}: ${originalJSON.toString()}'); + 'Error running JSON compat modifiers: ${e.toString()}: ${originalJSON.toString()}', + ); } return App( json['id'] as String, @@ -384,7 +405,8 @@ class App { : json['installedVersion'] as String, (json['latestVersion'] ?? tr('unknown')) as String, assumed2DlistToStringMapList( - jsonDecode((json['apkUrls'] ?? '[["placeholder", "placeholder"]]'))), + jsonDecode((json['apkUrls'] ?? '[["placeholder", "placeholder"]]')), + ), (json['preferredApkIndex'] ?? -1) as int, jsonDecode(json['additionalSettings']) as Map, json['lastUpdateCheck'] == null @@ -393,11 +415,11 @@ class App { json['pinned'] ?? false, categories: json['categories'] != null ? (json['categories'] as List) - .map((e) => e.toString()) - .toList() + .map((e) => e.toString()) + .toList() : json['category'] != null - ? [json['category'] as String] - : [], + ? [json['category'] as String] + : [], releaseDate: json['releaseDate'] == null ? null : DateTime.fromMicrosecondsSinceEpoch(json['releaseDate']), @@ -405,29 +427,30 @@ class App { overrideSource: json['overrideSource'], allowIdChange: json['allowIdChange'] ?? false, otherAssetUrls: assumed2DlistToStringMapList( - jsonDecode((json['otherAssetUrls'] ?? '[]'))), + jsonDecode((json['otherAssetUrls'] ?? '[]')), + ), ); } Map toJson() => { - 'id': id, - 'url': url, - 'author': author, - 'name': name, - 'installedVersion': installedVersion, - 'latestVersion': latestVersion, - 'apkUrls': jsonEncode(stringMapListTo2DList(apkUrls)), - 'otherAssetUrls': jsonEncode(stringMapListTo2DList(otherAssetUrls)), - 'preferredApkIndex': preferredApkIndex, - 'additionalSettings': jsonEncode(additionalSettings), - 'lastUpdateCheck': lastUpdateCheck?.microsecondsSinceEpoch, - 'pinned': pinned, - 'categories': categories, - 'releaseDate': releaseDate?.microsecondsSinceEpoch, - 'changeLog': changeLog, - 'overrideSource': overrideSource, - 'allowIdChange': allowIdChange - }; + 'id': id, + 'url': url, + 'author': author, + 'name': name, + 'installedVersion': installedVersion, + 'latestVersion': latestVersion, + 'apkUrls': jsonEncode(stringMapListTo2DList(apkUrls)), + 'otherAssetUrls': jsonEncode(stringMapListTo2DList(otherAssetUrls)), + 'preferredApkIndex': preferredApkIndex, + 'additionalSettings': jsonEncode(additionalSettings), + 'lastUpdateCheck': lastUpdateCheck?.microsecondsSinceEpoch, + 'pinned': pinned, + 'categories': categories, + 'releaseDate': releaseDate?.microsecondsSinceEpoch, + 'changeLog': changeLog, + 'overrideSource': overrideSource, + 'allowIdChange': allowIdChange, + }; } // Ensure the input is starts with HTTPS and has no WWW @@ -441,11 +464,13 @@ preStandardizeUrl(String url) { url = 'https://$url'; } var uri = Uri.tryParse(url); - var trailingSlash = ((uri?.path.endsWith('/') ?? false) || + var trailingSlash = + ((uri?.path.endsWith('/') ?? false) || ((uri?.path.isEmpty ?? false) && url.endsWith('/'))) && (uri?.queryParameters.isEmpty ?? false); - url = url + url = + url .split('/') .where((e) => e.isNotEmpty) .join('/') @@ -457,21 +482,26 @@ preStandardizeUrl(String url) { String noAPKFound = tr('noAPKFound'); List getLinksFromParsedHTML( - Document dom, RegExp hrefPattern, String prependToLinks) => - dom - .querySelectorAll('a') - .where((element) { - if (element.attributes['href'] == null) return false; - return hrefPattern.hasMatch(element.attributes['href']!); - }) - .map((e) => '$prependToLinks${e.attributes['href']!}') - .toList(); + Document dom, + RegExp hrefPattern, + String prependToLinks, +) => dom + .querySelectorAll('a') + .where((element) { + if (element.attributes['href'] == null) return false; + return hrefPattern.hasMatch(element.attributes['href']!); + }) + .map((e) => '$prependToLinks${e.attributes['href']!}') + .toList(); Map getDefaultValuesFromFormItems( - List> items) { - return Map.fromEntries(items - .map((row) => row.map((el) => MapEntry(el.key, el.defaultValue ?? ''))) - .reduce((value, element) => [...value, ...element])); + List> items, +) { + return Map.fromEntries( + items + .map((row) => row.map((el) => MapEntry(el.key, el.defaultValue ?? ''))) + .reduce((value, element) => [...value, ...element]), + ); } List> getApkUrlsFromUrls(List urls) => @@ -482,7 +512,8 @@ List> getApkUrlsFromUrls(List urls) => }).toList(); Future>> filterApksByArch( - List> apkUrls) async { + List> apkUrls, +) async { if (apkUrls.length > 1) { var abis = (await DeviceInfoPlugin().androidInfo).supportedAbis; for (var abi in abis) { @@ -511,20 +542,23 @@ HttpClient createHttpClient(bool insecure) { return client; } -Future>> sourceRequestStreamResponse( - String method, - String url, - Map? requestHeaders, - Map additionalSettings, - {bool followRedirects = true, - Object? postBody}) async { +Future>> +sourceRequestStreamResponse( + String method, + String url, + Map? requestHeaders, + Map additionalSettings, { + bool followRedirects = true, + Object? postBody, +}) async { var currentUrl = Uri.parse(url); var redirectCount = 0; const maxRedirects = 10; List cookies = []; while (redirectCount < maxRedirects) { - var httpClient = - createHttpClient(additionalSettings['allowInsecure'] == true); + var httpClient = createHttpClient( + additionalSettings['allowInsecure'] == true, + ); var request = await httpClient.openUrl(method, currentUrl); if (requestHeaders != null) { requestHeaders.forEach((key, value) { @@ -556,11 +590,16 @@ Future>> sourceRequestStr throw ObtainiumError('Too many redirects ($maxRedirects)'); } -Future httpClientResponseStreamToFinalResponse(HttpClient httpClient, - String method, String url, HttpClientResponse response) async { - final bytes = - (await response.fold(BytesBuilder(), (b, d) => b..add(d))) - .toBytes(); +Future httpClientResponseStreamToFinalResponse( + HttpClient httpClient, + String method, + String url, + HttpClientResponse response, +) async { + final bytes = (await response.fold( + BytesBuilder(), + (b, d) => b..add(d), + )).toBytes(); final headers = {}; response.headers.forEach((name, values) { @@ -598,20 +637,24 @@ abstract class AppSource { name = runtimeType.toString(); } - overrideAdditionalAppSpecificSourceAgnosticSettingSwitch(String key, - {bool disabled = true, bool defaultValue = true}) { + overrideAdditionalAppSpecificSourceAgnosticSettingSwitch( + String key, { + bool disabled = true, + bool defaultValue = true, + }) { additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly = - additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly - .map((e) { - return e.map((e2) { - if (e2.key == key) { - var item = e2 as GeneratedFormSwitch; - item.disabled = disabled; - item.defaultValue = defaultValue; - } - return e2; - }).toList(); - }).toList(); + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly.map( + (e) { + return e.map((e2) { + if (e2.key == key) { + var item = e2 as GeneratedFormSwitch; + item.disabled = disabled; + item.defaultValue = defaultValue; + } + return e2; + }).toList(); + }, + ).toList(); } String standardizeUrl(String url) { @@ -623,8 +666,9 @@ abstract class AppSource { } Future?> getRequestHeaders( - Map additionalSettings, - {bool forAPKDownload = false}) async { + Map additionalSettings, { + bool forAPKDownload = false, + }) async { return null; } @@ -633,18 +677,28 @@ abstract class AppSource { } Future sourceRequest( - String url, Map additionalSettings, - {bool followRedirects = true, Object? postBody}) async { + String url, + Map additionalSettings, { + bool followRedirects = true, + Object? postBody, + }) async { var method = postBody == null ? 'GET' : 'POST'; var requestHeaders = await getRequestHeaders(additionalSettings); - var streamedResponseUrlWithResponseAndClient = await sourceRequestStreamResponse( - method, url, requestHeaders, additionalSettings, - followRedirects: followRedirects, postBody: postBody); + var streamedResponseUrlWithResponseAndClient = + await sourceRequestStreamResponse( + method, + url, + requestHeaders, + additionalSettings, + followRedirects: followRedirects, + postBody: postBody, + ); return await httpClientResponseStreamToFinalResponse( - streamedResponseUrlWithResponseAndClient.value.key, - method, - streamedResponseUrlWithResponseAndClient.key.toString(), - streamedResponseUrlWithResponseAndClient.value.value); + streamedResponseUrlWithResponseAndClient.value.key, + method, + streamedResponseUrlWithResponseAndClient.key.toString(), + streamedResponseUrlWithResponseAndClient.value.value, + ); } void runOnAddAppInputChange(String inputUrl) { @@ -656,7 +710,9 @@ abstract class AppSource { } Future getLatestAPKDetails( - String standardUrl, Map additionalSettings) { + String standardUrl, + Map additionalSettings, + ) { throw NotImplementedError(); } @@ -666,121 +722,160 @@ abstract class AppSource { // Some additional data may be needed for Apps regardless of Source List> - additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly = [ + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly = [ + [GeneratedFormSwitch('trackOnly', label: tr('trackOnly'))], + [ + GeneratedFormTextField( + 'versionExtractionRegEx', + label: tr('trimVersionString'), + required: false, + additionalValidators: [(value) => regExValidator(value)], + ), + ], + [ + GeneratedFormTextField( + 'matchGroupToUse', + label: tr('matchGroupToUseForX', args: [tr('trimVersionString')]), + required: false, + hint: '\$0', + ), + ], [ GeneratedFormSwitch( - 'trackOnly', - label: tr('trackOnly'), - ) + 'versionDetection', + label: tr('versionDetectionExplanation'), + defaultValue: true, + ), ], [ - GeneratedFormTextField('versionExtractionRegEx', - label: tr('trimVersionString'), - required: false, - additionalValidators: [(value) => regExValidator(value)]), + GeneratedFormSwitch( + 'useVersionCodeAsOSVersion', + label: tr('useVersionCodeAsOSVersion'), + defaultValue: false, + ), ], [ - GeneratedFormTextField('matchGroupToUse', - label: tr('matchGroupToUseForX', args: [tr('trimVersionString')]), - required: false, - hint: '\$0') + GeneratedFormTextField( + 'apkFilterRegEx', + label: tr('filterAPKsByRegEx'), + required: false, + additionalValidators: [ + (value) { + return regExValidator(value); + }, + ], + ), ], [ - GeneratedFormSwitch('versionDetection', - label: tr('versionDetectionExplanation'), defaultValue: true) + GeneratedFormSwitch( + 'invertAPKFilter', + label: '${tr('invertRegEx')} (${tr('filterAPKsByRegEx')})', + defaultValue: false, + ), ], [ - GeneratedFormSwitch('useVersionCodeAsOSVersion', - label: tr('useVersionCodeAsOSVersion'), defaultValue: false) - ], - [ - GeneratedFormTextField('apkFilterRegEx', - label: tr('filterAPKsByRegEx'), - required: false, - additionalValidators: [ - (value) { - return regExValidator(value); - } - ]) - ], - [ - GeneratedFormSwitch('invertAPKFilter', - label: '${tr('invertRegEx')} (${tr('filterAPKsByRegEx')})', - defaultValue: false) - ], - [ - GeneratedFormSwitch('autoApkFilterByArch', - label: tr('autoApkFilterByArch'), defaultValue: true) + GeneratedFormSwitch( + 'autoApkFilterByArch', + label: tr('autoApkFilterByArch'), + defaultValue: true, + ), ], [GeneratedFormTextField('appName', label: tr('appName'), required: false)], [GeneratedFormTextField('appAuthor', label: tr('author'), required: false)], [ - GeneratedFormSwitch('shizukuPretendToBeGooglePlay', - label: tr('shizukuPretendToBeGooglePlay'), defaultValue: false) + GeneratedFormSwitch( + 'shizukuPretendToBeGooglePlay', + label: tr('shizukuPretendToBeGooglePlay'), + defaultValue: false, + ), ], [ - GeneratedFormSwitch('allowInsecure', - label: tr('allowInsecure'), defaultValue: false) + GeneratedFormSwitch( + 'allowInsecure', + label: tr('allowInsecure'), + defaultValue: false, + ), ], [ - GeneratedFormSwitch('exemptFromBackgroundUpdates', - label: tr('exemptFromBackgroundUpdates')) + GeneratedFormSwitch( + 'exemptFromBackgroundUpdates', + label: tr('exemptFromBackgroundUpdates'), + ), ], [ - GeneratedFormSwitch('skipUpdateNotifications', - label: tr('skipUpdateNotifications')) + GeneratedFormSwitch( + 'skipUpdateNotifications', + label: tr('skipUpdateNotifications'), + ), ], [GeneratedFormTextField('about', label: tr('about'), required: false)], [ - GeneratedFormSwitch('refreshBeforeDownload', - label: tr('refreshBeforeDownload')) - ] + GeneratedFormSwitch( + 'refreshBeforeDownload', + label: tr('refreshBeforeDownload'), + ), + ], ]; // Previous 2 variables combined into one at runtime for convenient usage List> get combinedAppSpecificSettingFormItems { if (showReleaseDateAsVersionToggle == true) { if (additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly - .indexWhere((List e) => - e.indexWhere((GeneratedFormItem i) => - i.key == 'releaseDateAsVersion') >= - 0) < + .indexWhere( + (List e) => + e.indexWhere( + (GeneratedFormItem i) => i.key == 'releaseDateAsVersion', + ) >= + 0, + ) < 0) { - additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly.insert( - additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly - .indexWhere((List e) => - e.indexWhere((GeneratedFormItem i) => - i.key == 'versionDetection') >= - 0) + - 1, - [ - GeneratedFormSwitch('releaseDateAsVersion', + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly + .insert( + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly + .indexWhere( + (List e) => + e.indexWhere( + (GeneratedFormItem i) => + i.key == 'versionDetection', + ) >= + 0, + ) + + 1, + [ + GeneratedFormSwitch( + 'releaseDateAsVersion', label: '${tr('releaseDateAsVersion')} (${tr('pseudoVersion')})', - defaultValue: false) - ]); + defaultValue: false, + ), + ], + ); } } additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly = additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly - .map((e) => e - .where((ee) => !excludeCommonSettingKeys.contains(ee.key)) - .toList()) + .map( + (e) => e + .where((ee) => !excludeCommonSettingKeys.contains(ee.key)) + .toList(), + ) .where((e) => e.isNotEmpty) .toList(); if (versionDetectionDisallowed) { overrideAdditionalAppSpecificSourceAgnosticSettingSwitch( - 'versionDetection', - disabled: true, - defaultValue: false); + 'versionDetection', + disabled: true, + defaultValue: false, + ); overrideAdditionalAppSpecificSourceAgnosticSettingSwitch( - 'useVersionCodeAsOSVersion', - disabled: true, - defaultValue: false); + 'useVersionCodeAsOSVersion', + disabled: true, + defaultValue: false, + ); } return [ ...additionalSourceAppSpecificSettingFormItems, - ...additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly + ...additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly, ]; } @@ -788,14 +883,15 @@ abstract class AppSource { // If the source has been overridden, we expect the user to define one-time values as additional settings - don't use the stored values List sourceConfigSettingFormItems = []; Future> getSourceConfigValues( - Map additionalSettings, - SettingsProvider settingsProvider) async { + Map additionalSettings, + SettingsProvider settingsProvider, + ) async { Map results = {}; for (var e in sourceConfigSettingFormItems) { var val = hostChanged && !hostIdenticalDespiteAnyChange ? additionalSettings[e.key] : additionalSettings[e.key] ?? - settingsProvider.getSettingString(e.key); + settingsProvider.getSettingString(e.key); if (val != null) { results[e.key] = val; } @@ -811,31 +907,40 @@ abstract class AppSource { return null; } - Future apkUrlPrefetchModifier(String apkUrl, String standardUrl, - Map additionalSettings) async { + Future apkUrlPrefetchModifier( + String apkUrl, + String standardUrl, + Map additionalSettings, + ) async { return apkUrl; } bool canSearch = false; bool includeAdditionalOptsInMainSearch = false; List searchQuerySettingFormItems = []; - Future>> search(String query, - {Map querySettings = const {}}) { + Future>> search( + String query, { + Map querySettings = const {}, + }) { throw NotImplementedError(); } - Future tryInferringAppId(String standardUrl, - {Map additionalSettings = const {}}) async { + Future tryInferringAppId( + String standardUrl, { + Map additionalSettings = const {}, + }) async { return null; } } ObtainiumError getObtainiumHttpError(Response res) { - return ObtainiumError((res.reasonPhrase != null && - res.reasonPhrase != null && - res.reasonPhrase!.isNotEmpty) - ? res.reasonPhrase! - : tr('errorWithHttpStatusCode', args: [res.statusCode.toString()])); + return ObtainiumError( + (res.reasonPhrase != null && + res.reasonPhrase != null && + res.reasonPhrase!.isNotEmpty) + ? res.reasonPhrase! + : tr('errorWithHttpStatusCode', args: [res.statusCode.toString()]), + ); } abstract class MassAppUrlSource { @@ -904,8 +1009,11 @@ replaceMatchGroupsInString(RegExpMatch match, String matchGroupString) { return outputString; } -String? extractVersion(String? versionExtractionRegEx, String? matchGroupString, - String stringToCheck) { +String? extractVersion( + String? versionExtractionRegEx, + String? matchGroupString, + String stringToCheck, +) { if (versionExtractionRegEx?.isNotEmpty == true) { String? version = stringToCheck; var match = RegExp(versionExtractionRegEx!).allMatches(version); @@ -927,9 +1035,10 @@ String? extractVersion(String? versionExtractionRegEx, String? matchGroupString, } List> filterApks( - List> apkUrls, - String? apkFilterRegEx, - bool? invert) { + List> apkUrls, + String? apkFilterRegEx, + bool? invert, +) { if (apkFilterRegEx?.isNotEmpty == true) { var reg = RegExp(apkFilterRegEx!); apkUrls = apkUrls.where((element) { @@ -941,35 +1050,35 @@ List> filterApks( } isVersionPseudo(App app) => - app.additionalSettings['trackOnly'] == true || - (app.installedVersion != null && - app.additionalSettings['versionDetection'] != true); + app.additionalSettings['trackOnly'] == true || + (app.installedVersion != null && + app.additionalSettings['versionDetection'] != true); class SourceProvider { // Add more source classes here so they are available via the service List get sources => [ - GitHub(), - GitLab(), - Codeberg(), - FDroid(), - FDroidRepo(), - IzzyOnDroid(), - SourceHut(), - APKPure(), - Aptoide(), - Uptodown(), - HuaweiAppGallery(), - Tencent(), - CoolApk(), - VivoAppStore(), - Jenkins(), - APKMirror(), - RuStore(), - TelegramApp(), - NeutronCode(), - DirectAPKLink(), - HTML() // This should ALWAYS be the last option as they are tried in order - ]; + GitHub(), + GitLab(), + Codeberg(), + FDroid(), + FDroidRepo(), + IzzyOnDroid(), + SourceHut(), + APKPure(), + Aptoide(), + Uptodown(), + HuaweiAppGallery(), + Tencent(), + CoolApk(), + VivoAppStore(), + Jenkins(), + APKMirror(), + RuStore(), + TelegramApp(), + NeutronCode(), + DirectAPKLink(), + HTML(), // This should ALWAYS be the last option as they are tried in order + ]; // Add more mass url source classes here so they are available via the service List massUrlSources = [GitHubStars()]; @@ -977,8 +1086,9 @@ class SourceProvider { AppSource getSource(String url, {String? overrideSource}) { url = preStandardizeUrl(url); if (overrideSource != null) { - var srcs = - sources.where((e) => e.runtimeType.toString() == overrideSource); + var srcs = sources.where( + (e) => e.runtimeType.toString() == overrideSource, + ); if (srcs.isEmpty) { throw UnsupportedURLError(); } @@ -996,8 +1106,8 @@ class SourceProvider { for (var s in sources.where((element) => element.hosts.isNotEmpty)) { try { if (RegExp( - '^${s.allowSubDomains ? '([^\\.]+\\.)*' : '(www\\.)?'}(${getSourceRegex(s.hosts)})\$') - .hasMatch(Uri.parse(url).host)) { + '^${s.allowSubDomains ? '([^\\.]+\\.)*' : '(www\\.)?'}(${getSourceRegex(s.hosts)})\$', + ).hasMatch(Uri.parse(url).host)) { source = s; break; } @@ -1007,7 +1117,8 @@ class SourceProvider { } if (source == null) { for (var s in sources.where( - (element) => element.hosts.isEmpty && !element.neverAutoSelect)) { + (element) => element.hosts.isEmpty && !element.neverAutoSelect, + )) { try { s.sourceSpecificStandardizeURL(url, forSelection: true); source = s; @@ -1035,30 +1146,37 @@ class SourceProvider { } String generateTempID( - String standardUrl, Map additionalSettings) => - (standardUrl + additionalSettings.toString()).hashCode.toString(); + String standardUrl, + Map additionalSettings, + ) => (standardUrl + additionalSettings.toString()).hashCode.toString(); Future getApp( - AppSource source, String url, Map additionalSettings, - {App? currentApp, - bool trackOnlyOverride = false, - bool sourceIsOverriden = false, - bool inferAppIdIfOptional = false}) async { + AppSource source, + String url, + Map additionalSettings, { + App? currentApp, + bool trackOnlyOverride = false, + bool sourceIsOverriden = false, + bool inferAppIdIfOptional = false, + }) async { if (trackOnlyOverride || source.enforceTrackOnly) { additionalSettings['trackOnly'] = true; } var trackOnly = additionalSettings['trackOnly'] == true; String standardUrl = source.standardizeUrl(url); - APKDetails apk = - await source.getLatestAPKDetails(standardUrl, additionalSettings); + APKDetails apk = await source.getLatestAPKDetails( + standardUrl, + additionalSettings, + ); if (source.runtimeType != HTML().runtimeType && // Some sources do it separately source.runtimeType != SourceForge().runtimeType) { String? extractedVersion = extractVersion( - additionalSettings['versionExtractionRegEx'] as String?, - additionalSettings['matchGroupToUse'] as String?, - apk.version); + additionalSettings['versionExtractionRegEx'] as String?, + additionalSettings['matchGroupToUse'] as String?, + apk.version, + ); if (extractedVersion != null) { apk.version = extractedVersion; } @@ -1068,8 +1186,11 @@ class SourceProvider { apk.releaseDate != null) { apk.version = apk.releaseDate!.microsecondsSinceEpoch.toString(); } - apk.apkUrls = filterApks(apk.apkUrls, additionalSettings['apkFilterRegEx'], - additionalSettings['invertAPKFilter']); + apk.apkUrls = filterApks( + apk.apkUrls, + additionalSettings['apkFilterRegEx'], + additionalSettings['invertAPKFilter'], + ); if (apk.apkUrls.isEmpty && !trackOnly) { throw NoAPKError(); } @@ -1079,47 +1200,53 @@ class SourceProvider { var name = currentApp != null ? currentApp.name.trim() : ''; name = name.isNotEmpty ? name : apk.names.name; App finalApp = App( - currentApp?.id ?? - ((additionalSettings['appId'] != null) - ? additionalSettings['appId'] - : null) ?? - (!trackOnly && - (!source.appIdInferIsOptional || - (source.appIdInferIsOptional && inferAppIdIfOptional)) - ? await source.tryInferringAppId(standardUrl, - additionalSettings: additionalSettings) - : null) ?? - generateTempID(standardUrl, additionalSettings), - standardUrl, - apk.names.author, - name, - currentApp?.installedVersion, - apk.version, - apk.apkUrls, - apk.apkUrls.length - 1 >= 0 ? apk.apkUrls.length - 1 : 0, - additionalSettings, - DateTime.now(), - currentApp?.pinned ?? false, - categories: currentApp?.categories ?? const [], - releaseDate: apk.releaseDate, - changeLog: apk.changeLog, - overrideSource: sourceIsOverriden - ? source.runtimeType.toString() - : currentApp?.overrideSource, - allowIdChange: currentApp?.allowIdChange ?? - trackOnly || - (source.appIdInferIsOptional && - inferAppIdIfOptional), // Optional ID inferring may be incorrect - allow correction on first install - otherAssetUrls: apk.allAssetUrls - .where((a) => apk.apkUrls.indexWhere((p) => a.key == p.key) < 0) - .toList()); + currentApp?.id ?? + ((additionalSettings['appId'] != null) + ? additionalSettings['appId'] + : null) ?? + (!trackOnly && + (!source.appIdInferIsOptional || + (source.appIdInferIsOptional && inferAppIdIfOptional)) + ? await source.tryInferringAppId( + standardUrl, + additionalSettings: additionalSettings, + ) + : null) ?? + generateTempID(standardUrl, additionalSettings), + standardUrl, + apk.names.author, + name, + currentApp?.installedVersion, + apk.version, + apk.apkUrls, + apk.apkUrls.length - 1 >= 0 ? apk.apkUrls.length - 1 : 0, + additionalSettings, + DateTime.now(), + currentApp?.pinned ?? false, + categories: currentApp?.categories ?? const [], + releaseDate: apk.releaseDate, + changeLog: apk.changeLog, + overrideSource: sourceIsOverriden + ? source.runtimeType.toString() + : currentApp?.overrideSource, + allowIdChange: + currentApp?.allowIdChange ?? + trackOnly || + (source.appIdInferIsOptional && + inferAppIdIfOptional), // Optional ID inferring may be incorrect - allow correction on first install + otherAssetUrls: apk.allAssetUrls + .where((a) => apk.apkUrls.indexWhere((p) => a.key == p.key) < 0) + .toList(), + ); return source.endOfGetAppChanges(finalApp); } // Returns errors in [results, errors] instead of throwing them - Future> getAppsByURLNaive(List urls, - {List alreadyAddedUrls = const [], - AppSource? sourceOverride}) async { + Future> getAppsByURLNaive( + List urls, { + List alreadyAddedUrls = const [], + AppSource? sourceOverride, + }) async { List apps = []; Map errors = {}; for (var url in urls) { @@ -1128,12 +1255,16 @@ class SourceProvider { throw ObtainiumError(tr('appAlreadyAdded')); } var source = sourceOverride ?? getSource(url); - apps.add(await getApp( + apps.add( + await getApp( source, url, sourceIsOverriden: sourceOverride != null, getDefaultValuesFromFormItems( - source.combinedAppSpecificSettingFormItems))); + source.combinedAppSpecificSettingFormItems, + ), + ), + ); } catch (e) { errors.addAll({url: e}); } From 7d9a641e246fd9fb52683e41f1de5ffb03c84e60 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 13 Jun 2025 17:07:09 -0400 Subject: [PATCH 57/72] Dart fix + Flutter upgrade --- .flutter | 2 +- lib/app_sources/apkpure.dart | 4 ++-- lib/app_sources/directAPKLink.dart | 2 +- lib/app_sources/github.dart | 4 ++-- lib/app_sources/huaweiappgallery.dart | 6 +++--- lib/app_sources/neutroncode.dart | 2 +- lib/app_sources/uptodown.dart | 2 +- lib/components/generated_form.dart | 2 +- lib/custom_errors.dart | 6 +++--- lib/pages/add_app.dart | 4 ++-- lib/pages/apps.dart | 11 ++++++----- lib/pages/home.dart | 8 ++++---- lib/pages/import_export.dart | 2 +- lib/providers/apps_provider.dart | 6 +++--- lib/providers/notifications_provider.dart | 4 ++-- lib/providers/source_provider.dart | 20 ++++++++++---------- pubspec.lock | 18 +++++++++--------- pubspec.yaml | 2 +- 18 files changed, 53 insertions(+), 52 deletions(-) diff --git a/.flutter b/.flutter index b25305a..6fba244 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit b25305a8832cfc6ba632a7f87ad455e319dccce8 +Subproject commit 6fba2447e95c451518584c35e25f5433f14d888c diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 888ab51..75733ce 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -8,7 +8,7 @@ import 'package:obtainium/providers/source_provider.dart'; extension Unique on List { List unique([Id Function(E element)? id, bool inplace = true]) { - final ids = Set(); + final ids = {}; var list = inplace ? this : List.from(this); list.retainWhere((x) => ids.add(id != null ? id(x) : x as Id)); return list; @@ -76,7 +76,7 @@ class APKPure extends AppSource { return Uri.parse(standardUrl).pathSegments.last; } - getDetailsForVersion( + Future getDetailsForVersion( List> versionVariants, List supportedArchs, Map additionalSettings, diff --git a/lib/app_sources/directAPKLink.dart b/lib/app_sources/directAPKLink.dart index 5be1483..998f7bc 100644 --- a/lib/app_sources/directAPKLink.dart +++ b/lib/app_sources/directAPKLink.dart @@ -16,7 +16,7 @@ class DirectAPKLink extends AppSource { .where((element) => element.key == 'requestHeader') .isNotEmpty, ) - .toList(), + , [ GeneratedFormDropdown( 'defaultPseudoVersioningMethod', diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index 667e93e..560605a 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -566,7 +566,7 @@ class GitHub extends AppSource { } } - getLatestAPKDetailsCommon2( + Future getLatestAPKDetailsCommon2( String standardUrl, Map additionalSettings, Future Function(bool) reqUrlGenerator, @@ -667,7 +667,7 @@ class GitHub extends AppSource { ); } - rateLimitErrorCheck(Response res) { + void rateLimitErrorCheck(Response res) { if (res.headers['x-ratelimit-remaining'] == '0') { throw RateLimitError( (int.parse(res.headers['x-ratelimit-reset'] ?? '1800000000') / 60000000) diff --git a/lib/app_sources/huaweiappgallery.dart b/lib/app_sources/huaweiappgallery.dart index 2d09e60..7ecffd3 100644 --- a/lib/app_sources/huaweiappgallery.dart +++ b/lib/app_sources/huaweiappgallery.dart @@ -24,10 +24,10 @@ class HuaweiAppGallery extends AppSource { return match.group(0)!; } - getDlUrl(String standardUrl) => + String getDlUrl(String standardUrl) => 'https://${hosts[0].replaceAll('appgallery.huawei', 'appgallery.cloud.huawei')}/appdl/${standardUrl.split('/').last}'; - requestAppdlRedirect( + Future requestAppdlRedirect( String dlUrl, Map additionalSettings, ) async { @@ -45,7 +45,7 @@ class HuaweiAppGallery extends AppSource { } } - appIdFromRedirectDlUrl(String redirectDlUrl) { + String appIdFromRedirectDlUrl(String redirectDlUrl) { var parts = redirectDlUrl .split('?')[0] .split('/') diff --git a/lib/app_sources/neutroncode.dart b/lib/app_sources/neutroncode.dart index 8efca3d..de243ed 100644 --- a/lib/app_sources/neutroncode.dart +++ b/lib/app_sources/neutroncode.dart @@ -56,7 +56,7 @@ class NeutronCode extends AppSource { } } - customDateParse(String dateString) { + String? customDateParse(String dateString) { List parts = dateString.split(' '); if (parts.length != 3) { return null; diff --git a/lib/app_sources/uptodown.dart b/lib/app_sources/uptodown.dart index 3dbee4c..7315675 100644 --- a/lib/app_sources/uptodown.dart +++ b/lib/app_sources/uptodown.dart @@ -3,7 +3,7 @@ import 'package:html/parser.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; -parseDateTimeMMMddCommayyyy(String? dateString) { +DateTime? parseDateTimeMMMddCommayyyy(String? dateString) { DateTime? releaseDate; try { releaseDate = dateString != null diff --git a/lib/components/generated_form.dart b/lib/components/generated_form.dart index 27c2db5..25f3192 100644 --- a/lib/components/generated_form.dart +++ b/lib/components/generated_form.dart @@ -293,7 +293,7 @@ class _GeneratedFormState extends State { widget.onValueChanges(returnValues, valid, isBuilding); } - initForm() { + void initForm() { initKey = widget.key.toString(); // Initialize form values as all empty values.clear(); diff --git a/lib/custom_errors.dart b/lib/custom_errors.dart index 0ecdf74..b6ba177 100644 --- a/lib/custom_errors.dart +++ b/lib/custom_errors.dart @@ -76,7 +76,7 @@ class MultiAppMultiError extends ObtainiumError { MultiAppMultiError() : super(tr('placeholder'), unexpected: true); - add(String appId, dynamic error, {String? appName}) { + void add(String appId, dynamic error, {String? appName}) { if (error is SocketException) { error = error.message; } @@ -107,7 +107,7 @@ class MultiAppMultiError extends ObtainiumError { .join('\n\n'); } -showMessage(dynamic e, BuildContext context, {bool isError = false}) { +void showMessage(dynamic e, BuildContext context, {bool isError = false}) { Provider.of( context, listen: false, @@ -150,7 +150,7 @@ showMessage(dynamic e, BuildContext context, {bool isError = false}) { } } -showError(dynamic e, BuildContext context) { +void showError(dynamic e, BuildContext context) { showMessage(e, context, isError: true); } diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index 6251737..bff5cfa 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -39,7 +39,7 @@ class AddAppPageState extends State { int urlInputKey = 0; SourceProvider sourceProvider = SourceProvider(); - linkFn(String input) { + void linkFn(String input) { try { if (input.isEmpty) { throw UnsupportedURLError(); @@ -51,7 +51,7 @@ class AddAppPageState extends State { } } - changeUserInput( + void changeUserInput( String input, bool valid, bool isBuilding, { diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index e029420..6ef7e11 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -26,7 +26,7 @@ class AppsPage extends StatefulWidget { State createState() => AppsPageState(); } -showChangeLogDialog( +void showChangeLogDialog( BuildContext context, App app, String? changesUrl, @@ -100,7 +100,7 @@ showChangeLogDialog( ); } -getChangeLogFn(BuildContext context, App app) { +Null Function()? getChangeLogFn(BuildContext context, App app) { AppSource appSource = SourceProvider().getSource( app.url, overrideSource: app.overrideSource, @@ -138,7 +138,7 @@ class AppsPageState extends State { Set selectedAppIds = {}; DateTime? refreshingSince; - clearSelected() { + bool clearSelected() { if (selectedAppIds.isNotEmpty) { setState(() { selectedAppIds.clear(); @@ -148,7 +148,7 @@ class AppsPageState extends State { return false; } - selectThese(List apps) { + void selectThese(List apps) { if (selectedAppIds.isEmpty) { setState(() { for (var a in apps) { @@ -1063,6 +1063,7 @@ class AppsPageState extends State { globalNavigatorKey.currentContext ?? context, ) .catchError( + // ignore: invalid_return_type_for_catch_error (e) => showError( e, globalNavigatorKey.currentContext ?? context, @@ -1317,7 +1318,7 @@ class AppsFilter { }; } - setFormValuesFromMap(Map values) { + void setFormValuesFromMap(Map values) { nameFilter = values['appName']!; authorFilter = values['author']!; idFilter = values['appId']!; diff --git a/lib/pages/home.dart b/lib/pages/home.dart index ee45ed2..591541b 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -229,7 +229,7 @@ class _HomePageState extends State { }); } - setIsReversing(int targetIndex) { + void setIsReversing(int targetIndex) { bool reversing = selectedIndexHistory.isNotEmpty && selectedIndexHistory.last > targetIndex; @@ -238,7 +238,7 @@ class _HomePageState extends State { }); } - switchToPage(int index) async { + Future switchToPage(int index) async { setIsReversing(index); if (index == 0) { while ((pages[0].widget.key as GlobalKey).currentState != @@ -340,8 +340,8 @@ class _HomePageState extends State { }); return false; } - return !(pages[0].widget.key as GlobalKey).currentState - ?.clearSelected(); + return !(pages[0].widget.key as GlobalKey).currentState! + .clearSelected(); }, ); } diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index cfe4beb..23b1cb7 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -695,7 +695,7 @@ class _SelectionModalState extends State { } } - selectOnlyOne(String url) { + void selectOnlyOne(String url) { for (var e in entrySelections.keys) { entrySelections[e] = e.key == url; } diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 769be36..8c4c884 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -112,7 +112,7 @@ Set findStandardFormatsForVersion(String version, bool strict) { return results; } -moveStrToEnd(List arr, String str, {String? strB}) { +List moveStrToEnd(List arr, String str, {String? strB}) { String? temp; arr.removeWhere((element) { bool res = element == str || element == strB; @@ -269,7 +269,7 @@ Future checkETagHeader( .toString(); } -deleteFile(File file) { +void deleteFile(File file) { try { file.deleteSync(recursive: true); } on PathAccessException catch (e) { @@ -1826,7 +1826,7 @@ class AppsProvider with ChangeNotifier { await intent.launch(); } - addMissingCategories(SettingsProvider settingsProvider) { + void addMissingCategories(SettingsProvider settingsProvider) { var cats = settingsProvider.categories; apps.forEach((key, value) { for (var c in value.app.categories) { diff --git a/lib/providers/notifications_provider.dart b/lib/providers/notifications_provider.dart index 0f126ce..0d44bc9 100644 --- a/lib/providers/notifications_provider.dart +++ b/lib/providers/notifications_provider.dart @@ -218,7 +218,7 @@ class NotificationsProvider { false; } - checkLaunchByNotif() async { + Future checkLaunchByNotif() async { final NotificationAppLaunchDetails? launchDetails = await notifications .getNotificationAppLaunchDetails(); if (launchDetails?.didNotificationLaunchApp ?? false) { @@ -229,7 +229,7 @@ class NotificationsProvider { } } - _showNotificationPayload(String? payload, {bool doublePop = false}) { + void _showNotificationPayload(String? payload, {bool doublePop = false}) { if (payload?.isNotEmpty == true) { var title = (payload ?? '\n\n').split('\n').first; var content = (payload ?? '\n\n').split('\n').sublist(1).join('\n'); diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 9c6a14d..f14d988 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -63,15 +63,15 @@ class APKDetails { }); } -stringMapListTo2DList(List> mapList) => +List> stringMapListTo2DList(List> mapList) => mapList.map((e) => [e.key, e.value]).toList(); -assumed2DlistToStringMapList(List arr) => +List> assumed2DlistToStringMapList(List arr) => arr.map((e) => MapEntry(e[0] as String, e[1] as String)).toList(); // App JSON schema has changed multiple times over the many versions of Obtainium // This function takes an App JSON and modifies it if needed to conform to the latest (current) version -appJSONCompatibilityModifiers(Map json) { +Map appJSONCompatibilityModifiers(Map json) { var source = SourceProvider().getSource( json['url'], overrideSource: json['overrideSource'], @@ -454,7 +454,7 @@ class App { } // Ensure the input is starts with HTTPS and has no WWW -preStandardizeUrl(String url) { +String preStandardizeUrl(String url) { var firstDotIndex = url.indexOf('.'); if (!(firstDotIndex >= 0 && firstDotIndex != url.length - 1)) { throw UnsupportedURLError(); @@ -529,7 +529,7 @@ Future>> filterApksByArch( return apkUrls; } -getSourceRegex(List hosts) { +String getSourceRegex(List hosts) { return '(${hosts.join('|').replaceAll('.', '\\.')})'; } @@ -637,7 +637,7 @@ abstract class AppSource { name = runtimeType.toString(); } - overrideAdditionalAppSpecificSourceAgnosticSettingSwitch( + void overrideAdditionalAppSpecificSourceAgnosticSettingSwitch( String key, { bool disabled = true, bool defaultValue = true, @@ -949,7 +949,7 @@ abstract class MassAppUrlSource { Future>> getUrlsWithDescriptions(List args); } -regExValidator(String? value) { +String? regExValidator(String? value) { if (value == null || value.isEmpty) { return null; } @@ -961,7 +961,7 @@ regExValidator(String? value) { return null; } -intValidator(String? value, {bool positive = false}) { +String? intValidator(String? value, {bool positive = false}) { if (value == null) { return tr('invalidInput'); } @@ -980,7 +980,7 @@ bool isTempId(App app) { return RegExp('^[0-9]+\$').hasMatch(app.id); } -replaceMatchGroupsInString(RegExpMatch match, String matchGroupString) { +String? replaceMatchGroupsInString(RegExpMatch match, String matchGroupString) { if (RegExp('^\\d+\$').hasMatch(matchGroupString)) { matchGroupString = '\$$matchGroupString'; } @@ -1049,7 +1049,7 @@ List> filterApks( return apkUrls; } -isVersionPseudo(App app) => +bool isVersionPseudo(App app) => app.additionalSettings['trackOnly'] == true || (app.installedVersion != null && app.additionalSettings['versionDetection'] != true); diff --git a/pubspec.lock b/pubspec.lock index 2980b59..18f6a6c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -288,10 +288,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "77f8e81d22d2a07d0dee2c62e1dda71dc1da73bf43bb2d45af09727406167964" + sha256: ef9908739bdd9c476353d6adff72e88fd00c625f5b959ae23f7567bd5137db0a url: "https://pub.dev" source: hosted - version: "10.1.9" + version: "10.2.0" fixnum: dependency: transitive description: @@ -804,10 +804,10 @@ packages: dependency: transitive description: name: pointer_interceptor_web - sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044" + sha256: "460b600e71de6fcea2b3d5f662c92293c049c4319e27f0829310e5a953b3ee2a" url: "https://pub.dev" source: hosted - version: "0.10.2+1" + version: "0.10.3" provider: dependency: "direct main" description: @@ -893,7 +893,7 @@ packages: description: path: "." ref: master - resolved-ref: "89cdb5434a7ac7510f6bcdb60e1d51a27ee2f40b" + resolved-ref: "012e22791138958e089f6c1a8d6c4c6943a9f253" url: "https://github.com/AlexBacich/shared-storage" source: git version: "0.7.0" @@ -1155,10 +1155,10 @@ packages: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "7cb32b21825bd65569665c32bb00a34ded5779786d6201f5350979d2d529940d" + sha256: f0dc2dc3a2b1e3a6abdd6801b9355ebfeb3b8f6cde6b9dc7c9235909c4a1f147 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.13.1" webview_flutter_wkwebview: dependency: transitive description: @@ -1171,10 +1171,10 @@ packages: dependency: transitive description: name: win32 - sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" url: "https://pub.dev" source: hosted - version: "5.13.0" + version: "5.14.0" win32_registry: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ed9261e..62e0118 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -149,4 +149,4 @@ flutter: fonts: - family: Montserrat fonts: - - asset: assets/fonts/Montserrat-Regular.ttf \ No newline at end of file + - asset: assets/fonts/Montserrat-Regular.ttf From 7d2f215b80a8dcffefaeab8d775d994e841ad70e Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 13 Jun 2025 17:22:03 -0400 Subject: [PATCH 58/72] Minor wording changes (#2226, #2313, #2317, #2338) --- README.md | 2 +- lib/pages/home.dart | 10 ++++++++-- lib/pages/import_export.dart | 7 +++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b0b3bd9..c801e58 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ Or, contribute some configurations to the website by creating a PR at [this repo Verification info: - Package ID: `dev.imranr.obtainium` -- SHA-256 Hash of Signing Certificate: `B3:53:60:1F:6A:1D:5F:D6:60:3A:E2:F5:0B:E8:0C:F3:01:36:7B:86:B6:AB:8B:1F:66:24:3D:A9:6C:D5:73:62` +- SHA-256 hash of signing certificate: `B3:53:60:1F:6A:1D:5F:D6:60:3A:E2:F5:0B:E8:0C:F3:01:36:7B:86:B6:AB:8B:1F:66:24:3D:A9:6C:D5:73:62` - Note: The above signature is also valid for the F-Droid flavour of Obtainium, thanks to [reproducible builds](https://f-droid.org/docs/Reproducible_Builds/). - [PGP Public Key](https://keyserver.ubuntu.com/pks/lookup?search=contact%40imranr.dev&fingerprint=on&op=index) (to verify APK hashes) diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 591541b..670527a 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -165,7 +165,10 @@ class _HomePageState extends State { return GeneratedFormModal( title: tr( 'importX', - args: [action == 'app' ? tr('app') : tr('appsString')], + args: [ + (action == 'app' ? tr('app') : tr('appsString')) + .toLowerCase(), + ], ), items: const [], additionalWidgets: [ @@ -192,7 +195,10 @@ class _HomePageState extends State { ); // ignore: use_build_context_synchronously showMessage( - tr('importedX', args: [plural('apps', result.key.length)]), + tr( + 'importedX', + args: [plural('apps', result.key.length).toLowerCase()], + ), context, ); await appsProvider diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index 23b1cb7..ac70e54 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -88,7 +88,10 @@ class _ImportExportPageState extends State { .then((errors) { if (errors.isEmpty) { showMessage( - tr('importedX', args: [plural('apps', urls.length)]), + tr( + 'importedX', + args: [plural('apps', urls.length).toLowerCase()], + ), context, ); } else { @@ -159,7 +162,7 @@ class _ImportExportPageState extends State { }); appsProvider.addMissingCategories(settingsProvider); showMessage( - '${tr('importedX', args: [plural('apps', value.key.length)])}${value.value ? ' + ${tr('settings')}' : ''}', + '${tr('importedX', args: [plural('apps', value.key.length).toLowerCase()])}${value.value ? ' + ${tr('settings').toLowerCase()}' : ''}', context, ); }); From 86be6a77d771ed57ba14010c8ab949be1ccfaf87 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 13 Jun 2025 17:22:50 -0400 Subject: [PATCH 59/72] Increment version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 62e0118..536ff9a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.56+2313 +version: 1.1.57+2314 environment: sdk: ^3.8.1 From 2dca74edb23f93a8c8f3b566223650df41f6cef9 Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Fri, 13 Jun 2025 17:53:09 -0400 Subject: [PATCH 60/72] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c801e58..229979b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# ![Obtainium Icon](./assets/graphics/icon_small.png) Obtainium +
    Support Palestine
    -[![Ceasefire Now](https://badge.techforpalestine.org/default)](https://techforpalestine.org/learn-more) +# ![Obtainium Icon](./assets/graphics/icon_small.png) Obtainium Get Android app updates straight from the source. From c88f55af5adfd5cb6bdf5c7478b9b8c79b3ddf96 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 15 Jun 2025 14:42:58 -0400 Subject: [PATCH 61/72] Fix versionCode issue for universal builds (#2352) --- android/app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 985d2ad..a684a7f 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -90,7 +90,7 @@ androidComponents { onVariants { variant -> variant.outputs.forEach { output -> val name = output.filters.find { it.filterType == ABI }?.identifier - val baseAbiCode = abiCodes[name] + val baseAbiCode = abiCodes[name] ?: 0 if (baseAbiCode != null) { output.versionCode.set(baseAbiCode + ((output.versionCode.get() ?: 0) * 10)) } From 377ebeeca277f7c2c1f9a6ffc93757b5e5b3b0ba Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 15 Jun 2025 14:44:14 -0400 Subject: [PATCH 62/72] Increment version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 536ff9a..47fd210 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.57+2314 +version: 1.1.58+2315 environment: sdk: ^3.8.1 From dab5e4246b7679a769f88416e9789de915e4d1ad Mon Sep 17 00:00:00 2001 From: DwainZwerg <97027379+DwainZwerg@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:42:53 +0200 Subject: [PATCH 63/72] Update de.json spelling --- assets/translations/de.json | 54 ++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/assets/translations/de.json b/assets/translations/de.json index f95e98f..29f9613 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -19,7 +19,7 @@ "noDescription": "Keine Beschreibung", "cancel": "Abbrechen", "continue": "Weiter", - "requiredInBrackets": "(wird benötigt)", + "requiredInBrackets": "(notwendig)", "dropdownNoOptsError": "FEHLER: DROPDOWN MUSS MINDESTENS EINE OPTION HABEN", "colour": "Farbe", "standard": "Standard", @@ -32,7 +32,7 @@ "source": "Quelle", "app": "App", "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zur Nachverfolgung.", - "youPickedTrackOnly": "Du hast die Option „Nur nachverfolgen“ gewählt.", + "youPickedTrackOnly": "Sie haben die Option „Nur nachverfolgen“ gewählt.", "trackOnlyAppDescription": "Die App wird auf neue verfügbare Versionen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.", "cancelled": "Abgebrochen", "appAlreadyAdded": "App bereits hinzugefügt", @@ -46,7 +46,7 @@ "additionalOptsFor": "Zusatzoptionen für {}", "supportedSources": "Unterstützte Quellen", "trackOnlyInBrackets": "(Nur nachverfolgen)", - "searchableInBrackets": "(Durchsuchbar)", + "searchableInBrackets": "(durchsuchbar)", "appsString": "Apps", "noApps": "Keine Apps", "noAppsForFilter": "Keine Apps für ausgewählten Filter", @@ -98,26 +98,26 @@ "importFromURLList": "Aus URL-Liste importieren", "searchQuery": "Suchanfrage", "appURLList": "App-URL-Liste", - "line": "Linie", + "line": "Zeile", "searchX": "{} suchen", "noResults": "Keine Ergebnisse gefunden", "importX": "{} importieren", - "importedAppsIdDisclaimer": "Importierte Apps werden manchmal fälschlicherweise als „Nicht installiert“ angezeigt. Um dies zu beheben, installiere sie erneut über Obtainium. Dies hat keine Auswirkungen auf App-Daten. Es betrifft nur URL- und Drittanbieter-Importmethoden.", + "importedAppsIdDisclaimer": "Importierte Apps werden manchmal fälschlicherweise als „Nicht installiert“ angezeigt. Um dies zu beheben, installieren Sie sie erneut über Obtainium. Dies hat keine Auswirkungen auf App-Daten. Es betrifft nur URL- und Drittanbieter-Importmethoden.", "importErrors": "Importfehler", "importedXOfYApps": "{} von {} Apps importiert.", "followingURLsHadErrors": "Bei folgenden URLs traten Fehler auf:", "selectURL": "URL auswählen", "selectURLs": "URLs auswählen", "pick": "Auswählen", - "theme": "Design", + "theme": "Erscheinungsbild", "dark": "Dunkel", "light": "Hell", "followSystem": "Systemstandard", "followSystemThemeExplanation": "Das Abrufen des Systemdesigns ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich", "useBlackTheme": "Rein schwarzen Hintergrund verwenden", "appSortBy": "App sortieren nach", - "authorName": "Hrsg./Name", - "nameAuthor": "Name/Hrsg.", + "authorName": "Herausgebende/Name", + "nameAuthor": "Name/Herausgebende", "asAdded": "Wie hinzugefügt", "appSortOrder": "App sortieren nach", "ascending": "Aufsteigend", @@ -138,12 +138,12 @@ "obtainiumExportHyphenatedLowercase": "Obtainium-Export", "pickAnAPK": "APK auswählen", "appHasMoreThanOnePackage": "{} verfügt über mehr als ein Paket:", - "deviceSupportsXArch": "Dein Gerät unterstützt die CPU-Architektur {}.", - "deviceSupportsFollowingArchs": "Dein Gerät unterstützt die folgenden CPU-Architekturen:", + "deviceSupportsXArch": "Ihr Gerät unterstützt die CPU-Architektur {}.", + "deviceSupportsFollowingArchs": "Ihr Gerät unterstützt die folgenden CPU-Architekturen:", "warning": "Warnung", "sourceIsXButPackageFromYPrompt": "Die App-Quelle ist '{}', aber das Release-Paket stammt von '{}'. Fortfahren?", "updatesAvailable": "Aktualisierungen verfügbar", - "updatesAvailableNotifDescription": "Benachrichtigt, wenn Aktualisierungen für eine oder mehrere von Obtainium verfolgte Apps verfügbar sind", + "updatesAvailableNotifDescription": "Benachrichtigt, wenn Aktualisierungen für eine oder mehrere von Obtainium überwachte Apps verfügbar sind", "noNewUpdates": "Keine neuen Aktualisierungen.", "xHasAnUpdate": "{} hat eine Aktualisierung.", "appsUpdated": "App wurde aktualisiert", @@ -161,7 +161,7 @@ "completeAppInstallationNotifDescription": "Aufforderung zu Obtainium zurückzukehren, um die Installation einer App abzuschließen", "checkingForUpdates": "Nach Aktualisierungen suchen", "checkingForUpdatesNotifDescription": "Vorübergehende Benachrichtigung, die bei der Suche nach Aktualisierungen angezeigt wird", - "pleaseAllowInstallPerm": "Bitte erlaube Obtainium die Installation von Apps", + "pleaseAllowInstallPerm": "Bitte erlauben Sie Obtainium die Installation von Apps", "trackOnly": "Nur nachverfolgen", "errorWithHttpStatusCode": "Fehler {}", "versionCorrectionDisabled": "Versionskorrektur deaktiviert (Plugin scheint nicht zu funktionieren)", @@ -189,8 +189,8 @@ "downloadingX": "{} wird heruntergeladen", "downloadX": "{} herunterladen", "downloadedX": "{} heruntergeladen", - "releaseAsset": "Release-Asset", - "downloadNotifDescription": "Zeigt den Fortschritt beim Herunterladen einer App", + "releaseAsset": "Release-Anhang", + "downloadNotifDescription": "Fortschrittsanzeige beim Herunterladen einer App", "noAPKFound": "Keine APK gefunden", "noVersionDetection": "Keine Versionserkennung", "categorize": "Kategorisieren", @@ -221,16 +221,16 @@ "standardVersionDetection": "Standardversionserkennung", "groupByCategory": "Nach Kategorie gruppieren", "autoApkFilterByArch": "Nach Möglichkeit versuchen, APKs nach CPU-Architektur zu filtern", - "autoLinkFilterByArch": "Versuchen Sie, Links nach CPU-Architektur zu filtern, wenn möglich", + "autoLinkFilterByArch": "Nach Möglichkeit versuchen, APKs nach CPU-Architektur zu filtern", "overrideSource": "Quelle überschreiben", "dontShowAgain": "Nicht noch einmal anzeigen", - "dontShowTrackOnlyWarnings": "Warnung für „Nur nachverfolgen“ nicht anzeigen", + "dontShowTrackOnlyWarnings": Warnung für ‚Nur nachverfolgen‘ nicht anzeigen", "dontShowAPKOriginWarnings": "Warnung für APK-Herkunft nicht anzeigen", "moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der App-Ansicht verschieben", "gitlabPATLabel": "Persönlicher Zugangstoken für GitLab", - "about": "Über", + "about": "Weitere Informationen", "requiresCredentialsInSettings": "{}: Benötigt zusätzliche Anmeldedaten (in den Einstellungen)", - "checkOnStart": "Einmalig beim Start überprüfen", + "checkOnStart": "Einmalig beim Start auf Aktualisierungen prüfen", "tryInferAppIdFromCode": "Versuchen, die App-ID aus dem Quellcode zu ermitteln", "removeOnExternalUninstall": "Extern deinstallierte Apps automatische entfernen", "pickHighestVersionCode": "Automatische Auswahl des APK mit höchstem Versionscode", @@ -246,7 +246,7 @@ "customLinkFilterRegex": "Benutzerdefinierter APK-Linkfilter durch regulären Ausdruck (Standard '.apk$')", "appsPossiblyUpdated": "App-Aktualisierungen wurden versucht", "appsPossiblyUpdatedNotifDescription": "Benachrichtigt, dass möglicherweise eine oder mehrere Apps im Hintergrund aktualisiert wurden", - "xWasPossiblyUpdatedToY": "{} wurde eventuell auf Version {} aktualisiert.", + "xWasPossiblyUpdatedToY": "{} wurde möglicherweise auf Version {} aktualisiert.", "enableBackgroundUpdates": "Hintergrundaktualisierungen aktivieren", "backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist unter Umständen nicht für alle Apps möglich.", "backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.", @@ -287,19 +287,19 @@ "downloadingXNotifChannel": "{} herunterladen", "completeAppInstallationNotifChannel": "App-Installation abschließen", "checkingForUpdatesNotifChannel": "Nach Aktualisierungen suchen", - "onlyCheckInstalledOrTrackOnlyApps": "Nur installierte und mit „Nur nachverfolgen“ markierte Apps auf Aktualisierungen prüfen", + "onlyCheckInstalledOrTrackOnlyApps": "Nur mit „Nur nachverfolgen“ markierte und installierte Apps auf Aktualisierungen prüfen", "supportFixedAPKURL": "Unterstützung von festen APK-URLs", "selectX": "{} wählen", "parallelDownloads": "Parallele Downloads erlauben", "useShizuku": "Shizuku oder Sui zur Installation verwenden", "shizukuBinderNotFound": "Kompatibler Shizuku-Dienst wurde nicht gefunden", - "shizukuOld": "Veraltete Shizuku-Version (< 11) - bitte aktualisiere sie", - "shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisiere die Android-Version oder verwende stattdessen Sui", + "shizukuOld": "Veraltete Shizuku-Version (< 11) – bitte aktualisieren Sie sie", + "shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB – aktualisieren Sie die Android-Version oder verwenden Sie stattdessen Sui", "shizukuPretendToBeGooglePlay": "(Mittels Shizuku) Google Play als Installationsquelle registrieren", "useSystemFont": "Systemschriftart verwenden", - "useVersionCodeAsOSVersion": "Versionscode (versionCode) als erkannte Version vom Betriebssystem verwenden", + "useVersionCodeAsOSVersion": "Versionscode (versionCode) als vom Betriebssystem erkannte Version verwenden", "requestHeader": "Kopfzeile („Header“) anfordern", - "useLatestAssetDateAsReleaseDate": "Letzten Asset-Upload als Veröffentlichungsdatum verwenden", + "useLatestAssetDateAsReleaseDate": "Letzten Upload eines Release-Anhangs als Veröffentlichungsdatum verwenden", "defaultPseudoVersioningMethod": "Standardmäßiges Verfahren zur Pseudo-Versionierung", "partialAPKHash": "Partieller APK-Hash", "APKLinkHash": "APK-Link-Hash", @@ -322,7 +322,7 @@ "refreshBeforeDownload": "App-Details vor dem Download aktualisieren", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", - "vivoAppStore": "vivo App Store (CN)", + "vivoAppStore": "vivo App Store (China)", "name": "Name", "smartname": "Name (Smart)", "sortMethod": "Sortierverfahren", @@ -335,8 +335,8 @@ "other": "Apps entfernen?" }, "tooManyRequestsTryAgainInMinutes": { - "one": "Zu viele Anfragen (Rate begrenzt) – versuche es in {} Minute erneut", - "other": "Zu viele Anfragen (Rate begrenzt) – versuche es in {} Minuten erneut" + "one": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minute erneut", + "other": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minuten erneut" }, "bgUpdateGotErrorRetryInMinutes": { "one": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minute geplant", From 2223616f2ad57c6cfa5d5c5b08b5fd1fdbac2326 Mon Sep 17 00:00:00 2001 From: solokot Date: Wed, 18 Jun 2025 13:52:03 +0300 Subject: [PATCH 64/72] Update Russian translation Unification of terminology, correction of machine translation errors --- assets/translations/ru.json | 185 +++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 86 deletions(-) diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 881fe7c..8ca6068 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -1,7 +1,7 @@ { "invalidURLForSource": "Неверный URL-адрес приложения: {}", - "noReleaseFound": "Не удалось найти подходящий релиз", - "noVersionFound": "Не удалось определить версию релиза", + "noReleaseFound": "Не удалось найти подходящий выпуск", + "noVersionFound": "Не удалось определить версию выпуска", "urlMatchesNoSource": "URL-адрес не соответствует известному источнику", "cantInstallOlderVersion": "Невозможно установить более старую версию приложения", "appIdMismatch": "ID загруженного пакета не совпадает с существующим ID приложения", @@ -9,12 +9,12 @@ "placeholder": "Заполнитель", "someErrors": "Возникли некоторые ошибки", "unexpectedError": "Неожиданная ошибка", - "ok": "Ок", + "ok": "OK", "and": "и", "githubPATLabel": "Персональный токен доступа GitHub\n(увеличивает лимит запросов)", - "includePrereleases": "Включить предварительные релизы", + "includePrereleases": "Включать предварительные выпуски", "fallbackToOlderReleases": "Откатываться к предыдущей версии", - "filterReleaseTitlesByRegEx": "Фильтровать заголовки релизов\n(регулярное выражение)", + "filterReleaseTitlesByRegEx": "Фильтровать заголовки выпусков\n(регулярное выражение)", "invalidRegEx": "Неверное регулярное выражение", "noDescription": "Нет описания", "cancel": "Отмена", @@ -32,13 +32,13 @@ "source": "Источник", "app": "Приложение", "appsFromSourceAreTrackOnly": "Приложения из этого источника настроены только для отслеживания", - "youPickedTrackOnly": "Вы выбрали опцию 'Только для отслеживания'", + "youPickedTrackOnly": "Выбрана настройка «только для отслеживания»", "trackOnlyAppDescription": "Приложение будет отслеживаться на предмет обновлений, но Obtainium не сможет загрузить или установить его", "cancelled": "Отменено", "appAlreadyAdded": "Приложение уже добавлено", "alreadyUpToDateQuestion": "Приложение уже обновлено?", "addApp": "Добавить", - "appSourceURL": "URL-источник приложения", + "appSourceURL": "URL-адрес источника приложения", "error": "Ошибка", "add": "Добавить", "searchSomeSourcesLabel": "Поиск (в некоторых источниках)", @@ -63,10 +63,10 @@ "removeSelectedApps": "Удалить выбранные приложения", "updateX": "Обновить {}", "installX": "Установить {}", - "markXTrackOnlyAsUpdated": "Отметить {}\n(Только для отслеживания)\nкак обновленное", + "markXTrackOnlyAsUpdated": "Отметить {}\n(только для отслеживания)\nкак обновлённое", "changeX": "Изменить {}", - "installUpdateApps": "Установить/Обновить приложения", - "installUpdateSelectedApps": "Установить/Обновить выбранные приложения", + "installUpdateApps": "Установить/обновить приложения", + "installUpdateSelectedApps": "Установить/обновить выбранные приложения", "markXSelectedAppsAsUpdated": "Выбрано приложений: {}. Отметить как обновлённые?", "no": "Нет", "yes": "Да", @@ -74,10 +74,10 @@ "pinToTop": "Закрепить сверху", "unpinFromTop": "Открепить", "resetInstallStatusForSelectedAppsQuestion": "Сбросить статус установки для выбранных приложений?", - "installStatusOfXWillBeResetExplanation": "Статус установки для выбранных приложений будет сброшен.\n\nЭто может помочь, если версия приложения, отображаемая в Obtainium, некорректная — из-за неудачных обновлений или других проблем", + "installStatusOfXWillBeResetExplanation": "Статус установки для выбранных приложений будет сброшен.\n\nЭто может помочь, если версия приложения, отображаемая в Obtainium, некорректная (из-за неудачных обновлений или других проблем).", "customLinkMessage": "Эти ссылки работают на устройствах с установленным Obtainium", "shareAppConfigLinks": "Поделиться конфигурацией приложения в виде HTML-ссылки", - "shareSelectedAppURLs": "Поделиться выбранными URL-адресами приложений", + "shareSelectedAppURLs": "Поделиться URL-адресами выбранных приложений", "resetInstallStatus": "Сбросить статус установки", "more": "Ещё", "removeOutdatedFilter": "Удалить фильтр для устаревших приложений", @@ -86,7 +86,7 @@ "filterApps": "Фильтровать приложения", "appName": "Название приложения", "author": "Автор", - "upToDateApps": "Приложения со свежими обновлениями", + "upToDateApps": "Приложения с обновлениями", "nonInstalledApps": "Неустановленные приложения", "importExport": "Данные", "settings": "Настройки", @@ -97,12 +97,12 @@ "obtainiumImport": "Импорт в Obtainium", "importFromURLList": "Импорт из списка URL-адресов", "searchQuery": "Поисковый запрос", - "appURLList": "Список URL приложений", + "appURLList": "Список URL-адресов приложений", "line": "Строка", "searchX": "Поиск {}", - "noResults": "Результатов не найдено", + "noResults": "Ничего не найдено", "importX": "Импорт {}", - "importedAppsIdDisclaimer": "Импортированные приложения могут неверно отображаться как неустановленные.\nДля исправления этой проблемы повторно установите их через Obtainium.\nЭто не должно повлиять на данные приложения.\n\nПроблемы возникают только при импорте из URL-адреса и сторонних источников", + "importedAppsIdDisclaimer": "Импортированные приложения могут неверно отображаться как неустановленные.\nДля исправления этой проблемы повторно установите их через Obtainium.\nЭто не должно повлиять на данные приложения.\n\nПроблемы возникают только при импорте из URL-адреса и сторонних источников.", "importErrors": "Ошибка импорта", "importedXOfYApps": "Импортировано приложений: {} из {}", "followingURLsHadErrors": "При импорте следующие URL-адреса содержали ошибки:", @@ -112,12 +112,12 @@ "theme": "Тема", "dark": "Тёмная", "light": "Светлая", - "followSystem": "Системная", + "followSystem": "Как в системе", "followSystemThemeExplanation": "Следование системной теме возможно только при использовании сторонних приложений", "useBlackTheme": "Использовать чёрную тему", "appSortBy": "Сортировка приложений", - "authorName": "Автор/Название", - "nameAuthor": "Название/Автор", + "authorName": "Автор/название", + "nameAuthor": "Название/автор", "asAdded": "В порядке добавления", "appSortOrder": "Порядок", "ascending": "По возрастанию", @@ -126,12 +126,12 @@ "neverManualOnly": "Никогда — только вручную", "appearance": "Внешний вид", "showWebInAppView": "Показывать исходную веб-страницу на странице приложения", - "pinUpdates": "Отображать обновления приложений сверху списка", + "pinUpdates": "Показывать обновления приложений сверху списка", "updates": "Обновления", "sourceSpecific": "Настройки источников", "appSource": "Источник", "noLogs": "Нет журналов", - "appLogs": "Логи", + "appLogs": "Журналы", "close": "Закрыть", "share": "Поделиться", "appNotFound": "Приложение не найдено", @@ -141,21 +141,21 @@ "deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}", "deviceSupportsFollowingArchs": "Ваше устройство поддерживает следующие архитектуры процессора:", "warning": "Предупреждение", - "sourceIsXButPackageFromYPrompt": "Источник приложения — '{}', но пакет для установки получен из '{}'. Продолжить?", + "sourceIsXButPackageFromYPrompt": "Источник приложения — «{}», но пакет для установки получен из «{}». Продолжить?", "updatesAvailable": "Доступны обновления", "updatesAvailableNotifDescription": "Уведомляет о наличии обновлений для одного или нескольких приложений в Obtainium", - "noNewUpdates": "Нет новых обновлений", - "xHasAnUpdate": "{} есть обновление", + "noNewUpdates": "Нет обновлений", + "xHasAnUpdate": "Для {} есть обновление", "appsUpdated": "Приложения обновлены", "appsNotUpdated": "Не удалось обновить приложения", "appsUpdatedNotifDescription": "Уведомляет об обновлении одного или нескольких приложений в фоновом режиме", - "xWasUpdatedToY": "{} была обновлена до версии {}", + "xWasUpdatedToY": "{} обновлено до версии {}", "xWasNotUpdatedToY": "Не удалось обновить {} до версии {}", "errorCheckingUpdates": "Ошибка при проверке обновлений", "errorCheckingUpdatesNotifDescription": "Уведомление о завершении проверки обновлений в фоновом режиме с ошибкой", "appsRemoved": "Приложение удалено", "appsRemovedNotifDescription": "Уведомление об удалении одного или несколько приложений из-за ошибок при их загрузке", - "xWasRemovedDueToErrorY": "{} был удален из-за ошибки: {}", + "xWasRemovedDueToErrorY": "{} удалено из-за ошибки: {}", "completeAppInstallation": "Завершение установки приложения", "obtainiumMustBeOpenToInstallApps": "Obtainium должен быть открыт для установки приложений", "completeAppInstallationNotifDescription": "Уведомление о необходимости открыть Obtainium для завершения установки приложения", @@ -172,7 +172,7 @@ "installedVersionX": "Установленная версия: {}", "lastUpdateCheckX": "Последняя проверка: {}", "remove": "Удалить", - "yesMarkUpdated": "Да, отметить как обновленное", + "yesMarkUpdated": "Да, отметить как обновлённое", "fdroid": "Официальные репозитории F-Droid", "appIdOrName": "ID или название приложения", "appId": "ID приложения", @@ -180,39 +180,39 @@ "reposHaveMultipleApps": "В хранилище несколько приложений", "fdroidThirdPartyRepo": "Сторонние репозитории F-Droid", "install": "Установить", - "markInstalled": "Пометить как установленное", + "markInstalled": "Отметить установленным", "update": "Обновить", "markUpdated": "Отметить обновлённым", "additionalOptions": "Дополнительные настройки", - "disableVersionDetection": "Отключить обнаружение версии", - "noVersionDetectionExplanation": "Эта настройка должна использоваться только для приложений, где обнаружение версии не работает корректно", + "disableVersionDetection": "Отключить определение версии", + "noVersionDetectionExplanation": "Эта настройка должна использоваться только для приложений, где определение версии не работает корректно", "downloadingX": "Загрузка {}", - "downloadX": "Скачать {}", + "downloadX": "Загрузить {}", "downloadedX": "Загружено {}", - "releaseAsset": "Релизный объект", + "releaseAsset": "Объект выпуска", "downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения", - "noAPKFound": "APK не найден", - "noVersionDetection": "Обнаружение версий отключено", + "noAPKFound": "APK-файл не найден", + "noVersionDetection": "Определение версий отключено", "categorize": "Категоризировать", "categories": "Категории", "category": "Категория", "noCategory": "Без категории", "noCategories": "Без категорий", "deleteCategoriesQuestion": "Удалить категории?", - "categoryDeleteWarning": "Все приложения в удаленных категориях будут помечены как без категории", + "categoryDeleteWarning": "Все приложения в удалённых категориях будут помечены как «без категории»", "addCategory": "Добавить категорию", "label": "Метка", "language": "Язык", "copiedToClipboard": "Скопировано в буфер обмена", "storagePermissionDenied": "Отказано в доступе к хранилищу", "selectedCategorizeWarning": "Это заменит все текущие настройки категорий для выбранных приложений", - "filterAPKsByRegEx": "Отфильтровать APK-файлы\n(регулярное выражение)", + "filterAPKsByRegEx": "Фильтровать APK-файлы\n(регулярное выражение)", "removeFromObtainium": "Удалить из Obtainium", "uninstallFromDevice": "Удалить с устройства", - "onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключенным определением версии", - "releaseDateAsVersion": "Дата выпуска вместо версии", - "releaseTitleAsVersion": "Используйте название релиза в качестве строки версии", - "releaseDateAsVersionExplanation": "Этот параметр следует использовать только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска", + "onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключённым определением версии", + "releaseDateAsVersion": "Использовать дату выпуска в качестве версии", + "releaseTitleAsVersion": "Использовать название выпуска в качестве версии", + "releaseDateAsVersionExplanation": "Эта настройка должна использоваться только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска", "changes": "Изменения", "releaseDate": "Дата выпуска", "importFromURLsInFile": "Импорт из файла URL-адресов (например: OPML)", @@ -220,56 +220,56 @@ "versionDetection": "Определение версии", "standardVersionDetection": "Стандартное", "groupByCategory": "Группировать по категориям", - "autoApkFilterByArch": "Попытаться отфильтровать APK-файлы по архитектуре процессора", - "autoLinkFilterByArch": "Попытайтесь отфильтровать ссылки по архитектуре процессора, если это возможно", + "autoApkFilterByArch": "Пытаться фильтровать APK по архитектуре процессора", + "autoLinkFilterByArch": "Пытаться фильтровать ссылки по архитектуре процессора, если это возможно", "overrideSource": "Переопределить источник", "dontShowAgain": "Не показывать снова", "dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях", "dontShowAPKOriginWarnings": "Не показывать предупреждения об отличающемся источнике APK-файлов", - "moveNonInstalledAppsToBottom": "Отображать неустановленные приложения внизу списка", + "moveNonInstalledAppsToBottom": "Показывать неустановленные приложения внизу списка", "gitlabPATLabel": "Персональный токен доступа GitLab", "about": "Описание", - "requiresCredentialsInSettings": "{}: Для этого требуются дополнительные учетные данные (в настройках)", + "requiresCredentialsInSettings": "{}: для этого требуются дополнительные учётные данные (в настройках)", "checkOnStart": "Проверять наличие обновлений при запуске", - "tryInferAppIdFromCode": "Попытаться определить ID приложения из исходного кода", - "removeOnExternalUninstall": "Автоматически убирать из списка удаленные извне приложения", + "tryInferAppIdFromCode": "Пытаться определить ID приложения из исходного кода", + "removeOnExternalUninstall": "Автоматически убирать из списка удалённые извне приложения", "pickHighestVersionCode": "Автовыбор актуальной версии кода APK", "checkUpdateOnDetailPage": "Проверять наличие обновлений при открытии страницы приложения", "disablePageTransitions": "Отключить анимацию перехода между страницами", "reversePageTransitions": "Реверс анимации перехода между страницами", "minStarCount": "Минимальное количество звёзд", "addInfoBelow": "Добавьте эту информацию ниже", - "addInfoInSettings": "Добавьте эту информацию в Настройки", - "githubSourceNote": "Используя ключ API можно обойти лимит запросов GitHub", + "addInfoInSettings": "Добавьте эту информацию в «Настройки»", + "githubSourceNote": "Используя ключ API, можно обойти ограничение запросов GitHub", "sortByLastLinkSegment": "Сортировать только по последнему сегменту ссылки", "filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску\n(регулярное выражение)", - "customLinkFilterRegex": "Пользовательский фильтр ссылок APK\n(регулярное выражение, по умолчанию: '.apk$')", + "customLinkFilterRegex": "Пользовательский фильтр ссылок APK\n(регулярное выражение, по умолчанию: «.apk$»)", "appsPossiblyUpdated": "Попытки обновления приложений", "appsPossiblyUpdatedNotifDescription": "Уведомление о возможных обновлениях одного или нескольких приложений в фоновом режиме", - "xWasPossiblyUpdatedToY": "{} возможно был обновлен до {}", + "xWasPossiblyUpdatedToY": "{} возможно был обновлён до {}", "enableBackgroundUpdates": "Включить обновления в фоне", "backgroundUpdateReqsExplanation": "Фоновые обновления могут быть возможны не для всех приложений", "backgroundUpdateLimitsExplanation": "Успешность фоновой установки можно определить только после открытия Obtainium", - "verifyLatestTag": "Проверять тег 'latest'", - "intermediateLinkRegex": "Фильтр для \"промежуточной\" ссылки для посещения", + "verifyLatestTag": "Проверять метку «latest»", + "intermediateLinkRegex": "Фильтр для «промежуточной» ссылки для посещения", "filterByLinkText": "Фильтрация ссылок по тексту ссылки", "intermediateLinkNotFound": "Промежуточная ссылка не найдена", "intermediateLink": "Промежуточная ссылка", "exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)", - "bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi", - "bgUpdatesWhileChargingOnly": "Отключение фоновых обновлений при отсутствии зарядки", - "autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода", - "versionExtractionRegEx": "Регулярное выражение для извлечения версии", - "trimVersionString": "Обрезка строки версии с помощью RegEx", - "matchGroupToUseForX": "Группа соответствия, которую следует использовать для \"{}\"", - "matchGroupToUse": "Выберите группу для использования", - "highlightTouchTargets": "Выделить менее очевидные элементы управления касанием", + "bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет подключения к Wi-Fi", + "bgUpdatesWhileChargingOnly": "Отключить фоновые обновления, если не идёт зарядка", + "autoSelectHighestVersionCode": "Автовыбор APK с актуальной версией кода", + "versionExtractionRegEx": "Извлечение версии\n(регулярное выражение)", + "trimVersionString": "Обрезка строки версии\n(регулярное выражение)", + "matchGroupToUseForX": "Группа соответствия для «{}»", + "matchGroupToUse": "Выбрать группу соответствия", + "highlightTouchTargets": "Выделять менее очевидные элементы управления касанием", "pickExportDir": "Выбрать каталог для экспорта", "autoExportOnChanges": "Автоэкспорт при изменениях", "includeSettings": "Включить настройки", "filterVersionsByRegEx": "Фильтровать версии по регулярному выражению", - "trySelectingSuggestedVersionCode": "Попробуйте выбрать предложенный код версии APK", - "dontSortReleasesList": "Сохранить порядок релизов от API", + "trySelectingSuggestedVersionCode": "Пробовать выбрать предложенный код версии APK", + "dontSortReleasesList": "Сохранить порядок выпусков от API", "reverseSort": "Обратная сортировка", "takeFirstLink": "Взять первую ссылку", "skipSort": "Пропустить сортировку", @@ -290,18 +290,18 @@ "onlyCheckInstalledOrTrackOnlyApps": "Проверять обновления только у установленных или отслеживаемых приложений", "supportFixedAPKURL": "Поддержка фиксированных URL-адресов APK", "selectX": "Выбрать {}", - "parallelDownloads": "Разрешить параллельные загрузки", + "parallelDownloads": "Использовать параллельные загрузки", "useShizuku": "Использовать Shizuku или Sui для установки", "shizukuBinderNotFound": "Совместимый сервис Shizuku не найден, возможно он не запущен", "shizukuOld": "Устаревшая версия Shizuku (<11), обновите", "shizukuOldAndroidWithADB": "Shizuku работает на Android < 8.1 с ADB, обновите Android или используйте Sui", - "shizukuPretendToBeGooglePlay": "Указать Google Play как источник установки (если используется Shizuku)", + "shizukuPretendToBeGooglePlay": "Указывать Google Play как источник установки (если используется Shizuku)", "useSystemFont": "Использовать системный шрифт", "useVersionCodeAsOSVersion": "Использовать код версии приложения как версию, обнаруженную ОС", "requestHeader": "Заголовок запроса", - "useLatestAssetDateAsReleaseDate": "Использовать последнюю загрузку ресурса в качестве даты выпуска", + "useLatestAssetDateAsReleaseDate": "Использовать последнюю загрузку объекта в качестве даты выпуска", "defaultPseudoVersioningMethod": "Метод псевдоверсионирования по умолчанию", - "partialAPKHash": "Частичный хэш APK", + "partialAPKHash": "Частичный хеш APK", "APKLinkHash": "Хеш ссылки APK", "directAPKLink": "Прямая ссылка на APK", "pseudoVersionInUse": "Используется псевдоверсия", @@ -309,17 +309,17 @@ "latest": "Последний", "invertRegEx": "Инвертировать регулярное выражение", "note": "Примечание", - "selfHostedNote": "Выпадающий список \"{}\" можно использовать для доступа к самостоятельно размещенным/настроенным экземплярам любого источника.", - "badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)", - "beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)", + "selfHostedNote": "Выпадающий список «{}» можно использовать для доступа к самостоятельно размещённым/настроенным экземплярам любого источника.", + "badDownload": "Не удалось разобрать APK (несовместимая или неполная загрузка)", + "beforeNewInstallsShareToAppVerifier": "Делиться новыми приложениями с AppVerifier (если доступно)", "appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.", "wiki": "Помощь/Вики", "crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)", - "crowdsourcedConfigsShort": "Конфиги приложений с помощью краудсорсинга", + "crowdsourcedConfigsShort": "Краудсорсинг конфигураций приложений", "allowInsecure": "Разрешить небезопасные HTTP-запросы", - "stayOneVersionBehind": "Не отставайте от последней версии", - "useFirstApkOfVersion": "Автоматический выбор первого из нескольких APK", - "refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой", + "stayOneVersionBehind": "Оставаться на одну версию ниже последней", + "useFirstApkOfVersion": "Автовыбор первого из нескольких APK", + "refreshBeforeDownload": "Обновлять информацию о приложении перед загрузкой", "tencentAppStore": "Tencent App Store", "coolApk": "CoolApk", "vivoAppStore": "vivo App Store (CN)", @@ -327,67 +327,80 @@ "smartname": "Имя (умное)", "sortMethod": "Метод сортировки", "welcome": "Добро пожаловать", - "documentationLinksNote": "На странице Obtainium GitHub, ссылка на которую приведена ниже, содержатся ссылки на видео, статьи, обсуждения и другие ресурсы, которые помогут вам понять, как пользоваться приложением.", - "batteryOptimizationNote": "Обратите внимание, что фоновая загрузка может работать более надежно, если отключить оптимизацию батареи ОС для Obtainium.", - "fileDeletionError": "Не удалось удалить файл (попробуйте удалить его вручную, а затем повторите попытку): \"{}\"", + "documentationLinksNote": "На странице Obtainium в GitHub, ссылка на которую приведена ниже, содержатся ссылки на видео, статьи, обсуждения и другие ресурсы, которые помогут вам понять, как пользоваться приложением.", + "batteryOptimizationNote": "Обратите внимание, что фоновая загрузка может работать более надёжно, если отключить оптимизацию батареи ОС для Obtainium.", + "fileDeletionError": "Не удалось удалить файл (попробуйте удалить его вручную, а затем повторите попытку): «{}»", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" }, "tooManyRequestsTryAgainInMinutes": { "one": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минуту", - "other": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минуты" + "few": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минуты", + "other": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минут" }, "bgUpdateGotErrorRetryInMinutes": { - "one": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет запланирована через {} минуту", - "other": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет запланирована через {} минуты" + "one": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет через {} минуту", + "few": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет через {} минуты", + "other": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет через {} минут" }, "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "В ходе проверки обновления в фоновом режиме было обнаружено {} обновление — Пользователю будет отправлено уведомление, если это необходимо", - "other": "В ходе проверки обновления в фоновом режиме было обнаружено {} обновлений — Пользователю будет отправлено уведомление, если это необходимо" + "one": "При проверке в фоновом режиме было обнаружено {} обновление — пользователь будет уведомлен по необходимости", + "one": "При проверке в фоновом режиме было обнаружено {} обновления — пользователь будет уведомлен по необходимости", + "other": "При проверке в фоновом режиме было обнаружено {} обновлений — пользователь будет уведомлен по необходимости" }, "apps": { "one": "{} приложение", + "few": "{} приложения", "other": "{} приложений" }, "url": { "one": "{} URL-адрес", - "other": "{} URL-адреса" + "few": "{} URL-адреса", + "other": "{} URL-адресов" }, "minute": { "one": "{} минута", - "other": "{} минуты" + "few": "{} минуты", + "other": "{} минут" }, "hour": { "one": "{} час", + "few": "{} часа", "other": "{} часов" }, "day": { "one": "{} день", + "few": "{} дня", "other": "{} дней" }, "clearedNLogsBeforeXAfterY": { "one": "Очищен {n} журнал (до = {before}, после = {after})", + "few": "Очищены {n} журнала (до = {before}, после = {after})", "other": "Очищено {n} журналов (до = {before}, после = {after})" }, "xAndNMoreUpdatesAvailable": { - "one": "У {} и еще 1 приложения есть обновление", + "one": "У {} и ещё 1 приложения есть обновление", "other": "У {} и ещё {} приложений есть обновления" }, "xAndNMoreUpdatesInstalled": { "one": "{} и ещё 1 приложение были обновлены", + "few": "{} и ещё {} приложения были обновлены", "other": "{} и ещё {} приложений были обновлены" }, "xAndNMoreUpdatesFailed": { "one": "Не удалось обновить {} и ещё 1 приложение", + "few": "Не удалось обновить {} и ещё {} приложения", "other": "Не удалось обновить {} и ещё {} приложений" }, "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} и ещё 1 приложение могли быть обновлены", + "few": "{} и ещё {} приложения могли быть обновлены", "other": "{} и ещё {} приложений могли быть обновлены" }, "apk": { - "one": "{} APK", - "other": "{} APKи" + "one": "{} APK-файл", + "few": "{} APK-файла", + "other": "{} APK-файлов" } } From cf088f15aed85b93e6e284c3ce872b43e2489a19 Mon Sep 17 00:00:00 2001 From: leywino Date: Sun, 22 Jun 2025 17:30:05 +0530 Subject: [PATCH 65/72] Create ml.json --- assets/translations/ml.json | 393 ++++++++++++++++++++++++++++++++++++ 1 file changed, 393 insertions(+) create mode 100644 assets/translations/ml.json diff --git a/assets/translations/ml.json b/assets/translations/ml.json new file mode 100644 index 0000000..0e12eae --- /dev/null +++ b/assets/translations/ml.json @@ -0,0 +1,393 @@ +{ + "invalidURLForSource": "ഒരു സാധുവായ {} ആപ്പ് URL അല്ല", + "noReleaseFound": "അനുയോജ്യമായ റിലീസ് കണ്ടെത്താനായില്ല", + "noVersionFound": "റിലീസ് പതിപ്പ് നിർണ്ണയിക്കാനായില്ല", + "urlMatchesNoSource": "URL അറിയപ്പെടുന്ന ഒരു ഉറവിടവുമായും യോജിക്കുന്നില്ല", + "cantInstallOlderVersion": "ആപ്പിന്റെ പഴയ പതിപ്പ് ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയില്ല.", + "appIdMismatch": "ഡൗൺലോഡ് ചെയ്ത പാക്കേജ് ഐഡി നിലവിലുള്ള ആപ്പ് ഐഡിയുമായി ചേരുന്നില്ല", + "functionNotImplemented": "ഈ ക്ലാസ് ഈ ഫംഗ്ഷൻ നടപ്പിലാക്കിയിട്ടില്ല", + "placeholder": "സ്ഥലസൂചകം", + "someErrors": "ചില പിശകുകൾ സംഭവിച്ചു", + "unexpectedError": "പ്രതീക്ഷിക്കാത്ത പിശക്", + "ok": "ശരി", + "and": "കൂടാതെ", + "githubPATLabel": "GitHub പേഴ്സണൽ ആക്സസ് ടോക്കൺ (നിരക്ക് പരിധി വർദ്ധിപ്പിക്കുന്നു)", + "includePrereleases": "പ്രീ-റിലീസുകൾ ഉൾപ്പെടുത്തുക", + "fallbackToOlderReleases": "പഴയ റിലീസുകളിലേക്ക് മടങ്ങുക", + "filterReleaseTitlesByRegEx": "റിലീസ് ശീർഷകങ്ങൾ റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിച്ച് ഫിൽട്ടർ ചെയ്യുക", + "invalidRegEx": "സാധുവായ റെഗുലർ എക്സ്പ്രഷൻ അല്ല", + "noDescription": "വിവരണം ലഭ്യമല്ല", + "cancel": "റദ്ദാക്കുക", + "continue": "തുടരുക", + "requiredInBrackets": "(ആവശ്യമാണ്)", + "dropdownNoOptsError": "തെറ്റ്: ഡ്രോപ്പ്ഡൗണിന് കുറഞ്ഞത് ഒരു ഓപ്ഷനെങ്കിലും ഉണ്ടായിരിക്കണം", + "colour": "നിറം", + "standard": "സാധാരണ", + "custom": "ഇഷ്‌ടാനുസൃതം", + "useMaterialYou": "മെറ്റീരിയൽ യൂ ഉപയോഗിക്കുക", + "githubStarredRepos": "GitHub സ്റ്റാർ ചെയ്ത റെപ്പോസിറ്ററികൾ", + "uname": "ഉപയോക്തൃനാമം", + "wrongArgNum": "തെറ്റായ എണ്ണം ആർഗ്യുമെന്റുകൾ നൽകി", + "xIsTrackOnly": "{} ട്രാക്ക്-മാത്രം ആണ്", + "source": "ഉറവിടം", + "app": "ആപ്പ്", + "appsFromSourceAreTrackOnly": "ഈ ഉറവിടത്തിൽ നിന്നുള്ള ആപ്പുകൾ 'ട്രാക്ക്-മാത്രം' ആണ്.", + "youPickedTrackOnly": "നിങ്ങൾ 'ട്രാക്ക്-മാത്രം' ഓപ്ഷൻ തിരഞ്ഞെടുത്തു.", + "trackOnlyAppDescription": "ആപ്പ് അപ്‌ഡേറ്റുകൾക്കായി ട്രാക്ക് ചെയ്യപ്പെടും, പക്ഷേ ഒബ്‌റ്റേനിയത്തിന് അത് ഡൗൺലോഡ് ചെയ്യാനോ ഇൻസ്റ്റാൾ ചെയ്യാനോ കഴിയില്ല.", + "cancelled": "റദ്ദാക്കി", + "appAlreadyAdded": "ആപ്പ് ഇതിനകം കൂട്ടിച്ചേർത്തിട്ടുണ്ട്", + "alreadyUpToDateQuestion": "ആപ്പ് ഇതിനകം ഏറ്റവും പുതിയ പതിപ്പിലാണോ?", + "addApp": "ആപ്പ് ചേർക്കുക", + "appSourceURL": "ആപ്പ് ഉറവിട URL", + "error": "പിശക്", + "add": "ചേർക്കുക", + "searchSomeSourcesLabel": "തിരയുക (ചില ഉറവിടങ്ങളിൽ മാത്രം)", + "search": "തിരയുക", + "additionalOptsFor": "{} നായുള്ള അധിക ഓപ്ഷനുകൾ", + "supportedSources": "പിന്തുണയ്ക്കുന്ന ഉറവിടങ്ങൾ", + "trackOnlyInBrackets": "(ട്രാക്ക്-മാത്രം)", + "searchableInBrackets": "(തിരയാവുന്നത്)", + "appsString": "ആപ്പുകൾ", + "noApps": "ആപ്പുകളൊന്നുമില്ല", + "noAppsForFilter": "ഈ ഫിൽട്ടറിനായി ആപ്പുകളൊന്നുമില്ല", + "byX": "{} വഴി", + "percentProgress": "പുരോഗതി: {}%", + "pleaseWait": "ദയവായി കാത്തിരിക്കുക", + "updateAvailable": "അപ്‌ഡേറ്റ് ലഭ്യമാണ്", + "notInstalled": "ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല", + "pseudoVersion": "സ്യൂഡോ-പതിപ്പ്", + "selectAll": "എല്ലാം തിരഞ്ഞെടുക്കുക", + "deselectX": "{} തിരഞ്ഞെടുക്കൽ റദ്ദാക്കുക", + "xWillBeRemovedButRemainInstalled": "{} ഒബ്‌റ്റേനിയത്തിൽ നിന്ന് നീക്കം ചെയ്യപ്പെടും, പക്ഷേ ഉപകരണത്തിൽ ഇൻസ്റ്റാൾ ചെയ്ത നിലയിൽ തുടരും.", + "removeSelectedAppsQuestion": "തിരഞ്ഞെടുത്ത ആപ്പുകൾ നീക്കം ചെയ്യണോ?", + "removeSelectedApps": "തിരഞ്ഞെടുത്ത ആപ്പുകൾ നീക്കം ചെയ്യുക", + "updateX": "{} അപ്‌ഡേറ്റ് ചെയ്യുക", + "installX": "{} ഇൻസ്റ്റാൾ ചെയ്യുക", + "markXTrackOnlyAsUpdated": "{}\n(ട്രാക്ക്-മാത്രം)\nഅപ്‌ഡേറ്റ് ചെയ്തതായി അടയാളപ്പെടുത്തുക", + "changeX": "{} മാറ്റുക", + "installUpdateApps": "ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക/അപ്‌ഡേറ്റ് ചെയ്യുക", + "installUpdateSelectedApps": "തിരഞ്ഞെടുത്ത ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക/അപ്‌ഡേറ്റ് ചെയ്യുക", + "markXSelectedAppsAsUpdated": "{} തിരഞ്ഞെടുത്ത ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്തതായി അടയാളപ്പെടുത്തണോ?", + "no": "ഇല്ല", + "yes": "അതെ", + "markSelectedAppsUpdated": "തിരഞ്ഞെടുത്ത ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്തതായി അടയാളപ്പെടുത്തുക", + "pinToTop": "മുകളിൽ പിൻ ചെയ്യുക", + "unpinFromTop": "മുകളിൽ നിന്ന് അൺപിൻ ചെയ്യുക", + "resetInstallStatusForSelectedAppsQuestion": "തിരഞ്ഞെടുത്ത ആപ്പുകളുടെ ഇൻസ്റ്റാൾ സ്റ്റാറ്റസ് റീസെറ്റ് ചെയ്യണോ?", + "installStatusOfXWillBeResetExplanation": "തിരഞ്ഞെടുത്ത ഏതെങ്കിലും ആപ്പുകളുടെ ഇൻസ്റ്റാൾ സ്റ്റാറ്റസ് റീസെറ്റ് ചെയ്യപ്പെടും.\n\nപരാജയപ്പെട്ട അപ്‌ഡേറ്റുകളോ മറ്റ് പ്രശ്നങ്ങളോ കാരണം ഒബ്‌റ്റേനിയത്തിൽ കാണിക്കുന്ന ആപ്പ് പതിപ്പ് തെറ്റായിരിക്കുമ്പോൾ ഇത് സഹായകമാകും.", + "customLinkMessage": "ഈ ലിങ്കുകൾ ഒബ്‌റ്റേനിയം ഇൻസ്റ്റാൾ ചെയ്ത ഉപകരണങ്ങളിൽ പ്രവർത്തിക്കും", + "shareAppConfigLinks": "ആപ്പ് കോൺഫിഗറേഷൻ HTML ലിങ്കായി പങ്കിടുക", + "shareSelectedAppURLs": "തിരഞ്ഞെടുത്ത ആപ്പ് URL-കൾ പങ്കിടുക", + "resetInstallStatus": "ഇൻസ്റ്റാൾ സ്റ്റാറ്റസ് റീസെറ്റ് ചെയ്യുക", + "more": "കൂടുതൽ", + "removeOutdatedFilter": "കാലഹരണപ്പെട്ട ആപ്പ് ഫിൽട്ടർ നീക്കം ചെയ്യുക", + "showOutdatedOnly": "കാലഹരണപ്പെട്ട ആപ്പുകൾ മാത്രം കാണിക്കുക", + "filter": "ഫിൽട്ടർ", + "filterApps": "ആപ്പുകൾ ഫിൽട്ടർ ചെയ്യുക", + "appName": "ആപ്പിന്റെ പേര്", + "author": "ഡെവലപ്പർ", + "upToDateApps": "ഏറ്റവും പുതിയ പതിപ്പിലുള്ള ആപ്പുകൾ", + "nonInstalledApps": "ഇൻസ്റ്റാൾ ചെയ്യാത്ത ആപ്പുകൾ", + "importExport": "ഇംപോർട്ട്/എക്സ്പോർട്ട്", + "settings": "ക്രമീകരണങ്ങൾ", + "exportedTo": "{} ലേക്ക് എക്സ്പോർട്ട് ചെയ്തു", + "obtainiumExport": "ഒബ്‌റ്റേനിയം എക്സ്പോർട്ട്", + "invalidInput": "തെറ്റായ ഇൻപുട്ട്", + "importedX": "{} ഇംപോർട്ട് ചെയ്തു", + "obtainiumImport": "ഒബ്‌റ്റേനിയം ഇംപോർട്ട്", + "importFromURLList": "URL ലിസ്റ്റിൽ നിന്ന് ഇംപോർട്ട് ചെയ്യുക", + "searchQuery": "തിരയൽ ചോദ്യം", + "appURLList": "ആപ്പ് URL ലിസ്റ്റ്", + "line": "വരി", + "searchX": "{} തിരയുക", + "noResults": "ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല", + "importX": "{} ഇംപോർട്ട് ചെയ്യുക", + "importedAppsIdDisclaimer": "ഇംപോർട്ട് ചെയ്ത ആപ്പുകൾ \"ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല\" എന്ന് തെറ്റായി കാണിച്ചേക്കാം.\nഇത് ശരിയാക്കാൻ, ഒബ്‌റ്റേനിയം വഴി അവ വീണ്ടും ഇൻസ്റ്റാൾ ചെയ്യുക.\nഇത് ആപ്പ് ഡാറ്റയെ ബാധിക്കില്ല.\n\nURL, മൂന്നാം കക്ഷി ഇംപോർട്ട് രീതികളെ മാത്രം ബാധിക്കുന്നു.", + "importErrors": "ഇംപോർട്ട് പിശകുകൾ", + "importedXOfYApps": "{} ആപ്പുകളിൽ {} എണ്ണം ഇംപോർട്ട് ചെയ്തു.", + "followingURLsHadErrors": "ഇനിപ്പറയുന്ന URL-കളിൽ പിശകുകൾ ഉണ്ടായിരുന്നു:", + "selectURL": "URL തിരഞ്ഞെടുക്കുക", + "selectURLs": "URL-കൾ തിരഞ്ഞെടുക്കുക", + "pick": "തിരഞ്ഞെടുക്കുക", + "theme": "തീം", + "dark": "ഇരുണ്ട", + "light": "ഇളം", + "followSystem": "സിസ്റ്റം പിന്തുടരുക", + "followSystemThemeExplanation": "സിസ്റ്റം തീം പിന്തുടരുന്നത് തേർഡ് പാർട്ടി ആപ്ലിക്കേഷനുകൾ ഉപയോഗിച്ച് മാത്രമേ സാധ്യമാകൂ", + "useBlackTheme": "തനി കറുപ്പ് തീം ഉപയോഗിക്കുക", + "appSortBy": "ആപ്പ് അടുക്കേണ്ട രീതി", + "authorName": "ഡെവലപ്പർ/പേര്", + "nameAuthor": "പേര്/ഡെവലപ്പർ", + "asAdded": "ചേർത്ത ക്രമത്തിൽ", + "appSortOrder": "ആപ്പ് അടുക്കേണ്ട ക്രമം", + "ascending": "ആരോഹണ ക്രമത്തിൽ", + "descending": "അവരോഹണ ക്രമത്തിൽ", + "bgUpdateCheckInterval": "ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റ് പരിശോധന ഇടവേള", + "neverManualOnly": "ഒരിക്കലുമില്ല - സ്വമേധയാ മാത്രം", + "appearance": "രൂപം", + "showWebInAppView": "ആപ്പ് കാഴ്ചയിൽ ഉറവിട വെബ്പേജ് കാണിക്കുക", + "pinUpdates": "അപ്‌ഡേറ്റുകൾ ആപ്പ് കാഴ്ചയുടെ മുകളിൽ പിൻ ചെയ്യുക", + "updates": "അപ്‌ഡേറ്റുകൾ", + "sourceSpecific": "ഉറവിടം അടിസ്ഥാനമാക്കി", + "appSource": "ആപ്പ് ഉറവിടം", + "noLogs": "ലോഗുകളൊന്നുമില്ല", + "appLogs": "ആപ്പ് ലോഗുകൾ", + "close": "അടയ്ക്കുക", + "share": "പങ്കിടുക", + "appNotFound": "ആപ്പ് കണ്ടെത്തിയില്ല", + "obtainiumExportHyphenatedLowercase": "ഒബ്‌റ്റേനിയം-എക്സ്പോർട്ട്", + "pickAnAPK": "ഒരു APK തിരഞ്ഞെടുക്കുക", + "appHasMoreThanOnePackage": "{}-ന് ഒന്നിൽ കൂടുതൽ പാക്കേജുകൾ ഉണ്ട്:", + "deviceSupportsXArch": "നിങ്ങളുടെ ഉപകരണം {} CPU ആർക്കിടെക്ചറിനെ പിന്തുണയ്ക്കുന്നു.", + "deviceSupportsFollowingArchs": "നിങ്ങളുടെ ഉപകരണം ഇനിപ്പറയുന്ന CPU ആർക്കിടെക്ചറുകളെ പിന്തുണയ്ക്കുന്നു:", + "warning": "മുന്നറിയിപ്പ്", + "sourceIsXButPackageFromYPrompt": "ആപ്പ് ഉറവിടം '{}' ആണ്, പക്ഷേ റിലീസ് പാക്കേജ് '{}'-ൽ നിന്നാണ് വരുന്നത്. തുടരണോ?", + "updatesAvailable": "അപ്‌ഡേറ്റുകൾ ലഭ്യമാണ്", + "updatesAvailableNotifDescription": "ഒബ്‌റ്റേനിയം ട്രാക്ക് ചെയ്യുന്ന ഒന്നോ അതിലധികമോ ആപ്പുകൾക്ക് അപ്‌ഡേറ്റുകൾ ലഭ്യമാണെന്ന് ഉപയോക്താവിനെ അറിയിക്കുന്നു", + "noNewUpdates": "പുതിയ അപ്‌ഡേറ്റുകളൊന്നുമില്ല.", + "xHasAnUpdate": "{}-ന് ഒരു അപ്‌ഡേറ്റ് ഉണ്ട്.", + "appsUpdated": "ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്തു", + "appsNotUpdated": "ആപ്ലിക്കേഷനുകൾ അപ്‌ഡേറ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു", + "appsUpdatedNotifDescription": "ഒന്നോ അതിലധികമോ ആപ്പുകളിലേക്കുള്ള അപ്‌ഡേറ്റുകൾ ബാക്ക്ഗ്രൗണ്ടിൽ പ്രയോഗിച്ചു എന്ന് ഉപയോക്താവിനെ അറിയിക്കുന്നു", + "xWasUpdatedToY": "{} {} ലേക്ക് അപ്‌ഡേറ്റ് ചെയ്തു.", + "xWasNotUpdatedToY": "{} {} ലേക്ക് അപ്‌ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു.", + "errorCheckingUpdates": "അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുന്നതിൽ പിശക്", + "errorCheckingUpdatesNotifDescription": "ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റ് പരിശോധന പരാജയപ്പെടുമ്പോൾ കാണിക്കുന്ന അറിയിപ്പ്", + "appsRemoved": "ആപ്പുകൾ നീക്കം ചെയ്തു", + "appsRemovedNotifDescription": "ഒന്നോ അതിലധികമോ ആപ്പുകൾ ലോഡ് ചെയ്യുന്നതിൽ പിശകുകൾ കാരണം നീക്കം ചെയ്തു എന്ന് ഉപയോക്താവിനെ അറിയിക്കുന്നു", + "xWasRemovedDueToErrorY": "{} ഈ പിശക് കാരണം നീക്കം ചെയ്തു: {}", + "completeAppInstallation": "ആപ്പ് ഇൻസ്റ്റാളേഷൻ പൂർത്തിയാക്കുക", + "obtainiumMustBeOpenToInstallApps": "ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ ഒബ്‌റ്റേനിയം തുറന്നിരിക്കണം", + "completeAppInstallationNotifDescription": "ഒരു ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യുന്നത് പൂർത്തിയാക്കാൻ ഒബ്‌റ്റേനിയത്തിലേക്ക് മടങ്ങാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടുന്നു", + "checkingForUpdates": "അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുന്നു", + "checkingForUpdatesNotifDescription": "അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുമ്പോൾ ദൃശ്യമാകുന്ന താൽക്കാലിക അറിയിപ്പ്", + "pleaseAllowInstallPerm": "ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ ഒബ്‌റ്റേനിയത്തിന് അനുമതി നൽകുക", + "trackOnly": "ട്രാക്ക്-മാത്രം", + "errorWithHttpStatusCode": "പിശക് {}", + "versionCorrectionDisabled": "പതിപ്പ് തിരുത്തൽ പ്രവർത്തനരഹിതമാക്കി (പ്ലഗിൻ പ്രവർത്തിക്കുന്നതായി തോന്നുന്നില്ല)", + "unknown": "അജ്ഞാതം", + "none": "ഒന്നുമില്ല", + "never": "ഒരിക്കലുമില്ല", + "latestVersionX": "ഏറ്റവും പുതിയത്: {}", + "installedVersionX": "ഇൻസ്റ്റാൾ ചെയ്തത്: {}", + "lastUpdateCheckX": "അവസാന അപ്‌ഡേറ്റ് പരിശോധന: {}", + "remove": "നീക്കം ചെയ്യുക", + "yesMarkUpdated": "അതെ, അപ്‌ഡേറ്റ് ചെയ്തതായി അടയാളപ്പെടുത്തുക", + "fdroid": "എഫ്-ഡ്രോയിഡ് ഒഫീഷ്യൽ", + "appIdOrName": "ആപ്പ് ഐഡി അല്ലെങ്കിൽ പേര്", + "appId": "ആപ്പ് ഐഡി", + "appWithIdOrNameNotFound": "ആ ഐഡിയിലോ പേരിലോ ആപ്പുകളൊന്നും കണ്ടെത്തിയില്ല", + "reposHaveMultipleApps": "റെപ്പോകളിൽ ഒന്നിലധികം ആപ്പുകൾ അടങ്ങിയിരിക്കാം", + "fdroidThirdPartyRepo": "എഫ്-ഡ്രോയിഡ് തേർഡ് പാർട്ടി റെപ്പോ", + "install": "ഇൻസ്റ്റാൾ ചെയ്യുക", + "markInstalled": "ഇൻസ്റ്റാൾ ചെയ്തതായി അടയാളപ്പെടുത്തുക", + "update": "അപ്‌ഡേറ്റ് ചെയ്യുക", + "markUpdated": "അപ്‌ഡേറ്റ് ചെയ്തതായി അടയാളപ്പെടുത്തുക", + "additionalOptions": "കൂടുതൽ ഓപ്ഷനുകൾ", + "disableVersionDetection": "പതിപ്പ് കണ്ടെത്തൽ പ്രവർത്തനരഹിതമാക്കുക", + "noVersionDetectionExplanation": "പതിപ്പ് കണ്ടെത്തൽ ശരിയായി പ്രവർത്തിക്കാത്ത ആപ്പുകൾക്ക് മാത്രമേ ഈ ഓപ്ഷൻ ഉപയോഗിക്കാവൂ.", + "downloadingX": "{} ഡൗൺലോഡ് ചെയ്യുന്നു", + "downloadX": "{} ഡൗൺലോഡ് ചെയ്യുക", + "downloadedX": "{} ഡൗൺലോഡ് ചെയ്തു", + "releaseAsset": "റിലീസ് അസറ്റ്", + "downloadNotifDescription": "ഒരു ആപ്പ് ഡൗൺലോഡ് ചെയ്യുന്നതിലെ പുരോഗതി ഉപയോക്താവിനെ അറിയിക്കുന്നു", + "noAPKFound": "APK കണ്ടെത്തിയില്ല", + "noVersionDetection": "പതിപ്പ് കണ്ടെത്തൽ ഇല്ല", + "categorize": "വിഭാഗീകരിക്കുക", + "categories": "വിഭാഗങ്ങൾ", + "category": "വിഭാഗം", + "noCategory": "വിഭാഗമൊന്നുമില്ല", + "noCategories": "വിഭാഗങ്ങളൊന്നുമില്ല", + "deleteCategoriesQuestion": "വിഭാഗങ്ങൾ ഇല്ലാതാക്കണോ?", + "categoryDeleteWarning": "ഇല്ലാതാക്കിയ വിഭാഗങ്ങളിലെ എല്ലാ ആപ്പുകളും വിഭാഗരഹിതമായി ക്രമീകരിക്കും.", + "addCategory": "വിഭാഗം ചേർക്കുക", + "label": "ലേബൽ", + "language": "ഭാഷ", + "copiedToClipboard": "ക്ലിപ്ബോർഡിലേക്ക് പകർത്തി", + "storagePermissionDenied": "സ്റ്റോറേജ് അനുമതി നിഷേധിച്ചു", + "selectedCategorizeWarning": "ഇത് തിരഞ്ഞെടുത്ത ആപ്പുകൾക്കായി നിലവിലുള്ള ഏതൊരു വിഭാഗ ക്രമീകരണങ്ങളെയും മാറ്റിസ്ഥാപിക്കും.", + "filterAPKsByRegEx": "റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിച്ച് APK-കൾ ഫിൽട്ടർ ചെയ്യുക", + "removeFromObtainium": "ഒബ്‌റ്റേനിയത്തിൽ നിന്ന് നീക്കം ചെയ്യുക", + "uninstallFromDevice": "ഉപകരണത്തിൽ നിന്ന് അൺഇൻസ്റ്റാൾ ചെയ്യുക", + "onlyWorksWithNonVersionDetectApps": "പതിപ്പ് കണ്ടെത്തൽ പ്രവർത്തനരഹിതമാക്കിയ ആപ്പുകൾക്ക് മാത്രമേ ഇത് പ്രവർത്തിക്കൂ.", + "releaseDateAsVersion": "റിലീസ് തീയതി പതിപ്പ് സ്ട്രിംഗായി ഉപയോഗിക്കുക", + "releaseTitleAsVersion": "റിലീസ് ശീർഷകം പതിപ്പ് സ്ട്രിംഗായി ഉപയോഗിക്കുക", + "releaseDateAsVersionExplanation": "പതിപ്പ് കണ്ടെത്തൽ ശരിയായി പ്രവർത്തിക്കാത്തതും എന്നാൽ റിലീസ് തീയതി ലഭ്യമായതുമായ ആപ്പുകൾക്ക് മാത്രമേ ഈ ഓപ്ഷൻ ഉപയോഗിക്കാവൂ.", + "changes": "മാറ്റങ്ങൾ", + "releaseDate": "റിലീസ് തീയതി", + "importFromURLsInFile": "ഫയലിലെ URL-കളിൽ നിന്ന് ഇംപോർട്ട് ചെയ്യുക (OPML പോലെ)", + "versionDetectionExplanation": "കണ്ടെത്തിയ പതിപ്പ് സ്ട്രിംഗ് OS-ൽ നിന്ന് കണ്ടെത്തിയ പതിപ്പുമായി പൊരുത്തപ്പെടുത്തുക", + "versionDetection": "പതിപ്പ് കണ്ടെത്തൽ", + "standardVersionDetection": "സാധാരണ പതിപ്പ് കണ്ടെത്തൽ", + "groupByCategory": "വിഭാഗം തിരിച്ച് ഗ്രൂപ്പ് ചെയ്യുക", + "autoApkFilterByArch": "സാധ്യമെങ്കിൽ CPU ആർക്കിടെക്ചർ അനുസരിച്ച് APK-കൾ ഫിൽട്ടർ ചെയ്യാൻ ശ്രമിക്കുക", + "autoLinkFilterByArch": "സാധ്യമെങ്കിൽ CPU ആർക്കിടെക്ചർ അനുസരിച്ച് ലിങ്കുകൾ ഫിൽട്ടർ ചെയ്യാൻ ശ്രമിക്കുക", + "overrideSource": "ഉറവിടം അസാധുവാക്കുക", + "dontShowAgain": "ഇത് വീണ്ടും കാണിക്കരുത്", + "dontShowTrackOnlyWarnings": "'ട്രാക്ക്-മാത്രം' മുന്നറിയിപ്പുകൾ കാണിക്കരുത്", + "dontShowAPKOriginWarnings": "APK ഉറവിട മുന്നറിയിപ്പുകൾ കാണിക്കരുത്", + "moveNonInstalledAppsToBottom": "ഇൻസ്റ്റാൾ ചെയ്യാത്ത ആപ്പുകൾ ആപ്പ് കാഴ്ചയുടെ താഴേക്ക് മാറ്റുക", + "gitlabPATLabel": "GitLab പേഴ്സണൽ ആക്സസ് ടോക്കൺ", + "about": "വിവരങ്ങൾ", + "requiresCredentialsInSettings": "{}-ന് അധിക ക്രെഡൻഷ്യലുകൾ ആവശ്യമാണ് (ക്രമീകരണങ്ങളിൽ)", + "checkOnStart": "തുടങ്ങുമ്പോൾ അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുക", + "tryInferAppIdFromCode": "സോഴ്സ് കോഡിൽ നിന്ന് ആപ്പ് ഐഡി അനുമാനിക്കാൻ ശ്രമിക്കുക", + "removeOnExternalUninstall": "പുറത്ത് നിന്ന് അൺഇൻസ്റ്റാൾ ചെയ്ത ആപ്പുകൾ സ്വയമേവ നീക്കം ചെയ്യുക", + "pickHighestVersionCode": "ഏറ്റവും ഉയർന്ന പതിപ്പ് കോഡ് APK സ്വയമേവ തിരഞ്ഞെടുക്കുക", + "checkUpdateOnDetailPage": "ഒരു ആപ്പ് വിശദാംശ പേജ് തുറക്കുമ്പോൾ അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുക", + "disablePageTransitions": "പേജ് ട്രാൻസിഷൻ ആനിമേഷനുകൾ പ്രവർത്തനരഹിതമാക്കുക", + "reversePageTransitions": "പേജ് ട്രാൻസിഷൻ ആനിമേഷനുകൾ വിപരീതമാക്കുക", + "minStarCount": "കുറഞ്ഞ നക്ഷത്രങ്ങളുടെ എണ്ണം", + "addInfoBelow": "ഈ വിവരങ്ങൾ താഴെ ചേർക്കുക.", + "addInfoInSettings": "ഈ വിവരങ്ങൾ ക്രമീകരണങ്ങളിൽ ചേർക്കുക.", + "githubSourceNote": "API കീ ഉപയോഗിച്ച് GitHub നിരക്ക് പരിധി ഒഴിവാക്കാം.", + "sortByLastLinkSegment": "ലിങ്കിന്റെ അവസാന ഭാഗം മാത്രം ഉപയോഗിച്ച് അടുക്കുക", + "filterReleaseNotesByRegEx": "റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിച്ച് റിലീസ് നോട്ടുകൾ ഫിൽട്ടർ ചെയ്യുക", + "customLinkFilterRegex": "റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിച്ചുള്ള കസ്റ്റം APK ലിങ്ക് ഫിൽട്ടർ (സ്ഥിരസ്ഥിതി '.apk$')", + "appsPossiblyUpdated": "ആപ്പ് അപ്‌ഡേറ്റുകൾ ശ്രമിച്ചു", + "appsPossiblyUpdatedNotifDescription": "ഒന്നോ അതിലധികമോ ആപ്പുകളിലേക്കുള്ള അപ്‌ഡേറ്റുകൾ ബാക്ക്ഗ്രൗണ്ടിൽ പ്രയോഗിക്കാൻ സാധ്യതയുണ്ടെന്ന് ഉപയോക്താവിനെ അറിയിക്കുന്നു", + "xWasPossiblyUpdatedToY": "{} {} ലേക്ക് അപ്‌ഡേറ്റ് ചെയ്തിരിക്കാം.", + "enableBackgroundUpdates": "ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റുകൾ പ്രവർത്തനക്ഷമമാക്കുക", + "backgroundUpdateReqsExplanation": "എല്ലാ ആപ്പുകൾക്കും ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റുകൾ സാധ്യമായെന്ന് വരില്ല.", + "backgroundUpdateLimitsExplanation": "ബാക്ക്ഗ്രൗണ്ട് ഇൻസ്റ്റാളിന്റെ വിജയം ഒബ്‌റ്റേനിയം തുറക്കുമ്പോൾ മാത്രമേ നിർണ്ണയിക്കാൻ കഴിയൂ.", + "verifyLatestTag": "'ഏറ്റവും പുതിയ' ടാഗ് പരിശോധിക്കുക", + "intermediateLinkRegex": "സന്ദർശിക്കാൻ ഒരു 'ഇന്റർമീഡിയറ്റ്' ലിങ്കിനായി ഫിൽട്ടർ ചെയ്യുക", + "filterByLinkText": "ലിങ്ക് ടെക്സ്റ്റ് ഉപയോഗിച്ച് ലിങ്കുകൾ ഫിൽട്ടർ ചെയ്യുക", + "intermediateLinkNotFound": "ഇന്റർമീഡിയറ്റ് ലിങ്ക് കണ്ടെത്തിയില്ല", + "intermediateLink": "ഇന്റർമീഡിയറ്റ് ലിങ്ക്", + "exemptFromBackgroundUpdates": "ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റുകളിൽ നിന്ന് ഒഴിവാക്കുക (പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ)", + "bgUpdatesOnWiFiOnly": "വൈഫൈയിൽ അല്ലാത്തപ്പോൾ ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റുകൾ പ്രവർത്തനരഹിതമാക്കുക", + "bgUpdatesWhileChargingOnly": "ചാർജ് ചെയ്യാത്തപ്പോൾ ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റുകൾ പ്രവർത്തനരഹിതമാക്കുക", + "autoSelectHighestVersionCode": "ഏറ്റവും ഉയർന്ന versionCode APK സ്വയമേവ തിരഞ്ഞെടുക്കുക", + "versionExtractionRegEx": "പതിപ്പ് സ്ട്രിംഗ് വേർതിരിച്ചെടുക്കുന്നതിനുള്ള റെഗുലർ എക്സ്പ്രഷൻ", + "trimVersionString": "റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിച്ച് പതിപ്പ് സ്ട്രിംഗ് ട്രിം ചെയ്യുക", + "matchGroupToUseForX": "\"{}\" നായി ഉപയോഗിക്കേണ്ട ഗ്രൂപ്പ് മാച്ച് ചെയ്യുക", + "matchGroupToUse": "പതിപ്പ് സ്ട്രിംഗ് വേർതിരിച്ചെടുക്കുന്നതിനുള്ള റെഗുലർ എക്സ്പ്രഷനായി ഉപയോഗിക്കേണ്ട ഗ്രൂപ്പ് മാച്ച് ചെയ്യുക", + "highlightTouchTargets": "കുറഞ്ഞ വ്യക്തതയുള്ള ടച്ച് ടാർഗെറ്റുകൾ ഹൈലൈറ്റ് ചെയ്യുക", + "pickExportDir": "എക്സ്പോർട്ട് ഡയറക്ടറി തിരഞ്ഞെടുക്കുക", + "autoExportOnChanges": "മാറ്റങ്ങൾ വരുമ്പോൾ സ്വയമേവ എക്സ്പോർട്ട് ചെയ്യുക", + "includeSettings": "ക്രമീകരണങ്ങൾ ഉൾപ്പെടുത്തുക", + "filterVersionsByRegEx": "റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിച്ച് പതിപ്പുകൾ ഫിൽട്ടർ ചെയ്യുക", + "trySelectingSuggestedVersionCode": "നിർദ്ദേശിച്ച versionCode APK തിരഞ്ഞെടുക്കാൻ ശ്രമിക്കുക", + "dontSortReleasesList": "API-യിൽ നിന്നുള്ള റിലീസ് ഓർഡർ നിലനിർത്തുക", + "reverseSort": "റിവേഴ്സ് സോർട്ടിംഗ്", + "takeFirstLink": "ആദ്യ ലിങ്ക് എടുക്കുക", + "skipSort": "സോർട്ടിംഗ് ഒഴിവാക്കുക", + "debugMenu": "ഡീബഗ് മെനു", + "bgTaskStarted": "ബാക്ക്ഗ്രൗണ്ട് ടാസ്ക് ആരംഭിച്ചു - ലോഗുകൾ പരിശോധിക്കുക.", + "runBgCheckNow": "ഇപ്പോൾ ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റ് പരിശോധന പ്രവർത്തിപ്പിക്കുക", + "versionExtractWholePage": "മുഴുവൻ പേജിലും പതിപ്പ് സ്ട്രിംഗ് വേർതിരിച്ചെടുക്കുന്ന റെഗുലർ എക്സ്പ്രഷൻ പ്രയോഗിക്കുക", + "installing": "ഇൻസ്റ്റാൾ ചെയ്യുന്നു", + "skipUpdateNotifications": "അപ്‌ഡേറ്റ് അറിയിപ്പുകൾ ഒഴിവാക്കുക", + "updatesAvailableNotifChannel": "അപ്‌ഡേറ്റുകൾ ലഭ്യമാണ്", + "appsUpdatedNotifChannel": "ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്തു", + "appsPossiblyUpdatedNotifChannel": "ആപ്പ് അപ്‌ഡേറ്റുകൾ ശ്രമിച്ചു", + "errorCheckingUpdatesNotifChannel": "അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുന്നതിൽ പിശക്", + "appsRemovedNotifChannel": "ആപ്പുകൾ നീക്കം ചെയ്തു", + "downloadingXNotifChannel": "{} ഡൗൺലോഡ് ചെയ്യുന്നു", + "completeAppInstallationNotifChannel": "ആപ്പ് ഇൻസ്റ്റാളേഷൻ പൂർത്തിയാക്കുക", + "checkingForUpdatesNotifChannel": "അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുന്നു", + "onlyCheckInstalledOrTrackOnlyApps": "ഇൻസ്റ്റാൾ ചെയ്തതും ട്രാക്ക്-മാത്രം ആപ്പുകളും മാത്രം അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുക", + "supportFixedAPKURL": "സ്ഥിരമായ APK URL-കളെ പിന്തുണയ്ക്കുക", + "selectX": "{} തിരഞ്ഞെടുക്കുക", + "parallelDownloads": "പാരലൽ ഡൗൺലോഡുകൾ അനുവദിക്കുക", + "useShizuku": "ഇൻസ്റ്റാൾ ചെയ്യാൻ ഷിസുകു അല്ലെങ്കിൽ സ്യൂ ഉപയോഗിക്കുക", + "shizukuBinderNotFound": "ഷിസുകു സേവനം പ്രവർത്തിക്കുന്നില്ല", + "shizukuOld": "പഴയ ഷിസുകു പതിപ്പ് (<11) - അത് അപ്‌ഡേറ്റ് ചെയ്യുക", + "shizukuOldAndroidWithADB": "ആൻഡ്രോയിഡ് < 8.1 ഉള്ള ഷിസുകു ADB ഉപയോഗിച്ച് പ്രവർത്തിക്കുന്നു - ആൻഡ്രോയിഡ് അപ്‌ഡേറ്റ് ചെയ്യുക അല്ലെങ്കിൽ പകരം സ്യൂ ഉപയോഗിക്കുക", + "shizukuPretendToBeGooglePlay": "Google Play ഇൻസ്റ്റാളേഷൻ ഉറവിടമായി സജ്ജമാക്കുക (ഷിസുകു ഉപയോഗിക്കുകയാണെങ്കിൽ)", + "useSystemFont": "സിസ്റ്റം ഫോണ്ട് ഉപയോഗിക്കുക", + "useVersionCodeAsOSVersion": "ആപ്പ് versionCode OS-ൽ കണ്ടെത്തിയ പതിപ്പായി ഉപയോഗിക്കുക", + "requestHeader": "അഭ്യർത്ഥന തലക്കെട്ട്", + "useLatestAssetDateAsReleaseDate": "ഏറ്റവും പുതിയ അസറ്റ് അപ്‌ലോഡ് റിലീസ് തീയതിയായി ഉപയോഗിക്കുക", + "defaultPseudoVersioningMethod": "സ്ഥിരസ്ഥിതി സ്യൂഡോ-പതിപ്പ് രീതി", + "partialAPKHash": "ഭാഗിക APK ഹാഷ്", + "APKLinkHash": "APK ലിങ്ക് ഹാഷ്", + "directAPKLink": "നേരിട്ടുള്ള APK ലിങ്ക്", + "pseudoVersionInUse": "ഒരു സ്യൂഡോ-പതിപ്പ് ഉപയോഗത്തിലുണ്ട്", + "installed": "ഇൻസ്റ്റാൾ ചെയ്തത്", + "latest": "ഏറ്റവും പുതിയത്", + "invertRegEx": "റെഗുലർ എക്സ്പ്രഷൻ വിപരീതമാക്കുക", + "note": "ശ്രദ്ധിക്കുക", + "selfHostedNote": "ഏത് ഉറവിടത്തിന്റെയും സെൽഫ്-ഹോസ്റ്റ് ചെയ്ത/കസ്റ്റം ഇൻസ്റ്റൻസുകളിലേക്ക് എത്താൻ \"{}\" ഡ്രോപ്പ്ഡൗൺ ഉപയോഗിക്കാം.", + "badDownload": "APK പാഴ്സ് ചെയ്യാൻ കഴിഞ്ഞില്ല (അനുയോജ്യമല്ലാത്തതോ ഭാഗികമായ ഡൗൺലോഡോ)", + "beforeNewInstallsShareToAppVerifier": "പുതിയ ആപ്പുകൾ AppVerifier-ലേക്ക് പങ്കിടുക (ലഭ്യമെങ്കിൽ)", + "appVerifierInstructionToast": "AppVerifier-ലേക്ക് പങ്കിടുക, തുടർന്ന് തയ്യാറാകുമ്പോൾ ഇവിടെ തിരിച്ചെത്തുക.", + "wiki": "സഹായം/വിക്കി", + "crowdsourcedConfigsLabel": "ക്രൗഡ്‌സോഴ്‌സ് ചെയ്ത ആപ്പ് കോൺഫിഗറേഷനുകൾ (സ്വന്തം ഉത്തരവാദിത്തത്തിൽ ഉപയോഗിക്കുക)", + "crowdsourcedConfigsShort": "ക്രൗഡ്‌സോഴ്‌സ് ചെയ്ത ആപ്പ് കോൺഫിഗറേഷനുകൾ", + "allowInsecure": "സുരക്ഷിതമല്ലാത്ത HTTP അഭ്യർത്ഥനകൾ അനുവദിക്കുക", + "stayOneVersionBehind": "ഏറ്റവും പുതിയ പതിപ്പിന് ഒരു പതിപ്പ് പിന്നിൽ തുടരുക", + "useFirstApkOfVersion": "ഒന്നിലധികം APK-കളിൽ നിന്ന് ആദ്യത്തേത് സ്വയമേവ തിരഞ്ഞെടുക്കുക", + "refreshBeforeDownload": "ഡൗൺലോഡ് ചെയ്യുന്നതിന് മുമ്പ് ആപ്പ് വിവരങ്ങൾ പുതുക്കുക", + "tencentAppStore": "ടെൻസെന്റ് ആപ്പ് സ്റ്റോർ", + "coolApk": "കൂൾ APK", + "vivoAppStore": "വിവോ ആപ്പ് സ്റ്റോർ (CN)", + "name": "പേര്", + "smartname": "പേര് (സ്മാർട്ട്)", + "sortMethod": "അടുക്കുന്ന രീതി", + "welcome": "സ്വാഗതം", + "documentationLinksNote": "താഴെ ലിങ്ക് ചെയ്തിട്ടുള്ള ഒബ്‌റ്റേനിയം GitHub പേജിൽ ആപ്പ് എങ്ങനെ ഉപയോഗിക്കാമെന്ന് മനസ്സിലാക്കാൻ സഹായിക്കുന്ന വീഡിയോകൾ, ലേഖനങ്ങൾ, ചർച്ചകൾ, മറ്റ് വിഭവങ്ങൾ എന്നിവയുടെ ലിങ്കുകൾ അടങ്ങിയിരിക്കുന്നു.", + "batteryOptimizationNote": "ഒബ്‌റ്റേനിയത്തിനായുള്ള OS ബാറ്ററി ഒപ്റ്റിമൈസേഷനുകൾ പ്രവർത്തനരഹിതമാക്കുകയാണെങ്കിൽ ബാക്ക്ഗ്രൗണ്ട് ഡൗൺലോഡുകൾ കൂടുതൽ വിശ്വസനീയമായി പ്രവർത്തിച്ചേക്കാം എന്നത് ശ്രദ്ധിക്കുക.", + "fileDeletionError": "ഫയൽ ഇല്ലാതാക്കാൻ പരാജയപ്പെട്ടു (സ്വമേധയാ ഇല്ലാതാക്കാൻ ശ്രമിക്കുക, എന്നിട്ട് വീണ്ടും ശ്രമിക്കുക): \"{}\"", + "removeAppQuestion": { + "one": "ആപ്പ് നീക്കം ചെയ്യണോ?", + "other": "ആപ്പുകൾ നീക്കം ചെയ്യണോ?" + }, + "tooManyRequestsTryAgainInMinutes": { + "one": "നിരവധി അഭ്യർത്ഥനകൾ (നിരക്ക് പരിമിതപ്പെടുത്തി) - {} മിനിറ്റിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക", + "other": "നിരവധി അഭ്യർത്ഥനകൾ (നിരക്ക് പരിമിതപ്പെടുത്തി) - {} മിനിറ്റുകൾക്കുള്ളിൽ വീണ്ടും ശ്രമിക്കുക" + }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റ് പരിശോധനയിൽ ഒരു {} നേരിട്ടു, {} മിനിറ്റിനുള്ളിൽ വീണ്ടും ശ്രമിക്കാൻ ക്രമീകരിക്കും", + "other": "ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റ് പരിശോധനയിൽ ഒരു {} നേരിട്ടു, {} മിനിറ്റുകൾക്കുള്ളിൽ വീണ്ടും ശ്രമിക്കാൻ ക്രമീകരിക്കും" + }, + "bgCheckFoundUpdatesWillNotifyIfNeeded": { + "one": "ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റ് പരിശോധനയിൽ {} അപ്‌ഡേറ്റ് കണ്ടെത്തി - ആവശ്യമെങ്കിൽ ഉപയോക്താവിനെ അറിയിക്കും", + "other": "ബാക്ക്ഗ്രൗണ്ട് അപ്‌ഡേറ്റ് പരിശോധനയിൽ {} അപ്‌ഡേറ്റുകൾ കണ്ടെത്തി - ആവശ്യമെങ്കിൽ ഉപയോക്താവിനെ അറിയിക്കും" + }, + "apps": { + "one": "{} ആപ്പ്", + "other": "{} ആപ്പുകൾ" + }, + "url": { + "one": "{} URL", + "other": "{} URL-കൾ" + }, + "minute": { + "one": "{} മിനിറ്റ്", + "other": "{} മിനിറ്റുകൾ" + }, + "hour": { + "one": "{} മണിക്കൂർ", + "other": "{} മണിക്കൂർ" + }, + "day": { + "one": "{} ദിവസം", + "other": "{} ദിവസങ്ങൾ" + }, + "clearedNLogsBeforeXAfterY": { + "one": "{n} ലോഗ് മായ്ച്ചു (മുമ്പ് = {before}, ശേഷം = {after})", + "other": "{n} ലോഗുകൾ മായ്ച്ചു (മുമ്പ് = {before}, ശേഷം = {after})" + }, + "xAndNMoreUpdatesAvailable": { + "one": "{} കൂടാതെ 1 ആപ്പിന് കൂടി അപ്‌ഡേറ്റുകൾ ലഭ്യമാണ്.", + "other": "{} കൂടാതെ {} ആപ്പുകൾക്ക് കൂടി അപ്‌ഡേറ്റുകൾ ലഭ്യമാണ്." + }, + "xAndNMoreUpdatesInstalled": { + "one": "{} കൂടാതെ 1 ആപ്പ് കൂടി അപ്‌ഡേറ്റ് ചെയ്തു.", + "other": "{} കൂടാതെ {} ആപ്പുകൾ കൂടി അപ്‌ഡേറ്റ് ചെയ്തു." + }, + "xAndNMoreUpdatesFailed": { + "one": "{} കൂടാതെ 1 ആപ്പ് കൂടി അപ്‌ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു.", + "other": "{} കൂടാതെ {} ആപ്പുകൾ കൂടി അപ്‌ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു." + }, + "xAndNMoreUpdatesPossiblyInstalled": { + "one": "{} കൂടാതെ 1 ആപ്പ് കൂടി അപ്‌ഡേറ്റ് ചെയ്തിരിക്കാം.", + "other": "{} കൂടാതെ {} ആപ്പുകൾ കൂടി അപ്‌ഡേറ്റ് ചെയ്തിരിക്കാം." + }, + "apk": { + "one": "{} APK", + "other": "{} APK-കൾ" + } +} \ No newline at end of file From 8d95da46b119804009d886920a1a759e951643fa Mon Sep 17 00:00:00 2001 From: DwainZwerg <97027379+DwainZwerg@users.noreply.github.com> Date: Sun, 22 Jun 2025 15:55:30 +0200 Subject: [PATCH 66/72] add german --- .../metadata/android/de/full_description.txt | 48 +++++++++++++++++++ .../metadata/android/de/short_description.txt | 1 + fastlane/metadata/android/de/title.txt | 1 + 3 files changed, 50 insertions(+) create mode 100644 fastlane/metadata/android/de/full_description.txt create mode 100644 fastlane/metadata/android/de/short_description.txt create mode 100644 fastlane/metadata/android/de/title.txt diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt new file mode 100644 index 0000000..484c4c9 --- /dev/null +++ b/fastlane/metadata/android/de/full_description.txt @@ -0,0 +1,48 @@ +

    Obtainium erlaubt Ihnen die Installation und Aktualisierung von Apps direkt von deren Veröffentlichungsseiten aus; Sie erhalten außerdem Benachrichtigungen, wenn neue Versionen verfügbar sind.

    +

    Lesen Sie das Wiki

    +

    + Derzeit unterstützte App-Quellen: +

    +
      +
    • +

      Open Source – Allgemein:

      +
        +
      • GitHub
      • +
      • GitLab
      • +
      • Forgejo (Codeberg)
      • +
      • F-Droid
      • +
      • Third Party F-Droid Repos
      • +
      • IzzyOnDroid
      • +
      • SourceHut
      • +
      +
    • +
    • +

      Andere – Allgemein:

      +
        +
      • APKPure
      • +
      • Aptoide
      • +
      • Uptodown
      • +
      • APKMirror (Track-Only)
      • +
      • Huawei AppGallery
      • +
      • Tencent App Store
      • +
      • CoolApk
      • +
      • vivo App Store (China)
      • +
      • Jenkins Jobs
      • +
      • RuStore
      • +
      +
    • +
    • +

      Andere - App-Spezifisch:

      +
        +
      • Telegram App
      • +
      • Neutron Code
      • +
      +
    • +
    • „HTML“ (Fallback): Jede andere URL, die eine HTML-Seite mit Links zu APK-Dateien zurückgibt.

    • +
    +

    + Einschränkungen: +

    +

    + Bei einigen Quellen werden die Daten mit Hilfe von Web Scraping gesammelt und können aufgrund von Änderungen am Design der Website leicht beschädigt werden. In solchen Fällen sind zuverlässigere Methoden nicht verfügbar. +

    diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt new file mode 100644 index 0000000..870ca81 --- /dev/null +++ b/fastlane/metadata/android/de/short_description.txt @@ -0,0 +1 @@ +… Android-App-Updates direkt von der Quelle erhalten \ No newline at end of file diff --git a/fastlane/metadata/android/de/title.txt b/fastlane/metadata/android/de/title.txt new file mode 100644 index 0000000..45ccf2a --- /dev/null +++ b/fastlane/metadata/android/de/title.txt @@ -0,0 +1 @@ +Obtainium From 3f1ca3b957db246d5689c36f16846de35ff9e7c1 Mon Sep 17 00:00:00 2001 From: DwainZwerg <97027379+DwainZwerg@users.noreply.github.com> Date: Tue, 24 Jun 2025 11:05:26 +0200 Subject: [PATCH 67/72] Update full_description.txt fix link --- fastlane/metadata/android/de/full_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt index 484c4c9..b03dcb6 100644 --- a/fastlane/metadata/android/de/full_description.txt +++ b/fastlane/metadata/android/de/full_description.txt @@ -1,5 +1,5 @@

    Obtainium erlaubt Ihnen die Installation und Aktualisierung von Apps direkt von deren Veröffentlichungsseiten aus; Sie erhalten außerdem Benachrichtigungen, wenn neue Versionen verfügbar sind.

    -

    Lesen Sie das Wiki

    +

    Lesen Sie das Wiki

    Derzeit unterstützte App-Quellen:

    From 918091ba54f124ba2ce1e380ca529cc07b76dc91 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Wed, 2 Jul 2025 20:09:20 -0400 Subject: [PATCH 68/72] Added foreground service option + other updates --- .flutter | 2 +- android/app/src/main/AndroidManifest.xml | 9 + assets/translations/ar.json | 3 + assets/translations/bs.json | 3 + assets/translations/ca.json | 3 + assets/translations/cs.json | 3 + assets/translations/da.json | 3 + assets/translations/de.json | 5 +- assets/translations/en-EO.json | 3 + assets/translations/en.json | 5 +- assets/translations/es.json | 3 + assets/translations/fa.json | 3 + assets/translations/fr.json | 3 + assets/translations/hu.json | 3 + assets/translations/id.json | 3 + assets/translations/it.json | 3 + assets/translations/ja.json | 3 + assets/translations/ko.json | 3 + assets/translations/ml.json | 5 +- assets/translations/nl.json | 3 + assets/translations/pl.json | 3 + assets/translations/pt-BR.json | 3 + assets/translations/pt.json | 3 + assets/translations/ru.json | 4 +- assets/translations/standardize.js | 3 +- assets/translations/sv.json | 3 + assets/translations/tr.json | 3 + assets/translations/uk.json | 3 + assets/translations/vi.json | 29 +-- assets/translations/zh-Hant-TW.json | 3 + assets/translations/zh.json | 3 + lib/main.dart | 247 +++++++++++++++++------ lib/pages/settings.dart | 21 ++ lib/providers/settings_provider.dart | 9 + pubspec.lock | 26 ++- pubspec.yaml | 3 +- 36 files changed, 343 insertions(+), 94 deletions(-) diff --git a/.flutter b/.flutter index 6fba244..fcf2c11 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit 6fba2447e95c451518584c35e25f5433f14d888c +Subproject commit fcf2c11572af6f390246c056bc905eca609533a0 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6400b9b..0bd0614 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -61,6 +61,13 @@ android:enabled="true" android:exported="true" android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" /> + + @@ -74,6 +81,8 @@ android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> + +