mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 19:44:05 +00:00
Make sure Element Call uses the correct theme and language. (#3017)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user