diff --git a/CHANGELOG.md b/CHANGELOG.md index 8689fe3..7c2dfc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [v1.2.1] - 2025-02-20 + +### addy.io + +**Added** +- Added the ability to only copy the email addresses when sending mail from the app + ## [v1.2.0] - 2025-02-01 ### addy.io diff --git a/addy.xcodeproj/project.pbxproj b/addy.xcodeproj/project.pbxproj index 2504e02..ea17f5f 100644 --- a/addy.xcodeproj/project.pbxproj +++ b/addy.xcodeproj/project.pbxproj @@ -1769,7 +1769,7 @@ CODE_SIGN_ENTITLEMENTS = addy/addy.debug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_ASSET_PATHS = "\"addy/Preview Content\""; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_PREVIEWS = YES; @@ -1789,7 +1789,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.debug; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1809,7 +1809,7 @@ CODE_SIGN_ENTITLEMENTS = AddyStatisticWidgetExtension.debug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_USER_SCRIPT_SANDBOXING = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1823,7 +1823,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.debug.AddyStatisticWidget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1840,7 +1840,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.debug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_USER_SCRIPT_SANDBOXING = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1854,7 +1854,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.debug.AddyShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1950,7 +1950,7 @@ CODE_SIGN_ENTITLEMENTS = addy/addy.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_ASSET_PATHS = "\"addy/Preview Content\""; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_PREVIEWS = YES; @@ -1970,7 +1970,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1990,7 +1990,7 @@ CODE_SIGN_ENTITLEMENTS = AddyStatisticWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_USER_SCRIPT_SANDBOXING = YES; GENERATE_INFOPLIST_FILE = YES; @@ -2004,7 +2004,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.AddyStatisticWidget; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2022,7 +2022,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_USER_SCRIPT_SANDBOXING = YES; GENERATE_INFOPLIST_FILE = YES; @@ -2036,7 +2036,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.AddyShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2072,7 +2072,7 @@ CODE_SIGN_ENTITLEMENTS = AddyStatisticWidgetExtension.debug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_USER_SCRIPT_SANDBOXING = YES; GENERATE_INFOPLIST_FILE = YES; @@ -2086,7 +2086,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.debug.AddyStatisticWidget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -2105,7 +2105,7 @@ CODE_SIGN_ENTITLEMENTS = AddyStatisticWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_USER_SCRIPT_SANDBOXING = YES; GENERATE_INFOPLIST_FILE = YES; @@ -2119,7 +2119,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.AddyStatisticWidget; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2137,7 +2137,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.debug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_USER_SCRIPT_SANDBOXING = YES; GENERATE_INFOPLIST_FILE = YES; @@ -2151,7 +2151,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.debug.AddyShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2169,7 +2169,7 @@ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_USER_SCRIPT_SANDBOXING = YES; GENERATE_INFOPLIST_FILE = YES; @@ -2183,7 +2183,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.AddyShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2329,7 +2329,7 @@ CODE_SIGN_ENTITLEMENTS = addy/addy.debug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_ASSET_PATHS = "\"addy/Preview Content\""; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_PREVIEWS = YES; @@ -2349,7 +2349,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy.debug; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2370,7 +2370,7 @@ CODE_SIGN_ENTITLEMENTS = addy/addy.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_ASSET_PATHS = "\"addy/Preview Content\""; DEVELOPMENT_TEAM = 83RFSJ6CUP; ENABLE_PREVIEWS = YES; @@ -2390,7 +2390,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = host.stjin.addy; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/addy.xcodeproj/project.xcworkspace/xcuserdata/stjin.xcuserdatad/UserInterfaceState.xcuserstate b/addy.xcodeproj/project.xcworkspace/xcuserdata/stjin.xcuserdatad/UserInterfaceState.xcuserstate index 6a825fa..3389f09 100644 Binary files a/addy.xcodeproj/project.xcworkspace/xcuserdata/stjin.xcuserdatad/UserInterfaceState.xcuserstate and b/addy.xcodeproj/project.xcworkspace/xcuserdata/stjin.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/addy.xcodeproj/xcuserdata/stjin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/addy.xcodeproj/xcuserdata/stjin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index e866770..629c6e0 100644 --- a/addy.xcodeproj/xcuserdata/stjin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/addy.xcodeproj/xcuserdata/stjin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3140,54 +3140,6 @@ landmarkType = "7"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addy/Localizable.xcstrings b/addy/Localizable.xcstrings index e313389..14002f2 100644 --- a/addy/Localizable.xcstrings +++ b/addy/Localizable.xcstrings @@ -850,7 +850,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "**What’s new in addy.io for iOS 1.2.0**\n\n**Added**\n- Added the ability to change the default tab to open on app launch\n- Added the ability to download failed deliveries (if enabled)\n\n**Fixed/Improved**\n- Improve wording of dates in alias list" + "value" : "**What’s new in addy.io for iOS 1.2.1**\n\n**Added**\n- Added the ability to only copy the email addresses when sending mail from the app" } } } diff --git a/addy/View/aliases/AliasesView.swift b/addy/View/aliases/AliasesView.swift index fc12fe6..c5f0a48 100644 --- a/addy/View/aliases/AliasesView.swift +++ b/addy/View/aliases/AliasesView.swift @@ -304,9 +304,11 @@ struct AliasesView: View { } .sheet(item: $aliasToSendMailFrom) { alias in NavigationStack { - EditAliasSendMailRecipientBottomSheet(aliasEmail: alias.email) { addresses in + EditAliasSendMailRecipientBottomSheet(aliasEmail: alias.email, onPressSend: { addresses in self.onPressSend(client:nil, sendToRecipients: addresses) - } + }, onPressCopy: { addresses in + self.onPressCopy(sendToRecipients: addresses) + }) } .presentationDetents([.large]) @@ -621,6 +623,25 @@ struct AliasesView: View { } } + private func onPressCopy(sendToRecipients: String) { + + // aliasToSendMailFrom will be set to nil when the EditAliasSendMailRecipientBottomSheet gets dismissed, therefore we make a copy of the item and + // return if both are nil + guard let alias = aliasToSendMailFrom ?? aliasToSendMailFromCopy else {return} + + // Get recipients + let recipients = AnonAddyUtils.getSendAddress(recipientEmails: sendToRecipients.split(separator: ",").map { String($0) }, alias: alias) + + // Copy the email addresses to clipboard + UIPasteboard.general.setValue(recipients.joined(separator: ";"),forPasteboardType: UTType.plainText.identifier) + showCopiedToClipboardAnimation() + + // Set aliasToSendMailFromCopy to nil + aliasToSendMailFromCopy = nil + + aliasToSendMailFrom = nil + } + private func activateAlias(alias: Aliases) async { let networkHelper = NetworkHelper() do { diff --git a/addy/View/aliases/manage/AliasDetailView.swift b/addy/View/aliases/manage/AliasDetailView.swift index 941f88b..1690ed7 100644 --- a/addy/View/aliases/manage/AliasDetailView.swift +++ b/addy/View/aliases/manage/AliasDetailView.swift @@ -375,11 +375,13 @@ struct AliasDetailView: View { } .sheet(isPresented: $isPresentingEditAliasSendMailRecipientBottomSheet) { NavigationStack { - EditAliasSendMailRecipientBottomSheet(aliasEmail: alias.email){ addresses in + EditAliasSendMailRecipientBottomSheet(aliasEmail: alias.email, onPressSend: { addresses in self.onPressSend(client: nil, sendToRecipients: addresses) isPresentingEditAliasSendMailRecipientBottomSheet = false - - } + }, onPressCopy: { addresses in + self.onPressCopy(sendToRecipients: addresses) + isPresentingEditAliasSendMailRecipientBottomSheet = false + }) } .presentationDetents([.large]) } @@ -515,9 +517,7 @@ struct AliasDetailView: View { // Get recipients let recipients = AnonAddyUtils.getSendAddress(recipientEmails: sendToRecipients.split(separator: ",").map { String($0) }, alias: alias) - // Copy the email addresses to clipboard - UIPasteboard.general.setValue(recipients.joined(separator: ";"),forPasteboardType: UTType.plainText.identifier) - showCopiedToClipboardToast() + onPressCopy(sendToRecipients: sendToRecipients) // Prepare mailto URL let mailtoURL = client!.composeURL(to: recipients) @@ -528,6 +528,17 @@ struct AliasDetailView: View { } } + private func onPressCopy(sendToRecipients: String) { + guard let alias = alias else { return } + + // Get recipients + let recipients = AnonAddyUtils.getSendAddress(recipientEmails: sendToRecipients.split(separator: ",").map { String($0) }, alias: alias) + + // Copy the email addresses to clipboard + UIPasteboard.general.setValue(recipients.joined(separator: ";"),forPasteboardType: UTType.plainText.identifier) + showCopiedToClipboardToast() + } + func getRecipients(alias: Aliases) -> String{ // Set recipients var recipients: String = "" diff --git a/addy/View/aliases/manage/EditAliasSendMailRecipientBottomSheet.swift b/addy/View/aliases/manage/EditAliasSendMailRecipientBottomSheet.swift index a41ffbd..6b0cbe7 100644 --- a/addy/View/aliases/manage/EditAliasSendMailRecipientBottomSheet.swift +++ b/addy/View/aliases/manage/EditAliasSendMailRecipientBottomSheet.swift @@ -12,10 +12,12 @@ import AVFoundation struct EditAliasSendMailRecipientBottomSheet: View { @State private var aliasEmail: String let onPressSend: (String) -> Void + let onPressCopy: (String) -> Void - init(aliasEmail: String, onPressSend: @escaping (String) -> Void) { + init(aliasEmail: String, onPressSend: @escaping (String) -> Void, onPressCopy: @escaping (String) -> Void) { self.aliasEmail = aliasEmail self.onPressSend = onPressSend + self.onPressCopy = onPressCopy } @State private var addressesValidationError:String? @@ -44,14 +46,30 @@ struct EditAliasSendMailRecipientBottomSheet: View { Section { - AddyButton(action: { - // Only perform the action whent the addresses are valid - if (addressesValidationError == nil){ - self.onPressSend(self.addresses) + HStack{ + AddyButton(action: { + // Only perform the action whent the addresses are valid + if (addressesValidationError == nil){ + self.onPressSend(self.addresses) + } + }) { + Text(String(localized: "send")).foregroundColor(Color.white) } - }) { - Text(String(localized: "send")).foregroundColor(Color.white) + + Button() { + // Only perform the action whent the addresses are valid + if (addressesValidationError == nil){ + self.onPressCopy(self.addresses) + } + } label: { + Image(systemName: "clipboard.fill") + } + .buttonStyle(.bordered) + .controlSize(.large) + .buttonBorderShape(.circle) + }.frame(minHeight: 56) + }.listRowBackground(Color.clear).listRowInsets(EdgeInsets()) @@ -74,6 +92,8 @@ struct EditAliasSendMailRecipientBottomSheet: View { #Preview { EditAliasSendMailRecipientBottomSheet(aliasEmail: "TEST", onPressSend: { alias in - // Dummy function for preview + print("SEND") + }, onPressCopy: { alias in + print("COPY") }) } diff --git a/altsource/altsource.json b/altsource/altsource.json index 155a7cd..29ae2d1 100644 --- a/altsource/altsource.json +++ b/altsource/altsource.json @@ -27,6 +27,14 @@ "https://github.com/anonaddy/addy-ios/blob/master/altsource/screenshots/6.png?raw=true", ], "versions": [ + { + "version": "1.2.1", + "date": "2025-02-20T00:00:00+02:00", + "size": 20901930, + "downloadURL": "https://github.com/anonaddy/addy-ios/raw/ed7e3daa2fdf5c7a17644141386a3eae03bcca89/builds/appstorelessRelease%202025-02-20%2021-04-08/addy.ipa", + "localizedDescription": "Added the ability to only copy the email addresses when sending mail from the app", + "minOSVersion": "17.0" + }, { "version": "1.2.0", "date": "2025-02-01T00:00:00+02:00", diff --git a/builds/appstorelessRelease 2025-02-01 15-54-48/addy.ipa b/builds/appstorelessRelease 2025-02-20 21-04-08/addy.ipa similarity index 86% rename from builds/appstorelessRelease 2025-02-01 15-54-48/addy.ipa rename to builds/appstorelessRelease 2025-02-20 21-04-08/addy.ipa index 127643c..a977dc9 100644 Binary files a/builds/appstorelessRelease 2025-02-01 15-54-48/addy.ipa and b/builds/appstorelessRelease 2025-02-20 21-04-08/addy.ipa differ