fix(deps): update dependency androidx.compose.material3:material3 to v1.5.0-alpha15 (#6306)

* fix(deps): update dependency androidx.compose.material3:material3 to v1.5.0-alpha15

* Fix deprecations

* Add bottom sheet workaround

* Fix new lint issues

* Fix and ignore broken tests

* Update screenshots

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
Co-authored-by: ElementBot <android@element.io>
This commit is contained in:
renovate[bot] 2026-03-24 11:24:07 +01:00 committed by GitHub
parent 5c1e40b724
commit e8a2f97cf5
21 changed files with 62 additions and 42 deletions

View file

@ -9,6 +9,8 @@
package io.element.android.x package io.element.android.x
import android.app.Application import android.app.Application
import androidx.compose.material3.ComposeMaterial3Flags.isAnchoredDraggableComponentsStrictOffsetCheckEnabled
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.startup.AppInitializer import androidx.startup.AppInitializer
import androidx.work.Configuration import androidx.work.Configuration
import dev.zacsweers.metro.createGraphFactory import dev.zacsweers.metro.createGraphFactory
@ -27,6 +29,7 @@ class ElementXApplication : Application(), DependencyInjectionGraphOwner, Config
.setWorkerFactory(MetroWorkerFactory(graph.workerProviders)) .setWorkerFactory(MetroWorkerFactory(graph.workerProviders))
.build() .build()
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
AppInitializer.getInstance(this).apply { AppInitializer.getInstance(this).apply {
@ -36,5 +39,9 @@ class ElementXApplication : Application(), DependencyInjectionGraphOwner, Config
} }
logApplicationInfo(this) logApplicationInfo(this)
// Disable the strict offset check for anchored draggable components, as it can cause issues with bottom sheets.
// Remove once https://issuetracker.google.com/issues/477038695 is fixed.
isAnchoredDraggableComponentsStrictOffsetCheckEnabled = false
} }
} }

View file

@ -12,6 +12,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import dev.zacsweers.metro.Inject import dev.zacsweers.metro.Inject
import io.element.android.features.logout.api.direct.DirectLogoutEvents import io.element.android.features.logout.api.direct.DirectLogoutEvents
@ -30,17 +31,21 @@ class ChooseSelfVerificationModePresenter(
@Composable @Composable
override fun present(): ChooseSelfVerificationModeState { override fun present(): ChooseSelfVerificationModeState {
val hasDevicesToVerifyAgainst by encryptionService.hasDevicesToVerifyAgainst.collectAsState() val hasDevicesToVerifyAgainst by encryptionService.hasDevicesToVerifyAgainst.collectAsState()
val canUseRecoveryKey by encryptionService.recoveryStateStateFlow val canUseRecoveryKey by produceState<AsyncData<Boolean>>(AsyncData.Uninitialized) {
.mapState { recoveryState -> encryptionService.recoveryStateStateFlow
when (recoveryState) { .mapState { recoveryState ->
RecoveryState.WAITING_FOR_SYNC, when (recoveryState) {
RecoveryState.UNKNOWN -> AsyncData.Loading() RecoveryState.WAITING_FOR_SYNC,
RecoveryState.INCOMPLETE -> AsyncData.Success(true) RecoveryState.UNKNOWN -> AsyncData.Loading()
RecoveryState.ENABLED, RecoveryState.INCOMPLETE -> AsyncData.Success(true)
RecoveryState.DISABLED -> AsyncData.Success(false) RecoveryState.ENABLED,
RecoveryState.DISABLED -> AsyncData.Success(false)
}
} }
} .collect {
.collectAsState() value = it
}
}
val buttonsState by remember { val buttonsState by remember {
derivedStateOf { derivedStateOf {
val canUseAnotherDevice = hasDevicesToVerifyAgainst.dataOrNull() val canUseAnotherDevice = hasDevicesToVerifyAgainst.dataOrNull()

View file

@ -56,7 +56,6 @@ class RoomListViewTest {
eventsRecorder.assertList( eventsRecorder.assertList(
listOf( listOf(
RoomListEvent.UpdateVisibleRange(IntRange.EMPTY),
RoomListEvent.UpdateVisibleRange(0..5), RoomListEvent.UpdateVisibleRange(0..5),
) )
) )

View file

@ -38,6 +38,7 @@ import io.element.android.tests.testutils.setSafeContent
import io.element.android.wysiwyg.link.Link import io.element.android.wysiwyg.link.Link
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import org.junit.Ignore
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.rules.TestRule import org.junit.rules.TestRule
@ -141,6 +142,10 @@ class TimelineViewTest {
eventsRecorder.assertSingle(TimelineEvent.HideShieldDialog) eventsRecorder.assertSingle(TimelineEvent.HideShieldDialog)
} }
@Ignore(
"performScrollToIndex in compose tests no longer sets LazyListState.isScrollInProgress to true, so the LoadMore event is not emitted." +
"This needs to be reworked to use a different approach to check the LoadMore event was emitted."
)
@Test @Test
fun `scrolling near to the start of the loaded items triggers a pre-fetch`() { fun `scrolling near to the start of the loaded items triggers a pre-fetch`() {
val eventsRecorder = EventsRecorder<TimelineEvent>() val eventsRecorder = EventsRecorder<TimelineEvent>()

View file

@ -63,6 +63,10 @@ class ChangeRolesViewTest {
), ),
) )
rule.pressBackKey() rule.pressBackKey()
// Advance time to let the event be processed, as the search toggle might have some delay (e.g. for the animation)
rule.mainClock.advanceTimeBy(1)
eventsRecorder.assertSingle(ChangeRolesEvent.ToggleSearchActive) eventsRecorder.assertSingle(ChangeRolesEvent.ToggleSearchActive)
} }

View file

@ -120,7 +120,7 @@ androidx_preference = "androidx.preference:preference:1.2.1"
androidx_webkit = "androidx.webkit:webkit:1.15.0" androidx_webkit = "androidx.webkit:webkit:1.15.0"
androidx_compose_bom = { module = "androidx.compose:compose-bom", version.ref = "compose_bom" } androidx_compose_bom = { module = "androidx.compose:compose-bom", version.ref = "compose_bom" }
androidx_compose_material3 = { module = "androidx.compose.material3:material3", version = '1.5.0-alpha11' } androidx_compose_material3 = { module = "androidx.compose.material3:material3", version = '1.5.0-alpha15' }
androidx_compose_material3_windowsizeclass = { module = "androidx.compose.material3:material3-window-size-class" } androidx_compose_material3_windowsizeclass = { module = "androidx.compose.material3:material3-window-size-class" }
androidx_compose_material3_adaptive = "androidx.compose.material3:material3-adaptive-android:1.0.0-alpha06" androidx_compose_material3_adaptive = "androidx.compose.material3:material3-adaptive-android:1.0.0-alpha06"
androidx_compose_ui = { module = "androidx.compose.ui:ui" } androidx_compose_ui = { module = "androidx.compose.ui:ui" }

View file

@ -20,9 +20,9 @@ import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.RoundRect import androidx.compose.ui.geometry.RoundRect
import androidx.compose.ui.graphics.AndroidPaint
import androidx.compose.ui.graphics.ClipOp import androidx.compose.ui.graphics.ClipOp
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Paint
import androidx.compose.ui.graphics.Path import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.drawscope.clipPath import androidx.compose.ui.graphics.drawscope.clipPath
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
@ -55,10 +55,10 @@ fun Modifier.blurredShapeShadow(
addRoundRect(RoundRect(Rect(Offset.Zero, size), CornerRadius(cornerRadius.toPx()))) addRoundRect(RoundRect(Rect(Offset.Zero, size), CornerRadius(cornerRadius.toPx())))
} }
val frameworkPaint = android.graphics.Paint()
// Draw the blurred shadow, then cut out the shape from it // Draw the blurred shadow, then cut out the shape from it
clipPath(path, ClipOp.Difference) { clipPath(path, ClipOp.Difference) {
val paint = Paint() val paint = AndroidPaint(frameworkPaint)
val frameworkPaint = paint.asFrameworkPaint()
if (blurRadius != 0.dp) { if (blurRadius != 0.dp) {
frameworkPaint.maskFilter = BlurMaskFilter(blurRadius.toPx(), BlurMaskFilter.Blur.NORMAL) frameworkPaint.maskFilter = BlurMaskFilter(blurRadius.toPx(), BlurMaskFilter.Blur.NORMAL)
} }

View file

@ -54,7 +54,7 @@ fun ModalBottomSheet(
tonalElevation: Dp = if (ElementTheme.isLightTheme) 0.dp else BottomSheetDefaults.Elevation, tonalElevation: Dp = if (ElementTheme.isLightTheme) 0.dp else BottomSheetDefaults.Elevation,
scrimColor: Color = BottomSheetDefaults.ScrimColor, scrimColor: Color = BottomSheetDefaults.ScrimColor,
dragHandle: @Composable (() -> Unit)? = { BottomSheetDefaults.DragHandle() }, dragHandle: @Composable (() -> Unit)? = { BottomSheetDefaults.DragHandle() },
contentWindowInsets: @Composable () -> WindowInsets = { BottomSheetDefaults.windowInsets }, contentWindowInsets: @Composable () -> WindowInsets = { BottomSheetDefaults.modalWindowInsets },
content: @Composable ColumnScope.() -> Unit, content: @Composable ColumnScope.() -> Unit,
) { ) {
val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:de47f99903217dbe13518771d78b70ac8d53ec6f636a1d2693adb36f4d552909 oid sha256:9c6e4ac872b497e115985a4d9535c3720d3d9189537cfffcd3f3b30033db636b
size 57454 size 57156

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:302a8d726dadfda8dd336b10404c8046250deeb43d8b8caa0deaa04647dd1bdb oid sha256:70898c5044adbc7bb5a318bf218a551daeb62390d767eb0457774900f52d401a
size 55323 size 55072

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7455353141ee3d5cd656b6935207f465a22044dbddb6dbc031bf63d8d838c0c6 oid sha256:938d7774286e17cda5a154240e13e5bad8c424d0bfce9d0941540f1648039555
size 75268 size 75040

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4a35b229a3af65a3c5ecdf2e373d7870020dd9194cbc133c3755310e95a0083d oid sha256:ae0de9520beb1ce721797d2cc727494b4e9491fae3d8057133cabd86b70f410d
size 57337 size 56987

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7a6fbcdf4ab70694b5417141d65e2e58f19a4905191250238c253bb617aec2c8 oid sha256:1184bfad29af5a41c0049ade4c7e4da3b7c729e41cc5cb2d54201529f0f4d54b
size 50547 size 51476

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:9c98843d0390cf29ef7877af6c65bff74564f018b92f95c0244f99e612945790 oid sha256:45b982e467e1d33f5ad0ef2d5a1712589f378a07c8521ac273f2f40364c9adb8
size 34190 size 34004

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:5029d3fe6b336feeed2240030390d561eec91730d10a5bc09f8668d8d69d6d01 oid sha256:12195a28876c3c90b0488edf00046f5b941faa8c7203e60f5ab9317dcbe35cf1
size 26986 size 25757

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:d5aa69df4d7f1e48ca15ed7cba55b42124428aeb9bdd1bc840a81f75a389675a oid sha256:d6ab0c3e8353c2e3ce517065fb66c1fca10d58b96081c0dc7a44d59dd084cb3f
size 25512 size 24498

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:2a169164322e6dbe2e9c89ec175112cc70734fa1fab25c2103bbccafc52ee578 oid sha256:e5bd87fa02dda072996cb8b1c927bceca0a7dac0c790e82681b4c1e411523365
size 32147 size 32310

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:c3b8fa8a80cca09f7a50500f2e78f9fbf9f444338b997d392db45eb98acc30eb oid sha256:b456443ad681ee4edcbf5a605f9799062c5482f060506ec0f597056cef5510be
size 24235 size 24316

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:0c9a7d0453d64405e1ba929134c9f45664e6c2278c63e64a69f619fe45a742de oid sha256:7f60460469e16407dc671c08071a03553d2ffa81cde48bed19628f46b86cb778
size 23932 size 24033

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3ea14b8b16f5df12d0bb011a3a5496ca710506b4882dda83317a083052e91f1a oid sha256:ddd8149f9d7cb4867bdf5f12276d778d2ed56963051961e949f4feb470308fc4
size 63185 size 63636

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f12959d1d6610679fb551c6526dd8347e3e223f3e246772c5ac8632a80fcf3b8 oid sha256:6794c0d21a221b47c9c808339e7eae1195af9504d4ea3f68bede59f3d77cf1c4
size 61972 size 62497