From 9111a86be6d1058f93d8cc90a01df189473752d2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 16:29:26 +0100 Subject: [PATCH 01/13] Add preview for focusedEvent --- .../impl/timeline/components/TimelineItemRow.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt index 33cf3cdfcf..0715dba3a4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt @@ -8,6 +8,8 @@ package io.element.android.features.messages.impl.timeline.components import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -28,6 +30,8 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateContent import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionEvent import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.text.toPx import io.element.android.libraries.designsystem.theme.highlightedMessageBackgroundColor import io.element.android.libraries.matrix.api.core.EventId @@ -192,3 +196,15 @@ private fun Modifier.focusedEvent( } }.padding(top = 4.dp) } + +@PreviewsDayNight +@Composable +internal fun FocusedEventPreview() = ElementPreview { + Box( + modifier = Modifier + .padding(16.dp) + .fillMaxWidth() + .height(160.dp) + .focusedEvent(0.dp), + ) +} From c865cf40d61d71f33727621da463e2037f3e26ab Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 17:21:11 +0100 Subject: [PATCH 02/13] Provide isEnterpriseBuild value to the Composable. --- .../designsystem/theme/ElementThemeApp.kt | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt index 0944664074..217189527c 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt @@ -9,10 +9,12 @@ package io.element.android.libraries.designsystem.theme import androidx.appcompat.app.AppCompatDelegate import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.staticCompositionLocalOf import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.Theme import io.element.android.compound.theme.isDark @@ -20,6 +22,8 @@ import io.element.android.compound.theme.mapToTheme import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.libraries.preferences.api.store.AppPreferencesStore +val LocalIsEnterpriseBuild = staticCompositionLocalOf { false } + /** * Theme to use for all the regular screens of the application. * Will manage the light / dark theme based on the user preference. @@ -48,10 +52,14 @@ fun ElementThemeApp( } val compoundLight = remember { enterpriseService.semanticColorsLight() } val compoundDark = remember { enterpriseService.semanticColorsDark() } - ElementTheme( - darkTheme = theme.isDark(), - content = content, - compoundLight = compoundLight, - compoundDark = compoundDark, - ) + CompositionLocalProvider( + LocalIsEnterpriseBuild provides enterpriseService.isEnterpriseBuild, + ) { + ElementTheme( + darkTheme = theme.isDark(), + content = content, + compoundLight = compoundLight, + compoundDark = compoundDark, + ) + } } From f7df69e6b3d7970644cc744ba79a18ee0d067eda Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 17:22:11 +0100 Subject: [PATCH 03/13] Let SuperButton use textActionAccent for enterprise build. --- .../components/button/SuperButton.kt | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt index d9e9471531..0d74836a05 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt @@ -42,6 +42,7 @@ import io.element.android.compound.tokens.generated.internal.DarkColorTokens import io.element.android.compound.tokens.generated.internal.LightColorTokens import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.LocalIsEnterpriseBuild import io.element.android.libraries.designsystem.theme.components.ButtonSize import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.lowHorizontalPaddingValue @@ -66,17 +67,24 @@ fun SuperButton( } } val isLightTheme = ElementTheme.isLightTheme - val colors = remember(isLightTheme) { - if (isLightTheme) { - listOf( - LightColorTokens.colorBlue900, - LightColorTokens.colorGreen1100, - ) - } else { - listOf( - DarkColorTokens.colorBlue900, - DarkColorTokens.colorGreen1100, - ) + val colors = if (LocalIsEnterpriseBuild.current) { + listOf( + ElementTheme.colors.textActionAccent, + ElementTheme.colors.textActionAccent, + ) + } else { + remember(isLightTheme) { + if (isLightTheme) { + listOf( + LightColorTokens.colorBlue900, + LightColorTokens.colorGreen1100, + ) + } else { + listOf( + DarkColorTokens.colorBlue900, + DarkColorTokens.colorGreen1100, + ) + } } } From 61a6e8dcf4cdd6f9e7315ef2d94274c1a6840d0a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 17:32:03 +0100 Subject: [PATCH 04/13] GradientFloatingActionButton use textActionAccent for enterprise build. --- .../button/GradientFloatingActionButton.kt | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt index e693b6ad64..8d9954d9d5 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt @@ -36,10 +36,12 @@ import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.unit.dp import io.element.android.compound.annotations.CoreColorToken +import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.compound.tokens.generated.internal.LightColorTokens import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.LocalIsEnterpriseBuild import io.element.android.libraries.designsystem.theme.components.Icon @OptIn(CoreColorToken::class) @@ -50,6 +52,16 @@ fun GradientFloatingActionButton( shape: Shape = RoundedCornerShape(25), content: @Composable () -> Unit, ) { + val color1 = if (LocalIsEnterpriseBuild.current) { + ElementTheme.colors.textActionAccent + } else { + LightColorTokens.colorGreen700 + } + val color2 = if (LocalIsEnterpriseBuild.current) { + ElementTheme.colors.textActionAccent + } else { + LightColorTokens.colorBlue900 + } val linearShaderBrush = remember { object : ShaderBrush() { override fun createShader(size: Size): Shader { @@ -57,8 +69,8 @@ fun GradientFloatingActionButton( from = Offset(size.width, size.height), to = Offset(size.width, 0f), colors = listOf( - LightColorTokens.colorBlue900, - LightColorTokens.colorGreen700, + color2, + color1, ), ) } @@ -71,8 +83,8 @@ fun GradientFloatingActionButton( center = size.center, radius = size.width / 2, colors = listOf( - LightColorTokens.colorGreen700, - LightColorTokens.colorBlue900, + color1, + color2, ) ) } From 0a62d40d1dbf81d1b9ce02b398da5a17d555cf0d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 17:50:45 +0100 Subject: [PATCH 05/13] Fix gradient on GradientFloatingActionButton --- .../components/button/GradientFloatingActionButton.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt index 8d9954d9d5..98e25b6484 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.geometry.center +import androidx.compose.ui.graphics.BlendMode import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.LinearGradientShader import androidx.compose.ui.graphics.RadialGradientShader @@ -97,8 +98,8 @@ fun GradientFloatingActionButton( .graphicsLayer(shape = shape, clip = false) .clip(shape) .drawBehind { - drawRect(brush = radialShaderBrush, alpha = 0.4f) drawRect(brush = linearShaderBrush) + drawRect(brush = radialShaderBrush, alpha = 0.4f, blendMode = BlendMode.Overlay) } .clickable( enabled = true, From 3db8ccad88a269de02f7a0c53a177350c23565c7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 18:19:02 +0100 Subject: [PATCH 06/13] Change color or TimelineItemReadMarkerView --- .../timeline/components/virtual/TimelineItemReadMarkerView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt index 039a60d670..b666f6ad56 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt @@ -37,13 +37,13 @@ internal fun TimelineItemReadMarkerView( Text( text = stringResource(id = R.string.screen_room_timeline_read_marker_title).uppercase(), style = ElementTheme.typography.fontBodySmMedium, - color = ElementTheme.colors.textSecondary, + color = ElementTheme.colors.textActionAccent, ) HorizontalDivider( modifier = Modifier .fillMaxWidth() .padding(horizontal = 2.dp), - color = ElementTheme.colors.borderInteractivePrimary, + color = ElementTheme.colors.textActionAccent, ) } } From a1004cc140c216384306eb1bc040aec630bd2504 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 16:39:12 +0100 Subject: [PATCH 07/13] Ensure color for highlighted message is ok for enterprise build. --- .../messages/impl/timeline/components/TimelineItemRow.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt index 0715dba3a4..b0ebb4ad53 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt @@ -33,6 +33,7 @@ import io.element.android.features.messages.impl.timeline.protection.TimelinePro import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.text.toPx +import io.element.android.libraries.designsystem.theme.LocalIsEnterpriseBuild import io.element.android.libraries.designsystem.theme.highlightedMessageBackgroundColor import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UserId @@ -171,8 +172,13 @@ private fun Modifier.focusedEvent( focusedEventOffset: Dp ): Modifier { val highlightedLineColor = ElementTheme.colors.textActionAccent + val gradientFirstColor = if (LocalIsEnterpriseBuild.current) { + ElementTheme.colors.textActionAccent.copy(alpha = 0.125f) + } else { + ElementTheme.colors.highlightedMessageBackgroundColor + } val gradientColors = listOf( - ElementTheme.colors.highlightedMessageBackgroundColor, + gradientFirstColor, ElementTheme.colors.bgCanvasDefault, ) val verticalOffset = focusedEventOffset.toPx() From a47b739490ac740cddcadd82d1c70d74b453ca11 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 7 Mar 2025 17:33:54 +0000 Subject: [PATCH 08/13] Update screenshots --- ...components.virtual_TimelineItemReadMarkerView_Day_0_en.png | 4 ++-- ...mponents.virtual_TimelineItemReadMarkerView_Night_0_en.png | 4 ++-- ...essages.impl.timeline.components_FocusedEvent_Day_0_en.png | 3 +++ ...sages.impl.timeline.components_FocusedEvent_Night_0_en.png | 3 +++ ...utton_GradientFloatingActionButtonCircleShape_Day_0_en.png | 4 ++-- ...ton_GradientFloatingActionButtonCircleShape_Night_0_en.png | 4 ++-- ...omponents.button_GradientFloatingActionButton_Day_0_en.png | 4 ++-- ...ponents.button_GradientFloatingActionButton_Night_0_en.png | 4 ++-- 8 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Night_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en.png index 02414ad0c3..db5ba1a5ae 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2becc435316b7adb15745bd0afbc2634cbc643b3919b2e7405b8a2b9b310acd0 -size 4451 +oid sha256:c899d8ca8e98ae73c8acd90cef3967834901929833c4d8287356a320f2bf4c0e +size 4523 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en.png index a106ea73f7..b9cab06223 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eb901534fbf1e05988710ea799d94daf9fa6a881edd84463ca0e065282ffbdb2 -size 4439 +oid sha256:f7579ab37a0ebe9671a46e591037fbd8991d3265e203d6ad0dcec6a6b7ceb588 +size 4386 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Day_0_en.png new file mode 100644 index 0000000000..8384f46c27 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2ea87ef947697fc3ea21c8953149db1c729be5391a4fd65f63b7b04aaf0e8cf +size 10465 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Night_0_en.png new file mode 100644 index 0000000000..5f1e275830 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ce07ba72b4542584273ee4004365fe50da4747e4aa06c46ea0d6b192647a1ac +size 10204 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Day_0_en.png index cb09d01ce9..afc6b91e2c 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e51f7c0e57fbdbeea27962cf3ebf58ead3a5689251eced57f2a37cb4373c9858 -size 7057 +oid sha256:867a27b40625fe6d0c214c3a4bea0a09baf298aebb53d3ff77e19b3dfe250414 +size 10393 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Night_0_en.png index bef7df4b6f..d291068fbe 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd6fd55c333b87c619189f4b0e1b1b0616f65982b322e03e271a59eaaf1a649b -size 6967 +oid sha256:df3a081fb057accffb4179c86f46cb05b033962c0339a96767b68610b9df9ecc +size 10313 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Day_0_en.png index 7a6b59b289..be39302a17 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6eb030d6d2f1c80cb7dea618c3a47db2f7db7b26ad19b3ba9313c0535ab7a761 -size 6533 +oid sha256:c43a92d9ca48521da56819a405585a96255b302a517832b7375870752489dacb +size 10516 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Night_0_en.png index 0b7e398df0..7e813bdae9 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b955337a438e1c29cd75961dadc489d14f726f7524281f4368fac1c1cfcb58d6 -size 6512 +oid sha256:82e2d283d97af1db75bacef222976be6e4f646d5606e9f4aa95fa15b81bb0898 +size 10414 From a775fb98dd84452a891752d8f73d77ea215250ad Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 18:45:54 +0100 Subject: [PATCH 09/13] Add LocalIsEnterpriseBuild to allow list --- tools/detekt/detekt.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/detekt/detekt.yml b/tools/detekt/detekt.yml index 0ebe19bcc4..a2f39c293e 100644 --- a/tools/detekt/detekt.yml +++ b/tools/detekt/detekt.yml @@ -229,6 +229,7 @@ Compose: - LocalRoomMemberProfilesCache - LocalMentionSpanTheme - LocalAnalyticsService + - LocalIsEnterpriseBuild CompositionLocalNaming: active: true ContentEmitterReturningValues: From 37fc68c6abf5f00d72264cbbb1df596d790a410c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Mar 2025 18:48:04 +0100 Subject: [PATCH 10/13] Add Konsist exception for FocusedEventPreview --- .../io/element/android/tests/konsist/KonsistPreviewTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt index e1ebdba139..4fdd4f8f90 100644 --- a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt @@ -66,6 +66,7 @@ class KonsistPreviewTest { "CallScreenPipViewPreview", "ColorAliasesPreview", "DefaultRoomListTopBarWithIndicatorPreview", + "FocusedEventPreview", "GradientFloatingActionButtonCircleShapePreview", "IconsCompoundPreview", "IconsOtherPreview", From 96683850bad1a18077f43e819c86cfea2e4914d7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Mar 2025 11:08:50 +0100 Subject: [PATCH 11/13] Change `LocalIsEnterpriseBuild` to `LocalBuildMeta` --- .../io/element/android/x/MainActivity.kt | 1 + .../io/element/android/x/di/AppBindings.kt | 3 +++ .../call/impl/ui/ElementCallActivity.kt | 3 +++ .../impl/unlock/activity/PinUnlockActivity.kt | 3 +++ .../timeline/components/TimelineItemRow.kt | 4 ++-- .../button/GradientFloatingActionButton.kt | 6 ++--- .../components/button/SuperButton.kt | 4 ++-- .../designsystem/theme/ElementThemeApp.kt | 24 +++++++++++++++++-- 8 files changed, 39 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/io/element/android/x/MainActivity.kt b/app/src/main/kotlin/io/element/android/x/MainActivity.kt index 2bdf083683..f80db878a7 100644 --- a/app/src/main/kotlin/io/element/android/x/MainActivity.kt +++ b/app/src/main/kotlin/io/element/android/x/MainActivity.kt @@ -64,6 +64,7 @@ class MainActivity : NodeActivity() { ElementThemeApp( appPreferencesStore = appBindings.preferencesStore(), enterpriseService = appBindings.enterpriseService(), + buildMeta = appBindings.buildMeta() ) { CompositionLocalProvider( LocalSnackbarDispatcher provides appBindings.snackbarDispatcher(), diff --git a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt index 4aa5d2c267..3d1838ea33 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt @@ -13,6 +13,7 @@ import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.lockscreen.api.LockScreenEntryPoint import io.element.android.features.lockscreen.api.LockScreenService import io.element.android.features.rageshake.api.reporter.BugReporter +import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.di.AppScope import io.element.android.libraries.matrix.api.tracing.TracingService @@ -38,4 +39,6 @@ interface AppBindings { fun analyticsService(): AnalyticsService fun enterpriseService(): EnterpriseService + + fun buildMeta(): BuildMeta } diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt index af7323eea4..a1906ff99a 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt @@ -48,6 +48,7 @@ import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.bindings import io.element.android.libraries.core.log.logger.LoggerTag +import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.designsystem.theme.ElementThemeApp import io.element.android.libraries.preferences.api.store.AppPreferencesStore import timber.log.Timber @@ -64,6 +65,7 @@ class ElementCallActivity : @Inject lateinit var appPreferencesStore: AppPreferencesStore @Inject lateinit var enterpriseService: EnterpriseService @Inject lateinit var pictureInPicturePresenter: PictureInPicturePresenter + @Inject lateinit var buildMeta: BuildMeta private lateinit var presenter: Presenter @@ -114,6 +116,7 @@ class ElementCallActivity : ElementThemeApp( appPreferencesStore = appPreferencesStore, enterpriseService = enterpriseService, + buildMeta = buildMeta, ) { val state = presenter.present() eventSink = state.eventSink diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt index 1be54e7b43..dd273ebac1 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt @@ -22,6 +22,7 @@ import io.element.android.features.lockscreen.impl.unlock.PinUnlockPresenter import io.element.android.features.lockscreen.impl.unlock.PinUnlockView import io.element.android.features.lockscreen.impl.unlock.di.PinUnlockBindings import io.element.android.libraries.architecture.bindings +import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.designsystem.theme.ElementThemeApp import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.coroutines.launch @@ -38,6 +39,7 @@ class PinUnlockActivity : AppCompatActivity() { @Inject lateinit var lockScreenService: LockScreenService @Inject lateinit var appPreferencesStore: AppPreferencesStore @Inject lateinit var enterpriseService: EnterpriseService + @Inject lateinit var buildMeta: BuildMeta override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() @@ -47,6 +49,7 @@ class PinUnlockActivity : AppCompatActivity() { ElementThemeApp( appPreferencesStore = appPreferencesStore, enterpriseService = enterpriseService, + buildMeta = buildMeta, ) { val state = presenter.present() PinUnlockView( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt index b0ebb4ad53..a10762b617 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt @@ -33,7 +33,7 @@ import io.element.android.features.messages.impl.timeline.protection.TimelinePro import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.text.toPx -import io.element.android.libraries.designsystem.theme.LocalIsEnterpriseBuild +import io.element.android.libraries.designsystem.theme.LocalBuildMeta import io.element.android.libraries.designsystem.theme.highlightedMessageBackgroundColor import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UserId @@ -172,7 +172,7 @@ private fun Modifier.focusedEvent( focusedEventOffset: Dp ): Modifier { val highlightedLineColor = ElementTheme.colors.textActionAccent - val gradientFirstColor = if (LocalIsEnterpriseBuild.current) { + val gradientFirstColor = if (LocalBuildMeta.current.isEnterpriseBuild) { ElementTheme.colors.textActionAccent.copy(alpha = 0.125f) } else { ElementTheme.colors.highlightedMessageBackgroundColor diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt index 98e25b6484..d58e181353 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt @@ -42,7 +42,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.compound.tokens.generated.internal.LightColorTokens import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.LocalIsEnterpriseBuild +import io.element.android.libraries.designsystem.theme.LocalBuildMeta import io.element.android.libraries.designsystem.theme.components.Icon @OptIn(CoreColorToken::class) @@ -53,12 +53,12 @@ fun GradientFloatingActionButton( shape: Shape = RoundedCornerShape(25), content: @Composable () -> Unit, ) { - val color1 = if (LocalIsEnterpriseBuild.current) { + val color1 = if (LocalBuildMeta.current.isEnterpriseBuild) { ElementTheme.colors.textActionAccent } else { LightColorTokens.colorGreen700 } - val color2 = if (LocalIsEnterpriseBuild.current) { + val color2 = if (LocalBuildMeta.current.isEnterpriseBuild) { ElementTheme.colors.textActionAccent } else { LightColorTokens.colorBlue900 diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt index 0d74836a05..a53955afc2 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt @@ -42,7 +42,7 @@ import io.element.android.compound.tokens.generated.internal.DarkColorTokens import io.element.android.compound.tokens.generated.internal.LightColorTokens import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.LocalIsEnterpriseBuild +import io.element.android.libraries.designsystem.theme.LocalBuildMeta import io.element.android.libraries.designsystem.theme.components.ButtonSize import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.lowHorizontalPaddingValue @@ -67,7 +67,7 @@ fun SuperButton( } } val isLightTheme = ElementTheme.isLightTheme - val colors = if (LocalIsEnterpriseBuild.current) { + val colors = if (LocalBuildMeta.current.isEnterpriseBuild) { listOf( ElementTheme.colors.textActionAccent, ElementTheme.colors.textActionAccent, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt index 217189527c..bb0fcd971b 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt @@ -20,9 +20,28 @@ import io.element.android.compound.theme.Theme import io.element.android.compound.theme.isDark import io.element.android.compound.theme.mapToTheme import io.element.android.features.enterprise.api.EnterpriseService +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.preferences.api.store.AppPreferencesStore -val LocalIsEnterpriseBuild = staticCompositionLocalOf { false } +val LocalBuildMeta = staticCompositionLocalOf { + BuildMeta( + isDebuggable = true, + buildType = BuildType.DEBUG, + applicationName = "MyApp", + productionApplicationName = "MyAppProd", + desktopApplicationName = "MyAppDesktop", + applicationId = "AppId", + isEnterpriseBuild = false, + lowPrivacyLoggingEnabled = false, + versionName = "aVersion", + versionCode = 123, + gitRevision = "aRevision", + gitBranchName = "aBranch", + flavorDescription = "aFlavor", + flavorShortDescription = "aFlavorShort", + ) +} /** * Theme to use for all the regular screens of the application. @@ -35,6 +54,7 @@ val LocalIsEnterpriseBuild = staticCompositionLocalOf { false } fun ElementThemeApp( appPreferencesStore: AppPreferencesStore, enterpriseService: EnterpriseService, + buildMeta: BuildMeta, content: @Composable () -> Unit, ) { val theme by remember { @@ -53,7 +73,7 @@ fun ElementThemeApp( val compoundLight = remember { enterpriseService.semanticColorsLight() } val compoundDark = remember { enterpriseService.semanticColorsDark() } CompositionLocalProvider( - LocalIsEnterpriseBuild provides enterpriseService.isEnterpriseBuild, + LocalBuildMeta provides buildMeta, ) { ElementTheme( darkTheme = theme.isDark(), From 7fd168f85af941ff2646490f200b6a05866fad76 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Mar 2025 11:12:22 +0100 Subject: [PATCH 12/13] Detekt again. --- tools/detekt/detekt.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/detekt/detekt.yml b/tools/detekt/detekt.yml index a2f39c293e..cd27b0be16 100644 --- a/tools/detekt/detekt.yml +++ b/tools/detekt/detekt.yml @@ -229,7 +229,7 @@ Compose: - LocalRoomMemberProfilesCache - LocalMentionSpanTheme - LocalAnalyticsService - - LocalIsEnterpriseBuild + - LocalBuildMeta CompositionLocalNaming: active: true ContentEmitterReturningValues: From 7f59cebe2c55d890dff3d0e9e3892a4293ae5401 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Mar 2025 14:26:30 +0100 Subject: [PATCH 13/13] Provide buildMeta in IncomingCallActivity. --- .../android/features/call/impl/ui/IncomingCallActivity.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt index 445e3c4f9a..9669285ce0 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt @@ -21,6 +21,7 @@ import io.element.android.features.call.impl.utils.ActiveCallManager import io.element.android.features.call.impl.utils.CallState import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.libraries.architecture.bindings +import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.designsystem.theme.ElementThemeApp import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.coroutines.flow.filter @@ -51,6 +52,9 @@ class IncomingCallActivity : AppCompatActivity() { @Inject lateinit var enterpriseService: EnterpriseService + @Inject + lateinit var buildMeta: BuildMeta + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -71,6 +75,7 @@ class IncomingCallActivity : AppCompatActivity() { ElementThemeApp( appPreferencesStore = appPreferencesStore, enterpriseService = enterpriseService, + buildMeta = buildMeta, ) { IncomingCallScreen( notificationData = notificationData,