From 3cc081845a8207775d3a2d50b0acca4283473599 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Fri, 4 Jul 2025 20:42:37 +0200 Subject: [PATCH 01/10] Change GoogleAuthenticator.Scope from value class to data class to ease Swift wrapping --- .../kotlin/net/opatry/google/auth/GoogleAuthenticator.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/google/oauth/src/commonMain/kotlin/net/opatry/google/auth/GoogleAuthenticator.kt b/google/oauth/src/commonMain/kotlin/net/opatry/google/auth/GoogleAuthenticator.kt index d0228aad..7e49e6b1 100644 --- a/google/oauth/src/commonMain/kotlin/net/opatry/google/auth/GoogleAuthenticator.kt +++ b/google/oauth/src/commonMain/kotlin/net/opatry/google/auth/GoogleAuthenticator.kt @@ -25,11 +25,9 @@ package net.opatry.google.auth import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import net.opatry.google.auth.GoogleAuthenticator.OAuthToken.TokenType.Bearer -import kotlin.jvm.JvmInline interface GoogleAuthenticator { - @JvmInline - value class Scope(val value: String) { + data class Scope(val value: String) { companion object { val Profile = Scope("https://www.googleapis.com/auth/userinfo.profile") val Email = Scope("https://www.googleapis.com/auth/userinfo.email") From feca8e01ad413a558cc0ad50868052f11e4ee291 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Fri, 20 Jun 2025 21:57:55 +0200 Subject: [PATCH 02/10] Export Room DB schema (seems mandatory for iOS target, why?) --- .../commonMain/kotlin/net/opatry/tasks/data/TasksAppDatabase.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks-app-shared/src/commonMain/kotlin/net/opatry/tasks/data/TasksAppDatabase.kt b/tasks-app-shared/src/commonMain/kotlin/net/opatry/tasks/data/TasksAppDatabase.kt index af4ca0ae..93bf8fa4 100644 --- a/tasks-app-shared/src/commonMain/kotlin/net/opatry/tasks/data/TasksAppDatabase.kt +++ b/tasks-app-shared/src/commonMain/kotlin/net/opatry/tasks/data/TasksAppDatabase.kt @@ -60,6 +60,7 @@ object Converters { AutoMigration(from = 1, to = 2), // add user table AutoMigration(from = 2, to = 3), // add sorting column in task_list table ], + exportSchema = true, ) @ConstructedBy(TasksAppDatabaseConstructor::class) @TypeConverters(Converters::class) From 86a667decc299a93c3a43fdadf0ccff97d108f8a Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Fri, 20 Jun 2025 21:28:03 +0200 Subject: [PATCH 03/10] Conditionally add iOS targets to KMP projects --- build.gradle.kts | 26 ++++++++++ buildSrc/build.gradle.kts | 13 +++++ buildSrc/src/main/kotlin/IosTargetsExt.kt | 61 +++++++++++++++++++++++ google/oauth/build.gradle.kts | 2 + google/tasks/build.gradle.kts | 2 + lucide-icons/build.gradle.kts | 2 + tasks-app-shared/build.gradle.kts | 9 +++- tasks-core/build.gradle.kts | 2 + 8 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/kotlin/IosTargetsExt.kt diff --git a/build.gradle.kts b/build.gradle.kts index 731d5d86..92b26b49 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,6 +22,7 @@ import kotlinx.kover.gradle.plugin.dsl.CoverageUnit import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension plugins { alias(libs.plugins.jetbrains.kotlin.multiplatform) apply false @@ -135,7 +136,32 @@ kover { } } +private val kmpPluginId = libs.plugins.jetbrains.kotlin.multiplatform.get().pluginId subprojects { + plugins.withId(kmpPluginId) { + if (project == project(":google:oauth-http")) return@withId + + extensions.configure { + // foo-bar-zorg → FooBarZorg + val frameworkBaseName = project.name.split('-').joinToString("") { part -> + part.replaceFirstChar(Char::uppercase) + } + iosTargets.mapNotNull { + when (it) { + "iosX64" -> iosX64() + "iosArm64" -> iosArm64() + "iosSimulatorArm64" -> iosSimulatorArm64() + else -> null + } + }.forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = frameworkBaseName + isStatic = true + } + } + } + } + tasks { findByName("test") ?: return@tasks named("test") { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 00000000..fc6cbb8d --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() + mavenCentral() +} + +kotlin { + jvmToolchain(17) +} + diff --git a/buildSrc/src/main/kotlin/IosTargetsExt.kt b/buildSrc/src/main/kotlin/IosTargetsExt.kt new file mode 100644 index 00000000..1c70c196 --- /dev/null +++ b/buildSrc/src/main/kotlin/IosTargetsExt.kt @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import org.gradle.api.Project +import java.io.File +import java.util.* + +// can't use by lazy, we need Project.findProperty not accessible there +@Suppress("ObjectPropertyName") +private lateinit var _iosTargets: List + +private val localProperties = Properties() +private fun Project.getIosTargetedConfiguration(): String? { + return findProperty("ios.target") as? String + ?: System.getenv("IOS_TARGET") + ?: run { + if (localProperties.isEmpty) { + val localPropertiesFile = File(rootDir, "local.properties") + if (localPropertiesFile.isFile) { + localPropertiesFile.inputStream().use { reader -> + localProperties.load(reader) + } + } + } + localProperties.getProperty("ios.target") + } +} + +val Project.iosTargets: List + get() { + if (!::_iosTargets.isInitialized) { + _iosTargets = when (getIosTargetedConfiguration()) { + // We ignore "iosX64", not considered as a use case + "all" -> listOf("iosArm64", "iosSimulatorArm64") + "simulator" -> listOf("iosSimulatorArm64") + "device" -> listOf("iosArm64") + "none" -> emptyList() + else -> emptyList() + } + } + return _iosTargets + } diff --git a/google/oauth/build.gradle.kts b/google/oauth/build.gradle.kts index d31e5d4b..4cabd280 100644 --- a/google/oauth/build.gradle.kts +++ b/google/oauth/build.gradle.kts @@ -28,6 +28,8 @@ plugins { kotlin { jvm() + // Note: iOS targets are conditionally added dynamically in the root build.gradle.kts + jvmToolchain(17) sourceSets.all { diff --git a/google/tasks/build.gradle.kts b/google/tasks/build.gradle.kts index bc6303d8..4428015a 100644 --- a/google/tasks/build.gradle.kts +++ b/google/tasks/build.gradle.kts @@ -28,6 +28,8 @@ plugins { kotlin { jvm() + // Note: iOS targets are conditionally added dynamically in the root build.gradle.kts + jvmToolchain(17) sourceSets.all { diff --git a/lucide-icons/build.gradle.kts b/lucide-icons/build.gradle.kts index 7339c27f..88f0392f 100644 --- a/lucide-icons/build.gradle.kts +++ b/lucide-icons/build.gradle.kts @@ -29,6 +29,8 @@ plugins { kotlin { jvm() + // Note: iOS targets are conditionally added dynamically in the root build.gradle.kts + jvmToolchain(17) sourceSets { diff --git a/tasks-app-shared/build.gradle.kts b/tasks-app-shared/build.gradle.kts index 27a9dbc0..e0ec072b 100644 --- a/tasks-app-shared/build.gradle.kts +++ b/tasks-app-shared/build.gradle.kts @@ -47,14 +47,16 @@ val ciBuild = (findProperty("ci") as? String).toBoolean() kotlin { jvm() - jvmToolchain(17) - androidTarget { // useful to allow using commonTest in Android instrumentation tests @OptIn(ExperimentalKotlinGradlePluginApi::class) instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) } + // Note: iOS targets are conditionally added dynamically in the root build.gradle.kts + + jvmToolchain(17) + compilerOptions { // Common compiler options applied to all Kotlin source sets freeCompilerArgs.add("-Xexpect-actual-classes") @@ -161,6 +163,9 @@ room { dependencies { add("kspJvm", libs.androidx.room.compiler) add("kspAndroid", libs.androidx.room.compiler) + iosTargets.forEach { iosTarget -> + add("ksp${iosTarget.replaceFirstChar(Char::uppercase)}", libs.androidx.room.compiler) + } debugImplementation(compose.uiTooling) } diff --git a/tasks-core/build.gradle.kts b/tasks-core/build.gradle.kts index c75ec784..db937880 100644 --- a/tasks-core/build.gradle.kts +++ b/tasks-core/build.gradle.kts @@ -29,6 +29,8 @@ plugins { kotlin { jvm() + // Note: iOS targets are conditionally added dynamically in the root build.gradle.kts + jvmToolchain(17) compilerOptions { From de4c96cb95e9e5e5f644d3e133ae698146150752 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Fri, 20 Jun 2025 21:58:57 +0200 Subject: [PATCH 04/10] Add iOS actual implementations of expect --- gradle/libs.versions.toml | 3 + .../network/NetworkStatusNotifier.ios.kt | 53 ++++++++++ .../tasks/FileCredentialsStorage.ios.kt | 77 ++++++++++++++ .../net/opatry/tasks/app/di/authModule.ios.kt | 29 +++++ .../opatry/tasks/app/di/platformModule.ios.kt | 78 ++++++++++++++ .../AuthorizeGoogleTasksButton.ios.kt | 100 ++++++++++++++++++ .../tasks/app/ui/component/backHandler.ios.kt | 35 ++++++ .../net/opatry/tasks/app/ui/theme/Type.ios.kt | 44 ++++++++ .../inMemoryTasksAppDatabaseBuilder.ios.kt | 31 ++++++ tasks-core/build.gradle.kts | 6 ++ .../net/opatry/tasks/TaskPosition.ios.kt | 98 +++++++++++++++++ 11 files changed, 554 insertions(+) create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/network/NetworkStatusNotifier.ios.kt create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/FileCredentialsStorage.ios.kt create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/di/authModule.ios.kt create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/di/platformModule.ios.kt create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/component/AuthorizeGoogleTasksButton.ios.kt create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/component/backHandler.ios.kt create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/theme/Type.ios.kt create mode 100644 tasks-app-shared/src/iosTest/kotlin/net/opatry/tasks/data/util/inMemoryTasksAppDatabaseBuilder.ios.kt create mode 100644 tasks-core/src/iosMain/kotlin/net/opatry/tasks/TaskPosition.ios.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 628fc82f..9ffb0247 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,6 +25,7 @@ mockito = "5.20.0" mockito-kotlin = "6.1.0" kover = "0.9.3" androidx-test-runner = "1.7.0" +bignum = "0.3.10" [libraries] kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } @@ -101,6 +102,8 @@ mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = " androidx-ui-tooling-preview-android = { module = "androidx.compose.ui:ui-tooling-preview-android", version.ref = "compose" } androidx-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } +bignum = { module = "com.ionspin.kotlin:bignum", version.ref = "bignum" } + [bundles] ktor-server = ["ktor-server-core", "ktor-server-cio"] ktor-client = [ diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/network/NetworkStatusNotifier.ios.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/network/NetworkStatusNotifier.ios.kt new file mode 100644 index 00000000..843e7092 --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/network/NetworkStatusNotifier.ios.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.network + +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.distinctUntilChanged +import platform.Network.nw_path_get_status +import platform.Network.nw_path_monitor_cancel +import platform.Network.nw_path_monitor_create +import platform.Network.nw_path_monitor_set_queue +import platform.Network.nw_path_monitor_set_update_handler +import platform.Network.nw_path_monitor_start +import platform.Network.nw_path_status_satisfied +import platform.darwin.dispatch_queue_create + +actual fun networkStateFlow(): Flow = callbackFlow { + val monitor = nw_path_monitor_create() + val queue = dispatch_queue_create("NetworkMonitorQueue", null) + + nw_path_monitor_set_update_handler(monitor) { path -> + val hasInternet = nw_path_get_status(path) == nw_path_status_satisfied + trySend(hasInternet).isSuccess + } + + nw_path_monitor_set_queue(monitor, queue) + nw_path_monitor_start(monitor) + + awaitClose { + nw_path_monitor_cancel(monitor) + } +}.distinctUntilChanged() \ No newline at end of file diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/FileCredentialsStorage.ios.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/FileCredentialsStorage.ios.kt new file mode 100644 index 00000000..59a2dc9f --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/FileCredentialsStorage.ios.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks + +import kotlinx.cinterop.BetaInteropApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import kotlinx.coroutines.withContext +import kotlinx.serialization.json.Json +import platform.Foundation.NSData +import platform.Foundation.NSFileManager +import platform.Foundation.NSString +import platform.Foundation.NSURL +import platform.Foundation.NSUTF8StringEncoding +import platform.Foundation.create +import platform.Foundation.dataUsingEncoding +import platform.Foundation.dataWithContentsOfFile +import platform.Foundation.writeToURL + +actual class FileCredentialsStorage actual constructor(private val filepath: String) : CredentialsStorage { + @OptIn(BetaInteropApi::class) + actual override suspend fun load(): TokenCache? { + return withContext(Dispatchers.IO) { + val fileManager = NSFileManager.defaultManager + if (!fileManager.fileExistsAtPath(filepath)) return@withContext null + + val data = NSData.dataWithContentsOfFile(filepath) + ?: return@withContext null + + val content = NSString.create(data, NSUTF8StringEncoding)?.toString() + ?: return@withContext null + + runCatching { + Json.decodeFromString(content) + }.getOrNull() + } + } + + @OptIn(BetaInteropApi::class) + actual override suspend fun store(tokenCache: TokenCache) { + val json = Json { prettyPrint = true } + + val success = withContext(Dispatchers.IO) { + val nsString = NSString.create(string = json.encodeToString(tokenCache)) + val data = nsString.dataUsingEncoding(NSUTF8StringEncoding) + ?: error("Failed to encode JSON to NSData") + + val url = NSURL.fileURLWithPath(filepath) + data.writeToURL(url, atomically = true) + } + + if (!success) { + error("Failed to write token cache to file at $filepath") + } + } +} + diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/di/authModule.ios.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/di/authModule.ios.kt new file mode 100644 index 00000000..16ac47e7 --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/di/authModule.ios.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks.app.di + +import org.koin.core.module.Module +import org.koin.dsl.module + +// Not needed for iOS, the concrete instance of GoogleAuthenticator is provided by the iOS app in Swift. +actual fun authModule(gcpClientId: String): Module = module {} diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/di/platformModule.ios.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/di/platformModule.ios.kt new file mode 100644 index 00000000..6cd1426e --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/di/platformModule.ios.kt @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks.app.di + +import androidx.room.Room +import io.ktor.client.engine.HttpClientEngineFactory +import io.ktor.client.engine.darwin.Darwin +import kotlinx.cinterop.ExperimentalForeignApi +import net.opatry.tasks.CredentialsStorage +import net.opatry.tasks.FileCredentialsStorage +import net.opatry.tasks.data.TasksAppDatabase +import org.koin.core.module.Module +import org.koin.core.qualifier.named +import org.koin.dsl.module +import platform.Foundation.NSDocumentDirectory +import platform.Foundation.NSFileManager +import platform.Foundation.NSUserDomainMask + +actual fun platformModule(target: String): Module = module { + single> { + Darwin + } + + @OptIn(ExperimentalForeignApi::class) + single(named("app_root_dir")) { + val fileManager = NSFileManager.defaultManager + val documentDirectoryPath = fileManager.URLForDirectory( + directory = NSDocumentDirectory, + inDomain = NSUserDomainMask, + appropriateForURL = null, + create = true, + error = null, + )?.path ?: throw IllegalStateException("Could not find document directory") + + ("$documentDirectoryPath/.taskfolio").also { appRootDirPath -> + if (!fileManager.fileExistsAtPath(appRootDirPath)) { + val success = fileManager.createDirectoryAtPath( + path = appRootDirPath, + withIntermediateDirectories = true, + attributes = null, + error = null + ) + check(success) { "Failed to create directory at $appRootDirPath" } + } + } + } + + single { + val dbFilePath = get(named("app_root_dir")) + "/tasks.db" + Room.databaseBuilder(dbFilePath) + } + + single { + // TODO store in database + val credentialsFilePath = get(named("app_root_dir")) + "/google_auth_token_cache.json" + FileCredentialsStorage(credentialsFilePath) + } +} diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/component/AuthorizeGoogleTasksButton.ios.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/component/AuthorizeGoogleTasksButton.ios.kt new file mode 100644 index 00000000..c9705773 --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/component/AuthorizeGoogleTasksButton.ios.kt @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks.app.ui.component + +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch +import net.opatry.google.auth.GoogleAuthenticator +import net.opatry.google.tasks.TasksScopes +import net.opatry.tasks.resources.Res +import net.opatry.tasks.resources.onboarding_screen_authorize_cta +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject + +@Composable +actual fun AuthorizeGoogleTasksButton( + modifier: Modifier, + onSuccess: (GoogleAuthenticator.OAuthToken) -> Unit +) { + val coroutineScope = rememberCoroutineScope() + val authenticator = koinInject() + var ongoingAuth by remember { mutableStateOf(false) } + var error by remember { mutableStateOf(null) } + + Column(modifier, horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(8.dp)) { + Button( + onClick = { + ongoingAuth = true + coroutineScope.launch { + val scopes = listOf( + GoogleAuthenticator.Scope.Profile, + GoogleAuthenticator.Scope(TasksScopes.Tasks), + ) + try { + val authCode = authenticator.authorize( + scopes = scopes, + force = true, + requestUserAuthorization = {}, + ).let(GoogleAuthenticator.Grant::AuthorizationCode) + val oauthToken = authenticator.getToken(authCode) + onSuccess(oauthToken) + } catch (e: Exception) { + error = e.message + ongoingAuth = false + } + } + }, + enabled = !ongoingAuth + ) { + Box(modifier, contentAlignment = Alignment.Center) { + AnimatedContent(ongoingAuth, label = "authorize_button_content") { ongoing -> + if (ongoing) { + LoadingIndicator(Modifier.size(24.dp)) + } else { + Text(stringResource(Res.string.onboarding_screen_authorize_cta)) + } + } + } + } + + AnimatedContent(error, label = "authorize_error_message") { message -> + Text(message ?: "", color = MaterialTheme.colorScheme.error) + } + } +} \ No newline at end of file diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/component/backHandler.ios.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/component/backHandler.ios.kt new file mode 100644 index 00000000..31cfbc0c --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/component/backHandler.ios.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks.app.ui.component + +import androidx.compose.runtime.Composable +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.backhandler.BackHandler + +@ExperimentalComposeUiApi +@Composable +actual fun MyBackHandler(canNavigateBack: () -> Boolean, navigateBack: () -> Unit) { + BackHandler(canNavigateBack()) { + navigateBack() + } +} \ No newline at end of file diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/theme/Type.ios.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/theme/Type.ios.kt new file mode 100644 index 00000000..8a3e0c22 --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/ui/theme/Type.ios.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks.app.ui.theme + +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.sp + +internal actual val Typography: androidx.compose.material3.Typography = androidx.compose.material3.Typography( + displayLarge = TextStyle(fontSize = 57.sp), // TODO adjust + displayMedium = TextStyle(fontSize = 45.sp), // TODO adjust + displaySmall = TextStyle(fontSize = 36.sp), // TODO adjust + headlineLarge = TextStyle(fontSize = 32.sp), // TODO adjust + headlineMedium = TextStyle(fontSize = 28.sp), // TODO adjust + headlineSmall = TextStyle(fontSize = 24.sp), // TODO adjust + titleLarge = TextStyle(fontSize = 22.sp), // TODO adjust + titleMedium = TextStyle(fontSize = 16.sp), // TODO adjust + titleSmall = TextStyle(fontSize = 14.sp), // TODO adjust + bodyLarge = TextStyle(fontSize = 14.sp), + bodyMedium = TextStyle(fontSize = 12.sp), + bodySmall = TextStyle(fontSize = 10.sp), + labelLarge = TextStyle(fontSize = 12.sp), + labelMedium = TextStyle(fontSize = 10.sp), + labelSmall = TextStyle(fontSize = 9.sp), +) diff --git a/tasks-app-shared/src/iosTest/kotlin/net/opatry/tasks/data/util/inMemoryTasksAppDatabaseBuilder.ios.kt b/tasks-app-shared/src/iosTest/kotlin/net/opatry/tasks/data/util/inMemoryTasksAppDatabaseBuilder.ios.kt new file mode 100644 index 00000000..b135b06f --- /dev/null +++ b/tasks-app-shared/src/iosTest/kotlin/net/opatry/tasks/data/util/inMemoryTasksAppDatabaseBuilder.ios.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks.data.util + +import androidx.room.Room +import androidx.room.RoomDatabase +import net.opatry.tasks.data.TasksAppDatabase + +actual fun inMemoryTasksAppDatabaseBuilder(): RoomDatabase.Builder { + return Room.inMemoryDatabaseBuilder() +} diff --git a/tasks-core/build.gradle.kts b/tasks-core/build.gradle.kts index db937880..366d300a 100644 --- a/tasks-core/build.gradle.kts +++ b/tasks-core/build.gradle.kts @@ -57,5 +57,11 @@ kotlin { commonTest.dependencies { implementation(kotlin("test")) } + + if (iosTargets.isNotEmpty()) { + iosMain.dependencies { + implementation(libs.bignum) + } + } } } \ No newline at end of file diff --git a/tasks-core/src/iosMain/kotlin/net/opatry/tasks/TaskPosition.ios.kt b/tasks-core/src/iosMain/kotlin/net/opatry/tasks/TaskPosition.ios.kt new file mode 100644 index 00000000..7e4a085b --- /dev/null +++ b/tasks-core/src/iosMain/kotlin/net/opatry/tasks/TaskPosition.ios.kt @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks + +import com.ionspin.kotlin.bignum.integer.BigInteger +import com.ionspin.kotlin.bignum.integer.toBigInteger +import kotlin.time.Instant + +actual class TodoTaskPosition private constructor(internal val rawValue: BigInteger) : TaskPosition { + actual override val value: String + get() = rawValue.toString().padStart(20, '0') + + actual companion object { + actual fun fromIndex(index: Int): TodoTaskPosition { + return TodoTaskPosition(BigInteger.fromInt(index)) + } + + actual fun fromPosition(position: String): TodoTaskPosition { + return TodoTaskPosition(BigInteger.parseString(position)) + } + } + + actual override fun compareTo(other: TaskPosition): Int { + return when (other) { + is TodoTaskPosition -> rawValue.compareTo(other.rawValue) + is DoneTaskPosition -> rawValue.compareTo(other.rawValue) + else -> throw IllegalArgumentException("Only TodoTaskPosition and DoneTaskPosition are supported") + } + } + + actual override fun hashCode(): Int { + return rawValue.hashCode() + } + + actual override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is TodoTaskPosition) return false + return rawValue == other.rawValue + } + + actual override fun toString(): String = value +} + +actual class DoneTaskPosition private constructor(internal val rawValue: BigInteger) : TaskPosition { + actual companion object { + private val UpperBound = BigInteger.parseString("9999999999999999999") + actual fun fromCompletionDate(completionDate: Instant): DoneTaskPosition { + return DoneTaskPosition(UpperBound - completionDate.toEpochMilliseconds().toBigInteger()) + } + + actual fun fromPosition(position: String): DoneTaskPosition { + return DoneTaskPosition(BigInteger.parseString(position)) + } + } + + actual override val value: String + get() = rawValue.toString().padStart(20, '0') + + actual override fun compareTo(other: TaskPosition): Int { + return when (other) { + is TodoTaskPosition -> rawValue.compareTo(other.rawValue) + is DoneTaskPosition -> rawValue.compareTo(other.rawValue) + else -> throw IllegalArgumentException("Only TodoTaskPosition and DoneTaskPosition are supported") + } + } + + actual override fun hashCode(): Int { + return rawValue.hashCode() + } + + actual override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is DoneTaskPosition) return false + return rawValue == other.rawValue + } + + actual override fun toString(): String = value +} From 4e7bab5eebe9f4a93639d1923a585d7706719648 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Tue, 24 Jun 2025 21:28:55 +0200 Subject: [PATCH 05/10] Add MainViewController for iosMain --- settings.gradle.kts | 3 + .../Taskfolio/Resources/licenses_ios.json | 1652 +++++++++++++++++ tasks-app-ios/build.gradle.kts | 74 + .../opatry/tasks/app/MainViewController.kt | 113 ++ .../kotlin/net/opatry/tasks/app/initKoin.kt | 50 + 5 files changed, 1892 insertions(+) create mode 100644 tasks-app-ios/Taskfolio/Resources/licenses_ios.json create mode 100644 tasks-app-ios/build.gradle.kts create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/MainViewController.kt create mode 100644 tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/initKoin.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index 889c1c01..eacbd781 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -64,3 +64,6 @@ include(":tasks-core") include(":tasks-app-shared") include(":tasks-app-desktop") include(":tasks-app-android") +// useful to isolate/ease license_ios.json file generation +// and also sync version from Gradle to Xcode +include(":tasks-app-ios") diff --git a/tasks-app-ios/Taskfolio/Resources/licenses_ios.json b/tasks-app-ios/Taskfolio/Resources/licenses_ios.json new file mode 100644 index 00000000..26a4f170 --- /dev/null +++ b/tasks-app-ios/Taskfolio/Resources/licenses_ios.json @@ -0,0 +1,1652 @@ +{ + "libraries": [ + { + "uniqueId": "androidx.annotation:annotation", + "artifactVersion": "1.9.1", + "name": "Annotation", + "description": "Provides source annotations for tooling and readability.", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.arch.core:core-common", + "artifactVersion": "2.2.0", + "name": "Android Arch-Common", + "description": "Android Arch-Common", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.collection:collection", + "artifactVersion": "1.5.0", + "name": "collections", + "description": "Standalone efficient collections.", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.compose.runtime:runtime", + "artifactVersion": "1.10.0-alpha02", + "name": "Compose Runtime", + "description": "Tree composition support for code generated by the Compose compiler plugin and corresponding public API", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.compose.runtime:runtime-annotation", + "artifactVersion": "1.10.0-alpha02", + "name": "Compose Runtime Annotation", + "description": "Provides Compose-specific annotations used by the compiler and tooling", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.compose.runtime:runtime-saveable", + "artifactVersion": "1.10.0-alpha02", + "name": "Compose Saveable", + "description": "Compose components that allow saving and restoring the local ui state", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-common", + "artifactVersion": "2.10.0-alpha03", + "name": "Lifecycle-Common", + "description": "Android Lifecycle-Common", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-runtime", + "artifactVersion": "2.10.0-alpha03", + "name": "Lifecycle Runtime", + "description": "Android Lifecycle Runtime", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-runtime-compose", + "artifactVersion": "2.10.0-alpha03", + "name": "Lifecycle Runtime Compose", + "description": "Compose integration with Lifecycle", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-viewmodel", + "artifactVersion": "2.10.0-alpha03", + "name": "Lifecycle ViewModel", + "description": "Android Lifecycle ViewModel", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-viewmodel-savedstate", + "artifactVersion": "2.10.0-alpha03", + "name": "Lifecycle ViewModel with SavedState", + "description": "Android Lifecycle ViewModel", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.room:room-common", + "artifactVersion": "2.8.3", + "name": "Room-Common", + "description": "Android Room-Common", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.room:room-runtime", + "artifactVersion": "2.8.3", + "name": "Room-Runtime", + "description": "Android Room-Runtime", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.savedstate:savedstate", + "artifactVersion": "1.4.0-alpha03", + "name": "Saved State", + "description": "Android Lifecycle Saved State", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.savedstate:savedstate-compose", + "artifactVersion": "1.4.0-alpha03", + "name": "Saved State Compose", + "description": "Compose integration with Saved State", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.sqlite:sqlite", + "artifactVersion": "2.6.1", + "name": "SQLite", + "description": "SQLite API", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.sqlite:sqlite-bundled", + "artifactVersion": "2.6.1", + "name": "SQLite Bundled Integration", + "description": "The implementation of SQLite library using the bundled SQLite.", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "organization": { + "name": "The Android Open Source Project" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "co.touchlab:stately-concurrency", + "artifactVersion": "2.1.0", + "name": "Stately", + "description": "Multithreaded Kotlin Multiplatform Utilities", + "developers": [ + { + "name": "Kevin Galligan" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.mikepenz:aboutlibraries-core", + "artifactVersion": "13.1.0", + "name": "AboutLibraries Core Library", + "description": "AboutLibraries automatically detects all dependencies of a project and collects their information including the license. Optionally visualising it via the provided ui components.", + "developers": [ + { + "name": "Mike Penz" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.squareup.okio:okio", + "artifactVersion": "3.15.0", + "name": "okio", + "description": "A modern I/O library for Android, Java, and Kotlin Multiplatform.", + "developers": [ + { + "name": "Square, Inc." + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.typesafe:config", + "artifactVersion": "1.4.4", + "name": "config", + "description": "configuration library for JVM languages using HOCON files", + "developers": [ + { + "name": "Havoc Pennington" + } + ], + "organization": { + "name": "com.typesafe" + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt.coil3:coil", + "artifactVersion": "3.3.0", + "name": "coil", + "description": "An image loading library for Android and Compose Multiplatform.", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt.coil3:coil-compose", + "artifactVersion": "3.3.0", + "name": "coil-compose", + "description": "An image loading library for Android and Compose Multiplatform.", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt.coil3:coil-compose-core", + "artifactVersion": "3.3.0", + "name": "coil-compose-core", + "description": "An image loading library for Android and Compose Multiplatform.", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt.coil3:coil-core", + "artifactVersion": "3.3.0", + "name": "coil-core", + "description": "An image loading library for Android and Compose Multiplatform.", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt.coil3:coil-network-core", + "artifactVersion": "3.3.0", + "name": "coil-network-core", + "description": "An image loading library for Android and Compose Multiplatform.", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt.coil3:coil-network-ktor3", + "artifactVersion": "3.3.0", + "name": "coil-network-ktor3", + "description": "An image loading library for Android and Compose Multiplatform.", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.insert-koin:koin-core", + "artifactVersion": "4.1.1", + "name": "Koin", + "description": "KOIN - Kotlin simple Dependency Injection Framework", + "developers": [ + { + "name": "Arnaud Giuliani" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-client-auth", + "artifactVersion": "3.3.1", + "name": "ktor-client-auth", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-client-cio", + "artifactVersion": "3.3.1", + "name": "ktor-client-cio", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-client-content-negotiation", + "artifactVersion": "3.3.1", + "name": "ktor-client-content-negotiation", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-client-core", + "artifactVersion": "3.3.1", + "name": "ktor-client-core", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-client-encoding", + "artifactVersion": "3.3.1", + "name": "ktor-client-encoding", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-client-logging", + "artifactVersion": "3.3.1", + "name": "ktor-client-logging", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-events", + "artifactVersion": "3.3.1", + "name": "ktor-events", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-http", + "artifactVersion": "3.3.1", + "name": "ktor-http", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-http-cio", + "artifactVersion": "3.3.1", + "name": "ktor-http-cio", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-io", + "artifactVersion": "3.3.1", + "name": "ktor-io", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-network", + "artifactVersion": "3.3.1", + "name": "ktor-network", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-network-tls", + "artifactVersion": "3.3.1", + "name": "ktor-network-tls", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-serialization", + "artifactVersion": "3.3.1", + "name": "ktor-serialization", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-serialization-kotlinx", + "artifactVersion": "3.3.1", + "name": "ktor-serialization-kotlinx", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-serialization-kotlinx-json", + "artifactVersion": "3.3.1", + "name": "ktor-serialization-kotlinx-json", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-server-cio", + "artifactVersion": "3.3.1", + "name": "ktor-server-cio", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-server-core-jvm", + "artifactVersion": "3.3.1", + "name": "ktor-server-core", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-server-html-builder", + "artifactVersion": "3.3.1", + "name": "ktor-server-html-builder", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-server-status-pages", + "artifactVersion": "3.3.1", + "name": "ktor-server-status-pages", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-sse", + "artifactVersion": "3.3.1", + "name": "ktor-sse", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-utils", + "artifactVersion": "3.3.1", + "name": "ktor-utils", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-websocket-serialization", + "artifactVersion": "3.3.1", + "name": "ktor-websocket-serialization", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.ktor:ktor-websockets", + "artifactVersion": "3.3.1", + "name": "ktor-websockets", + "description": "Ktor is a framework for quickly creating web applications in Kotlin with minimal effort.", + "developers": [ + { + "name": "Jetbrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.fusesource.jansi:jansi", + "artifactVersion": "2.4.2", + "name": "Jansi", + "description": "Jansi is a java library for generating and interpreting ANSI escape sequences.", + "developers": [ + { + "name": "Guillaume Nodet" + }, + { + "name": "Hiram Chirino" + } + ], + "organization": { + "name": "FuseSource, Corp." + }, + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.lifecycle:lifecycle-common", + "artifactVersion": "2.10.0-alpha01", + "name": "Lifecycle-Common", + "description": "Android Lifecycle-Common", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.lifecycle:lifecycle-runtime", + "artifactVersion": "2.10.0-alpha01", + "name": "Lifecycle Runtime", + "description": "Android Lifecycle Runtime", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", + "artifactVersion": "2.10.0-alpha01", + "name": "Lifecycle Runtime Compose", + "description": "Compose integration with Lifecycle", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel", + "artifactVersion": "2.10.0-alpha01", + "name": "Lifecycle ViewModel", + "description": "Android Lifecycle ViewModel", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", + "artifactVersion": "2.9.5", + "name": "Lifecycle ViewModel Compose", + "description": "Compose integration with Lifecycle ViewModel", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate", + "artifactVersion": "2.10.0-alpha01", + "name": "Lifecycle ViewModel with SavedState", + "description": "Android Lifecycle ViewModel", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.navigation:navigation-common", + "artifactVersion": "2.9.1", + "name": "Navigation Common", + "description": "Android Navigation-Common", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.navigation:navigation-compose", + "artifactVersion": "2.9.1", + "name": "Compose Navigation", + "description": "Compose integration with Navigation", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.navigation:navigation-runtime", + "artifactVersion": "2.9.1", + "name": "Navigation Runtime", + "description": "Android Navigation-Runtime", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.savedstate:savedstate", + "artifactVersion": "1.4.0-alpha01", + "name": "Saved State", + "description": "Android Lifecycle Saved State", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.savedstate:savedstate-compose", + "artifactVersion": "1.4.0-alpha01", + "name": "Saved State Compose", + "description": "Compose integration with Saved State", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.androidx.window:window-core", + "artifactVersion": "1.4.0", + "name": "WindowManager Core", + "description": "WindowManager Core Library.", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.animation:animation", + "artifactVersion": "1.9.1", + "name": "Compose Animation", + "description": "Compose animation library", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.animation:animation-core", + "artifactVersion": "1.9.1", + "name": "Compose Animation Core", + "description": "Animation engine and animation primitives that are the building blocks of the Compose animation library", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.annotation-internal:annotation", + "artifactVersion": "1.10.0-alpha01", + "name": "Annotation", + "description": "Provides source annotations for tooling and readability.", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.collection-internal:collection", + "artifactVersion": "1.10.0-alpha01", + "name": "collections", + "description": "Standalone efficient collections.", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.components:components-resources", + "artifactVersion": "1.9.1", + "name": "Resources for Compose JB", + "description": "Resources for Compose JB", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.components:components-ui-tooling-preview", + "artifactVersion": "1.9.1", + "name": "Experimental Compose Multiplatform tooling library API. This library provides the API required to declare @Preview composables in user apps.", + "description": "Experimental Compose Multiplatform tooling library API. This library provides the API required to declare @Preview composables in user apps.", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.foundation:foundation", + "artifactVersion": "1.9.1", + "name": "Compose Foundation", + "description": "Higher level abstractions of the Compose UI primitives. This library is design system agnostic, providing the high-level building blocks for both application and design-system developers", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.foundation:foundation-layout", + "artifactVersion": "1.9.1", + "name": "Compose Layouts", + "description": "Compose layout implementations", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.material3.adaptive:adaptive", + "artifactVersion": "1.1.2", + "name": "Material Adaptive", + "description": "Compose Material Design Adaptive Library", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.material3:material3", + "artifactVersion": "1.9.0", + "name": "Compose Material3 Components", + "description": "Compose Material You Design Components library", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.material3:material3-adaptive-navigation-suite", + "artifactVersion": "1.9.0", + "name": "Material Adaptive Navigation Suite", + "description": "Compose Material Design Adaptive Navigation Suite Library", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.material:material-ripple", + "artifactVersion": "1.9.1", + "name": "Compose Material Ripple", + "description": "Material ripple used to build interactive components", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.runtime:runtime", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose Runtime", + "description": "Tree composition support for code generated by the Compose compiler plugin and corresponding public API", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.runtime:runtime-saveable", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose Saveable", + "description": "Compose components that allow saving and restoring the local ui state", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.ui:ui", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose UI primitives", + "description": "Compose UI primitives. This library contains the primitives that form the Compose UI Toolkit, such as drawing, measurement and layout.", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.ui:ui-backhandler", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose Multiplatform BackHandler", + "description": "Provides BackHandler in Compose Multiplatform projects", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.ui:ui-geometry", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose Geometry", + "description": "Compose classes related to dimensions without units", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.ui:ui-graphics", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose Graphics", + "description": "Compose graphics", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.ui:ui-text", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose UI Text", + "description": "Compose Text primitives and utilities", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.ui:ui-uikit", + "artifactVersion": "1.9.1", + "name": "Compose UIKit Utils", + "description": "Internal iOS UIKit utilities including Objective-C library.", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.ui:ui-unit", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose Unit", + "description": "Compose classes for simple units", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.compose.ui:ui-util", + "artifactVersion": "1.10.0-alpha01", + "name": "Compose Util", + "description": "Internal Compose utilities used by other modules", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-reflect", + "artifactVersion": "2.2.20", + "name": "Kotlin Reflect", + "description": "Kotlin Full Reflection Library", + "developers": [ + { + "name": "Kotlin Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-stdlib", + "artifactVersion": "2.2.21", + "name": "Kotlin Stdlib", + "description": "Kotlin Standard Library", + "developers": [ + { + "name": "Kotlin Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-stdlib-common", + "artifactVersion": "2.2.21", + "name": "Kotlin Stdlib Common", + "description": "Kotlin Common Standard Library (legacy, use kotlin-stdlib instead)", + "developers": [ + { + "name": "Kotlin Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "artifactVersion": "2.2.10", + "name": "Kotlin Stdlib Jdk7", + "description": "Kotlin Standard Library JDK 7 extension", + "developers": [ + { + "name": "Kotlin Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "artifactVersion": "2.2.10", + "name": "Kotlin Stdlib Jdk8", + "description": "Kotlin Standard Library JDK 8 extension", + "developers": [ + { + "name": "Kotlin Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:atomicfu", + "artifactVersion": "0.23.2", + "name": "atomicfu", + "description": "AtomicFU utilities", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-collections-immutable", + "artifactVersion": "0.4.0", + "name": "kotlinx-collections-immutable", + "description": "Kotlin Immutable Collections multiplatform library", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "artifactVersion": "1.10.2", + "name": "kotlinx-coroutines-core", + "description": "Coroutines support libraries for Kotlin", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-coroutines-slf4j", + "artifactVersion": "1.10.2", + "name": "kotlinx-coroutines-slf4j", + "description": "Coroutines support libraries for Kotlin", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-datetime", + "artifactVersion": "0.7.1", + "name": "kotlinx-datetime", + "description": "Kotlin Datetime Library", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-html", + "artifactVersion": "0.12.0", + "name": "kotlinx.html", + "description": "A kotlinx.html library provides DSL to build HTML to Writer/Appendable or DOM at JVM and browser (or other JavaScript engine) for better Kotlin programming for Web.", + "developers": [ + { + "name": "Sergey Mashkov" + }, + { + "name": "Anton Dmitriev" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-io-bytestring", + "artifactVersion": "0.8.0", + "name": "kotlinx-io-bytestring", + "description": "IO support for Kotlin", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-io-core", + "artifactVersion": "0.8.0", + "name": "kotlinx-io-core", + "description": "IO support for Kotlin", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-serialization-core", + "artifactVersion": "1.9.0", + "name": "kotlinx-serialization-core", + "description": "Kotlin multiplatform serialization runtime library", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm", + "artifactVersion": "1.9.0", + "name": "kotlinx-serialization-json-io", + "description": "Kotlin multiplatform serialization runtime library", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm", + "artifactVersion": "1.9.0", + "name": "kotlinx-serialization-json", + "description": "Kotlin multiplatform serialization runtime library", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.runtime:jbr-api", + "artifactVersion": "1.5.0", + "name": "jbr-api", + "description": "Interface for the functionality specific to https://github.com/JetBrains/JetBrainsRuntime", + "developers": [ + { + "name": "Nikita Gubarkov" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.skiko:skiko", + "artifactVersion": "0.9.24", + "name": "Skiko MPP", + "description": "Kotlin Skia bindings", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.skiko:skiko-awt", + "artifactVersion": "0.9.24", + "name": "Skiko Awt", + "description": "Kotlin Skia bindings", + "developers": [ + { + "name": "Compose Multiplatform Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains:annotations", + "artifactVersion": "13.0", + "name": "IntelliJ IDEA Annotations", + "description": "A set of annotations used for code inspection support and code documentation.", + "developers": [ + { + "name": "JetBrains Team" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jspecify:jspecify", + "artifactVersion": "1.0.0", + "name": "JSpecify annotations", + "description": "An artifact of well-named and well-specified annotations to power static analysis checks", + "developers": [ + { + "name": "Kevin Bourrillion" + } + ], + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.slf4j:slf4j-api", + "artifactVersion": "2.0.17", + "name": "SLF4J API Module", + "description": "The slf4j API", + "developers": [ + { + "name": "Ceki Gulcu" + } + ], + "organization": { + "name": "QOS.ch" + }, + "licenses": [ + "MIT" + ] + }, + { + "uniqueId": "org.slf4j:slf4j-nop", + "artifactVersion": "2.0.17", + "name": "SLF4J NOP Provider", + "description": "SLF4J NOP Provider", + "developers": [ + { + "name": "Ceki Gulcu" + } + ], + "organization": { + "name": "QOS.ch" + }, + "licenses": [ + "MIT" + ] + }, + { + "uniqueId": "ro.cosminmihu.ktor:ktor-monitor-logging-no-op", + "artifactVersion": "1.7.4", + "name": "Ktor Monitor", + "description": "Powerful tools to log Ktor Client requests and responses, making it easier to debug and analyze network communication.", + "developers": [ + { + "name": "Cosmin Mihu" + } + ], + "licenses": [ + "Apache-2.0" + ] + } + ], + "licenses": { + "ASDKL": { + "name": "Android Software Development Kit License Agreement", + "url": "https://developer.android.com/studio/terms.html", + "content": "This is the Android Software Development Kit License Agreement\n
\n1. Introduction\n
\n1.1 The Android Software Development Kit (referred to in the License Agreement as the \"SDK\" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK.\n
\n1.2 \"Android\" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time.\n
\n1.3 A \"compatible implementation\" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS).\n
\n1.4 \"Google\" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.\n
\n2. Accepting this License Agreement\n
\n2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement.\n
\n2.2 By clicking to accept, you hereby agree to the terms of the License Agreement.\n
\n2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK.\n
\n2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.\n
\n3. SDK License from Google\n
\n3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android.\n
\n3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose.\n
\n3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. \"Intellectual Property Rights\" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you.\n
\n3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK.\n
\n3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement.\n
\n3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you.\n
\n3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features.\n
\n3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.\n
\n4. Use of the SDK by You\n
\n4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications.\n
\n4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries).\n
\n4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so.\n
\n4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier.\n
\n4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so.\n
\n4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.\n
\n5. Your Developer Credentials\n
\n5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.\n
\n6. Privacy and Information\n
\n6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected.\n
\n6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.\n
\n7. Third Party Applications\n
\n7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources.\n
\n7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners.\n
\n7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.\n
\n8. Using Android APIs\n
\n8.1 Google Data APIs\n
\n8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service.\n
\n8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so. If you use the Android Recognition Service API, documented at the following URL: https://developer.android.com/reference/android/speech/RecognitionService, as updated from time to time, you acknowledge that the use of the API is subject to the Data Processing Addendum for Products where Google is a Data Processor, which is located at the following URL: https://privacy.google.com/businesses/gdprprocessorterms/, as updated from time to time. By clicking to accept, you hereby agree to the terms of the Data Processing Addendum for Products where Google is a Data Processor.\n
\n9. Terminating this License Agreement\n
\n9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below.\n
\n9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials.\n
\n9.3 Google may at any time, terminate the License Agreement with you if:
\n(A) you have breached any provision of the License Agreement; or
\n(B) Google is required to do so by law; or
\n(C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or
\n(D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable.
\n
\n9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.\n
\n10. DISCLAIMER OF WARRANTIES\n
\n10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED \"AS IS\" AND \"AS AVAILABLE\" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE.\n
\n10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE.\n
\n10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\n
\n11. LIMITATION OF LIABILITY\n
\n11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.\n
\n12. Indemnification\n
\n12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.\n
\n13. Changes to the License Agreement\n
\n13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.\n
\n14. General Legal Terms\n
\n14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK.\n
\n14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google.\n
\n14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable.\n
\n14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement.\n
\n14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE.\n
\n14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party.\n
\n14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction.", + "internalHash": "ASDKL", + "spdxId": "ASDKL", + "hash": "ASDKL" + }, + "Apache-2.0": { + "name": "Apache License 2.0", + "url": "https://spdx.org/licenses/Apache-2.0.html", + "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.", + "internalHash": "Apache-2.0", + "spdxId": "Apache-2.0", + "hash": "Apache-2.0" + }, + "BSD-3-Clause": { + "name": "BSD 3-Clause \"New\" or \"Revised\" License", + "url": "https://spdx.org/licenses/BSD-3-Clause.html", + "content": "Copyright (c) < ;match=.+>>. All rights reserved. \n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. \n\n3. Neither the name of <> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY <> \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ", + "internalHash": "BSD-3-Clause", + "spdxId": "BSD-3-Clause", + "hash": "BSD-3-Clause" + }, + "EPL-1.0": { + "name": "Eclipse Public License 1.0", + "url": "https://spdx.org/licenses/EPL-1.0.html", + "content": "Eclipse Public License - v 1.0\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and\n b) in the case of each subsequent Contributor:\n i) changes to the Program, and\n ii) additions to the Program;\n\nwhere such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.\n\"Contributor\" means any person or entity that distributes the Program.\n\n\"Licensed Patents\" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.\n\n\"Program\" means the Contributions distributed in accordance with this Agreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement, including all Contributors.\n\n2. GRANT OF RIGHTS\n\n a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.\n \n b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.\n\n c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.\n\n d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.\n\n3. REQUIREMENTS\nA Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:\n\n a) it complies with the terms and conditions of this Agreement; and\n \n b) its license agreement:\n i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;\n ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;\n iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and\n iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.\n\nWhen the Program is made available in source code form:\n\n a) it must be made available under this Agreement; and\n\n b) a copy of this Agreement must be included with each copy of the Program.\nContributors may not remove or alter any copyright notices contained within the Program.\n\nEach Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.\n\n4. COMMERCIAL DISTRIBUTION\nCommercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (\"Commercial Contributor\") hereby agrees to defend and indemnify every other Contributor (\"Indemnified Contributor\") against any losses, damages and costs (collectively \"Losses\") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.\n\nFor example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.\n\n5. NO WARRANTY\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.\n\n6. DISCLAIMER OF LIABILITY\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.\n\nThis Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.", + "internalHash": "EPL-1.0", + "spdxId": "EPL-1.0", + "hash": "EPL-1.0" + }, + "MIT": { + "name": "MIT License", + "url": "https://spdx.org/licenses/MIT.html", + "content": "MIT License\n\nCopyright (c) \n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "internalHash": "MIT", + "spdxId": "MIT", + "hash": "MIT" + } + } +} \ No newline at end of file diff --git a/tasks-app-ios/build.gradle.kts b/tasks-app-ios/build.gradle.kts new file mode 100644 index 00000000..cad0d8a7 --- /dev/null +++ b/tasks-app-ios/build.gradle.kts @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import com.mikepenz.aboutlibraries.plugin.DuplicateMode +import com.mikepenz.aboutlibraries.plugin.DuplicateRule +import com.mikepenz.aboutlibraries.plugin.StrictMode + +plugins { + alias(libs.plugins.jetbrains.kotlin.multiplatform) + alias(libs.plugins.about.libraries) +} + +kotlin { + // kinda useless but need a target to allow sync in IntelliJ + // and don't want this target to be forced to an iOS one + // to avoid downloading too much stuff when not needed (no iOS target by default) + jvm() + + // Note: iOS targets are conditionally added dynamically in the root build.gradle.kts + + jvmToolchain(17) + + sourceSets { + commonMain.dependencies { + implementation(project(":tasks-app-shared")) + } + } +} + +aboutLibraries { + // - If the automatic registered android tasks are disabled, a similar thing can be achieved manually + // - `./gradlew :tasks-app-ios:exportLibraryDefinitions -Pci=true` + // - the resulting file can for example be added as part of the SCM + collect { + configPath = file("$rootDir/license_config") + offlineMode = true + fetchRemoteLicense = true + fetchRemoteFunding = false + // no need of BOM + includePlatform = false + } + export { + outputPath = file("$projectDir/Taskfolio/Resources/licenses_ios.json") + excludeFields.addAll("metadata", "funding", "scm", "associated", "website", "Developer.organisationUrl", "Organization.url") + prettyPrint = true + } + license { + strictMode = StrictMode.FAIL + allowedLicenses.addAll("Apache-2.0", "asdkl", "MIT", "EPL-1.0", "BSD-3-Clause") + } + library { + duplicationMode = DuplicateMode.MERGE + duplicationRule = DuplicateRule.SIMPLE + } +} \ No newline at end of file diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/MainViewController.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/MainViewController.kt new file mode 100644 index 00000000..d76b7aa4 --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/MainViewController.kt @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks.app + +import androidx.compose.material3.Surface +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.window.ComposeUIViewController +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.cinterop.ExperimentalForeignApi +import net.opatry.tasks.app.presentation.TaskListsViewModel +import net.opatry.tasks.app.presentation.UserState +import net.opatry.tasks.app.presentation.UserViewModel +import net.opatry.tasks.app.ui.TasksApp +import net.opatry.tasks.app.ui.component.AuthorizeGoogleTasksButton +import net.opatry.tasks.app.ui.component.LoadingPane +import net.opatry.tasks.app.ui.screen.AboutApp +import net.opatry.tasks.app.ui.screen.AuthorizationScreen +import net.opatry.tasks.app.ui.theme.TaskfolioTheme +import org.koin.compose.viewmodel.koinViewModel +import platform.Foundation.stringWithContentsOfFile + +@OptIn( + ExperimentalForeignApi::class, + ExperimentalComposeUiApi::class, +) +@Suppress( + "unused", + "FunctionName", +) +fun MainViewController() = ComposeUIViewController( + configure = { + parallelRendering = true + } +) { + val mainBundle = platform.Foundation.NSBundle.mainBundle + val appName = mainBundle.objectForInfoDictionaryKey("CFBundleDisplayName")?.toString() + ?: mainBundle.objectForInfoDictionaryKey("CFBundleName")?.toString() + ?: "Taskfolio" + + val shortVersion = mainBundle.objectForInfoDictionaryKey("CFBundleShortVersionString") + ?.toString() + ?.takeUnless(String::isEmpty) + val versionCode = mainBundle.objectForInfoDictionaryKey("CFBundleVersion") + ?.toString() + ?.takeUnless(String::isEmpty) + val fullVersion = listOfNotNull( + shortVersion, + versionCode, + ).joinToString(separator = ".") + .ifEmpty { "0.0.0.0" } + + val userViewModel = koinViewModel() + val userState by userViewModel.state.collectAsStateWithLifecycle(null) + + if (userState == null) { + LaunchedEffect(userState) { + userViewModel.refreshUserState() + } + } + + TaskfolioTheme { + Surface { + when (userState) { + null -> LoadingPane() + + UserState.Unsigned, + is UserState.SignedIn -> { + val aboutApp = AboutApp( + name = appName, + version = fullVersion + ) { + val path = mainBundle.pathForResource("licenses_ios", "json") + ?: error("licenses_ios.json not found in bundle") + + platform.Foundation.NSString.stringWithContentsOfFile( + path, + encoding = platform.Foundation.NSUTF8StringEncoding, + error = null + ) ?: error("Failed to load licenses_ios.json from bundle path: $path") + } + val tasksViewModel = koinViewModel() + TasksApp(aboutApp, userViewModel, tasksViewModel) + } + + UserState.Newcomer -> AuthorizationScreen(userViewModel::skipSignIn) { + AuthorizeGoogleTasksButton(onSuccess = userViewModel::signIn) + } + } + } + } +} diff --git a/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/initKoin.kt b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/initKoin.kt new file mode 100644 index 00000000..7c3a0645 --- /dev/null +++ b/tasks-app-shared/src/iosMain/kotlin/net/opatry/tasks/app/initKoin.kt @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Olivier Patry + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software + * is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.opatry.tasks.app + +import net.opatry.google.auth.GoogleAuthenticator +import net.opatry.tasks.app.di.dataModule +import net.opatry.tasks.app.di.loggingModule +import net.opatry.tasks.app.di.networkModule +import net.opatry.tasks.app.di.platformModule +import net.opatry.tasks.app.di.tasksAppModule +import net.opatry.tasks.app.di.utilModule +import org.koin.core.context.startKoin +import org.koin.dsl.module + +@Suppress("unused") +fun initKoin(googleAuthenticator: GoogleAuthenticator) { + startKoin { + modules( + utilModule, + loggingModule, + platformModule("ios"), + dataModule, + module { + single { googleAuthenticator } + }, + networkModule, + tasksAppModule, + ) + } +} From c5614bdfaf700dacf0e4571c1aa23bf6ae5600a0 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Fri, 20 Jun 2025 22:55:08 +0200 Subject: [PATCH 06/10] Add iOS Xcode project --- .gitignore | 6 +- build.gradle.kts | 9 + .../Configuration/Config.dev.xcconfig | 7 + tasks-app-ios/Configuration/Config.xcconfig | 7 + tasks-app-ios/Configuration/Versions.xcconfig | 2 + .../Taskfolio.xcodeproj/project.pbxproj | 461 ++++++++++++++++++ .../AccentColor.colorset/Contents.json | 56 +++ .../AccentColor.dev.colorset/Contents.json | 56 +++ .../AppIcon.appiconset/Contents.json | 122 +++++ .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 795 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1799 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 2968 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1270 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 2798 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 4471 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1799 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 4089 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 6561 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 6561 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 10364 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 3805 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 8507 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 9226 bytes .../AppIcon.appiconset/ItunesArtwork@2x.png | Bin 0 -> 96202 bytes .../AppIcon.dev.appiconset/Contents.json | 122 +++++ .../Icon-App-20x20@1x.png | Bin 0 -> 790 bytes .../Icon-App-20x20@2x.png | Bin 0 -> 1828 bytes .../Icon-App-20x20@3x.png | Bin 0 -> 2986 bytes .../Icon-App-29x29@1x.png | Bin 0 -> 1260 bytes .../Icon-App-29x29@2x.png | Bin 0 -> 2811 bytes .../Icon-App-29x29@3x.png | Bin 0 -> 4479 bytes .../Icon-App-40x40@1x.png | Bin 0 -> 1828 bytes .../Icon-App-40x40@2x.png | Bin 0 -> 4075 bytes .../Icon-App-40x40@3x.png | Bin 0 -> 6558 bytes .../Icon-App-60x60@2x.png | Bin 0 -> 6558 bytes .../Icon-App-60x60@3x.png | Bin 0 -> 10254 bytes .../Icon-App-76x76@1x.png | Bin 0 -> 3831 bytes .../Icon-App-76x76@2x.png | Bin 0 -> 8516 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 9247 bytes .../ItunesArtwork@2x.png | Bin 0 -> 96169 bytes .../Taskfolio/Assets.xcassets/Contents.json | 6 + .../Taskfolio/Configuration/Versions.xcconfig | 2 + tasks-app-ios/Taskfolio/ContentView.swift | 17 + .../Taskfolio/IOSGoogleAuthenticator.swift | 139 ++++++ tasks-app-ios/Taskfolio/Info.plist | 27 + tasks-app-ios/Taskfolio/TaskfolioApp.swift | 15 + tasks-app-ios/build.gradle.kts | 19 + 47 files changed, 1072 insertions(+), 1 deletion(-) create mode 100644 tasks-app-ios/Configuration/Config.dev.xcconfig create mode 100644 tasks-app-ios/Configuration/Config.xcconfig create mode 100644 tasks-app-ios/Configuration/Versions.xcconfig create mode 100644 tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AccentColor.dev.colorset/Contents.json create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Contents.json create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-20x20@1x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-20x20@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-20x20@3x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-29x29@1x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-29x29@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-29x29@3x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-40x40@1x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-40x40@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-40x40@3x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-60x60@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-60x60@3x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-76x76@1x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-76x76@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/ItunesArtwork@2x.png create mode 100644 tasks-app-ios/Taskfolio/Assets.xcassets/Contents.json create mode 100644 tasks-app-ios/Taskfolio/Configuration/Versions.xcconfig create mode 100644 tasks-app-ios/Taskfolio/ContentView.swift create mode 100644 tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift create mode 100644 tasks-app-ios/Taskfolio/Info.plist create mode 100644 tasks-app-ios/Taskfolio/TaskfolioApp.swift diff --git a/.gitignore b/.gitignore index 903c6d3f..ec8b5345 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,11 @@ local.properties .kotlin/metadata/ tasks-app-android/google-services.json +tasks-app-desktop/bin/ +tasks-app-ios/Taskfolio.xcodeproj/xcuserdata/*.xcuserdatad +tasks-app-ios/Taskfolio.xcodeproj/project.xcworkspace/contents.xcworkspacedata +tasks-app-ios/Taskfolio.xcodeproj/project.xcworkspace/xcuserdata/*.xcuserdatad +tasks-app-ios/Taskfolio.xcodeproj/project.xcworkspace/xcshareddata/* *token_cache.* client_secret_*.apps.googleusercontent.com.json @@ -42,4 +47,3 @@ _ci/api-*.json bundletool-*.jar _site/ -tasks-app-desktop/bin/ diff --git a/build.gradle.kts b/build.gradle.kts index 92b26b49..2c1b25d0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -200,3 +200,12 @@ subprojects { } } } + +gradle.projectsEvaluated { + val xcFrameworkTask = project(":tasks-app-shared").tasks.findByName("embedAndSignAppleFrameworkForXcode") + val updateVersionTask = project(":tasks-app-ios").tasks.findByName("updateXcodeVersionConfig") + + if (xcFrameworkTask != null && updateVersionTask != null) { + xcFrameworkTask.dependsOn(updateVersionTask) + } +} diff --git a/tasks-app-ios/Configuration/Config.dev.xcconfig b/tasks-app-ios/Configuration/Config.dev.xcconfig new file mode 100644 index 00000000..32b98ef5 --- /dev/null +++ b/tasks-app-ios/Configuration/Config.dev.xcconfig @@ -0,0 +1,7 @@ +#include? "Versions.xcconfig" + +APP_DISPLAY_NAME=T4skf0l10 d3v +APP_ID=net.opatry.tasks.app.dev +IOS_TARGET=simulator +GCP_CLIENT_ID=191682949161-ockace96gikfsif7hoa9h80p2r096iu4.apps.googleusercontent.com +GCP_REVERSED_CLIENT_ID=com.googleusercontent.apps.191682949161-ockace96gikfsif7hoa9h80p2r096iu4 diff --git a/tasks-app-ios/Configuration/Config.xcconfig b/tasks-app-ios/Configuration/Config.xcconfig new file mode 100644 index 00000000..22717fcc --- /dev/null +++ b/tasks-app-ios/Configuration/Config.xcconfig @@ -0,0 +1,7 @@ +#include? "Versions.xcconfig" + +APP_DISPLAY_NAME=Taskfolio +APP_ID=net.opatry.tasks.app +IOS_TARGET=all +GCP_CLIENT_ID=191682949161-79vl4dcpf9lppj5cj5k79tpqhv5ab10u.apps.googleusercontent.com +GCP_REVERSED_CLIENT_ID=com.googleusercontent.apps.191682949161-79vl4dcpf9lppj5cj5k79tpqhv5ab10u diff --git a/tasks-app-ios/Configuration/Versions.xcconfig b/tasks-app-ios/Configuration/Versions.xcconfig new file mode 100644 index 00000000..8ee1c7cf --- /dev/null +++ b/tasks-app-ios/Configuration/Versions.xcconfig @@ -0,0 +1,2 @@ +BUNDLE_VERSION=1 +BUNDLE_SHORT_VERSION_STRING=1.4.3 \ No newline at end of file diff --git a/tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj b/tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj new file mode 100644 index 00000000..98cc8701 --- /dev/null +++ b/tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj @@ -0,0 +1,461 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 4705DD9C2E07520D0008E5F7 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4705DD972E07520D0008E5F7 /* ContentView.swift */; }; + 4705DD9D2E07520D0008E5F7 /* TaskfolioApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4705DD992E07520D0008E5F7 /* TaskfolioApp.swift */; }; + 4705DD9F2E07520D0008E5F7 /* licenses_ios.json in Resources */ = {isa = PBXBuildFile; fileRef = 4705DD922E07520D0008E5F7 /* licenses_ios.json */; }; + 4705DDA02E07520D0008E5F7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4705DD942E07520D0008E5F7 /* Assets.xcassets */; }; + 47629B9A2E173EC100391C27 /* IOSGoogleAuthenticator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47629B992E173EB900391C27 /* IOSGoogleAuthenticator.swift */; }; + 47629B9D2E17407D00391C27 /* GoogleSignIn in Frameworks */ = {isa = PBXBuildFile; productRef = 47629B9C2E17407D00391C27 /* GoogleSignIn */; }; + 47629B9F2E17407D00391C27 /* GoogleSignInSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 47629B9E2E17407D00391C27 /* GoogleSignInSwift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 4705DD922E07520D0008E5F7 /* licenses_ios.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = licenses_ios.json; sourceTree = ""; }; + 4705DD942E07520D0008E5F7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 4705DD952E07520D0008E5F7 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; + 4705DD972E07520D0008E5F7 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 4705DD982E07520D0008E5F7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4705DD992E07520D0008E5F7 /* TaskfolioApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskfolioApp.swift; sourceTree = ""; }; + 4705DD9A2E07520D0008E5F7 /* Versions.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Versions.xcconfig; sourceTree = ""; }; + 4731FF7D2E1307C0005A081E /* Config.dev.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.dev.xcconfig; sourceTree = ""; }; + 4734A08F2E05CE9D00175C75 /* T4skf0l10 d3v.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "T4skf0l10 d3v.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 47629B992E173EB900391C27 /* IOSGoogleAuthenticator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOSGoogleAuthenticator.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4734A08C2E05CE9D00175C75 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 47629B9D2E17407D00391C27 /* GoogleSignIn in Frameworks */, + 47629B9F2E17407D00391C27 /* GoogleSignInSwift in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4705DD932E07520D0008E5F7 /* Resources */ = { + isa = PBXGroup; + children = ( + 4705DD922E07520D0008E5F7 /* licenses_ios.json */, + ); + path = Resources; + sourceTree = ""; + }; + 4705DD9B2E07520D0008E5F7 /* Taskfolio */ = { + isa = PBXGroup; + children = ( + 47629B992E173EB900391C27 /* IOSGoogleAuthenticator.swift */, + 4705DD932E07520D0008E5F7 /* Resources */, + 4705DD942E07520D0008E5F7 /* Assets.xcassets */, + 4705DD972E07520D0008E5F7 /* ContentView.swift */, + 4705DD982E07520D0008E5F7 /* Info.plist */, + 4705DD992E07520D0008E5F7 /* TaskfolioApp.swift */, + ); + path = Taskfolio; + sourceTree = ""; + }; + 4731FF612E127E5C005A081E /* Configuration */ = { + isa = PBXGroup; + children = ( + 4705DD952E07520D0008E5F7 /* Config.xcconfig */, + 4731FF7D2E1307C0005A081E /* Config.dev.xcconfig */, + 4705DD9A2E07520D0008E5F7 /* Versions.xcconfig */, + ); + path = Configuration; + sourceTree = ""; + }; + 4734A0862E05CE9D00175C75 = { + isa = PBXGroup; + children = ( + 4731FF612E127E5C005A081E /* Configuration */, + 4705DD9B2E07520D0008E5F7 /* Taskfolio */, + 4734A0902E05CE9D00175C75 /* Products */, + ); + sourceTree = ""; + }; + 4734A0902E05CE9D00175C75 /* Products */ = { + isa = PBXGroup; + children = ( + 4734A08F2E05CE9D00175C75 /* T4skf0l10 d3v.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4734A08E2E05CE9D00175C75 /* Taskfolio */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4734A0B32E05CED900175C75 /* Build configuration list for PBXNativeTarget "Taskfolio" */; + buildPhases = ( + 473FF7702E05F9E6002B3B0F /* Compile Kotlin Framework */, + 4734A08B2E05CE9D00175C75 /* Sources */, + 4734A08C2E05CE9D00175C75 /* Frameworks */, + 4734A08D2E05CE9D00175C75 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Taskfolio; + packageProductDependencies = ( + 47629B9C2E17407D00391C27 /* GoogleSignIn */, + 47629B9E2E17407D00391C27 /* GoogleSignInSwift */, + ); + productName = Taskfolio; + productReference = 4734A08F2E05CE9D00175C75 /* T4skf0l10 d3v.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4734A0872E05CE9D00175C75 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1620; + LastUpgradeCheck = 1620; + TargetAttributes = { + 4734A08E2E05CE9D00175C75 = { + CreatedOnToolsVersion = 16.2; + LastSwiftMigration = 1620; + }; + }; + }; + buildConfigurationList = 4734A08A2E05CE9D00175C75 /* Build configuration list for PBXProject "Taskfolio" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4734A0862E05CE9D00175C75; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 47629B9B2E17407D00391C27 /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 4734A0902E05CE9D00175C75 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4734A08E2E05CE9D00175C75 /* Taskfolio */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4734A08D2E05CE9D00175C75 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4705DD9F2E07520D0008E5F7 /* licenses_ios.json in Resources */, + 4705DDA02E07520D0008E5F7 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 473FF7702E05F9E6002B3B0F /* Compile Kotlin Framework */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Compile Kotlin Framework"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"${OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED}\" = \"YES\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to 'YES'.\"\n exit 0\nfi\n\nif [ -z \"${IOS_TARGET}\" ]; then\n echo \"You must define IOS_TARGET to 'all', 'simulator' or 'device' to allow building for iOS.\"\n exit 1\nfi\n\necho \"Building for '${IOS_TARGET}' target\"\n\ncd \"${SRCROOT}/..\"\n./gradlew :tasks-app-shared:embedAndSignAppleFrameworkForXcode\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4734A08B2E05CE9D00175C75 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4705DD9C2E07520D0008E5F7 /* ContentView.swift in Sources */, + 47629B9A2E173EC100391C27 /* IOSGoogleAuthenticator.swift in Sources */, + 4705DD9D2E07520D0008E5F7 /* TaskfolioApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 4734A0B12E05CED900175C75 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4731FF7D2E1307C0005A081E /* Config.dev.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = "$(BUNDLE_VERSION)"; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = "$(BUNDLE_SHORT_VERSION_STRING)"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(APP_DISPLAY_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 4734A0B22E05CED900175C75 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4705DD952E07520D0008E5F7 /* Config.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = "$(BUNDLE_VERSION)"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = "$(BUNDLE_SHORT_VERSION_STRING)"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(APP_DISPLAY_NAME)"; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 4734A0B42E05CED900175C75 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4731FF7D2E1307C0005A081E /* Config.dev.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon.dev; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor.dev; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DEVELOPMENT_TEAM = 9J8LQ9R327; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( + "$(inherited)", + "$(SRCROOT)/../tasks-app-shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Taskfolio/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "$(APP_DISPLAY_NAME)"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIStatusBarStyle = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)"; + PRODUCT_NAME = "$(APP_DISPLAY_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4734A0B52E05CED900175C75 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4705DD952E07520D0008E5F7 /* Config.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 9J8LQ9R327; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( + "$(inherited)", + "$(SRCROOT)/../tasks-app-shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Taskfolio/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "$(APP_DISPLAY_NAME)"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIStatusBarStyle = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)"; + PRODUCT_NAME = "$(APP_DISPLAY_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4734A08A2E05CE9D00175C75 /* Build configuration list for PBXProject "Taskfolio" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4734A0B12E05CED900175C75 /* Debug */, + 4734A0B22E05CED900175C75 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4734A0B32E05CED900175C75 /* Build configuration list for PBXNativeTarget "Taskfolio" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4734A0B42E05CED900175C75 /* Debug */, + 4734A0B52E05CED900175C75 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 47629B9B2E17407D00391C27 /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/google/GoogleSignIn-iOS"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 8.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 47629B9C2E17407D00391C27 /* GoogleSignIn */ = { + isa = XCSwiftPackageProductDependency; + package = 47629B9B2E17407D00391C27 /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */; + productName = GoogleSignIn; + }; + 47629B9E2E17407D00391C27 /* GoogleSignInSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 47629B9B2E17407D00391C27 /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */; + productName = GoogleSignInSwift; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 4734A0872E05CE9D00175C75 /* Project object */; +} diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AccentColor.colorset/Contents.json b/tasks-app-ios/Taskfolio/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..03aef6fd --- /dev/null +++ b/tasks-app-ios/Taskfolio/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.345", + "green" : "0.420", + "red" : "0.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.345", + "green" : "0.420", + "red" : "0.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.345", + "green" : "0.420", + "red" : "0.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AccentColor.dev.colorset/Contents.json b/tasks-app-ios/Taskfolio/Assets.xcassets/AccentColor.dev.colorset/Contents.json new file mode 100644 index 00000000..0e94f79e --- /dev/null +++ b/tasks-app-ios/Taskfolio/Assets.xcassets/AccentColor.dev.colorset/Contents.json @@ -0,0 +1,56 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.871", + "green" : "1.000", + "red" : "0.506" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "light" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.871", + "green" : "1.000", + "red" : "0.506" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.871", + "green" : "1.000", + "red" : "0.506" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Contents.json b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..1e2d7086 --- /dev/null +++ b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "filename" : "Icon-App-20x20@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-20x20@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-29x29@1x.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-40x40@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-40x40@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-60x60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "Icon-App-60x60@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "Icon-App-20x20@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-20x20@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-29x29@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-40x40@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-40x40@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-76x76@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "Icon-App-76x76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "Icon-App-83.5x83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "ItunesArtwork@2x.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..9553a495416ad6e97ec552c96f7143dba8b67b11 GIT binary patch literal 795 zcmV+$1LXXPP)-o}BlyUXgaL&7 z?NCUG5CWzACi>r%Vf;T(m?XOA2lRNsZ1#WDG_Y8Zw$TXbH#ZPI7$^inDfDhP6I0?y zT9ZNe%t-(^o7<=@e@y3__h@bpAdq$|sNXS&fuRUM@9~m(Fb_x0Dq1S5X|H<&hGM#7 z9%G}zIG?edS?Ti;Qqp+;38qk6KxvRdAtidZo6LgUBxWw-;`%(gUNwM}U?`s2N z&REFilgB8@F9f9!K)OG%;-K1AqBqAF6OLW!sau_xwiK( zU*3IW!M?5N-#vkVf`CdHFv?8Cj7hY;YQkigLN=w1@vW|x0yI?51T~5X)%wcEIX`YwfqqC|$Xa@b$GTdMv$itDFMeEBN zI_jG-bc4xrqnVkSL}lqc9u!={WVJA`ss;fAtM}c*#N;@V*7mKQ0%uD*HFqlbR9%m0 zOeji-ptTzs*ncpv92C&2!Dx%$rapAz4BIwJH!#_4h*10B`WgoIS0MO<`cwYDRQrfG Z_Ae4`HoHEll2rfz002ovPDHLkV1lU;bdCT3 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d2cab0a21e5227ac5546f73cf054f34b7d773117 GIT binary patch literal 1799 zcmV+i2l)7jP)1=%cR;R)0?%%bKCpQECt z3N$1x^%FbON%zSPQaw?yETq?lf|^1K(3GU^X95&LptZ*7?Wgvh={&UJQKm1LOE4V9 z#)p9cfQw6pB=JZ$AGaOhpF93e?2|5}K=$wOT8Z7_K3(Q*3ghtcV-NDgat(RL1yNCsSsg$tHQZJpUj)+UMU4{gynK z)+oolj^d!TLYM|Bk)m$qv;tf`1B1Q1v1%>n4t;Ew6{sq!08*HZpKuaH?8{=+}Q)i!SdkdoT6~W0foTLW+}U)mgx)U zqJj3Et)#nSNZXT#yJmWffV+Dd&uqSu);CtIR6?OT5>A|xdk;gIJ*=EoD&KTRfotBpj_Ly3_El>+``&TPstO)i^DK|A{65u_ z>mipLF(yk>5CM+MggYl<<0IY`A$~rBuq{+Jht?X?^5AB22q{795pbcJFav{q!*E8G zA8A|Mz4$A*%3;FPN#M9+1p)$tF|uc1AFzNkw(w%KRQHpc-lcVyLRqOlq9TyeFPu%FJ1OYtu`3%YEd! zql9OEk>*#gz-=Fb3ss?hb+_Q z+{cRF{+KBX=JL(WKPOZjCNY%O1IIoEr%*i; z5<7DtZ_A3fno$*0S|hwR-6uNejYaUAK^mIwhg1fHz^o2%Xye=LUjKU}1|}w{M4|w9 z>^f;RAeEtE(F6F+An{l?T_-vaUK=$QK(xlNJfym#oN7A)K;zez;H|GgWit6Ht`2Z$ z2evunLr9SOuW7Illgf7y0u1MOWFatt2Bc@Y+b* z8Xj3%DRedm=?uQ`1Q!3Wg~rDht#y=rV6JZ)9 zZ+RsH!j+{-T~1JY&vYIvEKQ-&mZt7*PPMgj=&e0OKRS(3+DOJqA;&1?Vw002ovPDHLkV1lW@YHk1k literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb3a7fbb1de0fa914a406173b4113bc08601380 GIT binary patch literal 2968 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 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..caaac082dc1314567ba49bd24b5822e77596ba4e GIT binary patch literal 2798 zcmVKL5=V; zhjm@U1}dZg4PI9_@snzqK7T$Rxo{3m(VCRMwV%aoqzDRcbXr_PRJpQ`sQAEr@C>06zm`qnHg_rMP%#6ugzU)@&$Bd)k zbYPkmsaOrWw!KQrlg+%jp@ojteR#!k7=*%q#zDb&+bDg6)9#7S))Qp{6dK_(@U8AB>XuiI%2f$yUo7imM=#L2Aw`JKGH;t`D6%%FXCNT5Or0^221pX1xBmy&B}pzQRJ zF>|y$+sv9yPQ+nF$B8U?$9 zZ2Tl%`^Vq;ksYdn-=aMp^NrZr(r=xdfC-;dd99wQwHOK6x%Z zP6uf-N6T}~thw=SRMJA3F#<1o9@Ih{26^hCkQ@KWL)YAb>$s?7A`&D-1r-9{b%~G4 z@tJED;shn)hQ)#XyLs%UrAX6+YDE-Pgi`qBN}st72x+?*RsubQTp9^fN{Q|%G5x|h zjBYpuJE&mDI8QBIMY;VTGGPu0QXU3*$Ggn+p=)jqHJLDR^F5J&A0mS4AV4JI%)Dq0 zo_0wXNp`;e3a|d@MN~~@NaiY(#H&JvJ~{Pp$Zy|_>v*WRiB~K$`EzF@4HfwiFlbOA z1-|W2ciMQGrcA`qWeiL{NU$BoO`C*eWIzZ?Zk`<*HbWwg*8L_cqXQSQtL-4;aeUW9B`wapWFD@zkyWCLFb+}{8G73 zdqN8QgI&zJWFC{w{{;TQZls}(0-55!gVEZMM zX>jH8+nDg_kKuK6p%U>v$fNq?5s-(y4YaNylad+@)TDW4$qLrp{{U&D2H*2=f)b8fA`{CE z3KIHr_r$Yj_UCRV&z@~NARevU96YGjsJKbjTdnMQbvvf8@Nk&5;IoLN)&Ekh2{ahB z8J=0PlBe%~kd#qN;Q6FtwYxDiVp{|d% zEn1^u2KK=&nt$^LOqsy;%G5WGXTj~)5jfQXqPNb~8ZAIs3I6f$T1uVyuru&JkOTqR zak%*Q>lrnA9FAAUlnI{w_3v>y^GL&p+|7?%Fa*Ajs>#su$Wv_H@Ddrbjvl9zS#!>3 z{v9{qm&*8#dx#l_{%zExkxIR1XFwVX-*NFvWfm;?Av0&sq2P3qG3(g!((`P2bUmsj zJ)|!F(57huP>MA-E#*MlZY(oH!Rh2v7tiNw%NLPMC-FME5kgcue_@Axpy1K_9fZK^ z=q8y>aoMjHbIyVeA|FfKO#uQv^9H&gitfOtuE*`pe5$)UlgOMGY$qox>A8esWX6z^yEV`cQ z=N&ncFe!O?I$PW5+}nm*u>mj>32MhSP&d92OJ(qIsJJEKF$D<*?9R#OFWDq>;py96` zG1_+=@T+6|-eMvM!lRZtaR7U((N(k_7 z4gIe#34dVj8Jz$<-sA-6@g^rgk2g61dc4Vh0S^*~!)qf?rvLx|07*qoM6N<$g7bx4 A7ytkO literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b49fed01ef265e12cad126dd70149401fc881965 GIT binary patch literal 4471 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 Y-C)-*k5ZyHt_>A3eH|lhEW{r1Kc4ox+W-In literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..d2cab0a21e5227ac5546f73cf054f34b7d773117 GIT binary patch literal 1799 zcmV+i2l)7jP)1=%cR;R)0?%%bKCpQECt z3N$1x^%FbON%zSPQaw?yETq?lf|^1K(3GU^X95&LptZ*7?Wgvh={&UJQKm1LOE4V9 z#)p9cfQw6pB=JZ$AGaOhpF93e?2|5}K=$wOT8Z7_K3(Q*3ghtcV-NDgat(RL1yNCsSsg$tHQZJpUj)+UMU4{gynK z)+oolj^d!TLYM|Bk)m$qv;tf`1B1Q1v1%>n4t;Ew6{sq!08*HZpKuaH?8{=+}Q)i!SdkdoT6~W0foTLW+}U)mgx)U zqJj3Et)#nSNZXT#yJmWffV+Dd&uqSu);CtIR6?OT5>A|xdk;gIJ*=EoD&KTRfotBpj_Ly3_El>+``&TPstO)i^DK|A{65u_ z>mipLF(yk>5CM+MggYl<<0IY`A$~rBuq{+Jht?X?^5AB22q{795pbcJFav{q!*E8G zA8A|Mz4$A*%3;FPN#M9+1p)$tF|uc1AFzNkw(w%KRQHpc-lcVyLRqOlq9TyeFPu%FJ1OYtu`3%YEd! zql9OEk>*#gz-=Fb3ss?hb+_Q z+{cRF{+KBX=JL(WKPOZjCNY%O1IIoEr%*i; z5<7DtZ_A3fno$*0S|hwR-6uNejYaUAK^mIwhg1fHz^o2%Xye=LUjKU}1|}w{M4|w9 z>^f;RAeEtE(F6F+An{l?T_-vaUK=$QK(xlNJfym#oN7A)K;zez;H|GgWit6Ht`2Z$ z2evunLr9SOuW7Illgf7y0u1MOWFatt2Bc@Y+b* z8Xj3%DRedm=?uQ`1Q!3Wg~rDht#y=rV6JZ)9 zZ+RsH!j+{-T~1JY&vYIvEKQ-&mZt7*PPMgj=&e0OKRS(3+DOJqA;&1?Vw002ovPDHLkV1lW@YHk1k literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0c270963e3409ccdabe9b8847c2af6bb531f01cc GIT binary patch literal 4089 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 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e575b2fdca33085a0d3f8a65bc2fed0fce17e0b1 GIT binary patch literal 6561 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 DJVhL97?e+T~ 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 S8~9csf}*UNOeM%H^nUB literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf1bcbc61e10f813430163c548b339ca8c9f605 GIT binary patch literal 3805 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 R-Ct}480nkq;dGF1{sWcEPmllr literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..12d614cfc35dd6854af3e71ff793d20973033b14 GIT binary patch literal 8507 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 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..288ab03a1ec5a936734f721cee540f32f7d45dbe GIT binary patch literal 9226 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 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..712ee2599c30d4771056273b8c6011a67dc307a8 GIT binary patch literal 96202 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 AD*ylh literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Contents.json b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Contents.json new file mode 100644 index 00000000..1e2d7086 --- /dev/null +++ b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "filename" : "Icon-App-20x20@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-20x20@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-29x29@1x.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-40x40@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-40x40@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-60x60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "Icon-App-60x60@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "Icon-App-20x20@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-20x20@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-29x29@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-40x40@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-40x40@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-76x76@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "Icon-App-76x76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "Icon-App-83.5x83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "ItunesArtwork@2x.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-20x20@1x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..8574d97c5d5feb4a97710ba0b9e2f3586aded6d2 GIT binary patch literal 790 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 N002ovPDHLkV1lY;Oq~D# literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-29x29@3x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..03450ac820a3aceaf7795d1bcc59040e45972d9e GIT binary patch literal 4479 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 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-40x40@1x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..db8d8978a6496f04ac2370b34273aaece28f746b GIT binary patch literal 1828 zcmV+<2iy3GP)yK3rcCDwm=1OQxOWSQZ=foCRL#g zRJ6^9^aGLNJjyF-f|4SnC?vI0Rf%a5wSZ|Q+O&q)F8G0MY~!_ez3ZKsJGURkcI{Am zT^p%<;Cva4Ryy~$|9kH_|1;u%YEj(Aq5Z!Bvc(<1*~T5f*@iLO1WGAT%6pCrAp}AQ z5MoyOXAG!Zg;Fkt?!zbiXy_Aumq;8kIMPN44WZ2pbVh)#l$d%D1CxP74=s%s>AliH z^2PuH2o*#qEG?mUaT$?tAvPAa%6N*7{5b?;@3#z4DTP1~(j&CDT;|UwPILL)2IB2q zkW7IiN3!Y=&LOX)n8j;Xv8MU~3KrarR5q?sn3^9K7pXjTrwTFMPNI~HE(`=ZZ$JAo z?;SgZb-fP+=mk-tB}L>!<^Yh257OV!jqK|O1tOHgLq~s3`RWzun$ESWEd+DJ5kAuofNf>yzuHA({W;E^ zc%9NuEoc7HN({}%wU%a%JoFfm;=8Cm^aOK?@{!7!bi1huEMVcX}fZXcMqQeU1R0ejcnSz zi=-1rDhFNHy%I8B00ClTQIjAY%}pHNvyZ{nP6CBds%!RBwrm+GIXER;c0lD~VDhJz zPUH04Ag_D@n||;x!)_9xiz&;5D2b=RzpgWi07z0Ymu_ zFmzG_2^`15R>M@RT)`KA`F$`=uAI5Ri68!g%jX+7{>T#~u6B)WYem%x4{qeP3ZY@y z!=wfhVCaPM^Rfa?e$R!#MG`BW2jLvzZC&)YbyHNjh>T3JZtE75t9bLkGc>>dS6a?p zM5V0}xKZWeV{pn<7{a8dy`6Yl7ld<&Et-dmoYFH+s-PwWHW`YSe2mT^{w2${}Io{SPp^QFxAfIm_sR(x{{ShHg@HdaQv?w=i!(IhLEw zItpZMhMLexyGicbwS&$NnrS@!4sRd&4TGIMY<%=#B9Ryt862#!_9ujfAxupC#N$1@ zcIas?oO}z?8J0Y-fekyilXeqmnx1X>={ai8u@NAH0h_0nW%P40LOzM1T)hod))S4x9$MWHtqn*;x&OM(LOLHR@Mjl2A3JMkzV}0u@xBTxI=&m$_{Qylt z0eEMkuWJ)pvQrYCcYiXXUpu@!a5Q4X16U@Hs^IRG6=!hIdOQAFTzsaw#%dxuY_h0v z@?ndWPrZqOo%Bia_|H_dD8zKi8nmS^&Gu`sPOg=4aBq*&hBk2>_4%-4L^FK%GJy1X z&drm-pA?NGg`iL4o~wuaxhPq)<1EEyy@ebO`J<#IW;{f(&d0? zc599tH(v-vXj_|ef#aRH!cl5AMs=093>nwETk+A|JtBT{q+^x)vKDGxVE@+DpHQoV z6%}mwjdtaTu6eXN;;bz@qo(Jf`j=4E8_|}%pps-Oxyn>4c&T~N4vqInac}Yq9^avE zk@VUFV~NGvaa>}}Lg;*aD7-y5X zxL(pHve1zrVLKIL5b{+CNJEvxz;n+T&i+pE=3K>@4w}nN((q$*-1-ge-Zd9=oIfxe zDq`r>RgrI4tMF6ep}g+oiFabgO_RQXIugJOTXQkyW`8VD6%@tkY*q|V5HK*sKtK&v z0WXw4jV9ihl3h(r>pr05g|Qh!@QVq3+G`EpCyFA8t504R;Nuu-bg5tG3%QFRyytob zcfm`pJxSB|^MU9KEUhJ)KRGl{VY?=9q`Daxr7PV-NEiLp`}Xao$zNsxf$xr~J?*S} z#6+~O1DUSecP@40>36pyrF{)?J?R(fQG6k9E#Mu5zc6AQC0{9l2;m-kv zdTvcTVO55m$10(a=&r7$4E_*DEF2;9u;fwY^Hof}z@WzF+A^b@_9E0+BU4M0Uuq^` zZ#$c**WN4b#i{$jmS`0$L)%2R*8?GE0S_wx51Au14gxzd$wFDa3vDsuxdhHk0H`VO z))~Gz>3(HC{xM|bSUF&7POalIw{InZSNwI}6DD35#vu70xET4*x3rDv1ym{Om1Y7P zRTDb*CQ~Eq(&;^CuzS^gbqIqtyB2rUZ5l{)R}|8`ma<6p;@Lq$??+`^()Tu;KzL|1 znF3k-ERYHAcp27lFs6xkLlw35na>JbO_~3S$6S@=Ji*m$w~HhaHGH zLa)@Q)c3*U{E1Bxa^oBa9;%mV&;=oxcKvym!CK|CnF~hZJOl+Wgyt|tq@IANPPV`9 z8yY0-U`wWJ_crccH?av%9oqd%XB%CEp+^h1`04%52^G##3S}Gp?LLQOLM-*y7qV8ZjbWun^KsCOxGbv4d6S(M zmxoJX6U5geIf8rV(D~FQ#BBI%B4a@kSM)6@n23XsYqYhgW3IZK48kDgi#<5Gs5^sH3OsX)q2NJc42t5~gWv9cDor*9f^=%- zQSEz<-lApcKBgi5NtaShDl^{}``uDB=-CsY-sWSl$Kh5G19kg+ zL^+$eYZP#f-W@Ub@dr7HVkZo$$AK!>dagmeVox|y-M;MZ{Fi3;^jv_nAJ#|tibBSQ z57|NiC_C@gQ~Y~yzhqHQ?o=b)LF-pX;I&E}iiErs;`ou(D;EjiH`}8qGrB)4F7#5xe%m>$T#k;n7`Oe7yquXbpkgn0p|RC-C{y-8dTZf; zFv*g&el12m6{<+wNLiLmQ0MkdYmFOj6A^DH+wPCNH3udBMs3AAGL06a89aKl)O9;2v+hHaucyC zQ(LmlU;s*<0f0<}()bjE%dTsBCm~=iFjZCW@Y(>}NneMi+HYs0Uxt?&^emJ`(nVCU zfrFhj+YD|OF#G8jVp@OByfWW5G(wwlc>u5TLy;TYP6qzGKIN}ptM?KEJXxkQgUMcv zj^%A;!;t2Q3mW=3x4)+?1F0&5!*NOj$rCIA@E%e3DYm>qBj9(IriJKnmR;y*E8VMS zP^vBjBwIFkdXwpoN)VnRfeoQ(E@i4BKwaJb-UuF;CK$uyU}vm5-}cohO7ok{sROF` zSQw)Ob)$dJv{V!F22+oz9S0VH}fWWOV2zp7+V}g}+cDXPWz1jJatH zr&m8?E}z}1%TwxjUwa-v&TwruB-oD=L|f|2bYrBnp9L_VLW)H&78DI)mi`E0B9`g4 z3N^Y3aA!VQSH9-en{iw@4aGIp`?um5f5R-Y`Ro#424j?*7tuzl>FGUt3UwD5lsal4 z`(yqk|7A)k$fr3JR$A@8q{8~hDxo^$Narh^B!_6>$o|*&q_s}lj@bKmt3tYpG=BrB z4ad)zq45Z>Ig8m2(W>R+g$gd=k=LibCHgd$PU_>M$IQk8yEYgS*?M15=xyrIAIk)g|HNBjiGDbsVcUGc-bqqul;cvb-oO=zmbAsC!OjOvkuld) zSgLc}%4c{8pkV?o*A=J^m5@#||3NsaZ~R$5L{2G=e4?Bk`m0wOP~1?wxJqC43yfee zbN_PFb6zoXu$Mt2Uxr9)Ym)I8V)|IL&p_G5?BFwxjVL|ARm`1l`bewO`Rw0Hc~UtY zU97l>-4Eir=V+xnLZp$%*O>sMo?*)l`0p3H69JfIxz2Lg((1?fP|qKVlgphMQ z_?gN>efA0V9Z(FdVpg>{l)1oB}t6MOfn9WAnJZCc9DfYyPCd#$NTgR4fuZ z1-%|HMLwKpxcL5f=>dntO0?F#J`bVA+8C5#f4w1WYaRFJ=O`v80Q)7u@m;!?@+fS^ zqc9u1&*ElMF9%^fQ0p(hxNwp4-nxxzWvxPSNz z9FsF6UK1mWTkRdg@tf<%6Z64&F)xH?X8G8=@t)_iyrCXM3)QhbH@8`DLFe$)!GPL* zG+dzS@saU?s6$R7^yG+CN1x$_7a{ZH>GBX^kjU54>uHx#_*HXjCgTYfyIM-%7#_R}Z6P7la*hD3F% zC7w7uIPrM$V}A4f$%sZFvCyTr?NCes>&e9~mKda;)`S<{u2I3AQ?x5}^tXPC9PRf* z5~`Y^M17DrP`iTv5$vk{qp&0A#B>2o#GY$b`_YByq4;x~)U&=J1oYFCpL}NG1+17$ z^WK^%OoY=W<0f%z%j&kFO|YNxtGoR7q_HGT<&Y^&cviOQ zQr3SrB#K^)qkHnXZYi&-35-=q$!%T&rHW-$T>B~UqyzCe2A@fLOC&x+Yt8a*fJR`) z@!gt{Qz5V&_K)ez_3?7^vx82>nW!4ADhQmHBMkIwf2>5xXXt!J4sq1-?D|ugLHMoIYe`kbNTL~ z*x@z`!GrpQvT!9~!j$Wwk)kiO!Fjo{GIZ{4X1#pd8>zDG5RPfL{!ZLGA?QiuVP^1L ziy0)DG@ghXS$u&aM@YPtDu&8`hyR?JR7DZT?#e>{3e=jGr=$dd432-%pG>{kf7)r7 ztkrZbwV^Ws0KVYM AC;$Ke literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-40x40@3x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6280576af9e4807b5b08c9b4901277338675c105 GIT binary patch literal 6558 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 EA2=}D0RR91 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-60x60@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6280576af9e4807b5b08c9b4901277338675c105 GIT binary patch literal 6558 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 EA2=}D0RR91 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-60x60@3x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..661b859eae69e3309d2092a55bf404c23cad8256 GIT binary patch literal 10254 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 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-76x76@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..337410280dec902e6df4266087043b2ce5151623 GIT binary patch literal 8516 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 L3KC@?!(aac{=|w^ literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-83.5x83.5@2x.png b/tasks-app-ios/Taskfolio/Assets.xcassets/AppIcon.dev.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..54f933d8a80dbd65479895e62d8a72538b3fd086 GIT binary patch literal 9247 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

K#0I;$#_TF3Op@yU8osz2#?=s1> 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 literal 0 HcmV?d00001 diff --git a/tasks-app-ios/Taskfolio/Assets.xcassets/Contents.json b/tasks-app-ios/Taskfolio/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/tasks-app-ios/Taskfolio/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/tasks-app-ios/Taskfolio/Configuration/Versions.xcconfig b/tasks-app-ios/Taskfolio/Configuration/Versions.xcconfig new file mode 100644 index 00000000..8ee1c7cf --- /dev/null +++ b/tasks-app-ios/Taskfolio/Configuration/Versions.xcconfig @@ -0,0 +1,2 @@ +BUNDLE_VERSION=1 +BUNDLE_SHORT_VERSION_STRING=1.4.3 \ No newline at end of file diff --git a/tasks-app-ios/Taskfolio/ContentView.swift b/tasks-app-ios/Taskfolio/ContentView.swift new file mode 100644 index 00000000..4db5dd51 --- /dev/null +++ b/tasks-app-ios/Taskfolio/ContentView.swift @@ -0,0 +1,17 @@ +import SwiftUI +import TasksAppShared + +struct ComposeView: UIViewControllerRepresentable { + func makeUIViewController(context: Context) -> UIViewController { + MainViewControllerKt.MainViewController() + } + + func updateUIViewController(_ uiViewController: UIViewController, context: Context) {} +} + +struct ContentView: View { + var body: some View { + ComposeView() + .ignoresSafeArea(.keyboard) + } +} diff --git a/tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift b/tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift new file mode 100644 index 00000000..1c2aed98 --- /dev/null +++ b/tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift @@ -0,0 +1,139 @@ +import TasksAppShared +import GoogleSignIn +import UIKit + +class IOSGoogleAuthenticator: OauthGoogleAuthenticator { + + func authorize(scopes: [OauthGoogleAuthenticatorScope], force: Bool, requestUserAuthorization: @escaping (Any) -> Void) async throws -> String { + let stringScopes = scopes.compactMap { $0.value } + + guard let windowScene = await UIApplication.shared.connectedScenes.first as? UIWindowScene, + let window = await windowScene.windows.first, + let rootViewController = await window.rootViewController else { + throw GoogleSignInError.noRootViewController + } + + guard let clientId = Bundle.main.object(forInfoDictionaryKey: "GIDClientID") as? String else { + throw GoogleSignInError.missingConfiguration + } + + if GIDSignIn.sharedInstance.configuration == nil { + let config: GIDConfiguration + if !stringScopes.isEmpty { + config = GIDConfiguration(clientID: clientId, serverClientID: clientId) + } else { + config = GIDConfiguration(clientID: clientId) + } + GIDSignIn.sharedInstance.configuration = config + } + + return try await withCheckedThrowingContinuation { continuation in + // FIXME in Jvm impl, the force means &prompt=consent&access_type=offline + // is it needed here? at least no need to sign-out + // or on Android .requestOfflineAccess(config.clientId, force) + if force { + GIDSignIn.sharedInstance.signOut() + } + + if !force, let currentUser = GIDSignIn.sharedInstance.currentUser { + if !stringScopes.isEmpty { + currentUser.addScopes(stringScopes, presenting: rootViewController) { result, error in + if let error = error { + continuation.resume(throwing: error) + } else if let user = result { + continuation.resume(returning: user.user.userID ?? "") + } else { + continuation.resume(throwing: GoogleSignInError.unknownError) + } + } + } else { + continuation.resume(returning: currentUser.userID ?? "") + } + return + } + + GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { result, error in + if let error = error { + continuation.resume(throwing: error) + } else if let user = result?.user { + if !stringScopes.isEmpty { + user.addScopes(stringScopes, presenting: rootViewController) { scopeResult, scopeError in + if let scopeError = scopeError { + continuation.resume(throwing: scopeError) + } else { + continuation.resume(returning: user.userID ?? "") + } + } + } else { + continuation.resume(returning: user.userID ?? "") + } + } else { + continuation.resume(throwing: GoogleSignInError.unknownError) + } + } + } + } + + func getToken(grant: any OauthGoogleAuthenticatorGrant) async throws -> OauthGoogleAuthenticatorOAuthToken { + guard let currentUser = GIDSignIn.sharedInstance.currentUser else { + throw GoogleSignInError.userNotSignedIn + } + + return try await withCheckedThrowingContinuation { continuation in + currentUser.refreshTokensIfNeeded { user, error in + if let error = error { + continuation.resume(throwing: error) + return + } + + guard let user = user else { + continuation.resume(throwing: GoogleSignInError.tokenNotAvailable) + return + } + let accessToken = user.accessToken.tokenString + + let expirationDate = user.accessToken.expirationDate + let currentDate = Date() + let expiresIn = Int64(expirationDate?.timeIntervalSince(currentDate) ?? 0) + + let token = OauthGoogleAuthenticatorOAuthToken( + accessToken: accessToken, + expiresIn: expiresIn, + idToken: user.idToken?.tokenString, + refreshToken: user.refreshToken.tokenString, + scope: user.grantedScopes?.joined(separator: " ") ?? "", + tokenType: OauthGoogleAuthenticatorOAuthToken.TokenType.bearer + ) + + continuation.resume(returning: token) + } + } + } +} + +// MARK: - Error Types +enum GoogleSignInError: Error, LocalizedError { + case noRootViewController + case missingConfiguration + case configurationFailed + case userNotSignedIn + case tokenNotAvailable + case unknownError + + var errorDescription: String? { + switch self { + case .noRootViewController: + return "Unable to find root view controller" + case .missingConfiguration: + return "No GIDClientID found in Info.plist" + case .configurationFailed: + return "Failed to configure Google Sign-In" + case .userNotSignedIn: + return "User is not signed in" + case .tokenNotAvailable: + return "Access token not available" + case .unknownError: + return "An unknown error occurred" + } + } +} diff --git a/tasks-app-ios/Taskfolio/Info.plist b/tasks-app-ios/Taskfolio/Info.plist new file mode 100644 index 00000000..c2096d84 --- /dev/null +++ b/tasks-app-ios/Taskfolio/Info.plist @@ -0,0 +1,27 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleShortVersionString + $(BUNDLE_SHORT_VERSION_STRING) + CFBundleVersion + $(BUNDLE_VERSION) + CFBundleDisplayName + $(APP_DISPLAY_NAME) + GIDClientID + $(GCP_CLIENT_ID) + CFBundleURLTypes + + + CFBundleURLName + google-sign-in + CFBundleURLSchemes + + $(GCP_REVERSED_CLIENT_ID) + + + + + diff --git a/tasks-app-ios/Taskfolio/TaskfolioApp.swift b/tasks-app-ios/Taskfolio/TaskfolioApp.swift new file mode 100644 index 00000000..f6766a85 --- /dev/null +++ b/tasks-app-ios/Taskfolio/TaskfolioApp.swift @@ -0,0 +1,15 @@ +import SwiftUI +import TasksAppShared + +@main +struct TaskfolioApp: App { + init() { + InitKoinKt.doInitKoin(googleAuthenticator: IOSGoogleAuthenticator()) + } + + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/tasks-app-ios/build.gradle.kts b/tasks-app-ios/build.gradle.kts index cad0d8a7..ac718cee 100644 --- a/tasks-app-ios/build.gradle.kts +++ b/tasks-app-ios/build.gradle.kts @@ -29,6 +29,9 @@ plugins { alias(libs.plugins.about.libraries) } +val appVersion = libs.versions.tasksApp.name.get() +val appVersionCode = System.getenv("CI_BUILD_NUMBER")?.toIntOrNull() ?: 1 + kotlin { // kinda useless but need a target to allow sync in IntelliJ // and don't want this target to be forced to an iOS one @@ -46,6 +49,22 @@ kotlin { } } +tasks.register("updateXcodeVersionConfig") { + val configFile = file("${projectDir}/Taskfolio/Configuration/Versions.xcconfig") + outputs.file(configFile) + val content = """ + BUNDLE_VERSION=$appVersionCode + BUNDLE_SHORT_VERSION_STRING=$appVersion + """.trimIndent() + + outputs.upToDateWhen { + configFile.takeIf(File::exists)?.readText() == content + } + doLast { + configFile.writeText(content) + } +} + aboutLibraries { // - If the automatic registered android tasks are disabled, a similar thing can be achieved manually // - `./gradlew :tasks-app-ios:exportLibraryDefinitions -Pci=true` From bbfeee347ebea7da5fdf79e8d02942a495ab76ac Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Fri, 20 Jun 2025 22:03:34 +0200 Subject: [PATCH 07/10] Update README for iOS target introduction --- README.md | 79 +++++++++++++++++++++++++++++++++++++++++++--- website/index.md | 14 +++++--- website/styles.css | 8 ++++- 3 files changed, 90 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ad83a9cb..40e5ca39 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ The coverage report excludes code not intended to be covered. -This avoids the [“broken window” effect](https://blog.codinghorror.com/the-broken-window-theory/): whether coverage is at 43% or 56%, it’s perceived as equally low—so efforts to improve it are often dismissed. In contrast, high or near-100% coverage is seen as achievable and worth tracking. +This avoids the [“broken window” effect](https://blog.codinghorror.com/the-broken-window-theory/): whether coverage is at 43% or 56%, it's perceived as equally low—so efforts to improve it are often dismissed. In contrast, high or near-100% coverage is seen as achievable and worth tracking. Refer to the root project's [`build.gradle.kts`](build.gradle.kts#L55-L90) for details. @@ -36,13 +36,16 @@ Refer to the root project's [`build.gradle.kts`](build.gradle.kts#L55-L90) for d [**Taskfolio**](https://opatry.github.io/taskfolio) is an Android task management app built using [Google Tasks API](https://developers.google.com/tasks/reference/rest). Developed to demonstrate my expertise in modern Android development, it highlights my skills in architecture, UI design with Jetpack Compose, OAuth authentication, and more—all packaged in a sleek, user-friendly interface. -> I set out to revisit the classical TODO app, ‘local-first’ syncing with Google Tasks—aiming for an MVE in 2 weeks, focusing on the 80/20 rule to nail the essentials. +> I set out to revisit the classical TODO app, 'local-first' syncing with Google Tasks—aiming for an MVE in 2 weeks, focusing on the 80/20 rule to nail the essentials. | ![](assets/screens/task_lists_light.png) | ![](assets/screens/groceries_light.png) | ![](assets/screens/add_task_light.png) | ![](assets/screens/home_dark.png) | | --------------------------------------- |--------------------------------------- | ---------------------------------- | ---------------------------------- | [![Taskfolio on Play Store](assets/GetItOnGooglePlay_Badge_Web_color_English.png)](https://play.google.com/store/apps/details?id=net.opatry.tasks.app) +> [!NOTE] +> The application is also available as a desktop (Jvm) application and an iOS application as well (using [Compose Multi Platform (aka CMP)](https://www.jetbrains.com/compose-multiplatform/) as UI Toolkit). + ## 🎯 Project intentions - [x] Showcase my expertise in Android application development @@ -76,9 +79,10 @@ I do not aim to implement advanced features beyond what is supported by the Goog ## 🛠️ Tech stack -- [Kotlin](https://kotlinlang.org/), [Multiplatform (aka KMP)](https://kotlinlang.org/docs/multiplatform.html) (currently Desktop & Android are supported) - - iOS wasn’t initially planned, but I bootstrapped a [PR to evaluate the feasibility of the iOS target]((https://github.com/opatry/taskfolio/pull/269)). It turned out to be quite achievable and just needs some polishing. - - Web is not planned any time soon (contribution are welcome 🤝) +- [Kotlin](https://kotlinlang.org/), [Multiplatform (aka KMP)](https://kotlinlang.org/docs/multiplatform.html) + - Android and Desktop are fully supported. + - iOS wasn't initially planned, but a draft version is available (use it at your own risk, there might be dragons 🐉). + - Web is not planned any time soon (contributions are welcome 🤝) - [Kotlin coroutines](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html) - [Ktor client](https://ktor.io/) (+ [Kotlinx serialization](https://kotlinlang.org/docs/serialization.html)) - [Room](https://developer.android.com/training/data-storage/room) for local persistence @@ -123,6 +127,9 @@ I do not aim to implement advanced features beyond what is supported by the Goog - The Desktop application (thin layer fully reusing `:tasks-app-shared`) - [`:tasks-app-android`](tasks-app-android) ■■■■■■■■□□ 80% - The Android application (thin layer fully reusing `:tasks-app-shared`) +- [`:tasks-app-ios/Taskfolio`](tasks-app-ios/Taskfolio) ■■■■■■■■■□ 90% + - The iOS application (thin layer fully reusing `:tasks-app-shared`) + - Xcode project, written in Swift - [`website/`](website) ■■■■■■■■■■ 100% - The [static site](https://opatry.github.io/taskfolio/) presenting the project - Made with [Jekyll](https://jekyllrb.com/) and served by [Github pages](https://pages.github.com/) @@ -177,6 +184,68 @@ When clicking on it, it will open a new window with the hot reload status. ![](assets/compose-hot-reload-console.png) +## 🍎 Build for iOS target + +The support of iOS works more or less _as-is_ and gets the job done. It's provided without guarantees, use at your own risk. +Feedback and contributions are welcome though 🤝. + +> [!NOTE] +> iOS support is _opt-in_ and disabled by default to avoid unnecessary time and disk usage during the initial Gradle sync when the iOS target isn't required. +> You can enable it by setting `ios.target` Gradle property to `all`, `simulator` or `device` from either `local.properties` or CLI using `-P`. +> When building from Xcode, it automatically sets `-Pios.target=simulator` based on `Config.xcconfig`. + +

+See details… + +You can build the `:tasks-app-shared` code for iOS using Gradle (to check if everything compiles on Kotlin side): + +```bash +./gradlew tasks-app-shared:linkDebugFrameworkIosSimulatorArm64 -Pios.target=simulator +``` + +### Building & Running from IntelliJ/Android Studio + +You can also use the incubating [Kotlin Multiplatform IntelliJ plugin](https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform) to build and launch the iOS app directly from IntelliJ/Android Studio (starting from Narwhal | 2025.1.1). +This plugin allows you to choose whether to run the app on a device or simulator, and enables debugging of Kotlin code even when called from iOS/Swift. + +It builds the Kotlin code as a native framework, then triggers the appropriate Gradle task to build Kotlin first, followed by `xcodebuild` for the Xcode and iOS-specific parts, ensuring a seamless integration between Kotlin and Swift code (see next section for details). + +### Building & Running from Xcode + +For full XCFramework build (to be consumed by the iOS application), you'll have to rely on `xcodebuild` (or build directly from Xcode): + +```bash +cd tasks-app-ios +IOS_TARGET=simulator xcodebuild -project Taskfolio.xcodeproj \ + -scheme Taskfolio \ + -sdk iphonesimulator \ + -arch arm64 \ + -configuration Debug \ + build \ + CODE_SIGNING_ALLOWED=NO \ + CODE_SIGN_IDENTITY="" \ + CODE_SIGNING_REQUIRED=NO +``` +This triggers the `:tasks-app-shared:embedAndSignAppleFrameworkForXcode` Gradle task under the hood. + +For Xcode integration, it's recommended to install the [Xcode Kotlin plugin](https://touchlab.co/xcodekotlin): + +```bash +brew install xcode-kotlin +xcode-kotlin install +``` + +When you update Xcode, you'll have to sync the plugin: + +```bash +xcode-kotlin sync +``` + +If you want to debug the Kotlin code from Xcode, you'll have to add the needed source sets in Xcode: +Add Group > Add folders as **reference** > `tasks-app-shared/{commonMain,iosMain}` (or any other module you want to debug). +If you properly installed the Xcode Kotlin plugin, you'll be able to set a breakpoint in the Kotlin code and see syntax coloring as well. +
+ ## ⚖️ License ``` diff --git a/website/index.md b/website/index.md index 34ea7941..2a2a4a6b 100644 --- a/website/index.md +++ b/website/index.md @@ -14,11 +14,13 @@ This project highlights the breadth of my Android knowledge, from API integratio It’s designed not just as a functioning task manager, but as a demonstration of my ability to deliver well-structured, maintainable, and scalable Android apps. -[![Taskfolio Android Application](assets/GetItOnGooglePlay_Badge_Web_color_English.png)](https://play.google.com/store/apps/details?id=net.opatry.tasks.app) +[![Taskfolio on Play Store](assets/GetItOnGooglePlay_Badge_Web_color_English.png)](https://play.google.com/store/apps/details?id=net.opatry.tasks.app) -| --------------------------------------- |--------------------------------------- |--------------------------------------- | ---------------------------------- | +| --------------------------------------- |--------------------------------------- | ---------------------------------- | ---------------------------------- | | ![](assets/screens/task_lists_light.png) | ![](assets/screens/groceries_light.png) | ![](assets/screens/add_task_light.png) | ![](assets/screens/home_dark.png) | +> ℹ️ The application is also available as a desktop (Jvm) application and an iOS application as well (using [Compose Multi Platform (aka CMP)](https://www.jetbrains.com/compose-multiplatform/) as UI Toolkit). + ## 🎯 Project intentions - [x] Showcase my expertise in Android application development @@ -52,11 +54,13 @@ I do not aim to implement advanced features beyond what is supported by the Goog ## 🛠️ Tech stack -- [Kotlin](https://kotlinlang.org/), [Multiplatform (aka KMP)](https://kotlinlang.org/docs/multiplatform.html) (currently Desktop & Android are supported) - - iOS & Web are not planned any time soon (contribution are welcome 🤝) +- [Kotlin](https://kotlinlang.org/), [Multiplatform (aka KMP)](https://kotlinlang.org/docs/multiplatform.html) + - Android and Desktop are fully supported. + - iOS wasn't initially planned, but a draft version is available (use it at your own risk, there might be dragons 🐉). + - Web is not planned any time soon (contributions are welcome 🤝) - [Kotlin coroutines](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html) - [Ktor client](https://ktor.io/) (+ [Kotlinx serialization](https://kotlinlang.org/docs/serialization.html)) -- [Room](https://developer.android.com/training/data-storage/room) for local persistance +- [Room](https://developer.android.com/training/data-storage/room) for local persistence - [Koin](https://insert-koin.io/) for dependency injection - [Material Design 3 Components](https://developer.android.com/develop/ui/compose/designsystems/material3) - [Jetpack Compose](https://developer.android.com/jetpack/compose), [Multiplatform (aka CMP)](https://www.jetbrains.com/compose-multiplatform/) diff --git a/website/styles.css b/website/styles.css index 28d00b40..f2ff5515 100644 --- a/website/styles.css +++ b/website/styles.css @@ -152,4 +152,10 @@ td { width: 50%; box-sizing: border-box; } -} \ No newline at end of file +} + +blockquote { + margin-left: 0; + padding-left: 1.5rem; + border-left: 4px solid #6BEACA; +} From 5981217931563af3abf9b21445546006e9743cb1 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Tue, 24 Jun 2025 21:28:30 +0200 Subject: [PATCH 08/10] Update CI to build iOS target --- .github/workflows/build-apps.yml | 25 +++++++-- .github/workflows/e2e-tests.yml | 2 +- .github/workflows/ios-app-nightly.yml | 73 +++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/ios-app-nightly.yml diff --git a/.github/workflows/build-apps.yml b/.github/workflows/build-apps.yml index b3631159..d622f598 100644 --- a/.github/workflows/build-apps.yml +++ b/.github/workflows/build-apps.yml @@ -10,16 +10,21 @@ on: jobs: build: - name: 🔨 Build - runs-on: ubuntu-24.04 + name: 🔨 Build - ${{ matrix.name }} + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - name: 📱 Android App gradle_module: tasks-app-android + os: ubuntu-24.04 - name: 🖥️ Desktop App gradle_module: tasks-app-desktop + os: ubuntu-24.04 + - name: 🍎 iOS App + gradle_module: tasks-app-ios + os: macos-15 permissions: contents: write checks: write @@ -30,12 +35,24 @@ jobs: - uses: actions/checkout@v4 - uses: ./.github/actions/setup-jdk-gradle + - name: Cache Gradle + if: ${{ matrix.gradle_module == 'tasks-app-ios' }} + uses: actions/cache@v4 + with: + path: | + .gradle + $HOME/.m2/repository + $HOME/.konan + key: gradle-${{ runner.os }}-${{ hashFiles('gradle/libs.versions.toml', 'gradle/wrapper/gradle-wrapper.properties', '**/*.gradle.kts', '**/*.gradle') }} + restore-keys: | + gradle-${{ runner.os }}- + - name: 🔓 Decrypt secrets env: PLAYSTORE_SECRET_PASSPHRASE: ${{ secrets.PLAYSTORE_SECRET_PASSPHRASE }} run: ./_ci/decrypt_secrets.sh - - name: ${{ matrix.name }} + - name: ${{ matrix.gradle_module }} env: PLAYSTORE_SECRET_PASSPHRASE: ${{ secrets.PLAYSTORE_SECRET_PASSPHRASE }} KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} @@ -50,4 +67,6 @@ jobs: -Pplaystore.keystore.file="${PWD}/_ci/tasksApp.keystore" \ -Pplaystore.keystore.password="${KEYSTORE_PASSWORD}" \ -Pplaystore.keystore.key_password="${KEYSTORE_KEY_PASSWORD}" + elif [ "${gradle_module}" = "tasks-app-ios" ]; then + IOS_TARGET=simulator ./gradlew tasks-app-shared:linkDebugFrameworkIosSimulatorArm64 fi diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 58f9be45..3bf1d1f4 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -7,7 +7,7 @@ on: jobs: check-changes: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 outputs: changes-detected: ${{ steps.check.outputs.changes_detected }} steps: diff --git a/.github/workflows/ios-app-nightly.yml b/.github/workflows/ios-app-nightly.yml new file mode 100644 index 00000000..1a9e0a37 --- /dev/null +++ b/.github/workflows/ios-app-nightly.yml @@ -0,0 +1,73 @@ +name: 🍎 iOS App Nightly + +on: + schedule: + - cron: '0 2 * * *' + workflow_dispatch: + +jobs: + check-changes: + runs-on: macos-15 + outputs: + changes-detected: ${{ steps.check.outputs.changes_detected }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check for changes + id: check + run: | + git fetch origin main + if git log --since="24 hours ago" --pretty=format:%H -- . \ + ':(exclude)website/' \ + ':(exclude)fastlane/' \ + ':(exclude)assets/' \ + ':(exclude)**/*.md' \ + | grep .; then + echo "changes_detected=true" >> "$GITHUB_OUTPUT" + else + echo "changes_detected=false" >> "$GITHUB_OUTPUT" + fi + + build-ios-app: + timeout-minutes: 15 + needs: check-changes + if: needs.check-changes.outputs.changes-detected == 'true' || github.event_name == 'workflow_dispatch' + name: 🍎 Build iOS App + runs-on: macos-15 + + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup-jdk-gradle + + - name: Cache Gradle + if: ${{ matrix.gradle_module == 'tasks-app-ios' }} + uses: actions/cache@v4 + with: + path: | + .gradle + $HOME/.m2/repository + $HOME/.konan + key: gradle-${{ runner.os }}-${{ hashFiles('gradle/libs.versions.toml', 'gradle/wrapper/gradle-wrapper.properties', '**/*.gradle.kts', '**/*.gradle') }} + restore-keys: | + gradle-${{ runner.os }}- + + - name: 🔓 Decrypt secrets + env: + PLAYSTORE_SECRET_PASSPHRASE: ${{ secrets.PLAYSTORE_SECRET_PASSPHRASE }} + run: ./_ci/decrypt_secrets.sh + + - name: 🔨 Build + run: | + cd tasks-app-ios + IOS_TARGET=simulator xcodebuild \ + -project Taskfolio.xcodeproj \ + -scheme Taskfolio \ + -sdk iphonesimulator \ + -arch arm64 \ + -configuration Debug \ + build \ + CODE_SIGNING_ALLOWED=NO \ + CODE_SIGN_IDENTITY="" \ + CODE_SIGNING_REQUIRED=NO From 8db8e974eb73e3cf17c1a043237c6c109e3e0363 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Mon, 7 Jul 2025 18:55:01 +0200 Subject: [PATCH 09/10] Update Google Sign-in iOS to 9.0.0 --- tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj b/tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj index 98cc8701..71cb38aa 100644 --- a/tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj +++ b/tasks-app-ios/Taskfolio.xcodeproj/project.pbxproj @@ -439,7 +439,7 @@ repositoryURL = "https://github.com/google/GoogleSignIn-iOS"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 8.0.0; + minimumVersion = 9.0.0; }; }; /* End XCRemoteSwiftPackageReference section */ From 5f6499c793cca58514dfdd56f55ba02bea4b44f8 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Tue, 8 Jul 2025 14:25:46 +0200 Subject: [PATCH 10/10] Fix main thread safety in iOS impl --- tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift b/tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift index 1c2aed98..781b8d44 100644 --- a/tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift +++ b/tasks-app-ios/Taskfolio/IOSGoogleAuthenticator.swift @@ -2,14 +2,15 @@ import TasksAppShared import GoogleSignIn import UIKit +@MainActor class IOSGoogleAuthenticator: OauthGoogleAuthenticator { func authorize(scopes: [OauthGoogleAuthenticatorScope], force: Bool, requestUserAuthorization: @escaping (Any) -> Void) async throws -> String { let stringScopes = scopes.compactMap { $0.value } - guard let windowScene = await UIApplication.shared.connectedScenes.first as? UIWindowScene, - let window = await windowScene.windows.first, - let rootViewController = await window.rootViewController else { + guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let window = windowScene.windows.first, + let rootViewController = window.rootViewController else { throw GoogleSignInError.noRootViewController }