From de513348b5c4e5a3fb27d5a89f709167fed135de Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Wed, 5 Mar 2025 16:00:08 +0100 Subject: [PATCH 01/11] Replace PNGs with SVGs from `desktop/.../assets` where available --- .../IconAccount.imageset/Contents.json | 2 +- .../IconAccount.imageset/IconAccount.pdf | Bin 1424 -> 0 bytes .../icon-account-circle.svg | 8 ++++ .../IconAlert.imageset/Contents.json | 2 +- .../IconAlert.imageset/IconAlert.pdf | Bin 1070 -> 0 bytes .../IconAlert.imageset/icon-alert-circle.svg | 8 ++++ .../IconBack.imageset/Contents.json | 10 ++--- .../IconBack.imageset/IconBack.pdf | Bin 1125 -> 0 bytes .../icon-chevron-left-circle.svg | 8 ++++ .../IconChevron.imageset/Contents.json | 10 ++--- .../IconChevron.imageset/IconChevron.pdf | Bin 1054 -> 0 bytes .../icon-chevron-right.svg | 8 ++++ .../IconChevronDown.imageset/Contents.json | 14 +++---- .../IconChevronDown.pdf | Bin 1059 -> 0 bytes .../icon-chevron-down.svg | 8 ++++ .../IconChevronUp.imageset/Contents.json | 14 +++---- .../IconChevronUp.imageset/IconChevronUp.pdf | Bin 1061 -> 0 bytes .../icon-chevron-up.svg | 8 ++++ .../IconClose.imageset/Contents.json | 2 +- .../IconClose.imageset/IconClose.pdf | Bin 1130 -> 0 bytes .../IconClose.imageset/icon-cross-circle.svg | 8 ++++ .../IconCloseSml.imageset/Contents.json | 2 +- .../IconCloseSml.imageset/IconCloseSml.pdf | Bin 1139 -> 0 bytes .../icon-cross-circle.svg | 8 ++++ .../IconCopy.imageset/Contents.json | 2 +- .../IconCopy.imageset/IconCopy.pdf | Bin 1176 -> 0 bytes .../IconCopy.imageset/icon-copy.svg | 8 ++++ .../IconExtlink.imageset/Contents.json | 2 +- .../IconExtlink.imageset/IconExtlink.pdf | Bin 1126 -> 0 bytes .../IconExtlink.imageset/icon-external.svg | 8 ++++ .../IconFail.imageset/Contents.json | 10 ++--- .../IconFail.imageset/IconFail.pdf | Bin 1163 -> 0 bytes .../IconFail.imageset/negative.svg | 8 ++++ .../IconInfo.imageset/Contents.json | 2 +- .../IconInfo.imageset/IconInfo.pdf | Bin 1170 -> 0 bytes .../IconInfo.imageset/icon-info-circle.svg | 8 ++++ .../IconObscure.imageset/Contents.json | 2 +- .../IconObscure.imageset/IconObscure.pdf | Bin 1483 -> 0 bytes .../IconObscure.imageset/icon-hide.svg | 8 ++++ .../IconReload.imageset/Contents.json | 2 +- .../IconReload.imageset/icon-reconnect.svg | 8 ++++ .../IconReload.imageset/icon-reload.svg | 10 ----- .../IconSettings.imageset/Contents.json | 10 ++--- .../IconSettings.imageset/IconSettings.pdf | Bin 1401 -> 0 bytes .../icon-settings-filled.svg | 8 ++++ .../IconSpinner.imageset/Contents.json | 10 ++--- .../IconSpinner.imageset/IconSpinner.pdf | Bin 1313 -> 0 bytes .../IconSpinner.imageset/spinner.svg | 17 ++++++++ .../IconSuccess.imageset/Contents.json | 10 ++--- .../IconSuccess.imageset/IconSuccess.pdf | Bin 1104 -> 0 bytes .../IconSuccess.imageset/positive.svg | 8 ++++ .../IconTick.imageset/Contents.json | 14 +++---- .../IconTick.imageset/IconTick.pdf | Bin 1050 -> 0 bytes .../IconTick.imageset/icon-checkmark.svg | 8 ++++ .../IconTickSml.imageset/Contents.json | 2 +- .../IconTickSml.imageset/IconTickSml.pdf | Bin 1045 -> 0 bytes .../IconTickSml.imageset/icon-checkmark.svg | 8 ++++ .../IconUnobscure.imageset/Contents.json | 2 +- .../IconUnobscure.imageset/IconUnobscure.pdf | Bin 1156 -> 0 bytes .../IconUnobscure.imageset/icon-show.svg | 8 ++++ .../Contents.json | 10 ++--- .../LocationMarkerSecure.pdf | Bin 2407 -> 0 bytes .../location-marker-secure.svg | 19 +++++++++ .../Contents.json | 10 ++--- .../LocationMarkerUnsecure.pdf | Bin 2405 -> 0 bytes .../location-marker-unsecure.svg | 19 +++++++++ .../LogoIcon.imageset/Contents.json | 10 ++--- .../LogoIcon.imageset/LogoIcon.pdf | Bin 1974 -> 0 bytes .../LogoIcon.imageset/logo-icon.svg | 39 ++++++++++++++++++ .../LogoText.imageset/Contents.json | 2 +- .../LogoText.imageset/LogoText.pdf | Bin 2431 -> 0 bytes .../LogoText.imageset/logo-text.svg | 19 +++++++++ 72 files changed, 343 insertions(+), 88 deletions(-) delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/IconAccount.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/icon-account-circle.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAlert.imageset/IconAlert.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAlert.imageset/icon-alert-circle.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/IconBack.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/icon-chevron-left-circle.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/IconChevron.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/icon-chevron-right.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/IconChevronDown.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/icon-chevron-down.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronUp.imageset/IconChevronUp.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronUp.imageset/icon-chevron-up.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconClose.imageset/IconClose.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconClose.imageset/icon-cross-circle.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/IconCloseSml.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/icon-cross-circle.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/IconCopy.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/icon-copy.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/IconExtlink.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/icon-external.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconFail.imageset/IconFail.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconFail.imageset/negative.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconInfo.imageset/IconInfo.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconInfo.imageset/icon-info-circle.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/IconObscure.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/icon-hide.svg create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/icon-reconnect.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/icon-reload.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/IconSettings.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/icon-settings-filled.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSpinner.imageset/IconSpinner.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSpinner.imageset/spinner.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/IconSuccess.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/positive.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/IconTick.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/icon-checkmark.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTickSml.imageset/IconTickSml.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTickSml.imageset/icon-checkmark.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/IconUnobscure.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/icon-show.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerSecure.imageset/LocationMarkerSecure.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerSecure.imageset/location-marker-secure.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/LocationMarkerUnsecure.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/location-marker-unsecure.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/LogoIcon.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/logo-icon.svg delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/LogoText.pdf create mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/logo-text.svg diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/Contents.json index 573b102f4216..e804ffef7aac 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconAccount.pdf", + "filename" : "icon-account-circle.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/IconAccount.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/IconAccount.pdf deleted file mode 100644 index fd1cda97a78b18729db2900e5bea3782cb6805e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 zcmY!laB6B`_zCu7L-`@3dMqsFwHo1YAeT9O*oT1ZXq`TJwOS|&7tjRy%yn0r~ZH{dltUgY^uD5RU9C4w*3o{L7 z^eUCOyp7tsD!FfRfVs*mw#~7jZpRCR=ZCeQS-Ui9y5-`w7Hgy2IluJIS~b605pA^K zlmVyKdhuOtH(qXUn>y#@hY8mf$sO$f<@$2UCbcKpEaiI*Ew)>B=6v7fnk#IfW`DpV zI&59Qt!oyGy1((=y(QkLud=Jbp5b$h&V}TTto7#(XS!|t`G21D0eAm>=ZsnXE_^z( zJ0apqy3_KSyE@Tpg$-Kg8VN0M{b$$vz8=M2HZQw#s@DA<{5>;G%nqm9qArTe6J{lDqLmAkb5Y^PQH zhO&*)Grs)XH1~3t+s=y_vfBCjvo<;Y*m-)3sORl<-D&F9?_#4r-0IJcu3GmXa@x!d z{O`D)_mosTXM5yiBd)q3b3$9bM$q#qd4UWvcc_szplY+zj&EMeEGnybcq9HGiCpGx#tdCsd*{T^a5moQW_|EfoNa?Gc~aU z$%A;t@N@`Hd9D>D?!hI%RHtBL0}=oN{X_#GM?v4&QNd6_KRFRd0@ET;0!RW8)EpzY zISTqAl?AB^`T>dQsS2tJhG2685{pvvN`P8nN!&LzB{R_}zd|7zC}f~uWCB95V71Qq zc_l!_#R{N20?82WMfs%#NKS&-02YP0G8kxYQDR;xLP=3+Dvak0ROOOd zmYJLyDBknOeqGsALR8QxZ6uX z-b6CM49S3iqWqN7WMIzLNKVWw%2zPdGc?mPP|(OIDJdwn(gy}EP&B_iC-7>JIZy?_bCC3nMO7RabvEE&xyd^+o^y diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/icon-account-circle.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/icon-account-circle.svg new file mode 100644 index 000000000000..58e71e4ead2d --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAccount.imageset/icon-account-circle.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAlert.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAlert.imageset/Contents.json index 4800727ae2a9..c9558a505131 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAlert.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAlert.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconAlert.pdf", + "filename" : "icon-alert-circle.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAlert.imageset/IconAlert.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconAlert.imageset/IconAlert.pdf deleted file mode 100644 index 2b350b1b89bb7ebc407c16414aed706e4d1cbd52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070 zcmZWoT}V_x6wZQ#NrW;}qHM}mU822n_kUwqba!3R($?LCLXB>B$K4z2z02HLUF$(1 zht=dd7<5MP?P>#mCp!_1v;&YW|;^POu72Sdk2 zivyTmt-M$Vc8H*M@e=TQp>PVTahiY*21NjbPzWhWiV54362(C*YcULbKA=;ArGAjP z-`mk$K99=Q7tExj?aOrUVA;))I??yFG&Ov~yPWpl*)uh8pdvI>H9A_?Gnfg?zFfGr zbmjfZuCcLYv2>zU3O;-AxVdS*Ydm^>#rE;<;nB)Rjko#}gL960dx>xL``($Jqrkr2 z*x5Fhy^!4ju0MIZe`5R8^3ur6cw40cy6#Q>_W#=X{Pn{QuVroD*=-BiKb@Y^*$)+; zYmY3}%Bw%y-@Q3lUH$ED&E%&w^y79qTII@?4?nF*T|G3tcy2eqYHWiJ`{IS*?D@|4 ziykMx=Ohaf-JF>m5N=kmCX%5)`A}>oEb`C zD1@arh9)Q)e!~*MDrHae3bf;xBKfrp>}C*xRy&`)hHXGoDKpj~moTSS3(?Z4qLgwG z3^bo*l*J{Is;77)c_GE1XnfI?JC^j}&rGbDBjCoJ9`8M2n?m)_4uFq!0~?7SU-zupvQdN + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/Contents.json index 5be7d993e85b..3fdd0272f279 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconBack.pdf" + "filename" : "icon-chevron-left-circle.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/IconBack.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/IconBack.pdf deleted file mode 100644 index 30613fa0b852865fb8e15da994577bbb69829195..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1125 zcmZWpZAcVB7&a2C4f`++{83EUnTK_|dtctwY3Q9Nejld=sb$;Vcy8Y9p1X5#XBa^R zg?*qQiCU=<5vUL$MHxhdAwh=q!|;a%Q54#r?1Lm~X3skh9fsMRXJ?-GeV^xLH7m0tDIYtu=+~)+yQ6Nmj1Ss?cKN9mCLR}BW0;a%OBJgte;hS z+M%>L+Xeth)FYPEb(vEUJLt zh<-#g^2D;~O)U9Nc7~X`s-A@*R8)nqmcV8s03I~Q;0>Vd`G5s9&*2p-j6dKN&qW@6 zj0e!w;Q$1*i}OOD0j$dF;$$cyd^KuZIrIozffNF@7-E3lNakVntX&cjKCA%Ze8lD= zSqcW?Qi?=S(P)-cIIhfzN`OS-!%?^xAUO!5J3Bt*fF}eVx{C@37^#GILq!V8JX8SD z!yQ)_$vE15OLZyaE?p{k6r4XP-5tw4NXm>OFvk(NWXTicaldBqoFGep)v;zB1F{+s z3MhMNEG|a9G8bqRctt14UaeLQWXIi%1W9xdW3u#&o?&wIR+cqbjchi<>|z*gT*REX zh>?`-9O8VESLGtMD2qlc*%y*w1H}Lf#l!|Mn@k21XaG^nY{KG@0mK+)G~j5P{vf{4AfEAANA(<0=P*(p2RYD8IDHAK)l7s*$Jkl@4VuJ*T@~V{z S;$);&Xt5Y6ji#{DN&N>m2~U6k diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/icon-chevron-left-circle.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/icon-chevron-left-circle.svg new file mode 100644 index 000000000000..4b8f49e5cd9c --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconBack.imageset/icon-chevron-left-circle.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/Contents.json index 54dbef686379..0f9c8bfe26bf 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconChevron.pdf" + "filename" : "icon-chevron-right.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/IconChevron.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/IconChevron.pdf deleted file mode 100644 index 5e00c5ce6fcd488e7945ec0f6f4ddda8f6455ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1054 zcmZWoT}TvB6ebeF(SF`4dpU)hyNWw^W}V$NS3_rYu^(Jk`vEB&XYa0K>&!B9*H)uI z2rY?_3KWuF>?Hy-AuM9~Dy)Yddnkjtch*@Ky$myRzkBAK^L^hLS2WyG zEqEo)_2lRD8dn1djP7186axMP){~?MBnrhi0N`7+6u~BarWAt1ST*99YiQssVq&F_ z%TD%18@cTVOBdEgCrj=g?p+E^wYi&~jx5Wc{>fh|y>||kzeTUh6}VK=*|j@!k&o>7 zb$(^A;_T6z=xWi8%5DAEzRN>J2TJdab^GV`h$F*Of3EMVzc4;O92<@9Tz#2%FS%FG zOij+lKP=3QO$>dzRekL7>Ectjn;-2jYh5ZStD5kXKI{4#EGwQJeK7xKLaY0`ICpuv z_~VuOcQ3ey_r>wLT^%dGt(nDF%b)iy{s=$kupVFUpT05Xj4pdp!a`7B=WOT8>tZX> zoF$QVLRElJhyir*3Zfg}J+JDVj8ubdRQ5Uc*d!Ja!?O zjv>(uJ+e(WlCb1a?1s~^fHMg~J{{dzJEJ6SP diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/icon-chevron-right.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/icon-chevron-right.svg new file mode 100644 index 000000000000..61984c51550a --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevron.imageset/icon-chevron-right.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/Contents.json index 317139624140..74ccdff7bf3c 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/Contents.json @@ -1,16 +1,16 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconChevronDown.pdf" + "filename" : "icon-chevron-down.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/IconChevronDown.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/IconChevronDown.pdf deleted file mode 100644 index f529e1990888e1ab36274cb0614ac1fefc2737ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1059 zcmZWoUq}=|7^gst6(uPY!H19R@}#`oy>s{O>=gCR)8mS+Rp>z^*1hp=Prg>cN*!cRT6t1pKJuF#zwz^!o z(%o{#ced`))3&jj<=wAe1U2dQC+CBYv)u5?o9W(zRk3)qtulISkDQbykJl@u!N(u2 z$OHWM`R2{VcT2t24b5k(b<%A1|jCzE!>Y*SKEgS}q?w9Mw2v#J4!mFUFoxW;-P<`XqMGPM(4` zwi=yT($zz#5)cS5fDT?2=mGd(JBYw*DqX2Q^n$K*ZuxN+`~crOl19MC)C2+th_>ID zijhI+)4c2_QCwF$%q;X#NC0;eoBg(J&@>1&wt&?wSEMd%X3|9|R@1w39lf_%wP>!!1Pdxc(IK0y|c~BVsH7V9=B-z zjJi_DJ;P`gIgpDS#IPC9Xtdj$nyOII>pD5AG0VlL&NO4O8@uzj(zSX+hIE?*X- zK~4Z4Clm(AlH`$K5b~Jhqn_CSqkwt5RG=N0+wb3n2_kL3op#>c{$z=&xx>yYQw{SN w!K$7@*#4J$^oxk5%u1n{CILn~*Dn!c&;+KuT}q3nnAi+`qK|VpI!}eU{~!r3IsgCw diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/icon-chevron-down.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/icon-chevron-down.svg new file mode 100644 index 000000000000..fffed869b0a1 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronDown.imageset/icon-chevron-down.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronUp.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronUp.imageset/Contents.json index 1539b29215b0..7817cf8114f5 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronUp.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronUp.imageset/Contents.json @@ -1,16 +1,16 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconChevronUp.pdf" + "filename" : "icon-chevron-up.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronUp.imageset/IconChevronUp.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconChevronUp.imageset/IconChevronUp.pdf deleted file mode 100644 index a1ee3410161d5fb21f48a10c8c0f0dc5659111c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1061 zcmZWoT}TvB6b>qsSr95C%9jJRx{JAUXV(3TMaW%uTYqRuF*0+WgevSJB(QH1D0>Y<2AEs`EW%I=+Y*TpWEJ9EE#=bZC>-x+&6 z9BB|-9?t%7WqO@!1O!_03>ORn-;UKZ82}H35*z^V5hX*gPM;Zx;4qf86y}2f(>EBjaEgQFY2mKN-PcC0i+a~xJvn=I%X2*Aq{U8zF!fUb0I#t}<#fbSa4V&LOa8iO4K zD{frUu}bKtMd3SeN|Bni9Gs>Q0I3fvXkc3 zCDq8XO!9CMjsek4T-=4|tuP)^WSodLGqAvfPhdkcbr~DL^hlKPVigy=XN#A?zUAAL zltJrf)DxxJO-8dUfVV6_T-Q>jO#96tONy?6;1awp1dahhvc@rGuk z+Uc|sg=jYtMN`Af7>9^NgnVK^5Zr-Ap&p?+gq&p=ePtO7C5I#;Wwf*vi`imq8nI + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconClose.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconClose.imageset/Contents.json index f5ff7c0c45bf..2c3810a7f3ad 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconClose.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconClose.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconClose.pdf", + "filename" : "icon-cross-circle.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconClose.imageset/IconClose.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconClose.imageset/IconClose.pdf deleted file mode 100644 index fcff861b53cf9ee14abea298faf1a1af003f4431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1130 zcmZWpdq@;P98SuhHT4}(h?H#?2jBRf`H_qK_cFtE+P+1m4 zPoj53L_!pVh!u!hVNpgz^gxvI-y|%k{*kbmJ?}hh7-o0Anf?8K-}n7klfS~Zj$V^1{Jz*%_zY~l6Kub_Gt;-vzb3PNG#Ci} z9=p=<{?e84jMlH8ic8h!gEzko9sRgvetY)DQ`x8Y*F1A~jW$iJIM8wGIDhNj!rf0F zP0Y&@j?HaoD;)d)&)@I#^o@nkjd4p6`?h~as9@^h@X~N@-qgJpQ)RvHivP}OdwuW^ z1J&@f6y%MHNR^{cqMcxO&~v)8rX)5*t!%+n0Zar19uEb`U?q-h0PEcdc)-dMS&7W# zfUIOr#}QI-02^$LLBRT@2m~g;8*%*-f+{ATCf%!rVMQv}T0n?E91v`D?lSIrH5HS~ zI-vF^ysko8JeF2cB7=b@s|=95NK*9}%_O%b;c9?U942>Oa;pM1DKZqR$|;y&!irGW z;z))%pn8aDylBPA7M$Uw({I@tC9ISBDRnVbdz{it3*bl#;73|GE|aD;%aVdLz*~5S zg#+dWjAME!OT;B;1WB<5Mb<4Eij + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/Contents.json index dc37d5929956..2c3810a7f3ad 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconCloseSml.pdf", + "filename" : "icon-cross-circle.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/IconCloseSml.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/IconCloseSml.pdf deleted file mode 100644 index 9645ccfe8813df051bea779d2406d1dd89a5d6dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1139 zcmZWpT}Tu`9FIh(edt5!e5hoi4n3;d-8=VA<<76W?urU+^`Q?cw!QIg?c6OIJ3}tZJU+zYXTxxz%GU;rDzWAK$li^ijwfm!5S` z7#>gL8cc?(otGwFz5CErcD{cmKJt9+gT2vVOM9%x_|?L{KsB-4C%?PPCJk2an~@v4 z_*VO+0kE+v-gxDlThKu3Da+QDRvhW+vvEUUPlvx(68-D|Tl5SbzF&)1iK+ z^I!Jr-X%*y*Pq{>rXNQty$4W3(PHDsJvmuZT%s0NkE1q+HEGa*Lu8D>qpsNHw1V+H>eyao($_PJA%D5Z)B%wlyfCCs} z0Ba-jpl<6@WQ2`1K>8pdx>r@gp|q3|5p*<}Wi^hg3bGa=k;G^c-T{yrhRKr)Te)GQ zBtqU>LBK>MG!Hc;tcp+rgbzNgE|PJw7w7BJ$Xj}+kl0$4L^GczDRfKW&)rZKq~^{YZCAc>k;QT-;99>|4z8%c`nCc@-f7z@ML zEk!JAEh=C)GfW=Cn9?HJ(;_BPb_qxbDt_G;kwu#mVqU(83Tr6_6jDrT02{|yIZz9d zn9YVglL6!uR={C`7GPF;(ISjtar-T_;}-j~TQQpp> lk%Ctg1W4hDe%T?{Du6JrOQ|72MS6vWMTL~nxUJGd{RiQ5V_X0L diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/icon-cross-circle.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/icon-cross-circle.svg new file mode 100644 index 000000000000..37698f569096 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/icon-cross-circle.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/Contents.json index 761f25634607..c3bbb71217ae 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconCopy.pdf", + "filename" : "icon-copy.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/IconCopy.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/IconCopy.pdf deleted file mode 100644 index 45cc203c2335ddaff7d7577daccdeff2573f5987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmZWpSxgf_81_LeS%~@o9vE>v8mK5c+tSMr6D@}*LTzh;9MQEM%3|4VcBcj})I=pp zAjE`3jPbxkA54rp zIxfw~Xj{MB_{*dN2&6p~OhyJ^^N{Gp<-kZF2Lk|LvjrbUGMRlmMw!Shc@VQ<1EXLW z@s&)~dDKvvZ{lK3jJ7i-u#jn4drx~d_eJgZyQ6Q8to$`x_aN`tx43IH&X|fr1@W5L zl8f)JyH;O69OLpezHP2)eyRC)ux7Z28J&pL{eIWk`{rnYy``IN+j#TSimswLiKh*l z8{oZ!geCgzO(U+^-qgTxgE z^Ffza(j@j4teHP=XRY|tnp=a~hLTHdb&Vyr7iHOs#tSV2{l&+26}Jsu>F&&)d(veL z4i)Y&_rZog_J={;$mI*IW0vP5Me)J<*UGD{j}uz!E4$*C4t~tntQl4%3f(|x)!L_!Tp`EW$>q7jD+c8Zrm@3LD3k3!<7)E$x71C(Zz0aKI#yDWJEZc^eYZeEZjz@>4f zGze14G4?C#S(03WdS%{UF1VF6N%rb=sv{fu0k9y6nN*k*J=8;J)>}EwU`^*zAxwr) z7v<3$o0< diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/icon-copy.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/icon-copy.svg new file mode 100644 index 000000000000..dc6f6fd30cc3 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCopy.imageset/icon-copy.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/Contents.json index b95842ff5d40..aad6a70216f1 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconExtlink.pdf", + "filename" : "icon-external.svg", "idiom" : "universal", "language-direction" : "left-to-right" } diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/IconExtlink.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/IconExtlink.pdf deleted file mode 100644 index a68cb6bca1d6ef2206e08e70ff126787e850757f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmZWpdq@;P98S6-mNYP=KY9(wm6F}=-uv`0^iD5P^E@A5A++9&=bG)FyK`{{7NkK% zR!C&!*#pYLq7YJ$3(K@n#D5}+O3=ihcOik2_L$l8u0w}mXXl&W{2t%;W7JN2?oL)? zpwvBI@6A(szyPtTmau3yssRQJxhMbtoy*rDDB-n^L(mT0q6bo$nUstq$Q`5t z!AfV=9u>PbG@E2eE^ak`EVw$b-l@JY_$_YkQFBMaCg;r|ezU3j> zZfKq~mCmdg@eKZ1`Fz?OqUhlH6Y-_9cYc1#Jzl&nCsbYa`Z{0kzmn(=9!XkN*8aP# zZ|L)jXRYy}iz5>cFV&AY20D|6-i__n|0oPqo!S4Z&D*l2xyAN3JFRJKwCqbETNbz# z*W1|rU|S=5>cE?#x4rEhlZksD*H_%08d2>^INhgSnE3F$=zY(^idR8TIRypJA`SSD z5J*@fE9OmW(2{eq(?#i32+au~M+w4Y0;`n(c+eb!H-NTf0T$414u3Jl_yB+LT=b)j z`T=xlgAW4Q$$24A16J|t8jb%Wj59{oZ zM87X4rEmlVjbvGZ<4T+$`$!~rLj=wPNbw(K3ulYhhWPMbGYFnC%Rc8WYhJ z6EU2!jYC|W=v90XS>#0_{>vATU^T@6GsQ#)Fd7Ux1E>ZO%xJ)ZkO71!rq`L5VLBtO zd5Imv;`UpD>GaF}nOMs*JF^ap61j^cj<17~@*I@#hapaxNZ}Gi1W4iGe#sN6ML?KW Uq?8dSA*DjI89yuPoT6OnACB%?^#A|> diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/icon-external.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/icon-external.svg new file mode 100644 index 000000000000..8399c901bdc4 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconExtlink.imageset/icon-external.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconFail.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconFail.imageset/Contents.json index cb95467b59dd..f3f4332a02da 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconFail.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconFail.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconFail.pdf" + "filename" : "negative.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconFail.imageset/IconFail.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconFail.imageset/IconFail.pdf deleted file mode 100644 index e36941700ad6e685946993d633f90aab6d923d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 zcmZWpYe*D99515Rh7?5E18sU--dVY`ciyWmd)%o>sn=N`*;VV^c&_R0H9Hq)5n%;k zB|WG#DkG_oD5>ZuGm6SgLQHz#hf3)~+Jopr)`tpeX3w+3hGAysH~;xRe!oAfbGxz@ z32A0d7x~iki%SO(D8*%*!vXj;NDh!vV5X3V0|4+@QaM4G?&TsuF62}Eh|9>}RDzLM z!G+JPU%NtXh2!pi<1*acTb{H%`!M$1uirPq^r#MguAI9oa;SgQ zy{fLxXGy)wOg+2bZCN;dR^xTtkhRrnQnlBeWE^xjC4Sy1^Zrt_roBgYE zbK=JYeC(){-cfzn(K@Gg@BW;Hx@|{aZ7`g8e#B7IVM{nC71n#3^JdqOn|)WWJe?Qm zIX*7r{xyyH+?Mgb;(s-leP;-iRV9fW>r%MAB3m#72^X6c3@h#K!1E<@!=2~y1W)@D0 zjDLN8nzwIsS>enx{rBtdeDzm*6UXeF((Ngc_@W^+&WBvau2h#-$XE zprNrW3us&{%4(2B@>Ry*96)dg#ZFFYf5=C>TJIAjtN8=( + + icon-fail + Mullvad VPN app + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconInfo.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconInfo.imageset/Contents.json index 87bd86d2ec39..ef3a764cba05 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconInfo.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconInfo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconInfo.pdf", + "filename" : "icon-info-circle.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconInfo.imageset/IconInfo.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconInfo.imageset/IconInfo.pdf deleted file mode 100644 index 07f05b149b6024613320d42582eea5b87ccc5a5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1170 zcmZWpTTBx{6pb2utTF0`0prg|(g-1RAJBGdDhjPdf{nE(qQ>a5otDM2TV|(PYQ%`> zhZ^y1q7oAyQIbaCLnA(7A{zZrqp1dbMls?CU`+h*fv=e@tqo2lvpZ*I@4e@on>Be| z?n2&dVN92YFOD$9fCE}>J>zfyb}3YYxDHqd_}|R^`Cjc%n0>;yM7;ezI^U(X|Dyr?Yj#EOQ-FIo@qYts%-nQuz);9;Ij-2oLaBcVQ2G)@W| z>IB#_RKR{~>FtU=8f^6xJnxLbX9e}$`!7zb5^Sdy{drfC*z#k-nbzi72CDv1$;cZO zn<`A7L}S5jrRQ{4l(xbUe{mF-S79PNa5yMH1}kx716XG%-~lU3WF>Zx1G17i8b?US z0qlyVFa)eu3PNB4yb;$cA*f>VY06~}^ea-C76oew!~tHUbDeS5si~M;)&XskWKWbM zEfUTsDVf1QQ&m=xyhu{@FwG=4rQiyHQ3R%TPIAiyHz_jom6uU4$%OSmU5g+Y>VWFu z%iu*TPPOVkUON4jtyKIvsh?8!rE8B+ni&DC83DXV^G9UT+8j`6j?w3q%f;p1jZ>)(^#=c*wc}T@x;+F z7{`z|Hrdgi2-Boi8jJ0g<&KqA&87$N0kzTq-1J^Pt!1<#FPC}p$0TSl{c)^ Sv4pU}&@R{+lWFlXH}e + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/Contents.json index e3f7020b5854..38876653b50c 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconObscure.pdf", + "filename" : "icon-hide.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/IconObscure.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/IconObscure.pdf deleted file mode 100644 index 8d11004e3e70615f4c07766eb67c0582818ce2b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmZWp4KN&69M7mZ998`YLFr4lVp6xe$GO9migPLw6fqPT>u#NO=l1OGiH~ZOPE->g z84*b?O&HP=X*E*CBs453&)002>tT9%;Us>NACPADlA!4C@J zGb~Nu+5EiIMEpCI$(ZHSgP+|oJI7NhUsG1agxyh^tp>_jo1v8^p) z@K=Yyva(yQ6W_PCj2_?FL{eXS&`ynWg5KMAXFFei(2Fo9=k1(Nxv6IMM`~NWld^)o zH3}VkTxjJTm;8xtixD%!c#a`8-MS%hh7I*@zas50)LiarDO3j>a5yk`;z+Bj@ad8m zWT*6DCu3g$zGH<0_~!dQw%9`?RuF{go78uvWt?;IH- zc06bK$hsWchjf{A+63eO3@XQR{xVw*IPl*8JS$ zu)_Od)|k~RdnPp&rxxXtZR+U1avwz4U4Np84>8)!R`#=Wx!thiWB~8&=F;z?=^mzg zye3%t)gR}V-xp%d>`p08r!X;74&H6e`aKx5R2lqRL z+~|?#bPUNZ6!w(VNQrPfIQaq-oESvzuGnsL>8u^rf6)K9nkTz&GjhbTI~V!Ed-s6U zb~^B4y*1A|;XWhNEla}haMg}I`wx!n&!r+m{h&HwZE*P zOJ`#%PkJeQX{t|cJ3K0Wvti+<`mMh;hxOG}P)lv*|3=O)6!UP0Y0HqtxygA zaU|uK$*qu^eyEf?=XO486gH7IERPM3V0!D&Lr!mF#@v6oPh_%13BBtr-VB42K%nq)&M9SemS zz_r(MFNM>TLBGMJWeX;B)yp_&m&SFBp0lLPUxgz8OB;yQT_}{26S<_4hz;Mxfy?aIXeGe_E+4TQ;^I7BZSnQE8160-Nvas=KNouJn(qcK%nb_sHYkXpDV0G99|cb( zPSO;>gqWWY1)iBKt7ifbm|TdeXrjxB+yl7%K6HMcRysU`94!CuT;@%sWLTVLO%Y-uUyLshghea({{iIU|K9)r diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/icon-hide.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/icon-hide.svg new file mode 100644 index 000000000000..4b429fa96562 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconObscure.imageset/icon-hide.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/Contents.json index fc394e1bfbbb..7b4ca873dd49 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "icon-reload.svg", + "filename" : "icon-reconnect.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/icon-reconnect.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/icon-reconnect.svg new file mode 100644 index 000000000000..cc203ec2c58c --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/icon-reconnect.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/icon-reload.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/icon-reload.svg deleted file mode 100644 index 6d443ac8b4c0..000000000000 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconReload.imageset/icon-reload.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/Contents.json index 82d4cfeb72a4..f38fe946ef62 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconSettings.pdf" + "filename" : "icon-settings-filled.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/IconSettings.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/IconSettings.pdf deleted file mode 100644 index 2b2478320483d08c3a2fda56e38250b624f5403b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1401 zcmY!laB6B=?lPu7s*?r-gga4y4RH=Y^);=JnND?ZtE z(*NnF4$s>%YjrkXavZxvQ`ULzoAIv;_D=72dT{=^^qzmKK70$6N}SAh<$xc4lVg^W9uray#Og3y+ZA)rhN<`AiGOd`1?{;cwyh=hOzKf9>pOir zyOQ4><&VAFfA4Dl!ddUnOi}Ag^VAGdH(r`Jefs0TtAUp#`!YrNHEbUlRK^^ZyKw2H z)tws#*;6*LtcZ5K+-bCupZAnQV8kA)-Ro~e#YC)lywUi;@#m>4_^lN4XIONWIk9DF zPs~=9IPqEY3Ddu22hQ9O;=WSp_`AKaO=;6i?XA^{Zk~Be?)<#H=Wd=ov)=Zm z>gip{ZZS71fqc{$<)XUBoE>l!xJ1hiMdvkxCfU2lb3>x4M+e8 z^b-w$90h%6M+HL#{p3U-2~2cA2_OkXP;-pn<|ycgR2HNv=m#XGrz)r_7=q0WNGwXt zD*E|5aJX4pw#00(xT+lVg*om z1R?ngBLf3- zBTGX=V@nf5Z36>!0|QMY8_khyggDtbu_Q4kKOJlqC|Zi45rK%lilWpsE&~M%E(17F zFf%nZHdRPdfQeZeStx*I74qO>=7vDug8-74nF%mP(Zmc4fyoa|%*+teJWESp1fZ%j zG&BJE2qsoil$e>5S_Cd2gEOmAfldZRMNoczi2}&uko4l2mzJ*p3VCo;7MCOzm4JO{ PXlQE5rK;-c@5TiH!0qKL diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/icon-settings-filled.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/icon-settings-filled.svg new file mode 100644 index 000000000000..289bc9e4a027 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSettings.imageset/icon-settings-filled.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSpinner.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSpinner.imageset/Contents.json index 6cfa4fdda5c5..d4a87fb733c1 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSpinner.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSpinner.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconSpinner.pdf" + "filename" : "spinner.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSpinner.imageset/IconSpinner.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSpinner.imageset/IconSpinner.pdf deleted file mode 100644 index 1856123f209ce381590173ab2ac3a62cd6b2e42d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1313 zcmY!laBlN;ojr=lpZ=X2MehRaWmed4h{sC9B)H^1@c z`jZnywp^VQ8l)*ZR|L-o#GhMN9#Rc)or*^$E z|NR!q7<$f$opY$-i|6cuK$h&SXEmN2G`#h2#-_6tbGlQQ?(i?)yj$j2?N_y!)cbom zf4`gkVaeA;_O9&JS6QywEs$FhHvPfPgv$|XEZY1V%uci<_l1-+E8Jf;rTJ5vBOe#n za;*dATFto-KO+glv(@3`l9EOf|t%jl%5sJqlkdJfB*N1tStJx@w9=a{lkQ?!^RY}3kV zw>5Sp?p~BXCty1FnG{<-`88%96CF?QaZz?&yU{7<#lcH{H>DdiGm?K&H1LLWF|W0 zS13dSg$xwTz$g~1);T|~1gN-J0hDMVDb&3vzqA0!$q*aBqA*tm1MMwJ%quPc*_2!f z6ZTXnDJo5c@tlFGTvE$2lT(A-oj`&RpXdjr7U!21C8riEfWj*X$zLEB!!i!SU&SE3 z`rer-#X$FiydI0q-!(NYYJ2t@Q%6s4wd87NqA8Nh*pnW?F + Spinner + Mulvad VPN app + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/Contents.json index a0b7acfdf30a..db59ecbad222 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconSuccess.pdf" + "filename" : "positive.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/IconSuccess.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/IconSuccess.pdf deleted file mode 100644 index f74a4f6de718f69097bf4849f423909fbc3109f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1104 zcmZWoTSyd97=8#+<{=}xQ+XcT)(h^O*>Ts^)W}^G%XC>KD6^bq&+d+_Gt10bSrrRI zA}Z5ryOC6M0j*Ga&<6>Mtqi(Igb$_}q0kcDFcJcN=$u*C7CRiy%=yll|Np=5`^VsP zlxA}#3u74k-apUe00@*L4NO4+U@MU9#Xevmkc$BTu%(h8Bb7Y;0!9ubDsIFS6)_rC zkoPYSOu<&K2>1=*)=eE$Mu{Tb8*JOCG{`&r^w~-THE}O-GIAu|u@Ioq43mR7Io#s)s9q7p*wnX#aR=^jmh1g4j?aKIUM1)4C8Z%amz5sk@j1L@#g>IS@THs%kJ4Y zVnQ6lsv!B1s{i=aQVSv_Q!8AGf&nES>z8ubqX4SBZl#6=73&ObR-Q2!N~%hkzpdv_ AEdT%j diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/positive.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/positive.svg new file mode 100644 index 000000000000..5a9e94340682 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconSuccess.imageset/positive.svg @@ -0,0 +1,8 @@ + + + icon-success + Mullvad VPN app + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/Contents.json index 9dd11aed54a2..a77e9155b076 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/Contents.json @@ -1,16 +1,16 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "IconTick.pdf" + "filename" : "icon-checkmark.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/IconTick.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/IconTick.pdf deleted file mode 100644 index afd775f85f3d8f08d6031a85f23835d73215f945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050 zcmZWoO=uHA6viKF-D0WsAQTEuX=sX=o!w+Njl_V>PYtaYlY$lrWxJUqThiSyJCU>= zJo!^BQWbAK)RP5^NU;}D^iUP62SKq1DS8u;N^ccC#Fqfx1&RsV3mU}{tXml@ghGN%3D(Ai z@@#r$K-ev{MK%M`k(Y~C;@xjHnvc%6q~|yHUA{K8=TN?U?|kQtw(o({t)-{IcMmr@ zo?A5NT?<8}C%4h)-jnhBOQJj5HS=Nr^h)SeOQ$?;2+!Weu13y{53bG?el#t#CYy49 z=2|~rc&t3wb@0oP$+hJ>QRR33)3=4;p^>i(%|F|NH$Qr(XNOaCeJVTA-MqTke!cSk zR!7$Xb?n!RO6B#^?8@Qgbm*>t&CFKn?2D7;O!>~ZN`95!^OLt;5~m2!GVM=MRsaYF zIlzXfA$9;UdwZ8SnkZrr6Iu>~3na&HLL=Cu>}jpqXK=>Q z`m8csWDo+`$7kBH4O=E<#x`)ds@n7ut5j@AsT#pSYgwjPT%wtFkw?-eYH%DVDdE~F z%&a2#lA+^de;)^{OvEI%trF3(4ZI%723|blTFY$nviVzaz{uDve@;DF&%MNHHaJil z93+U9De0`q+`48E3nY)EdJwqtlost1A}cOKb3`lV4c+!wB-hj91PZejq=scixG-)R z$q4!7fFyYXKIs@j-3awGMD#aAtfm~+s8+CYjxR2Yy(Pr9d}V^O0)k!v)d#4G;#D9E zHB9mMf^!RI9rLP;Js%C29AJv>z>vh+ZwDr;|NB#YOn@DBeuXirVU%b_0TbsJP8pM! lrOc&BS{4OPyxK2uGiw2_yd$MeH9{SRy(l2KT+y>J;UCgZDIx#> diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/icon-checkmark.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/icon-checkmark.svg new file mode 100644 index 000000000000..41602b60f219 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTick.imageset/icon-checkmark.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTickSml.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTickSml.imageset/Contents.json index 10a4cd7580ef..a77e9155b076 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTickSml.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTickSml.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconTickSml.pdf", + "filename" : "icon-checkmark.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTickSml.imageset/IconTickSml.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconTickSml.imageset/IconTickSml.pdf deleted file mode 100644 index e1b433b799817a78779243d29576195397b4b6cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1045 zcmZWoO=uHA7!@g1mtIs5!J?y*+EkmJO}a^H)6z75ZM8L|DirNu+)TGCaVN}9YASkZ zDHVS}5C!WG?ZKN0iUq-gMJWij>cRF>Jm^6WRS#*^GRN601%KfXQe;@$VaiMvjL!TC?Np={=>9zgsd;g9uZ{OVhyZ-HP_xGv5 zmDzEvR~?W)%=&d*)U%}#!}bUik|r}gX7e6Rj!-?k-v{8_Ynv7_px z@dFO0pPx?Wo8COEez$8wYx7nKo5_`|`J2!yM2aVusrVG}UF6|>Ji8zLs-hb + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/Contents.json index c69f0470049d..6f731b0f2d85 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "IconUnobscure.pdf", + "filename" : "icon-show.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/IconUnobscure.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/IconUnobscure.pdf deleted file mode 100644 index ec2d68e3a2cfef7bc5b2ceb833e325d18e539e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1156 zcmZWpZAcVB7*4{d&4P^bBa5NB^6T8)`@XsaJ@v4(t}~)gsdaBWx31l5cP_LaQbAVq zWtKuw85CgVipW$<#LOQNYBaOworey?&dxLMydTf=G8$)IftJlO zQkss@)=A0$7$8*~qHH!m7eUd3s(=wgE(!oZ7YJSiWxRSh1oI#-xgnLEO({r*+!3n! zW^sM7_=;J4`cHOjLaH%wjdH=7yXwKmcbR=(5B%&odM$m$;81_khCSoYmt06*+xELW z{cTJ3#q`c}*2#|;H%;4yr|bnCL^`yRXB--~PQ zGik4k1{{N)%MB-~jQZmHow4tyn#!kM(4Gaq8qc3AE9xJNNoec(9B?&`j@`;UP;;s; zkeO7t))3d&kP|Emj*jp0KWbkWKeQ!f<%#;34>?WWZghQl8LZRxEt>e$e%N5I)kxmI z12<{|ukVx`o2b=xx8?sxY#!MCZ^2|Pq9`c3XGp?-gkHiaSuv|Ri;kR=ojyXoN_T!W za+DxUHL%$TfCtSncmrsA4qySzbNGt|zz6t?=Zqg+#1EkN)c7Evoty^(4PaHjPELj* z!dJt(7DKnde7K_OA{mF9bG9yp+@*I2ZUyI0 zN_Rza_meWC9GIdUIAzK0=W#oy@|++`fX!k}Sqw<6Ldd6Vp)t7_^~jvBO5l|&N%o|r zse$ac*^wZLc|@309iw9yv(C!0daHrWV3^GelNJ@x92GH?vYkVmSMsR7h%CyC5VP`C z%dnDSfQ4cr1DK3Py%AJ`FlMq~LC64N1T&Z{^Dw;?*F49LVR8G-!Sv?&{>%pJJUfdC zixR$zWKQrxS$!-@gyRsWOr&s05(1>~P`?z4l@cJ#t5Pb6laX4XmBo*aCVy7}^&cGU BV?F=? diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/icon-show.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/icon-show.svg new file mode 100644 index 000000000000..a4b2aa591d32 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconUnobscure.imageset/icon-show.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerSecure.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerSecure.imageset/Contents.json index 5f66d5e4af73..38c215078c07 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerSecure.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerSecure.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "LocationMarkerSecure.pdf" + "filename" : "location-marker-secure.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerSecure.imageset/LocationMarkerSecure.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerSecure.imageset/LocationMarkerSecure.pdf deleted file mode 100644 index ccfb321cace67c7c86ae37fb1f2b69a293f3a3da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2407 zcmd5-3sVzU6vm2l*v4Vnf`(VQT3(Syb^{3s4XyHq7^MVx*rII0k_RChHVXs+>9h(h zbP5_p@ij^vAAnS>*iJE`MQf2NKBziADN+O#TWu|jQ0eZHAcg*b-r32`{m$9F=Y03v z?|3CdMh75)e8{V1sA&`m1~92VhTJH zgWi1?GLQs@=0L_B(&e3+*$C_SL%)8vPg9Py>hX8#eNBA>spiIvas@LY6%;b?i^6LZE^cBjKZAuri)W8V+A`MzodPU^=X|2@Anp|IU~2qN)EJMPH>;!SX187;KeGnuUh@*jXQnl=#c%a zw$sL|hCRck7iGELr(WCpjPG`vEiaG%RO-;{scbEmI&BL&6EEAc!kb-q4H|!V`9yb& zM}cOR2)mb9pUG$Aw#^i1)1y$YJ7iyH? zH)08Z1A_rqfig2io7Ik3?FeH2lZHD;7!H=xJiY2 z3~&=rB?i0z!o-w-5}1wz2>l`hNU=;c8jc&m2NVPY0rR9YrU+a|QqBfIm%)U041wqA zr=&Bn1A|&KkWu>*sLr6LcTyBu;W$7Nd6;z-L3u@D`Dz807!yu|mi!Vi1D;1HFaw~u zOq`Ne2(_j;o>Gd!$*}&b6lu06!n2S@Z^M=4$w`KlxEzWW21-$9QgtnWnMEw7R;ozr zDgxKygiMbrC>kfijUiAbC2kzW4WY;B+Mmpf8?Gh|2^bN9=jd@A&9m@dH)3dW`tshz zj%DdXe{Ns<%}JHtZpV4+k|6taM~g14@3swGd?~WKntgA4{MB~?k}lquXEOJhd*pY- z$Afl??z_3WlNXn8o10GjNflIZGPi#fq z2Hy%#{oy@9mp=03l%3BNzp+K(T)`S7jqVku;7%&Et*{j-YX zYL&j2r8>Bqv+!(!FjlhaOWQL~iMJMkm3Giionp!B>fgOLJ8h~9eB|=+`$@L>rXB3c zIR_v~uTtW_g#S_V-X6Fn(>SN5C*`-Jwobbiy!lCc>NZoQmucj|FIfkD4J3Ok!1eSI z`JDqUxo-yaM+sOjc17*~H8WKmpDWWO@BV4M&$0~r=!>i?b-mtLZJ9S5`HHJ9ZBdQu zZPT}fmvc5%CVo3;TXU{s|CXT_A^unK)w|A#7Hx<+yCUz33oqB?ymDVt-E5!317*hZ z2MTt`Z>?LlU#BY8OFAAE-p>E(UVlsWwXR{bL~sl%^$=YD`tJCHxnrM)l@>QVc{HqS zKwOo@4OQWwwih zV;c6KIqkZ)ts^IZ+(d&pW%oy= zm9Nag@78iYZglFY)v=#D`>T#ri)3{Od+8}R?m5UMtA1f+ap2Z@ZO*Y_d;sYOv$5fn?>>jLcUdQXa$;fEk*zTYdN8XGAU}v2DGp+LNnR8 z6dCL}?anqfvwCc1&E$bj&%y&Tsr;uD`sawtrIszq8Ev{rfMz;-vrBS?WFGd2(f?$B~ zAb4^B0iPel2U);^A;Ms)Sm*(CRtyg2QyEUff{>YhFhcd#X?{ErRc8Oj5WaAxpFr>* zegdkKOnX + location-marker-secure + Mullvad VPN app + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/Contents.json index c877c5f83cb9..8d9fd6c253eb 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "LocationMarkerUnsecure.pdf" + "filename" : "location-marker-unsecure.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/LocationMarkerUnsecure.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/LocationMarkerUnsecure.pdf deleted file mode 100644 index e407bb352a7e78d905f72f883f26c02295cec45c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2405 zcmd5-jaO4;9L7S;9Xg)!Yk=shiGafHy<;024nO$DNzg_L6vkz{?1OE0+}-H}#7dnf z=!CYMQNl4YKbTmQq$fZ!wNykT%_uWT3xS{ytD{Fzdf&@NDEbC8#7>?xH}IG77*w~4oIamdNP)_gBKu#0||HMa8q%#nT5etfSO=9I*Fle zmQm#lufU<+3RG}ihBR9(XeISJFPs8c#zuKZaWE>LTBBD}%A{BXdg@bBR@%m>DJwu+ zDo5271;>cvQH>}aN$XLKh}a%Z&qEqo22EX%ec(I{Y|lx%wsfi^ zXW;L5OAmjpTexfL^i3JONt+H8cWl1sD_GhQe{n1S`q0qCMG+b2zn|`G{<*m;??-u4 zWR>j3%%C9l{Iak+|D-ILP!V-!+^oWoWd8KQ#KF~}j}d-8@~J*OvoEodfUQ0u$z?U$ zLd)h^K6)>*v7uWq!S^J*dnnYMu1v0Yh?a_@tQ%=k4g|m}y;8kH1#7 za;wf#;-}lcD{Ssp>C$Ay>i2z5-ehJi0NE3GXItfpr}Tf!-#+cF8bN=+tMK@)aqi@o zkKe~rT+=GTmx*7l-`$0~H1_eXu2sJu@|{*aXUfLoneRBugPphge#+k;YGwI@5rHQ@ z&iip+K;e{#?gWY7{py6hzi2Y`%L`S8mAlSv4tX|rQsQ~P3pLl~QH65=Bx#- zz$?xp>%KO+3pmdhd>b`%&SS=$ER`$QEo%`09Dvg#clp(?5I9!J5ZIKI(DU z+xD&9nfJq{XZM*;K zN6nlw@A)tPT^u(#x@Sr6Z0uZS##qTir_CdI5~n3ce*tTrUV zqvVZ1;_LlFIzwx0YUr$?YEsY8fDjN80S-cSENihwW6(7qs%1!vPOr8KXhs_r#;p_w zeV5hK=6EDZq0pFcJW41dh)9`;Scu~xI36~7$+1btkt}JXwcN*$ZCE`<@t?ie87iNL z1478dM=l@{izCG#A9yfADuQi+E@1XzxJU#W=pihU7#oKZ&|4ph6Uv|iJ%|xvDRhVj zFbhfHXZE2MHXNAIp$>BgJqAq|z5rhy&y(N}7gSiMSlL$P{xv a+%dGBo~|MpmSatbN6C1>!3k-Jyng|ZsXi?L diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/location-marker-unsecure.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/location-marker-unsecure.svg new file mode 100644 index 000000000000..c46bdde2d723 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LocationMarkerUnsecure.imageset/location-marker-unsecure.svg @@ -0,0 +1,19 @@ + + location-marker-unsecure + Mullvad VPN app + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/Contents.json index 4199af9556e4..1c02bd45e7fe 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/Contents.json @@ -1,15 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "LogoIcon.pdf" + "filename" : "logo-icon.svg", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "preserves-vector-representation" : true } -} \ No newline at end of file +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/LogoIcon.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/LogoIcon.pdf deleted file mode 100644 index 71201faeb991343808162be36bcf53944d7b82fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1974 zcmZWq3s}=u6m~;VyNW1^+i*6@y5a^jX(<#3l$S+79+pvgC=yG6YDr2Gu!@LtZakzF zCSwjC;1tK4fWYJ-R7Ku6KON5D$3sNWp$wTQAfU3Oh~snjOLBAnoO{ms&$-_pwy&$$ z0cG3@LB?s^1`AR_?*1xXkH0C2@}1&QF)tbj?x6_H_K2*bgF zL6A5CM=?}Kzm|HUVK&T;{v|tD3A3~Ts%8k+IO!{Y4k8^pqqQuJH`1Sztup{wX87l@|ih! zaxzCRz2Mi8#zXTxF`Dh zY3*&=a{bQAQyfp1to_Zk35Whzn-I1C_wX)z=AQT?P$2l(NnUaOit(J|_rH91_=5(o zS*@9EilVY}Hl}$S&aGcq$TDC;2S!Vs`bqmM;#{$DfY->guB44gKK;EK zhy10JHUk#nj~0o$q_QKc!UIjc9r;?uJWYc8Vf200(~uHxSMcb^=E=(7JHNEA>pD?& zLu+teFSdSU=f@9?o5%}ku^Bayas1E;IJBPh|83UZT~~6G689>rttNV-f!5@%+q2N- z*uNyZyBse>{xr`@TVhsJt>3pA-lNR?WYG<=X59aZ$buWl{L?&f=@O3vTZ7-*S6t$+ zNh~aM``e^ItnwEpxIN)(iLCS-==q!>Vx+&VU4KlQ=WvV}cdp6qD<|jfZOd~EuS)0r zfz+ArD32dDFs^NjiW{)E4SiKtacCq?$U!3pAC!3+>Ft}Vksdx#{jTWPSk*RDv+~gA z#YKAaZ(kqr?#s|12lBL6(UStOgcF(V?cY1EapUgAsm0fMr~RDN7Ad($H4LV|c&l$u z`RA7^9c6bneqNeWIs6y}AFN2kr5*e1x!z~9^?_D+hfGhAaks3(-FXG?@4}pH<>04R zPVQ>_{++LWcA8k+?}0ue)ma`j`@!*#I<`BPT|_T%&C}-#@k3<>?U`mt4y)XyO4a?- zPoLlZvfNz(M-c0N+U>>mC_P!bS3N28HII(U8YpP{W{l%jh4iQc?fYYYmL`bS$1O~1 z&TWZLo69nj&an`1Oj<+iVQrAnCbODN!7L^#v-U&&kbibuMamXN-EMW3TcroTzbwqGv+@id*FG$G8Q^xU(&X~xMUM6bAF`#F`>~=` zFuQ>{@*=s2nVMGFSzW6R6zUuN=(uG^*05bm)Ao+Qzb3xx-mHX0>o`F@J9`WRQo%cj z!(-JA{g-vQ-J9!%*!L#a-!qN(nVi*9#&cpIXxM8>q26dQq7{gqDGh=^TWi{YUh>~) zl}?@3sz^6Kl2RtX&W;AC!G%F;0dQTM00`j9VCqTf74?C7QrBxgyf=OT?iV|i2*CA) zBM^WMKsvv^Fpi)kwRKtsy^t_D?2M^^U;xeSrGIn&@27p?>$uozs15CB~f z$qZ(6&eLlCA2Wj9%k`9p5flTOyabreJ%%Pa!-4e-2fjEK79*qd-%JL}aSVVgA!|zz zFpDHfC9#G}m6t*za99~Bml2j29Pol9j0f^S(1vFVL3~>)=ra)H zfZ*yG5p8BfoJ!dRCSe5@q4PyIhIrkI{~D;mk#GhG2pQm;0ayzJd;t&+yv85_NEL$~ z0Qv^w38{j;jY0pj13`#7fp6JCLgD`~fi+dHx9qHi)ESw^NF0_c5M1|n^^@;HsFdke mNHB~9XyQ}n#T^aD0J`$JRuUwPlRAcw4WGwgv)B5F8UF%P=m(Ji diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/logo-icon.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/logo-icon.svg new file mode 100644 index 000000000000..9df70ac22bf1 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoIcon.imageset/logo-icon.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/Contents.json index 7582073b99e5..f15c0d8b3508 100644 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/Contents.json +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "LogoText.pdf", + "filename" : "logo-text.svg", "idiom" : "universal" } ], diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/LogoText.pdf b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/LogoText.pdf deleted file mode 100644 index 90f2c0a132782c4866e2c13ad6437a631c4838e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2431 zcmZ8j2{=@1AD1o0dXcyvI$}a<7Gs9#B8;(CL=&1U!<=El%ruLoFW=3QM9Eet+s%@- zl&ut{P~j>SgPyEiLLypS!#$&PeZ9|l&U@b9`~H{T|NlPE@4#JbYKVHOrJ4wns5LSW(9 zAs$Xi8YZ%@rd4=RH6J(g&S+={=9?$xo=p2&Y{aLc&foX)!&HygI>Z|dht*dEq&eru zGia0L`l}ORi|5;kE6aii!52NB-78Kv$IzU{rb(%p!n^Sc1;a!0Y7NJ{!QF=tup#$9 zmn&3{r6N*?FQ&&oo9Nlx-u6F{+~Yo);djS+v_fJSH2Zm7)e0?H&zLP)J8!=V?icLu zV@FF-4F^(Wv&ekrxC-#4<=?Y_RGu34N_u|Fea z^g)KqBf?(kg(gegm@lJy_g#2{$|gC;%SN6&e!R%F7kk@U^n!lP1!^m4k9!TE8%&Pt ztKBv}*;}`l_}ir8G`=%TJm~Z(uX%+AMN%7eXY}N7dZ&w(=bz_BT}c+|H zqNwm7UerwfxyhIy-`%nr?p@nsQdV%q@9ZVVS63y+ z-sx?>R$!&M!tBYbsl8RncPN5KvARI@?pvyF39@}%+9$$8Gt?}j?-41(4TD$hk>}l& zGwZ!CBFS=XF9!ZBHK?-U>$h{b|X_AWA@jloE}O?DZs-^$nMpu_DW9K zlqYGQYojpE+0rgVuknn=#;!}TRU{DvPHc8x@SVbz=?poyXRsvSD7~sU?yZo~eLmj2 zSZ$3!T4uO@RY$^wQ(?BJ#Xs)BPrRp(7TB9-X%=8^P<2 zTs-J`wvHml57z$L_O>2>^cd-dqsfE5UH`$+BaWtt^wA6L{Iv}94Wy{=4_ zedurZ4khf#2Ns_{5Q3?OC553XhUbH_k2D;-6&YJeBBX77okuwn_t9cevAv$rH1O$o zKyGlC4pHt7sQfjoI3+@4_VXjN9n4KNNjty#Qijm|$r@$P%k+IdMW3zIS`2lmU#WoJtUGCQEbQDea?*WU;c`w?jldV zKR#7SG$JxRhfs7r=bCuqO=R};wyIm#=o142ImKQ+(wU3td$z{O4KWW+1(e>u7~>on zc&JR|x8%Xyy|KQgJlR}^Sz9ptg&rMdjM+ZiwS)NB+l zmyD$~Jgjrr$7iJFFX$xrEz1$P*%9%BtZ|v@@y^Y+TYU}#T~_h6LD`dj(*?MhzdT3h zE&+WLsn*04-{2{5iS0h3>Zc02zW% z03M4+U;#7=gTUdTVFGxqnh}@`E@a06gp&A8|LoXI9&258--4~8YYDqSDX=LF4oeu+ zKVl7b0Jv-(xV9odr)*OpNeoGzM>sHbkNHP$+|S5lz-b{FX9- z!leW=16F+rJH+|klYcuI&IV~P6krNN{TKiai^X688t@%MMp?eftg^S0tv@D z42Q-4jG<6y=qmnv4g=NZ|1pRf)PSEbGzMa{hH=>xdN9ad{Y`SC9|NJ3g{^R9GP!_| i__zDwz@RY!VdYm_$>CDi+*O7~Xj4244ktR>!u|n|W!}vI diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/logo-text.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/logo-text.svg new file mode 100644 index 000000000000..c3296186c229 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/LogoText.imageset/logo-text.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + From bce80168f6a35447b3eca8e62ce9d14c966e84a9 Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Thu, 6 Mar 2025 16:08:47 +0100 Subject: [PATCH 02/11] Add a fudge for compensating for SVG assets having borders baked in --- ios/MullvadVPN/Containers/Root/HeaderBarView.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ios/MullvadVPN/Containers/Root/HeaderBarView.swift b/ios/MullvadVPN/Containers/Root/HeaderBarView.swift index 8503b591cf27..95fe56b29cab 100644 --- a/ios/MullvadVPN/Containers/Root/HeaderBarView.swift +++ b/ios/MullvadVPN/Containers/Root/HeaderBarView.swift @@ -84,7 +84,17 @@ class HeaderBarView: UIView { return button }() + class func prepareHeaderBarButtonImage(from image: UIImage) -> UIImage { + // The SVGs we get from desktop have a 20x20 graphic with a 2-pixel border on each side, making 24x24 + // The PDFs we had were trimmed, with the entire image scaled up to 24x24 + // to compensate, we need to resize the images by 6/5, to 28.8x28.8 + let resizeRatio = 24.0 / 20.0 + let targetSize = CGSize(width: image.size.width * resizeRatio, height: image.size.height * resizeRatio) + return image.resizeImage(targetSize: targetSize) + } + class func makeHeaderBarButton(with image: UIImage?) -> IncreasedHitButton { + let image = image.map { prepareHeaderBarButtonImage(from: $0) } let buttonImage = image?.withTintColor(UIColor.HeaderBar.buttonColor, renderingMode: .alwaysOriginal) let disabledButtonImage = image?.withTintColor( UIColor.HeaderBar.disabledButtonColor, From 9f25d2ec30b0e71ffca6619d848b56b5cfe9b388 Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Thu, 6 Mar 2025 19:02:49 +0100 Subject: [PATCH 03/11] Add central source of truth for image assets in UIImage ext --- ios/MullvadVPN.xcodeproj/project.pbxproj | 8 +- .../UINavigationBar+Appearance.swift | 4 +- .../Containers/Root/HeaderBarView.swift | 11 +- .../Root/RootContainerViewController.swift | 4 +- ...tingsFieldValidationErrorContentView.swift | 2 +- .../Extensions/UIImage+Assets.swift | 115 ++++++++++++++++++ .../Extensions/UITextField+Appearance.swift | 2 +- .../LatestChangesNotificationProvider.swift | 2 +- .../NewDeviceNotificationProvider.swift | 2 +- .../IconCloseSml.imageset/Contents.json | 15 --- .../icon-cross-circle.svg | 8 -- .../Account/AccountDeviceRow.swift | 2 +- .../Account/AccountNumberRow.swift | 8 +- .../Account/RestorePurchasesView.swift | 2 +- .../Alert/AlertViewController.swift | 6 +- .../Welcome/WelcomeContentView.swift | 2 +- .../DeviceList/DeviceRowView.swift | 2 +- .../Login/AccountInputGroupView.swift | 4 +- .../RelayFilter/ChipViewCell.swift | 2 +- .../SelectLocation/LocationCell.swift | 6 +- .../Settings/SelectableSettingsCell.swift | 2 +- .../Settings/SettingsCell.swift | 8 +- .../Settings/SettingsHeaderView.swift | 2 +- .../SwiftUI components/SingleChoiceList.swift | 2 +- ios/MullvadVPN/Views/CheckboxView.swift | 2 +- .../Views/SpinnerActivityIndicatorView.swift | 2 +- ios/MullvadVPN/Views/StatusImageView.swift | 4 +- 27 files changed, 161 insertions(+), 68 deletions(-) create mode 100644 ios/MullvadVPN/Extensions/UIImage+Assets.swift delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/Contents.json delete mode 100644 ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/icon-cross-circle.svg diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index 56aa4423a6a7..33d7aeabee0b 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -42,6 +42,7 @@ 0697D6E728F01513007A9E99 /* TransportMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0697D6E628F01513007A9E99 /* TransportMonitor.swift */; }; 06AC116228F94C450037AF9A /* ApplicationConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BFA5CB22A7CE1F00A6173D /* ApplicationConfiguration.swift */; }; 44075DFB2CDA4F7400F61139 /* UDPOverTCPObfuscationSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44075DFA2CDA4F7400F61139 /* UDPOverTCPObfuscationSettingsViewModel.swift */; }; + 440870822D7A00B70038972F /* UIImage+Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440870812D7A00B00038972F /* UIImage+Assets.swift */; }; 440E5AB02CDBD67D00B09614 /* StatefulPreviewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440E5AAF2CDBD67D00B09614 /* StatefulPreviewWrapper.swift */; }; 440E5AB42CDCF24500B09614 /* TunnelObfuscationSettingsWatchingObservableObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440E5AB32CDCF24500B09614 /* TunnelObfuscationSettingsWatchingObservableObject.swift */; }; 4419AA8B2D2826E5001B13C9 /* DetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4419AA8A2D2826E5001B13C9 /* DetailsView.swift */; }; @@ -630,10 +631,10 @@ 7A9CCCC32A96302800DD6A34 /* ApplicationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9CCCB12A96302800DD6A34 /* ApplicationCoordinator.swift */; }; 7A9CCCC42A96302800DD6A34 /* TunnelCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9CCCB22A96302800DD6A34 /* TunnelCoordinator.swift */; }; 7A9F28FC2CA69D0C005F2089 /* DAITASettingsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9F28FB2CA69D04005F2089 /* DAITASettingsTests.swift */; }; + 7A9F29352CAA8829005F2089 /* AccessMethodsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9F29342CAA8823005F2089 /* AccessMethodsTests.swift */; }; 7A9F29392CABFAFC005F2089 /* InfoHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9F29382CABFAEC005F2089 /* InfoHeaderView.swift */; }; 7A9F293B2CAC4443005F2089 /* InfoHeaderConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9F293A2CAC4420005F2089 /* InfoHeaderConfig.swift */; }; 7A9F293D2CAD2FD5005F2089 /* InfoModalConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9F293C2CAD2FCF005F2089 /* InfoModalConfig.swift */; }; - 7A9F29352CAA8829005F2089 /* AccessMethodsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9F29342CAA8823005F2089 /* AccessMethodsTests.swift */; }; 7A9FA1422A2E3306000B728D /* CheckboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9FA1412A2E3306000B728D /* CheckboxView.swift */; }; 7A9FA1442A2E3FE5000B728D /* CheckableSettingsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9FA1432A2E3FE5000B728D /* CheckableSettingsCell.swift */; }; 7AA130992CFF365D00640DF9 /* ConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AA130982CFF365A00640DF9 /* ConnectionView.swift */; }; @@ -1592,6 +1593,7 @@ 06FAE67B28F83CA50033DD93 /* REST.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = REST.swift; sourceTree = ""; }; 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTransport.swift; sourceTree = ""; }; 44075DFA2CDA4F7400F61139 /* UDPOverTCPObfuscationSettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UDPOverTCPObfuscationSettingsViewModel.swift; sourceTree = ""; }; + 440870812D7A00B00038972F /* UIImage+Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Assets.swift"; sourceTree = ""; }; 440E5AAF2CDBD67D00B09614 /* StatefulPreviewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatefulPreviewWrapper.swift; sourceTree = ""; }; 440E5AB32CDCF24500B09614 /* TunnelObfuscationSettingsWatchingObservableObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelObfuscationSettingsWatchingObservableObject.swift; sourceTree = ""; }; 4419AA8A2D2826E5001B13C9 /* DetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsView.swift; sourceTree = ""; }; @@ -2146,10 +2148,10 @@ 7A9CCCB12A96302800DD6A34 /* ApplicationCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationCoordinator.swift; sourceTree = ""; }; 7A9CCCB22A96302800DD6A34 /* TunnelCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TunnelCoordinator.swift; sourceTree = ""; }; 7A9F28FB2CA69D04005F2089 /* DAITASettingsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DAITASettingsTests.swift; sourceTree = ""; }; + 7A9F29342CAA8823005F2089 /* AccessMethodsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessMethodsTests.swift; sourceTree = ""; }; 7A9F29382CABFAEC005F2089 /* InfoHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoHeaderView.swift; sourceTree = ""; }; 7A9F293A2CAC4420005F2089 /* InfoHeaderConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoHeaderConfig.swift; sourceTree = ""; }; 7A9F293C2CAD2FCF005F2089 /* InfoModalConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoModalConfig.swift; sourceTree = ""; }; - 7A9F29342CAA8823005F2089 /* AccessMethodsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessMethodsTests.swift; sourceTree = ""; }; 7A9FA1412A2E3306000B728D /* CheckboxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxView.swift; sourceTree = ""; }; 7A9FA1432A2E3FE5000B728D /* CheckableSettingsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckableSettingsCell.swift; sourceTree = ""; }; 7AA130982CFF365A00640DF9 /* ConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionView.swift; sourceTree = ""; }; @@ -3331,6 +3333,7 @@ 5891BF5025E66B1E006D6FB0 /* UIBarButtonItem+KeyboardNavigation.swift */, 587CBFE222807F530028DED3 /* UIColor+Helpers.swift */, 7ABE318C2A1CDD4500DF4963 /* UIFont+Weight.swift */, + 440870812D7A00B00038972F /* UIImage+Assets.swift */, F062000B2CB7EB5D002E6DB9 /* UIImage+Helpers.swift */, 58CEB2FA2AFD13E600E6E088 /* UIListContentConfiguration+Extensions.swift */, 58CEB2FC2AFD19D300E6E088 /* UITableView+ReuseIdentifier.swift */, @@ -6171,6 +6174,7 @@ F062000C2CB7EB5D002E6DB9 /* UIImage+Helpers.swift in Sources */, F910A4012D3FF23A002FF3BB /* View+Modifier.swift in Sources */, 7A6389EB2B7FAD7A008E77E1 /* SettingsFieldValidationErrorContentView.swift in Sources */, + 440870822D7A00B70038972F /* UIImage+Assets.swift in Sources */, 7A8A19282CF603EB000BCB5B /* SettingsViewControllerFactory.swift in Sources */, 58B26E2A2943545A00D5980C /* NotificationManagerDelegate.swift in Sources */, 7A8A19072CE4E9D3000BCB5B /* SettingsInfoView.swift in Sources */, diff --git a/ios/MullvadVPN/Containers/Navigation/UINavigationBar+Appearance.swift b/ios/MullvadVPN/Containers/Navigation/UINavigationBar+Appearance.swift index 3c675c936c89..ee9bd56c0c0a 100644 --- a/ios/MullvadVPN/Containers/Navigation/UINavigationBar+Appearance.swift +++ b/ios/MullvadVPN/Containers/Navigation/UINavigationBar+Appearance.swift @@ -31,11 +31,11 @@ extension UINavigationBar { } private func makeNavigationBarAppearance(isTransparent: Bool) -> UINavigationBarAppearance { - let backIndicatorImage = UIImage(named: "IconBack")?.withTintColor( + let backIndicatorImage = UIImage.Buttons.back.withTintColor( UIColor.NavigationBar.buttonColor, renderingMode: .alwaysOriginal ) - let backIndicatorTransitionMask = UIImage(named: "IconBackTransitionMask") + let backIndicatorTransitionMask = UIImage.backTransitionMask let titleTextAttributes: [NSAttributedString.Key: Any] = [ .foregroundColor: UIColor.NavigationBar.titleColor, diff --git a/ios/MullvadVPN/Containers/Root/HeaderBarView.swift b/ios/MullvadVPN/Containers/Root/HeaderBarView.swift index 95fe56b29cab..5145050f7bee 100644 --- a/ios/MullvadVPN/Containers/Root/HeaderBarView.swift +++ b/ios/MullvadVPN/Containers/Root/HeaderBarView.swift @@ -57,7 +57,7 @@ class HeaderBarView: UIView { }() let accountButton: UIButton = { - let button = makeHeaderBarButton(with: UIImage(named: "IconAccount")) + let button = makeHeaderBarButton(with: UIImage.Buttons.account) button.setAccessibilityIdentifier(.accountButton) button.accessibilityLabel = NSLocalizedString( "HEADER_BAR_ACCOUNT_BUTTON_ACCESSIBILITY_LABEL", @@ -71,7 +71,7 @@ class HeaderBarView: UIView { }() let settingsButton: UIButton = { - let button = makeHeaderBarButton(with: UIImage(named: "IconSettings")) + let button = makeHeaderBarButton(with: UIImage.Buttons.settings) button.setAccessibilityIdentifier(.settingsButton) button.accessibilityLabel = NSLocalizedString( "HEADER_BAR_SETTINGS_BUTTON_ACCESSIBILITY_LABEL", @@ -85,16 +85,13 @@ class HeaderBarView: UIView { }() class func prepareHeaderBarButtonImage(from image: UIImage) -> UIImage { - // The SVGs we get from desktop have a 20x20 graphic with a 2-pixel border on each side, making 24x24 - // The PDFs we had were trimmed, with the entire image scaled up to 24x24 - // to compensate, we need to resize the images by 6/5, to 28.8x28.8 let resizeRatio = 24.0 / 20.0 let targetSize = CGSize(width: image.size.width * resizeRatio, height: image.size.height * resizeRatio) - return image.resizeImage(targetSize: targetSize) + return image // .resizeImage(targetSize: targetSize) } class func makeHeaderBarButton(with image: UIImage?) -> IncreasedHitButton { - let image = image.map { prepareHeaderBarButtonImage(from: $0) } +// let image = image.map { prepareHeaderBarButtonImage(from: $0) } let buttonImage = image?.withTintColor(UIColor.HeaderBar.buttonColor, renderingMode: .alwaysOriginal) let disabledButtonImage = image?.withTintColor( UIColor.HeaderBar.disabledButtonColor, diff --git a/ios/MullvadVPN/Containers/Root/RootContainerViewController.swift b/ios/MullvadVPN/Containers/Root/RootContainerViewController.swift index 61975b01b81e..4abc1dc7da6c 100644 --- a/ios/MullvadVPN/Containers/Root/RootContainerViewController.swift +++ b/ios/MullvadVPN/Containers/Root/RootContainerViewController.swift @@ -383,7 +383,7 @@ class RootContainerViewController: UIViewController { transitionViewButton.removeFromSuperview() button = transitionViewButton } else { - button = HeaderBarView.makeHeaderBarButton(with: UIImage(named: "IconAccount")) + button = HeaderBarView.makeHeaderBarButton(with: UIImage.Buttons.account) button.addTarget( self, action: #selector(handleAccountButtonTap), @@ -404,7 +404,7 @@ class RootContainerViewController: UIViewController { transitionViewButton.removeFromSuperview() button = transitionViewButton } else { - button = HeaderBarView.makeHeaderBarButton(with: UIImage(named: "IconSettings")) + button = HeaderBarView.makeHeaderBarButton(with: UIImage.Buttons.settings) button.isEnabled = headerBarView.settingsButton.isEnabled button.addTarget( self, diff --git a/ios/MullvadVPN/Coordinators/Settings/SettingsFieldValidationErrorContentView.swift b/ios/MullvadVPN/Coordinators/Settings/SettingsFieldValidationErrorContentView.swift index 078a4c9cffcd..9178b65f2ce5 100644 --- a/ios/MullvadVPN/Coordinators/Settings/SettingsFieldValidationErrorContentView.swift +++ b/ios/MullvadVPN/Coordinators/Settings/SettingsFieldValidationErrorContentView.swift @@ -12,7 +12,7 @@ class SettingsFieldValidationErrorContentView: UIView, UIContentView { let contentView = UIStackView() var icon: UIImageView { - let view = UIImageView(image: UIImage(resource: .iconAlert).withTintColor(.dangerColor)) + let view = UIImageView(image: UIImage.Buttons.alert.withTintColor(.dangerColor)) view.heightAnchor.constraint(equalToConstant: 14).isActive = true view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: 1).isActive = true return view diff --git a/ios/MullvadVPN/Extensions/UIImage+Assets.swift b/ios/MullvadVPN/Extensions/UIImage+Assets.swift new file mode 100644 index 000000000000..b21e934e051a --- /dev/null +++ b/ios/MullvadVPN/Extensions/UIImage+Assets.swift @@ -0,0 +1,115 @@ +// +// UIImage+Assets.swift +// MullvadVPN +// +// Created by Andrew Bulhak on 2025-03-06. +// Copyright © 2025 Mullvad VPN AB. All rights reserved. +// + +import UIKit + +extension UIImage { + enum Buttons { + // Button images we expect as tightly cropped 24x24 images. The SVGs are 20x20 with a 2px border + static var account: UIImage { + UIImage(resource: .iconAccount).rescaled(by: 24 / 20) + } + + static var alert: UIImage { + UIImage(resource: .iconAlert).rescaled(by: 24 / 20) + } + + static var info: UIImage { + UIImage(resource: .iconInfo).rescaled(by: 24 / 20) + } + + static var settings: UIImage { + UIImage(resource: .iconSettings).rescaled(by: 24 / 20) + } + + static var back: UIImage { + UIImage(resource: .iconBack) + } + + static var copy: UIImage { + UIImage(resource: .iconCopy) + } + + static var hide: UIImage { + UIImage(resource: .iconObscure) + } + + static var reload: UIImage { + UIImage(resource: .iconReload) + } + + static var rightArrow: UIImage { + UIImage(resource: .iconArrow) + } + + static var show: UIImage { + UIImage(resource: .iconUnobscure) + } + + // the close button, which comes we consume in two sizes, both of which come from the same asset + + static var closeSmall: UIImage { + UIImage(named: "IconClose")!.resizeImage(targetSize: CGSize(width: 16, height: 16)) + } + + static var closeLarge: UIImage { + UIImage(named: "IconClose")!.resizeImage(targetSize: CGSize(width: 24, height: 24)) + } + } + + enum CellDecoration { + static var chevronRight: UIImage { + UIImage(resource: .iconChevron) + } + + static var chevronDown: UIImage { + UIImage(resource: .iconChevronDown) + } + + static var chevronUp: UIImage { + UIImage(resource: .iconChevronUp) + } + + static var externalLink: UIImage { + UIImage(resource: .iconExtlink) + } + + static var tick: UIImage { + UIImage(resource: .iconTickSml) + .resizeImage(targetSize: CGSize(width: 16, height: 16)) + } + } + + enum Status { + static var failure: UIImage { UIImage(resource: .iconFail) } + static var success: UIImage { UIImage(resource: .iconSuccess) } + } + + // miscellaneous images + static var backTransitionMask: UIImage { + UIImage(resource: .iconBackTransitionMask) + } + + static var spinner: UIImage { + UIImage(resource: .iconSpinner) + } + + static var tick: UIImage { + UIImage(resource: .iconTickSml) + .resizeImage(targetSize: CGSize(width: 24, height: 24)) + } + + // a utility function to resize an image by an aspect ratio; + // used for compensating for scalable assets' nominal sizes being off + func rescaled(by ratio: CGFloat) -> UIImage { + resizeImage(targetSize: CGSize( + width: size.width * ratio, + height: size.height * ratio + )) + } +} diff --git a/ios/MullvadVPN/Extensions/UITextField+Appearance.swift b/ios/MullvadVPN/Extensions/UITextField+Appearance.swift index a1b0be8b3e62..9b6e94b80a29 100644 --- a/ios/MullvadVPN/Extensions/UITextField+Appearance.swift +++ b/ios/MullvadVPN/Extensions/UITextField+Appearance.swift @@ -36,7 +36,7 @@ extension UITextField { func apply(to searchBar: UISearchBar) { searchBar.setImage( - UIImage(named: "IconCloseSml")?.withTintColor(leftViewTintColor), + UIImage.Buttons.closeSmall.withTintColor(leftViewTintColor), for: .clear, state: .normal ) diff --git a/ios/MullvadVPN/Notifications/Notification Providers/LatestChangesNotificationProvider.swift b/ios/MullvadVPN/Notifications/Notification Providers/LatestChangesNotificationProvider.swift index 42e4cac792a4..59441d899d07 100644 --- a/ios/MullvadVPN/Notifications/Notification Providers/LatestChangesNotificationProvider.swift +++ b/ios/MullvadVPN/Notifications/Notification Providers/LatestChangesNotificationProvider.swift @@ -70,7 +70,7 @@ class LatestChangesNotificationProvider: NotificationProvider, InAppNotification private func createCloseButtonAction() -> InAppNotificationAction { InAppNotificationAction( - image: UIImage(named: "IconCloseSml"), + image: UIImage.Buttons.closeSmall, handler: { [weak self] in self?.invalidate() } diff --git a/ios/MullvadVPN/Notifications/Notification Providers/NewDeviceNotificationProvider.swift b/ios/MullvadVPN/Notifications/Notification Providers/NewDeviceNotificationProvider.swift index f5b8435dbcc2..22a7a09da507 100644 --- a/ios/MullvadVPN/Notifications/Notification Providers/NewDeviceNotificationProvider.swift +++ b/ios/MullvadVPN/Notifications/Notification Providers/NewDeviceNotificationProvider.swift @@ -58,7 +58,7 @@ final class NewDeviceNotificationProvider: NotificationProvider, ), body: attributedBody, button: InAppNotificationAction( - image: UIImage(named: "IconCloseSml"), + image: UIImage.Buttons.closeSmall, handler: { [weak self] in guard let self else { return } isNewDeviceRegistered = false diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/Contents.json deleted file mode 100644 index 2c3810a7f3ad..000000000000 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/Contents.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon-cross-circle.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true - } -} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/icon-cross-circle.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/icon-cross-circle.svg deleted file mode 100644 index 37698f569096..000000000000 --- a/ios/MullvadVPN/Supporting Files/Assets.xcassets/IconCloseSml.imageset/icon-cross-circle.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/ios/MullvadVPN/View controllers/Account/AccountDeviceRow.swift b/ios/MullvadVPN/View controllers/Account/AccountDeviceRow.swift index aa1fbe0502d3..0489ae2dedf0 100644 --- a/ios/MullvadVPN/View controllers/Account/AccountDeviceRow.swift +++ b/ios/MullvadVPN/View controllers/Account/AccountDeviceRow.swift @@ -44,7 +44,7 @@ class AccountDeviceRow: UIView { button.isExclusiveTouch = true button.setAccessibilityIdentifier(.infoButton) button.tintColor = .white - button.setImage(UIImage(named: "IconInfo"), for: .normal) + button.setImage(UIImage.Buttons.info, for: .normal) return button }() diff --git a/ios/MullvadVPN/View controllers/Account/AccountNumberRow.swift b/ios/MullvadVPN/View controllers/Account/AccountNumberRow.swift index b7fe8626de5d..c14197f32bdb 100644 --- a/ios/MullvadVPN/View controllers/Account/AccountNumberRow.swift +++ b/ios/MullvadVPN/View controllers/Account/AccountNumberRow.swift @@ -141,9 +141,9 @@ class AccountNumberRow: UIView { private var showHideImage: UIImage? { if isObscured { - return UIImage(named: "IconUnobscure") + return UIImage.Buttons.show } else { - return UIImage(named: "IconObscure") + return UIImage.Buttons.hide } } @@ -211,12 +211,12 @@ class AccountNumberRow: UIView { private func showCheckmark(_ showCheckmark: Bool) { if showCheckmark { - let tickIcon = UIImage(named: "IconTick") + let tickIcon = UIImage.tick copyButton.setImage(tickIcon, for: .normal) copyButton.tintColor = .successColor } else { - let copyIcon = UIImage(named: "IconCopy") + let copyIcon = UIImage.Buttons.copy copyButton.setImage(copyIcon, for: .normal) copyButton.tintColor = .white diff --git a/ios/MullvadVPN/View controllers/Account/RestorePurchasesView.swift b/ios/MullvadVPN/View controllers/Account/RestorePurchasesView.swift index 80cd434f99b2..63efbb8cb5b5 100644 --- a/ios/MullvadVPN/View controllers/Account/RestorePurchasesView.swift +++ b/ios/MullvadVPN/View controllers/Account/RestorePurchasesView.swift @@ -34,7 +34,7 @@ class RestorePurchasesView: UIView { private lazy var infoButton: UIButton = { let button = IncreasedHitButton(type: .custom) button.isExclusiveTouch = true - button.setImage(UIImage(resource: .iconInfo), for: .normal) + button.setImage(UIImage.Buttons.info, for: .normal) button.tintColor = .white button.addTarget(self, action: #selector(didTapInfoButton), for: .touchUpInside) return button diff --git a/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift b/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift index b83286e1eede..296e09227ef0 100644 --- a/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift +++ b/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift @@ -31,11 +31,11 @@ enum AlertIcon { fileprivate var image: UIImage? { switch self { case .alert: - return UIImage(named: "IconAlert")?.withTintColor(.dangerColor) + return UIImage.Buttons.alert.withTintColor(.dangerColor) case .warning: - return UIImage(named: "IconAlert")?.withTintColor(.white) + return UIImage.Buttons.alert.withTintColor(.white) case .info: - return UIImage(named: "IconInfo")?.withTintColor(.white) + return UIImage.Buttons.info.withTintColor(.white) default: return nil } diff --git a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeContentView.swift b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeContentView.swift index a892e15bafc8..35727cf6ceb2 100644 --- a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeContentView.swift +++ b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeContentView.swift @@ -78,7 +78,7 @@ final class WelcomeContentView: UIView, Sendable { button.setAccessibilityIdentifier(.infoButton) button.tintColor = .white button.translatesAutoresizingMaskIntoConstraints = false - button.setImage(UIImage(named: "IconInfo"), for: .normal) + button.setImage(UIImage.Buttons.info, for: .normal) button.setContentHuggingPriority(.defaultHigh, for: .horizontal) button.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) return button diff --git a/ios/MullvadVPN/View controllers/DeviceList/DeviceRowView.swift b/ios/MullvadVPN/View controllers/DeviceList/DeviceRowView.swift index 313ca732aa98..2576044a095f 100644 --- a/ios/MullvadVPN/View controllers/DeviceList/DeviceRowView.swift +++ b/ios/MullvadVPN/View controllers/DeviceList/DeviceRowView.swift @@ -35,7 +35,7 @@ class DeviceRowView: UIView { }() let removeButton: UIButton = { - let image = UIImage(named: "IconClose")? + let image = UIImage.Buttons.closeLarge .withTintColor( .white.withAlphaComponent(0.4), renderingMode: .alwaysOriginal diff --git a/ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift b/ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift index f5530b3088f6..d3a2cc142df2 100644 --- a/ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift +++ b/ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift @@ -22,7 +22,7 @@ final class AccountInputGroupView: UIView { let sendButton: UIButton = { let button = UIButton(type: .custom) button.translatesAutoresizingMaskIntoConstraints = false - button.setImage(UIImage(named: "IconArrow"), for: .normal) + button.setImage(UIImage.Buttons.rightArrow, for: .normal) button.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) button.setAccessibilityIdentifier(.loginTextFieldButton) button.accessibilityLabel = NSLocalizedString( @@ -125,7 +125,7 @@ final class AccountInputGroupView: UIView { value: "Remove last used account", comment: "" ) - button.configuration?.image = UIImage(resource: .iconCloseSml).withTintColor(.primaryColor) + button.configuration?.image = UIImage.Buttons.closeSmall.withTintColor(.primaryColor) button.configuration?.title = " " return button }() diff --git a/ios/MullvadVPN/View controllers/RelayFilter/ChipViewCell.swift b/ios/MullvadVPN/View controllers/RelayFilter/ChipViewCell.swift index 6daba0ff3ce3..3e1ddff30f14 100644 --- a/ios/MullvadVPN/View controllers/RelayFilter/ChipViewCell.swift +++ b/ios/MullvadVPN/View controllers/RelayFilter/ChipViewCell.swift @@ -37,7 +37,7 @@ class ChipViewCell: UIView, UIContentView { private let closeButton: IncreasedHitButton = { let button = IncreasedHitButton() var buttonConfiguration = UIButton.Configuration.plain() - buttonConfiguration.image = UIImage(resource: .iconCloseSml).withTintColor(.white.withAlphaComponent(0.6)) + buttonConfiguration.image = UIImage.Buttons.closeSmall.withTintColor(.white.withAlphaComponent(0.6)) buttonConfiguration.contentInsets = .zero button.setAccessibilityIdentifier(.relayFilterChipCloseButton) button.configuration = buttonConfiguration diff --git a/ios/MullvadVPN/View controllers/SelectLocation/LocationCell.swift b/ios/MullvadVPN/View controllers/SelectLocation/LocationCell.swift index 6480286db87c..1421db97c97a 100644 --- a/ios/MullvadVPN/View controllers/SelectLocation/LocationCell.swift +++ b/ios/MullvadVPN/View controllers/SelectLocation/LocationCell.swift @@ -33,7 +33,7 @@ class LocationCell: UITableViewCell { }() private let tickImageView: UIImageView = { - let imageView = UIImageView(image: UIImage(resource: .iconTick)) + let imageView = UIImageView(image: UIImage.tick) imageView.tintColor = .white return imageView }() @@ -67,8 +67,8 @@ class LocationCell: UITableViewCell { } private var behavior: LocationCellBehavior = .select - private let chevronDown = UIImage(resource: .iconChevronDown) - private let chevronUp = UIImage(resource: .iconChevronUp) + private let chevronDown = UIImage.CellDecoration.chevronDown + private let chevronUp = UIImage.CellDecoration.chevronUp var isDisabled = false { didSet { diff --git a/ios/MullvadVPN/View controllers/Settings/SelectableSettingsCell.swift b/ios/MullvadVPN/View controllers/Settings/SelectableSettingsCell.swift index 60f31a4aefdf..b458219f7722 100644 --- a/ios/MullvadVPN/View controllers/Settings/SelectableSettingsCell.swift +++ b/ios/MullvadVPN/View controllers/Settings/SelectableSettingsCell.swift @@ -10,7 +10,7 @@ import UIKit class SelectableSettingsCell: SettingsCell { let tickImageView: UIImageView = { - let imageView = UIImageView(image: UIImage(named: "IconTick")) + let imageView = UIImageView(image: UIImage.tick) imageView.contentMode = .center imageView.tintColor = .white imageView.alpha = 0 diff --git a/ios/MullvadVPN/View controllers/Settings/SettingsCell.swift b/ios/MullvadVPN/View controllers/Settings/SettingsCell.swift index 192ed8484e31..8de8c014e1d3 100644 --- a/ios/MullvadVPN/View controllers/Settings/SettingsCell.swift +++ b/ios/MullvadVPN/View controllers/Settings/SettingsCell.swift @@ -19,11 +19,11 @@ enum SettingsDisclosureType { case .none: nil case .chevron: - UIImage(resource: .iconChevron) + UIImage.CellDecoration.chevronRight case .externalLink: - UIImage(resource: .iconExtlink) + UIImage.CellDecoration.externalLink case .tick: - UIImage(resource: .iconTickSml) + UIImage.CellDecoration.tick } } } @@ -83,7 +83,7 @@ class SettingsCell: UITableViewCell, CustomCellDisclosureHandling { let button = UIButton(type: .custom) button.setAccessibilityIdentifier(.infoButton) button.tintColor = .white - button.setImage(UIImage(named: "IconInfo"), for: .normal) + button.setImage(UIImage.Buttons.info, for: .normal) button.isHidden = true return button }() diff --git a/ios/MullvadVPN/View controllers/Settings/SettingsHeaderView.swift b/ios/MullvadVPN/View controllers/Settings/SettingsHeaderView.swift index d2351a1d90a7..1db4841b8a90 100644 --- a/ios/MullvadVPN/View controllers/Settings/SettingsHeaderView.swift +++ b/ios/MullvadVPN/View controllers/Settings/SettingsHeaderView.swift @@ -25,7 +25,7 @@ class SettingsHeaderView: UITableViewHeaderFooterView { let button = UIButton(type: .custom) button.setAccessibilityIdentifier(.infoButton) button.tintColor = .white - button.setImage(UIImage(named: "IconInfo"), for: .normal) + button.setImage(UIImage.Buttons.info, for: .normal) return button }() diff --git a/ios/MullvadVPN/View controllers/Settings/SwiftUI components/SingleChoiceList.swift b/ios/MullvadVPN/View controllers/Settings/SwiftUI components/SingleChoiceList.swift index df39f51bee3e..07e547b68eea 100644 --- a/ios/MullvadVPN/View controllers/Settings/SwiftUI components/SingleChoiceList.swift +++ b/ios/MullvadVPN/View controllers/Settings/SwiftUI components/SingleChoiceList.swift @@ -191,7 +191,7 @@ struct SingleChoiceList: View where Value: Equatable { // Construct a row with arbitrary content and the correct style private func row(isSelected: Bool, @ViewBuilder items: () -> V) -> some View { HStack { - Image(uiImage: UIImage(resource: .iconTick)).opacity(isSelected ? 1.0 : 0.0) + Image(uiImage: UIImage.tick).opacity(isSelected ? 1.0 : 0.0) Spacer().frame(width: UIMetrics.SettingsCell.selectableSettingsCellLeftViewSpacing) items() diff --git a/ios/MullvadVPN/Views/CheckboxView.swift b/ios/MullvadVPN/Views/CheckboxView.swift index 0fbdc91652d7..a1edd3d25458 100644 --- a/ios/MullvadVPN/Views/CheckboxView.swift +++ b/ios/MullvadVPN/Views/CheckboxView.swift @@ -17,7 +17,7 @@ class CheckboxView: UIView { }() private let checkmarkView: UIImageView = { - let imageView = UIImageView(image: UIImage(named: "IconTick")) + let imageView = UIImageView(image: UIImage.tick) imageView.tintColor = .successColor imageView.contentMode = .scaleAspectFit imageView.alpha = 0 diff --git a/ios/MullvadVPN/Views/SpinnerActivityIndicatorView.swift b/ios/MullvadVPN/Views/SpinnerActivityIndicatorView.swift index 9015ef218522..2098a06b978c 100644 --- a/ios/MullvadVPN/Views/SpinnerActivityIndicatorView.swift +++ b/ios/MullvadVPN/Views/SpinnerActivityIndicatorView.swift @@ -31,7 +31,7 @@ class SpinnerActivityIndicatorView: UIView { } } - private let imageView = UIImageView(image: UIImage(named: "IconSpinner")) + private let imageView = UIImageView(image: .spinner) private(set) var isAnimating = false private(set) var style = Style.large diff --git a/ios/MullvadVPN/Views/StatusImageView.swift b/ios/MullvadVPN/Views/StatusImageView.swift index a7c74344320a..e7a19fc15cbb 100644 --- a/ios/MullvadVPN/Views/StatusImageView.swift +++ b/ios/MullvadVPN/Views/StatusImageView.swift @@ -16,9 +16,9 @@ class StatusImageView: UIImageView { fileprivate var image: UIImage? { switch self { case .success: - return UIImage(named: "IconSuccess") + return UIImage.Status.success case .failure: - return UIImage(named: "IconFail") + return UIImage.Status.failure } } } From 390ab90a0f6f27613463bdd6b15e2b00f4064d90 Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Mon, 10 Mar 2025 14:17:33 +0100 Subject: [PATCH 04/11] Adjust size of Info icon --- ios/MullvadVPN/Extensions/UIImage+Assets.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ios/MullvadVPN/Extensions/UIImage+Assets.swift b/ios/MullvadVPN/Extensions/UIImage+Assets.swift index b21e934e051a..4fdcdb3a561f 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Assets.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Assets.swift @@ -20,7 +20,8 @@ extension UIImage { } static var info: UIImage { - UIImage(resource: .iconInfo).rescaled(by: 24 / 20) + // the info icon was 18x18 cropped + UIImage(resource: .iconInfo).resizeImage(targetSize: CGSize(width: 21.5, height: 21.5)) } static var settings: UIImage { From 19b6836a11d577b22f401de573827d050a588fac Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Tue, 11 Mar 2025 17:14:54 +0100 Subject: [PATCH 05/11] Adjust size of close button to account for borders --- ios/MullvadVPN/Extensions/UIImage+Assets.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/MullvadVPN/Extensions/UIImage+Assets.swift b/ios/MullvadVPN/Extensions/UIImage+Assets.swift index 4fdcdb3a561f..cfb5274612d6 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Assets.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Assets.swift @@ -55,11 +55,11 @@ extension UIImage { // the close button, which comes we consume in two sizes, both of which come from the same asset static var closeSmall: UIImage { - UIImage(named: "IconClose")!.resizeImage(targetSize: CGSize(width: 16, height: 16)) + UIImage(named: "IconClose")!.resizeImage(targetSize: CGSize(width: 19, height: 19)) } static var closeLarge: UIImage { - UIImage(named: "IconClose")!.resizeImage(targetSize: CGSize(width: 24, height: 24)) + UIImage(named: "IconClose")!.resizeImage(targetSize: CGSize(width: 29, height: 29)) } } From 114ec0881b28bbe81ce6852afc17a4ab071d7dab Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Tue, 11 Mar 2025 17:33:16 +0100 Subject: [PATCH 06/11] Add UIImage+Assets to test target, at the price of typesafe rsrc IDs --- ios/MullvadVPN.xcodeproj/project.pbxproj | 4 ++ .../Extensions/UIImage+Assets.swift | 40 +++++++++---------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index 33d7aeabee0b..c09e1b3e1646 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -43,6 +43,8 @@ 06AC116228F94C450037AF9A /* ApplicationConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BFA5CB22A7CE1F00A6173D /* ApplicationConfiguration.swift */; }; 44075DFB2CDA4F7400F61139 /* UDPOverTCPObfuscationSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44075DFA2CDA4F7400F61139 /* UDPOverTCPObfuscationSettingsViewModel.swift */; }; 440870822D7A00B70038972F /* UIImage+Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440870812D7A00B00038972F /* UIImage+Assets.swift */; }; + 440870832D809B550038972F /* UIImage+Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440870812D7A00B00038972F /* UIImage+Assets.swift */; }; + 440870842D809C980038972F /* UIImage+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = F062000B2CB7EB5D002E6DB9 /* UIImage+Helpers.swift */; }; 440E5AB02CDBD67D00B09614 /* StatefulPreviewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440E5AAF2CDBD67D00B09614 /* StatefulPreviewWrapper.swift */; }; 440E5AB42CDCF24500B09614 /* TunnelObfuscationSettingsWatchingObservableObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440E5AB32CDCF24500B09614 /* TunnelObfuscationSettingsWatchingObservableObject.swift */; }; 4419AA8B2D2826E5001B13C9 /* DetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4419AA8A2D2826E5001B13C9 /* DetailsView.swift */; }; @@ -5836,6 +5838,7 @@ A9A5F9F32ACB05160083449F /* AccountExpirySystemNotificationProvider.swift in Sources */, A9A5F9F52ACB05160083449F /* NewDeviceNotificationProvider.swift in Sources */, F09D04B72AE941DA003D4F89 /* OutgoingConnectionProxyTests.swift in Sources */, + 440870832D809B550038972F /* UIImage+Assets.swift in Sources */, F09D04B92AE95111003D4F89 /* OutgoingConnectionProxy.swift in Sources */, 7A6000F92B6273A4001CF0D9 /* AccessMethodViewModel.swift in Sources */, 7ABFB09E2BA316220074A49E /* RelayConstraintsTests.swift in Sources */, @@ -5927,6 +5930,7 @@ 44DD7D242B6CFFD70005F67F /* StartTunnelOperationTests.swift in Sources */, 44BB5F982BE527F4002520EB /* TunnelState+UI.swift in Sources */, A9A5FA2B2ACB05160083449F /* CustomDateComponentsFormattingTests.swift in Sources */, + 440870842D809C980038972F /* UIImage+Helpers.swift in Sources */, A9A5FA2C2ACB05160083449F /* DeviceCheckOperationTests.swift in Sources */, A9A5FA2D2ACB05160083449F /* DurationTests.swift in Sources */, A9A5FA2E2ACB05160083449F /* FileCacheTests.swift in Sources */, diff --git a/ios/MullvadVPN/Extensions/UIImage+Assets.swift b/ios/MullvadVPN/Extensions/UIImage+Assets.swift index cfb5274612d6..9ce16d673bfb 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Assets.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Assets.swift @@ -12,44 +12,44 @@ extension UIImage { enum Buttons { // Button images we expect as tightly cropped 24x24 images. The SVGs are 20x20 with a 2px border static var account: UIImage { - UIImage(resource: .iconAccount).rescaled(by: 24 / 20) + UIImage(named: "IconAccount")!.rescaled(by: 24 / 20) } static var alert: UIImage { - UIImage(resource: .iconAlert).rescaled(by: 24 / 20) + UIImage(named: "IconAlert")!.rescaled(by: 24 / 20) } static var info: UIImage { // the info icon was 18x18 cropped - UIImage(resource: .iconInfo).resizeImage(targetSize: CGSize(width: 21.5, height: 21.5)) + UIImage(named: "IconInfo")!.resizeImage(targetSize: CGSize(width: 21.5, height: 21.5)) } static var settings: UIImage { - UIImage(resource: .iconSettings).rescaled(by: 24 / 20) + UIImage(named: "IconSettings")!.rescaled(by: 24 / 20) } static var back: UIImage { - UIImage(resource: .iconBack) + UIImage(named: "IconBack")! } static var copy: UIImage { - UIImage(resource: .iconCopy) + UIImage(named: "IconCopy")! } static var hide: UIImage { - UIImage(resource: .iconObscure) + UIImage(named: "IconObscure")! } static var reload: UIImage { - UIImage(resource: .iconReload) + UIImage(named: "IconReload")! } static var rightArrow: UIImage { - UIImage(resource: .iconArrow) + UIImage(named: "IconArrow")! } static var show: UIImage { - UIImage(resource: .iconUnobscure) + UIImage(named: "IconUnobscure")! } // the close button, which comes we consume in two sizes, both of which come from the same asset @@ -65,43 +65,43 @@ extension UIImage { enum CellDecoration { static var chevronRight: UIImage { - UIImage(resource: .iconChevron) + UIImage(named: "IconChevron")! } static var chevronDown: UIImage { - UIImage(resource: .iconChevronDown) + UIImage(named: "IconChevronDown")! } static var chevronUp: UIImage { - UIImage(resource: .iconChevronUp) + UIImage(named: "IconChevronUp")! } static var externalLink: UIImage { - UIImage(resource: .iconExtlink) + UIImage(named: "IconExtlink")! } static var tick: UIImage { - UIImage(resource: .iconTickSml) + UIImage(named: "IconTickSml")! .resizeImage(targetSize: CGSize(width: 16, height: 16)) } } enum Status { - static var failure: UIImage { UIImage(resource: .iconFail) } - static var success: UIImage { UIImage(resource: .iconSuccess) } + static var failure: UIImage { UIImage(named: "IconFail")! } + static var success: UIImage { UIImage(named: "IconSuccess")! } } // miscellaneous images static var backTransitionMask: UIImage { - UIImage(resource: .iconBackTransitionMask) + UIImage(named: "IconBackTransitionMask")! } static var spinner: UIImage { - UIImage(resource: .iconSpinner) + UIImage(named: "IconSpinner")! } static var tick: UIImage { - UIImage(resource: .iconTickSml) + UIImage(named: "IconTickSml")! .resizeImage(targetSize: CGSize(width: 24, height: 24)) } From 06d2687276e782909a93166653a506e0da33cf24 Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Mon, 17 Mar 2025 21:01:23 +0100 Subject: [PATCH 07/11] Change SVG asset code to trim, rather than just resizing, images --- .../Extensions/UIImage+Assets.swift | 37 ++++++++++--------- .../Extensions/UIImage+Helpers.swift | 35 +++++++++++++++--- .../Alert/AlertViewController.swift | 2 +- 3 files changed, 50 insertions(+), 24 deletions(-) diff --git a/ios/MullvadVPN/Extensions/UIImage+Assets.swift b/ios/MullvadVPN/Extensions/UIImage+Assets.swift index 9ce16d673bfb..d8dac192da1a 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Assets.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Assets.swift @@ -12,20 +12,29 @@ extension UIImage { enum Buttons { // Button images we expect as tightly cropped 24x24 images. The SVGs are 20x20 with a 2px border static var account: UIImage { - UIImage(named: "IconAccount")!.rescaled(by: 24 / 20) + UIImage(named: "IconAccount")! + .resized(to: CGSize(width: 24, height: 24), trimmingBorder: 2) } static var alert: UIImage { - UIImage(named: "IconAlert")!.rescaled(by: 24 / 20) + UIImage(named: "IconAlert")! + .resized(to: CGSize(width: 24, height: 24), trimmingBorder: 2) } static var info: UIImage { // the info icon was 18x18 cropped - UIImage(named: "IconInfo")!.resizeImage(targetSize: CGSize(width: 21.5, height: 21.5)) + UIImage(named: "IconInfo")! + .resized(to: CGSize(width: 18, height: 18), trimmingBorder: 2) + } + + static var infoLarge: UIImage { + UIImage(named: "IconInfo")! + .resized(to: CGSize(width: 44, height: 44), trimmingBorder: 2) } static var settings: UIImage { - UIImage(named: "IconSettings")!.rescaled(by: 24 / 20) + UIImage(named: "IconSettings")! + .resized(to: CGSize(width: 24, height: 24), trimmingBorder: 2) } static var back: UIImage { @@ -52,14 +61,15 @@ extension UIImage { UIImage(named: "IconUnobscure")! } - // the close button, which comes we consume in two sizes, both of which come from the same asset + // the close button, which comes we consume in two sizes, both of which come from the same asset. The SVG is 48x48, though with 4 pixels of border static var closeSmall: UIImage { - UIImage(named: "IconClose")!.resizeImage(targetSize: CGSize(width: 19, height: 19)) + UIImage(named: "IconClose")! + .resized(to: CGSize(width: 16, height: 16), trimmingBorder: 2) } static var closeLarge: UIImage { - UIImage(named: "IconClose")!.resizeImage(targetSize: CGSize(width: 29, height: 29)) + UIImage(named: "IconClose")!.resized(to: CGSize(width: 24, height: 24), trimmingBorder: 2) } } @@ -82,7 +92,7 @@ extension UIImage { static var tick: UIImage { UIImage(named: "IconTickSml")! - .resizeImage(targetSize: CGSize(width: 16, height: 16)) + .resized(to: CGSize(width: 16, height: 16)) } } @@ -102,15 +112,6 @@ extension UIImage { static var tick: UIImage { UIImage(named: "IconTickSml")! - .resizeImage(targetSize: CGSize(width: 24, height: 24)) - } - - // a utility function to resize an image by an aspect ratio; - // used for compensating for scalable assets' nominal sizes being off - func rescaled(by ratio: CGFloat) -> UIImage { - resizeImage(targetSize: CGSize( - width: size.width * ratio, - height: size.height * ratio - )) + .resized(to: CGSize(width: 24, height: 24)) } } diff --git a/ios/MullvadVPN/Extensions/UIImage+Helpers.swift b/ios/MullvadVPN/Extensions/UIImage+Helpers.swift index 335e63c1bae1..c0e0ceaa561d 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Helpers.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Helpers.swift @@ -10,23 +10,48 @@ import UIKit extension UIImage { // Function to resize image while keeping aspect ratio - func resizeImage(targetSize: CGSize) -> UIImage { - let widthRatio = targetSize.width / size.width - let heightRatio = targetSize.height / size.height + // if `trimmingBorder` is specified, that number of pixels will be trimmed off each side before the remaining area is rendered to the new image + func resized(to: CGSize, trimmingBorder border: CGFloat = 0) -> UIImage { + let sourceSize = CGSize(width: size.width - 2 * border, height: size.height - 2 * border) + let widthRatio = to.width / sourceSize.width + let heightRatio = to.height / sourceSize.height let scaleFactor = min(widthRatio, heightRatio) // Calculate new size based on the scale factor - let newSize = CGSize(width: size.width * scaleFactor, height: size.height * scaleFactor) + let newSize = CGSize(width: sourceSize.width * scaleFactor, height: sourceSize.height * scaleFactor) let renderer = UIGraphicsImageRenderer(size: newSize) // Render the new image let resizedImage = renderer.image { _ in - draw(in: CGRect(origin: .zero, size: newSize)) + draw( + in: CGRect( + origin: .init(x: -border, y: -border), + size: .init(width: newSize.width + 2 * border, height: newSize.height + 2 * border) + ) + ) } return resizedImage.withRenderingMode(renderingMode) } + func trimmedAndResized(border: CGFloat, targetSize: CGSize) -> UIImage { + let sourceSize = CGSize(width: size.width - 2 * border, height: size.height - 2 * border) + let widthRatio = targetSize.width / sourceSize.width + let heightRatio = targetSize.height / sourceSize.height + let scaleFactor = min(widthRatio, heightRatio) + + let newSize = CGSize(width: sourceSize.width * scaleFactor, height: sourceSize.height * scaleFactor) + let renderer = UIGraphicsImageRenderer(size: newSize) + return renderer.image { _ in + draw( + in: CGRect( + origin: .init(x: -border, y: -border), + size: .init(width: newSize.width + 2 * border, height: newSize.height + 2 * border) + ) + ) + }.withRenderingMode(renderingMode) + } + func withAlpha(_ alpha: CGFloat) -> UIImage? { return UIGraphicsImageRenderer(size: size, format: imageRendererFormat).image { _ in draw(in: CGRect(origin: .zero, size: size), blendMode: .normal, alpha: alpha) diff --git a/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift b/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift index 296e09227ef0..74dec0702dcb 100644 --- a/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift +++ b/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift @@ -35,7 +35,7 @@ enum AlertIcon { case .warning: return UIImage.Buttons.alert.withTintColor(.white) case .info: - return UIImage.Buttons.info.withTintColor(.white) + return UIImage.Buttons.infoLarge.withTintColor(.white) default: return nil } From ee44a7ebad9e1e50d523e4a08fb76a6fd4ba669f Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Tue, 18 Mar 2025 10:02:12 +0100 Subject: [PATCH 08/11] Remove duplicate function --- .../Extensions/UIImage+Helpers.swift | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/ios/MullvadVPN/Extensions/UIImage+Helpers.swift b/ios/MullvadVPN/Extensions/UIImage+Helpers.swift index c0e0ceaa561d..7b7c8dd4cc3c 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Helpers.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Helpers.swift @@ -34,24 +34,6 @@ extension UIImage { return resizedImage.withRenderingMode(renderingMode) } - func trimmedAndResized(border: CGFloat, targetSize: CGSize) -> UIImage { - let sourceSize = CGSize(width: size.width - 2 * border, height: size.height - 2 * border) - let widthRatio = targetSize.width / sourceSize.width - let heightRatio = targetSize.height / sourceSize.height - let scaleFactor = min(widthRatio, heightRatio) - - let newSize = CGSize(width: sourceSize.width * scaleFactor, height: sourceSize.height * scaleFactor) - let renderer = UIGraphicsImageRenderer(size: newSize) - return renderer.image { _ in - draw( - in: CGRect( - origin: .init(x: -border, y: -border), - size: .init(width: newSize.width + 2 * border, height: newSize.height + 2 * border) - ) - ) - }.withRenderingMode(renderingMode) - } - func withAlpha(_ alpha: CGFloat) -> UIImage? { return UIGraphicsImageRenderer(size: size, format: imageRendererFormat).image { _ in draw(in: CGRect(origin: .zero, size: size), blendMode: .normal, alpha: alpha) From 31b3a159bd8120cc68aff25f070e9e95fbc58049 Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Wed, 19 Mar 2025 14:25:21 +0100 Subject: [PATCH 09/11] Fix image trimming math --- ios/MullvadVPN/Extensions/UIImage+Assets.swift | 4 ++-- ios/MullvadVPN/Extensions/UIImage+Helpers.swift | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ios/MullvadVPN/Extensions/UIImage+Assets.swift b/ios/MullvadVPN/Extensions/UIImage+Assets.swift index d8dac192da1a..7191c35e01dc 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Assets.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Assets.swift @@ -65,11 +65,11 @@ extension UIImage { static var closeSmall: UIImage { UIImage(named: "IconClose")! - .resized(to: CGSize(width: 16, height: 16), trimmingBorder: 2) + .resized(to: CGSize(width: 16, height: 16), trimmingBorder: 4) } static var closeLarge: UIImage { - UIImage(named: "IconClose")!.resized(to: CGSize(width: 24, height: 24), trimmingBorder: 2) + UIImage(named: "IconClose")!.resized(to: CGSize(width: 24, height: 24), trimmingBorder: 4) } } diff --git a/ios/MullvadVPN/Extensions/UIImage+Helpers.swift b/ios/MullvadVPN/Extensions/UIImage+Helpers.swift index 7b7c8dd4cc3c..cacbfb396e69 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Helpers.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Helpers.swift @@ -16,6 +16,7 @@ extension UIImage { let widthRatio = to.width / sourceSize.width let heightRatio = to.height / sourceSize.height let scaleFactor = min(widthRatio, heightRatio) + let scaledBorder = border * scaleFactor // Calculate new size based on the scale factor let newSize = CGSize(width: sourceSize.width * scaleFactor, height: sourceSize.height * scaleFactor) @@ -25,8 +26,8 @@ extension UIImage { let resizedImage = renderer.image { _ in draw( in: CGRect( - origin: .init(x: -border, y: -border), - size: .init(width: newSize.width + 2 * border, height: newSize.height + 2 * border) + origin: .init(x: -scaledBorder, y: -scaledBorder), + size: .init(width: newSize.width + 2 * scaledBorder, height: newSize.height + 2 * scaledBorder) ) ) } From 5215b1c21e28465d577675fe3ec809aabf66cfae Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Thu, 20 Mar 2025 15:22:07 +0100 Subject: [PATCH 10/11] Stop scaling the large Info button --- ios/MullvadVPN/Extensions/UIImage+Assets.swift | 1 - ios/MullvadVPN/View controllers/Alert/AlertViewController.swift | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ios/MullvadVPN/Extensions/UIImage+Assets.swift b/ios/MullvadVPN/Extensions/UIImage+Assets.swift index 7191c35e01dc..697854d6e2ea 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Assets.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Assets.swift @@ -29,7 +29,6 @@ extension UIImage { static var infoLarge: UIImage { UIImage(named: "IconInfo")! - .resized(to: CGSize(width: 44, height: 44), trimmingBorder: 2) } static var settings: UIImage { diff --git a/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift b/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift index 74dec0702dcb..990dc838bdfa 100644 --- a/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift +++ b/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift @@ -284,7 +284,7 @@ class AlertViewController: UIViewController { imageContainerView.addConstrainedSubviews([imageView]) { imageView.pinEdges(.init([.top(0), .bottom(0)]), to: imageContainerView) imageView.centerXAnchor.constraint(equalTo: imageContainerView.centerXAnchor, constant: 0) - imageView.heightAnchor.constraint(equalToConstant: 44) + imageView.heightAnchor.constraint(equalToConstant: 52) imageView.widthAnchor.constraint(equalTo: imageView.heightAnchor, multiplier: 1) } From 518f79d5713370867ab0022d738d74ae0ec67e19 Mon Sep 17 00:00:00 2001 From: Andrew Bulhak Date: Thu, 20 Mar 2025 15:33:51 +0100 Subject: [PATCH 11/11] Remove all resized instances of info icon --- ios/MullvadVPN/Extensions/UIImage+Assets.swift | 6 ------ .../View controllers/Alert/AlertViewController.swift | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/ios/MullvadVPN/Extensions/UIImage+Assets.swift b/ios/MullvadVPN/Extensions/UIImage+Assets.swift index 697854d6e2ea..a9a71e707afe 100644 --- a/ios/MullvadVPN/Extensions/UIImage+Assets.swift +++ b/ios/MullvadVPN/Extensions/UIImage+Assets.swift @@ -22,12 +22,6 @@ extension UIImage { } static var info: UIImage { - // the info icon was 18x18 cropped - UIImage(named: "IconInfo")! - .resized(to: CGSize(width: 18, height: 18), trimmingBorder: 2) - } - - static var infoLarge: UIImage { UIImage(named: "IconInfo")! } diff --git a/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift b/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift index 990dc838bdfa..33fd20a7f15e 100644 --- a/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift +++ b/ios/MullvadVPN/View controllers/Alert/AlertViewController.swift @@ -35,7 +35,7 @@ enum AlertIcon { case .warning: return UIImage.Buttons.alert.withTintColor(.white) case .info: - return UIImage.Buttons.infoLarge.withTintColor(.white) + return UIImage.Buttons.info.withTintColor(.white) default: return nil } @@ -284,7 +284,7 @@ class AlertViewController: UIViewController { imageContainerView.addConstrainedSubviews([imageView]) { imageView.pinEdges(.init([.top(0), .bottom(0)]), to: imageContainerView) imageView.centerXAnchor.constraint(equalTo: imageContainerView.centerXAnchor, constant: 0) - imageView.heightAnchor.constraint(equalToConstant: 52) + imageView.heightAnchor.constraint(equalToConstant: 48) imageView.widthAnchor.constraint(equalTo: imageView.heightAnchor, multiplier: 1) }