diff --git a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift index a5568372f..935ade886 100644 --- a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift @@ -554,12 +554,14 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { // MARK: Calls private func presentCallScreen(roomProxy: RoomProxyProtocol) { + let colorScheme: ColorScheme = appMediator.windowManager.mainWindow.traitCollection.userInterfaceStyle == .light ? .light : .dark let callScreenCoordinator = CallScreenCoordinator(parameters: .init(elementCallService: elementCallService, clientProxy: userSession.clientProxy, roomProxy: roomProxy, clientID: InfoPlistReader.main.bundleIdentifier, elementCallBaseURL: appSettings.elementCallBaseURL, - elementCallBaseURLOverride: appSettings.elementCallBaseURLOverride)) + elementCallBaseURLOverride: appSettings.elementCallBaseURLOverride, + colorScheme: colorScheme)) callScreenCoordinator.actions .sink { [weak self] action in diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index c091ecabe..13b963963 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -4922,15 +4922,15 @@ class ElementCallWidgetDriverMock: ElementCallWidgetDriverProtocol { //MARK: - start - var startBaseURLClientIDUnderlyingCallsCount = 0 - var startBaseURLClientIDCallsCount: Int { + var startBaseURLClientIDColorSchemeUnderlyingCallsCount = 0 + var startBaseURLClientIDColorSchemeCallsCount: Int { get { if Thread.isMainThread { - return startBaseURLClientIDUnderlyingCallsCount + return startBaseURLClientIDColorSchemeUnderlyingCallsCount } else { var returnValue: Int? = nil DispatchQueue.main.sync { - returnValue = startBaseURLClientIDUnderlyingCallsCount + returnValue = startBaseURLClientIDColorSchemeUnderlyingCallsCount } return returnValue! @@ -4938,29 +4938,29 @@ class ElementCallWidgetDriverMock: ElementCallWidgetDriverProtocol { } set { if Thread.isMainThread { - startBaseURLClientIDUnderlyingCallsCount = newValue + startBaseURLClientIDColorSchemeUnderlyingCallsCount = newValue } else { DispatchQueue.main.sync { - startBaseURLClientIDUnderlyingCallsCount = newValue + startBaseURLClientIDColorSchemeUnderlyingCallsCount = newValue } } } } - var startBaseURLClientIDCalled: Bool { - return startBaseURLClientIDCallsCount > 0 + var startBaseURLClientIDColorSchemeCalled: Bool { + return startBaseURLClientIDColorSchemeCallsCount > 0 } - var startBaseURLClientIDReceivedArguments: (baseURL: URL, clientID: String)? - var startBaseURLClientIDReceivedInvocations: [(baseURL: URL, clientID: String)] = [] + var startBaseURLClientIDColorSchemeReceivedArguments: (baseURL: URL, clientID: String, colorScheme: ColorScheme)? + var startBaseURLClientIDColorSchemeReceivedInvocations: [(baseURL: URL, clientID: String, colorScheme: ColorScheme)] = [] - var startBaseURLClientIDUnderlyingReturnValue: Result! - var startBaseURLClientIDReturnValue: Result! { + var startBaseURLClientIDColorSchemeUnderlyingReturnValue: Result! + var startBaseURLClientIDColorSchemeReturnValue: Result! { get { if Thread.isMainThread { - return startBaseURLClientIDUnderlyingReturnValue + return startBaseURLClientIDColorSchemeUnderlyingReturnValue } else { var returnValue: Result? = nil DispatchQueue.main.sync { - returnValue = startBaseURLClientIDUnderlyingReturnValue + returnValue = startBaseURLClientIDColorSchemeUnderlyingReturnValue } return returnValue! @@ -4968,26 +4968,26 @@ class ElementCallWidgetDriverMock: ElementCallWidgetDriverProtocol { } set { if Thread.isMainThread { - startBaseURLClientIDUnderlyingReturnValue = newValue + startBaseURLClientIDColorSchemeUnderlyingReturnValue = newValue } else { DispatchQueue.main.sync { - startBaseURLClientIDUnderlyingReturnValue = newValue + startBaseURLClientIDColorSchemeUnderlyingReturnValue = newValue } } } } - var startBaseURLClientIDClosure: ((URL, String) async -> Result)? + var startBaseURLClientIDColorSchemeClosure: ((URL, String, ColorScheme) async -> Result)? - func start(baseURL: URL, clientID: String) async -> Result { - startBaseURLClientIDCallsCount += 1 - startBaseURLClientIDReceivedArguments = (baseURL: baseURL, clientID: clientID) + func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result { + startBaseURLClientIDColorSchemeCallsCount += 1 + startBaseURLClientIDColorSchemeReceivedArguments = (baseURL: baseURL, clientID: clientID, colorScheme: colorScheme) DispatchQueue.main.async { - self.startBaseURLClientIDReceivedInvocations.append((baseURL: baseURL, clientID: clientID)) + self.startBaseURLClientIDColorSchemeReceivedInvocations.append((baseURL: baseURL, clientID: clientID, colorScheme: colorScheme)) } - if let startBaseURLClientIDClosure = startBaseURLClientIDClosure { - return await startBaseURLClientIDClosure(baseURL, clientID) + if let startBaseURLClientIDColorSchemeClosure = startBaseURLClientIDColorSchemeClosure { + return await startBaseURLClientIDColorSchemeClosure(baseURL, clientID, colorScheme) } else { - return startBaseURLClientIDReturnValue + return startBaseURLClientIDColorSchemeReturnValue } } //MARK: - sendMessage diff --git a/ElementX/Sources/Mocks/RoomProxyMock.swift b/ElementX/Sources/Mocks/RoomProxyMock.swift index b1b18de72..27341e269 100644 --- a/ElementX/Sources/Mocks/RoomProxyMock.swift +++ b/ElementX/Sources/Mocks/RoomProxyMock.swift @@ -143,7 +143,7 @@ extension RoomProxyMock { fatalError() } - widgetDriver.startBaseURLClientIDReturnValue = .success(url) + widgetDriver.startBaseURLClientIDColorSchemeReturnValue = .success(url) elementCallWidgetDriverReturnValue = widgetDriver sendCallNotificationIfNeeededReturnValue = .success(()) diff --git a/ElementX/Sources/Screens/CallScreen/CallScreenCoordinator.swift b/ElementX/Sources/Screens/CallScreen/CallScreenCoordinator.swift index 2ddbe5ff7..3b9c30366 100644 --- a/ElementX/Sources/Screens/CallScreen/CallScreenCoordinator.swift +++ b/ElementX/Sources/Screens/CallScreen/CallScreenCoordinator.swift @@ -24,6 +24,7 @@ struct CallScreenCoordinatorParameters { let clientID: String let elementCallBaseURL: URL let elementCallBaseURLOverride: URL? + let colorScheme: ColorScheme } enum CallScreenCoordinatorAction { @@ -45,7 +46,8 @@ final class CallScreenCoordinator: CoordinatorProtocol { roomProxy: parameters.roomProxy, clientID: parameters.clientID, elementCallBaseURL: parameters.elementCallBaseURL, - elementCallBaseURLOverride: parameters.elementCallBaseURLOverride) + elementCallBaseURLOverride: parameters.elementCallBaseURLOverride, + colorScheme: parameters.colorScheme) } func start() { diff --git a/ElementX/Sources/Screens/CallScreen/CallScreenViewModel.swift b/ElementX/Sources/Screens/CallScreen/CallScreenViewModel.swift index 6086449eb..38bd48574 100644 --- a/ElementX/Sources/Screens/CallScreen/CallScreenViewModel.swift +++ b/ElementX/Sources/Screens/CallScreen/CallScreenViewModel.swift @@ -42,7 +42,8 @@ class CallScreenViewModel: CallScreenViewModelType, CallScreenViewModelProtocol roomProxy: RoomProxyProtocol, clientID: String, elementCallBaseURL: URL, - elementCallBaseURLOverride: URL?) { + elementCallBaseURLOverride: URL?, + colorScheme: ColorScheme) { self.elementCallService = elementCallService self.roomProxy = roomProxy @@ -100,7 +101,7 @@ class CallScreenViewModel: CallScreenViewModelType, CallScreenViewModelProtocol elementCallBaseURL } - switch await widgetDriver.start(baseURL: baseURL, clientID: clientID) { + switch await widgetDriver.start(baseURL: baseURL, clientID: clientID, colorScheme: colorScheme) { case .success(let url): state.url = url case .failure(let error): diff --git a/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift b/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift index 4a876ee5c..bb7ee413c 100644 --- a/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift +++ b/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift @@ -27,7 +27,6 @@ struct CallScreen: View { .id(context.viewState.url) .ignoresSafeArea(edges: .bottom) .presentationDragIndicator(.visible) - .environment(\.colorScheme, .dark) .alert(item: $context.alertInfo) } } @@ -181,7 +180,7 @@ struct CallScreen_Previews: PreviewProvider { let widgetDriver = ElementCallWidgetDriverMock() widgetDriver.underlyingMessagePublisher = .init() widgetDriver.underlyingActions = PassthroughSubject().eraseToAnyPublisher() - widgetDriver.startBaseURLClientIDReturnValue = .success(URL.userDirectory) + widgetDriver.startBaseURLClientIDColorSchemeReturnValue = .success(URL.userDirectory) roomProxy.elementCallWidgetDriverReturnValue = widgetDriver @@ -190,7 +189,8 @@ struct CallScreen_Previews: PreviewProvider { roomProxy: roomProxy, clientID: "io.element.elementx", elementCallBaseURL: "https://call.element.io", - elementCallBaseURLOverride: nil) + elementCallBaseURLOverride: nil, + colorScheme: .light) }() static var previews: some View { diff --git a/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriver.swift b/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriver.swift index 604a6e006..c596f5fd7 100644 --- a/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriver.swift +++ b/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriver.swift @@ -15,8 +15,8 @@ // import Combine -import Foundation import MatrixRustSDK +import SwiftUI private struct ElementCallWidgetMessage: Codable { enum Direction: String, Codable { @@ -53,7 +53,7 @@ class ElementCallWidgetDriver: WidgetCapabilitiesProvider, ElementCallWidgetDriv self.room = room } - func start(baseURL: URL, clientID: String) async -> Result { + func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result { guard let room = room as? Room else { return .failure(.roomInvalid) } @@ -75,10 +75,13 @@ class ElementCallWidgetDriver: WidgetCapabilitiesProvider, ElementCallWidgetDriv return .failure(.failedBuildingWidgetSettings) } + let languageTag = "\(Locale.current.language.languageCode ?? "en")-\(Locale.current.language.region ?? "US")" + let theme = colorScheme == .light ? "light" : "dark" + guard let urlString = try? await generateWebviewUrl(widgetSettings: widgetSettings, room: room, props: .init(clientId: clientID, - languageTag: nil, - theme: nil)) else { + languageTag: languageTag, + theme: theme)) else { return .failure(.failedBuildingCallURL) } diff --git a/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriverProtocol.swift b/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriverProtocol.swift index a2ea50e56..6141e9c0f 100644 --- a/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriverProtocol.swift +++ b/ElementX/Sources/Services/ElementCall/ElementCallWidgetDriverProtocol.swift @@ -15,7 +15,7 @@ // import Combine -import Foundation +import SwiftUI enum ElementCallWidgetDriverError: Error { case roomInvalid @@ -37,7 +37,7 @@ protocol ElementCallWidgetDriverProtocol { var messagePublisher: PassthroughSubject { get } var actions: AnyPublisher { get } - func start(baseURL: URL, clientID: String) async -> Result + func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result func sendMessage(_ message: String) async -> Result }