From 1654f569a0cddb903fad7d0a93e4ea6e39765de7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 31 Jan 2025 16:50:01 +0100 Subject: [PATCH] Add ability to EnterpriseService to override theme colors --- app/src/main/kotlin/io/element/android/x/MainActivity.kt | 9 ++++++--- .../main/kotlin/io/element/android/x/di/AppBindings.kt | 3 +++ features/call/impl/build.gradle.kts | 1 + .../android/features/call/impl/ui/ElementCallActivity.kt | 7 ++++++- .../features/call/impl/ui/IncomingCallActivity.kt | 9 ++++++++- features/enterprise/api/build.gradle.kts | 1 + .../android/features/enterprise/api/EnterpriseService.kt | 4 ++++ features/enterprise/impl/build.gradle.kts | 1 + .../features/enterprise/impl/DefaultEnterpriseService.kt | 7 +++++++ features/lockscreen/impl/build.gradle.kts | 1 + .../lockscreen/impl/unlock/activity/PinUnlockActivity.kt | 7 ++++++- libraries/designsystem/build.gradle.kts | 1 + .../libraries/designsystem/theme/ElementThemeApp.kt | 6 ++++++ 13 files changed, 51 insertions(+), 6 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 2d2b645f3f..4a60a69c63 100644 --- a/app/src/main/kotlin/io/element/android/x/MainActivity.kt +++ b/app/src/main/kotlin/io/element/android/x/MainActivity.kt @@ -61,7 +61,10 @@ class MainActivity : NodeActivity() { @Composable private fun MainContent(appBindings: AppBindings) { val migrationState = appBindings.migrationEntryPoint().present() - ElementThemeApp(appBindings.preferencesStore()) { + ElementThemeApp( + appPreferencesStore = appBindings.preferencesStore(), + enterpriseService = appBindings.enterpriseService(), + ) { CompositionLocalProvider( LocalSnackbarDispatcher provides appBindings.snackbarDispatcher(), LocalUriHandler provides SafeUriHandler(this), @@ -69,8 +72,8 @@ class MainActivity : NodeActivity() { ) { Box( modifier = Modifier - .fillMaxSize() - .background(MaterialTheme.colorScheme.background), + .fillMaxSize() + .background(MaterialTheme.colorScheme.background), ) { if (migrationState.migrationAction.isSuccess()) { MainNodeHost() 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 e24fdbb9fb..4aa5d2c267 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 @@ -9,6 +9,7 @@ package io.element.android.x.di import com.squareup.anvil.annotations.ContributesTo import io.element.android.features.api.MigrationEntryPoint +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 @@ -35,4 +36,6 @@ interface AppBindings { fun lockScreenEntryPoint(): LockScreenEntryPoint fun analyticsService(): AnalyticsService + + fun enterpriseService(): EnterpriseService } diff --git a/features/call/impl/build.gradle.kts b/features/call/impl/build.gradle.kts index 7852b5f53c..4f2ae91c40 100644 --- a/features/call/impl/build.gradle.kts +++ b/features/call/impl/build.gradle.kts @@ -29,6 +29,7 @@ setupAnvil() dependencies { implementation(projects.appconfig) + implementation(projects.features.enterprise.api) implementation(projects.libraries.architecture) implementation(projects.libraries.core) implementation(projects.libraries.designsystem) 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 65859da60e..af7323eea4 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 @@ -44,6 +44,7 @@ import io.element.android.features.call.impl.pip.PictureInPictureState import io.element.android.features.call.impl.pip.PipView import io.element.android.features.call.impl.services.CallForegroundService import io.element.android.features.call.impl.utils.CallIntentDataParser +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 @@ -61,6 +62,7 @@ class ElementCallActivity : @Inject lateinit var callIntentDataParser: CallIntentDataParser @Inject lateinit var presenterFactory: CallScreenPresenter.Factory @Inject lateinit var appPreferencesStore: AppPreferencesStore + @Inject lateinit var enterpriseService: EnterpriseService @Inject lateinit var pictureInPicturePresenter: PictureInPicturePresenter private lateinit var presenter: Presenter @@ -109,7 +111,10 @@ class ElementCallActivity : setContent { val pipState = pictureInPicturePresenter.present() ListenToAndroidEvents(pipState) - ElementThemeApp(appPreferencesStore) { + ElementThemeApp( + appPreferencesStore = appPreferencesStore, + enterpriseService = enterpriseService, + ) { val state = presenter.present() eventSink = state.eventSink LaunchedEffect(state.isCallActive, state.isInWidgetMode) { 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 7dd4b56057..445e3c4f9a 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 @@ -19,6 +19,7 @@ import io.element.android.features.call.impl.di.CallBindings import io.element.android.features.call.impl.notifications.CallNotificationData 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.designsystem.theme.ElementThemeApp import io.element.android.libraries.preferences.api.store.AppPreferencesStore @@ -47,6 +48,9 @@ class IncomingCallActivity : AppCompatActivity() { @Inject lateinit var appPreferencesStore: AppPreferencesStore + @Inject + lateinit var enterpriseService: EnterpriseService + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -64,7 +68,10 @@ class IncomingCallActivity : AppCompatActivity() { val notificationData = intent?.let { IntentCompat.getParcelableExtra(it, EXTRA_NOTIFICATION_DATA, CallNotificationData::class.java) } if (notificationData != null) { setContent { - ElementThemeApp(appPreferencesStore) { + ElementThemeApp( + appPreferencesStore = appPreferencesStore, + enterpriseService = enterpriseService, + ) { IncomingCallScreen( notificationData = notificationData, onAnswer = ::onAnswer, diff --git a/features/enterprise/api/build.gradle.kts b/features/enterprise/api/build.gradle.kts index 91c54bc42c..ee9be570a5 100644 --- a/features/enterprise/api/build.gradle.kts +++ b/features/enterprise/api/build.gradle.kts @@ -13,6 +13,7 @@ android { } dependencies { + api(libs.compound) implementation(projects.libraries.architecture) implementation(projects.libraries.matrix.api) } 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 2ac334653e..305aae2243 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 @@ -7,9 +7,13 @@ package io.element.android.features.enterprise.api +import io.element.android.compound.tokens.generated.SemanticColors import io.element.android.libraries.matrix.api.core.SessionId interface EnterpriseService { val isEnterpriseBuild: Boolean suspend fun isEnterpriseUser(sessionId: SessionId): Boolean + + fun semanticColorsLight(): SemanticColors + fun semanticColorsDark(): SemanticColors } diff --git a/features/enterprise/impl/build.gradle.kts b/features/enterprise/impl/build.gradle.kts index 6beea5b83a..ce9275ab83 100644 --- a/features/enterprise/impl/build.gradle.kts +++ b/features/enterprise/impl/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { api(projects.features.enterprise.api) implementation(projects.libraries.architecture) implementation(projects.libraries.matrix.api) + api(libs.compound) testImplementation(libs.coroutines.test) testImplementation(libs.test.junit) 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 c77c7377d8..1a18ddbee3 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 @@ -8,6 +8,9 @@ package io.element.android.features.enterprise.impl import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.compound.tokens.generated.SemanticColors +import io.element.android.compound.tokens.generated.compoundColorsDark +import io.element.android.compound.tokens.generated.compoundColorsLight import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.libraries.di.AppScope import io.element.android.libraries.matrix.api.core.SessionId @@ -18,4 +21,8 @@ class DefaultEnterpriseService @Inject constructor() : EnterpriseService { override val isEnterpriseBuild = false override suspend fun isEnterpriseUser(sessionId: SessionId) = false + + override fun semanticColorsLight(): SemanticColors = compoundColorsLight + + override fun semanticColorsDark(): SemanticColors = compoundColorsDark } diff --git a/features/lockscreen/impl/build.gradle.kts b/features/lockscreen/impl/build.gradle.kts index 6e8784b72c..808abf9150 100644 --- a/features/lockscreen/impl/build.gradle.kts +++ b/features/lockscreen/impl/build.gradle.kts @@ -21,6 +21,7 @@ setupAnvil() dependencies { api(projects.features.lockscreen.api) implementation(projects.appconfig) + implementation(projects.features.enterprise.api) implementation(projects.libraries.core) implementation(projects.libraries.architecture) implementation(projects.libraries.matrix.api) 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 e308865315..f89d25dd76 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 @@ -16,6 +16,7 @@ import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import io.element.android.compound.theme.ElementTheme +import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.lockscreen.api.LockScreenLockState import io.element.android.features.lockscreen.api.LockScreenService import io.element.android.features.lockscreen.impl.unlock.PinUnlockPresenter @@ -38,13 +39,17 @@ class PinUnlockActivity : AppCompatActivity() { @Inject lateinit var presenter: PinUnlockPresenter @Inject lateinit var lockScreenService: LockScreenService @Inject lateinit var appPreferencesStore: AppPreferencesStore + @Inject lateinit var enterpriseService: EnterpriseService override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) bindings().inject(this) setContent { - ElementThemeApp(appPreferencesStore) { + ElementThemeApp( + appPreferencesStore = appPreferencesStore, + enterpriseService = enterpriseService, + ) { val state = presenter.present() val isDark = ElementTheme.isLightTheme.not() PinUnlockView( diff --git a/libraries/designsystem/build.gradle.kts b/libraries/designsystem/build.gradle.kts index 01e8d56bb0..3e8d776f50 100644 --- a/libraries/designsystem/build.gradle.kts +++ b/libraries/designsystem/build.gradle.kts @@ -31,6 +31,7 @@ android { implementation(libs.androidx.compose.material3.adaptive) implementation(libs.coil.compose) implementation(libs.vanniktech.blurhash) + implementation(projects.features.enterprise.api) implementation(projects.libraries.architecture) implementation(projects.libraries.preferences.api) implementation(projects.libraries.testtags) 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 2c69b8575a..0944664074 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 @@ -17,6 +17,7 @@ import io.element.android.compound.theme.ElementTheme 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.preferences.api.store.AppPreferencesStore /** @@ -29,6 +30,7 @@ import io.element.android.libraries.preferences.api.store.AppPreferencesStore @Composable fun ElementThemeApp( appPreferencesStore: AppPreferencesStore, + enterpriseService: EnterpriseService, content: @Composable () -> Unit, ) { val theme by remember { @@ -44,8 +46,12 @@ fun ElementThemeApp( } ) } + val compoundLight = remember { enterpriseService.semanticColorsLight() } + val compoundDark = remember { enterpriseService.semanticColorsDark() } ElementTheme( darkTheme = theme.isDark(), content = content, + compoundLight = compoundLight, + compoundDark = compoundDark, ) }