diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 8c355404..1051d870 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -11,6 +11,30 @@ plugins { alias(libs.plugins.ktlint) } +val organization: String? by project + +val appConfig = + mapOf( + "dw" to + AppConfig( + appId = "org.dw.probe", + appName = "News Media Scan", + srcRoot = "src/dwMain/kotlin", + resRoot = "src/dwMain/resources", + ), + "ooni" to + AppConfig( + appId = "org.ooni.probe", + appName = "OONI Probe", + srcRoot = "src/ooniMain/kotlin", + resRoot = "src/ooniMain/resources", + ), + ) + +val config = appConfig[organization] ?: appConfig["ooni"]!! + +println("The current build flavor is set to $organization with app id set to ${config.appId}.") + kotlin { androidTarget { @OptIn(ExperimentalKotlinGradlePluginApi::class) @@ -54,8 +78,11 @@ kotlin { implementation(libs.kotlin.serialization) implementation(libs.bundles.ui) implementation(libs.bundles.tooling) - } + getByName("commonMain") { + kotlin.srcDir(config.srcRoot) + } + } all { languageSettings.optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") } @@ -71,16 +98,24 @@ kotlin { } } +compose.resources { + customDirectory( + sourceSetName = "commonMain", + directoryProvider = provider { layout.projectDirectory.dir(config.resRoot) }, + ) +} + android { namespace = "org.ooni.probe" compileSdk = libs.versions.android.compileSdk.get().toInt() defaultConfig { - applicationId = "org.ooni.probe" + applicationId = config.appId minSdk = libs.versions.android.minSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt() versionCode = 1 versionName = "1.0" + resValue("string", "app_name", config.appName) } packaging { resources { @@ -121,3 +156,126 @@ ktlint { } additionalEditorconfig.put("ktlint_function_naming_ignore_when_annotated_with", "Composable") } + +tasks.register("copyCommonResourcesToFlavor") { + doLast { + val projectDir = project.projectDir.absolutePath + + val sourceFile = File(projectDir, "src/commonMain/composeResources") + + val destinationFile = File(projectDir, config.resRoot) + + copyRecursive(sourceFile, destinationFile) + } +} + +tasks.register("cleanCopiedCommonResourcesToFlavor") { + doLast { + val projectDir = project.projectDir.absolutePath + + val destinationFile = File(projectDir, config.resRoot) + destinationFile.listFiles()?.forEach { folder -> + folder.listFiles()?.forEach { file -> + if (file.name == ".gitignore") { + file.readText().lines().forEach { line -> + if (line.isNotEmpty()) { + println("Removing $line") + File(folder, line).deleteRecursively() + } + }.also { + file.delete() + } + } + } + } + } +} + +/** + * Configure the prepareComposeResourcesTaskForCommonMain task to depend on the copyCommonResourcesToFlavor task. + * This will ensure that the common resources are copied to the correct location before the task is executed. + * + * NOTE: Current limitation is that multiple resources directories are not supported. + */ +tasks.named("preBuild").configure { + dependsOn("copyCommonResourcesToFlavor") +} + +tasks.named("clean").configure { + dependsOn("copyCommonResourcesToFlavor") +} + +tasks.named("clean").configure { + dependsOn("cleanCopiedCommonResourcesToFlavor") +} + +data class AppConfig( + val appId: String, + val appName: String, + val srcRoot: String, + val resRoot: String, +) + +/** + * Ignore the copied file if it is not already ignored. + * + * @param filePath The path to the file to ignore. + * @param lineToAdd The line to add to the file. + */ +fun ignoreCopiedFileIfNotIgnored( + filePath: String, + lineToAdd: String, +) { + val file = File(filePath) + + if (!file.exists()) { + file.createNewFile() + } + + val fileContents = file.readText() + + if (!fileContents.contains(lineToAdd)) { + file.appendText("\n$lineToAdd") + } +} + +/** + * Copy files from one directory to another. + * + * @param from The source directory. + * @param to The destination directory. + */ +fun copyRecursive( + from: File, + to: File, +) { + if (!from.exists()) { + println("Source directory does not exist: $from") + return + } + from.listFiles()?.forEach { file -> + if (file.name != ".DS_Store") { + if (file.isDirectory) { + val newDir = File(to, file.name) + newDir.mkdir() + copyRecursive(file, newDir) + } else { + val destinationFile = File(to, file.name) + if (destinationFile.exists()) { + println("Overwriting $destinationFile") + destinationFile.delete() + } + if (!destinationFile.parentFile.exists()) { + destinationFile.parentFile.mkdirs() + } + file.copyTo(destinationFile).also { + println("Ignoring ${it.name}") + ignoreCopiedFileIfNotIgnored( + to.absolutePath + "/.gitignore", + it.name, + ) + } + } + } + } +} diff --git a/composeApp/src/androidMain/res/values/strings.xml b/composeApp/src/androidMain/res/values/strings.xml index 9301c107..85420055 100644 --- a/composeApp/src/androidMain/res/values/strings.xml +++ b/composeApp/src/androidMain/res/values/strings.xml @@ -1,3 +1,2 @@ - OONI Probe - \ No newline at end of file + diff --git a/composeApp/src/commonMain/composeResources/values/common.xml b/composeApp/src/commonMain/composeResources/values/common.xml new file mode 100644 index 00000000..4392043c --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values/common.xml @@ -0,0 +1,3 @@ + + Run Test + diff --git a/composeApp/src/commonMain/kotlin/org/ooni/probe/App.kt b/composeApp/src/commonMain/kotlin/org/ooni/probe/App.kt index 6f41befd..3f115e9a 100644 --- a/composeApp/src/commonMain/kotlin/org/ooni/probe/App.kt +++ b/composeApp/src/commonMain/kotlin/org/ooni/probe/App.kt @@ -11,7 +11,7 @@ import androidx.navigation.compose.rememberNavController import co.touchlab.kermit.Logger import org.jetbrains.compose.ui.tooling.preview.Preview import org.ooni.probe.di.Dependencies -import org.ooni.probe.ui.Theme +import org.ooni.probe.ui.AppTheme import org.ooni.probe.ui.navigation.Navigation @Composable @@ -19,7 +19,7 @@ import org.ooni.probe.ui.navigation.Navigation fun App(dependencies: Dependencies) { val navController = rememberNavController() - Theme { + AppTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background, diff --git a/composeApp/src/commonMain/kotlin/org/ooni/probe/shared/ThemeConfigBase.kt b/composeApp/src/commonMain/kotlin/org/ooni/probe/shared/ThemeConfigBase.kt new file mode 100644 index 00000000..82007a63 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/org/ooni/probe/shared/ThemeConfigBase.kt @@ -0,0 +1,7 @@ +package org.ooni.probe.shared + +import androidx.compose.material3.ColorScheme + +interface ThemeConfigBase { + fun colorScheme(isDarkTheme: Boolean): ColorScheme +} diff --git a/composeApp/src/commonMain/kotlin/org/ooni/probe/ui/Theme.kt b/composeApp/src/commonMain/kotlin/org/ooni/probe/ui/Theme.kt index ca9a42a8..796e85ff 100644 --- a/composeApp/src/commonMain/kotlin/org/ooni/probe/ui/Theme.kt +++ b/composeApp/src/commonMain/kotlin/org/ooni/probe/ui/Theme.kt @@ -4,71 +4,15 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Shapes -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp -private val primaryColor = Color(0xff0588cb) -private val primaryLightColor = primaryColor.copy(alpha = 0.75f) -private val secondaryColor = Color(0xff5db8fe) -private val secondaryLightColor = secondaryColor.copy(alpha = 0.75f) -private val primaryTextColor = Color(0xffffffff) -private val secondaryTextColor = Color(0xff000000) -private val surfaceDark = Color(0xFF161616) -private val surfaceLight = Color(0xFFFFFFFF) -private val backgroundLightColor = Color(0xffF1F0F5) -private val backgroundDarkColor = Color(0xff010100) -private val errorColor = Color(0xFFFF8989) -private val onErrorColor = Color(0xFF000000) - -private val LightColors = - lightColorScheme( - primary = primaryColor, - onPrimary = primaryTextColor, - secondary = secondaryColor, - onSecondary = secondaryTextColor, - tertiary = primaryLightColor, - onTertiary = primaryTextColor, - background = backgroundLightColor, - onBackground = Color.Black, - surface = surfaceLight, - onSurface = Color.Black, - surfaceVariant = surfaceLight, - onSurfaceVariant = Color.Black, - secondaryContainer = primaryColor, - onSecondaryContainer = Color.White, - error = errorColor, - onError = onErrorColor, - ) - -private val DarkColors = - darkColorScheme( - primary = primaryColor, - onPrimary = primaryTextColor, - secondary = secondaryLightColor, - onSecondary = secondaryTextColor, - tertiary = primaryLightColor, - onTertiary = primaryTextColor, - background = backgroundDarkColor, - onBackground = Color.White, - surface = surfaceDark, - onSurface = Color.White, - surfaceVariant = surfaceDark, - onSurfaceVariant = Color.White, - secondaryContainer = primaryColor, - onSecondaryContainer = Color.White, - error = errorColor, - onError = onErrorColor, - ) - @Composable -internal fun Theme( +fun AppTheme( useDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit, ) { - val colorScheme = if (useDarkTheme) DarkColors else LightColors + val colorScheme = ThemeConfig.colorScheme(useDarkTheme) val shapes = Shapes( small = RoundedCornerShape(4.dp), diff --git a/composeApp/src/commonMain/kotlin/org/ooni/probe/ui/dashboard/DashboardScreen.kt b/composeApp/src/commonMain/kotlin/org/ooni/probe/ui/dashboard/DashboardScreen.kt index 7334c255..a66857db 100644 --- a/composeApp/src/commonMain/kotlin/org/ooni/probe/ui/dashboard/DashboardScreen.kt +++ b/composeApp/src/commonMain/kotlin/org/ooni/probe/ui/dashboard/DashboardScreen.kt @@ -1,43 +1,73 @@ package org.ooni.probe.ui.dashboard +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import ooniprobe.composeapp.generated.resources.Res +import ooniprobe.composeapp.generated.resources.app_name +import ooniprobe.composeapp.generated.resources.logo +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.ui.tooling.preview.Preview -import org.ooni.probe.ui.Theme +import org.ooni.probe.ui.AppTheme +@OptIn(ExperimentalMaterial3Api::class) @Composable fun DashboardScreen( state: DashboardViewModel.State, onEvent: (DashboardViewModel.Event) -> Unit, ) { - Column { - Button( - onClick = { onEvent(DashboardViewModel.Event.StartClick) }, - enabled = !state.isRunning, + Scaffold( + topBar = { + TopAppBar( + title = { + Text(stringResource(Res.string.app_name)) + }, + ) + }, + ) { contentPadding -> + + Column( + modifier = Modifier.padding(contentPadding), + verticalArrangement = Arrangement.Center, ) { - Text("Run Test") - } + Button( + onClick = { onEvent(DashboardViewModel.Event.StartClick) }, + enabled = !state.isRunning, + ) { + // Text(stringResource(Res.string.run_tests)) + Text("Run Tests") + } - Text( - text = state.log, - modifier = - Modifier - .fillMaxSize() - .verticalScroll(rememberScrollState()), - ) + Image( + painterResource(Res.drawable.logo), + contentDescription = "OONI Probe Logo", + modifier = Modifier.align(Alignment.CenterHorizontally), + ) + Text( + text = state.log, + modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()), + ) + } } } @Preview @Composable fun DashboardScreenPreview() { - Theme { + AppTheme { DashboardScreen( state = DashboardViewModel.State(isRunning = false, log = ""), onEvent = {}, diff --git a/composeApp/src/dwMain/kotlin/Config.kt b/composeApp/src/dwMain/kotlin/Config.kt new file mode 100644 index 00000000..a6e0da90 --- /dev/null +++ b/composeApp/src/dwMain/kotlin/Config.kt @@ -0,0 +1,7 @@ +object Config { + object Config { + const val OONI_API_BASE_URL: String = "https://api.prod.ooni.io" + const val OONI_RUN_DASHBOARD_URL: String = "https://run-v2.ooni.org" + const val BASE_SOFTWARE_NAME: String = "news-media-scan" + } +} diff --git a/composeApp/src/dwMain/kotlin/org/ooni/probe/ui/Colors.kt b/composeApp/src/dwMain/kotlin/org/ooni/probe/ui/Colors.kt new file mode 100644 index 00000000..217ad4dd --- /dev/null +++ b/composeApp/src/dwMain/kotlin/org/ooni/probe/ui/Colors.kt @@ -0,0 +1,64 @@ +package org.ooni.probe.ui + +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.ui.graphics.Color + +class ThemeConfig { + companion object { + fun colorScheme(isDarkTheme: Boolean) = if (isDarkTheme) darkColors else lightColors + } +} + +private val primaryColor = Color(0xffD32625) +private val primaryLightColor = primaryColor.copy(alpha = 0.75f) +private val secondaryColor = Color(0xff5db8fe) +private val secondaryLightColor = secondaryColor.copy(alpha = 0.75f) +private val primaryTextColor = Color(0xffffffff) +private val secondaryTextColor = Color(0xff000000) +private val surfaceDark = Color(0xFF161616) +private val surfaceLight = Color(0xFFFFFFFF) +private val backgroundLightColor = Color(0xffF1F0F5) +private val backgroundDarkColor = Color(0xff010100) +private val errorColor = Color(0xFFFF8989) +private val onErrorColor = Color(0xFF000000) + +val darkColors: ColorScheme = + darkColorScheme( + primary = primaryColor, + onPrimary = primaryTextColor, + secondary = secondaryLightColor, + onSecondary = secondaryTextColor, + tertiary = primaryLightColor, + onTertiary = primaryTextColor, + background = backgroundDarkColor, + onBackground = Color.White, + surface = surfaceDark, + onSurface = Color.White, + surfaceVariant = surfaceDark, + onSurfaceVariant = Color.White, + secondaryContainer = primaryColor, + onSecondaryContainer = Color.White, + error = errorColor, + onError = onErrorColor, + ) +val lightColors: ColorScheme = + lightColorScheme( + primary = primaryColor, + onPrimary = primaryTextColor, + secondary = secondaryColor, + onSecondary = secondaryTextColor, + tertiary = primaryLightColor, + onTertiary = primaryTextColor, + background = backgroundLightColor, + onBackground = Color.Black, + surface = surfaceLight, + onSurface = Color.Black, + surfaceVariant = surfaceLight, + onSurfaceVariant = Color.Black, + secondaryContainer = primaryColor, + onSecondaryContainer = Color.White, + error = errorColor, + onError = onErrorColor, + ) diff --git a/composeApp/src/dwMain/resources/drawable/.gitignore b/composeApp/src/dwMain/resources/drawable/.gitignore new file mode 100644 index 00000000..35f3f1a5 --- /dev/null +++ b/composeApp/src/dwMain/resources/drawable/.gitignore @@ -0,0 +1,2 @@ + +compose-multiplatform.xml \ No newline at end of file diff --git a/composeApp/src/dwMain/resources/drawable/logo.xml b/composeApp/src/dwMain/resources/drawable/logo.xml new file mode 100644 index 00000000..dac2aa51 --- /dev/null +++ b/composeApp/src/dwMain/resources/drawable/logo.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/composeApp/src/dwMain/resources/values/.gitignore b/composeApp/src/dwMain/resources/values/.gitignore new file mode 100644 index 00000000..5bdcc5ad --- /dev/null +++ b/composeApp/src/dwMain/resources/values/.gitignore @@ -0,0 +1,2 @@ + +common.xml \ No newline at end of file diff --git a/composeApp/src/dwMain/resources/values/strings.xml b/composeApp/src/dwMain/resources/values/strings.xml new file mode 100644 index 00000000..3cbb405a --- /dev/null +++ b/composeApp/src/dwMain/resources/values/strings.xml @@ -0,0 +1,3 @@ + + News Media Scan + diff --git a/composeApp/src/ooniMain/kotlin/Config.kt b/composeApp/src/ooniMain/kotlin/Config.kt new file mode 100644 index 00000000..e511cc05 --- /dev/null +++ b/composeApp/src/ooniMain/kotlin/Config.kt @@ -0,0 +1,7 @@ +package org.ooni.probe.config + +object Config { + const val OONI_API_BASE_URL: String = "https://api.prod.ooni.io" + const val OONI_RUN_DASHBOARD_URL: String = "https://run-v2.ooni.org" + const val BASE_SOFTWARE_NAME: String = "ooniprobe" +} diff --git a/composeApp/src/ooniMain/kotlin/org/ooni/probe/ui/Colors.kt b/composeApp/src/ooniMain/kotlin/org/ooni/probe/ui/Colors.kt new file mode 100644 index 00000000..b74eb8b6 --- /dev/null +++ b/composeApp/src/ooniMain/kotlin/org/ooni/probe/ui/Colors.kt @@ -0,0 +1,65 @@ +package org.ooni.probe.ui + +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.ui.graphics.Color +import org.ooni.probe.shared.ThemeConfigBase + +class ThemeConfig { + companion object : ThemeConfigBase { + override fun colorScheme(isDarkTheme: Boolean) = if (isDarkTheme) darkColors else lightColors + } +} + +val primaryColor = Color(0xff0588cb) +val primaryLightColor = primaryColor.copy(alpha = 0.75f) +val secondaryColor = Color(0xff5db8fe) +val secondaryLightColor = secondaryColor.copy(alpha = 0.75f) +val primaryTextColor = Color(0xffffffff) +val secondaryTextColor = Color(0xff000000) +val surfaceDark = Color(0xFF161616) +val surfaceLight = Color(0xFFFFFFFF) +val backgroundLightColor = Color(0xffF1F0F5) +val backgroundDarkColor = Color(0xff010100) +val errorColor = Color(0xFFFF8989) +val onErrorColor = Color(0xFF000000) + +val darkColors: ColorScheme = + darkColorScheme( + primary = primaryColor, + onPrimary = primaryTextColor, + secondary = secondaryLightColor, + onSecondary = secondaryTextColor, + tertiary = primaryLightColor, + onTertiary = primaryTextColor, + background = backgroundDarkColor, + onBackground = Color.White, + surface = surfaceDark, + onSurface = Color.White, + surfaceVariant = surfaceDark, + onSurfaceVariant = Color.White, + secondaryContainer = primaryColor, + onSecondaryContainer = Color.White, + error = errorColor, + onError = onErrorColor, + ) +val lightColors: ColorScheme = + lightColorScheme( + primary = primaryColor, + onPrimary = primaryTextColor, + secondary = secondaryColor, + onSecondary = secondaryTextColor, + tertiary = primaryLightColor, + onTertiary = primaryTextColor, + background = backgroundLightColor, + onBackground = Color.Black, + surface = surfaceLight, + onSurface = Color.Black, + surfaceVariant = surfaceLight, + onSurfaceVariant = Color.Black, + secondaryContainer = primaryColor, + onSecondaryContainer = Color.White, + error = errorColor, + onError = onErrorColor, + ) diff --git a/composeApp/src/ooniMain/resources/drawable/.gitignore b/composeApp/src/ooniMain/resources/drawable/.gitignore new file mode 100644 index 00000000..35f3f1a5 --- /dev/null +++ b/composeApp/src/ooniMain/resources/drawable/.gitignore @@ -0,0 +1,2 @@ + +compose-multiplatform.xml \ No newline at end of file diff --git a/composeApp/src/ooniMain/resources/drawable/logo.xml b/composeApp/src/ooniMain/resources/drawable/logo.xml new file mode 100644 index 00000000..ec00ac58 --- /dev/null +++ b/composeApp/src/ooniMain/resources/drawable/logo.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/composeApp/src/ooniMain/resources/values/.gitignore b/composeApp/src/ooniMain/resources/values/.gitignore new file mode 100644 index 00000000..5bdcc5ad --- /dev/null +++ b/composeApp/src/ooniMain/resources/values/.gitignore @@ -0,0 +1,2 @@ + +common.xml \ No newline at end of file diff --git a/composeApp/src/ooniMain/resources/values/strings.xml b/composeApp/src/ooniMain/resources/values/strings.xml new file mode 100644 index 00000000..96cb7ce4 --- /dev/null +++ b/composeApp/src/ooniMain/resources/values/strings.xml @@ -0,0 +1,3 @@ + + OONI Probe + diff --git a/gradle.properties b/gradle.properties index 5db355f8..59e98477 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,5 @@ android.useAndroidX=true #MPP kotlin.mpp.androidSourceSetLayoutVersion=2 -kotlin.mpp.enableCInteropCommonization=true \ No newline at end of file +kotlin.mpp.enableCInteropCommonization=true + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5cfad43e..0942cdba 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ android-compileSdk = "34" android-minSdk = "24" android-targetSdk = "34" -compose-plugin = "1.6.11" +compose-plugin = "1.7.0-alpha02" kotlin = "2.0.0" [plugins] diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj index 1b90a014..123f806b 100644 --- a/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/iosApp/iosApp.xcodeproj/project.pbxproj @@ -127,7 +127,6 @@ B92378962B6B1156000C7307 /* Frameworks */, 7555FF79242A565900829871 /* Resources */, 93E977732C4FE022009CCABC /* ShellScript */, - 8C6B45F03EB6D1828FCB533E /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -206,23 +205,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 8C6B45F03EB6D1828FCB533E /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 93E977732C4FE022009CCABC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/settings.gradle.kts b/settings.gradle.kts index 6f0e8113..182a3e2a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -28,4 +28,4 @@ dependencyResolutionManagement { } } -include(":composeApp") \ No newline at end of file +include(":composeApp")