From 549ad3039f82915b0b0c7fa2f29334060cd6c959 Mon Sep 17 00:00:00 2001 From: Angelo Stavrow Date: Sat, 2 Apr 2022 08:04:50 -0400 Subject: [PATCH] Clean up project warnings (#199) * Set "recommended project settings" for Mac app * Add default fallback for font typingAttribute * Clean up linter errors * Update extension iconset * Fix spm errors and upgrade sparkle (#203) * Switch WriteFreely package import from ssh to https * Sign macOS project target for Development This fixes a crash-on-launch bug when running Product > Run from Xcode (Product > Archive should work correctly). See https://github.com/sparkle-project/Sparkle/issues/2056 for more details. Bug introduced by commit: 671b0540ac526ca768c163c873ba32ecf01d7210 * Update Sparkle to v2.0 from official repo Previously, we forked the repo to the WriteFreely org because Sparkle didn't support tag-based SPM updates. We therefore had to pull from the `master` branch, so forking insulated us from unexpected changes. As of 2.x Sparkle now allows for tag-based updating via SPM; we'll allow patch updates but stop short of 2.1 until we can vet changes. * Add MacUpdatesViewModel ObservableObject * Use MacUpdatesViewModel to handle Sparkle update logic --- .../AppIconExtension@2x.png | Bin 4787 -> 0 bytes .../AppIconExtension@3x.png | Bin 7521 -> 0 bytes .../AppIconExtension.appiconset/Contents.json | 20 ++++- .../AppIconExtension.appiconset/icon-40.png | Bin 0 -> 1042 bytes .../icon-40@2x-1.png | Bin 0 -> 2207 bytes .../icon-40@2x.png | Bin 0 -> 2207 bytes .../icon-40@3x.png | Bin 0 -> 3646 bytes .../icon-60@2x.png | Bin 0 -> 3646 bytes .../icon-60@3x.png | Bin 0 -> 5872 bytes .../AppIconExtension.appiconset/icon-76.png | Bin 0 -> 2146 bytes .../icon-76@2x.png | Bin 0 -> 4700 bytes .../icon-83.5@2x.png | Bin 0 -> 5291 bytes .../icon-small.png | Bin 0 -> 763 bytes .../icon-small@2x-1.png | Bin 0 -> 1610 bytes .../icon-small@2x.png | Bin 0 -> 1610 bytes .../icon-small@3x.png | Bin 0 -> 2488 bytes .../ios-marketing.png | Bin 0 -> 30594 bytes .../notification-icon@2x.png | Bin 0 -> 1042 bytes .../notification-icon@3x.png | Bin 0 -> 1604 bytes .../notification-icon~ipad.png | Bin 0 -> 524 bytes .../notification-icon~ipad@2x.png | Bin 0 -> 1042 bytes .../WriteFreelyModel+APIHandlers.swift | 57 ++++---------- Shared/LocalStorageManager.swift | 2 +- Shared/WriteFreely_MultiPlatformApp.swift | 19 ++--- .../project.pbxproj | 66 +++++++++------- .../xcschemes/xcschememanagement.plist | 6 +- macOS/AppDelegate.swift | 23 ------ macOS/PostEditor/MacEditorTextView.swift | 4 +- macOS/Settings/MacUpdatesView.swift | 30 ++++--- macOS/Settings/MacUpdatesViewModel.swift | 73 ++++++++++++++++++ 30 files changed, 168 insertions(+), 132 deletions(-) delete mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/AppIconExtension@2x.png delete mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/AppIconExtension@3x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@2x-1.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@2x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@3x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-60@2x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-60@3x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-76.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-76@2x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-83.5@2x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-small.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-small@2x-1.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-small@2x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-small@3x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/ios-marketing.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon@2x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon@3x.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon~ipad.png create mode 100644 ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon~ipad@2x.png create mode 100644 macOS/Settings/MacUpdatesViewModel.swift diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/AppIconExtension@2x.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/AppIconExtension@2x.png deleted file mode 100644 index 75f20087113c3c259ac90a0f152fbec7aa7e6e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4787 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 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/Contents.json b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/Contents.json index 4dac38e..855b1ac 100644 --- a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/Contents.json +++ b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/Contents.json @@ -1,93 +1,109 @@ { "images" : [ { + "filename" : "notification-icon@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "20x20" }, { + "filename" : "notification-icon@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "20x20" }, { + "filename" : "icon-small@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "29x29" }, { + "filename" : "icon-small@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "29x29" }, { + "filename" : "icon-40@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "40x40" }, { + "filename" : "icon-40@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "40x40" }, { - "filename" : "AppIconExtension@2x.png", + "filename" : "icon-60@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "60x60" }, { - "filename" : "AppIconExtension@3x.png", + "filename" : "icon-60@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "60x60" }, { + "filename" : "notification-icon~ipad.png", "idiom" : "ipad", "scale" : "1x", "size" : "20x20" }, { + "filename" : "notification-icon~ipad@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "20x20" }, { + "filename" : "icon-small.png", "idiom" : "ipad", "scale" : "1x", "size" : "29x29" }, { + "filename" : "icon-small@2x-1.png", "idiom" : "ipad", "scale" : "2x", "size" : "29x29" }, { + "filename" : "icon-40.png", "idiom" : "ipad", "scale" : "1x", "size" : "40x40" }, { + "filename" : "icon-40@2x-1.png", "idiom" : "ipad", "scale" : "2x", "size" : "40x40" }, { + "filename" : "icon-76.png", "idiom" : "ipad", "scale" : "1x", "size" : "76x76" }, { + "filename" : "icon-76@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "76x76" }, { + "filename" : "icon-83.5@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "83.5x83.5" }, { + "filename" : "ios-marketing.png", "idiom" : "ios-marketing", "scale" : "1x", "size" : "1024x1024" diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40.png new file mode 100644 index 0000000000000000000000000000000000000000..662e8f4054d026190ad6dd029fa9972fdc3fedad GIT binary patch literal 1042 zcmV+t1nv8YP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K5d`Uz>R9Fe^mP=?;K@^6YM~%in zqebw6&_~*)O^g=Yh@faeC+6l(C*v_W}yfQq6n^vP(j+J z4V9vzHrOg{DArbz)bCvHt&`>^>D{=Rf#IAv|CuxY{4WXL53KUW(vvFpDj4l#8ZcU?5bxg!mx|l@74IO$-Z4?S)wY|?TuV#K0*}Co8x~UQI6@Bu7U@$3;J<;$Hw7;DxNKXE zf@%TD-zEWeKb=S=q>ECg%+H5lY%#6Lp?bg7TR%8n0Ep5(SOeNfwu%BR_V!05k`D zL5|_>q#w7#SH>J2G0Mp9MZFxyG^ZA8Yio;h@dNyLCnb)bRdMkl7iE4QZZGPMti6gG}WfSy>U{-_NK4LG}+)KaT-($rq*}p&em9k8n z&t3q6Zz0!=l^1xQ-p;~Du-$yl9zx_iM|}f)1~S*^v*aHF@4|l&3mKr5gX`2Pz00oGhxfp`GtL;wH) M07*qoM6N<$f?}b}AOHXW literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@2x-1.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..19926eaacd2b6ebc37eeae26565b0a3142157dc5 GIT binary patch literal 2207 zcmb7GX*|@68vc(NjIHdlr0LkVLLy=`$Taq`W|=US$+<(4B_Tuh@7H@jJn!>7@B94TukV{|V}<17mf!{efDd)U#P)=3egVpH zQvVQOzC0n&JzJy^P&FjAequ~~ZlZiGEdk{d4Fy1negNcGUR6`@&z6`3TGZJg;5f!{=n zp9K;{kx z=l&iF!jU5)!gg9)B8r}(q0lr<+)4LeD^W**HLt2#B{Z4}SIk-SUgF z>3WJ6>V86CZ3KRz%xxCIa0oZu@c9S;BW z=@Z?~-9$S1bhM53>e||lRWY^vP@(RWhmX&SdhB!>&qdqS#YkC&H7gy4*umkUQ)5HJ z*7qH(tgVAXgSedvBfS!VtZAS&G_WkiuIl#Qx$av~uX|uPH9k&z-r9PsBi34fv&qj- z4qf|pnw*nE%L5kYlgl6h?1rN1wDFH0(@@xV+37>>T3Kbhibew;q_c8=j(S!(L~#>R z5)8p}q1I&0X91bmytEf=P~ZH(T_vdinLDuRj_O=(uuN}SV!KvSJAtvD)nodYs1S0X zEHl0Mr;t@Q^uV?44%#lh$o7(pQCvNb9Fgs8|>s z9bzaKTJ7Aiu^5*AyPJ1@W~+%fr={7~!`?%Yq+RK+TU(go@@JO5>~H1FNy`fzSC`>Z z7`pVmTj6n|3iIU^$_m$Bvr!;>PY_Mz>7!Z!i8ykmk3D=oPC+0NNM>N;!qHJ)xRYKRInPT zd#%vU&CM;8d>b*9Q!#Fn{Kx^r}tR&FSjN+wW zRfU|j8{_I^@Vv^q-l$V9<5s#E2R<45-h=6E6xsd?Z=;7l#dko#o!9m+Ql+{z#p|6k z7N6CoC<(z4?$-8^{9guOlY&vVYBY|V^g6{rk8SrC(`>Z?DG#5gRtsGwt%E^FDMQ~& zxPo8jT{a^-n1`+-J{oIpa1*P|b`mDL~ z(-IU2MfClNKL8sTN`Yc!^VHC;8Pq@;vvLWxLlh~2gcmRPYE z?&!AM=5!rl(8?!b>l(aEOD>AB)&tplqAnT&MW{y1bHSs&;F+b0f5|rb-fZ5Ilas@Z zzM^i#al_30-^`L3kh#7)qp%{u?_7GG2|fyY>kt_LF_+ zioVs30|7R`YOaD4|`O6BQXJ9VC)uB;Y?(6>RBgJe{uTekzu zPTwTbDGgW%EWf#>rCn4{Qb`L~A>|2#6&BV)qSOrcn{=Qxgqh{s_<)?s@|xa-x^*x< zEwh6XsUw;?xy@y#6wwgR0c#iTY!rI?F!uH8N*1ejUo)ts7b!w;B=5;j4PLl&S(4$Z z>c5AfTe5Tlg4UTv;LMheTT-DzBoN7_-#U@WWEOw%m%B}l+93+%!y?Iu_s1Lqh*!|? zSLf#oyyOFfN2=S-H8B8TVHnwmhNxr{o{1I`_BBy^^64t*}Qt#t0g zVtnsIM09-bT*9qS!@~=QJh1qTMtN%_exyU?B_xx9btm@hPeF`jMyclwfh!l5r%9`yecI~ov*l#NCpw@|q_>Ld5*R{PI%K*X7(}MM8qChox z>~x2dZ8U*L=7@u#yQmp1q))7<=SyS|{MyE#iR#g`YlBTUK=5 z<{RIIAB+1au5a%_J0ku3{IW{BjDbs*ATG7T#~&&hRS2smx+jA+DgfJMkWkAaKn4xG}yeb2c1!I}G z@&JAKpV!xTFlh8Qbzs1dCxtl4-!{>iut_cg|Cl~ng>TenZ#5gF;9Y5(uU?1>&BzBe z)$y?9{L_jr-7*db!Wt{}&W%|Ei^z|a?1~0l_m>BD|H`C!t|_z{SWIoBk_`IVdf>E7 zG8$P!?G@v4w3-B~I=k;kjmoU7Us?)E1@lQsPRpNqO1jhHv| XYDP6lV@6=Vo&(f%E0ZcCkJx_$23hYx literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@2x.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..19926eaacd2b6ebc37eeae26565b0a3142157dc5 GIT binary patch literal 2207 zcmb7GX*|@68vc(NjIHdlr0LkVLLy=`$Taq`W|=US$+<(4B_Tuh@7H@jJn!>7@B94TukV{|V}<17mf!{efDd)U#P)=3egVpH zQvVQOzC0n&JzJy^P&FjAequ~~ZlZiGEdk{d4Fy1negNcGUR6`@&z6`3TGZJg;5f!{=n zp9K;{kx z=l&iF!jU5)!gg9)B8r}(q0lr<+)4LeD^W**HLt2#B{Z4}SIk-SUgF z>3WJ6>V86CZ3KRz%xxCIa0oZu@c9S;BW z=@Z?~-9$S1bhM53>e||lRWY^vP@(RWhmX&SdhB!>&qdqS#YkC&H7gy4*umkUQ)5HJ z*7qH(tgVAXgSedvBfS!VtZAS&G_WkiuIl#Qx$av~uX|uPH9k&z-r9PsBi34fv&qj- z4qf|pnw*nE%L5kYlgl6h?1rN1wDFH0(@@xV+37>>T3Kbhibew;q_c8=j(S!(L~#>R z5)8p}q1I&0X91bmytEf=P~ZH(T_vdinLDuRj_O=(uuN}SV!KvSJAtvD)nodYs1S0X zEHl0Mr;t@Q^uV?44%#lh$o7(pQCvNb9Fgs8|>s z9bzaKTJ7Aiu^5*AyPJ1@W~+%fr={7~!`?%Yq+RK+TU(go@@JO5>~H1FNy`fzSC`>Z z7`pVmTj6n|3iIU^$_m$Bvr!;>PY_Mz>7!Z!i8ykmk3D=oPC+0NNM>N;!qHJ)xRYKRInPT zd#%vU&CM;8d>b*9Q!#Fn{Kx^r}tR&FSjN+wW zRfU|j8{_I^@Vv^q-l$V9<5s#E2R<45-h=6E6xsd?Z=;7l#dko#o!9m+Ql+{z#p|6k z7N6CoC<(z4?$-8^{9guOlY&vVYBY|V^g6{rk8SrC(`>Z?DG#5gRtsGwt%E^FDMQ~& zxPo8jT{a^-n1`+-J{oIpa1*P|b`mDL~ z(-IU2MfClNKL8sTN`Yc!^VHC;8Pq@;vvLWxLlh~2gcmRPYE z?&!AM=5!rl(8?!b>l(aEOD>AB)&tplqAnT&MW{y1bHSs&;F+b0f5|rb-fZ5Ilas@Z zzM^i#al_30-^`L3kh#7)qp%{u?_7GG2|fyY>kt_LF_+ zioVs30|7R`YOaD4|`O6BQXJ9VC)uB;Y?(6>RBgJe{uTekzu zPTwTbDGgW%EWf#>rCn4{Qb`L~A>|2#6&BV)qSOrcn{=Qxgqh{s_<)?s@|xa-x^*x< zEwh6XsUw;?xy@y#6wwgR0c#iTY!rI?F!uH8N*1ejUo)ts7b!w;B=5;j4PLl&S(4$Z z>c5AfTe5Tlg4UTv;LMheTT-DzBoN7_-#U@WWEOw%m%B}l+93+%!y?Iu_s1Lqh*!|? zSLf#oyyOFfN2=S-H8B8TVHnwmhNxr{o{1I`_BBy^^64t*}Qt#t0g zVtnsIM09-bT*9qS!@~=QJh1qTMtN%_exyU?B_xx9btm@hPeF`jMyclwfh!l5r%9`yecI~ov*l#NCpw@|q_>Ld5*R{PI%K*X7(}MM8qChox z>~x2dZ8U*L=7@u#yQmp1q))7<=SyS|{MyE#iR#g`YlBTUK=5 z<{RIIAB+1au5a%_J0ku3{IW{BjDbs*ATG7T#~&&hRS2smx+jA+DgfJMkWkAaKn4xG}yeb2c1!I}G z@&JAKpV!xTFlh8Qbzs1dCxtl4-!{>iut_cg|Cl~ng>TenZ#5gF;9Y5(uU?1>&BzBe z)$y?9{L_jr-7*db!Wt{}&W%|Ei^z|a?1~0l_m>BD|H`C!t|_z{SWIoBk_`IVdf>E7 zG8$P!?G@v4w3-B~I=k;kjmoU7Us?)E1@lQsPRpNqO1jhHv| XYDP6lV@6=Vo&(f%E0ZcCkJx_$23hYx literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@3x.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fddce80118436613e89dacc4e0e62bdcb452d975 GIT binary patch literal 3646 zcmc&%XIm56(hUY8B{b>1h8mhdihv4IB?M6EU6KGw%z;P`QV+->h#cunAb=oBC`t#T zbPytN04YkZ(g{riT+WyG{Rj8X^Q>93XRq1w%(p!WRtOVTWE7cnD%F5U+~|F7f%f)@Y)fCY2_;04qD zn=82Vf49K}!2gf`6*A7-Y+W=hGc(k`A56EI8$qz?a91j{jGTR{m44NSE~$zK++8fOyapT+99vo$8W97ohU)sxJw9k3^+F?tW}Jvy0F zm_o_-S61C@?pNM;d~@aS2kNjbY`g7fD;$e`3F~di(uUy%bGNgybYMYS{k_(&8Rahh z6)9Qpzaa8C~qi1k%Fz?*8V;NduOG``rb5Xs}{9xbj8xytt zGVshDh+r^mlhivfuqo~!l@+}c`-D=L1bob0beK$?;}HT!6OYN~%dHk$iTH)r@tG}2pqV;}bZ9hFz$BvAK$WJ?{u zq2#@a$1e?rt1OG{3$O=dWbP_6YEDd%r_F`KNnLYY1o2>J1qKmBH5w0obO6ciNJ z3%(DJkz?1I_pof9os$_*X+kF;47LJvl1_IrUmhKT^1R-$V(7 zFUd6~r4ySO$V6Q`&H0Uj(e#(IYX6ONO zBA-g7Va#?x71Y;p$1>DMT}vyN0RSq_onm4Ikb*`=%-SoI3S4jgp3INLD<+;|ST-9o zV!zz^y?c3Q${}y2lbL3S!{NjfSFln)Sx0(0%;ooO`q0xTj8QiX1G!_tm1GsnH&VTU z<(lqD;KEH!P2oB-UD=w1qhkYim>j>ds!ma5q&jZIo)o${Oz>9!iXh02Yh^SV{<*qr!Gg6m0kkWbjFc92L(EgD~##sef0as^unGchwi<<@xEz~K9Z z!PR#87R~%GGVY{r;{Yd{tgNi3<*GszP>~}j%CV#B`RzftY<{__Vj|QwC*n5UZc&~} zRo&nB==4i{bh0>}$XE@Fs~RK%k-6qEDEGAXc=n^3Z&%uCbE8*7Vz?;xGt)SI)qjjX zLE&ZnK5dXW&@|QzZoSNVkL&Um>)e#R31+HCtflNMDf7fskaoJU7{;Njy zxZ%;f7g>@~iaMP;=Jv=0@U$#^CIz~vn{9&{{@T6YFb3t)5LE>3Z*YAL$KG|1)Hr-y zs8Z#32Qq^DU}s`*=1>=K&cyPzxlK=}QD^ky^imO`yN@gvq-RWZ=KDr855>>#AUJuz zIxz}kz1a>n$XTJnKhr(-(i*-XcJeo#D4>~A0w!IQ*Ppxvf8jM{)5ZtT=bDzPFGAhx zcDSVN;;+u3zn=NWtAz&svHjCiHm_XO7KHY@CsZs4$YbiW)L>uuF>k|rwpTP)Z0Bk( z2y%&bX2Gs?^gPrGSif)VmTQ{hiE<}@_`w$zB|i&l@c7N8}DYS5H3rM29}Co&9S?d$f~WU%bCY$skuUnsG#phEYq3~GF6s5}*Gxzp2KGItg-qc=Z7u~SvVYEDEPImh_ zJ&}HTRAA0N*XgpvAq2Fuwe3qhW5x+KPr?<)x{MmENX$!8YFgo+%;Q+`M04~i(#0ju z`K1f0Px|!tSHer=MG-8NR5Gylb`SSX_?GiwKRj;G{7457)WlThkZjF+@(Jj4wb40< z*prGd{MO+)ODdg)cX@ic*O}IsP}QpdF^Tgp7U*&^#7Zrm3iu4~uQklz)+cM+=G8bJ z%J?5cxVpN?>VXe9j;S;&C+V%Mak3{QGHhN_3e30Gmdf*6Z&f;DMk%Xj3z;7Lqn1uU z@R5_)XE;$v*+&&3wrtzDkDs(1dp8~#siY`L+4 zt_G;|wcB@T8TFCL%dcCFYCgXC=AJD5F@vZ5NzD!RA)gffcQYMj^#a7BOYgmgAMh64 z^#y+s4XT;pRuWIqT)%No;W}>lx2pU2XOkNO;X~$Z@1JhTo75ORpbnOXTWWWu4JA$u z4k63B;R@GvP#5C^4qFvitZpB_ccrR0zW2V~B394yG;b$0BWiAjazlsu$RI0Qp!}m@ zT!5z`GUY6Cuy%w_FUP|d3})1K5?A}faTXRDaj9o?hwlj2vO)x$o$yOgAzGy&Ck>~M zkF^6gWY1hG2TDhu#+x-=R1qW`S*@;6B`A(>rIGX;$4In@J1Iqy|3oEM^fc!E3Y@Mr z^=cGLE5O>8w_=%fCnOhvEJ^79yuQXIi)ew_eupo0cabAGgKx^)0QWt{-|=sF0c4Lz zp$X?bpdoAuB%*gV2xWEm_ z+^#UZCz0Se4S`O&7P@M?8V|vIE!ifPvW2BG59Bh;h1TJYHGalhGQnF#E!R4yy7U+~ z=X}pAo;MFvtEsZ&!qm42{2iOIabh8_)(165p#EDO4J3owwije??5D71>*d>#mci_b z#@(bM=LbMSA3Bv`nw#+Z3T6rvzKFVnUk~BEN&ZK;v!C-GvTyere?xV(wedEc3UF$c z1pHF|R1lG)@h%pB;w0lBKYmAh-U872V;N(!By9iKSG{TJ8Fkl<}2*&Mbu96bb_}00|E}feb6AV=i=?b)_7Xwn>TM3 z_>`UbLtOi3G}F@3!UY|M+eG+rK#!94+XQnO#tBXQgmWgES(;3Emk_|l)2`&EQM$oY z#kd&ddgbQ}m-+Qe7H3SSo4&{d6oV0ju$yjU+nPUh{7!(}$QBdF>lV>mqW@sU-^!+v zOBl75Pe*!<3Qy?p3S8ZH%nC9KD1sh*!@(>4(M6^+=vyYfF&|Cv0D@ zWLVSpm?TuTH~6pgj!UeV9s8EFcnO%q#XbkiK2dn4>upi2xu2}BqC?gCvpTzofxmQS z1U|aQli!kH_6B%ItwlJlg$%Arx26u+i;s_uZLMremUydk*DKG0k;ATQj~5bdeQee%TwCky>*;1Epbsip6MAI z8&mpcf{~PRp8KSqGhed5G{W%sGJz)PM2fq=m}D~XP0*e^n*}{j_yD@KWZNP9`Hn%O zoE&ilD!$!Gj(9-73E9*e|648nrPoywvsmo83;$hL?w)zGGse;!D`cL`*^OOIfrHD( z_|iwve81l04^b8`7H`;ugoGGHL_|nTy1h8mhdihv4IB?M6EU6KGw%z;P`QV+->h#cunAb=oBC`t#T zbPytN04YkZ(g{riT+WyG{Rj8X^Q>93XRq1w%(p!WRtOVTWE7cnD%F5U+~|F7f%f)@Y)fCY2_;04qD zn=82Vf49K}!2gf`6*A7-Y+W=hGc(k`A56EI8$qz?a91j{jGTR{m44NSE~$zK++8fOyapT+99vo$8W97ohU)sxJw9k3^+F?tW}Jvy0F zm_o_-S61C@?pNM;d~@aS2kNjbY`g7fD;$e`3F~di(uUy%bGNgybYMYS{k_(&8Rahh z6)9Qpzaa8C~qi1k%Fz?*8V;NduOG``rb5Xs}{9xbj8xytt zGVshDh+r^mlhivfuqo~!l@+}c`-D=L1bob0beK$?;}HT!6OYN~%dHk$iTH)r@tG}2pqV;}bZ9hFz$BvAK$WJ?{u zq2#@a$1e?rt1OG{3$O=dWbP_6YEDd%r_F`KNnLYY1o2>J1qKmBH5w0obO6ciNJ z3%(DJkz?1I_pof9os$_*X+kF;47LJvl1_IrUmhKT^1R-$V(7 zFUd6~r4ySO$V6Q`&H0Uj(e#(IYX6ONO zBA-g7Va#?x71Y;p$1>DMT}vyN0RSq_onm4Ikb*`=%-SoI3S4jgp3INLD<+;|ST-9o zV!zz^y?c3Q${}y2lbL3S!{NjfSFln)Sx0(0%;ooO`q0xTj8QiX1G!_tm1GsnH&VTU z<(lqD;KEH!P2oB-UD=w1qhkYim>j>ds!ma5q&jZIo)o${Oz>9!iXh02Yh^SV{<*qr!Gg6m0kkWbjFc92L(EgD~##sef0as^unGchwi<<@xEz~K9Z z!PR#87R~%GGVY{r;{Yd{tgNi3<*GszP>~}j%CV#B`RzftY<{__Vj|QwC*n5UZc&~} zRo&nB==4i{bh0>}$XE@Fs~RK%k-6qEDEGAXc=n^3Z&%uCbE8*7Vz?;xGt)SI)qjjX zLE&ZnK5dXW&@|QzZoSNVkL&Um>)e#R31+HCtflNMDf7fskaoJU7{;Njy zxZ%;f7g>@~iaMP;=Jv=0@U$#^CIz~vn{9&{{@T6YFb3t)5LE>3Z*YAL$KG|1)Hr-y zs8Z#32Qq^DU}s`*=1>=K&cyPzxlK=}QD^ky^imO`yN@gvq-RWZ=KDr855>>#AUJuz zIxz}kz1a>n$XTJnKhr(-(i*-XcJeo#D4>~A0w!IQ*Ppxvf8jM{)5ZtT=bDzPFGAhx zcDSVN;;+u3zn=NWtAz&svHjCiHm_XO7KHY@CsZs4$YbiW)L>uuF>k|rwpTP)Z0Bk( z2y%&bX2Gs?^gPrGSif)VmTQ{hiE<}@_`w$zB|i&l@c7N8}DYS5H3rM29}Co&9S?d$f~WU%bCY$skuUnsG#phEYq3~GF6s5}*Gxzp2KGItg-qc=Z7u~SvVYEDEPImh_ zJ&}HTRAA0N*XgpvAq2Fuwe3qhW5x+KPr?<)x{MmENX$!8YFgo+%;Q+`M04~i(#0ju z`K1f0Px|!tSHer=MG-8NR5Gylb`SSX_?GiwKRj;G{7457)WlThkZjF+@(Jj4wb40< z*prGd{MO+)ODdg)cX@ic*O}IsP}QpdF^Tgp7U*&^#7Zrm3iu4~uQklz)+cM+=G8bJ z%J?5cxVpN?>VXe9j;S;&C+V%Mak3{QGHhN_3e30Gmdf*6Z&f;DMk%Xj3z;7Lqn1uU z@R5_)XE;$v*+&&3wrtzDkDs(1dp8~#siY`L+4 zt_G;|wcB@T8TFCL%dcCFYCgXC=AJD5F@vZ5NzD!RA)gffcQYMj^#a7BOYgmgAMh64 z^#y+s4XT;pRuWIqT)%No;W}>lx2pU2XOkNO;X~$Z@1JhTo75ORpbnOXTWWWu4JA$u z4k63B;R@GvP#5C^4qFvitZpB_ccrR0zW2V~B394yG;b$0BWiAjazlsu$RI0Qp!}m@ zT!5z`GUY6Cuy%w_FUP|d3})1K5?A}faTXRDaj9o?hwlj2vO)x$o$yOgAzGy&Ck>~M zkF^6gWY1hG2TDhu#+x-=R1qW`S*@;6B`A(>rIGX;$4In@J1Iqy|3oEM^fc!E3Y@Mr z^=cGLE5O>8w_=%fCnOhvEJ^79yuQXIi)ew_eupo0cabAGgKx^)0QWt{-|=sF0c4Lz zp$X?bpdoAuB%*gV2xWEm_ z+^#UZCz0Se4S`O&7P@M?8V|vIE!ifPvW2BG59Bh;h1TJYHGalhGQnF#E!R4yy7U+~ z=X}pAo;MFvtEsZ&!qm42{2iOIabh8_)(165p#EDO4J3owwije??5D71>*d>#mci_b z#@(bM=LbMSA3Bv`nw#+Z3T6rvzKFVnUk~BEN&ZK;v!C-GvTyere?xV(wedEc3UF$c z1pHF|R1lG)@h%pB;w0lBKYmAh-U872V;N(!By9iKSG{TJ8Fkl<}2*&Mbu96bb_}00|E}feb6AV=i=?b)_7Xwn>TM3 z_>`UbLtOi3G}F@3!UY|M+eG+rK#!94+XQnO#tBXQgmWgES(;3Emk_|l)2`&EQM$oY z#kd&ddgbQ}m-+Qe7H3SSo4&{d6oV0ju$yjU+nPUh{7!(}$QBdF>lV>mqW@sU-^!+v zOBl75Pe*!<3Qy?p3S8ZH%nC9KD1sh*!@(>4(M6^+=vyYfF&|Cv0D@ zWLVSpm?TuTH~6pgj!UeV9s8EFcnO%q#XbkiK2dn4>upi2xu2}BqC?gCvpTzofxmQS z1U|aQli!kH_6B%ItwlJlg$%Arx26u+i;s_uZLMremUydk*DKG0k;ATQj~5bdeQee%TwCky>*;1Epbsip6MAI z8&mpcf{~PRp8KSqGhed5G{W%sGJz)PM2fq=m}D~XP0*e^n*}{j_yD@KWZNP9`Hn%O zoE&ilD!$!Gj(9-73E9*e|648nrPoywvsmo83;$hL?w)zGGse;!D`cL`*^OOIfrHD( z_|iwve81l04^b8`7H`;ugoGGHL_|nTytUUXrISN=m3%5U-m9!r2iITZP^<@t3Q}L410u8d&WlXZJQ(xZXrM;IeqhB=o zp;gSs%ho;ZEzTA-vPqP!tqM_J50p8C;&CQ9EI}*FZt!%R( zbEV_Oo~z4K^f)x=Y!+zigcIFj6)}^*FSYo}_pCp?ueZKtiSo3=@mBIjbu29{U2jS| zj{#sG_vYp~SqyrpgU0d|(<|cIzGu)GQ@%E*`<6y^whkQ~&u8=FxIL`J<&NgbA3h~1 zy@;%hF<#mi*`%Kor=fiUxm$~VFDkkqC0aB7tg-T~w)TMa?=woirYpVckCL1tG`9v> zUd9Lbq{o;T*1vb&Kuf=IJLI~t{05p>i88Hj9N1lk_MU7uU(C|LuTMs_xfOjJsO9uh zVDr8GZ=F{szCK5LE;S!ts9|zcAveGw^gUtW8h|QfGqTt}?ZBYM>Gls!zB|a9|GxQH zf8go%@~e?{svY0(Lo4&F?7jhO&4mHQC)*1K7M}YH4JsM4o^s71NMyH^ColHb4!*R_ zo;T#NFPTu+`QYXz@slwe}8K`WJ)&}bTOdFkb6ZcS3-MU_|E*3T&yt`J@L z_h7*~TY9OmHuJe!ciBJNha2tfrlqJ?zI+XBNGGsDveQPMLVD}2!2NU?=GD^e&r z@l+`JS#4?dcXDpDDvXqlYy*8%N6r{+8ijvQj})$u38pfeQ@Od=bpBpZWD(t`cmkV@ zQUo9WU`gJWBU;BWY8{TSfx}`p-_tRD7jja@W?DA72Ue7qqvz?dw(GWy37g;`d0^K} zjZ-N3W^-zwx~;RfvvVN8N(A2{cJeTq~; z%t4%g40uPSZ#Uf?j$LrGY;9|U3XCTGK9ilh9b4e`Sk>y(b;;$S*d|A-@`ohFcGya| zR=4?|ZS*C)2F*gfV+-E!JXSzXi&Np(0_%C_iE7vA5H?xku<3cLb6t95ovy6tn=bhe zO}SKlN`xA|73u^7!G)Vm8F}ezlMxU zvNJyl!DAAtZRqyyCkcJYPQ{3WL zk?Q%9Z*2N++r8!$FwfWg8jI|=Vh}AA%=_kf%;Qb5vPm7lK&jrdw`apu#SBMM7IEE2 zS>zwyPCd!^Eh$SVy63K3KtOrozEh#>hpA29E&mmH#F49WVSAsZ@;uCx)WZ)oGZ0a7 z1|aVh!sAKy;>lJg9W(nnw??vgJ_2HXXh*I>qU$G~KXDJ5rLL0b(KF@C{`v5qrQx5n zIUOR(11UVWaGm7L^KF`oMXPC}80)!$*~2ehEE{K4RxLk0f%pErlhz#q^Vz#Qp;|sAev-6*UwYZKON(twB`Sb7dP%ZLOcgUGcNv>Fz&o!{MpoZn z5#yvxo_<2Z7JL6Xki00Z>Z7H?p z_nOCzKM) zN>r<1>GbrlEwg#C0b2PbZxZEuT~o(9e>g?QBMR3oC?9cUJ#c+X>UY*rO8@qeTtP`R zfS#p%4zx6$lh!kX`H=a&A*t^YZ8{O>q;(wL@4=s6JM!LYs&^eBStmbcJyjsEGH%T` z_rzekQ!CR_eY(}!MHHIAZzIm9TMZqqPzQy*%J6s;kQLc(VVYeYW!&hfDAE)`*1F8x zs^mtQ(xO!(!|gcw0kPSYBWa&smaDX#t-vu(QuUU?ja{m|2*I9_6Oc>trrSkRx<$_@ zp6wWMNZVhP-cDnbW~h;p_OSNz-?lwGL*L!yj3WN=6Uf}^8mob+$@3Q@O?v4ug&>(1 zBL^!7#-&^EaI}^6qqYlNzS9cEJnNy1DpP!u~x(vifY2D^Ql5nc2`~grk ztm8B1t^ye+Bj-_DRBEmeg~M39>^(vIM5KS(3+rSO5pph;iE152CRP1)ky1zMwkWo| z(73s}no|YD{d$0Og|int9r*i?r>&&K;+P{f?Gd}5x7a<&Mck+FlpKrOeJIBW5DK#U zZ}uFXmg52;?ks+@c*z^|{&~Tc`(t#rt~xP}i0MZHf1!$v!Tvg_hBd}z(GO>qJR&(G zk-TdUny^t`f7e(jAwMW9Ba!p*fMj1EV<=^KPLdvtCI2;J2f<=c_6)JFsr4_Rv)wTQ zfl`HD)=emN^x&X9(W7}Y2sW&P)kL+tuHnt}bQ0n7~7F~^~?`Hv_GteCOU%#4?6s& z*p$6iZ%p_bQ1N|R10Hno2@@{s|1>tGYPT)ulkT6|T>9vn=(L{)R(m;c&k_Bc34ZA= z;rQ?u(yPWZN~-+XUi&i^)?O99B0T=D&$4ytu;O9}YH*XCR~-$BL~q z>v*^W-f4ic8M4^j+xY{C7M_hvZ%sM;68DcF^Ba0y{dj_6=d9xBee@){ejSR0`?)To#_Ij3I$7?=?;60<)&>RR^;rtbs|0uw zPR)oH6v$uJn(TeFHA#xRDlG26EM6x;Xkg0JH!W>XqAq2CwWjJHNZ+pjx9H+od8b}5 zqa8So{{%gcbMfk30WG~dM~!rz7063_T?>U4vM&u$0^WH06~fZWxmEspeH<3!{wTMvS`P(12m<<&LgCoD;3m za{bPTm!V-^m)g9^HCHe0%A;3V)I}T@8wfwHqiB<6$PiX1<~s14|L6wxw!VH~rSIi^ z5i!k@v8e><5!(}*3i4rpQ{2(2b&2H>#z$bBK35`2IOW_c7USo}i{lEcD8G!Ol3rA7 zMzWY3T{y@B#o>{D*pdj;SI}kcu9~E%FFR$RM{CzU!R}}Lqo!0C^ymAG>RPvszYrFSe+~6w zx>@Gx>9`4-o4<<@OWMncUMQ+mz|&~I|Ht8~7eho+cweDAG9##9LP`AFQdL&CbH=q)}Hm#UHZG=+6souEW`rfQtUg`o~OWs5(9f zCjNx~9%}H5#&Y;MPgIC%9-iCRK6aVH&ztMqyj=@?H$9zBzcGWsW{0Ud!mwtD^Wimo zL*yrX*#f{s=1Dwaku`V_+vkXM7dkfa#ho9*^Oz2Qyjw-Va5gvdWi@nxX%T~&#SFw} zjKOcu*$WT?I%51{FzmK`o5Zj{32l-OqWIgJiwQ<|Y_i1UoS_iIftwXuIZ?59rd zqDAsY;|ttIS~*3`5xrj^UNojZZe!qreo9 z@<8cQF#boHt^39qP3KCKN{Wf;5H8}vay3x!Rv>Q(ShaCa4jAENat$K+EwZDaK-rVm z93DiFis+5e01|^RyZih2FK*AW?x9y-wm#Bj9`_`&w6M5gT^EB@zN|a#ZU1!1W%~r{ zRl09Q$#H~L>o%Ww^X`_Tx_CPv?nI~8YUjO~oV(@THQQp7m!V7^U22l->cx2<<)O*{vGc>+tv$Ps&I|$W2JzgfDcy zdqG}U4{BElEdd$zq9({R_wv&_ZF`bHT^(J;`Q{pDJNAsl5 z3Ht@ei-gsufeos=OIt()ld>?x$9PVbfnL4lWh<1PD!g(sN$p0!`?ce#G{!i%;?y9H zQpm6{pNYejfN-h8KohaL6`!rp*7!&s?nY?_{=b|Wx(*9 zZ*uhFL4+QHA0Wv}qJMclG1Xy`UsYW_+KI0d8k5s>KDgSb&vZX!J^~IMnrG3GSUQcc z1-sXy?U6W5!7T^DYRggQJ_~Z?imt7=JzQs3cUn$u#miuq+8pI8P20mJ#W6i|d<>ShO9o32@5}z82#a#QR#D!poLYvY1RCM#@84<6v=K106SIz@MTxHk+HVjgpLW zbZNbgr64=KmL&RF|FNnOBeIw~(Cw?fk+?}<-L!ah#O~%oxt(fZ>48h8_}=brAjff7 z7T_vA7teNNs~#q3*C_SaEh&=|J!sE3!dA7)$<}10Aan*jb;5ECx22rC>P>{$j^qnT zawaS_O!yha9oW+Mp2aQt@ju86{_+Z*WO_DP5eJA1AQ$Qy?Y*SX)vc4z=WX`5=qL(t zFDv?>)wJwb093ct?^Dr_?zaiAiir15KI13AvF=&ddq&Fw-oLC`t_pthJ}zr8-oVBHwDq0~H(%1Q9C} zau3A?ukA+4^FNQS8ZdVI!LA8~R$$xN@^`huYn@2fe~Z2n>2h;Ny)B;STln{aB%vXh zwV{tm-8?k_G-lUGgGS^^Gl4t1%BCmsQFiwjxa}AF>roK>)Z@*HJ`z1cC(77k)acP~1Ddl*g}|Smk(>}! zJLKt(V1%9p9IbIyS64ghK=jR4!j`%gqLjJelvVo+2Kl?|y%MP;SiVQ)N>zQV{4^M{YWMH72QVFhxE(SSU~E#Inv*Y+r*h-O86sPInl1Z}6G78TYoWfZfQZ5JpuGxYH(9 z!f$*jXNR;@pNI|unT>SL`iUz8zYrkrv3!okB?nkzAavn?L^Yeg_{x^;r*@%u!&;GK z*y!-tKCEHB_0SHd=#Iz!9!hup3`BRjfw+cS^pw*7(N@ z#>~bI^XN%VXZI=`)RBz_J(F4bka(a&4*bLf$XA?MS@E>yRb-$i{9jKm6S{7RbKn)- UP;1QR|9+cwUKnWBXuON~9|!3Z^8f$< literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-76.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..795b55cdab1552445b04848e901ef0148c7300bb GIT binary patch literal 2146 zcma)7X*}DB7X2r5NUSw25mHJUwU!hk_FWNCvC~q!GIpIZN}_|-GFn?vOG8anM1?4& z8Y!BTXIEROT4IaZ4MtU;etGZf+~4oqbI!f@^F688uoePPI1~T?0n4kVxD&?w0PjyH zotbZ^ctW5koP{y)vQKj5#F+ZISo+)80179X7XaPA1#tg3IRX3x0Ki2A0bC~x`Y|Jd z|F^{ux&E(z9EvtGX8?ew$I{fuAqKQoh!1pfgfaJrL$c%CRm_?KGn;#x1s0c?R=3K= zg&;CY%RF{CVJ|o75rgCN$?~RI{#S!OdS1M6TE?N%<#<@c|F{@VO;Nd_RXH3|`*o{D zzyI&)H#^h&>$H8^M%?*jNv#d^61snqg>9mR1z92Svj4Sme!t~o$ZQ7qdQ7UN@V+vqbJ3A$So}` zsLPi(Z1~;v(dbyY1!0C%Iqg+-_3FO#Ph(?aP1CKhR7{>1IDxaiPOBKIm>wF!scUH+ zsEh=_s?~LLzQX_Rb5UyC=_$Mt(w>u=Yex?X4t56j<+Ee8o+Qt@!a{vHTmw#}`tdEp zwX^A>%B-TIB1HfuQ_hF51t0BW5u2fj`-uDqIbw+Klrpx^frYN(ZSDe`_zdII?ZKl@ zwPNig&jh@OaPB;6k||n68VJ-dvzrJ+xhNrDq_(H3-k~0mvMXH|l4!KKKfKZIG*e+FlLebMMeIhf=20|) zMRRjqUES2XpI;ZArUT2jBN1D3df=l`Ofb$KXLNeHiZl>8 zQopm@BU_Bv!@OKe)!!PP8387v(?idx&VcH`id4-Nc zw;L-~bk&zV(L)p?PG>e>7k~Ys1RU<`=-?6}KR8j-_-#~t^0k#T z{tx@@%WaXNcgsL2Sqpt2wSzFZkQPnFhBO-b15625uZ;s?LfdT0xr=^(Q1kuMS^pT) z5v9FP(WYO4@QJTYuS`o%S50kJBHS9i5hcPS(eoQm*sX}C!JhpQS{>Ks;osOH*Hs&$$yHHm;BG4Pb><1NiOq4_`&2w zOYfd05Dkdm#_l!CQTzL@0TSZkUGK+V-;pzX(;eqJBosEinE&pp@V2a=6u3rkmu%P{ zWY1J-j8c#zcW~=dMJ|a;Z~iid@sCDgCs{8%7pUf?f4hrn!6qEsMsBqwib z)@tS-?n2$&-AF{%cM(*!F(?CeremO>qrIX!yFFjH$|LiATwR8tf0U$Svev{COmi(*wwxG zx$L3%zUxY73Ziv*?Y0jlPZWA{yPPl>Q3+o|?d)PGXXPZqL!}Uro^D~sJ|R4@filz! zM%T_eI60XE@j^MTut+Ff$n@Eu0My!?R0gE@&3WC2sdPohoDW-l2v4eddVRXLw4+OE zB8~5$Z?Y#%OZroTj*@1U#TW|w&%CIOd=zj5S$Aop@1R^g9Puy&BA!-Rxs=kLpG8{I zv<%=bcE7iU&cyh^craCiF%{+BNlfhiyZkG0T(f4)tPj@S^k}9oJ)4Si9Y%j-SSn)n`S* ztMo{Ypm*lz=g;_thK6Y22~l6DGFrYyn;g(J30l>lYX_#KIE`bIG{I@9_SO;0Y9zic z)br~y_(gTy<@wOZW*H>p^BUvl5WVfRxI!F3yECdctkv)!Vb9!L?q5gaF%Rz%Uq_Iw V{^c~t#!0*bmS$Mfm&P~m{TH^q-=qKl literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-76@2x.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f64902d8b1f9f30181c5c588e6bf33c4366c1aec GIT binary patch literal 4700 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 NW29#auhwym`yUO_R9651 literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-83.5@2x.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/icon-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c07d304bd49a11bc64d878320b10c904862de50e GIT binary patch literal 5291 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 literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/ios-marketing.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/ios-marketing.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe9d5dce7305b49a41fabe7ed78eaf8db36808c GIT binary patch literal 30594 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 literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon@2x.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..662e8f4054d026190ad6dd029fa9972fdc3fedad GIT binary patch literal 1042 zcmV+t1nv8YP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K5d`Uz>R9Fe^mP=?;K@^6YM~%in zqebw6&_~*)O^g=Yh@faeC+6l(C*v_W}yfQq6n^vP(j+J z4V9vzHrOg{DArbz)bCvHt&`>^>D{=Rf#IAv|CuxY{4WXL53KUW(vvFpDj4l#8ZcU?5bxg!mx|l@74IO$-Z4?S)wY|?TuV#K0*}Co8x~UQI6@Bu7U@$3;J<;$Hw7;DxNKXE zf@%TD-zEWeKb=S=q>ECg%+H5lY%#6Lp?bg7TR%8n0Ep5(SOeNfwu%BR_V!05k`D zL5|_>q#w7#SH>J2G0Mp9MZFxyG^ZA8Yio;h@dNyLCnb)bRdMkl7iE4QZZGPMti6gG}WfSy>U{-_NK4LG}+)KaT-($rq*}p&em9k8n z&t3q6Zz0!=l^1xQ-p;~Du-$yl9zx_iM|}f)1~S*^v*aHF@4|l&3mKr5gX`2Pz00oGhxfp`GtL;wH) M07*qoM6N<$f?}b}AOHXW literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon@3x.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6855f65dd64ea1c0ddddb238f8f3bb11da64c2b4 GIT binary patch literal 1604 zcmaJ>Yd8}M7@kb#Qdtt^9$`%pl^V%q%COO7OFCwZ+(J=u59_$q)I+m9-B1geC5x0I z!kXMVY0+9!7|Rf?4Rbm3=bS(1Iq&zp-}`=-=ll8P`Jj$%P~ENy001^1+~H`sI;;`2 zUY=n~L+9n95RX3Q0$}v&3FQSm^duq-i3IGDdk{b&CjtOmTak0SoB)7gsRBSzt_o|t z(sln#9ZD7d^=pd-eBo&TK#75XJD&(wnxX`RpLWw>F>i?k97-fMplrYoUH2SahHPf1!Q4VXN&dB<@rK`<{Y|k`2>T)n!_y4gv3nFIyY`K3wL~$e< zbj1Z5@?>zdzu(6!_gu~1wyS*Ps~fZ0oh(*H0DBO+mghxq1O;<=zrw7eZ~Z%Zqy zBldQ7c5b}i!s+Q4V4}|EC}45lc;EYUIUH+X{v(DR5{t%2aS0@w>LnN!iA08~Sdw~) zBIgNwdE?vkYbLTd_uJr#sPNdDs;Y%b8jXfwX@6o4iRywNh4`X5xT~uxlN7RK4zcg| zvu&VYvS+Fp41=I0ZUUX3+(C?g{>9iV;@I@oJXe?I{EJ$3=9}}r%#5|m!5{2X1s8aw zM??r88tuivJFlOkU2d{CnN@pj7AM)x@4eSLkii*3EEEl_Ne%@wEA zHWV5zT0v~n>gZSLkp;xKBhYVZ(P}}3{po3a`s3=BkHU-7NKW142#w75rBpxNtIf$8+qZmNc9w7n01 zN{!}0wl&mUpvKSTPttV;M}u=I;u|iURL%7*fdb>oGcN^kbxJOjP3zgk%VXKD+Lt~} z*>WO+^}f182&$x0-!e6KL9Qa9N4p6)<9Q(n* zKv&nkMw}jMM5IR7kats4THh%&lSe@*KA-?^bjwZ%t%z{9g8tmGb$U|g14|{pwwc=% z_MM8?`-&is!m4aUdDx9iW^DP)#se?iFzpo{IFdTi8i=hz)X>@XqWSibS(vp9BJo#M z!6gO=lCquH=As;Wt{O?R*k`?qj(I{`l3sk8;pF7xz0L|V&?;d!(jUCD&o}01S~s&u z)XU*;(tWZ@st;+jU5&{QyPD>N*zuAFL|>9exl*L{j7cB#aJ$K)Y15j?iIhPbaasg{ z0AE?CoKPWJZ-Z5bu@`B)X@(w-Rcr2BHGmf{@}!PepycSdO`5O!AUy#Okl`D^xV6sec z3`m-ZH0rqL_Tx>lb8fmfcLnyuo)@Y0e2+vdF1~Q6Fy2urk*q{9n?5#f%kTpJcdTfG Y=aqFiPIPILIdScSBivAMhD%V^-<5;u@&Et; literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon~ipad.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..8b506c9e36377fe3d60b375f434cf581875b01ea GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~m(&Q)G+$o^ zEg+kNfw4W4fd!-lh^2s-fq{7eBLg##W(0{XV1mnvEMP{kK?*nB{qPs4tjyEJF~maf zZO~q?!vP|B|2hIsPDr|>^!MVyC2Dz>*b52^gzp?Vc=5Tw5m)wu=^q4_EPfGZ)UriV zW=%p5FYERelREQ)1zQ-yC&pRKng4#y`+3Fh)`m=b{y*PAL;9l0*|k-B?}dhziX1OI zR+Mu)FKgB|Gr9i#iRGoS_j?w-sNFYjK7WbTT(R??pI?6YC2rCZ?n9q#_B;KNvSWWE z_9-Fqn&QJH;v9h)jW75(<&GCxPvMyBP^7j=N51h7PmxWt_%o)3?|<7~FSU2P<8X{! z^g#SkR^?~kfB*HIwQPMyVawz=1(pfhZ@(3N!Fxhl)oHuIvk5hUBBeKkKY30U3}bN& zn7DzjX_4~r!iep=UuZ0FN??ESqqXMJ(w448Cp;c(So}zIvrh8vq~E`jS}S^NCq#Nq zvN5XvHl=QM)Y@qan}bC(uV$6XA7R{;?U4U?w~3%VW1S?6W8uN|Er}A#+7fLV8+w1e vsf^>FzTx8yx#SaP6AU=gJEwhmdE literal 0 HcmV?d00001 diff --git a/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon~ipad@2x.png b/ActionExtension-iOS/Media.xcassets/AppIconExtension.appiconset/notification-icon~ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..662e8f4054d026190ad6dd029fa9972fdc3fedad GIT binary patch literal 1042 zcmV+t1nv8YP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K5d`Uz>R9Fe^mP=?;K@^6YM~%in zqebw6&_~*)O^g=Yh@faeC+6l(C*v_W}yfQq6n^vP(j+J z4V9vzHrOg{DArbz)bCvHt&`>^>D{=Rf#IAv|CuxY{4WXL53KUW(vvFpDj4l#8ZcU?5bxg!mx|l@74IO$-Z4?S)wY|?TuV#K0*}Co8x~UQI6@Bu7U@$3;J<;$Hw7;DxNKXE zf@%TD-zEWeKb=S=q>ECg%+H5lY%#6Lp?bg7TR%8n0Ep5(SOeNfwu%BR_V!05k`D zL5|_>q#w7#SH>J2G0Mp9MZFxyG^ZA8Yio;h@dNyLCnb)bRdMkl7iE4QZZGPMti6gG}WfSy>U{-_NK4LG}+)KaT-($rq*}p&em9k8n z&t3q6Zz0!=l^1xQ-p;~Du-$yl9zx_iM|}f)1~S*^v*aHF@4|l&3mKr5gX`2Pz00oGhxfp`GtL;wH) M07*qoM6N<$f?}b}AOHXW literal 0 HcmV?d00001 diff --git a/Shared/Extensions/WriteFreelyModel+APIHandlers.swift b/Shared/Extensions/WriteFreelyModel+APIHandlers.swift index 9a7447e..804dd41 100644 --- a/Shared/Extensions/WriteFreelyModel+APIHandlers.swift +++ b/Shared/Extensions/WriteFreelyModel+APIHandlers.swift @@ -147,17 +147,8 @@ extension WriteFreelyModel { } else { DispatchQueue.main.async { let managedPost = WFAPost(context: LocalStorageManager.standard.container.viewContext) - managedPost.postId = fetchedPost.postId - managedPost.slug = fetchedPost.slug - managedPost.appearance = fetchedPost.appearance - managedPost.language = fetchedPost.language - managedPost.rtl = fetchedPost.rtl ?? false - managedPost.createdDate = fetchedPost.createdDate - managedPost.updatedDate = fetchedPost.updatedDate - managedPost.title = fetchedPost.title ?? "" - managedPost.body = fetchedPost.body + self.importData(from: fetchedPost, into: managedPost) managedPost.collectionAlias = fetchedPost.collectionAlias - managedPost.status = PostStatus.published.rawValue managedPost.wasDeletedFromServer = false } } @@ -193,16 +184,7 @@ extension WriteFreelyModel { let fetchedPost = try result.get() // If this is an updated post, check it against postToUpdate. if let updatingPost = self.postToUpdate { - updatingPost.appearance = fetchedPost.appearance - updatingPost.body = fetchedPost.body - updatingPost.createdDate = fetchedPost.createdDate - updatingPost.language = fetchedPost.language - updatingPost.postId = fetchedPost.postId - updatingPost.rtl = fetchedPost.rtl ?? false - updatingPost.slug = fetchedPost.slug - updatingPost.status = PostStatus.published.rawValue - updatingPost.title = fetchedPost.title ?? "" - updatingPost.updatedDate = fetchedPost.updatedDate + importData(from: fetchedPost, into: updatingPost) DispatchQueue.main.async { LocalStorageManager.standard.saveContext() } @@ -224,16 +206,7 @@ extension WriteFreelyModel { do { let cachedPostsResults = try LocalStorageManager.standard.container.viewContext.fetch(request) guard let cachedPost = cachedPostsResults.first else { return } - cachedPost.appearance = fetchedPost.appearance - cachedPost.body = fetchedPost.body - cachedPost.createdDate = fetchedPost.createdDate - cachedPost.language = fetchedPost.language - cachedPost.postId = fetchedPost.postId - cachedPost.rtl = fetchedPost.rtl ?? false - cachedPost.slug = fetchedPost.slug - cachedPost.status = PostStatus.published.rawValue - cachedPost.title = fetchedPost.title ?? "" - cachedPost.updatedDate = fetchedPost.updatedDate + importData(from: fetchedPost, into: cachedPost) DispatchQueue.main.async { LocalStorageManager.standard.saveContext() } @@ -258,16 +231,7 @@ extension WriteFreelyModel { do { let fetchedPost = try result.get() guard let cachedPost = self.selectedPost else { return } - cachedPost.appearance = fetchedPost.appearance - cachedPost.body = fetchedPost.body - cachedPost.createdDate = fetchedPost.createdDate - cachedPost.language = fetchedPost.language - cachedPost.postId = fetchedPost.postId - cachedPost.rtl = fetchedPost.rtl ?? false - cachedPost.slug = fetchedPost.slug - cachedPost.status = PostStatus.published.rawValue - cachedPost.title = fetchedPost.title ?? "" - cachedPost.updatedDate = fetchedPost.updatedDate + importData(from: fetchedPost, into: cachedPost) cachedPost.hasNewerRemoteCopy = false DispatchQueue.main.async { LocalStorageManager.standard.saveContext() @@ -298,4 +262,17 @@ extension WriteFreelyModel { print(error) } } + + private func importData(from fetchedPost: WFPost, into cachedPost: WFAPost) { + cachedPost.appearance = fetchedPost.appearance + cachedPost.body = fetchedPost.body + cachedPost.createdDate = fetchedPost.createdDate + cachedPost.language = fetchedPost.language + cachedPost.postId = fetchedPost.postId + cachedPost.rtl = fetchedPost.rtl ?? false + cachedPost.slug = fetchedPost.slug + cachedPost.status = PostStatus.published.rawValue + cachedPost.title = fetchedPost.title ?? "" + cachedPost.updatedDate = fetchedPost.updatedDate + } } diff --git a/Shared/LocalStorageManager.swift b/Shared/LocalStorageManager.swift index 63bdd88..b644faf 100644 --- a/Shared/LocalStorageManager.swift +++ b/Shared/LocalStorageManager.swift @@ -59,7 +59,7 @@ private extension LocalStorageManager { container.persistentStoreDescriptions.first!.url = sharedStoreURL } - container.loadPersistentStores { description, error in + container.loadPersistentStores { _, error in if let error = error { fatalError("Core Data store failed to load with error: \(error)") } diff --git a/Shared/WriteFreely_MultiPlatformApp.swift b/Shared/WriteFreely_MultiPlatformApp.swift index 0ea2760..4378ada 100644 --- a/Shared/WriteFreely_MultiPlatformApp.swift +++ b/Shared/WriteFreely_MultiPlatformApp.swift @@ -25,8 +25,8 @@ struct WriteFreely_MultiPlatformApp: App { @StateObject private var model = WriteFreelyModel.shared #if os(macOS) - // swiftlint:disable:next weak_delegate @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate + @StateObject var updaterViewModel = MacUpdatesViewModel() @State private var selectedTab = 0 #endif @@ -47,13 +47,6 @@ struct WriteFreely_MultiPlatformApp: App { showLastDraftOrCreateNewLocalPost() } } -// DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { -// if model.editor.lastDraftURL != nil { -// self.model.selectedPost = model.editor.fetchLastDraftFromAppStorage() -// } else { -// createNewLocalPost() -// } -// } }) .environmentObject(model) .environment(\.managedObjectContext, LocalStorageManager.standard.container.viewContext) @@ -61,11 +54,9 @@ struct WriteFreely_MultiPlatformApp: App { } .commands { #if os(macOS) - CommandGroup(after: .appInfo, addition: { - Button("Check For Updates") { - SUUpdater.shared()?.checkForUpdates(self) - } - }) + CommandGroup(after: .appInfo) { + CheckForUpdatesView(updaterViewModel: updaterViewModel) + } #endif CommandGroup(replacing: .newItem, addition: { Button("New Post") { @@ -116,7 +107,7 @@ struct WriteFreely_MultiPlatformApp: App { Text("Preferences") } .tag(1) - MacUpdatesView() + MacUpdatesView(updaterViewModel: updaterViewModel) .tabItem { Image(systemName: "arrow.down.circle") Text("Updates") diff --git a/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj b/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj index a28dc78..45555ef 100644 --- a/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj +++ b/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj @@ -20,8 +20,6 @@ 17120DAC24E1B99F002B9F6C /* AccountLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17120DAB24E1B99F002B9F6C /* AccountLoginView.swift */; }; 17120DAD24E1B99F002B9F6C /* AccountLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17120DAB24E1B99F002B9F6C /* AccountLoginView.swift */; }; 17120DB224E1E19C002B9F6C /* SettingsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17120DB124E1E19C002B9F6C /* SettingsHeaderView.swift */; }; - 1714DD65260BAC14000C0DFF /* WriteFreely in Frameworks */ = {isa = PBXBuildFile; productRef = 1714DD64260BAC14000C0DFF /* WriteFreely */; }; - 1714DD6B260BAC2C000C0DFF /* WriteFreely in Frameworks */ = {isa = PBXBuildFile; productRef = 1714DD6A260BAC2C000C0DFF /* WriteFreely */; }; 171BFDFA24D4AF8300888236 /* CollectionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BFDF924D4AF8300888236 /* CollectionListView.swift */; }; 171BFDFB24D4AF8300888236 /* CollectionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BFDF924D4AF8300888236 /* CollectionListView.swift */; }; 171DC677272C7D0B002B9B8A /* UserDefaults+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171DC676272C7D0B002B9B8A /* UserDefaults+Extensions.swift */; }; @@ -35,7 +33,6 @@ 172E10152735C2BD00061372 /* UIHostingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 172E10142735C2BD00061372 /* UIHostingView.swift */; }; 172E10172735C2DF00061372 /* EnvironmentValues+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 172E10162735C2DF00061372 /* EnvironmentValues+Extensions.swift */; }; 172E10192735C3DB00061372 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 172E10182735C3DB00061372 /* ContentView.swift */; }; - 172E101B2735C54400061372 /* WriteFreely in Frameworks */ = {isa = PBXBuildFile; productRef = 172E101A2735C54400061372 /* WriteFreely */; }; 172E101C2735C57400061372 /* LocalStorageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1756DBB924FED45500207AB8 /* LocalStorageManager.swift */; }; 172E101D2735C5AB00061372 /* LocalStorageModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1756DBB524FED3A400207AB8 /* LocalStorageModel.xcdatamodeld */; }; 172E101E2735C62F00061372 /* PostStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17C42E612507D8E600072984 /* PostStatus.swift */; }; @@ -78,7 +75,9 @@ 17836C15273F0FBB0047AF61 /* Hack-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 17D4F3A42514F1E900517CE6 /* Hack-Regular.ttf */; }; 17836C16273F0FBB0047AF61 /* LoraGX.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 17D4F36B2514EE2F00517CE6 /* LoraGX.ttf */; }; 17836C17273F0FBB0047AF61 /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 17D4F39D2514F0E500517CE6 /* OpenSans-Regular.ttf */; }; - 17A4FEDA25924AF70037E96B /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 17A4FED925924AF70037E96B /* Sparkle */; }; + 1784D2ED27946D880033E72E /* WriteFreely in Frameworks */ = {isa = PBXBuildFile; productRef = 1784D2EC27946D880033E72E /* WriteFreely */; }; + 1784D2EF27946D9A0033E72E /* WriteFreely in Frameworks */ = {isa = PBXBuildFile; productRef = 1784D2EE27946D9A0033E72E /* WriteFreely */; }; + 1784D2F127946DA10033E72E /* WriteFreely in Frameworks */ = {isa = PBXBuildFile; productRef = 1784D2F027946DA10033E72E /* WriteFreely */; }; 17A4FEED25927E730037E96B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A4FEEC25927E730037E96B /* AppDelegate.swift */; }; 17A5388824DDA31F00DEFF9A /* MacAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A5388724DDA31F00DEFF9A /* MacAccountView.swift */; }; 17A5388C24DDC83F00DEFF9A /* AccountModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A5388B24DDC83F00DEFF9A /* AccountModel.swift */; }; @@ -108,6 +107,8 @@ 17C42E71250AAFD500072984 /* NSManagedObjectContext+ExecuteAndMergeChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17C42E6F250AA12200072984 /* NSManagedObjectContext+ExecuteAndMergeChanges.swift */; }; 17D435E824E3128F0036B539 /* PreferencesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D435E724E3128F0036B539 /* PreferencesModel.swift */; }; 17D435E924E3128F0036B539 /* PreferencesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D435E724E3128F0036B539 /* PreferencesModel.swift */; }; + 17D4926527947B4D0035BD7E /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 17D4926427947B4D0035BD7E /* Sparkle */; }; + 17D4926727947D780035BD7E /* MacUpdatesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D4926627947D780035BD7E /* MacUpdatesViewModel.swift */; }; 17D4F36C2514EE2F00517CE6 /* LoraGX.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 17D4F36B2514EE2F00517CE6 /* LoraGX.ttf */; }; 17D4F36D2514EE2F00517CE6 /* LoraGX.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 17D4F36B2514EE2F00517CE6 /* LoraGX.ttf */; }; 17D4F39E2514F0E500517CE6 /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 17D4F39D2514F0E500517CE6 /* OpenSans-Regular.ttf */; }; @@ -234,6 +235,7 @@ 17C42E642509237800072984 /* PostListFilteredView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostListFilteredView.swift; sourceTree = ""; }; 17C42E6F250AA12200072984 /* NSManagedObjectContext+ExecuteAndMergeChanges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSManagedObjectContext+ExecuteAndMergeChanges.swift"; sourceTree = ""; }; 17D435E724E3128F0036B539 /* PreferencesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesModel.swift; sourceTree = ""; }; + 17D4926627947D780035BD7E /* MacUpdatesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacUpdatesViewModel.swift; sourceTree = ""; }; 17D4F36B2514EE2F00517CE6 /* LoraGX.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = LoraGX.ttf; sourceTree = ""; }; 17D4F39D2514F0E500517CE6 /* OpenSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Regular.ttf"; sourceTree = ""; }; 17D4F3A42514F1E900517CE6 /* Hack-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Hack-Regular.ttf"; sourceTree = ""; }; @@ -269,7 +271,7 @@ buildActionMask = 2147483647; files = ( 172E10012735B83E00061372 /* UniformTypeIdentifiers.framework in Frameworks */, - 172E101B2735C54400061372 /* WriteFreely in Frameworks */, + 1784D2F127946DA10033E72E /* WriteFreely in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -277,7 +279,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1714DD65260BAC14000C0DFF /* WriteFreely in Frameworks */, + 1784D2ED27946D880033E72E /* WriteFreely in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -285,8 +287,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 17A4FEDA25924AF70037E96B /* Sparkle in Frameworks */, - 1714DD6B260BAC2C000C0DFF /* WriteFreely in Frameworks */, + 1784D2EF27946D9A0033E72E /* WriteFreely in Frameworks */, + 17D4926527947B4D0035BD7E /* Sparkle in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -400,6 +402,7 @@ 17A5388724DDA31F00DEFF9A /* MacAccountView.swift */, 1753F6AB24E431CC00309365 /* MacPreferencesView.swift */, 172C492D2593981900E20ADF /* MacUpdatesView.swift */, + 17D4926627947D780035BD7E /* MacUpdatesViewModel.swift */, ); path = Settings; sourceTree = ""; @@ -619,7 +622,7 @@ ); name = "ActionExtension-iOS"; packageProductDependencies = ( - 172E101A2735C54400061372 /* WriteFreely */, + 1784D2F027946DA10033E72E /* WriteFreely */, ); productName = "ActionExtension-iOS"; productReference = 172E0FFF2735B83E00061372 /* ActionExtension-iOS.appex */; @@ -642,7 +645,7 @@ ); name = "WriteFreely-MultiPlatform (iOS)"; packageProductDependencies = ( - 1714DD64260BAC14000C0DFF /* WriteFreely */, + 1784D2EC27946D880033E72E /* WriteFreely */, ); productName = "WriteFreely-MultiPlatform (iOS)"; productReference = 17DF328824C87D3500BCE2E3 /* WriteFreely-MultiPlatform.app */; @@ -663,8 +666,8 @@ ); name = "WriteFreely-MultiPlatform (macOS)"; packageProductDependencies = ( - 17A4FED925924AF70037E96B /* Sparkle */, - 1714DD6A260BAC2C000C0DFF /* WriteFreely */, + 1784D2EE27946D9A0033E72E /* WriteFreely */, + 17D4926427947B4D0035BD7E /* Sparkle */, ); productName = "WriteFreely-MultiPlatform (macOS)"; productReference = 17DF329024C87D3500BCE2E3 /* WriteFreely for Mac.app */; @@ -713,7 +716,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1310; - LastUpgradeCheck = 1200; + LastUpgradeCheck = 1320; TargetAttributes = { 172E0FFE2735B83E00061372 = { CreatedOnToolsVersion = 13.1; @@ -744,8 +747,8 @@ ); mainGroup = 17DF327B24C87D3300BCE2E3; packageReferences = ( - 17A4FED825924AF70037E96B /* XCRemoteSwiftPackageReference "Sparkle" */, - 1714DD63260BAC14000C0DFF /* XCRemoteSwiftPackageReference "writefreely-swift" */, + 1784D2EB27946D880033E72E /* XCRemoteSwiftPackageReference "writefreely-swift" */, + 17D4926327947B4D0035BD7E /* XCRemoteSwiftPackageReference "Sparkle" */, ); productRefGroup = 17DF328924C87D3500BCE2E3 /* Products */; projectDirPath = ""; @@ -942,6 +945,7 @@ 17480CA6251272EE00EB7765 /* Bundle+AppVersion.swift in Sources */, 17C42E662509237800072984 /* PostListFilteredView.swift in Sources */, 17120DAD24E1B99F002B9F6C /* AccountLoginView.swift in Sources */, + 17D4926727947D780035BD7E /* MacUpdatesViewModel.swift in Sources */, 17466626256C0D0600629997 /* MacEditorTextView.swift in Sources */, 170A7EC226F5186A00F1CBD4 /* CollectionListModel.swift in Sources */, 17E5DF8A2543610700DCDC9B /* PostTextEditingView.swift in Sources */, @@ -1243,6 +1247,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 620; @@ -1269,6 +1274,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 620; @@ -1438,43 +1444,43 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 1714DD63260BAC14000C0DFF /* XCRemoteSwiftPackageReference "writefreely-swift" */ = { + 1784D2EB27946D880033E72E /* XCRemoteSwiftPackageReference "writefreely-swift" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "git@github.com:writefreely/writefreely-swift.git"; + repositoryURL = "https://github.com/writefreely/writefreely-swift"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 0.3.2; + minimumVersion = 0.3.4; }; }; - 17A4FED825924AF70037E96B /* XCRemoteSwiftPackageReference "Sparkle" */ = { + 17D4926327947B4D0035BD7E /* XCRemoteSwiftPackageReference "Sparkle" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/writefreely/Sparkle"; + repositoryURL = "https://github.com/sparkle-project/Sparkle"; requirement = { - branch = master; - kind = branch; + kind = upToNextMinorVersion; + minimumVersion = 2.0.0; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 1714DD64260BAC14000C0DFF /* WriteFreely */ = { + 1784D2EC27946D880033E72E /* WriteFreely */ = { isa = XCSwiftPackageProductDependency; - package = 1714DD63260BAC14000C0DFF /* XCRemoteSwiftPackageReference "writefreely-swift" */; + package = 1784D2EB27946D880033E72E /* XCRemoteSwiftPackageReference "writefreely-swift" */; productName = WriteFreely; }; - 1714DD6A260BAC2C000C0DFF /* WriteFreely */ = { + 1784D2EE27946D9A0033E72E /* WriteFreely */ = { isa = XCSwiftPackageProductDependency; - package = 1714DD63260BAC14000C0DFF /* XCRemoteSwiftPackageReference "writefreely-swift" */; + package = 1784D2EB27946D880033E72E /* XCRemoteSwiftPackageReference "writefreely-swift" */; productName = WriteFreely; }; - 172E101A2735C54400061372 /* WriteFreely */ = { + 1784D2F027946DA10033E72E /* WriteFreely */ = { isa = XCSwiftPackageProductDependency; - package = 1714DD63260BAC14000C0DFF /* XCRemoteSwiftPackageReference "writefreely-swift" */; + package = 1784D2EB27946D880033E72E /* XCRemoteSwiftPackageReference "writefreely-swift" */; productName = WriteFreely; }; - 17A4FED925924AF70037E96B /* Sparkle */ = { + 17D4926427947B4D0035BD7E /* Sparkle */ = { isa = XCSwiftPackageProductDependency; - package = 17A4FED825924AF70037E96B /* XCRemoteSwiftPackageReference "Sparkle" */; + package = 17D4926327947B4D0035BD7E /* XCRemoteSwiftPackageReference "Sparkle" */; productName = Sparkle; }; /* End XCSwiftPackageProductDependency section */ diff --git a/WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist b/WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist index 155f2da..33a3444 100644 --- a/WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,17 +7,17 @@ ActionExtension-iOS.xcscheme_^#shared#^_ orderHint - 0 + 1 WriteFreely-MultiPlatform (iOS).xcscheme_^#shared#^_ orderHint - 1 + 2 WriteFreely-MultiPlatform (macOS).xcscheme_^#shared#^_ orderHint - 2 + 0 diff --git a/macOS/AppDelegate.swift b/macOS/AppDelegate.swift index e002e64..410ffe9 100644 --- a/macOS/AppDelegate.swift +++ b/macOS/AppDelegate.swift @@ -3,26 +3,6 @@ import Sparkle class AppDelegate: NSObject, NSApplicationDelegate { - func applicationWillFinishLaunching(_ notification: Notification) { - // Check UserDefaults for values; if the key doesn't exist (e.g., if MacUpdatesView hasn't ever been shown), - // bool(forKey:) returns false, so set SUUpdater.shared() appropriately. - let automaticallyChecksForUpdates = UserDefaults.shared.bool(forKey: WFDefaults.automaticallyChecksForUpdates) - let subscribeToBetaUpdates = UserDefaults.shared.bool(forKey: WFDefaults.subscribeToBetaUpdates) - - // Set Sparkle properties. - SUUpdater.shared()?.automaticallyChecksForUpdates = automaticallyChecksForUpdates - if subscribeToBetaUpdates { - SUUpdater.shared()?.feedURL = URL(string: AppcastFeedUrl.beta.rawValue) - } else { - SUUpdater.shared()?.feedURL = URL(string: AppcastFeedUrl.release.rawValue) - } - - // If enabled, check for updates. - if automaticallyChecksForUpdates { - SUUpdater.shared()?.checkForUpdatesInBackground() - } - } - // MARK: - Window handling when miniaturized into app icon on the Dock // Credit to Henry Cooper (pillboxer) on GitHub: // https://github.com/tact/beta-bugs/issues/31#issuecomment-855914705 @@ -30,7 +10,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { // If the window is currently minimized into the Dock, de-miniaturize it (note that if it's minimized // and the user uses OPT+TAB to switch to it, it will be de-miniaturized and brought to the foreground). func applicationDidBecomeActive(_ notification: Notification) { - print("💬 Fired:", #function) if let window = NSApp.windows.first { window.deminiaturize(nil) } @@ -39,7 +18,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { // If we're miniaturizing the window, deactivate it as well by activating Finder.app (note that // this will bring any Finder windows that are behind other apps to the foreground). func applicationDidChangeOcclusionState(_ notification: Notification) { - print("💬 Fired:", #function) if let window = NSApp.windows.first, window.isMiniaturized { NSWorkspace.shared.runningApplications.first(where: { $0.activationPolicy == .regular @@ -49,7 +27,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { lazy var windows = NSWindow() func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { - print("💬 Fired:", #function) if !flag { for window in sender.windows { window.makeKeyAndOrderFront(self) diff --git a/macOS/PostEditor/MacEditorTextView.swift b/macOS/PostEditor/MacEditorTextView.swift index 601052a..9c11d8a 100644 --- a/macOS/PostEditor/MacEditorTextView.swift +++ b/macOS/PostEditor/MacEditorTextView.swift @@ -163,8 +163,8 @@ final class CustomTextView: NSView { textView.isAutomaticDashSubstitutionEnabled = false textView.isRichText = false textView.typingAttributes = [ - .paragraphStyle: paragraphStyle, // H/T Daniel Jalkut - .font: font, + .paragraphStyle: paragraphStyle, // H/T Daniel Jalkut + .font: font ?? NSFont.systemFont(ofSize: 17), // Fall back to system font if we can't unwrap font argument .foregroundColor: NSColor.labelColor ] diff --git a/macOS/Settings/MacUpdatesView.swift b/macOS/Settings/MacUpdatesView.swift index 53b4f0e..afb6c48 100644 --- a/macOS/Settings/MacUpdatesView.swift +++ b/macOS/Settings/MacUpdatesView.swift @@ -1,16 +1,14 @@ import SwiftUI import Sparkle -enum AppcastFeedUrl: String { - case release = "https://writefreely-files.s3.amazonaws.com/apps/mac/appcast.xml" - case beta = "https://writefreely-files.s3.amazonaws.com/apps/mac/appcast-beta.xml" -} - struct MacUpdatesView: View { + @ObservedObject var updaterViewModel: MacUpdatesViewModel + @AppStorage(WFDefaults.automaticallyChecksForUpdates, store: UserDefaults.shared) var automaticallyChecksForUpdates: Bool = false @AppStorage(WFDefaults.subscribeToBetaUpdates, store: UserDefaults.shared) var subscribeToBetaUpdates: Bool = false + @State private var lastUpdateCheck: Date? private let betaWarningString = """ @@ -34,9 +32,11 @@ that can cause crashes and data loss. VStack { Button(action: { - SUUpdater.shared()?.checkForUpdates(self) - DispatchQueue.main.async { - lastUpdateCheck = SUUpdater.shared()?.lastUpdateCheckDate + updaterViewModel.checkForUpdates() + // There's a delay between requesting an update, and the timestamp for that update request being + // written to user defaults; we therefore delay updating the "Last checked" UI for one second. + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + lastUpdateCheck = updaterViewModel.getLastUpdateCheckDate() } }, label: { Text("Check For Updates") @@ -73,23 +73,19 @@ that can cause crashes and data loss. } .padding() .onAppear { - lastUpdateCheck = SUUpdater.shared()?.lastUpdateCheckDate + lastUpdateCheck = updaterViewModel.getLastUpdateCheckDate() } .onChange(of: automaticallyChecksForUpdates) { value in - SUUpdater.shared()?.automaticallyChecksForUpdates = value + updaterViewModel.automaticallyCheckForUpdates = value } - .onChange(of: subscribeToBetaUpdates) { value in - if value { - SUUpdater.shared()?.feedURL = URL(string: AppcastFeedUrl.beta.rawValue) - } else { - SUUpdater.shared()?.feedURL = URL(string: AppcastFeedUrl.release.rawValue) - } + .onChange(of: subscribeToBetaUpdates) { _ in + updaterViewModel.toggleAllowedChannels() } } } struct MacUpdatesView_Previews: PreviewProvider { static var previews: some View { - MacUpdatesView() + MacUpdatesView(updaterViewModel: MacUpdatesViewModel()) } } diff --git a/macOS/Settings/MacUpdatesViewModel.swift b/macOS/Settings/MacUpdatesViewModel.swift new file mode 100644 index 0000000..b960524 --- /dev/null +++ b/macOS/Settings/MacUpdatesViewModel.swift @@ -0,0 +1,73 @@ +/// See https://sparkle-project.org/documentation/programmatic-setup#create-an-updater-in-swiftui + +import SwiftUI +import Sparkle + +/// This view model class manages Sparkle's updater and publishes when new updates are allowed to be checked. +final class MacUpdatesViewModel: ObservableObject { + + @Published var canCheckForUpdates = false + private let updaterController: SPUStandardUpdaterController + private let updaterDelegate = MacUpdatesViewModelDelegate() + + var automaticallyCheckForUpdates: Bool { + get { + return updaterController.updater.automaticallyChecksForUpdates + } + set(newValue) { + updaterController.updater.automaticallyChecksForUpdates = newValue + } + } + + init() { + updaterController = SPUStandardUpdaterController(startingUpdater: true, + updaterDelegate: updaterDelegate, + userDriverDelegate: nil) + + updaterController.updater.publisher(for: \.canCheckForUpdates) + .assign(to: &$canCheckForUpdates) + + if automaticallyCheckForUpdates { + updaterController.updater.checkForUpdatesInBackground() + } + } + + func checkForUpdates() { + updaterController.checkForUpdates(nil) + } + + func getLastUpdateCheckDate() -> Date? { + return updaterController.updater.lastUpdateCheckDate + } + + @discardableResult + func toggleAllowedChannels() -> Set { + return updaterDelegate.allowedChannels(for: updaterController.updater) + } + +} + +final class MacUpdatesViewModelDelegate: NSObject, SPUUpdaterDelegate { + + @AppStorage(WFDefaults.subscribeToBetaUpdates, store: UserDefaults.shared) + var subscribeToBetaUpdates: Bool = false + + func allowedChannels(for updater: SPUUpdater) -> Set { + let allowedChannels = Set(subscribeToBetaUpdates ? ["beta"] : []) + return allowedChannels + } + +} + +// This additional view is needed for the disabled state on the menu item to work properly before Monterey. +// See https://stackoverflow.com/questions/68553092/menu-not-updating-swiftui-bug for more information +struct CheckForUpdatesView: View { + + @ObservedObject var updaterViewModel: MacUpdatesViewModel + + var body: some View { + Button("Check for Updates…", action: updaterViewModel.checkForUpdates) + .disabled(!updaterViewModel.canCheckForUpdates) + } + +}