Remove all uses of the ServiceLocator from within Coordinators and View Models.

It is still used for mocks in tests, previews etc, and still used in the AppCoordinator.
This commit is contained in:
Doug
2025-08-27 16:05:49 +01:00
committed by Doug
parent dfb2425240
commit cb7d11fd13
23 changed files with 138 additions and 69 deletions
@@ -12,6 +12,7 @@ struct SoftLogoutScreenCoordinatorParameters {
let authenticationService: AuthenticationServiceProtocol
let credentials: SoftLogoutScreenCredentials
let keyBackupNeeded: Bool
let appSettings: AppSettings
let userIndicatorController: UserIndicatorControllerProtocol
}
@@ -142,7 +143,7 @@ final class SoftLogoutScreenCoordinator: CoordinatorProtocol {
stopLoading()
let presenter = OIDCAuthenticationPresenter(authenticationService: parameters.authenticationService,
oidcRedirectURL: ServiceLocator.shared.settings.oidcRedirectURL,
oidcRedirectURL: parameters.appSettings.oidcRedirectURL,
presentationAnchor: presentationAnchor,
userIndicatorController: parameters.userIndicatorController)
self.oidcPresenter = presenter
@@ -13,7 +13,9 @@ struct CallScreenCoordinatorParameters {
let elementCallService: ElementCallServiceProtocol
let configuration: ElementCallConfiguration
let allowPictureInPicture: Bool
let appSettings: AppSettings
let appHooks: AppHooks
let analytics: AnalyticsService
}
enum CallScreenCoordinatorAction {
@@ -44,8 +46,8 @@ final class CallScreenCoordinator: CoordinatorProtocol {
configuration: parameters.configuration,
allowPictureInPicture: parameters.allowPictureInPicture,
appHooks: parameters.appHooks,
appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics)
appSettings: parameters.appSettings,
analyticsService: parameters.analytics)
}
func start() {
@@ -13,6 +13,8 @@ struct CreateRoomCoordinatorParameters {
let userIndicatorController: UserIndicatorControllerProtocol
let createRoomParameters: CurrentValuePublisher<CreateRoomFlowParameters, Never>
let selectedUsers: CurrentValuePublisher<[UserProfileProxy], Never>
let appSettings: AppSettings
let analytics: AnalyticsService
}
enum CreateRoomCoordinatorAction {
@@ -36,9 +38,9 @@ final class CreateRoomCoordinator: CoordinatorProtocol {
viewModel = CreateRoomViewModel(userSession: parameters.userSession,
createRoomParameters: parameters.createRoomParameters,
selectedUsers: parameters.selectedUsers,
analytics: ServiceLocator.shared.analytics,
analytics: parameters.analytics,
userIndicatorController: parameters.userIndicatorController,
appSettings: ServiceLocator.shared.settings)
appSettings: parameters.appSettings)
}
func start() {
@@ -16,6 +16,8 @@ struct MediaEventsTimelineScreenCoordinatorParameters {
let mediaPlayerProvider: MediaPlayerProviderProtocol
let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol
let appMediator: AppMediatorProtocol
let appSettings: AppSettings
let analytics: AnalyticsService
let emojiProvider: EmojiProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol
let timelineControllerFactory: TimelineControllerFactoryProtocol
@@ -45,10 +47,10 @@ final class MediaEventsTimelineScreenCoordinator: CoordinatorProtocol {
mediaProvider: parameters.mediaProvider,
mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: ServiceLocator.shared.userIndicatorController,
userIndicatorController: parameters.userIndicatorController,
appMediator: parameters.appMediator,
appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics,
appSettings: parameters.appSettings,
analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory,
clientProxy: parameters.clientProxy)
@@ -58,10 +60,10 @@ final class MediaEventsTimelineScreenCoordinator: CoordinatorProtocol {
mediaProvider: parameters.mediaProvider,
mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: ServiceLocator.shared.userIndicatorController,
userIndicatorController: parameters.userIndicatorController,
appMediator: parameters.appMediator,
appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics,
appSettings: parameters.appSettings,
analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory,
clientProxy: parameters.clientProxy)
@@ -15,9 +15,12 @@ struct PinnedEventsTimelineScreenCoordinatorParameters {
let mediaPlayerProvider: MediaPlayerProviderProtocol
let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol
let appMediator: AppMediatorProtocol
let appSettings: AppSettings
let analytics: AnalyticsService
let emojiProvider: EmojiProviderProtocol
let timelineControllerFactory: TimelineControllerFactoryProtocol
let clientProxy: ClientProxyProtocol
let userIndicatorController: UserIndicatorControllerProtocol
}
enum PinnedEventsTimelineScreenCoordinatorAction {
@@ -43,16 +46,16 @@ final class PinnedEventsTimelineScreenCoordinator: CoordinatorProtocol {
init(parameters: PinnedEventsTimelineScreenCoordinatorParameters) {
self.parameters = parameters
viewModel = PinnedEventsTimelineScreenViewModel(analyticsService: ServiceLocator.shared.analytics)
viewModel = PinnedEventsTimelineScreenViewModel(analyticsService: parameters.analytics)
timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy,
timelineController: parameters.timelineController,
mediaProvider: parameters.mediaProvider,
mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: ServiceLocator.shared.userIndicatorController,
userIndicatorController: parameters.userIndicatorController,
appMediator: parameters.appMediator,
appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics,
appSettings: parameters.appSettings,
analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory,
clientProxy: parameters.clientProxy)
@@ -101,10 +101,10 @@ class ResolveVerifiedUserSendFailureScreenViewModel: ResolveVerifiedUserSendFail
private static let failureIndicatorIdentifier = "\(ResolveVerifiedUserSendFailureScreenViewModel.self)-Failure"
private func showFailureIndicator() {
ServiceLocator.shared.userIndicatorController.submitIndicator(UserIndicator(id: Self.failureIndicatorIdentifier,
type: .toast,
title: L10n.errorUnknown,
iconName: "xmark"))
userIndicatorController.submitIndicator(UserIndicator(id: Self.failureIndicatorIdentifier,
type: .toast,
title: L10n.errorUnknown,
iconName: "xmark"))
}
}
@@ -17,6 +17,7 @@ struct RoomDetailsScreenCoordinatorParameters {
let notificationSettings: NotificationSettingsProxyProtocol
let attributedStringBuilder: AttributedStringBuilderProtocol
let appMediator: AppMediatorProtocol
let appSettings: AppSettings
}
enum RoomDetailsScreenCoordinatorAction {
@@ -56,7 +57,7 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
notificationSettingsProxy: parameters.notificationSettings,
attributedStringBuilder: parameters.attributedStringBuilder,
appMediator: parameters.appMediator,
appSettings: ServiceLocator.shared.settings)
appSettings: parameters.appSettings)
}
// MARK: - Public
@@ -11,6 +11,7 @@ import SwiftUI
struct RoomPollsHistoryScreenCoordinatorParameters {
let pollInteractionHandler: PollInteractionHandlerProtocol
let timelineController: TimelineControllerProtocol
let userIndicatorController: UserIndicatorControllerProtocol
}
enum RoomPollsHistoryScreenCoordinatorAction {
@@ -29,7 +30,7 @@ final class RoomPollsHistoryScreenCoordinator: CoordinatorProtocol {
init(parameters: RoomPollsHistoryScreenCoordinatorParameters) {
viewModel = RoomPollsHistoryScreenViewModel(pollInteractionHandler: parameters.pollInteractionHandler,
timelineController: parameters.timelineController,
userIndicatorController: ServiceLocator.shared.userIndicatorController)
userIndicatorController: parameters.userIndicatorController)
}
func start() {
@@ -26,8 +26,10 @@ struct RoomScreenCoordinatorParameters {
let appMediator: AppMediatorProtocol
let appSettings: AppSettings
let appHooks: AppHooks
let analytics: AnalyticsService
let composerDraftService: ComposerDraftServiceProtocol
let timelineControllerFactory: TimelineControllerFactoryProtocol
let userIndicatorController: UserIndicatorControllerProtocol
}
enum RoomScreenCoordinatorAction {
@@ -75,8 +77,8 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
appMediator: parameters.appMediator,
appSettings: parameters.appSettings,
appHooks: parameters.appHooks,
analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController)
analyticsService: parameters.analytics,
userIndicatorController: parameters.userIndicatorController)
timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy,
focussedEventID: parameters.focussedEvent?.eventID,
@@ -84,10 +86,10 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
mediaProvider: parameters.mediaProvider,
mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: ServiceLocator.shared.userIndicatorController,
userIndicatorController: parameters.userIndicatorController,
appMediator: parameters.appMediator,
appSettings: parameters.appSettings,
analyticsService: ServiceLocator.shared.analytics,
analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory,
clientProxy: parameters.clientProxy)
@@ -103,7 +105,7 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
mediaProvider: parameters.mediaProvider,
mentionDisplayHelper: ComposerMentionDisplayHelper(timelineContext: timelineViewModel.context),
appSettings: parameters.appSettings,
analyticsService: ServiceLocator.shared.analytics,
analyticsService: parameters.analytics,
composerDraftService: parameters.composerDraftService)
self.composerViewModel = composerViewModel
}
@@ -19,10 +19,10 @@ class OIDCAccountSettingsPresenter: NSObject {
private let presentationAnchor: UIWindow
private let oidcRedirectURL: URL
init(accountURL: URL, presentationAnchor: UIWindow) {
init(accountURL: URL, presentationAnchor: UIWindow, appSettings: AppSettings) {
self.accountURL = accountURL
self.presentationAnchor = presentationAnchor
oidcRedirectURL = ServiceLocator.shared.settings.oidcRedirectURL
oidcRedirectURL = appSettings.oidcRedirectURL
super.init()
}
@@ -22,9 +22,9 @@ final class DeveloperOptionsScreenCoordinator: CoordinatorProtocol {
actionsSubject.eraseToAnyPublisher()
}
init() {
viewModel = DeveloperOptionsScreenViewModel(developerOptions: ServiceLocator.shared.settings,
elementCallBaseURL: ServiceLocator.shared.settings.elementCallBaseURL)
init(appSettings: AppSettings) {
viewModel = DeveloperOptionsScreenViewModel(developerOptions: appSettings,
elementCallBaseURL: appSettings.elementCallBaseURL)
viewModel.actions
.sink { [weak self] action in
@@ -13,6 +13,7 @@ struct NotificationSettingsScreenCoordinatorParameters {
let userSession: UserSessionProtocol
let userNotificationCenter: UserNotificationCenterProtocol
let isModallyPresented: Bool
let appSettings: AppSettings
}
enum NotificationSettingsScreenCoordinatorAction {
@@ -36,7 +37,7 @@ final class NotificationSettingsScreenCoordinator: CoordinatorProtocol {
init(parameters: NotificationSettingsScreenCoordinatorParameters) {
self.parameters = parameters
viewModel = NotificationSettingsScreenViewModel(appSettings: ServiceLocator.shared.settings,
viewModel = NotificationSettingsScreenViewModel(appSettings: parameters.appSettings,
userNotificationCenter: parameters.userNotificationCenter,
notificationSettingsProxy: parameters.userSession.clientProxy.notificationSettings,
isModallyPresented: parameters.isModallyPresented)
@@ -16,6 +16,7 @@ struct StartChatScreenCoordinatorParameters {
let userDiscoveryService: UserDiscoveryServiceProtocol
let mediaUploadingPreprocessor: MediaUploadingPreprocessor
let appSettings: AppSettings
let analytics: AnalyticsService
}
enum StartChatScreenCoordinatorAction {
@@ -48,10 +49,10 @@ final class StartChatScreenCoordinator: CoordinatorProtocol {
self.parameters = parameters
viewModel = StartChatScreenViewModel(userSession: parameters.userSession,
analytics: ServiceLocator.shared.analytics,
analytics: parameters.analytics,
userIndicatorController: parameters.userIndicatorController,
userDiscoveryService: parameters.userDiscoveryService,
appSettings: ServiceLocator.shared.settings)
appSettings: parameters.appSettings)
}
func start() {
@@ -114,7 +115,9 @@ final class StartChatScreenCoordinator: CoordinatorProtocol {
let createParameters = CreateRoomCoordinatorParameters(userSession: parameters.userSession,
userIndicatorController: parameters.userIndicatorController,
createRoomParameters: createRoomParametersPublisher,
selectedUsers: selectedUsersPublisher)
selectedUsers: selectedUsersPublisher,
appSettings: parameters.appSettings,
analytics: parameters.analytics)
let coordinator = CreateRoomCoordinator(parameters: createParameters)
coordinator.actions.sink { [weak self] action in
guard let self else { return }
@@ -21,8 +21,10 @@ struct ThreadTimelineScreenCoordinatorParameters {
let completionSuggestionService: CompletionSuggestionServiceProtocol
let appMediator: AppMediatorProtocol
let appSettings: AppSettings
let analytics: AnalyticsService
let composerDraftService: ComposerDraftServiceProtocol
let timelineControllerFactory: TimelineControllerFactoryProtocol
let userIndicatorController: UserIndicatorControllerProtocol
}
enum ThreadTimelineScreenCoordinatorAction {
@@ -61,10 +63,10 @@ final class ThreadTimelineScreenCoordinator: CoordinatorProtocol {
mediaProvider: parameters.mediaProvider,
mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: ServiceLocator.shared.userIndicatorController,
userIndicatorController: parameters.userIndicatorController,
appMediator: parameters.appMediator,
appSettings: parameters.appSettings,
analyticsService: ServiceLocator.shared.analytics,
analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory,
clientProxy: parameters.clientProxy)
@@ -81,7 +83,7 @@ final class ThreadTimelineScreenCoordinator: CoordinatorProtocol {
mediaProvider: parameters.mediaProvider,
mentionDisplayHelper: ComposerMentionDisplayHelper(timelineContext: timelineViewModel.context),
appSettings: parameters.appSettings,
analyticsService: ServiceLocator.shared.analytics,
analyticsService: parameters.analytics,
composerDraftService: parameters.composerDraftService)
}