From 630a07f2160be2f9c61a6a9155464d14edf278a9 Mon Sep 17 00:00:00 2001 From: Graeme Arthur Date: Tue, 5 Dec 2023 20:31:34 +0100 Subject: [PATCH] Final NetP ship review feedback (#2221) --- .../Card-24.imageset/Card-24.pdf | Bin 0 -> 3152 bytes .../Card-24.imageset/Contents.json | 12 ++++++ .../16px}/Card-16.imageset/Card-16.pdf | Bin .../16px}/Card-16.imageset/Contents.json | 0 .../16px}/Rocket-16.imageset/Contents.json | 0 .../16px}/Rocket-16.imageset/Rocket-16.pdf | Bin .../16px}/Shield-16.imageset/Contents.json | 0 .../16px}/Shield-16.imageset/Shield-16.pdf | Bin .../24px/Rocket-24.imageset/Contents.json | 12 ++++++ .../24px/Rocket-24.imageset/Rocket-24.pdf | Bin 0 -> 3588 bytes DuckDuckGo/NetworkProtectionInviteView.swift | 4 +- DuckDuckGo/NetworkProtectionStatusView.swift | 2 +- .../NetworkProtectionVPNSettingsView.swift | 2 +- DuckDuckGo/UserText.swift | 8 ++-- ...listTermsAndConditionsViewController.swift | 2 +- DuckDuckGo/VPNWaitlistView.swift | 40 +++++++++--------- DuckDuckGo/VPNWaitlistViewController.swift | 2 +- DuckDuckGo/en.lproj/Localizable.strings | 12 ++---- 18 files changed, 57 insertions(+), 39 deletions(-) create mode 100644 DuckDuckGo/Assets.xcassets/Card-24.imageset/Card-24.pdf create mode 100644 DuckDuckGo/Assets.xcassets/Card-24.imageset/Contents.json rename DuckDuckGo/Assets.xcassets/{Waitlist/VPN Waitlist => DesignSystemIcons/16px}/Card-16.imageset/Card-16.pdf (100%) rename DuckDuckGo/Assets.xcassets/{Waitlist/VPN Waitlist => DesignSystemIcons/16px}/Card-16.imageset/Contents.json (100%) rename DuckDuckGo/Assets.xcassets/{Waitlist/VPN Waitlist => DesignSystemIcons/16px}/Rocket-16.imageset/Contents.json (100%) rename DuckDuckGo/Assets.xcassets/{Waitlist/VPN Waitlist => DesignSystemIcons/16px}/Rocket-16.imageset/Rocket-16.pdf (100%) rename DuckDuckGo/Assets.xcassets/{Waitlist/VPN Waitlist => DesignSystemIcons/16px}/Shield-16.imageset/Contents.json (100%) rename DuckDuckGo/Assets.xcassets/{Waitlist/VPN Waitlist => DesignSystemIcons/16px}/Shield-16.imageset/Shield-16.pdf (100%) create mode 100644 DuckDuckGo/Assets.xcassets/DesignSystemIcons/24px/Rocket-24.imageset/Contents.json create mode 100644 DuckDuckGo/Assets.xcassets/DesignSystemIcons/24px/Rocket-24.imageset/Rocket-24.pdf diff --git a/DuckDuckGo/Assets.xcassets/Card-24.imageset/Card-24.pdf b/DuckDuckGo/Assets.xcassets/Card-24.imageset/Card-24.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f51391f32b45b8f0cd752aa26a6350ba70a1d90 GIT binary patch literal 3152 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: View where Content: .padding(.bottom, 16) interactiveContent() Spacer() - Text(UserText.netPInviteOnlyMessage) + Text(UserText.networkProtectionWaitlistAvailabilityDisclaimer) .foregroundColor(.init(designSystemColor: .textSecondary)) .daxFootnoteRegular() .multilineTextAlignment(.center) @@ -130,7 +130,7 @@ private struct NetworkProtectionInviteMessageData { let imageIdentifier: String let title: String let message: String - let footer = UserText.netPInviteOnlyMessage + let footer = UserText.networkProtectionWaitlistAvailabilityDisclaimer } extension AnyTransition { diff --git a/DuckDuckGo/NetworkProtectionStatusView.swift b/DuckDuckGo/NetworkProtectionStatusView.swift index ab0698aa52..fe6289cd1e 100644 --- a/DuckDuckGo/NetworkProtectionStatusView.swift +++ b/DuckDuckGo/NetworkProtectionStatusView.swift @@ -154,7 +154,7 @@ struct NetworkProtectionStatusView: View { @ViewBuilder private func inviteOnlyFooter() -> some View { // Needs to be inlined like this for the markdown parsing to work - Text("\(UserText.netPInviteOnlyMessage) [\(UserText.netPStatusViewShareFeedback)](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)") + Text("\(UserText.networkProtectionWaitlistAvailabilityDisclaimer) [\(UserText.netPStatusViewShareFeedback)](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)") .foregroundColor(.init(designSystemColor: .textSecondary)) .accentColor(.init(designSystemColor: .accent)) .daxFootnoteRegular() diff --git a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift index ee080da61b..439f75b93a 100644 --- a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift +++ b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift @@ -39,7 +39,7 @@ struct NetworkProtectionVPNSettingsView: View { Text(string) } VStack(alignment: .leading) { - Text(UserText.netPPreferredLocationSettingTitle) + Text(UserText.netPVPNLocationTitle) .daxBodyRegular() .foregroundColor(.init(designSystemColor: .textPrimary)) Text(viewModel.preferredLocation.title) diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift index e603b23c24..61b31851ec 100644 --- a/DuckDuckGo/UserText.swift +++ b/DuckDuckGo/UserText.swift @@ -627,7 +627,6 @@ In addition to the details entered into this form, your app issue report will co static let netPInviteFieldPrompt = NSLocalizedString("network.protection.invite.field.prompt", value: "Invite Code", comment: "Prompt for the network protection invite code text field") static let netPInviteSuccessTitle = NSLocalizedString("network.protection.invite.success.title", value: "Success! You’re in.", comment: "Title for the network protection invite success view") static let netPInviteSuccessMessage = NSLocalizedString("network.protection.invite.success.message", value: "Hide your location from websites and conceal your online activity from Internet providers and others on your network.", comment: "Message for the network protection invite success view") - static let netPInviteOnlyMessage = NSLocalizedString("network.protection.invite.only.message", value: "DuckDuckGo Network Protection is currently invite-only.", comment: "Message explaining that netP is invite only") static let netPStatusViewTitle = NSLocalizedString("network.protection.status.view.title", value: "Network Protection", comment: "Title label text for the status view when netP is disconnected") static let netPStatusHeaderTitleOff = NSLocalizedString("network.protection.status.header.title.off", value: "Network Protection is Off", comment: "Header title label text for the status view when netP is disconnected") @@ -650,7 +649,7 @@ In addition to the details entered into this form, your app issue report will co return localized.format(arguments: city, country) } static let netPVPNNotificationsTitle = NSLocalizedString("network.protection.vpn.notifications.title", value: "VPN Notifications", comment: "Title for the VPN Notifications management screen.") - static let netPStatusViewShareFeedback = NSLocalizedString("network.protection.status.menu.share.feedback", value: "Share Feedback", comment: "The status view 'Share Feedback' button which is shown inline on the status view after the \(netPInviteOnlyMessage) text") + static let netPStatusViewShareFeedback = NSLocalizedString("network.protection.status.menu.share.feedback", value: "Share Feedback", comment: "The status view 'Share Feedback' button which is shown inline on the status view after the temporary free use footer text") static let netPStatusViewErrorConnectionFailedTitle = NSLocalizedString("network.protection.status.view.error.connection.failed.title", value: "Failed to Connect.", comment: "Generic connection failed error title shown in NetworkProtection's status view.") static let netPStatusViewErrorConnectionFailedMessage = NSLocalizedString("network.protection.status.view.error.connection.failed.message", value: "Please try again later.", comment: "Generic connection failed error message shown in NetworkProtection's status view.") static let netPPreferredLocationSettingTitle = NSLocalizedString("network.protection.vpn.preferred.location.title", value: "Preferred Location", comment: "Title for the Preferred Location VPN Settings item.") @@ -665,9 +664,9 @@ In addition to the details entered into this form, your app issue report will co return message.format(arguments: count) } static let netPExcludeLocalNetworksSettingTitle = NSLocalizedString("network.protection.vpn.exclude.local.networks.setting.title", value: "Exclude Local Networks", comment: "Title for the Exclude Local Networks setting item.") - static let netPExcludeLocalNetworksSettingFooter = NSLocalizedString("network.protection.vpn.exclude.local.networks.setting.footer", value: "Bypass the VPN for local network connections, like to a printer.", comment: "Footer text for the Exclude Local Networks setting item.") + static let netPExcludeLocalNetworksSettingFooter = NSLocalizedString("network.protection.vpn.exclude.local.networks.setting.footer", value: "Let local traffic bypass the VPN and connect to devices on your local network, like a printer.", comment: "Footer text for the Exclude Local Networks setting item.") static let netPSecureDNSSettingFooter = NSLocalizedString("network.protection.vpn.secure.dns.setting.footer", value: "Our VPN uses Secure DNS to keep your online activity private, so that your Internet provider can't see what websites you visit.", comment: "Footer text for the Always on VPN setting item.") - static let netPTurnOnNotificationsButtonTitle = NSLocalizedString("network.protection.turn.on.notifications.button.title", value: "Turn on Notifications", comment: "Title for the button to link to the iOS app settings and enable notifications app-wide.") + static let netPTurnOnNotificationsButtonTitle = NSLocalizedString("network.protection.turn.on.notifications.button.title", value: "Turn On Notifications", comment: "Title for the button to link to the iOS app settings and enable notifications app-wide.") static let netPTurnOnNotificationsSectionFooter = NSLocalizedString("network.protection.turn.on.notifications.section.footer", value: "Allow DuckDuckGo to notify you if your connection drops or VPN status changes.", comment: "Footer text under the button to link to the iOS app settings and enable notifications app-wide.") static let netPVPNAlertsToggleTitle = NSLocalizedString("network.protection.vpn.alerts.toggle.title", value: "VPN Alerts", comment: "Title for the toggle for VPN alerts.") static let netPVPNAlertsToggleSectionFooter = NSLocalizedString("network.protection.vpn.alerts.toggle.section.footer", value: "Get notified if your connection drops or VPN status changes.", comment: "List section footer for the toggle for VPN alerts.") @@ -894,7 +893,6 @@ But if you *do* want a peek under the hood, you can find more information about // MARK: - VPN Waitlist - static let networkProtectionWaitlistJoinTitle = NSLocalizedString("network-protection.waitlist.join.title", value: "Network Protection Early Access", comment: "Title for Network Protection join waitlist screen") static let networkProtectionWaitlistJoinSubtitle1 = NSLocalizedString("network-protection.waitlist.join.subtitle.1", value: "Secure your connection anytime, anywhere with Network Protection, the VPN from DuckDuckGo.", comment: "First subtitle for Network Protection join waitlist screen") static let networkProtectionWaitlistJoinSubtitle2 = NSLocalizedString("network-protection.waitlist.join.subtitle.2", value: "Join the waitlist, and we’ll notify you when it’s your turn.", comment: "Second subtitle for Network Protection join waitlist screen") diff --git a/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift b/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift index 2dc044aa24..bbdd441eb3 100644 --- a/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift +++ b/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift @@ -38,7 +38,7 @@ final class VPNWaitlistTermsAndConditionsViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - title = UserText.networkProtectionWaitlistJoinTitle + title = UserText.netPNavTitle addHostingControllerToViewHierarchy() DailyPixel.fire(pixel: .networkProtectionWaitlistTermsDisplayed) diff --git a/DuckDuckGo/VPNWaitlistView.swift b/DuckDuckGo/VPNWaitlistView.swift index 3e5bb91b92..d88e9e5557 100644 --- a/DuckDuckGo/VPNWaitlistView.swift +++ b/DuckDuckGo/VPNWaitlistView.swift @@ -64,7 +64,7 @@ struct VPNWaitlistSignUpView: View { GeometryReader { proxy in ScrollView { VStack(alignment: .center, spacing: 8) { - HeaderView(imageName: "JoinVPNWaitlist", title: UserText.networkProtectionWaitlistJoinTitle) + HeaderView(imageName: "JoinVPNWaitlist", title: UserText.netPNavTitle) Text(UserText.networkProtectionWaitlistJoinSubtitle1) .daxBodyRegular() @@ -87,7 +87,7 @@ struct VPNWaitlistSignUpView: View { action(.custom(.openNetworkProtectionInviteCodeScreen)) }) .buttonStyle(RoundedButtonStyle(enabled: true, style: .bordered)) - .padding(.top, 18) + .padding(.top, 16) if requestInFlight { HStack { @@ -99,13 +99,11 @@ struct VPNWaitlistSignUpView: View { } .padding(.top, 14) } - + Spacer() Text(UserText.networkProtectionWaitlistAvailabilityDisclaimer) .font(.footnote) .foregroundStyle(Color.secondary) .padding(.top, 24) - - Spacer() } .padding([.leading, .trailing], 24) .frame(minHeight: proxy.size.height) @@ -181,17 +179,22 @@ private struct AllowNotificationsView: View { .fixMultilineScrollableText() .lineSpacing(5) - Button(UserText.waitlistAllowNotifications) { + + Button { action(.openNotificationSettings) + } label: { + HStack { + Image("Bell-16") + Text(UserText.waitlistAllowNotifications) + .daxButton() + } } .buttonStyle(RoundedButtonStyle(enabled: true)) - } - .padding(24) + .padding(20) .background(Color.waitlistNotificationBackground) .cornerRadius(8) .shadow(color: .black.opacity(0.05), radius: 12, x: 0, y: 4) - } } @@ -208,17 +211,17 @@ struct VPNWaitlistInvitedView: View { let benefitsList: [VPNWaitlistBenefit] = [ .init( - imageName: "Shield-16", + imageName: "Shield-24", title: UserText.networkProtectionWaitlistInvitedSection1Title, subtitle: UserText.networkProtectionWaitlistInvitedSection1Subtitle ), .init( - imageName: "Rocket-16", + imageName: "Rocket-24", title: UserText.networkProtectionWaitlistInvitedSection2Title, subtitle: UserText.networkProtectionWaitlistInvitedSection2Subtitle ), .init( - imageName: "Card-16", + imageName: "Card-24", title: UserText.networkProtectionWaitlistInvitedSection3Title, subtitle: UserText.networkProtectionWaitlistInvitedSection3Subtitle ), @@ -232,7 +235,10 @@ struct VPNWaitlistInvitedView: View { GeometryReader { proxy in ScrollView { VStack(alignment: .center, spacing: 0) { - HeaderView(imageName: "InvitedVPNWaitlist", title: UserText.networkProtectionWaitlistInvitedTitle) + HeaderView( + imageName: "InvitedVPNWaitlist", + title: UserText.networkProtectionWaitlistInvitedTitle + ) Text(UserText.networkProtectionWaitlistInvitedSubtitle) .daxBodyRegular() @@ -249,14 +255,11 @@ struct VPNWaitlistInvitedView: View { Button(UserText.networkProtectionWaitlistGetStarted, action: { action(.custom(.openNetworkProtectionPrivacyPolicyScreen)) }) .buttonStyle(RoundedButtonStyle(enabled: true)) .padding(.top, 32) - + Spacer() Text(UserText.networkProtectionWaitlistAvailabilityDisclaimer) .font(.footnote) - .foregroundStyle(Color.secondary) + .foregroundStyle(Color(designSystemColor: .textSecondary)) .padding(.top, 24) - - Spacer() - } .frame(maxWidth: .infinity, minHeight: proxy.size.height) .padding([.leading, .trailing], 18) @@ -344,7 +347,6 @@ private struct WaitlistListEntryView: View { var body: some View { HStack(alignment: .center, spacing: 16) { Image(viewData.imageName) - .frame(maxWidth: 16, maxHeight: 16) VStack(alignment: .leading, spacing: 2) { Text(viewData.title) diff --git a/DuckDuckGo/VPNWaitlistViewController.swift b/DuckDuckGo/VPNWaitlistViewController.swift index c25153108b..f982f1bac4 100644 --- a/DuckDuckGo/VPNWaitlistViewController.swift +++ b/DuckDuckGo/VPNWaitlistViewController.swift @@ -42,7 +42,7 @@ final class VPNWaitlistViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - title = UserText.networkProtectionWaitlistJoinTitle + title = UserText.netPNavTitle addHostingControllerToViewHierarchy() diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings index b9cf565057..bf60cfb7fe 100644 --- a/DuckDuckGo/en.lproj/Localizable.strings +++ b/DuckDuckGo/en.lproj/Localizable.strings @@ -1495,9 +1495,6 @@ https://duckduckgo.com/mac"; /* Second subtitle for Network Protection join waitlist screen */ "network-protection.waitlist.join.subtitle.2" = "Join the waitlist, and we’ll notify you when it’s your turn."; -/* Title for Network Protection join waitlist screen */ -"network-protection.waitlist.join.title" = "Network Protection Early Access"; - /* Title for Network Protection joined waitlist screen */ "network-protection.waitlist.joined.title" = "You’re on the list!"; @@ -1540,9 +1537,6 @@ https://duckduckgo.com/mac"; /* Prompt for the network protection invite code text field */ "network.protection.invite.field.prompt" = "Invite Code"; -/* Message explaining that netP is invite only */ -"network.protection.invite.only.message" = "DuckDuckGo Network Protection is currently invite-only."; - /* Message for the network protection invite success view */ "network.protection.invite.success.message" = "Hide your location from websites and conceal your online activity from Internet providers and others on your network."; @@ -1573,7 +1567,7 @@ https://duckduckgo.com/mac"; /* Header title label text for the status view when netP is connected */ "network.protection.status.header.title.on" = "Network Protection is On"; -/* The status view 'Share Feedback' button which is shown inline on the status view after the \(netPInviteOnlyMessage) text */ +/* The status view 'Share Feedback' button which is shown inline on the status view after the temporary free use footer text */ "network.protection.status.menu.share.feedback" = "Share Feedback"; /* Connection details label shown in NetworkProtection's status view. */ @@ -1598,7 +1592,7 @@ https://duckduckgo.com/mac"; "network.protection.status.view.title" = "Network Protection"; /* Title for the button to link to the iOS app settings and enable notifications app-wide. */ -"network.protection.turn.on.notifications.button.title" = "Turn on Notifications"; +"network.protection.turn.on.notifications.button.title" = "Turn On Notifications"; /* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */ "network.protection.turn.on.notifications.section.footer" = "Allow DuckDuckGo to notify you if your connection drops or VPN status changes."; @@ -1610,7 +1604,7 @@ https://duckduckgo.com/mac"; "network.protection.vpn.alerts.toggle.title" = "VPN Alerts"; /* Footer text for the Exclude Local Networks setting item. */ -"network.protection.vpn.exclude.local.networks.setting.footer" = "Bypass the VPN for local network connections, like to a printer."; +"network.protection.vpn.exclude.local.networks.setting.footer" = "Let local traffic bypass the VPN and connect to devices on your local network, like a printer."; /* Title for the Exclude Local Networks setting item. */ "network.protection.vpn.exclude.local.networks.setting.title" = "Exclude Local Networks";