diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt index 4e23f23501..48002ac190 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt @@ -30,6 +30,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen +import io.element.android.compound.theme.ElementTheme import io.element.android.features.call.api.CallType import io.element.android.features.call.impl.data.WidgetMessage import io.element.android.features.call.impl.utils.ActiveCallManager @@ -68,6 +69,7 @@ class CallScreenPresenter @AssistedInject constructor( private val screenTracker: ScreenTracker, private val appCoroutineScope: CoroutineScope, private val activeCallManager: ActiveCallManager, + private val languageTagProvider: LanguageTagProvider, ) : Presenter { @AssistedFactory interface Factory { @@ -85,12 +87,19 @@ class CallScreenPresenter @AssistedInject constructor( val callWidgetDriver = remember { mutableStateOf(null) } val messageInterceptor = remember { mutableStateOf(null) } var isJoinedCall by rememberSaveable { mutableStateOf(false) } - + val languageTag = languageTagProvider.provideLanguageTag() + val theme = if (ElementTheme.isLightTheme) "light" else "dark" DisposableEffect(Unit) { coroutineScope.launch { // Sets the call as joined activeCallManager.joinedCall(callType) - loadUrl(callType, urlState, callWidgetDriver) + loadUrl( + inputs = callType, + urlState = urlState, + callWidgetDriver = callWidgetDriver, + languageTag = languageTag, + theme = theme, + ) } onDispose { activeCallManager.hungUpCall(callType) @@ -178,6 +187,8 @@ class CallScreenPresenter @AssistedInject constructor( inputs: CallType, urlState: MutableState>, callWidgetDriver: MutableState, + languageTag: String?, + theme: String?, ) { urlState.runCatchingUpdatingState { when (inputs) { @@ -189,6 +200,8 @@ class CallScreenPresenter @AssistedInject constructor( sessionId = inputs.sessionId, roomId = inputs.roomId, clientId = UUID.randomUUID().toString(), + languageTag = languageTag, + theme = theme, ).getOrThrow() callWidgetDriver.value = result.driver result.url diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/LanguageTagProvider.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/LanguageTagProvider.kt new file mode 100644 index 0000000000..8073e9b901 --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/LanguageTagProvider.kt @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.call.impl.ui + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalConfiguration +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope +import javax.inject.Inject + +interface LanguageTagProvider { + @Composable + fun provideLanguageTag(): String? +} + +@ContributesBinding(AppScope::class) +class DefaultLanguageTagProvider @Inject constructor() : LanguageTagProvider { + @Composable + override fun provideLanguageTag(): String? { + return LocalConfiguration.current.locales.get(0)?.toLanguageTag() + } +} diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallWidgetProvider.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallWidgetProvider.kt index 61843c471a..7152bdddad 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallWidgetProvider.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallWidgetProvider.kt @@ -25,8 +25,8 @@ interface CallWidgetProvider { sessionId: SessionId, roomId: RoomId, clientId: String, - languageTag: String? = null, - theme: String? = null, + languageTag: String?, + theme: String?, ): Result data class GetWidgetResult( diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt index 0e361962ec..f36269abc6 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt @@ -46,7 +46,12 @@ class DefaultCallWidgetProvider @Inject constructor( ?: elementCallBaseUrlProvider.provides(sessionId) ?: ElementCallConfig.DEFAULT_BASE_URL val widgetSettings = callWidgetSettingsProvider.provide(baseUrl, encrypted = room.isEncrypted) - val callUrl = room.generateWidgetWebViewUrl(widgetSettings, clientId, languageTag, theme).getOrThrow() + val callUrl = room.generateWidgetWebViewUrl( + widgetSettings = widgetSettings, + clientId = clientId, + languageTag = languageTag, + theme = theme, + ).getOrThrow() CallWidgetProvider.GetWidgetResult( driver = room.getWidgetDriver(widgetSettings).getOrThrow(), url = callUrl diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt index 182f2a13f6..09e6c86158 100644 --- a/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt @@ -292,6 +292,7 @@ class CallScreenPresenterTest { appCoroutineScope = this, activeCallManager = activeCallManager, screenTracker = screenTracker, + languageTagProvider = FakeLanguageTagProvider("en-US"), ) } } diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/FakeLanguageTagProvider.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/FakeLanguageTagProvider.kt new file mode 100644 index 0000000000..60c5be23da --- /dev/null +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/FakeLanguageTagProvider.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.call.ui + +import androidx.compose.runtime.Composable +import io.element.android.features.call.impl.ui.LanguageTagProvider + +class FakeLanguageTagProvider(private val languageTag: String?) : LanguageTagProvider { + @Composable + override fun provideLanguageTag() = languageTag +} diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index 3ff91996d3..44a611a43e 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -308,8 +308,8 @@ interface MatrixRoom : Closeable { suspend fun generateWidgetWebViewUrl( widgetSettings: MatrixWidgetSettings, clientId: String, - languageTag: String? = null, - theme: String? = null, + languageTag: String?, + theme: String?, ): Result /**