From f434a68155aabf2f0c30163ec9faa29ec4323e0a Mon Sep 17 00:00:00 2001 From: Alberto Balbo Date: Thu, 10 Sep 2026 22:44:33 +0200 Subject: [PATCH] Replace the default Flutter icon with a stylised cloud MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The app shipped the Flutter template's blue F, which said nothing about what it does and did not match the interface. The launcher icon is now a white cloud on the same seed blue the app themes itself with, so the two read as one product. The icon is drawn rather than hand-edited: tool/generate_icon.py renders it from signed distance fields — a union of three circles and a rounded box — using only the standard library, so regenerating it needs no image toolchain. The shape's framing is derived from its own bounding box, which is what keeps it centred; maintaining the bounds separately from the shape had it drifting off-centre. Adds the adaptive icon and the Android 13 monochrome layer, which were missing entirely. The generator frames the cloud against the 72dp the launcher mask always keeps and adaptive_icon_foreground_inset is 0, so the layer is not shrunk twice and the icon reads at the same size as its neighbours on a home screen. Verified on the emulator: the cloud appears in the app drawer and holds its shape down to 48px. docs/architecture.md records how to regenerate it, including the flutter_launcher_icons 0.14.4 bug that writes a string into a boolean Xcode setting and needs reverting by hand afterwards. Co-Authored-By: Claude Opus 5 --- Nuvolari/CLAUDE.md | 3 + .../drawable-hdpi/ic_launcher_foreground.png | Bin 0 -> 1973 bytes .../drawable-hdpi/ic_launcher_monochrome.png | Bin 0 -> 1973 bytes .../drawable-mdpi/ic_launcher_foreground.png | Bin 0 -> 974 bytes .../drawable-mdpi/ic_launcher_monochrome.png | Bin 0 -> 974 bytes .../drawable-xhdpi/ic_launcher_foreground.png | Bin 0 -> 1947 bytes .../drawable-xhdpi/ic_launcher_monochrome.png | Bin 0 -> 1947 bytes .../ic_launcher_foreground.png | Bin 0 -> 2949 bytes .../ic_launcher_monochrome.png | Bin 0 -> 2949 bytes .../ic_launcher_foreground.png | Bin 0 -> 4167 bytes .../ic_launcher_monochrome.png | Bin 0 -> 4167 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 14 ++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 1316 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 776 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 1524 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 2399 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 2937 bytes .../app/src/main/res/values/colors.xml | 4 + Nuvolari/app/assets/icon/icon.png | Bin 0 -> 13924 bytes Nuvolari/app/assets/icon/icon_foreground.png | Bin 0 -> 9321 bytes .../AppIcon.appiconset/Contents.json | 196 ++++++++------- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 16812 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 295 -> 299 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 406 -> 554 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 450 -> 857 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 282 -> 431 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 462 -> 845 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 704 -> 1232 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 406 -> 554 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 586 -> 1147 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 862 -> 1735 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 692 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 1427 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 806 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 1649 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 862 -> 1735 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 1674 -> 2544 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 1165 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 2195 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 762 -> 1165 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 1226 -> 2484 bytes .../Icon-App-83.5x83.5@2x.png | Bin 1418 -> 2566 bytes Nuvolari/app/pubspec.lock | 40 ++++ Nuvolari/app/pubspec.yaml | 35 +++ Nuvolari/docs/architecture.md | 37 ++- Nuvolari/tool/generate_icon.py | 225 ++++++++++++++++++ 46 files changed, 473 insertions(+), 81 deletions(-) create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png create mode 100644 Nuvolari/app/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png create mode 100644 Nuvolari/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 Nuvolari/app/android/app/src/main/res/values/colors.xml create mode 100644 Nuvolari/app/assets/icon/icon.png create mode 100644 Nuvolari/app/assets/icon/icon_foreground.png create mode 100644 Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 Nuvolari/tool/generate_icon.py diff --git a/Nuvolari/CLAUDE.md b/Nuvolari/CLAUDE.md index 4a6ec8b..93498b9 100644 --- a/Nuvolari/CLAUDE.md +++ b/Nuvolari/CLAUDE.md @@ -77,6 +77,9 @@ grounds that there are no ads today. generated by tool/generate_places.py. Offline search, no geocoding service. The source DBF is UTF-8 despite appearances and the geometry is UTM 32N — see docs/data-sources.md before regenerating. +- Launcher icon: a white cloud on the seed blue #1F6FB2, drawn by tool/generate_icon.py + and expanded by flutter_launcher_icons. Read the "Launcher icon" section of + docs/architecture.md before regenerating: the tool corrupts an Xcode build setting. ## Verification loop (run after each milestone) - `dart format .` ; `flutter analyze` ; `flutter test` ; `flutter build appbundle` diff --git a/Nuvolari/app/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/Nuvolari/app/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..b61e8e3c61065acf68dee4351fd43cc720cd79f2 GIT binary patch literal 1973 zcmchY`#;kQ7{|YJKQ3j|x*Dyrjzr{JM0A-&3Ts;tXDPRHc8D0E@me=+4X-1qtZmj( z_)epSkl3rFsa%q!m0X%uZjFsHdVY9*c|IRTaNu4G)0L(G09g3@ zVGimhf1yl_bp5dku?hf;ss5NgbI_OX`1XKuKOecYuLGbMJYjrW;dru$4#FBD@HM~rJr zPqJS<`aavFY+P(!k=)^~%=q4)%&qy%7I7*dyArp8fFPRXG)>n<7lYp*RwIo1=dUNP%WJE>KLgdFnq1mmf-ez+n}ZS zp}?I_Qvhv%ID>|35Mm@$L_Xn=fTZ03!q=ljF!P+Le|;`VHq&}x=1hrp>s(F#F7QFX zJF5U#-v7G5)T@~41c6H@5_ofE5{ROT;QSl zgK(g;Y*gzl%Oac2Ilk`@$)`+nhGL13>_CW_fI|O=C}}<&==Sg451@zV zvJ9)t#Hm2>Z8Sqqy=fl>JSv1vf#q^sPk3fr9=)XCRxB~)0^PAa_Fd$^6~(W&)Ilef zhq?S5Hr1-r_*d{a7fnn z+KU$b*QRU)#cL7R>w=Uthm6GiTm;D$zt|VVThpB+S9fezm3Ld0-=LF`g9L*rECy>|ch}zS#OP-% zJ~?CQM;x$C|2iSVbyKnx&Evy1V%jqiYZ*gg1_Ztw9qk{09L&n=PoL&OUlXf4AD5^5 zVMt?IR3RaH7l=kMCB{G#GBPYw7CY3#_CERD)%lvrd5=avA`IqrWnkTqRf6Z1M<3=3 zI~o$JrZMLE+#?7@r3G*Z_T%AniT$Mq;PDL3O!)F6qNSv@-|`;5M`!LoR+*oPNXo5) zT({nf+1Q9(9nU89Q^PQb)Z!KO*otfQ8mU3jpH7BVdg9l&(XJ$~at)aYx!qBWrro8- z?JvG|lQovfYVP7YSU~lj-umK{k(E0L$&c6vGxQdPUUo)ABZJ7?C|qH-l-;T}Q;Pl} zYoF?t1s=Jj=VIGy3WV!LWz*}}LyB{=+@3~XVs8lk_DOI)IIZ{sK^+5^-SBCP!4|ek z8*K>56D4EM8d;U>ovqLAbXzZX=Jw=JQ{GV82IUoH-Bqkp3`v;Lw@`Pm^kl>FH>1=8 ztE?fn3WYK3=LOYVTzF&<`KxL*O{PJOM^S2rCx(p@$Y1l6IH?aNDt@+dLzzOqRjF6E zi?}yuLKI9E<|#XS1^srY*u!6yhr!ZwlT*_HET^6*O0f-P9M?|FRxb@XtT<&~Ow8DA z=%@7PWBWKv;zrt5JCUT}HcGs7M)SNvL`V_R*+tGaY~=e7>2c)Qxkzn9!-K3_(Iv6X z0|2!YvSmt;ot#ENdi7KwTqcVttpySH@CIOk9VR&W=qKOtCAjt>om=u*j1_5iR@RBR zUmSH_DTLc7e8*crl#9M}d_jO@3+_eO^6Pmq=D3~^&e5IP0`i~eGNlf?E{4Zi5HO(U kOXgb!+5Q*tmDYKn-(&Ckr><=ub#V;%`vzi!yCcs22cp2iMF0Q* literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png b/Nuvolari/app/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..b61e8e3c61065acf68dee4351fd43cc720cd79f2 GIT binary patch literal 1973 zcmchY`#;kQ7{|YJKQ3j|x*Dyrjzr{JM0A-&3Ts;tXDPRHc8D0E@me=+4X-1qtZmj( z_)epSkl3rFsa%q!m0X%uZjFsHdVY9*c|IRTaNu4G)0L(G09g3@ zVGimhf1yl_bp5dku?hf;ss5NgbI_OX`1XKuKOecYuLGbMJYjrW;dru$4#FBD@HM~rJr zPqJS<`aavFY+P(!k=)^~%=q4)%&qy%7I7*dyArp8fFPRXG)>n<7lYp*RwIo1=dUNP%WJE>KLgdFnq1mmf-ez+n}ZS zp}?I_Qvhv%ID>|35Mm@$L_Xn=fTZ03!q=ljF!P+Le|;`VHq&}x=1hrp>s(F#F7QFX zJF5U#-v7G5)T@~41c6H@5_ofE5{ROT;QSl zgK(g;Y*gzl%Oac2Ilk`@$)`+nhGL13>_CW_fI|O=C}}<&==Sg451@zV zvJ9)t#Hm2>Z8Sqqy=fl>JSv1vf#q^sPk3fr9=)XCRxB~)0^PAa_Fd$^6~(W&)Ilef zhq?S5Hr1-r_*d{a7fnn z+KU$b*QRU)#cL7R>w=Uthm6GiTm;D$zt|VVThpB+S9fezm3Ld0-=LF`g9L*rECy>|ch}zS#OP-% zJ~?CQM;x$C|2iSVbyKnx&Evy1V%jqiYZ*gg1_Ztw9qk{09L&n=PoL&OUlXf4AD5^5 zVMt?IR3RaH7l=kMCB{G#GBPYw7CY3#_CERD)%lvrd5=avA`IqrWnkTqRf6Z1M<3=3 zI~o$JrZMLE+#?7@r3G*Z_T%AniT$Mq;PDL3O!)F6qNSv@-|`;5M`!LoR+*oPNXo5) zT({nf+1Q9(9nU89Q^PQb)Z!KO*otfQ8mU3jpH7BVdg9l&(XJ$~at)aYx!qBWrro8- z?JvG|lQovfYVP7YSU~lj-umK{k(E0L$&c6vGxQdPUUo)ABZJ7?C|qH-l-;T}Q;Pl} zYoF?t1s=Jj=VIGy3WV!LWz*}}LyB{=+@3~XVs8lk_DOI)IIZ{sK^+5^-SBCP!4|ek z8*K>56D4EM8d;U>ovqLAbXzZX=Jw=JQ{GV82IUoH-Bqkp3`v;Lw@`Pm^kl>FH>1=8 ztE?fn3WYK3=LOYVTzF&<`KxL*O{PJOM^S2rCx(p@$Y1l6IH?aNDt@+dLzzOqRjF6E zi?}yuLKI9E<|#XS1^srY*u!6yhr!ZwlT*_HET^6*O0f-P9M?|FRxb@XtT<&~Ow8DA z=%@7PWBWKv;zrt5JCUT}HcGs7M)SNvL`V_R*+tGaY~=e7>2c)Qxkzn9!-K3_(Iv6X z0|2!YvSmt;ot#ENdi7KwTqcVttpySH@CIOk9VR&W=qKOtCAjt>om=u*j1_5iR@RBR zUmSH_DTLc7e8*crl#9M}d_jO@3+_eO^6Pmq=D3~^&e5IP0`i~eGNlf?E{4Zi5HO(U kOXgb!+5Q*tmDYKn-(&Ckr><=ub#V;%`vzi!yCcs22cp2iMF0Q* literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/Nuvolari/app/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..708d88d83a6df98c93db5b5a51107e30815b1624 GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz1|<8_!p|}=Fi-V#aSW-L^Y*THhhL)1@sI0& zmxe9T@C;J&ni3tkV~Rl6l+H~7Vq$u&6HYYEWmS?^R9ku@(a|Mrii_sarZp2Zx>Du@ z_s_Z)lV;divH0u6e8f+$?8|V7Qa_GeY{p zY6~g*kPUvyMZ9IZ7Dd=kv1dQe$lWbG`RRd4UyN=~v-`(c!4ac-&h9*ezE;fcAWODv z|NA#qP1RrPe@XCaR)N)L9r@~p!$;-cvG2QLaNPc+Zp8dYIqw~M&;Q>XvG&yI*4P6v z39KKM9jmO;*`DyZvGAg^N^yhqfj4vXP84%*v#4qi3%+#v@v#?|G;rmg=I^Z|cGlEwUj^Hf`D7ZQZ_lQi3@( z2WFK<{D??m1M4P@XcdfYkrAhGMDcQTV z4*wgrt}fgBl2y5B>VGYNhS|*5)?K>(=+l#o%iV5wU*4E&#v%QGVeG=>1B;i5_i}yH z+}piU`LOTlcNWn#yw*x$eS4z+%SFt(R~0K)IGHK^<+|rDV~@%PGP}HQFI}d;PdPWv z&!;-+slGXn&-=7fjyw6kiB#PAvUWw-#e=)5rpbMiwq)I$S3tu=49*yzWy7z>#9mh4 S_#2o{89ZJ6T-G@yGywoO`LtO8 literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png b/Nuvolari/app/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..708d88d83a6df98c93db5b5a51107e30815b1624 GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz1|<8_!p|}=Fi-V#aSW-L^Y*THhhL)1@sI0& zmxe9T@C;J&ni3tkV~Rl6l+H~7Vq$u&6HYYEWmS?^R9ku@(a|Mrii_sarZp2Zx>Du@ z_s_Z)lV;divH0u6e8f+$?8|V7Qa_GeY{p zY6~g*kPUvyMZ9IZ7Dd=kv1dQe$lWbG`RRd4UyN=~v-`(c!4ac-&h9*ezE;fcAWODv z|NA#qP1RrPe@XCaR)N)L9r@~p!$;-cvG2QLaNPc+Zp8dYIqw~M&;Q>XvG&yI*4P6v z39KKM9jmO;*`DyZvGAg^N^yhqfj4vXP84%*v#4qi3%+#v@v#?|G;rmg=I^Z|cGlEwUj^Hf`D7ZQZ_lQi3@( z2WFK<{D??m1M4P@XcdfYkrAhGMDcQTV z4*wgrt}fgBl2y5B>VGYNhS|*5)?K>(=+l#o%iV5wU*4E&#v%QGVeG=>1B;i5_i}yH z+}piU`LOTlcNWn#yw*x$eS4z+%SFt(R~0K)IGHK^<+|rDV~@%PGP}HQFI}d;PdPWv z&!;-+slGXn&-=7fjyw6kiB#PAvUWw-#e=)5rpbMiwq)I$S3tu=49*yzWy7z>#9mh4 S_#2o{89ZJ6T-G@yGywoO`LtO8 literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/Nuvolari/app/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..6340a97672780d43bbca4123c0bbc381c6682538 GIT binary patch literal 1947 zcmd^A{Xf$Q93NxEG#3fGZHY>CI`cHGqdZkCAa+mH@%6VAdG2aq8vo^)%*}3~S`r-Y4zuvF+`-ji#^UM3(zP(<0I;J`(6iUy> z+aqvAMgKt?v%=@rTggx;ttcN4*Zt|GvOz|5Obnr8@?MeM^-V3@jWwP-JcIUE6q=aR z^rI~Tgdg3Ggt<;v0C{^-+bwN=_TBa*$@HA&xzyh5?fYnJ%seSu+n-Zb`9{;i1IBJW zzHs?dN=f6%`LJWoL%77);&(4*yG+^|`@*DeyQn9I+Bn{SIku`$-8Qz?Tb@I=*P}0I zWBqk(zAj@Vbwp^>!(_+-*@u)vFQGhW8cGJmnYh}QwheU#TwAaTeGG+*80%<4vUE=9 zHk;0n73GRL9qWek9d+N9NOUJKt9PEwcV3h3E0nBS$Ql_MKY`e|i^H*rZF|wLG|QaE z?#ax-E>tpF85~#UmZXMpAa$sdLU(kx8ai6cWWX0E*U)han0lt?w25f6sj_!un^)ny zl_I6A`KP&bz2jyIBSfj0mBi$N%vVxSmkY3F24vo|RKx!^1}}R4ZU<29yIz$K{JYh+Ov?r^Z+`$M1Ysr6fk7;m>u+NuTei%vid} zZK|nY+ntbCKRz=v7Qyh=yfhW@{rVRvo<0Zp3mcJ6sFv&8HQ5!BfDs4;OUZ!TY}5NX z>LodE?NazDu>MmVa#fg9T+H@ZUac4pPpvy(EE+F6SahFtlij%3{pfSLr~JsB7f|qn z78S}MjjXT@$$t?`ZzLS>%eNE1VI7?}L`cG%k`3tVvYNFe!K%=uw5!ttl2iT{!Ix}b zxtgGW(zCV5SxJmez$OZA2(?6RFmVG(BSHie)Q}tAvZsjj+zd5ETX<)66kRo;*5ne5 z|MCm<@P2Z`qM+aAW+UT|hYp|o(K`#kC+!Tf)Q>x_BF5&5X~_#ydgU=6AXrS1=(Kir zPNuNJt+0I%=%hV!h-p|k3&+#v^Nd4*k55%XU*j)lC20RY<3Iu}+0>3#TBO!hO*s(} zfuF=O_>i)1jb#iWvS>mq&1pLG^i6tz+zgYN$vh8lx8(3u*0~OW^s#$K zhu6jMgTCbV1VzD|`y8QG_!XM^&PrnU%{F+{^(0y%0SY`#Ha4iHh%RYVTr+#*%Hmzg zsqda@gM@?g>Iqc1EH{$$&MezpLr|+iJ-VKwmVB3Rwg}b+Zwvsa!Ad1Zw3+*Oif9pk z8afna9Ux}(^ZWqZB|A4dub`ZF7$cY_^Z}@sQ_T|e?L2)^y-@45|K=&;dgf_psb?kN z*Q-$R<{C<=1Rb|Ye##1D0Jxhag-c}bN)5LA;6M+5q2m8WA8~@CcAO@6O{EOUoLp8e zurET%tB)BmsBL`!mrqk~sTZ&%VnBcJpSx66WJ0Az-y!W*Q4ZDrX(R&={z?g?FRMpr zEL01aLC#}&pDhY6sxz`ecFtt=Zrne}*Ts{hPQO>2HwsN*F-eMy{AgWOZKh7A^&V{9 zLri+0Osx7KX~$OFurEaq^sKzi)V^VK4mSUdIU>+<u!Gz+As6) zuh;b-%~du_pexIv&-KaF|tOuFCUS?Zk#FC{TE z3hw_Hi%^>0#I=M2fc#dbZ3DVVk9@DTh#!yHq-j!Y7)=i>0DWA)HZv9Jv#U8}_bsoX QmC;4{c<%M!xzV%#1;2T6V*mgE literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png b/Nuvolari/app/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..6340a97672780d43bbca4123c0bbc381c6682538 GIT binary patch literal 1947 zcmd^A{Xf$Q93NxEG#3fGZHY>CI`cHGqdZkCAa+mH@%6VAdG2aq8vo^)%*}3~S`r-Y4zuvF+`-ji#^UM3(zP(<0I;J`(6iUy> z+aqvAMgKt?v%=@rTggx;ttcN4*Zt|GvOz|5Obnr8@?MeM^-V3@jWwP-JcIUE6q=aR z^rI~Tgdg3Ggt<;v0C{^-+bwN=_TBa*$@HA&xzyh5?fYnJ%seSu+n-Zb`9{;i1IBJW zzHs?dN=f6%`LJWoL%77);&(4*yG+^|`@*DeyQn9I+Bn{SIku`$-8Qz?Tb@I=*P}0I zWBqk(zAj@Vbwp^>!(_+-*@u)vFQGhW8cGJmnYh}QwheU#TwAaTeGG+*80%<4vUE=9 zHk;0n73GRL9qWek9d+N9NOUJKt9PEwcV3h3E0nBS$Ql_MKY`e|i^H*rZF|wLG|QaE z?#ax-E>tpF85~#UmZXMpAa$sdLU(kx8ai6cWWX0E*U)han0lt?w25f6sj_!un^)ny zl_I6A`KP&bz2jyIBSfj0mBi$N%vVxSmkY3F24vo|RKx!^1}}R4ZU<29yIz$K{JYh+Ov?r^Z+`$M1Ysr6fk7;m>u+NuTei%vid} zZK|nY+ntbCKRz=v7Qyh=yfhW@{rVRvo<0Zp3mcJ6sFv&8HQ5!BfDs4;OUZ!TY}5NX z>LodE?NazDu>MmVa#fg9T+H@ZUac4pPpvy(EE+F6SahFtlij%3{pfSLr~JsB7f|qn z78S}MjjXT@$$t?`ZzLS>%eNE1VI7?}L`cG%k`3tVvYNFe!K%=uw5!ttl2iT{!Ix}b zxtgGW(zCV5SxJmez$OZA2(?6RFmVG(BSHie)Q}tAvZsjj+zd5ETX<)66kRo;*5ne5 z|MCm<@P2Z`qM+aAW+UT|hYp|o(K`#kC+!Tf)Q>x_BF5&5X~_#ydgU=6AXrS1=(Kir zPNuNJt+0I%=%hV!h-p|k3&+#v^Nd4*k55%XU*j)lC20RY<3Iu}+0>3#TBO!hO*s(} zfuF=O_>i)1jb#iWvS>mq&1pLG^i6tz+zgYN$vh8lx8(3u*0~OW^s#$K zhu6jMgTCbV1VzD|`y8QG_!XM^&PrnU%{F+{^(0y%0SY`#Ha4iHh%RYVTr+#*%Hmzg zsqda@gM@?g>Iqc1EH{$$&MezpLr|+iJ-VKwmVB3Rwg}b+Zwvsa!Ad1Zw3+*Oif9pk z8afna9Ux}(^ZWqZB|A4dub`ZF7$cY_^Z}@sQ_T|e?L2)^y-@45|K=&;dgf_psb?kN z*Q-$R<{C<=1Rb|Ye##1D0Jxhag-c}bN)5LA;6M+5q2m8WA8~@CcAO@6O{EOUoLp8e zurET%tB)BmsBL`!mrqk~sTZ&%VnBcJpSx66WJ0Az-y!W*Q4ZDrX(R&={z?g?FRMpr zEL01aLC#}&pDhY6sxz`ecFtt=Zrne}*Ts{hPQO>2HwsN*F-eMy{AgWOZKh7A^&V{9 zLri+0Osx7KX~$OFurEaq^sKzi)V^VK4mSUdIU>+<u!Gz+As6) zuh;b-%~du_pexIv&-KaF|tOuFCUS?Zk#FC{TE z3hw_Hi%^>0#I=M2fc#dbZ3DVVk9@DTh#!yHq-j!Y7)=i>0DWA)HZv9Jv#U8}_bsoX QmC;4{c<%M!xzV%#1;2T6V*mgE literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/Nuvolari/app/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3704331887e5ab5160705d1eca964d68b77faf GIT binary patch literal 2949 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 iTd(~u{FX#Wf@A}^W literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png b/Nuvolari/app/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3704331887e5ab5160705d1eca964d68b77faf GIT binary patch literal 2949 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 iTd(~u{FX#Wf@A}^W literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/Nuvolari/app/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1ccef4f2c0de0796aea445ea9a0f43bf90a9d0 GIT binary patch literal 4167 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 literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png b/Nuvolari/app/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1ccef4f2c0de0796aea445ea9a0f43bf90a9d0 GIT binary patch literal 4167 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 literal 0 HcmV?d00001 diff --git a/Nuvolari/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Nuvolari/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..c61e081 --- /dev/null +++ b/Nuvolari/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Nuvolari/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Nuvolari/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..bc21ce1f7cc4259843c84f62aae589d150d7776a 100644 GIT binary patch delta 1308 zcmV+%1>^dl1f&X(8Gi-<0033(vqt~`1nWseK~#90?V4Ro97O=f|Fe7F<*vX%k1KG{ zhNDdZN%>IQN~|In9}G2Wd=M(N#%QTV^uoGs{Ph>y_EP+vAonzvLcf@}Jq+|9|fMcXn1SnZV&^WK@1JgAclrdF$UZq z2HYS9Jfs;K9?}dApJEKSK@4~XF*H1b7#cps7;u9atf)Z-ksvq23TK)L0wEX=1Ti=o zKrkdJXq_689)Hs5HY4^_=HdR^a63t8~OwJ5l$B(^Naja($L*r9xBcv@x zfgG&&O8a+jhSey75JIFmBKjf3AQGwElMebjSnnmDcMeEzetQnr12dYAM^_=8@3i8> z{ngmI(V?oHQ54X)s{nPSF0_1d3cvJ?Cu4Z3(A=OcZht%c2ku0+!-B}WMGda?7JPPK z2UU>+*rLX45a3KR z%jMC@X-tR035}Vh(JX^Rfk?jQDrDQu@}0AgIguwWMcq;?jY$;nPE!SW;&7MrU`4Jx z^@`mNB7cy%V^ihDtCRTtw=2Zo-Y*T0|EFrqE1E%%?<_!B{(7ytTV!K~6+gVZd$CM! zumun4y;kH(gEz;Er|;Q}kACXI+uxl>Fce;88RArDT0Ee2ZP*;|-{wnr@wqrs=0FQ#>U#snm9A4wR-^1)E3F_UV6?KC7O;uM&v3@GpPUX0Q?>OXn)#O zsI-YLp%#65qF=FI)k^yHZ_c9JlOb5=JIQ(Qab`&|| z9AfIAYo9mTdR4Vi{Wd=_6+)x06AxGClcu{07dPtl62P&_=Y}WXJAMIer-#V=`NTZW zSaosjD24&j+C3<>b`K)UZbGr!PJe7BgEanc5H^ztt4V&0(gQ`di!LW!Gd&ZQ{}#GD zHkG;^#gTu47@ZtN^s5cMN|ANZ<(1aN3;#Zd0slskq2b>sGBkXOG2jL<;07_^AP5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/Nuvolari/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Nuvolari/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..f618914785835d50e6e14ba4478b26d76caf55be 100644 GIT binary patch delta 763 zcmV=2GT_a-Bi*=R2P915m8`46jabf7!ep63lcIbQe$b* zRI2$kr~8T>C@?z5_spH%g!6-4Z0Fhg{(qe3yyrbfVLtXKfqx~8f_8w#A_>q&5}=JF zKpRPbHj)5sBmvr_MZm1jhP$i)#d#_)41>UU7(M$MC!?N}$@R!}0nRSYy$# z!T+T1%Q((I{($H2M;9{|se8SM#nb=jk&-~m zmU0~4u$-tiDSx=fV}?p8M{|1*`Vc#+a+Z znVl6lbo~|ae~1Mv1~uEeVzY78GWIO{$EJzu7ZfPes&KBsiFM`1lzU$Y$vJB6hV%&J ztChIhfwdNZ0d9AFMl{BM@8A_^@jCu_c(Co7gVQ@Iu&vUBeOF#$G92Zs zDFt`8cqRwQ7$qRGO@A|v)NUQ)`#yf!m+e+3dqF2 zUWt$~4D3Z3;R4C6a5Nr=LPq~A%tqpz$2bLop$MM537~#;u~@l?n4XQIcR0v-oOcyE z`=Afi)&l4?nPOxkqOGH!-L-PTEATZKM#JSUTy)y&g0mz~jC`C#V{u%4Hi)*T1H5$$ z-iZfCr{KNViK;Rk+*Td3GZdJM#*vjFPiNkFj7`j<<81&#-$D!467Pk4pT4u7{|)J_ t1Z^Y%+DHPlkpyTX3D8Copv{sO_zAmkvsYPov+4i<002ovPDHLkV1n@daY+CG literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@U4jYJyr%s8d3?d+hosG6~ha`tuzic+O`607#!GghorBX*8D zEke~9Ijb@1uCD!Zf56>`-}`%>_YZiVnVT7~u?VmL001^4LtV>n@A7>&8NYF}F#H|> zz|e1`t8E=oM8*2}S=;>Z=DMSE5iOUuOUPSL?5q+tMra!+B;<+dm8F;KYn5}gK^ev1 zdh-{+O{SX`FwW7Jl7+R*@Ny}+N)D|gI#(ZWsoza?UKih)&;j{-EuI^4GeAGj^dFK; zX5}N-Kb1tE#)Yq`p0AyfV9r-dOew5C(EyC9G70>=TC5@04R_MnX zJ#*&|BPy)ij&_M|F>wcXmf{^VoO?CZ;>a*@R0MUN?L^&jv09#Q9{P9Kh%y= z>y{}^;ORHRhc8dv7az?WM}kI8^h3^Zl!F84!=O-31$7Bd`RPe=h4d>f14SZ2AGJEd zX!5qb+%J*Ms-w{mk@nZa>g}_rAPUjc`nOI>L#}LZ2sJ+dbzp!4WUQpoGENV%ZbY}~ z0iisel^0Jk1`nT-^kIbRiMr*zzLk6Ciz%kBLcM(tm;8$s7#d~TU@-WjFqLzT0A-D% zPwUU;y|s3Gtw|)rXg*}Wt*hRtfQGgP=1{~3)E4DBK+|o7rV*&G{5ETQ>NS)cKkfR2 z$Sq4w!Q0{;ARm&vP*yWoWhu^HwhPin$71D?QZUnzyEso?LsL@)s%TKtgcG98S$LxG zc96BrzHUVa!Z^li;uo<9`tUra-8OXmlg{fu*t8P_NL?a;C?!2gT_syr~5AdaFY zKAvXeo|KHXhsa3lWKSgxzLBSlLE^@`nl*;ESU{}=WNYNxh){M91x`-S(bGjmvhEgb zc4i~cvETVPnW3=|&JtuXQo57D1>wmmmIjZ!Y#QEhw@M8Zf&z(^&T2+qDaK_LqQVea zd7a&A*ytex6nF{S%;6V=l3iaW+J zWO~sFq%H<6L!``h3Q3=p`U?j-w1wkEreeU1RigSTKw*K8!>{#YI+6O4q8sPkSe;_D zVys+Sx*8N%bKTnvUS@kH(n4k9m-{MZyKpCj>FT}Hfo8OxdOPaR!17&;xhh3!V9Oj< zQdG#hpjyU`@JC3@I1fR|wn!~hG@r8V5~Wx|s2r+8*D{;RcIAs+y`pifhxRh}jiHXo zm7HIbnSH~q$(hcA<6zCXO*O4L?D0hmrl5%F#=2e4=3wm3-|3VdK+ke&x_rHb&DJ;; z6b%2-Cv6ydqeQUBaW4`tVSqiX!-FL;+c``#T@;rlt0ocibT^3=ZnErZ+ZZFi}#94H|U7TER`ZBdfC7Pe?qpM4T5mr8bZoccr%1Xq0x#PO}%J9HRkw zfV-NL?tK@|KXQ9JIzNz6tuuVp4k6y+`pl`6vWB-c8m{A@qVj0z(~(bw^_#} F@gEkDz!d-h literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/Nuvolari/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Nuvolari/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..2218ff3dfeb4b788b6d9d426596c1613d3094823 100644 GIT binary patch literal 2399 zcmd6p=Tj5t7RFHoge8WA5{mR*LXj#Z6hTk}C`AI1zO;l029e%tP#|DnA#{|YNS8>7 z^dd#+3kVnlsR3OCloI5kv-i&I{ss5LdC!O6oO9lH=AH9AxSM9i02W>rIyySQH4{UN z(~SQa=NV7W)vJq*bac!T*9`To0&}h1{Utvqv@KixK$Maja`(d@^`Wb|A$jAi#|grLdgFxvplcQ{s&`C7 zhxt4YkT=mppB^ObDI~%GFnn4VmB^vOmewh~@^uMUUewEPHW@9A+AMK~T>USLW)!g) z(KBTEyO3MVLbSvgZ<0)ix93j#7yP@c(=V(qqH4kW!1;fb{~Q_p3p3&-OuVM!{(YaH zZQ-8uar;_nyzH^Dz7cQ$R=9nN>4NDMO1seemZ}AK2++)at-C1&R#AaMN?75!`4>C4 z>Wgn>f#S&PABl=7r9pCLCvHd&LD=1mc3pE)5pAErO3i`H6bZrAAr7c{O^Dv>J`yfSgYkX81FvL&!Z7)EUq$k7p10oHrtyzD*kD(Bh8$oz5Ww zb;e;9nYv0jR1covweM16#Cqzj&u2^7X2O2Fc_-Gbfi}Zx+-}3-m0y9porTI$iYgqF^k&b4UErbljFXRBwBDU=-U#+1NnDkLkPgkKNa{!fVI( z`f08~O$`F+)WSr~?|Zyoz~_*e_2A_Nin$W$zWMw;R*D~iCasB}g!G!-#b_nU|dTMWuJc02#bj`YF*WY>Ih z|G2|^q13~Qaha6>=8R16F|BRp%@pZ{^9kn0gzP-7`SHs5Ug_(p4VfmR%k;PtSXq~R z-XBeJ@YMF%VY$xtHb7TLOvU6R4|@r#is}eN_A9uuD&8V7?`(CYZRFTg>cSQZ6%~bYu#}VRa?d47hFyZCgb9c6 zEW}cjz|3qtk+>T|UD|0lQny~?Nk76$IO7|Ipl7S3Vb|kgWl-3%I6%Z|73&>%PZdH1(TCCoW-1AzD*-MC zlP2aQ?2<%5R5vcke^7aEWF+ARm>E1gaK9evcJ#o2i<|Bx`xyZ5UWl^Cduc0yN;Lo)6e11J-_t;MZ-=of8H$2<`ley3UW1Iz$q2U6EZlQuHMIEi{=bR zPQSG9$g-iwm-a;WvkbT>dBHI8AkDJ1((UD@ZA3m_!f`{T)GQ@ZH)7(EzQSDtcM?PO|l=Ro~2b*lB;J2JS3CfD6A#T>XX5> zfp$ZF&yAe%P&8G-XSwOLhzvd|?gt3DlXa!?OA6LcMpIHv=WQ@aQAs;sMW{&oDP3Kl zGV}*uefcrfy41dlgFe}x8;|HBia*nMKavt4GfcE-{m2Nu!7)cH;?iwZ;Nw(AORiqSqS z2E~NKUDTGvo%e@$^f*n8D#vG{8>2dDW!&~+N{L8ikx6xY3{r(4F59t>>5AtoACFCg zDaG$AMsy9T%;~*_Oop+w|K3M&qdmp|)JL{gZY<8&UxnOYZ69~;>=`$9*?tQ@tF~ zzb`r(&x8|Hdr6%~gzm5XxV_hoDMmjx3s~6jAppQV?xl5MfWs>tCyuURS!y$?%YDe* zE&l6FxaciGm4$w-F*c{p!sNM&Vf0s~j}?|6R;Effksi7vTIB^QY@7u|oeo-4(QGzF zz*WiJAkro*s`&DDRzI{dQ`D~D?U%_c3z8Qj*s?brlTcg#l1*P;-0Y^gUHE|+fM^#2 zm!6&QA$|6i%%|-M(^hau@?o$9mVcYJ0d1keWhuL*A7hAI+Rb}(4&gMeFr%!%)YA=u zINA_qCGHPlt9PNCs+EYQrn5+a!6`?{YeTEAU045_-!k4k)^%TO@DNMdxjv{yuGR@Y zV$~*jYKlbng@a$SMCIhEE?Tdg?yRu~0x+H80GpIz{bET|8_L38D*@>3fqeGE?Anl3 zNtf^qtNllFB{ESt{Hlv3P@m6ejxx)J{P1C>AOaBFcZKY?8^A=|HTR5U_j}xx27cH{R5<~`{CMkls1~2yv!)_E&iX%O$eG{QT;X{wNuB5+I;qZpzuFk#V-T!gZ?hW W@=49;{MxB;qPu2fW>{t56#XBViCne- literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/Nuvolari/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Nuvolari/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..391d0502b55606e3da3b5a43187b46566ca9c246 100644 GIT binary patch literal 2937 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 diff --git a/Nuvolari/app/android/app/src/main/res/values/colors.xml b/Nuvolari/app/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..66c4cb7 --- /dev/null +++ b/Nuvolari/app/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #1F6FB2 + \ No newline at end of file diff --git a/Nuvolari/app/assets/icon/icon.png b/Nuvolari/app/assets/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..284e4db653f104128f23be4d3a1db20a6c7f63a8 GIT binary patch literal 13924 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 literal 0 HcmV?d00001 diff --git a/Nuvolari/app/assets/icon/icon_foreground.png b/Nuvolari/app/assets/icon/icon_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..c371298a7e7abedb1f4a5e6a01ff5c4bc203935d GIT binary patch literal 9321 zcmeHNc~leE+YX}aO9c@DS+t3Wh+q|>?5!IEf*L_Y1W8>Yq9L+`B_Om4RIOS^#VWG2 zqAUs`y9r=Qs<>fP5QUH+6%1=aMF@uNckkqPj(plf@sECA|M=z{hTOT&`@GM)+&eRb zqZ>WesjKL#;BYu~#AP)Jhno&QPRA)JfM0Qj=7(`OycM$gYtP809)488j_}y=gV}|v zlOO!*r8eCqV-A~CJ>PBD(e(-olU=?mQ2NFs>|4ceOaf*meDiYJtg{3&ceQzB^M_xU z9f((&KI1!;U*Z#;@e56k8D{MF`XN+WbtrhAwW>rQUfI&WQfQyH>{RFa@uBcTFJi<| z>F4iPn(y{0)dE5`23IM8Ujg6;hf{;6csY2sf+rl5ietkQZVq;q|L9`?c6Bnlzoz(W zyLdUaF7!Sb-vk{p5=_!x^L?V94aomTC;`}ozxHQ^8=4QM|2`iRNG5#zd%I6U`D-0) zAOeJk8P6O%U?-zU!hu{^RdS)bPj&}53C24M96j!>s4c|vPU`1nb;;yy0P zXNCGnf&Vr|Y%G&gwEL`3|JL>YVyK_fh_aIWbD@4*;7PmTU$y>U9f!^GIk}uPwvQ7L zfVJWj+hz_fW+uS1F`NJM_LYyfoCcIkQHMPt%Kb7s-i7)hte zVJntin*CTsm~gbUS~MQzFBu;*Aa7r>WUl_8x?Mso$F`~zyPet!waMpcyM~gi9GVT% zl!JHQ8FXsBMT`4c@3HdbYARWNybz1BRG)|BdO5g4Mxqh^4woQM!H4em*fs8GltCg>!TDWH*rhLI%9fhGH ztS;FpTuNSC+4#n*1cv?gF9!Q4(;?YLFGj*c4!2S$$@Z?U?<2&~ad2D8F}PTAh}PmJ z5c0Z8tO#lniV8&kbj-cFv(;3(kKt_#VYj6QqY~o^D!UZ?Y zpZ5B66D@~ARpB!0xar5q6XcjT^2xz*iE=RU=7q84_wB+gn9J1qDf-Y;LFU)3EWw4K zMho%}POq^XG)i~pwJg0Mjo3YO)~O%66ty;KN3 zhldu!3dKinBW&;Cd%G>Sj;W?#QPkJ`Q1E0pKly1~!sXbtnEsNynfY%|UNfp6=r$f6 zeuNozHCoyWE4Ng3l+ZG{8gLb4pFCdia8Zz$BLA*`3S#csO0CjA8!?daR&)Ed*iF{gyD2_u@AMR*p+!-pY3|)x)$XB7uvi(L zd!n5@<(WK+AuPE&{j}s8>ufzothRf9y(v(9&VDRugr?4Cdc+PJ)kVRvny@vUwfE}? z`ZTf=C2Lw#VF5Q%jMbe6MW(wg6UVAdVfixhuQJ4E1Y(aCZ49u^G^*uHa#yuV4BcBj zCDE_?Jg0-UZv`>NbR@KV!FFS6$5^`GZ9zY)^_bPtOGZ_**Cvw5w4u!{x^f`L^<0sl zKeL_gGC#epmh%H`Te4Ja3QSq9aA#|vIPzHt!$Ga5 zPZ;uAG;T9y%o%O1oql`Ch9iOG^)DMFBp7mM%9~LS>61OWBP)BP-yL2@k28wf()vr= zAg%CgEY9eYgZ`!i<-u(u?|EkH?{y8Q5dH6MbBfF8PPe%J$FKzsyz;bnN`D~-M`fLf ze!k?uArW2u{E;>4!^}~epix})Va~dk@fje3Cq6|L50OgIX~&ob8&%4Y_f;`*+1*0D z^~wyXqZ+7TM&!@V?e zkXpwck2xC6_wwoXR+Boa0|FCMVkGycCaTCdHeVqjI7t!{*p%N*R92Hz>VpzFGc?{( z=e0My>}$L}a7J`4PLenp)1m;SG0c-Fm785|wWmJ|yDAEvG@==OB*g_jW9-)fg2w+2FnLb}1=|97~7{|fcoW*Vs>2e@p>@jPGDwU=-8q+bb`Z!G5U1*m5TiOVV0ErQw6*^vvd$-+{GFN$`hq`8BpiJz|)8stVIRq9F^j&S-d z{g^M94nl?6z}6)A1*?c)cHdE`Hv>d`uWkeXC3<$(GKb4B;wT?}Ebv48y+{R!_$g@~ zH3)HK>ZN%>V*9yoN|Q6&c+dLb5p&#gU?pITK z%~>TPBm35yGR6QT{>_RNBi9VJqWX<~X@@}$G6ar>kJT*8V+lEb4)kxIt_HRz=h6Lo z3s~U<#I5+0@XG-BT+p@i8m+{@8!i5EN#7+IXyCw{1-A|m5c3W>t{WQ%9?3m!S_#a4j9t=>a(4nU!{$!^Y~bN+(Ct3Eh#Y**t2dEv zpoh0}yNu4^!?S0ku^@i#j_~8IsO`&?v`R2!KfI04(aUSsQv>O>6@DSf!sldG&8GJ) zRshcK@Lu$qA+8x^oF3Y~Ie)x|ptmJEBWr5G)q*vxg;tOH^B))JkLvjNm5)M1mz}#@xhda5Viv-`(Dk!!f(ydhoscR9^iRhf+#y5JJfI7J# z$!-(sS(m1I*}fZ^BoC-=U}+K%Yq6qFP~TvWA}IMz_k-H5sD8Z;*_|5)QoOvDEOJIj z^22LZJTU}|JpSrd%aI4_3y}vGN6X~4(6vDmuy2f{bx?6x7?V~=+03TS1(hE6Ou2Y{anwVQ)be0#&{GPra|14n$_(ah}z z?Nw0pzQK^o21U>sc3qGl2S918@qWJJ)KHnG&7jjBORtRd_v|XYI z*dO#6MEs0L48?niN?>RkxK45&k6bB!VmJ-t#>4i`C;=e_o(Mk@xh z2TUDjy_@|}{JExyT+n`gDaRLihqi5w7p`f+$LkhHppPkLl( zU*)5Cv(5!f8TPdd>nXuB&@xz%m(?ia?P{#rpXT|e8zw64}-bxMSKjvjM#I6PiEYV)3M(#kl>)DgBAP5XjtqN(iYeS3TLu)~AKV}t238FN5qP_r zR4h36aG11RH7r@aZ!m9wycEheo58%)-Nn+s-!1~vKbR>iRm};^t6$q);5Emeo(_9U ziNP!arnxIc+8{5p+P$e3ApM=+${OUW`*|R^uMFSVz~DAjbu<9e3pSxC(9}hh51Q$m z;5bzan)WUx!WNE5O_>f-x`y`%_F<=C_X22Y+Wba@;&bX1%3;qwQI2be!{RZH1=Qpb z{RsBES?ohYY^dKp24>He(vzT{y0q}aU`anUqQ}9Z+RkP&Tvs9{B zRPo^5aQDgw7GTY;yC@RDHQQ)JI|JA3D*jy9{yZA-0v<`ApJG64PWjyfaD5xTYJk{9 zHfrK>E*^O>(&Yq*>ji&Omm_G1*qMlJ2g`Y>08HfzOCdN{A?c3D8cYXT%61l;yOm&? zS4-OrHLC1k^6*Gks5rsB89snye{apH6A=+qT7RFa4A?#I=fmMwPD7eN$qB0_L%8!b zHH^ZIFqg@O8{sK^Ar<<1?k5C0Wncoo%^wc^9v$Q%Xz`=jiQ#+|$bCG#`V>DB#aler zZB~XCQq(ycnxjyBWy?~LJPhSI+p47!Fw&D*aF+}(3ygfmH%0c*&hX(I+umc`BT4)? zG*f||Y6k)CMO%LE)i{f{&i1t*2X~PtyS!P71Vp`K4>tzzJ&}Ixg5sZ-Tu2)L*01E( z9l1kYjgV@Y&C85{_2L6Ak@a~Ckz6E;Q7R8^pY6UYgGQtA2%6g@=Cr1D0;3E{m6m__ zDsVGv&?YN#4?yWgYdo{(rZYKNO46Aza2{**R>CVY}=S)DHk4Ar--}|QcA6oT~sMV7UzM# zv82p24Sg~2ac7`xv!q3%+`6K}C^@rfklrArkSV(kWf+6dOx|e@CvN5xUmxHq z_&`T`U;6&_SoYq4&JuG0W?qL8zvAmIKb=NRO}QWj15nq+u`xI zcA$XZn4;YjB?n-ff9sl!!6xXO@KHuFnZGGY#^M9T1joN4R5p|{)#}K=|5&I2P|8#r zQ3n2;sVTIbaQr*8z?U{4CIBj$YA*l5PXGU}(cwD+I6i5p&sj#Y9q|*2 z$?7)QX7!2P=d`Y@&p%L%^G+Jp!3dSQTAGYb9@fIe!x8xZ5^$Kn6AnuN>`I(7JjKJ) zB=b1^?`qa{e=0CsXl}{iBuWY yl%!&=rY3cQl#jALiIhn~F~Py(0~N;4CgP?^)!g-S>Sv_DX=IJZ>ilm4zW)#5?_U-G literal 0 HcmV?d00001 diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..b252554 100644 --- a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,158 @@ { - "images" : [ + "images": [ { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" + "size": "20x20", + "idiom": "iphone", + "filename": "Icon-App-20x20@2x.png", + "scale": "2x" }, { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" + "size": "20x20", + "idiom": "iphone", + "filename": "Icon-App-20x20@3x.png", + "scale": "3x" }, { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" + "size": "29x29", + "idiom": "iphone", + "filename": "Icon-App-29x29@1x.png", + "scale": "1x" }, { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" + "size": "29x29", + "idiom": "iphone", + "filename": "Icon-App-29x29@2x.png", + "scale": "2x" }, { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" + "size": "29x29", + "idiom": "iphone", + "filename": "Icon-App-29x29@3x.png", + "scale": "3x" }, { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" + "size": "40x40", + "idiom": "iphone", + "filename": "Icon-App-40x40@2x.png", + "scale": "2x" }, { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" + "size": "40x40", + "idiom": "iphone", + "filename": "Icon-App-40x40@3x.png", + "scale": "3x" }, { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" + "size": "57x57", + "idiom": "iphone", + "filename": "Icon-App-57x57@1x.png", + "scale": "1x" }, { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" + "size": "57x57", + "idiom": "iphone", + "filename": "Icon-App-57x57@2x.png", + "scale": "2x" }, { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" + "size": "60x60", + "idiom": "iphone", + "filename": "Icon-App-60x60@2x.png", + "scale": "2x" }, { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" + "size": "60x60", + "idiom": "iphone", + "filename": "Icon-App-60x60@3x.png", + "scale": "3x" }, { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" + "size": "20x20", + "idiom": "ipad", + "filename": "Icon-App-20x20@1x.png", + "scale": "1x" }, { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" + "size": "20x20", + "idiom": "ipad", + "filename": "Icon-App-20x20@2x.png", + "scale": "2x" }, { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" + "size": "29x29", + "idiom": "ipad", + "filename": "Icon-App-29x29@1x.png", + "scale": "1x" }, { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" + "size": "29x29", + "idiom": "ipad", + "filename": "Icon-App-29x29@2x.png", + "scale": "2x" }, { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" + "size": "40x40", + "idiom": "ipad", + "filename": "Icon-App-40x40@1x.png", + "scale": "1x" }, { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" + "size": "40x40", + "idiom": "ipad", + "filename": "Icon-App-40x40@2x.png", + "scale": "2x" }, { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" + "size": "50x50", + "idiom": "ipad", + "filename": "Icon-App-50x50@1x.png", + "scale": "1x" }, { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" + "size": "50x50", + "idiom": "ipad", + "filename": "Icon-App-50x50@2x.png", + "scale": "2x" + }, + { + "size": "72x72", + "idiom": "ipad", + "filename": "Icon-App-72x72@1x.png", + "scale": "1x" + }, + { + "size": "72x72", + "idiom": "ipad", + "filename": "Icon-App-72x72@2x.png", + "scale": "2x" + }, + { + "size": "76x76", + "idiom": "ipad", + "filename": "Icon-App-76x76@1x.png", + "scale": "1x" + }, + { + "size": "76x76", + "idiom": "ipad", + "filename": "Icon-App-76x76@2x.png", + "scale": "2x" + }, + { + "size": "83.5x83.5", + "idiom": "ipad", + "filename": "Icon-App-83.5x83.5@2x.png", + "scale": "2x" + }, + { + "size": "1024x1024", + "idiom": "ios-marketing", + "filename": "Icon-App-1024x1024@1x.png", + "scale": "1x" } ], - "info" : { - "version" : 1, - "author" : "xcode" + "info": { + "version": 1, + "author": "xcode" } } diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index dc9ada4725e9b0ddb1deab583e5b5102493aa332..137ad259fbb8a87944a10a5ee42c1d0fa6a99f42 100644 GIT binary patch literal 16812 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 MeHMGOjE-OYKldG3eER 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 diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 797d452e458972bab9d994556c8305db4c827017..c43513155674a14981eff619e1a9943173a18bb1 100644 GIT binary patch delta 540 zcmV+%0^|Lb1F8g&8Gix*000A=FFF7K0r5#hK~#90W0B9_#4r$mWk75lwRqIxQHw_{ z9@ZACO7O;5%bP0;i}7=O|MmC!(~q0aJ==2O+24QvX=O1hGh>yXR-COOGZQ0Jh?_xL zkkds+BGW}BfAP7S&p%V&VkSn0>4_#TIuclAHKh1f=UGQgIe&KT=_e*e23}6qFF*be z83qI_PIpqlWh(^mak9=xG`aHhqobx6CmYMJKmShLc{6qQos)Opl5a5&2TPW#3V!_z z3=DE2+;Sq^5H=eNlbwc`jk;*}mK)Re-XYUs2Td_v4pxE|V*(~d#xfs`yRW|Ny8MD1 zi%k@T$gmXx7=IZVD}6Odw%9{YqS8-G9u|P)0Yxz$RSDkPFR-V1EEWeCOZUeZGBPq^ zQ%@S`2-lms`}V$TuLxVr$;w385kIh6@})enze4cHs`=S0v4OA2n%wvQN>mW zU<4&J%}wW?zWVeNpT)vF)U*`>*jSjXR7EzNeTvWG2Y+wAQr%((1_nfNi_7A3_ut=s z@mW=Zmx{Lj{rCUW-FE~m{?EWrxa9oOEDL@vs)hON{dXU~`$oWG1_p*JPd<8eA1d%r zbI=s$VrK>^VkRe%|NqbM@Xgl+hwd*w{s>bRdjazF{rA%47s;@UcrfT&AfpzKT0Cm; esKtZFVif?aDv$O3+5n{h0000+>eB z?J{?+FLkYu+4_Uk`r_>LHF~flZm0oBf#vr8%vJ>#p~!KNvqGG3)|f1T_)ydeh8$vDceZ>oNbH^|*hJ*t?Yc*1`WB&W>VYVEzu) zq#7;;VjO)t*nbgf(!`OXJBr45rP>>AQr$6c7slJWvbpNW@KTwna6d?PP>hvXCcp=4 zF;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f_G}yUH||9 diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 6ed2d933e1120817fe9182483a228007b18ab6ae..947bedbd12d526487f90caf83568644bdc33aaca 100644 GIT binary patch delta 845 zcmV-T1G4U10YF6K~#90?bvTf6JZ>{@!jp*oNi8?o6c^z zQs>gCX-+J`u&7Xp98-FcFC==SL?M)K0?Aj=8^J$N_C}J@H$h;MU?8EcKQBZiNi)Mg zrKU}$ox0Q0T|^LSyJvTE_lWd-Uq1KS@!@tndl(USvqN&wB7gQ9;7LcLL`H^eU(|;yEQausY{Me8-q`)QwSU6H27^?!^+hu@@$Y9OlUANfyp|t-uj6A&?*w3y6CI_J zUpZwIhX+bV;59Z2&1|*5o#vY1MCT{#WCSjn4HSk+?p#Xg8k$>LW4sPs$siz^@}GddB7M z7?`nHNzqiGm`%^ip;@l0pnbab`EZ6Y!l(@u2L|e4&-mOD&2<%oURq-=H@$gKej@Wo zq&PM&u`K(@mMgmozvEkH^}w$W((mL`G0F6Q&3X_^ZxJBrEjh;H0ay ze@4KIM5>N$22f=OE`B2EYIBAEx~Zp<#v4utI29AvCNI8deAmD};vCfkgiT XN-@ynuQ&AQ00000NkvXXu0mjfq86CA delta 435 zcmV;k0Zjhc2Eqf78Gi!+000dlDL?=K0EAFXR7L;)|5U~JDYo_jSDRPH_*uvJ?fL$s z;QQnD{*>GM-ShrilfUZt{^9lhT*&z4_x{-O{Rv#2V9EI}xb^~1iQe@7)8g(7UZ4B@ z|4zgB>+<*9=;^^)>d)H7pzGjuM>Jnezy3`@G2r z?{~a!Fj;`+8Gq^x2Jl;?IEV8)=fG217*|@)CCYgFze-x?IFODUIA>nWKpE+bn~n7; z-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGrXPIdeRE&b2Thd#{MtDK$ zpx*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{HY|nMnXd&JOovdH8X7@*v-vxRYf)w4u8b>IM(D@3vsitvM~Mm z`)}LD=k;qZzyJE1D07(@8Dnh}a5+Srp9Ag#KO<>Xao&Lb!$1H0BVaBg1B08cxF9zh zE_2a#ne(&gh)dnz{@~t>xE|@zM+H$in*oU8l)P^z`$Uw zCUT(KDQ?DzOMj0)VmH@KSAtYSAwYnetsz(^Xu?tK=KlTnpFDFJ7#LI~c#*j%=59X! zG|NSmJaaES`he5i2|I2{3v&7yNi#Asl4R(^H(zU3U&d+fuRs6t7oYFhdP7=>i;)qO zkclz$`>(&39)0+O8irW%#p8G1AHVxfl6x`1Fe`sY%^4k}<^ljy0dY3H$ZaG50000< KMNUMnLSTYQV97uL delta 266 zcmV+l0rmc`1DXPm8Gi!+003c4mpuRg09{Z_R7L;)|5U~JDYo_jSDX9(|7FYh`2GLd z^Zv2r{H^2sT*&w!Y^SB+`<>qVZqE6)=lqo0`vF#&*75!I`TIh@_d&k*HoEtQyV-iD z%Xz2D9EQRbeYh5Nr~y=#0ZD;^+vz0$004MNL_t(2&&|%+4u6C&2tZM$Wf&dzefR%A z(^3-?6X>hnCz2Ba@RH&`m!pgy?n@#@AuLYB&}Q)FGY`?vcft0!vht0Z@M&ZeNCWXh75gzRTXR8EE3oN&6 Q00000NkvXXt^-0~f(&VeqyPW_ diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index fe730945a01f64a61e2235dbe3f45b08f7729182..e1811dc656d200f401f6daced60d02da43262cfe 100644 GIT binary patch delta 833 zcmV-H1HSyu1I-4I8Gix*003^;-G2Z80~AR_K~#90?busLQ*j)?@tw2dt}W->$?4oh zV^hkNo0iv-9!5f;6%=U(*+Y<#`qEQW&lx2JR`jBz5l94<5O@hPBSJPZ4bd{S+EhfH zd7C@UMK5M@{^#P(-w6NT$Nhij?6a|*|Jevr#WT_W6Y;MB{C`4Rm?19A5Eo{M3p2!p z8REhWabdQ}xUp)P!>rM3m9FfIPfKJzZ48pE*F zOTLA`)2{CiUJj1U_yt1#X+2!CR#{zQx0|DASJev1*}TM}EK^l;Uv0-w*uuZ!&9xaK z8_s7&DkRKfa({{V+OZUiPIbBQgMgn5e%x5KtoB?6t97N~Y}3T-QuT{|91~e|Dr2+) z$FNbKzt1~E1=sT`_;GI(rD|1DUWZ(CT4Ew)&YdyQs}7v?Q_tPrn$}OA=|x^=zx*``8=zOupH+B?quY=1nsrTY`P4|7Q=Bkq-^m({si zdd4^&!j-F(61hp*Fl>OQ7vt3>_WbLwzD+G~n&)`l2DGr<4-q2Q8N#cXJtL z=Mp&PwCPS{7=*CVcPKUP%99>HwakuTUUrzHZk|d_Ah!r-qe&qpYzB4LmnqgsChl&d z`cYYyTz?`K)J9)rzO}YvsEzF^0pv;u{PtpdE^x~SgpdAm$b=q|BSPW%Zv;}GUCYOhH706B4@V9oQ<9iLfxj|^R z*sNJ}D$o*;+dn#+6uT7~i76@wyZ{5aO)gJ?Lw^sA#MJu{A7}~4ZT~plH8{Cvdo(l^ zeW6gOz7zNxglU_osCPG(=frCiaA5R3>>PeK2;AP7xL%*X@Yd_AM^g^la65*5TTOco*VRu>F~h9~A*d&j2c0?d<~ zZaN@6(~AvnMg+2j)h7EFXM;mrm?19A5Eo{M3p2!p8REhWabflg&i&5Kg#^O~00000 LNkvXXu0mjfOsbiq delta 447 zcmV;w0YLuE2F?SJ8Gi!+007oyx*7lg0G3cpR7L;)|5U~J0au$Tw)URh`@-w}Xw3Np zS)Ix4{k7)&ujKrh-TO(x_}20L&+q+}+xr1ilg8}*yXgGl_5RcF{f*iBEV%Z~-t4>5 ziGV;=={^- z?sLQGb)?A{hr$_!z8HbH7kH=vM0x-*R~t>;jsO4v^GQTOR7l6|(&r9>FcgO2dg?%> z;=sK?5%;?Pn^T7LL?Y$@5u?06NuIR*0?Yf$Hf5Afk+lM<^ch*jvO$sU*m9J?JI7eI zGFV6+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9R%3*Q+)t%S!MU_`id^@& zY{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&p6kME1_Z%?`+u)^el0!1<0sd p?Eyu!OMLDifi)An*I;?S-wj=m4RYIt!kPd8002ovPDHLkV1h&>^h5vv diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 321773cd857a8a0f0c9c7d3dc3f5ff4fb298dc10..03957c18c6b1da6f72877e45db1a23617041fb24 100644 GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0vp^;ULVx1SJ2h^0Q`OV43de;uumf=k2X(pWtwr10S8M z^=qBwm)&9y(g@brx+Y8^XVy-=;-2&ZA?If%iqgeud8ZE@x^qHovaitgH};#CE2mwQ z+`OYDW17yy2Qm^e!j7)$8vUVLc)D^Mf_9zSRQNCAk;L-vb1u#LyYGL|dE5Op8Aa9a zb*KM};{J92_|fWy77h^sjRy{ljZA!`F!Z)@B?V5>cAh+c<&F?=4Jcy*JEq@w|gFaG?wW! zNaH$hKTU5&g5uhsq7whWvkUw7-DV667Ch#*P{VtB{p`7I2@69k|3B?!T`K?A!qT=~ zz-YzN*O#uWE-h+p;citf|GPQd=3k>kOr(T{#?m{-t>?_~IFclna^=LVZPw?$_g@!T zy54k!+?20B()PXnRP*=pg$RWsDeh)myYGfIM;%L&h}n2J;EjRKxA4tj`^rzxx}|Q! zzvYW;u6)`i<+V;-J@>b2HlNf8TsomZKEygk%=hp|xnJHoYn^;AW=-u`ZqxZ-+q2~> zm;8D6Y~6`kEsm(xT-MAf=?mVxEM5IAf2(<2^~`4~AzW^~ZzhIn%`!H~JnrV5J%9Vw ze4h`JD@2NXHBC-ShQ-g4HE%VUJ15QZaL%$Typp%pInLkk)JY^|&yK9-m1i=GqD&5z z^|~(gJN!x0W_o_z?nBFhJzL(2@8()-bufEzaE8YD%BL%J4$eNh#bjdeYn};`^gh<7aB+X65G^w^zA!tW&{Xws24w~C;|9;}=vt3M_`pahL&g5b_{Pnn=pq$K6+f?`e6>r7G`Q8?- z6b;omSspzkfgHh3w23 zit$2UH><6$|8_RN%Fd>CZ_VD77gl*+K4q~nBT4H>r%M*A|Nm7%5uZPQ-nVk+yN4%( z?=Eh+-deBr;pOWHg_0d_uRYureQ26`)Q8u4EL;`=4htHXSxI5E?*Aox!CN&{K&K}k QSW+=~y85}Sb4q9e0GOvq*8l(j delta 691 zcmV;k0!;nT3BU!A8Gi!+002f7DP8~o0Jl&~R7L;)|5U~JDYo_jSDX9(|M~s@SH}2N z#rS{J`h3&+@cRDr`1>4br2|=<_Wb|z`~RBV`-<24{r>;E==`tb{CU#(0alua*7{P! z_>|iF0Z@&o;`@Zw`ed2Hv*!Fwin#$(m7w4Ij@kM+yZ0`*_J0?7s{u=e0YGxN=lnXn z_j;$xb)?A|hr(Z#!1DV3H@o+7qQ_N_ycmMI0acg)Gg|cf|J(EaqTu_A!rvTerUFQQ z05n|zFjFP9FmM0>0mMl}K~z}7?bK^if#bc3@hBPX@I$58-z}(ZZE!t-aOGpjNkbau@>yEzH(5Yj4kZ ziMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_stABAHe$v|ToifVv60B@podBTcIqVcr1w`hG7HeY|fvLid#^Ok4NAXIXSt1 Zxpx7IC@PekH?;r&002ovPDHLkV1g){YiR%g diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 797d452e458972bab9d994556c8305db4c827017..c43513155674a14981eff619e1a9943173a18bb1 100644 GIT binary patch delta 540 zcmV+%0^|Lb1F8g&8Gix*000A=FFF7K0r5#hK~#90W0B9_#4r$mWk75lwRqIxQHw_{ z9@ZACO7O;5%bP0;i}7=O|MmC!(~q0aJ==2O+24QvX=O1hGh>yXR-COOGZQ0Jh?_xL zkkds+BGW}BfAP7S&p%V&VkSn0>4_#TIuclAHKh1f=UGQgIe&KT=_e*e23}6qFF*be z83qI_PIpqlWh(^mak9=xG`aHhqobx6CmYMJKmShLc{6qQos)Opl5a5&2TPW#3V!_z z3=DE2+;Sq^5H=eNlbwc`jk;*}mK)Re-XYUs2Td_v4pxE|V*(~d#xfs`yRW|Ny8MD1 zi%k@T$gmXx7=IZVD}6Odw%9{YqS8-G9u|P)0Yxz$RSDkPFR-V1EEWeCOZUeZGBPq^ zQ%@S`2-lms`}V$TuLxVr$;w385kIh6@})enze4cHs`=S0v4OA2n%wvQN>mW zU<4&J%}wW?zWVeNpT)vF)U*`>*jSjXR7EzNeTvWG2Y+wAQr%((1_nfNi_7A3_ut=s z@mW=Zmx{Lj{rCUW-FE~m{?EWrxa9oOEDL@vs)hON{dXU~`$oWG1_p*JPd<8eA1d%r zbI=s$VrK>^VkRe%|NqbM@Xgl+hwd*w{s>bRdjazF{rA%47s;@UcrfT&AfpzKT0Cm; esKtZFVif?aDv$O3+5n{h0000+>eB z?J{?+FLkYu+4_Uk`r_>LHF~flZm0oBf#vr8%vJ>#p~!KNvqGG3)|f1T_)ydeh8$vDceZ>oNbH^|*hJ*t?Yc*1`WB&W>VYVEzu) zq#7;;VjO)t*nbgf(!`OXJBr45rP>>AQr$6c7slJWvbpNW@KTwna6d?PP>hvXCcp=4 zF;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f_G}yUH||9 diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index 502f463a9bc882b461c96aadf492d1729e49e725..b9a58d7b84c50c1a19353254b9b6654b2889c6d6 100644 GIT binary patch delta 1137 zcmV-%1djX41p5e(8Gix*0004VW%>XB1VTwfK~#90?U;LLTU8v#b8>HT)4ZCbNqSpZ zZW&O*K2 zs9|VjERmWGEsV{C2mFD)@jyJ8mSbEP5DT;UnnO+HyQ^1eR8-ch$|B8Q2a+WG(xYpYN+2=85^6eo8Ovg$qu`ro z>yMrr{(roGO3Faug}tTb^{XvX#ukc-R=&E&qhsif?g`PIh!<}57K^SG4FKS9vui34 z?YcfAt_ShLbxy13S}6bkj`{8%@CQOsF+XsT!ZZb(tX^ELbWB=xYlGwU@5V&biV>!i zU~`2{bJm$?QTZKZg zezoP3_S*5;@GIwr`^Ey0RZzl5cCFKEa`ZB&f;D{BUVHrf=*f#vyAgg3hh5j`wxh@< z7k>bN7k0XC2czHq$iExm7jE*f0OZzWz83(%(cPZzkvZOTHNUX?zI=4SWW;Jt=zi`jUT=1{O0zHE$m5dBd@b5GszJK9V`rQluBfHijN+lPuc&hX2G;cGg{nP2* z8(ZD>`bry$U~=)!h4Damk+&I?a5|%C|9I%b*6O!dgzl6B8)pk z7wV9U_c7L>PC7Fz);fJC!0!sd!}u00000NkvXXu0mjf Dp=3qI delta 572 zcmV-C0>l0L2+9PI8Gi!+006nq0-pc?0H{z*R7L;)|5U~JDYo_jSDXF*|5nEMy6F5^ z$M}8I`uzU?*Yf=uXr;5|{0m;6_Wb|A>ik^D_|)+I$?g3CSDK^3+eX0mD!2CP`2NN0 z{dLg!a?km&%iyTt`yiax0acdp`~T(l{$a`ZF1YpsRg(cvjDG_-U$Er-fz#Bw>2W$eUI#iU z)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G!hkE!s;%oku3;IwG3U^2k zw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn_j%}l|2+O?a>_7qq7W zmx(qtA2nV^tZlLpy_#$U%ZNx5;$`0L&dZ!@e7rFXPGAOup%q`|03hpdtXsPP0000< KMNUMnLSTZWm^FX^ diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 0ec303439225b78712f49115768196d8d76f6790..b0ff144da636e16458054b2352090ff12e1589cd 100644 GIT binary patch literal 1735 zcmcIl`#Tc~1D;bfMoz_<`(7OIijtNR002<&Lc8I1J^eof z{;;cD1$I6Fpm5#G&DlSlvGge$b0+&|>1IaUu#oVEP< zvyglay*@Pte!nRs)MywI)SuL54uy+840^wb!POBi3oR_;$hx@(FaGQmJef}aNWNIs zo6gGY(qFzV5JxV{GV~@0Jr^hE>|V7<^ME&dFdK>(u!a_}Kp~fX`D~oQ|2_)U+3L8I z0$&HHhc1{yJHrnk7aa68@{x?o6+VouYweC0PH0!LzyHk|X;sD!Ae*4zRw#Iavr7vG z!kQ{G=O6!hO!gT+OaXstM0V%QncjV%sB0Q~-2AFVM3Ry}+GOn#tr}N7WcF^Mud^7c zP0FS&NVpODd==e$9JhL~26v`US@F)75FbDJif>!%ubUIitNd+L?Z)=@-vkZ}Xw^oq ze0=ME%oWKnI`Cdhe>qp{L2?Yv-k^v7+HM3wtTQw=z!rjQgGchT>W0l=lfjRtUk?$| zmR$Ob_nD^R8$|!SlHR6zvK;gM!#1l!e!D}JUUeVo&AkFdLOr~zSNAx8ZWZb*zxjCF zWli4MF*Oe#(S@iCo0aVto(`(rRJQH6o{$Pka{~qk3@XAPdKcTjclS4KziUmQk5yoD zlH%?iT!Qr~2l0#bX0yblf%j3;zeiclu{kBZ*itIQ&JpGVZumC*@LFQh)7>`TQzbLC zpWxwpY6J^auL}_U#eBw!6tO`QEE#YVJghG#M>T<*%+sM-Y>XddAcQW7p?gN9RW4 zuYZ{X+nqC`#6n4FWOKta_jRWlmwje;%YV{TQ~?L(l#G6N;YHM&*C&`z)Nt&edmBoh z-DGYPF@B_|$s21^%{5IuUitl}uNqrdFqrwheat=J?Rmqa40K#)9!q;)YOA5aQSV=P zCPoxWn#JX3$q=?*wauXwi_FFwPNS6>$0$0TCSRi=>{xgCTNq0=QmObJl!0<0{1Ui0tY1*hA#+S<^@G}R#H z1otJGQrE_96mC`R`Hi5re?}7z;YiA(Gj>FbLJV8(Q=m!N%w2AvH6!uMJiIb?{+7=B z5}^LJ{|m3j_^kOMX)UyJKjZu?G7lT)foY7?>XF^(D&jm?!a_@J#|s6aQtzol_7*l) z)J0-jNR)-5X*4)X&md!80{m^wkk*Qw&7Ql!@L6+mr1a`;5OKsMKS27w_RpVRl z9rijmbb{B3n9;EhK0Ks=?rd6xx`R}HWZ%yq-b8np9`!%MVUkFpJ`C5Z@ig&4luP>XC zzKANJ3ueb3z?kpt)@}I{i+VyH4Ld)bwzSfKUTvHs?ENr8dfxM0U%hHz^FR>sd}zw` z;vPKe!upAmlQUDDnUc}Z^w_rbgxQWKoMqh$RKB=g-qBUE-~N#f$+iWN$qNt64jXb@ z5Uw#Dwkg3`qy+@>T}QiRg=BBl+VoI=G6F!leez7ixVF zQAH_lTGEMPI2VcPU`Q4V*k`dvuJK;+>qB?Zj^Pp8yKw}Y);~|xmT0DRKKbSuazMK_ z;0<+di8yjJW=Xdzu9e9f9DR|3o%Y?EMXjHRs(&<+$Na2M-L|ufy!?M!>i<4Kwp<;g WWwekJki2_P055kRw;OrUCbaZYjJo^$ z{nGILmD~Da$@upC{`C6(Ey4dPw)Pyc^>5DkHoEo!QcuK-Jwl-l}t(fQKv z{dds$V#@dygS`PvhX6is7Z+@*x-d;$ zb=6f@U3Jw}_s+W3%*+b9H_vS)-R#9?zrXogeLVI2We2RFTTAL}&3C8PS~<5D&v@UI z+`s*$wqQ=yd$laNUY-|ovcS9~n_90tFUdl#qq0tEUXle|k{Op|DHpSrbxEeZ5~$>o%>OSe z^=41qvh3LlC2xXzu+-2eQoqs1^L>7ylB$bCP);(%(xYZL1 cY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$g5ZA1?*IS* diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..9114596d6878a3d990e7691329e5dd36d52f5dc6 GIT binary patch literal 692 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 WWwekJki2_P055kRw;OrUCbaZYjJo^$ z{nGILmD~Da$@upC{`C6(Ey4dPw)Pyc^>5DkHoEo!QcuK-Jwl-l}t(fQKv z{dds$V#@dygS`PvhX6is7Z+@*x-d;$ zb=6f@U3Jw}_s+W3%*+b9H_vS)-R#9?zrXogeLVI2We2RFTTAL}&3C8PS~<5D&v@UI z+`s*$wqQ=yd$laNUY-|ovcS9~n_90tFUdl#qq0tEUXle|k{Op|DHpSrbxEeZ5~$>o%>OSe z^=41qvh3LlC2xXzu+-2eQoqs1^L>7ylB$bCP);(%(xYZL1 cY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$g5ZA1?*IS* diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index e9f5fea27c705180eb716271f41b582e76dcbd90..e5be35578f6b32e7d04be9cc06980ed0339174aa 100644 GIT binary patch literal 2544 zcmd6p`#Tei8^%{u)ElWBLsE(eC1)mwnju6?d|qW0+bOt0c%Gf>Ehkn z$Q*8z<#M$Y2?-o|(9egBFC~sFj1?pE=5x+*oJA4<^<%j!0F6L`gyVl!ZoaA#*E=OM zqr1*!8GDrXYxl-H^icU3vtnk+H7$Al@_ApzdQm66=$E?eJUH<~{yq>9oNwJ;q5yZy z=uJy|slK+!v7|bOKXQXnMrs1nT34r`>oN0;Olg&0OCv?-MMWK2lx~&-z48(La&tdWZ80Ai9g{cy(7}D< z_M+N||H34H-(kX0JYjle3AD3Hk{iS|aMZ^~(YsPmL%K=8*~WQ%hdQGhExcc$CEWb* z1{quqx}d_=#oip5ibE^kGJr7Zg2P)E)6oebN>QdaH!@!}6}zsE9wFfPxOm@I)(Mn8 z|MiP)k8+9-R-51ICNQS+J~XFiXg#$MMX)k<;Ok%j(`d;=-kd|lv3S;3iSSm#CEcF= z@owmvAh{#OirK!u)7*#Dlgxqg0jkFzpRqxv6!geVwOPyCpwO5veRn!Vo1e>Mo$69$ zvZT__zT6dB7+&t8d5?m{7!RS@+{hLWY{lx#*Kp9GoJx_aKl&3QuiD1Br%Il->&V|2 zC-L`8)6Ve6o26dsy+60{(;kt)XV0s!bHoGTAV0`?ciS*~Tc2bqXBWnXmjUm1_E9I< zF5Ydy@MLNvr;M`Z=lablr=(aJ(RC8P`R3k*WmR}@2~iuAIh#2jZUe*!eBG;Z+l2QC zJj3Y%XU4!58Y;JQd9;4uGI#{GO7tBs3xO+GS%*g0j?WuM^GG%7Pf zQM1U*YrNfPQ(-vmiyGXyVR{m2J{>weX3g9rXl6?#&oqsphTTyn?J8tEqL23V#7waz zjEc8t9u9ZSl96AEx7J+X5>PFKwlY~?BjW`|rB?!U7(b0kb~!m3 z6I6JgCk0`8yAX@-BiwaYTjGVM!p~o^d;6O5d_Ytzq}PN;wtf)PPatB9 zD>~)F0{8JM9ZX?%1Whz@hzJQ&9fDFdNZK#iUG0lRnq$ z2jjGsPGoDX;RLhQI_~5eb!o|<5;%+dp$G9jgOhr=19deHWj&O z)d72#NX3-l+9^-nYneCXdNW`f_U{J9+kU^;jE(9vx=MbzxoQxZM%mOgX{gf+*O zS)YKhTCb%cR70weM*e%(pRhX?`{wlc+SOs02I}?U#BdpL%Q{DoB>H$J`SH~IpXQ5S-3@TgLgXyu7O{gYnPT;k*E_XUQ?kyf@ z6(c|SI2QeuGU}QJm35q7ul?P*2mZ8f>31^=3L~dys3I=b8@UnO zhsxT&l5q7YgTFR4Rc|UR#7M6dfDQgO2oLrj3=H)*0V*`^m~9~sPAub{-2#Kxz-tom z^DASa)7;vcx%VxeVr{JiCo+OEG{s^GW|F~)l_`Ivb JYr89V{s$h_*@OT9 delta 1668 zcmV-~27CGN6N(Lx8Gi!+000UT_5c6?0S-`1R7L;)|5U~JDYo_jSDRJE`2GI>`u+b> z#Q0do`1}6<{Qdq#!1wR$2T#*AweE>Ub09v4>;QIg_I^_2LtK$20(D{zn_^HL*3Rj70 z%=tLH_b#{gK7W9-03t&#zyHMQ{FK}Jd(rva=I|w|=9#+Ihp*3ip1$;$>j3}&1vg1V zK~#9!?b~^C5-}JC@Pyrv-6dSEqJqT}#j9#dJ@GzT@B8}xU&J@bBI>f6w6en+CeI)3 z^kC*U?}X%OD8$Fd$H&LV$H&LV$H&LV#|K5~mLYf|Vt-;AMv#QX1a!Ta~6|O(zp+Uvg&Aa=+vBNz0Rs{AlWy-99x<(ohfpEcFpW=7o}_1 z>s&Ou*hMLxE-GxhC`Z*r>&|vj>R7LXbI`f|486`~uft__uGhI}_Fc5H63j7aDDIx{dZl^-u)&qKP!qC^RMF(PhHK^33eOuhHu{hoSl0 zKYv6olX!V%A;_nLc2Q<$rqPnk@(F#u5rszb!OdKo$uh%0J)j}CG3VDtWHIM%xMVXV zmTF#h81iB>r55Is`L$8KI@d+*%{=Nx+FXJ98L0PjFIu;rGnnfYn1R5Qnp<{Jq0M1v zX=X&F8g4GYHsMFm8dDG!y@wy0LzrDkP5n}RZ}&a^{lJ!qV}DSMg`_~iho-+ zYhFY`V=ZZN~BQ&RAHmG&4 z!(on%X00A@4(8Rri!ZBBU(}gmP=BAPwO^0~hnWE5<&o5gK6CEuqlcu2V{xeEaUGt9 zX7jznS5T?%9I4$fnuB2<)EHiTmPxeQU>*)T8~uk^)KEOM+F)+AI>Y`eP$PIFuu==9 zE-`OPbnDbc|0)^xP^m`+=GW8BO)yJ!f5Qc}G(Wj}SEB>1?)30sXn)??nxVBC z)wA(BsB`AW54N{|qmikJR*%x0c`{LGsSfa|NK61pYH(r-UQ4_JXd!Rsz)=kL{GMc5{h13 z8)fF5CzHEDM>+FqY)$pdM}M_8rrW{O4m<%Dt1&gzy8K(_+x-vIN$cs;K#LctaW&OA zAuk_42tYgpa$&Njilse`1^L+zfE<)2YpPh<)0mJ;*IFF|TA%1xX3fZ$kxPfoYE=Ci z)BrMgp=;8Y9L43*j@*RFlXvO-jQ`tkm#McyC%N^n#@P}`4hjO2}V z1RP0E%rxTfpJbnekUwBp-VB(r604xuJ$!t8e0+R-e0+R-e0+R-^7#e&>dm?Lo++vT O00006ADKI(rC0_@ULP$yhy}yfV}m41jOMY? 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 literal 0 HcmV?d00001 diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 84ac32ae7d989f82d5e46a60405adcc8279e8001..17d650f6a1384a5093e99d61b8694ea2c352eec8 100644 GIT binary patch delta 1155 zcmV-}1bqAY1&s-i8Gix*002n!#(V$(1XM{xK~#90?b&T?6J;C#@aNiFuh*Bmt?RL_ z^ek)GTEVWc&55vyUo0C0G+`Jd0tw&;2#e^5AM}$(KM-FMUZN(%3}b`@<4g<*#Hi72 zpt3D)Gjndr>Plg-m)l!kSiAO&yKR|Hy7sQUJ;mqw@Xyoc{(sFq`Td`l-r?34zXT6@ z!lBA>#6nvP8Uk1F0C4{BA9p8P`?#-uxzl-b zT>jcgnWSEg*MGW;p0BWKRR5Ug7yw2+Vbl{FRvVAHi#ohxZ(r(e?j6oN$t_OPThA8f z>Qoqp@jM?V7PIsxhc{g5yz|<{PA(A67|Ekg71nLFV{=~#o%pfZmA}?P?fu}#{^4K- zNY=Uw>$W=hnbjq};lc<2U=5m!wVQUGy6PPXLM`cbntxudwkN2!FbbVKTK(aHvZvo` zibVMWM*Dc7(Y8XXBk)ip+CLm@xiQjpYhsxt8HzZu+clS-sNuY%(0SNQo!(cv(m*=d z?8TRPhWzImJr{oPhNol8BUx8%&(W$9pNESjg;?dvzu%7(FuK=wI`?d}9;t7;G3b|D zas@@ylz+1#4F4sWNGvkxzj&$Q;MwafeVnY4+t!)0aD@oNq!!`%NRe4*4?Vj5ou->y zP(H~@2P1AaijWi{O=g|iSF-bDb2KKGq|-u+n~mZmg}8oI&NF3}h8CY3k`Ea*Mm-_3 zq!15owtarxmqtmY0@ReV2R7RrW(v$TIVAxAYkw^?n@jq*P+BA{2J+1Q()Fuy79MWo zmjnP5v)Mi_lzK^vfowQdkw>dj1tKN!xsBGq)O2Id(ERZrQOP(B1K{M|5@Ccev`RZu zX=l28jI@YmS_2lO(y?q)Ru5#KbCBey&c% z1;XMbwKETFpq1o#Ua9!|B=k+!UGb9Rp$O!X003s@_$6MlXJA6u{h^h_Ff0^_#@`^8 zkR0)c+dQLXHUrF(y#teyBzYdZ|Ml-5y?;;+t>m9Wf!}711d{g2Z+{)U(m7D=GQ%nP z?&ThSsUakEK!4>zhlwWFS+il2{Ol+1rJrx7=72tVZ+iEcYj5sy)|9i5NCE&pZt}d* z(6!{vC-GNnYC3lOe8;C(`}b_JK4E9_Xf=jmF`mcnv+$-*ay%Gm?j5Rc^tASIX?%J7 z(e52<_l^Mow1iTl!Y4uzr2^Bb<$IGGiN;0)k@=4a-nPgGS^j&`z|`#S6bwg`P0!R< zcQ7ZS*XfXfNR@oB8!A`Gs!ntwl7tKdNg_!k2^R>GM3P7nE)XP%B#|UsAV@M^{0pk0 V*cDDY;m`m8002ovPDHLkV1jd?IMM(B delta 749 zcmVg;Ps8|O$@u8^{Z_{KM!@$5TAfS6_e#O{MZfpz`2O`0$7~@NRr(1{THzH08y3x{{PYM{eL;T_A9^tcF_4Sxb`8l z_9V3RD6;a(-0A^Pjsi!1?)d#Ap4Tk3^CP0(07;VpJ7@tgQ}z4)*zx@&yZwC9`DV-b z0ZobH_5IB4{KxD3;p_6%|f=bdFhu+F!zMZ2UFj;GUKX7tI;hv3{q~!*pMj75WP_c}> z6)IWvg5_yyg<9Op()eD1hWC19M@?_9_MHec{Z8n3FMs~w_u?Av_yNBmRxVYrpi(M% zFMP21g+hmocQp3ay*Su=qM6He)*HaaTg$E^sym`(t%s3A)x!M+vfjXUBEpK6X9%iU zU!u9jj3(-$dM~sJ%Liy#?|+!6IY#MTau#O6vVj`yh_7%Ni!?!VS+MPTO(_fG+1<#p zqu;A#i+_(N%CmVnYvb>#nA{>Q%3E`Ds7<~jZMywn@h2t>G-LrYy7?Dj{aZqhQd6tzX%(Trn+ z)HNF}%-F{rr=m*0{=a;s#YDL00000NkvXXu0mjfZyT7o diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 8953cba09064923c5daf2d37e7c3c836ccdd794b..ffffb900971c132af7aaa03cd6bc0566bdf6137d 100644 GIT binary patch literal 2484 zcmb`}`8ONb7Xa|Ic3PTztAg5+klJb_Cf3@8XltjLwA9jCYHLfaRi&sUXewkZMTb&L zETz_prDTxOvBhC59jS=D3AL5_#`pU#%sKDAcg}n7-gE9R_k2?9Y%I?TO9=x2fU_7Y za|iDE`$-6%=I*58<}d(2C>mpK;uKM^{wmteX;S9T&DoAM9_$6IY`dC<$EiqR$~mGh zte8DQWw|dvv#bzk%qTcNOfPGo(Gc-0(ChC~Bw5c7SMiG4n62_?T1!E)TR6$Mva3=a zG*@d;NW1)l)lXet$pg%_@3I-YN2{Nveq33a`;ou@By6}anv{AlH!no|W&z~&XrA{Y ze4R|6Y8vSmfLatACqFz-SMc#_3eH^)yGH*7R&V4ZHwKe!>0MZzYe$yU6$azrw#;Md)_|$oi|IlDbR# zfG1ey9bE@b>#nu*{26XKID`G@y0x2IRH5qreOAG;(b3cn~;vLne>~rpy== zZ%RFIBh}dnWDy|1dM)&O1!%zaJUy&}B4*U^(ZX<&nVY8rLt|`@mP4()cr_aF|4Y@TE(Kr{dN6|TTy4JVpVKw{~~vli2q zS*B06myUBL9!2^Ji}t0NrdssU_Sv=7DG~&vPF@mm?&WQx_Dk#%>EL6A)Gywgc!B_` zd;<$ykHU>X?kC|N7qb@+BU;TLv##-o*~8t@6v~sIJB#*?<(iIbLpg*EYEQN%%tTht zF*tupQ65@8Qj@)v$_XvF=Gvk{y;FaoXd(om&scc(V!vWVyU>dHjd$nk%JwVhn_p!% zKWgxU(fp(Ps~40u~ppl}q^G@q*iiZBR3{JifW#Jxl$U{)r#I zdi|*5qmpHKJh~ory}`inlKSXvrlQhD_K)Yl*VXA-3FxLB!Y0%p}^UF*5 zFC$>aV@^TfkZU06o{) zuoX}L=iU8lLqHHz+dE+q#v6io-%c;92oYuOTls{mnjV%~WG-`?vG$+NBrdn}!wtgX zksyH)6-de?T~P;;QISyUx1Ajcyqwo+e+^`NIi>%q{ic!gZmsHUh$>Fx9i-&h<6Fs;WBYX7 zwC3t$!rp-F0!i8A5>(}jlRcdtevAyb)1DK6eCU-#4|&UYrfFYw*q4FtVNCG4qoc0& zO|eaeCv+&UGn5%67=`)UM#ufSSFmXBWv9`KbkvvkyPB@+D)AHExn5W1 zIRwM$${8PAJ)&ZAa<;K|?~IPOrO4Y^&Vw(=$Li^GIzHn72n4EkGG>+*DYBQOcR+Pj z_4;}LAA0G;lu$eYl<#f z4{X$G@VWJsO>to+2!y`d_lEMZ_i=M}qy_IceD+_*{sYyajdsx7Sst_)@totmdtxMfqpqdth+RS6<=3nWoE;s3 z&$?ZXbwxy`V5sDjuJ2cPM8e%|P})pYmkP8t_DB|O7;kAzO~I_jIJ@T)ikiVnWR$Qr z?_ZAE>*6=s5-*}~gVIqPhjFbxa~Y%IqGK21;@;D<#L4>=QY0J7Q*JIzoj*eobFMeh zKjy5AS&GM#$2^&K_#ph~1yG;L&5nv|O@m(ejT$>F68q zM2<==ug989;oecAfKh#4Sfid)Z~^6EP-kp$EfF56c%DHBiOTBRxgP$Ax#%7s;rhIL zZ(-9gHa5I$W_{@P+u+fCjdsIoZzfPqDLn7SuaZra5O#+|4!<(%vd$3S#EjHTY~^rJ zCtO7icV<(oa}?FMcq1FWtCr@pFG#>vOZwx^d_HO#^lj49i|DoTSt3)|n}>%z`S}hg zb$XlIQ~Bh+_>myE&Eu%8^1JE7v2|Z)VOHU1Gp=)o*cF$##_0D!W>H{8DxX15JtT&W zj%80#H9Dm{VK%Od-SC|6ub{Ps)mK8xezN)U7TMi?gr6R}hEYN9u*w9%Lj-xivnp8b zps~KWx~8Gk=aX4O#35Ohr-b=(kj`ED8XiQ4JV0xvQ$YPRcQ|h-lq7)scsj%psW1S2 z%(LNaMs9nMEjIAj*1nuI delta 1217 zcmV;y1U~z;6UqsY8Gi!+001u>&=UXv0SHh`R7L;)|5U~JDYo_jSDRDC`1<|-SjPDL z{{Q{{{{H{}09Kk-#rR9Y_viNgVafPO!S|ls`uzR=MZfp^{QU=8od8La1X`Tr_Wmff z_5e$ivgQ1@=KMy$_g9a+`TPAle6cOJ_Fc#L7qIpvwDkd1mw$fK`6IOUD75rX!}mad zv(fMTE4=(Nx%L54lL1hVF1YpqNrC`FddBPg#_Ietx%Lrkq5wX00X1L{S%Cm9QY*av z#_Rh5PKy9KYTWbvz3BX9%J>0Hi1+#X{rLA{m%$Kamk?i!03AC38#Yrxs)5QTeTVRiEmz~MKK1WAjCw(c-JK6eox;2O)?`?TG`AHia671e^vgmp!llK zp|=5sVHk#C7=~epA~VAf-~%aPC=%Qw01h8mnSZ|p?tc*y?iZ$PR7_ceEIapF3KB14K0Pog?7wtd+^xgUCa_GVmlD z<^nU>AU_Yn-JU?NFdu|wf^bTCNf-wSBYVZltDdvGBln-YrbeGvJ!|s{#`gjN@yAMb zM6cjFz0eFECCsc|_8hTa3*9-JQGehksdoVP^K4m?&wpA~+|b%{EP5D-+7h)6CE; z*{>BP=GRR3Ea}xyV*bqry{l^J=0#DaC4ej;1qs8_by?H6Tr@7hl>UKNZt)^B&yl;)&oqzLg zcfZxpE?3k%_iTOVywh%`XVN-E#COl+($9{v(pqSQcrz=)>G!!3HeNxbXGM@})1|9g zG4*@(OBaMvY0P0_TfMFPh fVHk#CZX3S=^^2mI>Ux-D00000NkvXXu0mjf+Es(G diff --git a/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/Nuvolari/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 0467bf12aa4d28f374bb26596605a46dcbb3e7c8..06482f968e06b8d0cf5e1ea3de793544375ee372 100644 GIT binary patch literal 2566 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 QW&i*H07*qoM6N<$f-dIF(EtDd diff --git a/Nuvolari/app/pubspec.lock b/Nuvolari/app/pubspec.lock index e8d6561..c2c36f4 100644 --- a/Nuvolari/app/pubspec.lock +++ b/Nuvolari/app/pubspec.lock @@ -41,6 +41,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" clock: dependency: transitive description: @@ -134,6 +150,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" flutter_lints: dependency: "direct dev" description: @@ -269,6 +293,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.3" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" + source: hosted + version: "4.12.0" leak_tracker: dependency: transitive description: @@ -698,6 +730,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea + url: "https://pub.dev" + source: hosted + version: "3.1.4" sdks: dart: ">=3.13.3 <4.0.0" flutter: ">=3.44.0" diff --git a/Nuvolari/app/pubspec.yaml b/Nuvolari/app/pubspec.yaml index 47ad936..3d19515 100644 --- a/Nuvolari/app/pubspec.yaml +++ b/Nuvolari/app/pubspec.yaml @@ -33,6 +33,11 @@ dev_dependencies: sdk: flutter flutter_lints: ^6.0.0 + # Fans the two generated sources out to every Android density, the adaptive + # icon and the iOS set. Build-time only: it writes files into android/ and + # ios/, which are committed, so nothing here ships in the app. + flutter_launcher_icons: ^0.14.4 + flutter: uses-material-design: true @@ -45,3 +50,33 @@ flutter: # the app runnable offline with no credentials. - assets/mock/ - assets/mock/frames/ + +# Launcher icon, generated from the sources that tool/generate_icon.py draws. +# Re-run after changing them: +# +# python ../tool/generate_icon.py +# dart run flutter_launcher_icons +flutter_launcher_icons: + android: true + ios: true + image_path: assets/icon/icon.png + + # Adaptive icon: the launcher masks the foreground to its own shape, so the + # cloud is drawn inside the safe zone and the app blue fills whatever the mask + # leaves. Kept identical to ColorScheme.fromSeed in lib/main.dart. + adaptive_icon_background: "#1F6FB2" + adaptive_icon_foreground: assets/icon/icon_foreground.png + + # The generator already frames the cloud inside the 72dp safe zone. Left at + # its default of 16, this would shrink the layer again and the icon would read + # noticeably smaller than every other one on the home screen. + adaptive_icon_foreground_inset: 0 + + # Android 13 themed icons tint the alpha of this layer with the user's + # wallpaper palette. The foreground is a flat white silhouette, so its alpha + # is already exactly the cloud. + adaptive_icon_monochrome: assets/icon/icon_foreground.png + + # iOS rejects an alpha channel in app icons. The source is opaque anyway; + # this drops the channel itself. + remove_alpha_ios: true diff --git a/Nuvolari/docs/architecture.md b/Nuvolari/docs/architecture.md index 2901497..f46a67b 100644 --- a/Nuvolari/docs/architecture.md +++ b/Nuvolari/docs/architecture.md @@ -33,7 +33,7 @@ Nuvolari/ ├─ app/ Flutter application (Dart package "nuvolari") ├─ backend/ Python worker ├─ docs/ this documentation -└─ tool/ verification scripts +└─ tool/ verification and asset-generation scripts ``` ## App layers @@ -131,3 +131,38 @@ subscribing to FCM topics named after geographic cells — the subscription happ device, so the backend holds no user records at all. With no advertising and no forecast provider, nothing about the user leaves the device except the area the map is looking at, which is inherent to any hosted base map. + +## Launcher icon + +The icon is a white cloud on the app's seed blue `#1F6FB2`, so the launcher and the +interface are recognisably the same product. It is drawn, not hand-edited: +`tool/generate_icon.py` renders it from signed distance fields — a union of three +circles and one rounded box — and writes two 1024px sources into `app/assets/icon/`. +Those sources are not listed in the pubspec `assets:` block: they feed the build and are +never bundled into the app. + +`flutter_launcher_icons` fans them out to the Android densities, the adaptive icon, the +Android 13 monochrome layer and the iOS set, all of which are committed. + +To change it: + +``` +python tool/generate_icon.py +cd app && dart run flutter_launcher_icons +``` + +Two things to know before doing that. + +**The generator owns the framing.** An adaptive layer is 108dp of which only the central +72dp survives the launcher's mask, so `ADAPTIVE_WIDTH` is measured against that safe zone +and `adaptive_icon_foreground_inset` is set to `0`. Left at its default of 16 the tool +would inset the layer a second time and the icon would read visibly smaller than every +other one on the home screen. + +**flutter_launcher_icons 0.14.4 corrupts an unrelated Xcode setting.** `ios.dart:340` +rewrites the value of any line containing `ASSETCATALOG`, so it writes `AppIcon` into +`ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS`, which is a boolean. +Check `git diff app/ios/Runner.xcodeproj/project.pbxproj` after running it and restore +those lines to `YES`. It also minifies `AppIcon.appiconset/Contents.json` onto one line; +re-indenting it keeps the file reviewable. + diff --git a/Nuvolari/tool/generate_icon.py b/Nuvolari/tool/generate_icon.py new file mode 100644 index 0000000..230a9df --- /dev/null +++ b/Nuvolari/tool/generate_icon.py @@ -0,0 +1,225 @@ +"""Draw the Nuvolari launcher icon: a stylised cloud. + +Produces two 1024x1024 sources, which `flutter_launcher_icons` then fans out to +every Android density, the Android adaptive icon and the iOS set: + + app/assets/icon/icon.png white cloud on the app blue, full bleed + app/assets/icon/icon_foreground.png the cloud alone, transparent + +The foreground is drawn smaller on purpose. An Android adaptive icon layer is +108dp of which only the central 72dp is guaranteed to survive the launcher's +mask, so a cloud drawn edge to edge would lose its outer puffs to a circle. +This file owns that framing: flutter_launcher_icons is configured with +`adaptive_icon_foreground_inset: 0` so it does not shrink the layer a second +time on top of what is drawn here. + +Shapes are rendered from signed distance fields rather than by supersampling: a +cloud is a union of circles and one rounded box, the distance to that union is +exact, and turning distance into coverage gives clean antialiasing at one +sample per pixel. That keeps this to the standard library — no Pillow, no +cairo, nothing for anyone to install. + +Usage: + python tool/generate_icon.py +""" + +from __future__ import annotations + +import math +import pathlib +import struct +import zlib + +SIZE = 1024 + +OUT_DIR = pathlib.Path(__file__).resolve().parent.parent / "app" / "assets" / "icon" + +# The app's seed colour, so the icon and the interface are recognisably the same +# product. Keep these in step with ColorScheme.fromSeed in lib/main.dart. +BACKGROUND = (0x1F, 0x6F, 0xB2) +CLOUD = (0xFF, 0xFF, 0xFF) + +# How much of the canvas width the cloud spans. +# +# The full icon can run closer to the edges: iOS and the legacy Android icon are +# square and unmasked. +FULL_WIDTH = 0.72 + +# The adaptive layer is measured against the 72dp the mask always keeps, not +# against the 108dp canvas, so the two icons read at the same size on a home +# screen. 0.72 of that safe zone leaves the widest points of the cloud at 0.82 +# of the circle's radius — clear of a circular mask, and of the rounder masks +# some launchers use. +SAFE_ZONE = 72 / 108 +ADAPTIVE_WIDTH = 0.72 * SAFE_ZONE + + +# --- the cloud --------------------------------------------------------------- +# +# Defined in its own arbitrary coordinate space. The bounding box is computed +# from these numbers rather than written alongside them, so the shape can be +# tuned without the framing silently going wrong — which is exactly what +# happened when the two were maintained separately. + +# (centre x, centre y, half width, half height, corner radius) +BODY = (0.500, 0.560, 0.255, 0.075, 0.075) + +# (centre x, centre y, radius) +# +# The trailing puff rests on the base line: its lowest point is exactly the +# bottom of the body, so the outline runs from the arc into the flat base +# without turning back on itself. Left higher, the union re-enters and leaves a +# visible notch at the bottom left. +PUFFS = ( + (0.415, 0.470, 0.140), # main puff, left of centre and largest + (0.585, 0.495, 0.110), # shoulder puff, higher and smaller + (0.290, BODY[1] + BODY[3] - 0.088, 0.088), # trailing puff, on the base +) + + +def cloud_bounds() -> tuple[float, float, float, float]: + """Axis-aligned bounds of the whole cloud: (min x, min y, max x, max y).""" + cx, cy, hw, hh, _ = BODY + min_x, min_y = cx - hw, cy - hh + max_x, max_y = cx + hw, cy + hh + + for px, py, r in PUFFS: + min_x = min(min_x, px - r) + min_y = min(min_y, py - r) + max_x = max(max_x, px + r) + max_y = max(max_y, py + r) + + return min_x, min_y, max_x, max_y + + +# --- signed distance fields -------------------------------------------------- + + +def circle_sdf(x: float, y: float, cx: float, cy: float, r: float) -> float: + return math.hypot(x - cx, y - cy) - r + + +def rounded_box_sdf( + x: float, + y: float, + cx: float, + cy: float, + half_w: float, + half_h: float, + radius: float, +) -> float: + dx = abs(x - cx) - (half_w - radius) + dy = abs(y - cy) - (half_h - radius) + outside = math.hypot(max(dx, 0.0), max(dy, 0.0)) + inside = min(max(dx, dy), 0.0) + return outside + inside - radius + + +def cloud_sdf(x: float, y: float) -> float: + """Distance to the cloud: the union of the body and the puffs. + + The asymmetry is deliberate — a cloud built from equal circles reads as a + flower. + """ + distance = rounded_box_sdf(x, y, *BODY) + for puff in PUFFS: + distance = min(distance, circle_sdf(x, y, *puff)) + return distance + + +# --- rendering --------------------------------------------------------------- + + +def coverage(distance_px: float) -> float: + """Turns a signed distance in pixels into pixel coverage. + + A half-pixel band across the boundary is all the antialiasing a shape this + smooth needs. + """ + return min(max(0.5 - distance_px, 0.0), 1.0) + + +def render(size: int, width_fraction: float, opaque_background: bool) -> list[bytes]: + """Renders the icon, returning one RGBA bytes row per scanline. + + [width_fraction] is how much of the canvas width the cloud spans. The cloud + is centred on its own bounding box, so changing the shape above cannot leave + it drifting off-centre. + """ + min_x, min_y, max_x, max_y = cloud_bounds() + cloud_width = max_x - min_x + cloud_cx = (min_x + max_x) / 2 + cloud_cy = (min_y + max_y) / 2 + + # Canvas pixel -> cloud space. + pixels_per_unit = size * width_fraction / cloud_width + rows: list[bytes] = [] + + for py in range(size): + row = bytearray() + sy = (py + 0.5 - size / 2) / pixels_per_unit + cloud_cy + + for px in range(size): + sx = (px + 0.5 - size / 2) / pixels_per_unit + cloud_cx + + # Distance in cloud units, converted to pixels so the antialiasing + # band stays one pixel wide at any output size. + alpha = coverage(cloud_sdf(sx, sy) * pixels_per_unit) + + if opaque_background: + r = round(BACKGROUND[0] + (CLOUD[0] - BACKGROUND[0]) * alpha) + g = round(BACKGROUND[1] + (CLOUD[1] - BACKGROUND[1]) * alpha) + b = round(BACKGROUND[2] + (CLOUD[2] - BACKGROUND[2]) * alpha) + row += bytes((r, g, b, 255)) + else: + row += bytes((CLOUD[0], CLOUD[1], CLOUD[2], round(alpha * 255))) + + rows.append(bytes(row)) + + return rows + + +def write_png(path: pathlib.Path, size: int, rows: list[bytes]) -> None: + def chunk(kind: bytes, data: bytes) -> bytes: + return ( + struct.pack(">I", len(data)) + + kind + + data + + struct.pack(">I", zlib.crc32(kind + data) & 0xFFFFFFFF) + ) + + raw = b"".join(b"\x00" + row for row in rows) # filter type 0 per scanline + png = ( + b"\x89PNG\r\n\x1a\n" + + chunk(b"IHDR", struct.pack(">IIBBBBB", size, size, 8, 6, 0, 0, 0)) + + chunk(b"IDAT", zlib.compress(raw, 9)) + + chunk(b"IEND", b"") + ) + path.write_bytes(png) + + +def main() -> int: + OUT_DIR.mkdir(parents=True, exist_ok=True) + + full = OUT_DIR / "icon.png" + write_png(full, SIZE, render(SIZE, FULL_WIDTH, opaque_background=True)) + print(f"{full.name}: {full.stat().st_size / 1024:.0f} KB") + + foreground = OUT_DIR / "icon_foreground.png" + write_png( + foreground, + SIZE, + render(SIZE, ADAPTIVE_WIDTH, opaque_background=False), + ) + print(f"{foreground.name}: {foreground.stat().st_size / 1024:.0f} KB") + + print( + "\nbackground #%02X%02X%02X cloud #%02X%02X%02X" + % (*BACKGROUND, *CLOUD) + ) + print("now run: flutter pub run flutter_launcher_icons") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())