From d0081101bc276f26f58fc855b7a9754598a9445a Mon Sep 17 00:00:00 2001 From: Justin Mazzocchi <2831158+jzzocc@users.noreply.github.com> Date: Wed, 3 Mar 2021 23:22:32 -0800 Subject: [PATCH] Alternate app icons --- App Icons/AppIconBrutalist@2x.png | Bin 0 -> 2582 bytes App Icons/AppIconBrutalist@3x.png | Bin 0 -> 3818 bytes App Icons/AppIconClassic@2x.png | Bin 0 -> 2909 bytes App Icons/AppIconClassic@3x.png | Bin 0 -> 4609 bytes App Icons/AppIconLight@2x.png | Bin 0 -> 3038 bytes App Icons/AppIconLight@3x.png | Bin 0 -> 4885 bytes App Icons/AppIconRainbow@2x.png | Bin 0 -> 6093 bytes App Icons/AppIconRainbow@3x.png | Bin 0 -> 11135 bytes App Icons/AppIconRainbowBrutalist@2x.png | Bin 0 -> 3000 bytes App Icons/AppIconRainbowBrutalist@3x.png | Bin 0 -> 4330 bytes Localizations/Localizable.strings | 5 + Metatext.xcodeproj/project.pbxproj | 52 ++++++++ Supporting Files/Info.plist | 84 +++++++++++++ .../ViewModels/Entities/AlertItem.swift | 4 + Views/SwiftUI/AppIconPreferencesView.swift | 114 ++++++++++++++++++ Views/SwiftUI/PreferencesView.swift | 66 ++++++---- 16 files changed, 303 insertions(+), 22 deletions(-) create mode 100644 App Icons/AppIconBrutalist@2x.png create mode 100644 App Icons/AppIconBrutalist@3x.png create mode 100644 App Icons/AppIconClassic@2x.png create mode 100644 App Icons/AppIconClassic@3x.png create mode 100644 App Icons/AppIconLight@2x.png create mode 100644 App Icons/AppIconLight@3x.png create mode 100644 App Icons/AppIconRainbow@2x.png create mode 100644 App Icons/AppIconRainbow@3x.png create mode 100644 App Icons/AppIconRainbowBrutalist@2x.png create mode 100644 App Icons/AppIconRainbowBrutalist@3x.png create mode 100644 Views/SwiftUI/AppIconPreferencesView.swift diff --git a/App Icons/AppIconBrutalist@2x.png b/App Icons/AppIconBrutalist@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..82034400b87fd7b1124f83cdc508192fd8b6ae36 GIT binary patch literal 2582 zcmdT`S6dUx7EOpCL~;PbrH{i_g5T=PR4FCWY0RbQ; z0)MX+vHWKjRRsF4|2vR<*?tQE;J`o)|FlB^H=Vt@`Eor$rqYD}|d zSM0@Dh!KxMGP}AVH&4uz^_dz$KFYtk=BqtA*aWQjBDbHo6{2Mj+s#pZE?fOnj@d|W zEiKi-0cT`Z#4eBZT{H=W!yXs*Qan#40HBS7QZhi5TCf-`fjAw;%0=2UmcOZ{+{!z z+~}>3-k#Udj6O!u^Y6XCZ(X1nrr*`U=Gq!<9{F>FL)2nQ&z%gAvo47jJ39O!??3-Z zV@aDpog<>B<9;v8kS7V=yomxTDEvQm#ZBU#VdKjYZO>iua7gj%a&{Tn`G<%YRmaF#DX z=@NRnw1)8Q`Oir73N<}+XPKf9@?6o$c#-R2TP*7yeYljI?@;B+I-{YM2oaSjJKo=k z0}C9xZ5kwU77ME)GOIW8l`Oqyaj#TdK3EZu(B+$IeNk*&;`pw|bB%AmHG~c8J32lB zo5L7KdyMSWvY-{})nUJpH!1JJ7RlJDuYI{;O;JZbuMQ7D=RX`$FK8j@6nmx~<(`yO ztnBcI7NYMY8x`&If*_>XR$|K^a`(sdv4uQYLN9tuo`MR;&#K2aMC{5G=tj-Fa~>FK zKV%^Y87ato?G?RPIno*vBWLp_+2{T#ld^~$$Jyt3E0lxzu3V(8wx0`$9~{|5<3i~} zSUCrRf|2Hvy(=lNC3y8rLRYAeX@|y8@Ac_AuNgxNEpo1sOG(Ju02J6M&l9#iUyv%O zY$0X*G&5@XV}`olRAvqa1#>^~khrq_Sdd6!k)VBiJh|~AU?#s*7KVev`J2%P!9K$! z3Gj$nQjlGRjkKI&?HfO-qMg;xuij89m>ScGy-x8Krn|R?ON=;_gjlyCCJ8Qw8G)m9 zUW3p5wf9g$w!?8UVh+$I)|F^ly?<%0vRkiHIAg@9MdXU^Jv^)!2aRftI(pu&8$;Xt zwLWg9*Bv-G_*!rBx@!|MeQUNsinb3CzZF;{Ugy}8%qq1<3YgQ((+tCL`jlI(9_+3$ z+7r$}`#_a}ZIC1m_r`f9ceFF*JjfPE0%v;?l5wn5e>Hqd(#!3(I>hIZ55D8LXVP{z zgTI*S%-23NI|-n7L!h`3c zSq)`NI%E43ok@WN>Dxl*m+sP}rIhYpgWR+uIBQJD_qBITdNz6~T(>OHd}d|0@dhGt z!!%~4v* z_q;~FbG|UTOghUR54(0Dy03CRLrg=TOG1~kxgUXu1AnhvsksGiVixF7WZDH~oYO~w zmEpubr?f(?aKcm8a|u2DppE0pn(KA&9^L}I zANxBiIv5`K1p4FUS1gKu2?OU-y z(ii`lS8>^bX1Pk^exVyvfA{a#b`wjO`7?I*@4Wl+SL2wva@D^K%F8hGyk~imbJf=LtLRea z+A<~W>rnqo)e7Y1Ol?L-RQ3E7ezyIa_Xi7gvXfZ&QB$LoB{VTTDSGU+c0|cL!{t{% zb@%(N(K^fybNAPxX_cl!*m5Vw{pKe`@w7YAifQ<}997pv+qaT_O?(oQ=_-LR)L?+T z1O0BQgwB)D%cH)M5ETruU>c)pbM$Ll7H)tGUhNltY58Wx`Y=PA4BLk7~6Pgd1mL)Qcg-kDm6yV)TGhtILg*P1Yv*^2|YfHnTfs7MFmH4R`aVhn#BW= zf}-;I*U0zA=t?|nQ!ak^Kq|n=y0pnq$UVHKrd=51XOzCh>w%f0P{CgRf26-p0VM7U U^s2pa^6x(x)X2h+pzj|0Z;koY*#H0l literal 0 HcmV?d00001 diff --git a/App Icons/AppIconBrutalist@3x.png b/App Icons/AppIconBrutalist@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bc233da89f37146fe58d9ca4c68372f634da86cf GIT binary patch literal 3818 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 lV|+8^g7N=v`riOS#bHaT(DI`Q&AT4)L= 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 It(qg|-`2CM!vFvP literal 0 HcmV?d00001 diff --git a/App Icons/AppIconLight@3x.png b/App Icons/AppIconLight@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6185e840afc1c6cb93b26c81e03d738dfeddfdf0 GIT binary patch literal 4885 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 literal 0 HcmV?d00001 diff --git a/App Icons/AppIconRainbow@2x.png b/App Icons/AppIconRainbow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d49bb3468cd1c12db252b949a9da35c1dde18830 GIT binary patch literal 6093 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 literal 0 HcmV?d00001 diff --git a/App Icons/AppIconRainbowBrutalist@2x.png b/App Icons/AppIconRainbowBrutalist@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..24def3425c0089d70165a447ccb10d37e220ecde GIT binary patch literal 3000 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 literal 0 HcmV?d00001 diff --git a/App Icons/AppIconRainbowBrutalist@3x.png b/App Icons/AppIconRainbowBrutalist@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1ca9adf3781f87f301a1349b16787244f46208 GIT binary patch literal 4330 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�ZC?E zp)>w?m_qyXzKYY?C~};SlIr4i{>LEcs zcc|`iD;u{s^%-`53WwEr7EFtZFzxAM=n8Yn$1I$yTLqZvusI5ep)1M97nspk+sUfg zKgwrwiOB^<*ilkv=&cQ7ehS9$lWBU7(qTLP?m(n5o>>#xFC|UZb9IDK&i;4p|7*#K ZgkD_x-qWKC;J<$cvwy5is*F4y{0FEn$(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) + CFBundleIcons + + CFBundleAlternateIcons + + AppIconBrutalist + + CFBundleIconFiles + + AppIconBrutalist + + UIPrerenderedIcon + + + AppIconRainbow + + CFBundleIconFiles + + AppIconRainbow + + UIPrerenderedIcon + + + AppIconRainbowBrutalist + + CFBundleIconFiles + + AppIconRainbowBrutalist + + UIPrerenderedIcon + + + + CFBundlePrimaryIcon + + CFBundleIconFiles + + AppIcon + + UIPrerenderedIcon + + + + CFBundleIcons~ipad + + CFBundleAlternateIcons + + AppIconBrutalist + + CFBundleIconFiles + + AppIconBrutalist + + UIPrerenderedIcon + + + AppIconRainbow + + CFBundleIconFiles + + AppIconRainbow + + UIPrerenderedIcon + + + AppIconRainbowBrutalist + + CFBundleIconFiles + + AppIconRainbowBrutalist + + UIPrerenderedIcon + + + + CFBundlePrimaryIcon + + CFBundleIconFiles + + AppIcon + + UIPrerenderedIcon + + + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion diff --git a/ViewModels/Sources/ViewModels/Entities/AlertItem.swift b/ViewModels/Sources/ViewModels/Entities/AlertItem.swift index 8a864b5..3c81d07 100644 --- a/ViewModels/Sources/ViewModels/Entities/AlertItem.swift +++ b/ViewModels/Sources/ViewModels/Entities/AlertItem.swift @@ -5,4 +5,8 @@ import Foundation public struct AlertItem: Identifiable { public let id = UUID() public let error: Error + + public init(error: Error) { + self.error = error + } } diff --git a/Views/SwiftUI/AppIconPreferencesView.swift b/Views/SwiftUI/AppIconPreferencesView.swift new file mode 100644 index 0000000..8ae7139 --- /dev/null +++ b/Views/SwiftUI/AppIconPreferencesView.swift @@ -0,0 +1,114 @@ +// Copyright © 2021 Metabolist. All rights reserved. + +import SwiftUI +import ViewModels + +struct AppIconPreferencesView: View { + @StateObject var viewModel: PreferencesViewModel + + @State var alertItem: AlertItem? + + var body: some View { + ScrollView { + LazyVGrid(columns: [ + GridItem(.flexible(minimum: .minimumButtonDimension)), + GridItem(.flexible(minimum: .minimumButtonDimension)), + GridItem(.flexible(minimum: .minimumButtonDimension)) + ]) { + ForEach(AppIcon.allCases) { + cell(appIcon: $0) + } + } + .padding() + } + .alertItem($alertItem) + .navigationTitle("preferences.app-icon") + } +} + +private extension AppIconPreferencesView { + @ViewBuilder func cell(appIcon: AppIcon) -> some View { + Button { + set(appIcon: appIcon) + } label: { + VStack { + if let image = appIcon.image { + image + .cornerRadius(.defaultCornerRadius) + .shadow(radius: .defaultShadowRadius) + .padding(.compactSpacing) + .background(appIcon == AppIcon.current ? Color.blue : Color.clear) + .cornerRadius(.defaultCornerRadius) + .padding(.top) + } + Text(appIcon.nameLocalizedStringKey) + .scaledToFill() + .minimumScaleFactor(0.5) + .foregroundColor(.primary) + } + } + } + + func set(appIcon: AppIcon) { + UIApplication.shared.setAlternateIconName(appIcon.alternateIconName) { error in + DispatchQueue.main.async { + if let error = error { + alertItem = AlertItem(error: error) + } else { + viewModel.objectWillChange.send() + } + } + } + } +} + +enum AppIcon: String, CaseIterable { + case classic = "AppIconClassic" + case rainbow = "AppIconRainbow" + case brutalist = "AppIconBrutalist" + case rainbowBrutalist = "AppIconRainbowBrutalist" +} + +extension AppIcon { + static var current: Self? { Self(rawValue: UIApplication.shared.alternateIconName ?? Self.classic.rawValue) } + + var nameLocalizedStringKey: LocalizedStringKey { + switch self { + case .classic: + return "app-icon.classic" + case .rainbow: + return "app-icon.rainbow" + case .brutalist: + return "app-icon.brutalist" + case .rainbowBrutalist: + return "app-icon.rainbow-brutalist" + } + } + + var alternateIconName: String? { + switch self { + case .classic: + return nil + default: + return rawValue + } + } + + var image: Image? { + guard let image = UIImage(named: rawValue) else { return nil } + + return Image(uiImage: image) + } +} + +extension AppIcon: Identifiable { + var id: Self { self } +} + +#if DEBUG +struct AppIconPreferencesView_Previews: PreviewProvider { + static var previews: some View { + AppIconPreferencesView(viewModel: .init(identityContext: .preview)) + } +} +#endif diff --git a/Views/SwiftUI/PreferencesView.swift b/Views/SwiftUI/PreferencesView.swift index aebaf6b..a667f28 100644 --- a/Views/SwiftUI/PreferencesView.swift +++ b/Views/SwiftUI/PreferencesView.swift @@ -66,29 +66,51 @@ struct PreferencesView: View { && viewModel.identityContext.identity.authenticated) } Section(header: Text("preferences.app")) { - NavigationLink("preferences.notifications", - destination: NotificationPreferencesView(viewModel: viewModel)) - Picker("preferences.status-word", - selection: $identityContext.appPreferences.statusWord) { - ForEach(AppPreferences.StatusWord.allCases) { option in - Text(option.localizedStringKey).tag(option) + Group { + if UIApplication.shared.supportsAlternateIcons { + NavigationLink(destination: AppIconPreferencesView(viewModel: viewModel)) { + HStack { + Text("preferences.app-icon") + Spacer() + if let appIcon = AppIcon.current { + if let image = appIcon.image { + image + .resizable() + .frame( + width: UIFont.preferredFont(forTextStyle: .body).lineHeight, + height: UIFont.preferredFont(forTextStyle: .body).lineHeight) + .cornerRadius(.defaultCornerRadius / 2) + } + Text(appIcon.nameLocalizedStringKey) + .foregroundColor(.secondary) + } + } + } + } + NavigationLink("preferences.notifications", + destination: NotificationPreferencesView(viewModel: viewModel)) + Picker("preferences.status-word", + selection: $identityContext.appPreferences.statusWord) { + ForEach(AppPreferences.StatusWord.allCases) { option in + Text(option.localizedStringKey).tag(option) + } + } + Toggle("preferences.show-reblog-and-favorite-counts", + isOn: $identityContext.appPreferences.showReblogAndFavoriteCounts) + Toggle("preferences.require-double-tap-to-reblog", + isOn: $identityContext.appPreferences.requireDoubleTapToReblog) + Toggle("preferences.require-double-tap-to-favorite", + isOn: $identityContext.appPreferences.requireDoubleTapToFavorite) + Toggle("preferences.links.open-in-default-browser", + isOn: $identityContext.appPreferences.openLinksInDefaultBrowser) + if !identityContext.appPreferences.openLinksInDefaultBrowser { + Toggle("preferences.links.use-universal-links", + isOn: $identityContext.appPreferences.useUniversalLinks) + } + if accessibilityReduceMotion { + Toggle("preferences.media.use-system-reduce-motion", + isOn: $identityContext.appPreferences.useSystemReduceMotionForMedia) } - } - Toggle("preferences.show-reblog-and-favorite-counts", - isOn: $identityContext.appPreferences.showReblogAndFavoriteCounts) - Toggle("preferences.require-double-tap-to-reblog", - isOn: $identityContext.appPreferences.requireDoubleTapToReblog) - Toggle("preferences.require-double-tap-to-favorite", - isOn: $identityContext.appPreferences.requireDoubleTapToFavorite) - Toggle("preferences.links.open-in-default-browser", - isOn: $identityContext.appPreferences.openLinksInDefaultBrowser) - if !identityContext.appPreferences.openLinksInDefaultBrowser { - Toggle("preferences.links.use-universal-links", - isOn: $identityContext.appPreferences.useUniversalLinks) - } - if accessibilityReduceMotion { - Toggle("preferences.media.use-system-reduce-motion", - isOn: $identityContext.appPreferences.useSystemReduceMotionForMedia) } Group { Picker("preferences.media.autoplay.gifs",