Make sure Element Call uses the correct theme and language. (#3017)

This commit is contained in:
Doug
2024-07-09 12:07:13 +01:00
committed by GitHub
parent dbdea337ca
commit fe5cea15d5
8 changed files with 46 additions and 38 deletions
@@ -554,12 +554,14 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol {
// MARK: Calls // MARK: Calls
private func presentCallScreen(roomProxy: RoomProxyProtocol) { private func presentCallScreen(roomProxy: RoomProxyProtocol) {
let colorScheme: ColorScheme = appMediator.windowManager.mainWindow.traitCollection.userInterfaceStyle == .light ? .light : .dark
let callScreenCoordinator = CallScreenCoordinator(parameters: .init(elementCallService: elementCallService, let callScreenCoordinator = CallScreenCoordinator(parameters: .init(elementCallService: elementCallService,
clientProxy: userSession.clientProxy, clientProxy: userSession.clientProxy,
roomProxy: roomProxy, roomProxy: roomProxy,
clientID: InfoPlistReader.main.bundleIdentifier, clientID: InfoPlistReader.main.bundleIdentifier,
elementCallBaseURL: appSettings.elementCallBaseURL, elementCallBaseURL: appSettings.elementCallBaseURL,
elementCallBaseURLOverride: appSettings.elementCallBaseURLOverride)) elementCallBaseURLOverride: appSettings.elementCallBaseURLOverride,
colorScheme: colorScheme))
callScreenCoordinator.actions callScreenCoordinator.actions
.sink { [weak self] action in .sink { [weak self] action in
@@ -4922,15 +4922,15 @@ class ElementCallWidgetDriverMock: ElementCallWidgetDriverProtocol {
//MARK: - start //MARK: - start
var startBaseURLClientIDUnderlyingCallsCount = 0 var startBaseURLClientIDColorSchemeUnderlyingCallsCount = 0
var startBaseURLClientIDCallsCount: Int { var startBaseURLClientIDColorSchemeCallsCount: Int {
get { get {
if Thread.isMainThread { if Thread.isMainThread {
return startBaseURLClientIDUnderlyingCallsCount return startBaseURLClientIDColorSchemeUnderlyingCallsCount
} else { } else {
var returnValue: Int? = nil var returnValue: Int? = nil
DispatchQueue.main.sync { DispatchQueue.main.sync {
returnValue = startBaseURLClientIDUnderlyingCallsCount returnValue = startBaseURLClientIDColorSchemeUnderlyingCallsCount
} }
return returnValue! return returnValue!
@@ -4938,29 +4938,29 @@ class ElementCallWidgetDriverMock: ElementCallWidgetDriverProtocol {
} }
set { set {
if Thread.isMainThread { if Thread.isMainThread {
startBaseURLClientIDUnderlyingCallsCount = newValue startBaseURLClientIDColorSchemeUnderlyingCallsCount = newValue
} else { } else {
DispatchQueue.main.sync { DispatchQueue.main.sync {
startBaseURLClientIDUnderlyingCallsCount = newValue startBaseURLClientIDColorSchemeUnderlyingCallsCount = newValue
} }
} }
} }
} }
var startBaseURLClientIDCalled: Bool { var startBaseURLClientIDColorSchemeCalled: Bool {
return startBaseURLClientIDCallsCount > 0 return startBaseURLClientIDColorSchemeCallsCount > 0
} }
var startBaseURLClientIDReceivedArguments: (baseURL: URL, clientID: String)? var startBaseURLClientIDColorSchemeReceivedArguments: (baseURL: URL, clientID: String, colorScheme: ColorScheme)?
var startBaseURLClientIDReceivedInvocations: [(baseURL: URL, clientID: String)] = [] var startBaseURLClientIDColorSchemeReceivedInvocations: [(baseURL: URL, clientID: String, colorScheme: ColorScheme)] = []
var startBaseURLClientIDUnderlyingReturnValue: Result<URL, ElementCallWidgetDriverError>! var startBaseURLClientIDColorSchemeUnderlyingReturnValue: Result<URL, ElementCallWidgetDriverError>!
var startBaseURLClientIDReturnValue: Result<URL, ElementCallWidgetDriverError>! { var startBaseURLClientIDColorSchemeReturnValue: Result<URL, ElementCallWidgetDriverError>! {
get { get {
if Thread.isMainThread { if Thread.isMainThread {
return startBaseURLClientIDUnderlyingReturnValue return startBaseURLClientIDColorSchemeUnderlyingReturnValue
} else { } else {
var returnValue: Result<URL, ElementCallWidgetDriverError>? = nil var returnValue: Result<URL, ElementCallWidgetDriverError>? = nil
DispatchQueue.main.sync { DispatchQueue.main.sync {
returnValue = startBaseURLClientIDUnderlyingReturnValue returnValue = startBaseURLClientIDColorSchemeUnderlyingReturnValue
} }
return returnValue! return returnValue!
@@ -4968,26 +4968,26 @@ class ElementCallWidgetDriverMock: ElementCallWidgetDriverProtocol {
} }
set { set {
if Thread.isMainThread { if Thread.isMainThread {
startBaseURLClientIDUnderlyingReturnValue = newValue startBaseURLClientIDColorSchemeUnderlyingReturnValue = newValue
} else { } else {
DispatchQueue.main.sync { DispatchQueue.main.sync {
startBaseURLClientIDUnderlyingReturnValue = newValue startBaseURLClientIDColorSchemeUnderlyingReturnValue = newValue
} }
} }
} }
} }
var startBaseURLClientIDClosure: ((URL, String) async -> Result<URL, ElementCallWidgetDriverError>)? var startBaseURLClientIDColorSchemeClosure: ((URL, String, ColorScheme) async -> Result<URL, ElementCallWidgetDriverError>)?
func start(baseURL: URL, clientID: String) async -> Result<URL, ElementCallWidgetDriverError> { func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result<URL, ElementCallWidgetDriverError> {
startBaseURLClientIDCallsCount += 1 startBaseURLClientIDColorSchemeCallsCount += 1
startBaseURLClientIDReceivedArguments = (baseURL: baseURL, clientID: clientID) startBaseURLClientIDColorSchemeReceivedArguments = (baseURL: baseURL, clientID: clientID, colorScheme: colorScheme)
DispatchQueue.main.async { DispatchQueue.main.async {
self.startBaseURLClientIDReceivedInvocations.append((baseURL: baseURL, clientID: clientID)) self.startBaseURLClientIDColorSchemeReceivedInvocations.append((baseURL: baseURL, clientID: clientID, colorScheme: colorScheme))
} }
if let startBaseURLClientIDClosure = startBaseURLClientIDClosure { if let startBaseURLClientIDColorSchemeClosure = startBaseURLClientIDColorSchemeClosure {
return await startBaseURLClientIDClosure(baseURL, clientID) return await startBaseURLClientIDColorSchemeClosure(baseURL, clientID, colorScheme)
} else { } else {
return startBaseURLClientIDReturnValue return startBaseURLClientIDColorSchemeReturnValue
} }
} }
//MARK: - sendMessage //MARK: - sendMessage
+1 -1
View File
@@ -143,7 +143,7 @@ extension RoomProxyMock {
fatalError() fatalError()
} }
widgetDriver.startBaseURLClientIDReturnValue = .success(url) widgetDriver.startBaseURLClientIDColorSchemeReturnValue = .success(url)
elementCallWidgetDriverReturnValue = widgetDriver elementCallWidgetDriverReturnValue = widgetDriver
sendCallNotificationIfNeeededReturnValue = .success(()) sendCallNotificationIfNeeededReturnValue = .success(())
@@ -24,6 +24,7 @@ struct CallScreenCoordinatorParameters {
let clientID: String let clientID: String
let elementCallBaseURL: URL let elementCallBaseURL: URL
let elementCallBaseURLOverride: URL? let elementCallBaseURLOverride: URL?
let colorScheme: ColorScheme
} }
enum CallScreenCoordinatorAction { enum CallScreenCoordinatorAction {
@@ -45,7 +46,8 @@ final class CallScreenCoordinator: CoordinatorProtocol {
roomProxy: parameters.roomProxy, roomProxy: parameters.roomProxy,
clientID: parameters.clientID, clientID: parameters.clientID,
elementCallBaseURL: parameters.elementCallBaseURL, elementCallBaseURL: parameters.elementCallBaseURL,
elementCallBaseURLOverride: parameters.elementCallBaseURLOverride) elementCallBaseURLOverride: parameters.elementCallBaseURLOverride,
colorScheme: parameters.colorScheme)
} }
func start() { func start() {
@@ -42,7 +42,8 @@ class CallScreenViewModel: CallScreenViewModelType, CallScreenViewModelProtocol
roomProxy: RoomProxyProtocol, roomProxy: RoomProxyProtocol,
clientID: String, clientID: String,
elementCallBaseURL: URL, elementCallBaseURL: URL,
elementCallBaseURLOverride: URL?) { elementCallBaseURLOverride: URL?,
colorScheme: ColorScheme) {
self.elementCallService = elementCallService self.elementCallService = elementCallService
self.roomProxy = roomProxy self.roomProxy = roomProxy
@@ -100,7 +101,7 @@ class CallScreenViewModel: CallScreenViewModelType, CallScreenViewModelProtocol
elementCallBaseURL elementCallBaseURL
} }
switch await widgetDriver.start(baseURL: baseURL, clientID: clientID) { switch await widgetDriver.start(baseURL: baseURL, clientID: clientID, colorScheme: colorScheme) {
case .success(let url): case .success(let url):
state.url = url state.url = url
case .failure(let error): case .failure(let error):
@@ -27,7 +27,6 @@ struct CallScreen: View {
.id(context.viewState.url) .id(context.viewState.url)
.ignoresSafeArea(edges: .bottom) .ignoresSafeArea(edges: .bottom)
.presentationDragIndicator(.visible) .presentationDragIndicator(.visible)
.environment(\.colorScheme, .dark)
.alert(item: $context.alertInfo) .alert(item: $context.alertInfo)
} }
} }
@@ -181,7 +180,7 @@ struct CallScreen_Previews: PreviewProvider {
let widgetDriver = ElementCallWidgetDriverMock() let widgetDriver = ElementCallWidgetDriverMock()
widgetDriver.underlyingMessagePublisher = .init() widgetDriver.underlyingMessagePublisher = .init()
widgetDriver.underlyingActions = PassthroughSubject<ElementCallWidgetDriverAction, Never>().eraseToAnyPublisher() widgetDriver.underlyingActions = PassthroughSubject<ElementCallWidgetDriverAction, Never>().eraseToAnyPublisher()
widgetDriver.startBaseURLClientIDReturnValue = .success(URL.userDirectory) widgetDriver.startBaseURLClientIDColorSchemeReturnValue = .success(URL.userDirectory)
roomProxy.elementCallWidgetDriverReturnValue = widgetDriver roomProxy.elementCallWidgetDriverReturnValue = widgetDriver
@@ -190,7 +189,8 @@ struct CallScreen_Previews: PreviewProvider {
roomProxy: roomProxy, roomProxy: roomProxy,
clientID: "io.element.elementx", clientID: "io.element.elementx",
elementCallBaseURL: "https://call.element.io", elementCallBaseURL: "https://call.element.io",
elementCallBaseURLOverride: nil) elementCallBaseURLOverride: nil,
colorScheme: .light)
}() }()
static var previews: some View { static var previews: some View {
@@ -15,8 +15,8 @@
// //
import Combine import Combine
import Foundation
import MatrixRustSDK import MatrixRustSDK
import SwiftUI
private struct ElementCallWidgetMessage: Codable { private struct ElementCallWidgetMessage: Codable {
enum Direction: String, Codable { enum Direction: String, Codable {
@@ -53,7 +53,7 @@ class ElementCallWidgetDriver: WidgetCapabilitiesProvider, ElementCallWidgetDriv
self.room = room self.room = room
} }
func start(baseURL: URL, clientID: String) async -> Result<URL, ElementCallWidgetDriverError> { func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result<URL, ElementCallWidgetDriverError> {
guard let room = room as? Room else { guard let room = room as? Room else {
return .failure(.roomInvalid) return .failure(.roomInvalid)
} }
@@ -75,10 +75,13 @@ class ElementCallWidgetDriver: WidgetCapabilitiesProvider, ElementCallWidgetDriv
return .failure(.failedBuildingWidgetSettings) 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, guard let urlString = try? await generateWebviewUrl(widgetSettings: widgetSettings, room: room,
props: .init(clientId: clientID, props: .init(clientId: clientID,
languageTag: nil, languageTag: languageTag,
theme: nil)) else { theme: theme)) else {
return .failure(.failedBuildingCallURL) return .failure(.failedBuildingCallURL)
} }
@@ -15,7 +15,7 @@
// //
import Combine import Combine
import Foundation import SwiftUI
enum ElementCallWidgetDriverError: Error { enum ElementCallWidgetDriverError: Error {
case roomInvalid case roomInvalid
@@ -37,7 +37,7 @@ protocol ElementCallWidgetDriverProtocol {
var messagePublisher: PassthroughSubject<String, Never> { get } var messagePublisher: PassthroughSubject<String, Never> { get }
var actions: AnyPublisher<ElementCallWidgetDriverAction, Never> { get } var actions: AnyPublisher<ElementCallWidgetDriverAction, Never> { get }
func start(baseURL: URL, clientID: String) async -> Result<URL, ElementCallWidgetDriverError> func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result<URL, ElementCallWidgetDriverError>
func sendMessage(_ message: String) async -> Result<Bool, ElementCallWidgetDriverError> func sendMessage(_ message: String) async -> Result<Bool, ElementCallWidgetDriverError>
} }