Skip to content

Commit 7d8d56a

Browse files
committed
Merge branch 'release/2.7.1'
2 parents 277f3a7 + d15c618 commit 7d8d56a

File tree

24 files changed

+232
-60
lines changed

24 files changed

+232
-60
lines changed

Cryptomator.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3376,7 +3376,7 @@
33763376
GCC_WARN_UNUSED_FUNCTION = YES;
33773377
GCC_WARN_UNUSED_VARIABLE = YES;
33783378
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
3379-
MARKETING_VERSION = 2.7.0;
3379+
MARKETING_VERSION = 2.7.1;
33803380
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
33813381
MTL_FAST_MATH = YES;
33823382
ONLY_ACTIVE_ARCH = YES;
@@ -3438,7 +3438,7 @@
34383438
GCC_WARN_UNUSED_FUNCTION = YES;
34393439
GCC_WARN_UNUSED_VARIABLE = YES;
34403440
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
3441-
MARKETING_VERSION = 2.7.0;
3441+
MARKETING_VERSION = 2.7.1;
34423442
MTL_ENABLE_DEBUG_INFO = NO;
34433443
MTL_FAST_MATH = YES;
34443444
OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-expression-type-checking=200 -Xfrontend -warn-long-function-bodies=200";

Cryptomator/Common/CloudAccountList/AccountListViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ class AccountListViewController: ListViewController<AccountCellContent>, ASWebAu
142142

143143
private func supportsEditing(_ cloudProviderType: CloudProviderType) -> Bool {
144144
switch cloudProviderType {
145-
case .box, .dropbox, .googleDrive, .localFileSystem, .microsoftGraph(type: .oneDrive), .microsoftGraph(type: .sharePoint), .pCloud:
145+
case .box, .dropbox, .googleDrive, .localFileSystem, .microsoftGraph, .pCloud:
146146
return false
147147
case .s3, .webDAV:
148148
return true

Cryptomator/MainCoordinator.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class MainCoordinator: NSObject, Coordinator, UINavigationControllerDelegate {
7878
rootViewController.showDetailViewController(detailNavigationController, sender: nil)
7979
}
8080

81-
// Temporarily added for Spring 2025 Sale
81+
// Temporarily added for Summer 2025 Sale
8282
func showPurchase() {
8383
let modalNavigationController = BaseNavigationController()
8484
let child = PurchaseCoordinator(navigationController: modalNavigationController)
@@ -124,7 +124,7 @@ extension MainCoordinator: StoreObserverDelegate {
124124
switch transaction {
125125
case .fullVersion, .yearlySubscription:
126126
showFullVersionAlert()
127-
// Temporarily added for Spring 2025 Sale
127+
// Temporarily added for Summer 2025 Sale
128128
NotificationCenter.default.post(name: .purchasedFullVersionNotification, object: nil)
129129
case let .freeTrial(expiresOn):
130130
showTrialAlert(expirationDate: expiresOn)

Cryptomator/Purchase/PurchaseCoordinator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class PurchaseCoordinator: Coordinator {
5454
}
5555
self.unlockedPro()
5656
}
57-
// Temporarily added for Spring 2025 Sale
57+
// Temporarily added for Summer 2025 Sale
5858
NotificationCenter.default.post(name: .purchasedFullVersionNotification, object: nil)
5959
}
6060

Cryptomator/Purchase/PurchaseViewModel.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ class PurchaseViewModel: BaseIAPViewModel, ProductFetching {
3333
return LocalizedString.getValue("purchase.title")
3434
}
3535

36-
// Temporarily added for Spring 2025 Sale
36+
// Temporarily added for Summer 2025 Sale
3737
override var infoText: NSAttributedString? {
38-
if SalePromo.isSpring2025Active() {
38+
if SalePromo.isSummer2025Active() {
3939
return NSAttributedString(
4040
string: "*Note: The discount amount may vary by region.",
4141
attributes: [
@@ -91,8 +91,8 @@ class PurchaseViewModel: BaseIAPViewModel, ProductFetching {
9191

9292
private func addLifetimeLicenseItem() {
9393
if let product = products[.fullVersion], let localizedPrice = product.localizedPrice {
94-
// Temporarily added for Spring 2025 Sale
95-
let productDetail = SalePromo.isSpring2025Active() ? "\(SalePromo.spring2025Emoji) \(SalePromo.spring2025Discount)" : nil
94+
// Temporarily added for Summer 2025 Sale
95+
let productDetail = SalePromo.isSummer2025Active() ? "\(SalePromo.summer2025Emoji) \(SalePromo.summer2025Discount)" : nil
9696
let viewModel = PurchaseCellViewModel(productName: LocalizedString.getValue("purchase.product.lifetimeLicense"),
9797
productDetail: productDetail,
9898
price: localizedPrice,

Cryptomator/Purchase/SalePromo.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@ struct SalePromo {
1313
@Dependency(\.cryptomatorSettings) private var cryptomatorSettings
1414

1515
static let shared = SalePromo()
16-
static let spring2025Emoji = "🌸"
17-
static let spring2025Discount = "25%* off until March 31"
16+
static let summer2025Emoji = "☀️"
17+
static let summer2025Discount = "25%* off until June 30"
1818

19-
static func isSpring2025Active() -> Bool {
20-
let saleStartComponents = DateComponents(year: 2025, month: 3, day: 20)
21-
let saleEndComponents = DateComponents(year: 2025, month: 3, day: 31)
19+
static func isSummer2025Active() -> Bool {
20+
let saleStartComponents = DateComponents(year: 2025, month: 6, day: 1)
21+
let saleEndComponents = DateComponents(year: 2025, month: 6, day: 30)
2222
guard let saleStartDate = Calendar.current.date(from: saleStartComponents), let saleEndDate = Calendar.current.date(from: saleEndComponents) else {
2323
return false
2424
}
2525
let now = Date()
2626
return now >= saleStartDate && now <= saleEndDate
2727
}
2828

29-
func shouldShowSpring2025Banner() -> Bool {
29+
func shouldShowSummer2025Banner() -> Bool {
3030
#if !ALWAYS_PREMIUM
31-
return SalePromo.isSpring2025Active() && !(cryptomatorSettings.fullVersionUnlocked || cryptomatorSettings.hasRunningSubscription) && !cryptomatorSettings.spring2025BannerDismissed
31+
return SalePromo.isSummer2025Active() && !(cryptomatorSettings.fullVersionUnlocked || cryptomatorSettings.hasRunningSubscription) && !cryptomatorSettings.summer2025BannerDismissed
3232
#else
3333
return false
3434
#endif

Cryptomator/VaultList/VaultListViewController.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class VaultListViewController: ListViewController<VaultCellViewModel> {
2121
@Dependency(\.fullVersionChecker) private var fullVersionChecker
2222

2323
#if !ALWAYS_PREMIUM
24-
private var spring2025BannerView: UIView?
24+
private var summer2025BannerView: UIView?
2525
private var fullVersionPurchasedObserver: NSObjectProtocol?
2626
#endif
2727

@@ -57,10 +57,10 @@ class VaultListViewController: ListViewController<VaultCellViewModel> {
5757

5858
#if !ALWAYS_PREMIUM
5959
fullVersionPurchasedObserver = NotificationCenter.default.addObserver(forName: .purchasedFullVersionNotification, object: nil, queue: .main) { [weak self] _ in
60-
self?.dismissSpring2025Banner()
60+
self?.dismissSummer2025Banner()
6161
}
62-
if SalePromo.shared.shouldShowSpring2025Banner() {
63-
showSpring2025Banner()
62+
if SalePromo.shared.shouldShowSummer2025Banner() {
63+
showSummer2025Banner()
6464
}
6565
#endif
6666
}
@@ -126,21 +126,21 @@ class VaultListViewController: ListViewController<VaultCellViewModel> {
126126
// MARK: - Sale Promo Banner
127127

128128
#if !ALWAYS_PREMIUM
129-
private func showSpring2025Banner() {
129+
private func showSummer2025Banner() {
130130
let banner = UIView()
131131
banner.backgroundColor = UIColor.cryptomatorPrimary
132132
banner.translatesAutoresizingMaskIntoConstraints = false
133133
banner.layer.cornerRadius = 12
134134
banner.layer.masksToBounds = true
135135

136136
let emojiLabel = UILabel()
137-
emojiLabel.text = SalePromo.spring2025Emoji
137+
emojiLabel.text = SalePromo.summer2025Emoji
138138
emojiLabel.translatesAutoresizingMaskIntoConstraints = false
139139
emojiLabel.setContentHuggingPriority(.required, for: .horizontal)
140140
emojiLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
141141

142142
let textLabel = UILabel()
143-
textLabel.text = "Lifetime License is \(SalePromo.spring2025Discount)!"
143+
textLabel.text = "Lifetime License is \(SalePromo.summer2025Discount)!"
144144
textLabel.textColor = .white
145145
textLabel.font = UIFont.preferredFont(forTextStyle: .footnote)
146146
textLabel.adjustsFontSizeToFitWidth = true
@@ -149,7 +149,7 @@ class VaultListViewController: ListViewController<VaultCellViewModel> {
149149
textLabel.translatesAutoresizingMaskIntoConstraints = false
150150

151151
let dismissButton = UIButton(type: .close)
152-
dismissButton.addTarget(self, action: #selector(dismissSpring2025Banner), for: .touchUpInside)
152+
dismissButton.addTarget(self, action: #selector(dismissSummer2025Banner), for: .touchUpInside)
153153
dismissButton.translatesAutoresizingMaskIntoConstraints = false
154154
dismissButton.setContentHuggingPriority(.required, for: .horizontal)
155155
dismissButton.setContentCompressionResistancePriority(.required, for: .horizontal)
@@ -170,7 +170,7 @@ class VaultListViewController: ListViewController<VaultCellViewModel> {
170170
dismissButton.centerYAnchor.constraint(equalTo: banner.centerYAnchor)
171171
])
172172

173-
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(spring2025BannerTapped))
173+
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(summer2025BannerTapped))
174174
banner.addGestureRecognizer(tapGestureRecognizer)
175175

176176
view.addSubview(banner)
@@ -183,20 +183,20 @@ class VaultListViewController: ListViewController<VaultCellViewModel> {
183183
banner.heightAnchor.constraint(equalToConstant: 50)
184184
])
185185

186-
spring2025BannerView = banner
186+
summer2025BannerView = banner
187187
}
188188

189-
@objc private func dismissSpring2025Banner() {
189+
@objc private func dismissSummer2025Banner() {
190190
UIView.animate(withDuration: 0.3, animations: {
191-
self.spring2025BannerView?.alpha = 0
191+
self.summer2025BannerView?.alpha = 0
192192
}, completion: { _ in
193-
self.spring2025BannerView?.removeFromSuperview()
194-
self.spring2025BannerView = nil
193+
self.summer2025BannerView?.removeFromSuperview()
194+
self.summer2025BannerView = nil
195195
})
196-
CryptomatorUserDefaults.shared.spring2025BannerDismissed = true
196+
CryptomatorUserDefaults.shared.summer2025BannerDismissed = true
197197
}
198198

199-
@objc private func spring2025BannerTapped() {
199+
@objc private func summer2025BannerTapped() {
200200
coordinator?.showPurchase()
201201
}
202202
#endif

CryptomatorCommon/Sources/CryptomatorCommonCore/CryptomatorKeychain.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ class CryptomatorKeychain: CryptomatorKeychainType {
2525
static let bundleId = CryptomatorConstants.mainAppBundleId
2626
static let box = CryptomatorKeychain(service: "box.auth")
2727
static let pCloud = CryptomatorKeychain(service: "pCloud.auth")
28-
static let microsoftGraph = CryptomatorKeychain(service: "microsoftGraph.auth")
2928
static let s3 = CryptomatorKeychain(service: "s3.auth")
3029
static let webDAV = CryptomatorKeychain(service: "webDAV.auth")
3130
static let localFileSystem = CryptomatorKeychain(service: "localFileSystem.auth")

CryptomatorCommon/Sources/CryptomatorCommonCore/CryptomatorUserDefaults.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public protocol CryptomatorSettings {
1616
var fullVersionUnlocked: Bool { get set }
1717
var hasRunningSubscription: Bool { get set }
1818
#if !ALWAYS_PREMIUM
19-
var spring2025BannerDismissed: Bool { get set }
19+
var summer2025BannerDismissed: Bool { get set }
2020
#endif
2121
}
2222

@@ -113,7 +113,7 @@ extension CryptomatorUserDefaults: CryptomatorSettings {
113113
}
114114

115115
#if !ALWAYS_PREMIUM
116-
public var spring2025BannerDismissed: Bool {
116+
public var summer2025BannerDismissed: Bool {
117117
get { read() ?? false }
118118
set { write(value: newValue) }
119119
}

CryptomatorCommon/Sources/CryptomatorCommonCore/Mocks/CryptomatorSettingsMock.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class CryptomatorSettingsMock: CryptomatorSettings {
1515
var fullVersionUnlocked: Bool = false
1616
var hasRunningSubscription: Bool = false
1717
#if !ALWAYS_PREMIUM
18-
var spring2025BannerDismissed: Bool = false
18+
var summer2025BannerDismissed: Bool = false
1919
#endif
2020
}
2121
#endif

0 commit comments

Comments
 (0)