Loading app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt +4 −1 Original line number Diff line number Diff line Loading @@ -2,9 +2,12 @@ package app.k9mail.featureflag import app.k9mail.core.featureflag.FeatureFlag import app.k9mail.core.featureflag.FeatureFlagFactory import app.k9mail.core.featureflag.FeatureFlagKey class K9FeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List<FeatureFlag> { return emptyList() return listOf( FeatureFlag(FeatureFlagKey("material3_navigation_drawer"), false), ) } } app-thunderbird/src/main/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt +4 −1 Original line number Diff line number Diff line Loading @@ -2,9 +2,12 @@ package net.thunderbird.android.featureflag import app.k9mail.core.featureflag.FeatureFlag import app.k9mail.core.featureflag.FeatureFlagFactory import app.k9mail.core.featureflag.FeatureFlagKey class TbFeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List<FeatureFlag> { return emptyList() return listOf( FeatureFlag(FeatureFlagKey("material3_navigation_drawer"), false), ) } } core/featureflags/src/main/kotlin/app/k9mail/core/featureflag/FeatureFlagResult.kt +11 −3 Original line number Diff line number Diff line package app.k9mail.core.featureflag sealed interface FeatureFlagResult { object Enabled : FeatureFlagResult object Disabled : FeatureFlagResult object Unavailable : FeatureFlagResult data object Enabled : FeatureFlagResult data object Disabled : FeatureFlagResult data object Unavailable : FeatureFlagResult fun onEnabled(action: () -> Unit): FeatureFlagResult { if (this is Enabled) { Loading @@ -28,4 +28,12 @@ sealed interface FeatureFlagResult { return this } fun onDisabledOrUnavailable(action: () -> Unit): FeatureFlagResult { if (this is Disabled || this is Unavailable) { action() } return this } } core/featureflags/src/test/kotlin/app/k9mail/core/featureflags/FeatureFlagResultTest.kt +77 −15 Original line number Diff line number Diff line Loading @@ -11,50 +11,112 @@ class FeatureFlagResultTest { fun `should only call onEnabled when enabled`() { val testSubject = FeatureFlagResult.Enabled var result = "" var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" testSubject.onEnabled { result = "enabled" resultEnabled = "enabled" }.onDisabled { result = "disabled" resultDisabled = "disabled" }.onUnavailable { result = "unavailable" resultUnavailable = "unavailable" } assertThat(result).isEqualTo("enabled") assertThat(resultEnabled).isEqualTo("enabled") assertThat(resultDisabled).isEqualTo("") assertThat(resultUnavailable).isEqualTo("") } @Test fun `should only call onDisabled when disabled`() { val testSubject = FeatureFlagResult.Disabled var result = "" var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" testSubject.onEnabled { result = "enabled" resultEnabled = "enabled" }.onDisabled { result = "disabled" resultDisabled = "disabled" }.onUnavailable { result = "unavailable" resultUnavailable = "unavailable" } assertThat(result).isEqualTo("disabled") assertThat(resultEnabled).isEqualTo("") assertThat(resultDisabled).isEqualTo("disabled") assertThat(resultUnavailable).isEqualTo("") } @Test fun `should only call onUnavailable when unavailable`() { val testSubject = FeatureFlagResult.Unavailable var result = "" var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" testSubject.onEnabled { result = "enabled" resultEnabled = "enabled" }.onDisabled { result = "disabled" resultDisabled = "disabled" }.onUnavailable { result = "unavailable" resultUnavailable = "unavailable" } assertThat(result).isEqualTo("unavailable") assertThat(resultEnabled).isEqualTo("") assertThat(resultDisabled).isEqualTo("") assertThat(resultUnavailable).isEqualTo("unavailable") } @Test fun `should call onDisabledOrUnavailable when disabled`() { val testSubject = FeatureFlagResult.Disabled var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" var resultDisabledOrUnavailable = "" testSubject.onEnabled { resultEnabled = "enabled" }.onDisabled { resultDisabled = "disabled" }.onUnavailable { resultUnavailable = "unavailable" }.onDisabledOrUnavailable { resultDisabledOrUnavailable = "disabled or unavailable" } assertThat(resultEnabled).isEqualTo("") assertThat(resultDisabled).isEqualTo("disabled") assertThat(resultUnavailable).isEqualTo("") assertThat(resultDisabledOrUnavailable).isEqualTo("disabled or unavailable") } @Test fun `should call onDisabledOrUnavailable when unavailable`() { val testSubject = FeatureFlagResult.Unavailable var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" var resultDisabledOrUnavailable = "" testSubject.onEnabled { resultEnabled = "enabled" }.onDisabled { resultDisabled = "disabled" }.onUnavailable { resultUnavailable = "unavailable" }.onDisabledOrUnavailable { resultDisabledOrUnavailable = "disabled or unavailable" } assertThat(resultEnabled).isEqualTo("") assertThat(resultDisabled).isEqualTo("") assertThat(resultUnavailable).isEqualTo("unavailable") assertThat(resultDisabledOrUnavailable).isEqualTo("disabled or unavailable") } } legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt +13 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ import androidx.fragment.app.commitNow import app.k9mail.core.android.common.compat.BundleCompat import app.k9mail.core.android.common.contact.CachingRepository import app.k9mail.core.android.common.contact.ContactRepository import app.k9mail.core.featureflag.FeatureFlagKey import app.k9mail.core.featureflag.FeatureFlagProvider import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons import app.k9mail.feature.launcher.FeatureLauncherActivity import app.k9mail.feature.navigation.drawer.LegacyDrawer Loading Loading @@ -93,6 +95,7 @@ open class MessageList : private val messagingController: MessagingController by inject() private val contactRepository: ContactRepository by inject() private val coreResourceProvider: CoreResourceProvider by inject() private val featureFlagProvider: FeatureFlagProvider by inject() private lateinit var actionBar: ActionBar private var searchView: SearchView? = null Loading Loading @@ -579,6 +582,16 @@ open class MessageList : return } featureFlagProvider.provide(FeatureFlagKey("material3_navigation_drawer")) .onEnabled { TODO() } .onDisabledOrUnavailable { initializeLegacyDrawer(savedInstanceState) } } private fun initializeLegacyDrawer(savedInstanceState: Bundle?) { navigationDrawer = LegacyDrawer( parent = this, savedInstanceState = savedInstanceState, Loading Loading
app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt +4 −1 Original line number Diff line number Diff line Loading @@ -2,9 +2,12 @@ package app.k9mail.featureflag import app.k9mail.core.featureflag.FeatureFlag import app.k9mail.core.featureflag.FeatureFlagFactory import app.k9mail.core.featureflag.FeatureFlagKey class K9FeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List<FeatureFlag> { return emptyList() return listOf( FeatureFlag(FeatureFlagKey("material3_navigation_drawer"), false), ) } }
app-thunderbird/src/main/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt +4 −1 Original line number Diff line number Diff line Loading @@ -2,9 +2,12 @@ package net.thunderbird.android.featureflag import app.k9mail.core.featureflag.FeatureFlag import app.k9mail.core.featureflag.FeatureFlagFactory import app.k9mail.core.featureflag.FeatureFlagKey class TbFeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List<FeatureFlag> { return emptyList() return listOf( FeatureFlag(FeatureFlagKey("material3_navigation_drawer"), false), ) } }
core/featureflags/src/main/kotlin/app/k9mail/core/featureflag/FeatureFlagResult.kt +11 −3 Original line number Diff line number Diff line package app.k9mail.core.featureflag sealed interface FeatureFlagResult { object Enabled : FeatureFlagResult object Disabled : FeatureFlagResult object Unavailable : FeatureFlagResult data object Enabled : FeatureFlagResult data object Disabled : FeatureFlagResult data object Unavailable : FeatureFlagResult fun onEnabled(action: () -> Unit): FeatureFlagResult { if (this is Enabled) { Loading @@ -28,4 +28,12 @@ sealed interface FeatureFlagResult { return this } fun onDisabledOrUnavailable(action: () -> Unit): FeatureFlagResult { if (this is Disabled || this is Unavailable) { action() } return this } }
core/featureflags/src/test/kotlin/app/k9mail/core/featureflags/FeatureFlagResultTest.kt +77 −15 Original line number Diff line number Diff line Loading @@ -11,50 +11,112 @@ class FeatureFlagResultTest { fun `should only call onEnabled when enabled`() { val testSubject = FeatureFlagResult.Enabled var result = "" var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" testSubject.onEnabled { result = "enabled" resultEnabled = "enabled" }.onDisabled { result = "disabled" resultDisabled = "disabled" }.onUnavailable { result = "unavailable" resultUnavailable = "unavailable" } assertThat(result).isEqualTo("enabled") assertThat(resultEnabled).isEqualTo("enabled") assertThat(resultDisabled).isEqualTo("") assertThat(resultUnavailable).isEqualTo("") } @Test fun `should only call onDisabled when disabled`() { val testSubject = FeatureFlagResult.Disabled var result = "" var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" testSubject.onEnabled { result = "enabled" resultEnabled = "enabled" }.onDisabled { result = "disabled" resultDisabled = "disabled" }.onUnavailable { result = "unavailable" resultUnavailable = "unavailable" } assertThat(result).isEqualTo("disabled") assertThat(resultEnabled).isEqualTo("") assertThat(resultDisabled).isEqualTo("disabled") assertThat(resultUnavailable).isEqualTo("") } @Test fun `should only call onUnavailable when unavailable`() { val testSubject = FeatureFlagResult.Unavailable var result = "" var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" testSubject.onEnabled { result = "enabled" resultEnabled = "enabled" }.onDisabled { result = "disabled" resultDisabled = "disabled" }.onUnavailable { result = "unavailable" resultUnavailable = "unavailable" } assertThat(result).isEqualTo("unavailable") assertThat(resultEnabled).isEqualTo("") assertThat(resultDisabled).isEqualTo("") assertThat(resultUnavailable).isEqualTo("unavailable") } @Test fun `should call onDisabledOrUnavailable when disabled`() { val testSubject = FeatureFlagResult.Disabled var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" var resultDisabledOrUnavailable = "" testSubject.onEnabled { resultEnabled = "enabled" }.onDisabled { resultDisabled = "disabled" }.onUnavailable { resultUnavailable = "unavailable" }.onDisabledOrUnavailable { resultDisabledOrUnavailable = "disabled or unavailable" } assertThat(resultEnabled).isEqualTo("") assertThat(resultDisabled).isEqualTo("disabled") assertThat(resultUnavailable).isEqualTo("") assertThat(resultDisabledOrUnavailable).isEqualTo("disabled or unavailable") } @Test fun `should call onDisabledOrUnavailable when unavailable`() { val testSubject = FeatureFlagResult.Unavailable var resultEnabled = "" var resultDisabled = "" var resultUnavailable = "" var resultDisabledOrUnavailable = "" testSubject.onEnabled { resultEnabled = "enabled" }.onDisabled { resultDisabled = "disabled" }.onUnavailable { resultUnavailable = "unavailable" }.onDisabledOrUnavailable { resultDisabledOrUnavailable = "disabled or unavailable" } assertThat(resultEnabled).isEqualTo("") assertThat(resultDisabled).isEqualTo("") assertThat(resultUnavailable).isEqualTo("unavailable") assertThat(resultDisabledOrUnavailable).isEqualTo("disabled or unavailable") } }
legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt +13 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ import androidx.fragment.app.commitNow import app.k9mail.core.android.common.compat.BundleCompat import app.k9mail.core.android.common.contact.CachingRepository import app.k9mail.core.android.common.contact.ContactRepository import app.k9mail.core.featureflag.FeatureFlagKey import app.k9mail.core.featureflag.FeatureFlagProvider import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons import app.k9mail.feature.launcher.FeatureLauncherActivity import app.k9mail.feature.navigation.drawer.LegacyDrawer Loading Loading @@ -93,6 +95,7 @@ open class MessageList : private val messagingController: MessagingController by inject() private val contactRepository: ContactRepository by inject() private val coreResourceProvider: CoreResourceProvider by inject() private val featureFlagProvider: FeatureFlagProvider by inject() private lateinit var actionBar: ActionBar private var searchView: SearchView? = null Loading Loading @@ -579,6 +582,16 @@ open class MessageList : return } featureFlagProvider.provide(FeatureFlagKey("material3_navigation_drawer")) .onEnabled { TODO() } .onDisabledOrUnavailable { initializeLegacyDrawer(savedInstanceState) } } private fun initializeLegacyDrawer(savedInstanceState: Bundle?) { navigationDrawer = LegacyDrawer( parent = this, savedInstanceState = savedInstanceState, Loading