diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj index 75c5bee..c2cd64e 100644 --- a/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/iosApp/iosApp.xcodeproj/project.pbxproj @@ -152,7 +152,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\nif [ -z \"$JAVA_HOME\" ] || [ ! -d \"$JAVA_HOME\" ]; then\n export JAVA_HOME=$(/usr/libexec/java_home -v 21 2>/dev/null || /usr/libexec/java_home 2>/dev/null)\nfi\ncd \"$SRCROOT/..\"\n./gradlew :sample:embedAndSignAppleFrameworkForXcode\n"; + shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\nif [ -z \"$JAVA_HOME\" ] || [ ! -d \"$JAVA_HOME\" ]; then\n export JAVA_HOME=$(/usr/libexec/java_home -v 21 2>/dev/null || /usr/libexec/java_home 2>/dev/null)\nfi\ncd \"$SRCROOT/..\"\n./gradlew :sample:shared:embedAndSignAppleFrameworkForXcode\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -300,7 +300,7 @@ ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/../sample/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", + "$(SRCROOT)/../sample/shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = iosApp/Info.plist; @@ -333,7 +333,7 @@ ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(SRCROOT)/../sample/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", + "$(SRCROOT)/../sample/shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = iosApp/Info.plist; diff --git a/sample/android-app/build.gradle.kts b/sample/android-app/build.gradle.kts index 7ec60e0..37b81a9 100644 --- a/sample/android-app/build.gradle.kts +++ b/sample/android-app/build.gradle.kts @@ -40,7 +40,7 @@ android { } dependencies { - implementation(project(":sample")) + implementation(project(":sample:shared")) implementation(project(":featured-debug-ui")) implementation(project(":featured-platform")) implementation(libs.androidx.activity.compose) diff --git a/sample/desktop/build.gradle.kts b/sample/desktop/build.gradle.kts new file mode 100644 index 0000000..f512a75 --- /dev/null +++ b/sample/desktop/build.gradle.kts @@ -0,0 +1,33 @@ +import org.jetbrains.compose.desktop.application.dsl.TargetFormat + +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.composeMultiplatform) + alias(libs.plugins.composeCompiler) +} + +kotlin { + jvmToolchain(21) + jvm() + + sourceSets { + jvmMain.dependencies { + implementation(compose.desktop.currentOs) + implementation(libs.kotlinx.coroutinesSwing) + implementation(project(":sample:shared")) + } + } +} + +compose.desktop { + application { + mainClass = "dev.androidbroadcast.featured.MainDesktop" + + nativeDistributions { + targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) + packageName = "dev.androidbroadcast.featured" + // Matches versionName in :sample:android-app + packageVersion = "1.0.0" + } + } +} diff --git a/sample/src/jvmMain/kotlin/dev/androidbroadcast/featured/Main.Desktop.kt b/sample/desktop/src/jvmMain/kotlin/dev/androidbroadcast/featured/Main.Desktop.kt similarity index 90% rename from sample/src/jvmMain/kotlin/dev/androidbroadcast/featured/Main.Desktop.kt rename to sample/desktop/src/jvmMain/kotlin/dev/androidbroadcast/featured/Main.Desktop.kt index 3940f58..0f1ad0d 100644 --- a/sample/src/jvmMain/kotlin/dev/androidbroadcast/featured/Main.Desktop.kt +++ b/sample/desktop/src/jvmMain/kotlin/dev/androidbroadcast/featured/Main.Desktop.kt @@ -14,7 +14,7 @@ fun main() { onCloseRequest = ::exitApplication, title = "Featured", ) { - FeaturedSample(configValues = configValues) + SampleApp(configValues = configValues) } } } diff --git a/sample/build.gradle.kts b/sample/shared/build.gradle.kts similarity index 73% rename from sample/build.gradle.kts rename to sample/shared/build.gradle.kts index e5f59e6..4f81ef5 100644 --- a/sample/build.gradle.kts +++ b/sample/shared/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -54,22 +53,5 @@ kotlin { implementation(project(":core")) implementation(project(":featured-registry")) } - - jvmMain.dependencies { - implementation(compose.desktop.currentOs) - implementation(libs.kotlinx.coroutinesSwing) - } - } -} - -compose.desktop { - application { - mainClass = "dev.androidbroadcast.featured.MainDesktop" - - nativeDistributions { - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "dev.androidbroadcast.featured" - packageVersion = "1.0.0" - } } } diff --git a/sample/src/androidMain/AndroidManifest.xml b/sample/shared/src/androidMain/AndroidManifest.xml similarity index 100% rename from sample/src/androidMain/AndroidManifest.xml rename to sample/shared/src/androidMain/AndroidManifest.xml diff --git a/sample/src/commonMain/composeResources/drawable/compose-multiplatform.xml b/sample/shared/src/commonMain/composeResources/drawable/compose-multiplatform.xml similarity index 100% rename from sample/src/commonMain/composeResources/drawable/compose-multiplatform.xml rename to sample/shared/src/commonMain/composeResources/drawable/compose-multiplatform.xml diff --git a/sample/src/commonMain/kotlin/dev/androidbroadcast/featured/FeaturedSample.kt b/sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/FeaturedSample.kt similarity index 100% rename from sample/src/commonMain/kotlin/dev/androidbroadcast/featured/FeaturedSample.kt rename to sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/FeaturedSample.kt diff --git a/sample/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleApp.kt b/sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleApp.kt similarity index 100% rename from sample/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleApp.kt rename to sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleApp.kt diff --git a/sample/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleFeatureFlags.kt b/sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleFeatureFlags.kt similarity index 100% rename from sample/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleFeatureFlags.kt rename to sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleFeatureFlags.kt diff --git a/sample/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleViewModel.kt b/sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleViewModel.kt similarity index 53% rename from sample/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleViewModel.kt rename to sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleViewModel.kt index 5955464..420da49 100644 --- a/sample/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleViewModel.kt +++ b/sample/shared/src/commonMain/kotlin/dev/androidbroadcast/featured/SampleViewModel.kt @@ -11,17 +11,8 @@ import kotlinx.coroutines.launch public class SampleViewModel( private val configValues: ConfigValues, ) : ViewModel() { - // --- @LocalFlag: main_button_red --- - public val flagActive: StateFlow = - configValues - .observe(SampleFeatureFlags.mainButtonRed) - .map { it.value } - .stateIn( - initialValue = SampleFeatureFlags.mainButtonRed.defaultValue, - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(stopTimeoutMillis = 5_000L), - ) + configValues.asStateFlow(SampleFeatureFlags.mainButtonRed, viewModelScope) public val mainButtonColor: StateFlow = flagActive @@ -39,53 +30,26 @@ public class SampleViewModel( } } - // --- @LocalFlag: new_feature_section_enabled (isEnabled guard pattern) --- - /** * Controls visibility of the "New Feature" section. * Demonstrates the [ConfigParam.isEnabled] guard pattern for entry-point gating. */ public val newFeatureSectionEnabled: StateFlow = - configValues - .observe(SampleFeatureFlags.newFeatureSectionEnabled) - .map { it.value } - .stateIn( - initialValue = SampleFeatureFlags.newFeatureSectionEnabled.defaultValue, - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(stopTimeoutMillis = 5_000L), - ) - - // --- @RemoteFlag: promo_banner_enabled --- + configValues.asStateFlow(SampleFeatureFlags.newFeatureSectionEnabled, viewModelScope) /** * Whether the promotional banner should be shown. * In production this would be driven by Firebase Remote Config. */ public val promoBannerEnabled: StateFlow = - configValues - .observe(SampleFeatureFlags.promoBannerEnabled) - .map { it.value } - .stateIn( - initialValue = SampleFeatureFlags.promoBannerEnabled.defaultValue, - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(stopTimeoutMillis = 5_000L), - ) - - // --- @RemoteFlag: checkout_variant --- + configValues.asStateFlow(SampleFeatureFlags.promoBannerEnabled, viewModelScope) /** * The active checkout variant, driven remotely. * Demonstrates multivariate enum flags resolved from a remote provider. */ public val checkoutVariant: StateFlow = - configValues - .observe(SampleFeatureFlags.checkoutVariant) - .map { it.value } - .stateIn( - initialValue = SampleFeatureFlags.checkoutVariant.defaultValue, - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(stopTimeoutMillis = 5_000L), - ) + configValues.asStateFlow(SampleFeatureFlags.checkoutVariant, viewModelScope) public sealed interface MainButtonColor { public data object Red : MainButtonColor diff --git a/sample/src/iosMain/kotlin/dev/androidbroadcast/featured/MainViewController.kt b/sample/shared/src/iosMain/kotlin/dev/androidbroadcast/featured/MainViewController.kt similarity index 91% rename from sample/src/iosMain/kotlin/dev/androidbroadcast/featured/MainViewController.kt rename to sample/shared/src/iosMain/kotlin/dev/androidbroadcast/featured/MainViewController.kt index 864939a..254a6b0 100644 --- a/sample/src/iosMain/kotlin/dev/androidbroadcast/featured/MainViewController.kt +++ b/sample/shared/src/iosMain/kotlin/dev/androidbroadcast/featured/MainViewController.kt @@ -10,6 +10,6 @@ import platform.UIKit.UIViewController public fun MainViewController(): UIViewController { val configValues = ConfigValues(localProvider = InMemoryConfigValueProvider()) return ComposeUIViewController { - FeaturedSample(configValues = configValues) + SampleApp(configValues = configValues) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 7556a0c..201871b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -37,8 +37,9 @@ plugins { } include(":featured-gradle-plugin") -include(":sample") +include(":sample:shared") include(":sample:android-app") +include(":sample:desktop") include(":core") include(":featured-compose") include(":featured-registry")