Skip to content

Commit

Permalink
Release 17.10.0 (#3049)
Browse files Browse the repository at this point in the history
* Themed delete button and back button

* Add flag stub and fix comment

* Conform to CustomStringConvertible for easier debugging

* Add the flag

* Remove mysterious newline

* Add additional tests

* Backport implementation

* Update CHANGELOG

* Bump version to 17.10.0

* Add xcbeautify

* Fix preference center test

---------

Co-authored-by: crow <david.crow@airship.com>
Co-authored-by: Ryan Lepinski <ryan.lepinski@airship.com>
  • Loading branch information
3 people committed Apr 5, 2024
1 parent 8094856 commit 5161470
Show file tree
Hide file tree
Showing 35 changed files with 126 additions and 46 deletions.
2 changes: 1 addition & 1 deletion Airship.podspec
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
AIRSHIP_VERSION="17.9.1"
AIRSHIP_VERSION="17.10.0"

Pod::Spec.new do |s|
s.version = AIRSHIP_VERSION
Expand Down
2 changes: 1 addition & 1 deletion Airship/AirshipConfig.xcconfig
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//* Copyright Airship and Contributors */

CURRENT_PROJECT_VERSION = 17.9.1
CURRENT_PROJECT_VERSION = 17.10.0

// Uncomment to include the preview build warning
// OTHER_CFLAGS = $(inherited) -DUA_PREVIEW=1
3 changes: 2 additions & 1 deletion Airship/AirshipCore/Source/AirshipInstance.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ class AirshipInstance: AirshipInstanceProtocol {
self.config = RuntimeConfig(config: config, dataStore: dataStore, requestSession: requestSession)
self.privacyManager = AirshipPrivacyManager(
dataStore: dataStore,
defaultEnabledFeatures: config.enabledFeatures
defaultEnabledFeatures: config.enabledFeatures,
resetEnabledFeatures: config.resetEnabledFeatures
)
self.actionRegistry = ActionRegistry()
self.urlAllowList = URLAllowList.allowListWithConfig(self.config)
Expand Down
2 changes: 1 addition & 1 deletion Airship/AirshipCore/Source/AirshipVersion.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Foundation

@objc(UAirshipVersion)
public class AirshipVersion: NSObject {
public static let version = "17.9.1"
public static let version = "17.10.0"

@objc
public class func get() -> String {
Expand Down
10 changes: 9 additions & 1 deletion Airship/AirshipCore/Source/Config.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ public class AirshipConfig: NSObject, NSCopying {
/// Defaults to `all`.
public var enabledFeatures: AirshipFeature = .all

/// Allows resetting enabled features to match the runtime config defaults on each takeOff
/// Defaults to `false`
@objc
public var resetEnabledFeatures: Bool = false

/// :nodoc:
@objc(enabledFeatures)
public var _objc_enabledFeatures: _UAFeatures {
Expand Down Expand Up @@ -413,6 +418,7 @@ public class AirshipConfig: NSObject, NSCopying {
developmentLogLevel = config.developmentLogLevel
productionLogLevel = config.productionLogLevel
enabledFeatures = config.enabledFeatures
resetEnabledFeatures = config.resetEnabledFeatures
requestAuthorizationToUseNotifications =
config.requestAuthorizationToUseNotifications
requireInitialRemoteConfigEnabled =
Expand Down Expand Up @@ -480,7 +486,8 @@ public class AirshipConfig: NSObject, NSCopying {
Default Message Center Style Config File: %@\n\
Use iTunes ID: %@\n\
Site: %ld\n\
Enabled features %ld\n
Enabled features: %ld\n\
Reset enabled features: %ld\n\
Use user preferred locale: %d\n
""",
inProduction,
Expand Down Expand Up @@ -517,6 +524,7 @@ public class AirshipConfig: NSObject, NSCopying {
itunesID ?? "",
site.rawValue,
enabledFeatures.rawValue,
resetEnabledFeatures ? "YES" : "NO",
useUserPreferredLocale
)
}
Expand Down
6 changes: 6 additions & 0 deletions Airship/AirshipCore/Source/RuntimeConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,11 @@ public final class RuntimeConfig: NSObject, @unchecked Sendable {
/// Defaults to FeaturesAll.
public let enabledFeatures: AirshipFeature

/// Allows resetting enabled features to match the runtime config defaults on each takeOff
/// Defaults to false.
@objc
public let resetEnabledFeatures: Bool

/// If set to `true`, the SDK will use the preferred locale. Otherwise it will use the current locale.
///
/// Defaults to `false`.
Expand Down Expand Up @@ -301,6 +306,7 @@ public final class RuntimeConfig: NSObject, @unchecked Sendable {
self.messageCenterStyleConfig = config.messageCenterStyleConfig
self.itunesID = config.itunesID
self.enabledFeatures = config.enabledFeatures
self.resetEnabledFeatures = config.resetEnabledFeatures
self.site = config.site
self.autoPauseInAppAutomationOnLaunch = config.autoPauseInAppAutomationOnLaunch
self.defaultAnalyticsURL = config.analyticsURL?.normalizeURLString()
Expand Down
13 changes: 9 additions & 4 deletions Airship/AirshipCore/Source/UAPrivacyManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,14 @@ public final class AirshipPrivacyManager: NSObject, Sendable {
/*
* - Note: For internal use only. :nodoc:
*/
@objc(privacyManagerWithDataStore:defaultEnabledFeatures:)
@objc(privacyManagerWithDataStore:defaultEnabledFeatures:resetEnabledFeatures:)
public static func _objc_factory(
dataStore: PreferenceDataStore,
defaultEnabledFeatures: _UAFeatures) -> AirshipPrivacyManager {
return AirshipPrivacyManager(dataStore: dataStore, defaultEnabledFeatures: defaultEnabledFeatures.toSwift)
defaultEnabledFeatures: _UAFeatures,
resetEnabledFeatures: Bool) -> AirshipPrivacyManager {
return AirshipPrivacyManager(dataStore: dataStore,
defaultEnabledFeatures: defaultEnabledFeatures.toSwift,
resetEnabledFeatures: resetEnabledFeatures)
}

/*
Expand All @@ -86,13 +89,15 @@ public final class AirshipPrivacyManager: NSObject, Sendable {
public init(
dataStore: PreferenceDataStore,
defaultEnabledFeatures: AirshipFeature,
resetEnabledFeatures: Bool,
notificationCenter: AirshipNotificationCenter = AirshipNotificationCenter.shared
) {

self.dataStore = dataStore
self.notificationCenter = notificationCenter

if self.dataStore.keyExists(AirshipPrivacyManager.enabledFeaturesKey),
if !resetEnabledFeatures,
self.dataStore.keyExists(AirshipPrivacyManager.enabledFeaturesKey),
let value = self.dataStore.unsignedInteger(forKey: AirshipPrivacyManager.enabledFeaturesKey) {
self.currentEnabledFeatures.value = AirshipFeature(rawValue:(value & AirshipFeature.all.rawValue))
} else {
Expand Down
5 changes: 5 additions & 0 deletions Airship/AirshipCore/Tests/AirshipConfigTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,8 @@ final class AirshipConfigTest: XCTestCase {

XCTAssert(config.enabledFeatures.contains(.push))
XCTAssert(config.enabledFeatures.contains(.inAppAutomation))

XCTAssertTrue(config.resetEnabledFeatures, "resetEnabledFeatures was improperly loaded.")
}

func testNeXTStepPlistParsing() {
Expand Down Expand Up @@ -284,6 +286,8 @@ final class AirshipConfigTest: XCTestCase {
XCTAssertTrue(copy.itunesID == config.itunesID)
XCTAssertTrue(copy.requestAuthorizationToUseNotifications == config.requestAuthorizationToUseNotifications)
XCTAssertTrue(copy.requireInitialRemoteConfigEnabled == config.requireInitialRemoteConfigEnabled)
XCTAssertTrue(copy.resetEnabledFeatures == config.resetEnabledFeatures)

XCTAssertEqual(copy.enabledFeatures, config.enabledFeatures)
}

Expand All @@ -310,5 +314,6 @@ final class AirshipConfigTest: XCTestCase {
XCTAssertFalse(config.isExtendedBroadcastsEnabled)
XCTAssertTrue(config.requestAuthorizationToUseNotifications)
XCTAssertTrue(config.requireInitialRemoteConfigEnabled)
XCTAssertFalse(config.resetEnabledFeatures)
}
}
1 change: 1 addition & 0 deletions Airship/AirshipCore/Tests/AirshipContactTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class AirshipContactTest: XCTestCase {
self.privacyManager = AirshipPrivacyManager(
dataStore: self.dataStore,
defaultEnabledFeatures: .all,
resetEnabledFeatures: false,
notificationCenter: self.notificationCenter
)

Expand Down
3 changes: 2 additions & 1 deletion Airship/AirshipCore/Tests/AirshipMeteredUsageTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ final class AirshipMeteredUsageTest: XCTestCase {
private let channel: AirshipChannelProtocol = TestChannel()
private let privacyManager = AirshipPrivacyManager(
dataStore: PreferenceDataStore(appKey: UUID().uuidString),
defaultEnabledFeatures: [])
defaultEnabledFeatures: [],
resetEnabledFeatures: false)
private let apiClient: MeteredUsageAPIClientProtocol = MeteredTestApiClient()
private let storage = MeteredUsageStore(appKey: "test.app.key", inMemory: true)
private let workManager = TestWorkManager()
Expand Down
1 change: 1 addition & 0 deletions Airship/AirshipCore/Tests/AnalyticsTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class AnalyticsTest: XCTestCase {
self.privacyManager = AirshipPrivacyManager(
dataStore: dataStore,
defaultEnabledFeatures: .all,
resetEnabledFeatures: false,
notificationCenter: notificationCenter
)

Expand Down
1 change: 1 addition & 0 deletions Airship/AirshipCore/Tests/ApplicationMetricsTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ final class ApplicationMetricsTest: XCTestCase {
self.privacyManager = AirshipPrivacyManager(
dataStore: dataStore,
defaultEnabledFeatures: .all,
resetEnabledFeatures: false,
notificationCenter: notificationCenter
)

Expand Down
1 change: 1 addition & 0 deletions Airship/AirshipCore/Tests/ChannelAudienceManagerTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class ChannelAudienceManagerTest: XCTestCase {
self.privacyManager = AirshipPrivacyManager(
dataStore: self.dataStore,
defaultEnabledFeatures: .all,
resetEnabledFeatures: false,
notificationCenter: self.notificationCenter
)

Expand Down
1 change: 1 addition & 0 deletions Airship/AirshipCore/Tests/ChannelTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class ChannelTest: XCTestCase {
self.privacyManager = AirshipPrivacyManager(
dataStore: self.dataStore,
defaultEnabledFeatures: [],
resetEnabledFeatures: false,
notificationCenter: self.notificationCenter
)

Expand Down
1 change: 1 addition & 0 deletions Airship/AirshipCore/Tests/PushTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class PushTest: XCTestCase {
self.privacyManager = AirshipPrivacyManager(
dataStore: dataStore,
defaultEnabledFeatures: AirshipFeature.all,
resetEnabledFeatures: false,
notificationCenter: notificationCenter
)
self.push = await createPush()
Expand Down
2 changes: 1 addition & 1 deletion Airship/AirshipCore/Tests/RemoteConfigManagerTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ class RemoteConfigManagerTest: XCTestCase {
dataStore: dataStore
)


self.privacyManager = AirshipPrivacyManager(
dataStore: self.dataStore,
defaultEnabledFeatures: .all,
resetEnabledFeatures: false,
notificationCenter: self.notificationCenter
)

Expand Down
2 changes: 1 addition & 1 deletion Airship/AirshipCore/Tests/RemoteDataTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ final class RemoteDataTest: AirshipBaseTest {
private let testWorkManager: TestWorkManager = TestWorkManager()
private var remoteData: RemoteData!
lazy var privacyManager: AirshipPrivacyManager = {
AirshipPrivacyManager(dataStore: self.dataStore, defaultEnabledFeatures: .all)
AirshipPrivacyManager(dataStore: self.dataStore, defaultEnabledFeatures: .all, resetEnabledFeatures: false)
}()

override func setUp() async throws {
Expand Down
2 changes: 2 additions & 0 deletions Airship/AirshipCore/Tests/Support/AirshipConfig-Valid.plist
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
<string>ValidUAMessageCenterDefaultStyle</string>
<key>site</key>
<string>EU</string>
<key>resetEnabledFeatures</key>
<true/>
<key>enabledFeatures</key>
<array>
<string>in_app_automation</string>
Expand Down
2 changes: 1 addition & 1 deletion Airship/AirshipCore/Tests/UAInAppAutomationTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ - (void)setUp {
[super setUp];


self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesAll];
self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesAll resetEnabledFeatures:NO];

self.mockAutomationEngine = [self mockForClass:[UAAutomationEngine class]];
self.mockInAppCoreSwiftBridge = [self mockForClass:[UAInAppCoreSwiftBridge class]];
Expand Down
8 changes: 4 additions & 4 deletions Airship/AirshipCore/Tests/UAPrivacyManagerTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@ @interface UAPrivacyManagerTest : UAAirshipBaseTest
@implementation UAPrivacyManagerTest

- (void)setUp {
self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesAll];
self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesAll resetEnabledFeatures:NO];
}

- (void)testDefaultFeatures {
XCTAssertEqual(self.privacyManager.enabledFeatures, UAFeaturesAll);

self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesNone];
self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesNone resetEnabledFeatures:NO];
XCTAssertEqual(self.privacyManager.enabledFeatures, UAFeaturesNone);
}

- (void)testEnableFeatures {
self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesNone];
self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesNone resetEnabledFeatures:NO];

XCTAssertEqual(self.privacyManager.enabledFeatures, UAFeaturesNone);

Expand All @@ -50,7 +50,7 @@ - (void)testDisableFeatures {
}

- (void)testIsEnabled {
self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesNone];
self.privacyManager = [UAPrivacyManager privacyManagerWithDataStore:self.dataStore defaultEnabledFeatures:UAFeaturesNone resetEnabledFeatures:NO];

XCTAssertFalse([self.privacyManager isEnabled:UAFeaturesAnalytics]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public enum SeparatorStyle {

/// Model object representing a custom theme to be applied to the default message center.
///
/// To customise the message center theme:
/// To customize the message center theme:
///
/// MessageCenterView(
/// controller: messageCenterController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ extension MessageCenterThemeLoader.Config {
if let placeholderIcon = self.placeholderIcon {
theme.placeholderIcon = Image(placeholderIcon)
}
theme.cellTitleFont = try self.cellTitleFont?.toFont()
theme.cellTitleFont = try? self.cellTitleFont?.toFont()
theme.cellDateFont = try? self.cellDateFont?.toFont()
theme.cellColor = self.cellColor?.toColor(bundle)
theme.cellColorDark = self.cellColorDark?.toColor(bundle)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,9 @@ private struct MessageCenterMessageContentView: View {
@Environment(\.presentationMode)
private var presentationMode: Binding<PresentationMode>

@Environment(\.colorScheme)
private var colorScheme

@Environment(\.airshipMessageCenterTheme)
private var theme

Expand Down Expand Up @@ -421,21 +424,44 @@ private struct MessageCenterMessageContentView: View {
.navigationTitle(
Text(title ?? self.message?.title ?? "")
)
.navigationBarBackButtonHidden(true) // Hide the default back button
.toolbar {
if theme.hideDeleteButton != true {
Button("ua_delete_message".messageCenterlocalizedString) {
Task {
await MessageCenter.shared.inbox.delete(
messageIDs: [self.messageID]
)
}
dismiss()
}
ToolbarItem(placement: .navigationBarLeading) {
backButton
}
}
.toolbar {
deleteButton
}
.navigationBarTitleDisplayMode(.inline)
}


@ViewBuilder
private var deleteButton: some View {
if theme.hideDeleteButton != true {
Button("ua_delete_message".messageCenterlocalizedString) {
Task {
await MessageCenter.shared.inbox.delete(
messageIDs: [self.messageID]
)
}
dismiss()
}.foregroundColor(theme.deleteButtonTitleColor?.adaptiveColor(for: colorScheme, darkVariation: theme.deleteButtonTitleColorDark))
}
}

@ViewBuilder
private var backButton: some View {
Button(action: {
self.dismiss()
}) {
Image(systemName: "chevron.backward")
.scaleEffect(0.68)
.font(Font.title.weight(.medium))
.foregroundColor(theme.backButtonColor?.adaptiveColor(for: colorScheme, darkVariation: theme.backButtonColorDark))
}
}

private func dismiss() {
if let dismissAction = self.dismissAction {
dismissAction()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ class PreferenceCenterTest: XCTestCase {
override func setUp() {
self.privacyManager = AirshipPrivacyManager(
dataStore: self.dataStore,
defaultEnabledFeatures: .all
defaultEnabledFeatures: .all,
resetEnabledFeatures: false
)

self.preferenceCenter = PreferenceCenter(
Expand Down
2 changes: 1 addition & 1 deletion AirshipContentExtension.podspec
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
AIRSHIP_VERSION="17.9.1"
AIRSHIP_VERSION="17.10.0"

Pod::Spec.new do |s|
s.version = AIRSHIP_VERSION
Expand Down
2 changes: 1 addition & 1 deletion AirshipDebug.podspec
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
AIRSHIP_VERSION="17.9.1"
AIRSHIP_VERSION="17.10.0"

Pod::Spec.new do |s|
s.version = AIRSHIP_VERSION
Expand Down
2 changes: 1 addition & 1 deletion AirshipServiceExtension.podspec
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
AIRSHIP_VERSION="17.9.1"
AIRSHIP_VERSION="17.10.0"

Pod::Spec.new do |s|
s.version = AIRSHIP_VERSION
Expand Down

0 comments on commit 5161470

Please sign in to comment.