From c70fdbaae10120352e10bcaa669863b86fdd78fd Mon Sep 17 00:00:00 2001 From: Russell Date: Wed, 21 Jul 2021 11:09:07 -0400 Subject: [PATCH 1/3] Update to 1.5.30, enable HMPP, and update sample to use built-in framework packing --- .idea/codeStyles/Project.xml | 10 +- CHANGELOG.md | 11 +- README.md | 14 +- azure-pipelines.yml | 2 +- buildSrc/build.gradle.kts | 2 +- buildSrc/src/main/kotlin/BuildHelpers.kt | 32 +--- buildSrc/src/main/kotlin/Versions.kt | 22 +-- gradle.properties | 2 + gradle/wrapper/gradle-wrapper.properties | 2 +- .../settings/coroutines/runBlocking.kt | 23 +++ .../coroutines/BaseCoroutineExtensionsTest.kt | 6 +- .../settings/coroutines/runBlocking.kt | 23 +++ .../settings/coroutines/BlockingConverters.kt | 1 - .../settings/coroutines/runBlocking.kt | 26 +++ .../settings/coroutines/suspendTest.kt | 2 - .../settings/coroutines/runBlocking.kt | 23 +++ ...platform-settings-coroutines-native-mt.api | 5 + .../build.gradle.kts | 10 +- .../api/multiplatform-settings-coroutines.api | 5 + .../build.gradle.kts | 10 +- .../build.gradle.kts | 4 +- .../build.gradle.kts | 7 +- .../build.gradle.kts | 7 +- multiplatform-settings-test/build.gradle.kts | 7 +- multiplatform-settings/build.gradle.kts | 7 +- .../com/russhwolf/settings/KeychainUtils.kt | 56 ++++++ .../com/russhwolf/settings/KeychainUtils.kt | 56 ++++++ .../russhwolf/settings/KeychainSettings.kt | 11 +- .../com/russhwolf/settings/KeychainUtils.kt | 49 ++++++ .../SettingsDemo.xcodeproj/project.pbxproj | 159 ++---------------- sample/app-ios/Shared/Info.plist | 22 --- sample/app-ios/Shared/Shared.h | 19 --- sample/build.gradle.kts | 6 +- sample/gradle.properties | 3 + sample/shared/build.gradle.kts | 28 +-- 35 files changed, 348 insertions(+), 324 deletions(-) create mode 100644 multiplatform-settings-coroutines-internal/src/androidMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt create mode 100644 multiplatform-settings-coroutines-internal/src/jvmMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt create mode 100644 multiplatform-settings-coroutines-internal/src/multithreadedMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt create mode 100644 multiplatform-settings-coroutines-internal/src/nativeMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt create mode 100644 multiplatform-settings/src/apple32Main/kotlin/com/russhwolf/settings/KeychainUtils.kt create mode 100644 multiplatform-settings/src/apple64Main/kotlin/com/russhwolf/settings/KeychainUtils.kt create mode 100644 multiplatform-settings/src/appleMain/kotlin/com/russhwolf/settings/KeychainUtils.kt delete mode 100644 sample/app-ios/Shared/Info.plist delete mode 100644 sample/app-ios/Shared/Shared.h diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 7a74f497..1f94f7f2 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -214,15 +214,7 @@ - \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f77af8e6..69a42bb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,20 @@ # Changelog # +## v0.8 *(2021-08-26)* ## + +- Update to Kotlin 1.5.30 and Gradle 7.1 +- Enable hierarchical project model +- Update `multiplatform-settings-coroutines` to use coroutines version 1.5.1 +- Update `multiplatform-settings-datastore` to use DataStore release version 1.0.0 +- Update `multiplatform-settings-serialization` to use serialization version 1.2.2 +- Other dependency version updates + ## v0.7.7 *(2021-05-20)* ## - Fix missing Kotlin 1.5.0 updates - Update `multiplatform-settings-coroutines` to use coroutines version 1.5.0 - Update `multiplatform-settings-datastore` to use DataStore version 1.0.0-beta01 -- Update `multiplatform-settings-serealization` to use serialization version 1.2.1 +- Update `multiplatform-settings-serialization` to use serialization version 1.2.1 ## v0.7.6 *(2021-04-27)* ## diff --git a/README.md b/README.md index dbd90e37..48f25202 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Then, simply add the dependency to your common source-set dependencies commonMain { dependencies { // ... - implementation("com.russhwolf:multiplatform-settings:0.7.7") + implementation("com.russhwolf:multiplatform-settings:0.8") } } ``` @@ -144,7 +144,7 @@ val factory: Settings.Factory = AppleSettings.Factory() To create a `Settings` instance from common without needing to pass platform-specific dependencies, add the `multiplatform-settings-no-arg` gradle dependency. This exports `multiplatform-settings` as an API dependency, so you can use it as a replacement for that default dependency. ```kotlin -implementation("com.russhwolf:multiplatform-settings-no-arg:0.7.7") +implementation("com.russhwolf:multiplatform-settings-no-arg:0.8") ``` Then from common code, you can write @@ -238,7 +238,7 @@ Note that for the `AppleSettings` implementation, some entries are unremovable a A testing dependency is available to aid in testing code that interacts with this library. ```kotlin -implementation("com.russhwolf:multiplatform-settings-test:0.7.7") +implementation("com.russhwolf:multiplatform-settings-test:0.8") ``` This includes a `MockSettings` implementation of the `Settings` interface, which is backed by an in-memory `MutableMap` on all platforms. @@ -309,7 +309,7 @@ On Apple platforms, the `AppleSettings` listeners are designed to work within th A `kotlinx-serialization` integration exists so it's easier to save non-primitive data ```kotlin -implementation("com.russhwolf:multiplatform-settings-serialization:0.7.7") +implementation("com.russhwolf:multiplatform-settings-serialization:0.8") ``` This essentially uses the `Settings` store as a serialization format. Thus for a serializable class @@ -346,10 +346,10 @@ Usage requires accepting both the `@ExperimentalSettingsApi` and `@ExperimentalS A separate `multiplatform-settings-coroutines` dependency includes various coroutine APIs. ```kotlin -implementation("com.russhwolf:multiplatform-settings-coroutines:0.7.7") +implementation("com.russhwolf:multiplatform-settings-coroutines:0.8") // Or, if you use native-mt coroutines release -implementation("com.russhwolf:multiplatform-settings-coroutines-native-mt:0.7.7") +implementation("com.russhwolf:multiplatform-settings-coroutines-native-mt:0.8") ``` This adds flow extensions for all types which use the listener APIs internally. @@ -389,7 +389,7 @@ val blockingSettings: Settings = suspendSettings.toBlockingSettings() An implementation of `FlowSettings` on the Android exists in the `multiplatform-settings-datastore` dependency, based on [Jetpack DataStore](https://developer.android.com/jetpack/androidx/releases/datastore) ```kotlin -implementation("com.russhwolf:multiplatform-settings-datastore:0.7.7") +implementation("com.russhwolf:multiplatform-settings-datastore:0.8") ``` This provides a `DataStoreSettings` class diff --git a/azure-pipelines.yml b/azure-pipelines.yml index cfeccaa3..55ce6705 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -80,7 +80,7 @@ jobs: jdkArchitectureOption: 'x64' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' - tasks: 'clean iosTest' + tasks: 'clean iosX64Test' - task: Xcode@5 inputs: diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c7991691..a297b88c 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -15,7 +15,7 @@ */ plugins { - kotlin("jvm") version "1.5.0" + kotlin("jvm") version "1.5.30" } repositories { diff --git a/buildSrc/src/main/kotlin/BuildHelpers.kt b/buildSrc/src/main/kotlin/BuildHelpers.kt index d1dfef32..dae7d7a2 100644 --- a/buildSrc/src/main/kotlin/BuildHelpers.kt +++ b/buildSrc/src/main/kotlin/BuildHelpers.kt @@ -29,6 +29,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset +import org.jetbrains.kotlin.konan.target.Architecture +import org.jetbrains.kotlin.konan.target.KonanTarget private val Project.kotlin: KotlinMultiplatformExtension get() = extensions.getByType(KotlinMultiplatformExtension::class.java) @@ -83,12 +85,13 @@ private fun KotlinMultiplatformExtension.buildAllTargets(targetPresets: NamedDom sourceSets.all { it.languageSettings.apply { - useExperimentalAnnotation("kotlin.RequiresOptIn") + optIn("kotlin.RequiresOptIn") } } targets.configureEach { it.compilations.configureEach { - it.kotlinOptions.allWarningsAsErrors = true + // TODO reenable this once duplicate library warnings are cleared +// it.kotlinOptions.allWarningsAsErrors = true } } @@ -137,32 +140,15 @@ private fun KotlinMultiplatformExtension.linkNativeSourceSets() { dependsOn(appleTest) } - // TODO this is just here to make the IDE happy (ish) while we wait for HMPP to improve - if (ideaActive) { - findByName("macosX64Main")?.apply { - kotlin.srcDirs(*nativeMain.kotlin.srcDirs.toTypedArray()) - kotlin.srcDirs(*appleMain.kotlin.srcDirs.toTypedArray()) - kotlin.srcDirs(*apple64Main.kotlin.srcDirs.toTypedArray()) - } - findByName("macosX64Test")?.apply { - kotlin.srcDirs(*nativeTest.kotlin.srcDirs.toTypedArray()) - kotlin.srcDirs(*appleTest.kotlin.srcDirs.toTypedArray()) - kotlin.srcDirs(*apple64Test.kotlin.srcDirs.toTypedArray()) - } - findByName("jvmMain")?.apply { - kotlin.srcDirs(*multithreadedMain.kotlin.srcDirs.toTypedArray()) - } - findByName("jvmTest")?.apply { - kotlin.srcDirs(*multithreadedTest.kotlin.srcDirs.toTypedArray()) - } - } - targets .withType(KotlinNativeTarget::class.java) .matching { it.konanTarget.family.isAppleFamily } .configureEach { it.apply { - if (konanTarget.architecture.bitness == 32 || it.name == "watchosArm64") { + if ( + konanTarget.architecture !in listOf(Architecture.X64, Architecture.ARM64) || + konanTarget in listOf(KonanTarget.WATCHOS_ARM64) + ) { compilations.getByName("main").defaultSourceSet.dependsOn(apple32Main) compilations.getByName("test").defaultSourceSet.dependsOn(apple32Test) } else { diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 77d64a00..28f421cd 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -17,22 +17,22 @@ @file:Suppress("KDocMissingDocumentation") object Versions { - const val multiplatformSettings = "0.7.7" + const val multiplatformSettings = "0.8" const val minSdk = 15 const val compileSdk = 30 - const val androidxDatastore = "1.0.0-beta01" + const val androidxDatastore = "1.0.0" const val androidxPreference = "1.1.1" - const val androidxStartup = "1.0.0" - const val androidxTest = "1.3.0" - const val androidxTestExt = "1.1.2" + const val androidxStartup = "1.1.0" + const val androidxTest = "1.4.0" + const val androidxTestExt = "1.1.3" const val binaryCompatibilityValidator = "0.2.4" - const val coroutines = "1.5.0" - const val coroutinesNativeMt = "1.5.0-native-mt" + const val coroutines = "1.5.1" + const val coroutinesNativeMt = "1.5.1-native-mt" const val junit = "4.13.2" - const val robolectric = "4.5.1" - const val serializationPlugin = "1.5.0" - const val serializationRuntime = "1.2.1" - const val turbine = "0.5.0" + const val robolectric = "4.6.1" + const val serializationPlugin = "1.5.30" + const val serializationRuntime = "1.2.2" + const val turbine = "0.6.0" } diff --git a/gradle.properties b/gradle.properties index 75bde3e9..848ea949 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,3 +16,5 @@ org.gradle.jvmargs=-Xmx2g android.useAndroidX=true kotlin.js.compiler=both +kotlin.mpp.enableGranularSourceSetsMetadata=true +kotlin.native.enableDependencyPropagation=false diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5e9ec220..10e803bc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -15,7 +15,7 @@ # #Sun Jun 09 17:45:17 EDT 2019 -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStorePath=wrapper/dists diff --git a/multiplatform-settings-coroutines-internal/src/androidMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt b/multiplatform-settings-coroutines-internal/src/androidMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt new file mode 100644 index 00000000..198a369a --- /dev/null +++ b/multiplatform-settings-coroutines-internal/src/androidMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2021 Russell Wolf + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.russhwolf.settings.coroutines + +import kotlinx.coroutines.CoroutineScope +import kotlin.coroutines.CoroutineContext + +internal actual fun runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T = + kotlinx.coroutines.runBlocking(context, block) diff --git a/multiplatform-settings-coroutines-internal/src/commonTest/kotlin/com/russhwolf/settings/coroutines/BaseCoroutineExtensionsTest.kt b/multiplatform-settings-coroutines-internal/src/commonTest/kotlin/com/russhwolf/settings/coroutines/BaseCoroutineExtensionsTest.kt index e41644de..448159c5 100644 --- a/multiplatform-settings-coroutines-internal/src/commonTest/kotlin/com/russhwolf/settings/coroutines/BaseCoroutineExtensionsTest.kt +++ b/multiplatform-settings-coroutines-internal/src/commonTest/kotlin/com/russhwolf/settings/coroutines/BaseCoroutineExtensionsTest.kt @@ -41,17 +41,17 @@ abstract class BaseCoroutineExtensionsTest { settings.setter("foo", firstValue) settings.flowBuilder("foo", defaultValue) .test { - assertEquals(firstValue, expectItem()) + assertEquals(firstValue, awaitItem()) expectNoEvents() settings.setter("foo", firstValue) expectNoEvents() settings.setter("bar", firstValue) expectNoEvents() settings.setter("foo", secondValue) - assertEquals(secondValue, expectItem()) + assertEquals(secondValue, awaitItem()) expectNoEvents() settings.remove("foo") - assertEquals(defaultValue, expectItem()) + assertEquals(defaultValue, awaitItem()) expectNoEvents() } } diff --git a/multiplatform-settings-coroutines-internal/src/jvmMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt b/multiplatform-settings-coroutines-internal/src/jvmMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt new file mode 100644 index 00000000..198a369a --- /dev/null +++ b/multiplatform-settings-coroutines-internal/src/jvmMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2021 Russell Wolf + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.russhwolf.settings.coroutines + +import kotlinx.coroutines.CoroutineScope +import kotlin.coroutines.CoroutineContext + +internal actual fun runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T = + kotlinx.coroutines.runBlocking(context, block) diff --git a/multiplatform-settings-coroutines-internal/src/multithreadedMain/kotlin/com/russhwolf/settings/coroutines/BlockingConverters.kt b/multiplatform-settings-coroutines-internal/src/multithreadedMain/kotlin/com/russhwolf/settings/coroutines/BlockingConverters.kt index f6586d47..e6cd370b 100644 --- a/multiplatform-settings-coroutines-internal/src/multithreadedMain/kotlin/com/russhwolf/settings/coroutines/BlockingConverters.kt +++ b/multiplatform-settings-coroutines-internal/src/multithreadedMain/kotlin/com/russhwolf/settings/coroutines/BlockingConverters.kt @@ -18,7 +18,6 @@ package com.russhwolf.settings.coroutines import com.russhwolf.settings.ExperimentalSettingsApi import com.russhwolf.settings.Settings -import kotlinx.coroutines.runBlocking /** * Wraps this [SuspendSettings] in the [Settings] interface. diff --git a/multiplatform-settings-coroutines-internal/src/multithreadedMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt b/multiplatform-settings-coroutines-internal/src/multithreadedMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt new file mode 100644 index 00000000..4bc6c9c3 --- /dev/null +++ b/multiplatform-settings-coroutines-internal/src/multithreadedMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2021 Russell Wolf + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.russhwolf.settings.coroutines + +import kotlinx.coroutines.CoroutineScope +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext + +internal expect fun runBlocking( + context: CoroutineContext = EmptyCoroutineContext, + block: suspend CoroutineScope.() -> T +): T diff --git a/multiplatform-settings-coroutines-internal/src/multithreadedTest/kotlin/com/russhwolf/settings/coroutines/suspendTest.kt b/multiplatform-settings-coroutines-internal/src/multithreadedTest/kotlin/com/russhwolf/settings/coroutines/suspendTest.kt index d4d7ef00..29d84ddf 100644 --- a/multiplatform-settings-coroutines-internal/src/multithreadedTest/kotlin/com/russhwolf/settings/coroutines/suspendTest.kt +++ b/multiplatform-settings-coroutines-internal/src/multithreadedTest/kotlin/com/russhwolf/settings/coroutines/suspendTest.kt @@ -1,5 +1,3 @@ package com.russhwolf.settings.coroutines -import kotlinx.coroutines.runBlocking - public actual fun suspendTest(block: suspend () -> Unit): Unit = runBlocking { block() } diff --git a/multiplatform-settings-coroutines-internal/src/nativeMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt b/multiplatform-settings-coroutines-internal/src/nativeMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt new file mode 100644 index 00000000..198a369a --- /dev/null +++ b/multiplatform-settings-coroutines-internal/src/nativeMain/kotlin/com/russhwolf/settings/coroutines/runBlocking.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2021 Russell Wolf + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.russhwolf.settings.coroutines + +import kotlinx.coroutines.CoroutineScope +import kotlin.coroutines.CoroutineContext + +internal actual fun runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T = + kotlinx.coroutines.runBlocking(context, block) diff --git a/multiplatform-settings-coroutines-native-mt/api/multiplatform-settings-coroutines-native-mt.api b/multiplatform-settings-coroutines-native-mt/api/multiplatform-settings-coroutines-native-mt.api index 4a8f47b1..4cdb9a99 100644 --- a/multiplatform-settings-coroutines-native-mt/api/multiplatform-settings-coroutines-native-mt.api +++ b/multiplatform-settings-coroutines-native-mt/api/multiplatform-settings-coroutines-native-mt.api @@ -78,6 +78,11 @@ public abstract interface class com/russhwolf/settings/coroutines/FlowSettings : public final class com/russhwolf/settings/coroutines/FlowSettings$Companion { } +public final class com/russhwolf/settings/coroutines/RunBlockingKt { + public static final fun runBlocking (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; + public static synthetic fun runBlocking$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; +} + public abstract interface class com/russhwolf/settings/coroutines/SuspendSettings { public static final field Companion Lcom/russhwolf/settings/coroutines/SuspendSettings$Companion; public abstract fun clear (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; diff --git a/multiplatform-settings-coroutines-native-mt/build.gradle.kts b/multiplatform-settings-coroutines-native-mt/build.gradle.kts index 57df102e..553a0a72 100644 --- a/multiplatform-settings-coroutines-native-mt/build.gradle.kts +++ b/multiplatform-settings-coroutines-native-mt/build.gradle.kts @@ -54,8 +54,7 @@ kotlin { implementation(project(":tests")) implementation(project(":multiplatform-settings-test")) - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) + implementation(kotlin("test")) implementation("app.cash.turbine:turbine:${Versions.turbine}") } @@ -67,9 +66,8 @@ kotlin { } val androidTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) - implementation("junit:junit:${Versions.junit}") + + implementation("junit:junit:${Versions.junit}") implementation("androidx.test:core:${Versions.androidxTest}") implementation("androidx.test.ext:junit:${Versions.androidxTestExt}") implementation("org.robolectric:robolectric:${Versions.robolectric}") @@ -82,8 +80,6 @@ kotlin { } val jvmTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") } } diff --git a/multiplatform-settings-coroutines/api/multiplatform-settings-coroutines.api b/multiplatform-settings-coroutines/api/multiplatform-settings-coroutines.api index 4a8f47b1..4cdb9a99 100644 --- a/multiplatform-settings-coroutines/api/multiplatform-settings-coroutines.api +++ b/multiplatform-settings-coroutines/api/multiplatform-settings-coroutines.api @@ -78,6 +78,11 @@ public abstract interface class com/russhwolf/settings/coroutines/FlowSettings : public final class com/russhwolf/settings/coroutines/FlowSettings$Companion { } +public final class com/russhwolf/settings/coroutines/RunBlockingKt { + public static final fun runBlocking (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; + public static synthetic fun runBlocking$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; +} + public abstract interface class com/russhwolf/settings/coroutines/SuspendSettings { public static final field Companion Lcom/russhwolf/settings/coroutines/SuspendSettings$Companion; public abstract fun clear (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; diff --git a/multiplatform-settings-coroutines/build.gradle.kts b/multiplatform-settings-coroutines/build.gradle.kts index b36c5ca4..4d84890e 100644 --- a/multiplatform-settings-coroutines/build.gradle.kts +++ b/multiplatform-settings-coroutines/build.gradle.kts @@ -54,8 +54,7 @@ kotlin { implementation(project(":tests")) implementation(project(":multiplatform-settings-test")) - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) + implementation(kotlin("test")) implementation("app.cash.turbine:turbine:${Versions.turbine}") } @@ -67,8 +66,6 @@ kotlin { } val androidTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") implementation("androidx.test:core:${Versions.androidxTest}") implementation("androidx.test.ext:junit:${Versions.androidxTestExt}") @@ -82,9 +79,8 @@ kotlin { } val jvmTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) - implementation("junit:junit:${Versions.junit}") + + implementation("junit:junit:${Versions.junit}") } } diff --git a/multiplatform-settings-datastore/build.gradle.kts b/multiplatform-settings-datastore/build.gradle.kts index 05bc9c6d..7b638eb8 100644 --- a/multiplatform-settings-datastore/build.gradle.kts +++ b/multiplatform-settings-datastore/build.gradle.kts @@ -40,7 +40,7 @@ kotlin { } val commonTest by getting { dependencies { - implementation(kotlin("test-common")) + implementation(kotlin("test")) implementation(project(":tests")) implementation(project(":multiplatform-settings-test")) @@ -55,8 +55,6 @@ kotlin { } val androidTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") implementation("androidx.test:core:${Versions.androidxTest}") diff --git a/multiplatform-settings-no-arg/build.gradle.kts b/multiplatform-settings-no-arg/build.gradle.kts index 6d2e94e4..1ce01afb 100644 --- a/multiplatform-settings-no-arg/build.gradle.kts +++ b/multiplatform-settings-no-arg/build.gradle.kts @@ -46,8 +46,7 @@ kotlin { } commonTest { dependencies { - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) + implementation(kotlin("test")) implementation(project(":tests")) } @@ -61,8 +60,6 @@ kotlin { } val androidTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") implementation("androidx.test:core:${Versions.androidxTest}") implementation("androidx.test.ext:junit:${Versions.androidxTestExt}") @@ -79,8 +76,6 @@ kotlin { val jvmTest by getting { languageSettings.useExperimentalAnnotation("com.russhwolf.settings.ExperimentalSettingsImplementation") dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") } } diff --git a/multiplatform-settings-serialization/build.gradle.kts b/multiplatform-settings-serialization/build.gradle.kts index 99972164..fe5ea7d2 100644 --- a/multiplatform-settings-serialization/build.gradle.kts +++ b/multiplatform-settings-serialization/build.gradle.kts @@ -54,8 +54,7 @@ kotlin { } commonTest { dependencies { - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) + implementation(kotlin("test")) implementation(project(":multiplatform-settings-test")) } @@ -67,8 +66,6 @@ kotlin { } val androidTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") } } @@ -79,8 +76,6 @@ kotlin { } val jvmTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") } } diff --git a/multiplatform-settings-test/build.gradle.kts b/multiplatform-settings-test/build.gradle.kts index 66ef4aa3..36fea1a4 100644 --- a/multiplatform-settings-test/build.gradle.kts +++ b/multiplatform-settings-test/build.gradle.kts @@ -35,8 +35,7 @@ kotlin { dependencies { implementation(project(":tests")) - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) + implementation(kotlin("test")) } } @@ -46,8 +45,6 @@ kotlin { } val androidTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") } } @@ -58,8 +55,6 @@ kotlin { } val jvmTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") } } diff --git a/multiplatform-settings/build.gradle.kts b/multiplatform-settings/build.gradle.kts index 2fe58ac5..80c12264 100644 --- a/multiplatform-settings/build.gradle.kts +++ b/multiplatform-settings/build.gradle.kts @@ -34,8 +34,7 @@ kotlin { dependencies { implementation(project(":tests")) - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) + implementation(kotlin("test")) } } @@ -45,8 +44,6 @@ kotlin { } val androidTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") implementation("androidx.test:core:${Versions.androidxTest}") implementation("androidx.test.ext:junit:${Versions.androidxTestExt}") @@ -60,8 +57,6 @@ kotlin { } val jvmTest by getting { dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-junit")) implementation("junit:junit:${Versions.junit}") } } diff --git a/multiplatform-settings/src/apple32Main/kotlin/com/russhwolf/settings/KeychainUtils.kt b/multiplatform-settings/src/apple32Main/kotlin/com/russhwolf/settings/KeychainUtils.kt new file mode 100644 index 00000000..ea59d2f5 --- /dev/null +++ b/multiplatform-settings/src/apple32Main/kotlin/com/russhwolf/settings/KeychainUtils.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2021 Russell Wolf + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.russhwolf.settings + +import kotlinx.cinterop.COpaquePointer +import kotlinx.cinterop.COpaquePointerVar +import kotlinx.cinterop.CValuesRef +import platform.CoreFoundation.CFAllocatorRef +import platform.CoreFoundation.CFArrayRef +import platform.CoreFoundation.CFDictionaryKeyCallBacks +import platform.CoreFoundation.CFDictionaryRef +import platform.CoreFoundation.CFDictionaryValueCallBacks +import platform.CoreFoundation.CFIndex +import platform.Foundation.NSData +import platform.Foundation.NSString +import platform.Foundation.NSStringEncoding +import platform.Foundation.create as platformCreate +import platform.Foundation.dataUsingEncoding as platformDataUsingEncoding + +internal actual val NSUTF8StringEncoding: NSStringEncoding = platform.Foundation.NSUTF8StringEncoding +internal actual fun NSString.Companion.create(data: NSData, encoding: NSStringEncoding): NSString? = + platformCreate(data, encoding) + +internal actual fun NSString.dataUsingEncoding(encoding: NSStringEncoding): NSData? = + platformDataUsingEncoding(encoding) + +internal actual fun CFArrayGetCount(theArray: CFArrayRef?): CFIndex = platform.CoreFoundation.CFArrayGetCount(theArray) +internal actual fun CFDictionaryCreate( + allocator: CFAllocatorRef?, + keys: CValuesRef, + values: CValuesRef, + numValues: CFIndex, + keyCallBacks: CValuesRef?, + valueCallBacks: CValuesRef? +): CFDictionaryRef? = + platform.CoreFoundation.CFDictionaryCreate(allocator, keys, values, numValues, keyCallBacks, valueCallBacks) + +internal actual fun CFArrayGetValueAtIndex(theArray: CFArrayRef?, index: CFIndex): COpaquePointer? = + platform.CoreFoundation.CFArrayGetValueAtIndex(theArray, index) + +internal actual fun CFIndex.asInt(): Int = this +internal actual fun Int.toCFIndex(): CFIndex = this diff --git a/multiplatform-settings/src/apple64Main/kotlin/com/russhwolf/settings/KeychainUtils.kt b/multiplatform-settings/src/apple64Main/kotlin/com/russhwolf/settings/KeychainUtils.kt new file mode 100644 index 00000000..41ff2077 --- /dev/null +++ b/multiplatform-settings/src/apple64Main/kotlin/com/russhwolf/settings/KeychainUtils.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2021 Russell Wolf + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.russhwolf.settings + +import kotlinx.cinterop.COpaquePointer +import kotlinx.cinterop.COpaquePointerVar +import kotlinx.cinterop.CValuesRef +import platform.CoreFoundation.CFAllocatorRef +import platform.CoreFoundation.CFArrayRef +import platform.CoreFoundation.CFDictionaryKeyCallBacks +import platform.CoreFoundation.CFDictionaryRef +import platform.CoreFoundation.CFDictionaryValueCallBacks +import platform.CoreFoundation.CFIndex +import platform.Foundation.NSData +import platform.Foundation.NSString +import platform.Foundation.NSStringEncoding +import platform.Foundation.create as platformCreate +import platform.Foundation.dataUsingEncoding as platformDataUsingEncoding + +internal actual val NSUTF8StringEncoding: NSStringEncoding = platform.Foundation.NSUTF8StringEncoding +internal actual fun NSString.Companion.create(data: NSData, encoding: NSStringEncoding): NSString? = + platformCreate(data, encoding) + +internal actual fun NSString.dataUsingEncoding(encoding: NSStringEncoding): NSData? = + platformDataUsingEncoding(encoding) + +internal actual fun CFArrayGetCount(theArray: CFArrayRef?): CFIndex = platform.CoreFoundation.CFArrayGetCount(theArray) +internal actual fun CFDictionaryCreate( + allocator: CFAllocatorRef?, + keys: CValuesRef, + values: CValuesRef, + numValues: CFIndex, + keyCallBacks: CValuesRef?, + valueCallBacks: CValuesRef? +): CFDictionaryRef? = + platform.CoreFoundation.CFDictionaryCreate(allocator, keys, values, numValues, keyCallBacks, valueCallBacks) + +internal actual fun CFArrayGetValueAtIndex(theArray: CFArrayRef?, index: CFIndex): COpaquePointer? = + platform.CoreFoundation.CFArrayGetValueAtIndex(theArray, index) + +internal actual fun CFIndex.asInt(): Int = toInt() +internal actual fun Int.toCFIndex(): CFIndex = toLong() diff --git a/multiplatform-settings/src/appleMain/kotlin/com/russhwolf/settings/KeychainSettings.kt b/multiplatform-settings/src/appleMain/kotlin/com/russhwolf/settings/KeychainSettings.kt index 01b1a2b4..eabbd344 100644 --- a/multiplatform-settings/src/appleMain/kotlin/com/russhwolf/settings/KeychainSettings.kt +++ b/multiplatform-settings/src/appleMain/kotlin/com/russhwolf/settings/KeychainSettings.kt @@ -24,10 +24,7 @@ import kotlinx.cinterop.memScoped import kotlinx.cinterop.ptr import kotlinx.cinterop.reinterpret import kotlinx.cinterop.value -import platform.CoreFoundation.CFArrayGetCount -import platform.CoreFoundation.CFArrayGetValueAtIndex import platform.CoreFoundation.CFArrayRefVar -import platform.CoreFoundation.CFDictionaryCreate import platform.CoreFoundation.CFDictionaryGetValue import platform.CoreFoundation.CFDictionaryRef import platform.CoreFoundation.CFStringRef @@ -43,9 +40,6 @@ import platform.Foundation.NSKeyedArchiver import platform.Foundation.NSKeyedUnarchiver import platform.Foundation.NSNumber import platform.Foundation.NSString -import platform.Foundation.NSUTF8StringEncoding -import platform.Foundation.create -import platform.Foundation.dataUsingEncoding import platform.Foundation.numberWithBool import platform.Foundation.numberWithDouble import platform.Foundation.numberWithFloat @@ -110,8 +104,8 @@ public class KeychainSettings(vararg defaultProperties: Pair ... } to avoid platform-dependent Int/Long conversion val count = CFArrayGetCount(attributes.value) val keys = mutableListOf() - for (i in 0 until count) { - val item: CFDictionaryRef? = CFArrayGetValueAtIndex(attributes.value, i)?.reinterpret() + for (i in 0 until count.asInt()) { + val item: CFDictionaryRef? = CFArrayGetValueAtIndex(attributes.value, i.toCFIndex())?.reinterpret() val cfKey: CFStringRef? = CFDictionaryGetValue(item, kSecAttrAccount)?.reinterpret() val nsKey = CFBridgingRelease(cfKey) as NSString keys.add(nsKey.toKString()) @@ -275,3 +269,4 @@ internal inline fun cfRetain(vararg values: Any?, block: MemScope.(Array, + values: CValuesRef, + numValues: CFIndex, + keyCallBacks: CValuesRef?, + valueCallBacks: CValuesRef? +): CFDictionaryRef? + +internal expect fun CFArrayGetValueAtIndex(theArray: CFArrayRef?, index: CFIndex): COpaquePointer? +internal expect fun CFIndex.asInt(): Int // Can't call this toInt because it shadows kotlin.toInt in actuals +internal expect fun Int.toCFIndex(): CFIndex diff --git a/sample/app-ios/SettingsDemo.xcodeproj/project.pbxproj b/sample/app-ios/SettingsDemo.xcodeproj/project.pbxproj index 02d2e234..70aabc71 100644 --- a/sample/app-ios/SettingsDemo.xcodeproj/project.pbxproj +++ b/sample/app-ios/SettingsDemo.xcodeproj/project.pbxproj @@ -7,8 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 4640988A21FABF4800AF919D /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4640987521FABF4700AF919D /* Shared.framework */; }; - 4640988B21FABF4800AF919D /* Shared.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4640987521FABF4700AF919D /* Shared.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 46D39ECE209D76D00080F90D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46D39ECD209D76D00080F90D /* AppDelegate.swift */; }; 46D39ED0209D76D00080F90D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46D39ECF209D76D00080F90D /* ViewController.swift */; }; 46D39ED3209D76D10080F90D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 46D39ED1209D76D10080F90D /* Main.storyboard */; }; @@ -19,13 +17,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 4640988821FABF4800AF919D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 46D39EC2209D76D00080F90D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4640987421FABF4700AF919D; - remoteInfo = Shared; - }; 46D39EDF209D76D30080F90D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 46D39EC2209D76D00080F90D /* Project object */; @@ -49,7 +40,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 4640988B21FABF4800AF919D /* Shared.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -57,9 +47,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 4640987521FABF4700AF919D /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4640987721FABF4700AF919D /* Shared.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Shared.h; sourceTree = ""; }; - 4640987821FABF4700AF919D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46D39ECA209D76D00080F90D /* SettingsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SettingsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 46D39ECD209D76D00080F90D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 46D39ECF209D76D00080F90D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -80,7 +67,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4640988A21FABF4800AF919D /* Shared.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -101,31 +87,13 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 4640982521F98A5500AF919D /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; - 4640987621FABF4700AF919D /* Shared */ = { - isa = PBXGroup; - children = ( - 4640987721FABF4700AF919D /* Shared.h */, - 4640987821FABF4700AF919D /* Info.plist */, - ); - path = Shared; - sourceTree = ""; - }; 46D39EC1209D76D00080F90D = { isa = PBXGroup; children = ( 46D39ECC209D76D00080F90D /* SettingsDemo */, 46D39EE1209D76D30080F90D /* SettingsDemoTests */, 46D39EEC209D76D30080F90D /* SettingsDemoUITests */, - 4640987621FABF4700AF919D /* Shared */, 46D39ECB209D76D00080F90D /* Products */, - 4640982521F98A5500AF919D /* Frameworks */, ); sourceTree = ""; }; @@ -135,7 +103,6 @@ 46D39ECA209D76D00080F90D /* SettingsDemo.app */, 46D39EDE209D76D30080F90D /* SettingsDemoTests.xctest */, 46D39EE9209D76D30080F90D /* SettingsDemoUITests.xctest */, - 4640987521FABF4700AF919D /* Shared.framework */, ); name = Products; sourceTree = ""; @@ -174,25 +141,11 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 4640987421FABF4700AF919D /* Shared */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4640988C21FABF4800AF919D /* Build configuration list for PBXNativeTarget "Shared" */; - buildPhases = ( - 4640989221FABF6F00AF919D /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Shared; - productName = Shared; - productReference = 4640987521FABF4700AF919D /* Shared.framework */; - productType = "com.apple.product-type.framework"; - }; 46D39EC9209D76D00080F90D /* SettingsDemo */ = { isa = PBXNativeTarget; buildConfigurationList = 46D39EF2209D76D30080F90D /* Build configuration list for PBXNativeTarget "SettingsDemo" */; buildPhases = ( + 4652A76D26ABC76200EAE41A /* ShellScript */, 46D39EC6209D76D00080F90D /* Sources */, 46D39EC7209D76D00080F90D /* Frameworks */, 46D39EC8209D76D00080F90D /* Resources */, @@ -201,7 +154,6 @@ buildRules = ( ); dependencies = ( - 4640988921FABF4800AF919D /* PBXTargetDependency */, ); name = SettingsDemo; productName = SettingsDemo; @@ -254,9 +206,6 @@ LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Russell Wolf"; TargetAttributes = { - 4640987421FABF4700AF919D = { - CreatedOnToolsVersion = 10.1; - }; 46D39EC9209D76D00080F90D = { CreatedOnToolsVersion = 9.3; LastSwiftMigration = 1010; @@ -289,7 +238,6 @@ 46D39EC9209D76D00080F90D /* SettingsDemo */, 46D39EDD209D76D30080F90D /* SettingsDemoTests */, 46D39EE8209D76D30080F90D /* SettingsDemoUITests */, - 4640987421FABF4700AF919D /* Shared */, ); }; /* End PBXProject section */ @@ -322,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 4640989221FABF6F00AF919D /* ShellScript */ = { + 4652A76D26ABC76200EAE41A /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -337,7 +285,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$SRCROOT/../gradlew\" -p \"$SRCROOT/../shared\" copyFramework \\\n-Pconfiguration.build.dir=\"$CONFIGURATION_BUILD_DIR\" \\\n-Pkotlin.build.type=\"$KOTLIN_BUILD_TYPE\" \\\n-Pkotlin.target=\"$KOTLIN_TARGET\"\n"; + shellScript = "\"$SRCROOT/../gradlew\" -p \"$SRCROOT/../shared\" \":shared:embedAndSignSharedAppleFrameworkForXcode\"\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -370,11 +318,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 4640988921FABF4800AF919D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4640987421FABF4700AF919D /* Shared */; - targetProxy = 4640988821FABF4800AF919D /* PBXContainerItemProxy */; - }; 46D39EE0209D76D30080F90D /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 46D39EC9209D76D00080F90D /* SettingsDemo */; @@ -407,69 +350,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 4640988D21FABF4800AF919D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = QDQ7CWKQQ6; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = Shared/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; - KOTLIN_BUILD_TYPE = DEBUG; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.russhwolf.settings.example.Shared; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 4640988E21FABF4800AF919D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = QDQ7CWKQQ6; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = Shared/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; - KOTLIN_BUILD_TYPE = RELEASE; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.russhwolf.settings.example.Shared; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 46D39EF0209D76D30080F90D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -591,17 +471,17 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = QDQ7CWKQQ6; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/build", - "$(PROJECT_DIR)", - "$(SRCROOT)/../shared/build/xcode-frameworks", - ); + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)"; INFOPLIST_FILE = SettingsDemo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-framework", + Shared, + ); PRODUCT_BUNDLE_IDENTIFIER = com.russhwolf.SettingsDemo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.2; @@ -616,17 +496,17 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = QDQ7CWKQQ6; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/build", - "$(PROJECT_DIR)", - "$(SRCROOT)/../shared/build/xcode-frameworks", - ); + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)"; INFOPLIST_FILE = SettingsDemo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-framework", + Shared, + ); PRODUCT_BUNDLE_IDENTIFIER = com.russhwolf.SettingsDemo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.2; @@ -719,15 +599,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 4640988C21FABF4800AF919D /* Build configuration list for PBXNativeTarget "Shared" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4640988D21FABF4800AF919D /* Debug */, - 4640988E21FABF4800AF919D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 46D39EC5209D76D00080F90D /* Build configuration list for PBXProject "SettingsDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/sample/app-ios/Shared/Info.plist b/sample/app-ios/Shared/Info.plist deleted file mode 100644 index e1fe4cfb..00000000 --- a/sample/app-ios/Shared/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - - diff --git a/sample/app-ios/Shared/Shared.h b/sample/app-ios/Shared/Shared.h deleted file mode 100644 index e24a5ff4..00000000 --- a/sample/app-ios/Shared/Shared.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Shared.h -// Shared -// -// Created by Russell Wolf on 1/24/19. -// Copyright © 2019 Russell Wolf. All rights reserved. -// - -#import - -//! Project version number for Shared. -FOUNDATION_EXPORT double SharedVersionNumber; - -//! Project version string for Shared. -FOUNDATION_EXPORT const unsigned char SharedVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 6f30be1d..ebbb88f2 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -15,14 +15,14 @@ */ plugins { - kotlin("multiplatform") version "1.4.32" apply false - kotlin("android") version "1.4.32" apply false + kotlin("multiplatform") version "1.5.30" apply false + kotlin("android") version "1.5.30" apply false id("com.android.library") version "4.1.2" apply false id("com.android.application") version "4.1.2" apply false } allprojects { - ext["library_version"] = "0.7.7" + ext["library_version"] = "0.8" repositories { mavenLocal() diff --git a/sample/gradle.properties b/sample/gradle.properties index 4c9b47aa..f5ca41f3 100644 --- a/sample/gradle.properties +++ b/sample/gradle.properties @@ -15,3 +15,6 @@ # org.gradle.jvmargs=-Xmx1536m android.useAndroidX=true +kotlin.mpp.enableGranularSourceSetsMetadata=true +kotlin.native.enableDependencyPropagation=false +xcodeproj=./app-ios/SettingsDemo.xcodeproj diff --git a/sample/shared/build.gradle.kts b/sample/shared/build.gradle.kts index 5d857d8d..cdee2465 100644 --- a/sample/shared/build.gradle.kts +++ b/sample/shared/build.gradle.kts @@ -14,7 +14,6 @@ * limitations under the License. */ -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { @@ -29,14 +28,7 @@ kotlin { browser() } - val isDevice = System.getenv("SDK_NAME")?.startsWith("iphoneos") == true - val iosTarget = if (isDevice) { - presets.getByName("iosArm64") - } else { - presets.getByName("iosX64") - } - targetFromPreset(iosTarget, "ios") { - this as KotlinNativeTarget + ios { binaries { framework("Shared") { // Make AppleSettings visible from Swift @@ -125,21 +117,3 @@ android { tasks.withType().all { kotlinOptions.jvmTarget = "1.8" } - - -task("copyFramework") { - val buildType = project.findProperty("kotlin.build.type") as? String ?: "DEBUG" - val framework = (kotlin.targets["ios"] as KotlinNativeTarget).compilations["main"].target.binaries.findFramework("Shared", buildType)!! - dependsOn(framework.linkTask) - - doLast { - val srcFile = framework.outputFile - val targetDir = project.property("configuration.build.dir") as? String ?: "" - copy { - from(srcFile.parent) - into(targetDir) - include("Shared.framework/**") - include("Shared.framework.dSYM") - } - } -} From 3d3b12aa850cb7ea73dc11ff83b9dab5fa9710a3 Mon Sep 17 00:00:00 2001 From: Russell Date: Thu, 26 Aug 2021 20:47:34 -0400 Subject: [PATCH 2/3] Add missing publications --- CHANGELOG.md | 1 + azure-pipelines-deploy.yml | 2 +- azure-pipelines.yml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69a42bb0..4bd761bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## v0.8 *(2021-08-26)* ## - Update to Kotlin 1.5.30 and Gradle 7.1 +- Add new Apple ARM targets - Enable hierarchical project model - Update `multiplatform-settings-coroutines` to use coroutines version 1.5.1 - Update `multiplatform-settings-datastore` to use DataStore release version 1.0.0 diff --git a/azure-pipelines-deploy.yml b/azure-pipelines-deploy.yml index 90165b9f..8fb125a6 100644 --- a/azure-pipelines-deploy.yml +++ b/azure-pipelines-deploy.yml @@ -36,7 +36,7 @@ jobs: jdkArchitectureOption: 'x64' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' - tasks: 'clean publishIosArm32PublicationToMavenRepository publishIosArm64PublicationToMavenRepository publishIosX64PublicationToMavenRepository publishMacosX64PublicationToMavenRepository publishWatchosArm32PublicationToMavenRepository publishWatchosArm64PublicationToMavenRepository publishWatchosX86PublicationToMavenRepository publishTvosArm64PublicationToMavenRepository publishTvosX64PublicationToMavenRepository' + tasks: 'clean publishKotlinMultiplatformPublicationToMavenRepository publishIosArm32PublicationToMavenRepository publishIosArm64PublicationToMavenRepository publishIosSimulatorArm64PublicationToMavenRepository publishIosX64PublicationToMavenRepository publishMacosX64PublicationToMavenRepository publishMacosArm64PublicationToMavenRepository publishWatchosArm32PublicationToMavenRepository publishWatchosArm64PublicationToMavenRepository publishWatchosSimulatorArm64PublicationToMavenRepository publishWatchosX86PublicationToMavenRepository publishWatchosX64PublicationToMavenRepository publishTvosArm64PublicationToMavenRepository publishTvosSimulatorArm64PublicationToMavenRepository publishTvosX64PublicationToMavenRepository' env: ORG_GRADLE_PROJECT_sonatypeUsername: $(sonatype_username) ORG_GRADLE_PROJECT_sonatypePassword: $(sonatype_password) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 55ce6705..2bad9b84 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -68,7 +68,7 @@ jobs: jdkArchitectureOption: 'x64' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' - tasks: 'clean macosX64Test iosX64Test watchosX86Test tvosX64Test publishKotlinMultiplatformPublicationToMavenLocal publishIosArm32PublicationToMavenLocal publishIosArm64PublicationToMavenLocal publishIosX64PublicationToMavenLocal publishMacosX64PublicationToMavenLocal publishWatchosArm32PublicationToMavenLocal publishWatchosArm64PublicationToMavenLocal publishWatchosX86PublicationToMavenLocal publishTvosArm64PublicationToMavenLocal publishTvosX64PublicationToMavenLocal' + tasks: 'clean macosX64Test iosX64Test watchosX64Test watchosX86Test tvosX64Test publishKotlinMultiplatformPublicationToMavenLocal publishIosArm32PublicationToMavenLocal publishIosArm64PublicationToMavenLocal publishIosSimulatorArm64PublicationToMavenLocal publishIosX64PublicationToMavenLocal publishMacosX64PublicationToMavenLocal publishMacosArm64PublicationToMavenLocal publishWatchosArm32PublicationToMavenLocal publishWatchosArm64PublicationToMavenLocal publishWatchosSimulatorArm64PublicationToMavenLocal publishWatchosX86PublicationToMavenLocal publishWatchosX64PublicationToMavenLocal publishTvosArm64PublicationToMavenLocal publishTvosSimulatorArm64PublicationToMavenLocal publishTvosX64PublicationToMavenLocal' - task: Gradle@2 inputs: From 5e5faad3ba9d7d7afd36d57cc0830be264755919 Mon Sep 17 00:00:00 2001 From: Russell Date: Thu, 26 Aug 2021 23:17:25 -0400 Subject: [PATCH 3/3] Disable xcode sample build (TODO migrate to actions?) --- azure-pipelines.yml | 17 ++++++++++------- .../SettingsDemo.xcodeproj/project.pbxproj | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2bad9b84..c64eae24 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -82,13 +82,16 @@ jobs: testResultsFiles: '**/TEST-*.xml' tasks: 'clean iosX64Test' - - task: Xcode@5 - inputs: - actions: 'build' - configuration: 'Debug' - scheme: 'SettingsDemo' - sdk: 'iphoneos' - packageApp: false + # TODO disabled because embedAndSign task needs more signing/provisioning config + # - task: Xcode@5 + # inputs: + # actions: 'build' + # configuration: 'Debug' + # scheme: 'SettingsDemo' + # sdk: 'iphoneos' + # packageApp: false + # signingOption: default + # args: '-allowProvisioningUpdates' # TODO Disabled because it isn't working in Azure # - task: Xcode@5 diff --git a/sample/app-ios/SettingsDemo.xcodeproj/project.pbxproj b/sample/app-ios/SettingsDemo.xcodeproj/project.pbxproj index 70aabc71..415c8784 100644 --- a/sample/app-ios/SettingsDemo.xcodeproj/project.pbxproj +++ b/sample/app-ios/SettingsDemo.xcodeproj/project.pbxproj @@ -285,7 +285,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$SRCROOT/../gradlew\" -p \"$SRCROOT/../shared\" \":shared:embedAndSignSharedAppleFrameworkForXcode\"\n"; + shellScript = "\"$SRCROOT/../gradlew\" -p \"$SRCROOT/../shared\" \":shared:embedAndSignSharedAppleFrameworkForXcode\" --stacktrace\n"; }; /* End PBXShellScriptBuildPhase section */