Use right colors on ForcedDarkElementTheme

This commit is contained in:
Benoit Marty 2025-10-22 09:48:07 +02:00
parent 82c6aca7e5
commit 9af694b4a2
6 changed files with 43 additions and 4 deletions

View file

@ -28,6 +28,7 @@ dependencies {
api(projects.features.messages.api) api(projects.features.messages.api)
implementation(projects.appconfig) implementation(projects.appconfig)
implementation(projects.features.call.api) implementation(projects.features.call.api)
implementation(projects.features.enterprise.api)
implementation(projects.features.location.api) implementation(projects.features.location.api)
implementation(projects.features.poll.api) implementation(projects.features.poll.api)
implementation(projects.features.roomcall.api) implementation(projects.features.roomcall.api)

View file

@ -8,6 +8,9 @@
package io.element.android.features.messages.impl.attachments.preview package io.element.android.features.messages.impl.attachments.preview
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.Node
@ -15,12 +18,15 @@ import com.bumble.appyx.core.plugin.Plugin
import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode import io.element.android.annotations.ContributesNode
import io.element.android.compound.colors.SemanticColorsLightDark
import io.element.android.compound.theme.ForcedDarkElementTheme import io.element.android.compound.theme.ForcedDarkElementTheme
import io.element.android.features.enterprise.api.EnterpriseService
import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.attachments.Attachment
import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.inputs import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.mediaviewer.api.local.LocalMediaRenderer import io.element.android.libraries.mediaviewer.api.local.LocalMediaRenderer
@ -31,6 +37,8 @@ class AttachmentsPreviewNode(
@Assisted plugins: List<Plugin>, @Assisted plugins: List<Plugin>,
presenterFactory: AttachmentsPreviewPresenter.Factory, presenterFactory: AttachmentsPreviewPresenter.Factory,
private val localMediaRenderer: LocalMediaRenderer, private val localMediaRenderer: LocalMediaRenderer,
private val sessionId: SessionId,
private val enterpriseService: EnterpriseService,
) : Node(buildContext, plugins = plugins) { ) : Node(buildContext, plugins = plugins) {
data class Inputs( data class Inputs(
val attachment: Attachment, val attachment: Attachment,
@ -53,7 +61,12 @@ class AttachmentsPreviewNode(
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
ForcedDarkElementTheme { val colors by remember {
enterpriseService.semanticColorsFlow(sessionId = sessionId)
}.collectAsState(SemanticColorsLightDark.default)
ForcedDarkElementTheme(
colors = colors,
) {
val state = presenter.present() val state = presenter.present()
AttachmentsPreviewView( AttachmentsPreviewView(
state = state, state = state,

View file

@ -16,6 +16,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
import io.element.android.compound.colors.SemanticColorsLightDark
/** /**
* Can be used to force a composable in dark theme. * Can be used to force a composable in dark theme.
@ -23,6 +24,7 @@ import androidx.compose.ui.graphics.toArgb
*/ */
@Composable @Composable
fun ForcedDarkElementTheme( fun ForcedDarkElementTheme(
colors: SemanticColorsLightDark,
lightStatusBar: Boolean = false, lightStatusBar: Boolean = false,
content: @Composable () -> Unit, content: @Composable () -> Unit,
) { ) {
@ -47,5 +49,11 @@ fun ForcedDarkElementTheme(
) )
} }
} }
ElementTheme(darkTheme = true, lightStatusBar = lightStatusBar, content = content) ElementTheme(
darkTheme = true,
compoundLight = colors.light,
compoundDark = colors.dark,
lightStatusBar = lightStatusBar,
content = content,
)
} }

View file

@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.github.takahirom.roborazzi.captureRoboImage import com.github.takahirom.roborazzi.captureRoboImage
import io.element.android.compound.colors.SemanticColorsLightDark
import io.element.android.compound.screenshot.utils.screenshotFile import io.element.android.compound.screenshot.utils.screenshotFile
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.theme.ForcedDarkElementTheme import io.element.android.compound.theme.ForcedDarkElementTheme
@ -42,7 +43,9 @@ class ForcedDarkElementThemeTest {
verticalArrangement = Arrangement.spacedBy(10.dp) verticalArrangement = Arrangement.spacedBy(10.dp)
) { ) {
Text(text = "Outside") Text(text = "Outside")
ForcedDarkElementTheme { ForcedDarkElementTheme(
colors = SemanticColorsLightDark.default,
) {
Surface { Surface {
Box(modifier = Modifier.fillMaxSize()) { Box(modifier = Modifier.fillMaxSize()) {
Text(text = "Inside ForcedDarkElementTheme", modifier = Modifier.align(Alignment.Center)) Text(text = "Inside ForcedDarkElementTheme", modifier = Modifier.align(Alignment.Center))

View file

@ -32,6 +32,7 @@ dependencies {
implementation(libs.vanniktech.blurhash) implementation(libs.vanniktech.blurhash)
implementation(libs.telephoto.flick) implementation(libs.telephoto.flick)
implementation(projects.features.enterprise.api)
implementation(projects.features.viewfolder.api) implementation(projects.features.viewfolder.api)
implementation(projects.libraries.androidutils) implementation(projects.libraries.androidutils)
implementation(projects.libraries.architecture) implementation(projects.libraries.architecture)

View file

@ -8,6 +8,9 @@
package io.element.android.libraries.mediaviewer.impl.viewer package io.element.android.libraries.mediaviewer.impl.viewer
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.Node
@ -16,13 +19,16 @@ import com.bumble.appyx.core.plugin.plugins
import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode import io.element.android.annotations.ContributesNode
import io.element.android.compound.colors.SemanticColorsLightDark
import io.element.android.compound.theme.ForcedDarkElementTheme import io.element.android.compound.theme.ForcedDarkElementTheme
import io.element.android.features.enterprise.api.EnterpriseService
import io.element.android.features.viewfolder.api.TextFileViewer import io.element.android.features.viewfolder.api.TextFileViewer
import io.element.android.libraries.architecture.inputs import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.audio.api.AudioFocus import io.element.android.libraries.audio.api.AudioFocus
import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint
@ -47,6 +53,8 @@ class MediaViewerNode(
pagerKeysHandler: PagerKeysHandler, pagerKeysHandler: PagerKeysHandler,
private val textFileViewer: TextFileViewer, private val textFileViewer: TextFileViewer,
private val audioFocus: AudioFocus, private val audioFocus: AudioFocus,
private val sessionId: SessionId,
private val enterpriseService: EnterpriseService,
) : Node(buildContext, plugins = plugins), ) : Node(buildContext, plugins = plugins),
MediaViewerNavigator { MediaViewerNavigator {
private val inputs = inputs<MediaViewerEntryPoint.Params>() private val inputs = inputs<MediaViewerEntryPoint.Params>()
@ -127,7 +135,12 @@ class MediaViewerNode(
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
ForcedDarkElementTheme { val colors by remember {
enterpriseService.semanticColorsFlow(sessionId = sessionId)
}.collectAsState(SemanticColorsLightDark.default)
ForcedDarkElementTheme(
colors = colors,
) {
val state = presenter.present() val state = presenter.present()
MediaViewerView( MediaViewerView(
state = state, state = state,