Skip to content

Commit ac408f8

Browse files
committed
added account data media display policy handling to NSE
1 parent f9b3281 commit ac408f8

23 files changed

+624
-65
lines changed

ElementX.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8708,7 +8708,7 @@
87088708
repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift";
87098709
requirement = {
87108710
kind = exactVersion;
8711-
version = "25.05.26-2";
8711+
version = 25.05.27;
87128712
};
87138713
};
87148714
701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = {
@@ -8836,7 +8836,7 @@
88368836
repositoryURL = "https://github.com/element-hq/compound-ios";
88378837
requirement = {
88388838
kind = revision;
8839-
revision = 81ba8bd8b3971beac252129c5466d7eac2f2ec31;
8839+
revision = acbe59727c8352c6768f8444acc6deb07e4b7563;
88408840
};
88418841
};
88428842
F76A08D0EA29A07A54F4EB4D /* XCRemoteSwiftPackageReference "swift-collections" */ = {

ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ElementX/Sources/Application/AppCoordinator.swift

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
3030
private var userSession: UserSessionProtocol? {
3131
didSet {
3232
userSessionObserver?.cancel()
33-
if userSession != nil {
33+
if let userSession {
3434
configureElementCallService()
3535
configureNotificationManager()
3636
observeUserSessionChanges()
3737
startSync()
38+
performSettingsToAccountDataMigration(userSession: userSession)
3839
}
3940
}
4041
}
@@ -397,17 +398,49 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
397398
Tracing.deleteLogFiles()
398399
MXLog.info("Migrating to v1.6.7, log files have been wiped")
399400
}
401+
}
402+
403+
private func performSettingsToAccountDataMigration(userSession: UserSessionProtocol) {
404+
guard let userDefaults = UserDefaults(suiteName: InfoPlistReader.main.appGroupIdentifier) else {
405+
return
406+
}
407+
408+
let hideInviteAvatars = userDefaults.value(forKey: "hideInviteAvatars") as? Bool
409+
let timelineMediaVisibility = userDefaults.value(forKey: "timelineMediaVisibility") as? TimelineMediaVisibility
410+
let hideTimelineMedia = userDefaults.value(forKey: "hideTimelineMedia") as? Bool
411+
412+
guard hideInviteAvatars != nil || timelineMediaVisibility != nil || hideTimelineMedia != nil else {
413+
// No migration needed, no local settings found.
414+
return
415+
}
400416

401-
if oldVersion < Version(25, 4, 2) {
402-
MXLog.info("Migrating to v25.04.2, checking if hideTimelineMedia flag can be migrated to timelineMediaVisibility")
403-
// Migration for the old `hideTimelineMedia` flag.
404-
if let userDefaults = UserDefaults(suiteName: InfoPlistReader.main.appGroupIdentifier),
405-
let hideTimelineMedia = userDefaults.value(forKey: "hideTimelineMedia") as? Bool {
406-
appSettings.timelineMediaVisibility = hideTimelineMedia ? .never : .always
417+
Task {
418+
switch await userSession.clientProxy.fetchMediaPreviewConfig() {
419+
case let .success(config):
420+
guard config == nil else {
421+
// Found a server configuration, no need to migrate.
422+
userDefaults.removeObject(forKey: "hideInviteAvatars")
423+
userDefaults.removeObject(forKey: "timelineMediaVisibility")
424+
userDefaults.removeObject(forKey: "hideTimelineMedia")
425+
return
426+
}
427+
428+
if let hideInviteAvatars, case .success = await userSession.clientProxy.setHideInviteAvatars(hideInviteAvatars) {
429+
userDefaults.removeObject(forKey: "hideInviteAvatars")
430+
}
431+
432+
if let timelineMediaVisibility, case .success = await userSession.clientProxy.setTimelineMediaVisibility(timelineMediaVisibility) {
433+
userDefaults.removeObject(forKey: "timelineMediaVisibility")
434+
} else if let hideTimelineMedia, case .success = await userSession.clientProxy.setTimelineMediaVisibility(hideTimelineMedia ? .never : .always) {
435+
userDefaults.removeObject(forKey: "hideTimelineMedia")
436+
}
437+
case let .failure(error):
438+
MXLog.error("Could not perform migration, failed to fetch media preview config: \(error)")
439+
return
407440
}
408441
}
409442
}
410-
443+
411444
/// Clears the keychain, app support directory etc ready for a fresh use.
412445
/// - Parameter includingSettings: Whether to additionally wipe the user's app settings too.
413446
private func wipeUserData(includingSettings: Bool = false) {

ElementX/Sources/Application/AppSettings.swift

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ protocol CommonSettingsProtocol {
1717
var logLevel: LogLevel { get }
1818
var traceLogPacks: Set<TraceLogPack> { get }
1919
var enableOnlySignedDeviceIsolationMode: Bool { get }
20-
var hideInviteAvatars: Bool { get }
21-
var timelineMediaVisibility: TimelineMediaVisibility { get }
2220
var hideQuietNotificationAlerts: Bool { get }
2321
}
2422

@@ -46,8 +44,7 @@ final class AppSettings {
4644
case optimizeMediaUploads
4745
case appAppearance
4846
case sharePresence
49-
case hideInviteAvatars
50-
case timelineMediaVisibility
47+
case hideUnreadMessagesBadge
5148
case isNewBloomEnabled
5249

5350
case elementCallBaseURLOverride
@@ -61,7 +58,6 @@ final class AppSettings {
6158
case developerOptionsEnabled
6259

6360
// Doug's tweaks 🔧
64-
case hideUnreadMessagesBadge
6561
case hideQuietNotificationAlerts
6662
}
6763

@@ -367,20 +363,8 @@ final class AppSettings {
367363
@UserPreference(key: UserDefaultsKeys.enableOnlySignedDeviceIsolationMode, defaultValue: false, storageType: .userDefaults(store))
368364
var enableOnlySignedDeviceIsolationMode
369365

370-
@UserPreference(key: UserDefaultsKeys.hideInviteAvatars, defaultValue: false, storageType: .userDefaults(store))
371-
var hideInviteAvatars
372-
373-
@UserPreference(key: UserDefaultsKeys.timelineMediaVisibility, defaultValue: TimelineMediaVisibility.always, storageType: .userDefaults(store))
374-
var timelineMediaVisibility
375-
376366
@UserPreference(key: UserDefaultsKeys.hideQuietNotificationAlerts, defaultValue: false, storageType: .userDefaults(store))
377367
var hideQuietNotificationAlerts
378368
}
379369

380370
extension AppSettings: CommonSettingsProtocol { }
381-
382-
enum TimelineMediaVisibility: Codable {
383-
case always
384-
case privateOnly
385-
case never
386-
}

ElementX/Sources/FlowCoordinators/SettingsFlowCoordinator.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,9 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
226226

227227
private func presentAdvancedSettings() {
228228
let coordinator = AdvancedSettingsScreenCoordinator(parameters: .init(appSettings: parameters.appSettings,
229-
analytics: parameters.analytics))
229+
analytics: parameters.analytics,
230+
clientProxy: parameters.userSession.clientProxy,
231+
userIndicatorController: parameters.userIndicatorController))
230232
navigationStackCoordinator.push(coordinator)
231233
}
232234

ElementX/Sources/Mocks/ClientProxyMock.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ struct ClientProxyMockConfiguration {
1717
var roomDirectorySearchProxy: RoomDirectorySearchProxyProtocol?
1818

1919
var recoveryState: SecureBackupRecoveryState = .enabled
20+
21+
var timelineMediaVisibility = TimelineMediaVisibility.always
22+
var hideInviteAvatars = false
2023
}
2124

2225
enum ClientProxyMockError: Error {
@@ -94,5 +97,8 @@ extension ClientProxyMock {
9497
userIdentityForReturnValue = .success(UserIdentityProxyMock(configuration: .init()))
9598

9699
underlyingIsReportRoomSupported = true
100+
101+
underlyingTimelineMediaVisibilityPublisher = CurrentValueSubject<TimelineMediaVisibility, Never>(configuration.timelineMediaVisibility).asCurrentValuePublisher()
102+
underlyingHideInviteAvatarsPublisher = CurrentValueSubject<Bool, Never>(configuration.hideInviteAvatars).asCurrentValuePublisher()
97103
}
98104
}

0 commit comments

Comments
 (0)