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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 46 additions and 38 deletions

View File

@ -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

View File

@ -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<URL, ElementCallWidgetDriverError>!
var startBaseURLClientIDReturnValue: Result<URL, ElementCallWidgetDriverError>! {
var startBaseURLClientIDColorSchemeUnderlyingReturnValue: Result<URL, ElementCallWidgetDriverError>!
var startBaseURLClientIDColorSchemeReturnValue: Result<URL, ElementCallWidgetDriverError>! {
get {
if Thread.isMainThread {
return startBaseURLClientIDUnderlyingReturnValue
return startBaseURLClientIDColorSchemeUnderlyingReturnValue
} else {
var returnValue: Result<URL, ElementCallWidgetDriverError>? = 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<URL, ElementCallWidgetDriverError>)?
var startBaseURLClientIDColorSchemeClosure: ((URL, String, ColorScheme) async -> Result<URL, ElementCallWidgetDriverError>)?
func start(baseURL: URL, clientID: String) async -> Result<URL, ElementCallWidgetDriverError> {
startBaseURLClientIDCallsCount += 1
startBaseURLClientIDReceivedArguments = (baseURL: baseURL, clientID: clientID)
func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result<URL, ElementCallWidgetDriverError> {
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

View File

@ -143,7 +143,7 @@ extension RoomProxyMock {
fatalError()
}
widgetDriver.startBaseURLClientIDReturnValue = .success(url)
widgetDriver.startBaseURLClientIDColorSchemeReturnValue = .success(url)
elementCallWidgetDriverReturnValue = widgetDriver
sendCallNotificationIfNeeededReturnValue = .success(())

View File

@ -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() {

View File

@ -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):

View File

@ -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<ElementCallWidgetDriverAction, Never>().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 {

View File

@ -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<URL, ElementCallWidgetDriverError> {
func start(baseURL: URL, clientID: String, colorScheme: ColorScheme) async -> Result<URL, ElementCallWidgetDriverError> {
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)
}

View File

@ -15,7 +15,7 @@
//
import Combine
import Foundation
import SwiftUI
enum ElementCallWidgetDriverError: Error {
case roomInvalid
@ -37,7 +37,7 @@ protocol ElementCallWidgetDriverProtocol {
var messagePublisher: PassthroughSubject<String, 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>
}