diff --git a/src/main/kotlin/org/briarproject/briar/desktop/DesktopFeatureFlags.kt b/src/main/kotlin/org/briarproject/briar/desktop/DesktopFeatureFlags.kt new file mode 100644 index 0000000000000000000000000000000000000000..c52ff899cf188f16289e87f948eb3c53ba2a812d --- /dev/null +++ b/src/main/kotlin/org/briarproject/briar/desktop/DesktopFeatureFlags.kt @@ -0,0 +1,12 @@ +package org.briarproject.briar.desktop + +interface DesktopFeatureFlags { + + fun shouldEnablePrivateGroups(): Boolean + + fun shouldEnableForums(): Boolean + + fun shouldEnableBlogs(): Boolean + + fun shouldEnableTransportSettings(): Boolean +} diff --git a/src/main/kotlin/org/briarproject/briar/desktop/DesktopModule.kt b/src/main/kotlin/org/briarproject/briar/desktop/DesktopModule.kt index e5727398c46921001bd19449aac5c2f9ad5b4c56..1e436ca9efa2357c9e78ff80e96b079675f2c535 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/DesktopModule.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/DesktopModule.kt @@ -130,6 +130,17 @@ internal class DesktopModule( override fun shouldEnableDisappearingMessages() = false } + @Provides + @Singleton + internal fun provideDesktopFeatureFlags() = object : DesktopFeatureFlags { + // TODO: once we have shouldEnableBlogsInCore() in briar core, wire them up with these here + // so that the value for shouldEnableBlogs() is always the same the respective core flag. + override fun shouldEnablePrivateGroups() = false + override fun shouldEnableForums() = false + override fun shouldEnableBlogs() = false + override fun shouldEnableTransportSettings() = false + } + @Provides @Singleton internal fun provideImageCompressor(imageCompressor: ImageCompressorImpl): ImageCompressor { diff --git a/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt b/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt index 6bdbae821bf38e4260ae063e607d5187eac4d5e4..c07b4bd594bab17a9a66eb85ad7dc1964fce37d9 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt @@ -27,6 +27,7 @@ import org.briarproject.bramble.api.identity.LocalAuthor import org.briarproject.briar.desktop.contact.ProfileCircle import org.briarproject.briar.desktop.theme.sidebarSurface import org.briarproject.briar.desktop.ui.UiMode +import org.briarproject.briar.desktop.utils.getDesktopFeatureFlags val SIDEBAR_WIDTH = 56.dp @@ -54,26 +55,27 @@ fun BriarSidebar( ) { account?.let { ProfileCircle(size = 45.dp, it.id.bytes) } } - - for ( - (mode, icon) in listOf( - Pair(UiMode.CONTACTS, Icons.Filled.Contacts), - Pair(UiMode.GROUPS, Icons.Filled.Group), - Pair(UiMode.FORUMS, Icons.Filled.Forum), - Pair(UiMode.BLOGS, Icons.Filled.ChromeReaderMode), - ) - ) { + val items = buildList { + add(Pair(UiMode.CONTACTS, Icons.Filled.Contacts)) + val featureFlags = getDesktopFeatureFlags() + if (featureFlags.shouldEnablePrivateGroups()) add(Pair(UiMode.GROUPS, Icons.Filled.Group)) + if (featureFlags.shouldEnableForums()) add(Pair(UiMode.FORUMS, Icons.Filled.Forum)) + if (featureFlags.shouldEnableBlogs()) add(Pair(UiMode.BLOGS, Icons.Filled.ChromeReaderMode)) + } + for ((mode, icon) in items) { displayButton(uiMode, mode, icon) } } Column(verticalArrangement = Arrangement.Bottom) { - for ( - (mode, icon) in listOf( - Pair(UiMode.TRANSPORTS, Icons.Filled.WifiTethering), - Pair(UiMode.SETTINGS, Icons.Filled.Settings), - Pair(UiMode.SIGNOUT, Icons.Filled.Logout), + val items = buildList { + val featureFlags = getDesktopFeatureFlags() + if (featureFlags.shouldEnableTransportSettings()) add( + Pair(UiMode.TRANSPORTS, Icons.Filled.WifiTethering) ) - ) { + add(Pair(UiMode.SETTINGS, Icons.Filled.Settings)) + add(Pair(UiMode.SIGNOUT, Icons.Filled.Logout)) + } + for ((mode, icon) in items) { displayButton(uiMode, mode, icon) } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt b/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt index 3d9ad8ddfc789fd8e3697f042804af4cb1fabfaa..fb92e15d272180f26d888c0dd9f4465596225ed3 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.window.Window import org.briarproject.bramble.api.account.AccountManager import org.briarproject.bramble.api.lifecycle.LifecycleManager import org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING +import org.briarproject.briar.desktop.DesktopFeatureFlags import org.briarproject.briar.desktop.login.LoginScreen import org.briarproject.briar.desktop.login.RegistrationScreen import org.briarproject.briar.desktop.theme.BriarTheme @@ -37,6 +38,7 @@ interface BriarUi { } val LocalViewModelProvider = staticCompositionLocalOf<ViewModelProvider?> { null } +val LocalDesktopFeatureFlags = staticCompositionLocalOf<DesktopFeatureFlags?> { null } @Immutable @Singleton @@ -46,6 +48,7 @@ constructor( private val accountManager: AccountManager, private val lifecycleManager: LifecycleManager, private val viewModelProvider: ViewModelProvider, + private val desktopFeatureFlags: DesktopFeatureFlags, ) : BriarUi { override fun stop() { @@ -79,7 +82,10 @@ constructor( icon = painterResource("images/logo_circle.svg") ) { window.minimumSize = Dimension(800, 600) - CompositionLocalProvider(LocalViewModelProvider provides viewModelProvider) { + CompositionLocalProvider( + LocalViewModelProvider provides viewModelProvider, + LocalDesktopFeatureFlags provides desktopFeatureFlags + ) { BriarTheme(isDarkTheme = isDark) { when (screenState) { Screen.REGISTRATION -> diff --git a/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt b/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt index c636fa7384a9510090c94353db27b744fc954ce5..7196cc58f1da1fb995a1da8b5b01d71d9dd8bbc4 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt @@ -23,7 +23,7 @@ fun MainScreen( BriarSidebar( viewModel.account.value, viewModel.uiMode.value, - viewModel::setUiMode + viewModel::setUiMode, ) VerticalDivider() when (viewModel.uiMode.value) { diff --git a/src/main/kotlin/org/briarproject/briar/desktop/utils/FeatureFlagUtils.kt b/src/main/kotlin/org/briarproject/briar/desktop/utils/FeatureFlagUtils.kt new file mode 100644 index 0000000000000000000000000000000000000000..1e79562469e52c76d8e8c5c8fdcee66b405b640b --- /dev/null +++ b/src/main/kotlin/org/briarproject/briar/desktop/utils/FeatureFlagUtils.kt @@ -0,0 +1,9 @@ +package org.briarproject.briar.desktop.utils + +import androidx.compose.runtime.Composable +import org.briarproject.briar.desktop.ui.LocalDesktopFeatureFlags + +@Composable +fun getDesktopFeatureFlags() = checkNotNull(LocalDesktopFeatureFlags.current) { + "No DesktopFeatureFlags was provided via LocalDesktopFeatureFlags" +} diff --git a/src/test/kotlin/org/briarproject/briar/desktop/DesktopTestModule.kt b/src/test/kotlin/org/briarproject/briar/desktop/DesktopTestModule.kt index 7bf547826efa6f7d2245ca5cddd34557370cd223..f5a066935dcda354cd3c2ecaa7fb758455da629f 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/DesktopTestModule.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/DesktopTestModule.kt @@ -136,6 +136,17 @@ internal class DesktopTestModule( override fun shouldEnableDisappearingMessages() = false } + @Provides + @Singleton + internal fun provideDesktopFeatureFlags() = object : DesktopFeatureFlags { + // TODO: once we have shouldEnableBlogsInCore() in briar core, wire them up with these here + // so that the value for shouldEnableBlogs() is always the same the respective core flag. + override fun shouldEnablePrivateGroups() = false + override fun shouldEnableForums() = false + override fun shouldEnableBlogs() = false + override fun shouldEnableTransportSettings() = false + } + @Provides @Singleton internal fun provideImageCompressor(imageCompressor: ImageCompressorImpl): ImageCompressor {