From 390337c426939335c4b066a5dbab88c5f1b25f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Tue, 6 May 2025 16:27:35 +0200 Subject: [PATCH 1/7] Changelog for version 25.05.0 --- CHANGES.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 2ff2ab0e58..90c76df76d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,52 @@ +Changes in Element X v25.05.0 +============================= + +## What's Changed +### ✨ Features +* Feature : Report room by @ganfra in https://github.com/element-hq/element-x-android/pull/4654 +### 🙌 Improvements +* Render kick and ban reason in the timeline when available by @bmarty in https://github.com/element-hq/element-x-android/pull/4642 +### 🐛 Bugfixes +* Accessibility: improve behavior of list items by @bmarty in https://github.com/element-hq/element-x-android/pull/4626 +* Render caller avatar on Incoming call screen by @bmarty in https://github.com/element-hq/element-x-android/pull/4635 +* Fix `Client.getJoinedRoom` crash when a room doesn't exist locally by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4656 +* Fix wrong member count in join room screen for invitation by @bmarty in https://github.com/element-hq/element-x-android/pull/4651 +* Make sure any `JoinedRustRoom` is destroyed after being used by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4678 +* Fix read receipt behavior when the timeline is opened. by @bmarty in https://github.com/element-hq/element-x-android/pull/4679 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4648 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4677 +### 🧱 Build +* OIDC configuration by @bmarty in https://github.com/element-hq/element-x-android/pull/4623 +* Pin commit sha on GitHub actions by @bmarty in https://github.com/element-hq/element-x-android/pull/4653 +### Dependency upgrades +* fix(deps): update dependency io.sentry:sentry-android to v8.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4624 +* fix(deps): update dependency com.posthog:posthog-android to v3.14.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4628 +* fix(deps): update dependency androidx.exifinterface:exifinterface to v1.4.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4632 +* fix(deps): update dependencyanalysis to v2.17.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4638 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.13.0 - autoclosed by @renovate in https://github.com/element-hq/element-x-android/pull/4637 +* fix(deps): update dependency io.sentry:sentry-android to v8.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4644 +* fix(deps): update dependency org.jsoup:jsoup to v1.20.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4655 +* fix(deps): update dependency com.google.accompanist:accompanist-permissions to v0.37.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4649 +* fix(deps): update dependency io.sentry:sentry-android to v8.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4660 +* fix(deps): update dependency io.mockk:mockk to v1.14.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4658 +* fix(deps): update dependency io.github.sergio-sastre.composablepreviewscanner:android to v0.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4647 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.4.30 by @renovate in https://github.com/element-hq/element-x-android/pull/4665 +* fix(deps): update kotlin to v2.1.20-2.0.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4670 +* fix(deps): update dependency io.sentry:sentry-android to v8.11.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4668 +* fix(deps): update dependency io.element.android:element-call-embedded to v0.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4667 +* chore(deps): update rnkdsh/action-upload-diawi action to v1.5.9 by @renovate in https://github.com/element-hq/element-x-android/pull/4674 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.7 by @renovate in https://github.com/element-hq/element-x-android/pull/4673 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.6 by @renovate in https://github.com/element-hq/element-x-android/pull/4681 +### Others +* Split `MatrixRoom` into `MatrixRoom` and `JoinedMatrixRoom` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4561 +* Cleanup element call and UI by @bmarty in https://github.com/element-hq/element-x-android/pull/4641 +* Take change of screen_change_server_error_no_sliding_sync_message into account by @bmarty in https://github.com/element-hq/element-x-android/pull/4650 +* Improve the callback uri format and customization. by @bmarty in https://github.com/element-hq/element-x-android/pull/4664 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.04.3...v25.05.0 + Changes in Element X v25.04.3 ============================= From 8ca5f8bc9d3dad921a1d87f7286f52cb3a7684ec Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 6 May 2025 19:25:07 +0200 Subject: [PATCH 2/7] Let EnterpriseService prevent usage of homeserver (#4682) * Add check on homeserver url. * Update screenshots * Add missing test * Update submodule link. --------- Co-authored-by: ElementBot --- enterprise | 2 +- .../enterprise/api/EnterpriseService.kt | 1 + .../impl/DefaultEnterpriseService.kt | 1 + .../impl/DefaultEnterpriseServiceTest.kt | 7 ++++ .../enterprise/test/FakeEnterpriseService.kt | 5 +++ .../changeserver/ChangeServerPresenter.kt | 5 +++ .../changeserver/ChangeServerStateProvider.kt | 2 + .../impl/changeserver/ChangeServerView.kt | 19 ++++++++- .../UnauthorizedAccountProviderException.kt | 14 +++++++ .../login/impl/error/ChangeServerError.kt | 7 ++++ .../impl/src/main/res/values/localazy.xml | 3 +- .../changeserver/ChangeServerPresenterTest.kt | 41 ++++++++++++++++++- ...changeserver_ChangeServerView_Day_3_en.png | 3 ++ ...angeserver_ChangeServerView_Night_3_en.png | 3 ++ 14 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/UnauthorizedAccountProviderException.kt create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_3_en.png diff --git a/enterprise b/enterprise index 0299b8ec4f..c754703e72 160000 --- a/enterprise +++ b/enterprise @@ -1 +1 @@ -Subproject commit 0299b8ec4f4233a39230d4c35b97f89728c35fd1 +Subproject commit c754703e720bcb20f5dfa1ea0dcd32976825f71c diff --git a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt index 9c1cb8b981..b5ade48e01 100644 --- a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt +++ b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt @@ -14,6 +14,7 @@ interface EnterpriseService { val isEnterpriseBuild: Boolean suspend fun isEnterpriseUser(sessionId: SessionId): Boolean fun defaultHomeserver(): String? + suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean fun semanticColorsLight(): SemanticColors fun semanticColorsDark(): SemanticColors diff --git a/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt index 2d66bb3968..97ab03361c 100644 --- a/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt +++ b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt @@ -23,6 +23,7 @@ class DefaultEnterpriseService @Inject constructor() : EnterpriseService { override suspend fun isEnterpriseUser(sessionId: SessionId) = false override fun defaultHomeserver() = null + override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String) = true override fun semanticColorsLight(): SemanticColors = compoundColorsLight diff --git a/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt b/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt index 0d5593dab9..0d9dc1cafa 100644 --- a/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt +++ b/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt @@ -8,6 +8,7 @@ package io.element.android.features.enterprise.impl import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.test.A_HOMESERVER_URL import io.element.android.libraries.matrix.test.A_SESSION_ID import kotlinx.coroutines.test.runTest import org.junit.Test @@ -25,6 +26,12 @@ class DefaultEnterpriseServiceTest { assertThat(defaultEnterpriseService.defaultHomeserver()).isNull() } + @Test + fun `isAllowedToConnectToHomeserver is true for all homeserver urls`() = runTest { + val defaultEnterpriseService = DefaultEnterpriseService() + assertThat(defaultEnterpriseService.isAllowedToConnectToHomeserver(A_HOMESERVER_URL)).isTrue() + } + @Test fun `isEnterpriseUser always return false`() = runTest { val defaultEnterpriseService = DefaultEnterpriseService() diff --git a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt index ae71bf6b76..52b49f4716 100644 --- a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt +++ b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt @@ -17,6 +17,7 @@ class FakeEnterpriseService( override val isEnterpriseBuild: Boolean = false, private val isEnterpriseUserResult: (SessionId) -> Boolean = { lambdaError() }, private val defaultHomeserverResult: () -> String? = { A_FAKE_HOMESERVER }, + private val isAllowedToConnectToHomeserverResult: (String) -> Boolean = { lambdaError() }, private val semanticColorsLightResult: () -> SemanticColors = { lambdaError() }, private val semanticColorsDarkResult: () -> SemanticColors = { lambdaError() }, private val firebasePushGatewayResult: () -> String? = { lambdaError() }, @@ -30,6 +31,10 @@ class FakeEnterpriseService( return defaultHomeserverResult() } + override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean = simulateLongTask { + isAllowedToConnectToHomeserverResult(homeserverUrl) + } + override fun semanticColorsLight(): SemanticColors { return semanticColorsLightResult() } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt index 9806c792ad..497bf96271 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt @@ -12,6 +12,7 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.login.impl.accountprovider.AccountProvider import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource import io.element.android.features.login.impl.error.ChangeServerError @@ -26,6 +27,7 @@ import javax.inject.Inject class ChangeServerPresenter @Inject constructor( private val authenticationService: MatrixAuthenticationService, private val accountProviderDataSource: AccountProviderDataSource, + private val enterpriseService: EnterpriseService, ) : Presenter { @Composable override fun present(): ChangeServerState { @@ -53,6 +55,9 @@ class ChangeServerPresenter @Inject constructor( changeServerAction: MutableState>, ) = launch { suspend { + if (enterpriseService.isAllowedToConnectToHomeserver(data.url).not()) { + throw UnauthorizedAccountProviderException(data) + } authenticationService.setHomeserver(data.url).map { authenticationService.getHomeserverDetails().value!! // Valid, remember user choice diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt index 8ed40ccedc..ae9ef58252 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt @@ -8,6 +8,7 @@ package io.element.android.features.login.impl.changeserver import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.features.login.impl.accountprovider.anAccountProvider import io.element.android.features.login.impl.error.ChangeServerError import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.ui.strings.CommonStrings @@ -18,6 +19,7 @@ open class ChangeServerStateProvider : PreviewParameterProvider { - when (val error = state.changeServerAction.error) { + when (val error = state.changeServerAction.error as? ChangeServerError) { is ChangeServerError.Error -> { ErrorDialog( modifier = modifier, @@ -53,6 +56,20 @@ fun ChangeServerView( } ) } + is ChangeServerError.UnauthorizedAccountProvider -> { + ErrorDialog( + modifier = modifier, + content = stringResource( + id = R.string.screen_change_server_error_unauthorized_homeserver, + LocalBuildMeta.current.applicationName, + error.accountProvider.title, + ), + onSubmit = { + eventSink.invoke(ChangeServerEvents.ClearError) + } + ) + } + null -> Unit } } is AsyncData.Loading -> ProgressDialog() diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/UnauthorizedAccountProviderException.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/UnauthorizedAccountProviderException.kt new file mode 100644 index 0000000000..9575031b91 --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/UnauthorizedAccountProviderException.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.login.impl.changeserver + +import io.element.android.features.login.impl.accountprovider.AccountProvider + +class UnauthorizedAccountProviderException( + val accountProvider: AccountProvider, +) : Exception() diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt index 618f4f81f6..69c0121c15 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt @@ -11,6 +11,8 @@ import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import io.element.android.features.login.impl.R +import io.element.android.features.login.impl.accountprovider.AccountProvider +import io.element.android.features.login.impl.changeserver.UnauthorizedAccountProviderException import io.element.android.libraries.matrix.api.auth.AuthenticationException import io.element.android.libraries.ui.strings.CommonStrings @@ -23,12 +25,17 @@ sealed class ChangeServerError : Throwable() { fun message(): String = messageStr ?: stringResource(messageId ?: CommonStrings.error_unknown) } + data class UnauthorizedAccountProvider( + val accountProvider: AccountProvider, + ) : ChangeServerError() + data object SlidingSyncAlert : ChangeServerError() companion object { fun from(error: Throwable): ChangeServerError = when (error) { is AuthenticationException.SlidingSyncVersion -> SlidingSyncAlert is AuthenticationException.Oidc -> Error(messageStr = error.message) + is UnauthorizedAccountProviderException -> UnauthorizedAccountProvider(error.accountProvider) else -> Error(messageId = R.string.screen_change_server_error_invalid_homeserver) } } diff --git a/features/login/impl/src/main/res/values/localazy.xml b/features/login/impl/src/main/res/values/localazy.xml index 3c5702ba94..d257ac1b11 100644 --- a/features/login/impl/src/main/res/values/localazy.xml +++ b/features/login/impl/src/main/res/values/localazy.xml @@ -14,9 +14,10 @@ "Use a different account provider, such as your own private server or a work account." "Change account provider" "We couldn\'t reach this homeserver. Please check that you have entered the homeserver URL correctly. If the URL is correct, contact your homeserver administrator for further help." - "Server isn\'t available due to an issue in the well-known file: + "Server isn\'t available due to an issue in the .well-known file: %1$s" "The selected account provider does not support sliding sync. An upgrade to the server is needed to use %1$s." + "%1$s is not allowed to connect to %2$s." "Homeserver URL" "Enter a domain address." "What is the address of your server?" diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt index 15b8856969..20b70028d9 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt @@ -8,14 +8,18 @@ package io.element.android.features.login.impl.changeserver import com.google.common.truth.Truth.assertThat +import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.enterprise.test.FakeEnterpriseService import io.element.android.features.login.impl.accountprovider.AccountProvider import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource +import io.element.android.features.login.impl.error.ChangeServerError import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.test.A_HOMESERVER import io.element.android.libraries.matrix.test.A_HOMESERVER_URL import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService import io.element.android.tests.testutils.WarmUpRule +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -38,6 +42,9 @@ class ChangeServerPresenterTest { val authenticationService = FakeMatrixAuthenticationService() createPresenter( authenticationService = authenticationService, + enterpriseService = FakeEnterpriseService( + isAllowedToConnectToHomeserverResult = { true }, + ), ).test { val initialState = awaitItem() assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized) @@ -52,7 +59,11 @@ class ChangeServerPresenterTest { @Test fun `present - change server error`() = runTest { - createPresenter().test { + createPresenter( + enterpriseService = FakeEnterpriseService( + isAllowedToConnectToHomeserverResult = { true }, + ), + ).test { val initialState = awaitItem() assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized) initialState.eventSink.invoke(ChangeServerEvents.ChangeServer(AccountProvider(url = A_HOMESERVER_URL))) @@ -67,11 +78,37 @@ class ChangeServerPresenterTest { } } + @Test + fun `present - change server not allowed error`() = runTest { + val isAllowedToConnectToHomeserverResult = lambdaRecorder { false } + createPresenter( + enterpriseService = FakeEnterpriseService( + isAllowedToConnectToHomeserverResult = isAllowedToConnectToHomeserverResult, + ), + ).test { + val initialState = awaitItem() + assertThat(initialState.changeServerAction).isEqualTo(AsyncData.Uninitialized) + val anAccountProvider = AccountProvider(url = A_HOMESERVER_URL) + initialState.eventSink.invoke(ChangeServerEvents.ChangeServer(anAccountProvider)) + val loadingState = awaitItem() + assertThat(loadingState.changeServerAction).isInstanceOf(AsyncData.Loading::class.java) + val failureState = awaitItem() + assertThat( + (failureState.changeServerAction.errorOrNull() as ChangeServerError.UnauthorizedAccountProvider).accountProvider + ).isEqualTo(anAccountProvider) + isAllowedToConnectToHomeserverResult.assertions() + .isCalledOnce() + .with(value(A_HOMESERVER_URL)) + } + } + private fun createPresenter( authenticationService: FakeMatrixAuthenticationService = FakeMatrixAuthenticationService(), accountProviderDataSource: AccountProviderDataSource = AccountProviderDataSource(FakeEnterpriseService()), + enterpriseService: EnterpriseService = FakeEnterpriseService(), ) = ChangeServerPresenter( authenticationService = authenticationService, - accountProviderDataSource = accountProviderDataSource + accountProviderDataSource = accountProviderDataSource, + enterpriseService = enterpriseService, ) } diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_3_en.png new file mode 100644 index 0000000000..2e5917d7de --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c1257fbdf388933be8fb2ae211c8abacc4cdb01c2a924a7ba3729337c9b6707 +size 15434 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_3_en.png new file mode 100644 index 0000000000..8a1571970c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb9a2d2145791122cc2ab7d903485de361fb6098216bf578dca7cc350e9f94a0 +size 13650 From 5fb0fc0d501956b3f69376cad9ccc1616b824b5a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 11:07:20 +0200 Subject: [PATCH 3/7] fix(deps): update android.gradle.plugin to v8.10.0 (#4687) * fix(deps): update android.gradle.plugin to v8.10.0 * Update lint version to 8.11.0-alpha09 * Fix lint false positive. Error: Modifier factory functions must use the receiver Modifier instance [ModifierFactoryUnreferencedReceiver from androidx.compose.ui] --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Benoit Marty --- .../location/api/internal/ModifierCenterBottomEdge.kt | 8 ++++---- gradle.properties | 2 +- gradle/libs.versions.toml | 2 +- .../android/libraries/designsystem/modifiers/Clickable.kt | 2 +- .../libraries/designsystem/theme/components/ListItem.kt | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/ModifierCenterBottomEdge.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/ModifierCenterBottomEdge.kt index 747eda0bae..40112cea4f 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/ModifierCenterBottomEdge.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/ModifierCenterBottomEdge.kt @@ -15,13 +15,13 @@ import androidx.compose.ui.unit.IntOffset * Horizontally aligns the content to the center of the space. * Vertically aligns the bottom edge of the content to the center of the space. */ -fun Modifier.centerBottomEdge(scope: BoxScope): Modifier = with(scope) { - then( +fun Modifier.centerBottomEdge(scope: BoxScope): Modifier = this.then( + with(scope) { Modifier.align { size, space, _ -> IntOffset( x = (space.width - size.width) / 2, y = space.height / 2 - size.height, ) } - ) -} + } +) diff --git a/gradle.properties b/gradle.properties index 4a941c0143..c9789f9dff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -40,7 +40,7 @@ signing.element.nightly.keyPassword=Secret # Customise the Lint version to use a more recent version than the one bundled with AGP # https://googlesamples.github.io/android-custom-lint-rules/usage/newer-lint.md.html -android.experimental.lint.version=8.10.0-alpha08 +android.experimental.lint.version=8.11.0-alpha09 # Enable test fixture for all modules by default android.experimental.enableTestFixtures=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1a94aa4ec1..49c8ce9422 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ [versions] # Project -android_gradle_plugin = "8.9.2" +android_gradle_plugin = "8.10.0" kotlin = "2.1.20" kotlinpoet = "2.1.0" ksp = "2.1.20-2.0.1" diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt index 3931d8d8d0..5789a4525d 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt @@ -14,7 +14,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp -fun Modifier.clickableIfNotNull(onClick: (() -> Unit)? = null): Modifier = then( +fun Modifier.clickableIfNotNull(onClick: (() -> Unit)? = null): Modifier = this.then( if (onClick != null) { Modifier.clickable { onClick() } } else { diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ListItem.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ListItem.kt index 426bd975a4..78195d4f98 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ListItem.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ListItem.kt @@ -177,7 +177,7 @@ private fun Modifier.withAccessibilityModifier( content: ListItemContent?, enabled: Boolean, onClick: (() -> Unit)?, -): Modifier = then( +): Modifier = this.then( when (content) { is ListItemContent.Checkbox -> { Modifier.toggleable( From 0beec202a5887a8d7b15c9b4508cb16bb9f6cacc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 8 May 2025 09:33:35 +0200 Subject: [PATCH 4/7] Ensure that the Rust room is not closed while the driver needs it. (#4694) --- .../features/call/impl/utils/DefaultCallWidgetProvider.kt | 1 - .../android/libraries/matrix/impl/room/JoinedRustRoom.kt | 1 + .../android/libraries/matrix/impl/widget/RustWidgetDriver.kt | 3 +++ 3 files changed, 4 insertions(+), 1 deletion(-) 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 30977eb05f..6f6bd9473c 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 @@ -48,7 +48,6 @@ class DefaultCallWidgetProvider @Inject constructor( ).getOrThrow() val driver = room.getWidgetDriver(widgetSettings).getOrThrow() - room.destroy() CallWidgetProvider.GetWidgetResult( driver = driver, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt index da5ad50bc9..5ef34d9bed 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt @@ -595,6 +595,7 @@ class JoinedRustRoom( RustWidgetDriver( widgetSettings = widgetSettings, room = innerRoom, + joinedRustRoom = this, widgetCapabilitiesProvider = object : WidgetCapabilitiesProvider { override fun acquireCapabilities(capabilities: WidgetCapabilities): WidgetCapabilities { return getElementCallRequiredPermissions(sessionId.value, baseRoom.deviceId.value) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/RustWidgetDriver.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/RustWidgetDriver.kt index c80313f5da..b723ab194b 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/RustWidgetDriver.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/RustWidgetDriver.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.matrix.impl.widget import io.element.android.libraries.matrix.api.widget.MatrixWidgetDriver import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings +import io.element.android.libraries.matrix.impl.room.JoinedRustRoom import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -24,6 +25,7 @@ import kotlin.coroutines.coroutineContext class RustWidgetDriver( widgetSettings: MatrixWidgetSettings, private val room: Room, + private val joinedRustRoom: JoinedRustRoom, private val widgetCapabilitiesProvider: WidgetCapabilitiesProvider, ) : MatrixWidgetDriver { // It's important to have extra capacity here to make sure we don't drop any messages @@ -69,5 +71,6 @@ class RustWidgetDriver( override fun close() { receiveMessageJob?.cancel() driverAndHandle.driver.close() + joinedRustRoom.destroy() } } From 7b0de4b0eeaa07bf513f0226bc65ab381f1dd68d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 11:15:27 +0200 Subject: [PATCH 5/7] fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.8 (#4696) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 49c8ce9422..0604dc699a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -169,7 +169,7 @@ jsoup = "org.jsoup:jsoup:1.20.1" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.1.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.5.6" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.5.8" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } From d2efaaddbda34d2c0a717fea73dcdacc9efd329f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Thu, 8 May 2025 11:23:31 +0200 Subject: [PATCH 6/7] Setting version for the release 25.05.1 --- plugins/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index 4f466cd12a..0dc89ecbdf 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -32,7 +32,7 @@ private const val versionYear = 25 private const val versionMonth = 5 // Note: must be in [0,99] -private const val versionReleaseNumber = 0 +private const val versionReleaseNumber = 1 object Versions { const val VERSION_CODE = (2000 + versionYear) * 10_000 + versionMonth * 100 + versionReleaseNumber From 5e39d907786c81e93e61814502e4b6625d6d012a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Thu, 8 May 2025 11:24:00 +0200 Subject: [PATCH 7/7] Adding fastlane file for version 25.05.1 --- fastlane/metadata/android/en-US/changelogs/202505010.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/202505010.txt diff --git a/fastlane/metadata/android/en-US/changelogs/202505010.txt b/fastlane/metadata/android/en-US/changelogs/202505010.txt new file mode 100644 index 0000000000..4712e9f21e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202505010.txt @@ -0,0 +1,2 @@ +Main changes in this version: fix Element Call not working. +Full changelog: https://github.com/element-hq/element-x-android/releases