├── .editorconfig
├── screenshots
├── Demos.png
└── HelloPlatform.png
├── CHANGELOG.md
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── iosApp
├── iosApp
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── logo.imageset
│ │ │ ├── logo.png
│ │ │ ├── logo@2x.png
│ │ │ ├── logo@3x.png
│ │ │ └── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── iOSApp.swift
│ ├── Info.plist
│ └── AvoidDispose.swift
├── Pods
│ ├── Target Support Files
│ │ ├── Pods-iosApp
│ │ │ ├── Pods-iosApp.modulemap
│ │ │ ├── Pods-iosApp-dummy.m
│ │ │ ├── Pods-iosApp-acknowledgements.markdown
│ │ │ ├── Pods-iosApp-frameworks-Debug-output-files.xcfilelist
│ │ │ ├── Pods-iosApp-frameworks-Release-output-files.xcfilelist
│ │ │ ├── Pods-iosApp-frameworks-Debug-input-files.xcfilelist
│ │ │ ├── Pods-iosApp-frameworks-Release-input-files.xcfilelist
│ │ │ ├── Pods-iosApp-umbrella.h
│ │ │ ├── Pods-iosApp.debug.xcconfig
│ │ │ ├── Pods-iosApp.release.xcconfig
│ │ │ ├── Pods-iosApp-Info.plist
│ │ │ ├── Pods-iosApp-acknowledgements.plist
│ │ │ └── Pods-iosApp-frameworks.sh
│ │ └── test
│ │ │ ├── test.debug.xcconfig
│ │ │ └── test.release.xcconfig
│ ├── Manifest.lock
│ ├── Local Podspecs
│ │ └── test.podspec.json
│ └── Pods.xcodeproj
│ │ └── project.pbxproj
├── iosApp.xcworkspace
│ └── contents.xcworkspacedata
├── Podfile.lock
├── Podfile
└── iosApp.xcodeproj
│ └── project.pbxproj
├── test
├── src
│ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── rouge41
│ │ │ └── kmm
│ │ │ └── compose
│ │ │ ├── Platform.kt
│ │ │ ├── RootView.kt
│ │ │ ├── Extensions.kt
│ │ │ └── Resources.kt
│ ├── commonMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── rouge41
│ │ │ └── kmm
│ │ │ └── compose
│ │ │ ├── Platform.kt
│ │ │ ├── Extensions.kt
│ │ │ ├── Resources.kt
│ │ │ └── test
│ │ │ ├── Theme.kt
│ │ │ ├── demos
│ │ │ ├── HelloPlatform.kt
│ │ │ ├── TextFields.kt
│ │ │ ├── Counter.kt
│ │ │ ├── LazyColumnDemo.kt
│ │ │ ├── Layout.kt
│ │ │ ├── TextStyles.kt
│ │ │ ├── Images.kt
│ │ │ ├── BottomNavigationDemo.kt
│ │ │ ├── Lorem.kt
│ │ │ └── Buttons.kt
│ │ │ ├── Content.kt
│ │ │ └── App.kt
│ └── iosMain
│ │ └── kotlin
│ │ └── com
│ │ └── rouge41
│ │ └── kmm
│ │ └── compose
│ │ ├── Platform.kt
│ │ ├── Extensions.kt
│ │ ├── RootViewControllers.kt
│ │ └── Resources.kt
├── test.podspec
└── build.gradle.kts
├── androidApp
├── src
│ └── main
│ │ ├── res
│ │ ├── drawable-hdpi
│ │ │ └── logo.png
│ │ ├── drawable-ldpi
│ │ │ └── logo.png
│ │ ├── drawable-mdpi
│ │ │ └── logo.png
│ │ ├── drawable-xhdpi
│ │ │ └── logo.png
│ │ ├── drawable-xxhdpi
│ │ │ └── logo.png
│ │ ├── drawable-xxxhdpi
│ │ │ └── logo.png
│ │ └── values
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── rouge41
│ │ └── kmm
│ │ └── compose
│ │ └── androidApp
│ │ └── MainActivity.kt
└── build.gradle.kts
├── settings.gradle.kts
├── .gitignore
├── gradle.properties
├── gradlew.bat
├── README.md
├── gradlew
└── LICENSE.md
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.{kt,kts}]
2 | disabled_rules=no-wildcard-imports
--------------------------------------------------------------------------------
/screenshots/Demos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/screenshots/Demos.png
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog #
2 |
3 | ## 0.0.1-alpha *(2021-XX-XX)* ##
4 | - Initial release
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/screenshots/HelloPlatform.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/screenshots/HelloPlatform.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
--------------------------------------------------------------------------------
/test/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
--------------------------------------------------------------------------------
/androidApp/src/main/res/drawable-hdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/androidApp/src/main/res/drawable-hdpi/logo.png
--------------------------------------------------------------------------------
/androidApp/src/main/res/drawable-ldpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/androidApp/src/main/res/drawable-ldpi/logo.png
--------------------------------------------------------------------------------
/androidApp/src/main/res/drawable-mdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/androidApp/src/main/res/drawable-mdpi/logo.png
--------------------------------------------------------------------------------
/androidApp/src/main/res/drawable-xhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/androidApp/src/main/res/drawable-xhdpi/logo.png
--------------------------------------------------------------------------------
/androidApp/src/main/res/drawable-xxhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/androidApp/src/main/res/drawable-xxhdpi/logo.png
--------------------------------------------------------------------------------
/androidApp/src/main/res/drawable-xxxhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/androidApp/src/main/res/drawable-xxxhdpi/logo.png
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/logo.imageset/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/iosApp/iosApp/Assets.xcassets/logo.imageset/logo.png
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/Platform.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | expect class Platform() {
4 | val platform: String
5 | }
6 |
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/logo.imageset/logo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/iosApp/iosApp/Assets.xcassets/logo.imageset/logo@2x.png
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/logo.imageset/logo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cl3m/multiplatform-compose/HEAD/iosApp/iosApp/Assets.xcassets/logo.imageset/logo@3x.png
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_iosApp {
2 | umbrella header "Pods-iosApp-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_iosApp : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_iosApp
5 | @end
6 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/Extensions.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import androidx.compose.ui.graphics.ImageBitmap
4 |
5 | expect fun ByteArray.toImageBitmap(): ImageBitmap
6 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 | Generated by CocoaPods - https://cocoapods.org
4 |
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
--------------------------------------------------------------------------------
/test/src/androidMain/kotlin/com/rouge41/kmm/compose/Platform.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | actual class Platform actual constructor() {
4 | actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-Debug-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KMPNativeCoroutinesCombine.framework
2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KMPNativeCoroutinesCore.framework
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6200EE
4 | #3700B3
5 | #03DAC5
6 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-Release-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KMPNativeCoroutinesCombine.framework
2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KMPNativeCoroutinesCore.framework
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google()
4 | gradlePluginPortal()
5 | mavenCentral()
6 | }
7 | }
8 | rootProject.name = "multiplatform-compose"
9 |
10 | include(":androidApp")
11 | include(":test")
12 |
--------------------------------------------------------------------------------
/test/src/androidMain/kotlin/com/rouge41/kmm/compose/RootView.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import androidx.compose.runtime.Composable
4 | import com.rouge41.kmm.compose.test.Content
5 |
6 | @Composable
7 | fun RootView() {
8 | Content()
9 | }
10 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/Resources.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import androidx.compose.runtime.Composable
4 | import androidx.compose.ui.graphics.ImageBitmap
5 |
6 | @Composable
7 | internal expect fun imageResource(id: String): ImageBitmap
8 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Nov 18 11:12:20 CET 2022
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | sample/androidApp/build
2 | sample/shared/build
3 | sample/multiplatform-compose/build
4 | sample/test/build
5 | local.properties
6 | .gradle
7 | multiplatform-compose/build
8 | test/build
9 | .idea/libraries
10 | .idea/modules
11 | androidApp/build
12 | build
13 | modules.xml
14 | .idea
15 |
--------------------------------------------------------------------------------
/test/src/iosMain/kotlin/com/rouge41/kmm/compose/Platform.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import platform.UIKit.*
4 |
5 | actual class Platform actual constructor() {
6 | actual val platform: String =
7 | UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
8 | }
9 |
--------------------------------------------------------------------------------
/iosApp/iosApp.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-Debug-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh
2 | ${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.framework
3 | ${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.framework
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-Release-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh
2 | ${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.framework
3 | ${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.framework
--------------------------------------------------------------------------------
/iosApp/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - test (0.0.1)
3 |
4 | DEPENDENCIES:
5 | - test (from `../test`)
6 |
7 | EXTERNAL SOURCES:
8 | test:
9 | :path: "../test"
10 |
11 | SPEC CHECKSUMS:
12 | test: 66942bf3e61e1e990f5e0fe8ca47b3dbf12d7d21
13 |
14 | PODFILE CHECKSUM: 70f60dbd5c685328388ed16cc67b87bab84535fc
15 |
16 | COCOAPODS: 1.11.3
17 |
--------------------------------------------------------------------------------
/iosApp/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - test (0.0.1)
3 |
4 | DEPENDENCIES:
5 | - test (from `../test`)
6 |
7 | EXTERNAL SOURCES:
8 | test:
9 | :path: "../test"
10 |
11 | SPEC CHECKSUMS:
12 | test: 66942bf3e61e1e990f5e0fe8ca47b3dbf12d7d21
13 |
14 | PODFILE CHECKSUM: 70f60dbd5c685328388ed16cc67b87bab84535fc
15 |
16 | COCOAPODS: 1.11.3
17 |
--------------------------------------------------------------------------------
/test/src/iosMain/kotlin/com/rouge41/kmm/compose/Extensions.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import androidx.compose.ui.graphics.ImageBitmap
4 | import androidx.compose.ui.graphics.toComposeImageBitmap
5 |
6 | actual fun ByteArray.toImageBitmap(): ImageBitmap {
7 | return org.jetbrains.skia.Image.makeFromEncoded(this).toComposeImageBitmap()
8 | }
9 |
--------------------------------------------------------------------------------
/test/src/androidMain/kotlin/com/rouge41/kmm/compose/Extensions.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import android.graphics.BitmapFactory
4 | import androidx.compose.ui.graphics.ImageBitmap
5 | import androidx.compose.ui.graphics.asImageBitmap
6 |
7 | actual fun ByteArray.toImageBitmap(): ImageBitmap {
8 | return BitmapFactory.decodeByteArray(this, 0, this.size).asImageBitmap()
9 | }
10 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_iosAppVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_iosAppVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | #Gradle
2 | org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"
3 |
4 | kotlin.code.style=official
5 | android.useAndroidX=true
6 |
7 | #MPP
8 | xcodeproj=./iosApp
9 | kotlin.mpp.enableGranularSourceSetsMetadata=true
10 | kotlin.native.enableDependencyPropagation=false
11 | kotlin.native.binary.memoryModel=experimental
12 | kotlin.mpp.enableCInteropCommonization=true
13 | org.jetbrains.compose.experimental.uikit.enabled=true
--------------------------------------------------------------------------------
/iosApp/Podfile:
--------------------------------------------------------------------------------
1 | source 'https://cdn.cocoapods.org'
2 | platform :ios, '11.0'
3 |
4 | target 'iosApp' do
5 | use_frameworks!
6 | pod 'test', :path => '../test'
7 | end
8 |
9 | post_install do |installer|
10 | installer.pods_project.targets.each do |target|
11 | target.build_configurations.each do |config|
12 | # Force CocoaPods targets to always build for x86_64
13 | config.build_settings['ARCHS[sdk=iphonesimulator*]'] = 'x86_64'
14 | end
15 | end
16 | end
17 |
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/logo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "logo.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "logo@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "logo@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/test/src/androidMain/kotlin/com/rouge41/kmm/compose/Resources.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import android.content.Context
4 | import androidx.compose.runtime.Composable
5 | import androidx.compose.ui.graphics.ImageBitmap
6 | import androidx.compose.ui.res.imageResource
7 |
8 | @Composable
9 | internal actual fun imageResource(id: String): ImageBitmap {
10 | val context = Android.context
11 | val id = context.resources.getIdentifier(id, "drawable", context.packageName)
12 | return ImageBitmap.Companion.imageResource(id = id)
13 | }
14 |
15 | object Android {
16 | lateinit var context: Context
17 | }
18 |
--------------------------------------------------------------------------------
/iosApp/iosApp/iOSApp.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 | import test
3 |
4 | @UIApplicationMain
5 | class AppDelegate: NSObject, UIApplicationDelegate {
6 | var window: UIWindow?
7 |
8 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
9 | let controller = AvoidDispose(RootViewControllersKt.RootViewController())
10 | controller.view.backgroundColor = .white
11 | let window = UIWindow(frame: UIScreen.main.bounds)
12 | window.backgroundColor = .white
13 | window.rootViewController = controller
14 | window.makeKeyAndVisible()
15 | self.window = window
16 |
17 | return true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/Theme.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test
2 |
3 | import androidx.compose.material.MaterialTheme
4 | import androidx.compose.material.darkColors
5 | import androidx.compose.material.lightColors
6 | import androidx.compose.runtime.Composable
7 | import androidx.compose.ui.graphics.Color
8 |
9 | @Composable
10 | internal fun Theme(content: @Composable () -> Unit) {
11 | val orange = Color(0xFFFF8C00)
12 | val colors = if (DarkMode.current.value) {
13 | darkColors(primary = orange, surface = orange, onPrimary = Color.White)
14 | } else {
15 | lightColors(primary = orange)
16 | }
17 |
18 | MaterialTheme(
19 | colors = colors
20 | ) {
21 | content()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../test/build/cocoapods/framework"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
5 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "test"
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
9 | PODS_ROOT = ${SRCROOT}/Pods
10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
12 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../test/build/cocoapods/framework"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
5 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "test"
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
9 | PODS_ROOT = ${SRCROOT}/Pods
10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
12 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/HelloPlatform.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.layout.Arrangement
4 | import androidx.compose.foundation.layout.Column
5 | import androidx.compose.foundation.layout.fillMaxSize
6 | import androidx.compose.material.Text
7 | import androidx.compose.runtime.Composable
8 | import androidx.compose.ui.Alignment
9 | import androidx.compose.ui.Modifier
10 | import com.rouge41.kmm.compose.Platform
11 |
12 | @Composable
13 | internal fun HelloPlatform() {
14 | Column(
15 | modifier = Modifier.fillMaxSize(),
16 | verticalArrangement = Arrangement.Center,
17 | horizontalAlignment = Alignment.CenterHorizontally) {
18 | Text("Hello, ${Platform().platform}!")
19 | }
20 | }
--------------------------------------------------------------------------------
/androidApp/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/androidApp/src/main/java/com/rouge41/kmm/compose/androidApp/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.androidApp
2 |
3 | import android.graphics.Color
4 | import android.os.Bundle
5 | import com.rouge41.kmm.compose.Android
6 | import com.rouge41.kmm.compose.RootView
7 | import moe.tlaster.precompose.lifecycle.PreComposeActivity
8 | import moe.tlaster.precompose.lifecycle.setContent
9 |
10 | class MainActivity : PreComposeActivity() {
11 | override fun onCreate(savedInstanceState: Bundle?) {
12 | super.onCreate(savedInstanceState)
13 |
14 | // has to be set in code or in theme
15 | window.decorView.setBackgroundColor(Color.WHITE)
16 | window.statusBarColor = Color.parseColor("#cc7000")
17 |
18 | Android.context = this
19 | setContent {
20 | RootView()
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/test/test.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/test
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../test/build/cocoapods/framework"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | KOTLIN_PROJECT_PATH = :test
6 | OTHER_LDFLAGS = $(inherited) -l"c++"
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../test
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | PRODUCT_MODULE_NAME = test
14 | SKIP_INSTALL = YES
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/test/test.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/test
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../test/build/cocoapods/framework"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | KOTLIN_PROJECT_PATH = :test
6 | OTHER_LDFLAGS = $(inherited) -l"c++"
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../test
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | PRODUCT_MODULE_NAME = test
14 | SKIP_INSTALL = YES
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/test/src/iosMain/kotlin/com/rouge41/kmm/compose/RootViewControllers.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import androidx.compose.foundation.layout.PaddingValues
4 | import androidx.compose.ui.unit.dp
5 | import com.rouge41.kmm.compose.test.Content
6 | import com.rouge41.kmm.compose.test.darkmodeState
7 | import com.rouge41.kmm.compose.test.safeAreaState
8 | import moe.tlaster.precompose.PreComposeApplication
9 | import org.jetbrains.skiko.SystemTheme
10 | import org.jetbrains.skiko.currentSystemTheme
11 | import platform.CoreGraphics.CGFloat
12 |
13 | fun RootViewController() = PreComposeApplication(title = "") {
14 | Content()
15 | }
16 |
17 | fun setSafeArea(start: CGFloat, top: CGFloat, end: CGFloat, bottom: CGFloat) {
18 | safeAreaState.value = PaddingValues(start.dp, top.dp, end.dp, bottom.dp)
19 | }
20 |
21 | fun setDarkMode() {
22 | darkmodeState.value = currentSystemTheme == SystemTheme.DARK
23 | }
24 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreferenceSpecifiers
6 |
7 |
8 | FooterText
9 | This application makes use of the following third party libraries:
10 | Title
11 | Acknowledgements
12 | Type
13 | PSGroupSpecifier
14 |
15 |
16 | FooterText
17 | Generated by CocoaPods - https://cocoapods.org
18 | Title
19 |
20 | Type
21 | PSGroupSpecifier
22 |
23 |
24 | StringsTable
25 | Acknowledgements
26 | Title
27 | Acknowledgements
28 |
29 |
30 |
--------------------------------------------------------------------------------
/test/src/iosMain/kotlin/com/rouge41/kmm/compose/Resources.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose
2 |
3 | import androidx.compose.runtime.Composable
4 | import androidx.compose.ui.graphics.ImageBitmap
5 | import androidx.compose.ui.graphics.toComposeImageBitmap
6 | import kotlinx.cinterop.addressOf
7 | import kotlinx.cinterop.usePinned
8 | import platform.UIKit.UIImage
9 | import platform.UIKit.UIImagePNGRepresentation
10 | import platform.posix.memcpy
11 |
12 | @Composable
13 | internal actual fun imageResource(id: String): ImageBitmap {
14 | // TODO: maybe use something more efficient
15 | // TODO: maybe https://github.com/touchlab/DroidconKotlin/blob/main/shared-ui/src/iosMain/kotlin/co/touchlab/droidcon/ui/util/ToSkiaImage.kt
16 | val image = UIImage.imageNamed(id)!!
17 | val data = UIImagePNGRepresentation(image)!!
18 | val byteArray = ByteArray(data.length.toInt()).apply {
19 | usePinned {
20 | memcpy(it.addressOf(0), data.bytes, data.length)
21 | }
22 | }
23 | return org.jetbrains.skia.Image.makeFromEncoded(byteArray).toComposeImageBitmap()
24 | }
25 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/Content.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test
2 |
3 | import androidx.compose.foundation.isSystemInDarkTheme
4 | import androidx.compose.foundation.layout.PaddingValues
5 | import androidx.compose.runtime.Composable
6 | import androidx.compose.runtime.LaunchedEffect
7 | import androidx.compose.runtime.compositionLocalOf
8 | import androidx.compose.runtime.mutableStateOf
9 | import io.ktor.client.*
10 | import io.ktor.client.call.*
11 | import io.ktor.client.request.*
12 | import io.ktor.utils.io.core.*
13 |
14 | internal val darkmodeState = mutableStateOf(false)
15 | internal val safeAreaState = mutableStateOf(PaddingValues())
16 | internal val SafeArea = compositionLocalOf { safeAreaState }
17 | internal val DarkMode = compositionLocalOf { darkmodeState }
18 |
19 | @Composable
20 | internal fun Content() {
21 | Theme {
22 | App()
23 | }
24 | // isSystemInDarkTheme is not working correctly on iOS
25 | val darkMode = isSystemInDarkTheme()
26 | LaunchedEffect(key1 = Unit, block = {
27 | darkmodeState.value = darkMode
28 | })
29 | }
30 |
--------------------------------------------------------------------------------
/androidApp/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.application")
3 | kotlin("android")
4 | }
5 |
6 | android {
7 | compileSdk = AndroidSdk.compile
8 | defaultConfig {
9 | applicationId = "com.rouge41.kmm.compose.androidApp"
10 | minSdk = AndroidSdk.min
11 | targetSdk = AndroidSdk.target
12 | versionCode = 1
13 | versionName = "1.0"
14 | }
15 | buildTypes {
16 | getByName("release") {
17 | isMinifyEnabled = false
18 | }
19 | }
20 | compileOptions {
21 | sourceCompatibility = JavaVersion.VERSION_1_8
22 | targetCompatibility = JavaVersion.VERSION_1_8
23 | }
24 | kotlinOptions {
25 | jvmTarget = "1.8"
26 | }
27 | buildFeatures {
28 | compose = true
29 | }
30 | composeOptions {
31 | kotlinCompilerExtensionVersion = Version.compose_compiler
32 | }
33 | }
34 |
35 | dependencies {
36 | implementation(project(":test"))
37 |
38 | implementation(Android.appcompat)
39 | implementation(Android.material)
40 |
41 | implementation(Compose.runtime)
42 | implementation(Compose.ui)
43 | implementation(Compose.foundationLayout)
44 | implementation(Compose.material)
45 | }
46 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/TextFields.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.layout.*
4 | import androidx.compose.material.Text
5 | import androidx.compose.material.TextField
6 | import androidx.compose.runtime.*
7 | import androidx.compose.ui.Modifier
8 | import androidx.compose.ui.unit.dp
9 |
10 | //FROM https://raw.githubusercontent.com/vinaygaba/Learn-Jetpack-Compose-By-Example/master/app/src/main/java/com/example/jetpackcompose/text/TextFieldActivity.kt
11 |
12 | @Composable
13 | internal fun TextFields() {
14 | Column(modifier = Modifier.fillMaxWidth().padding(16.dp)) {
15 | Text("This is a filled TextInput field based on Material Design")
16 | MaterialTextInputComponent()
17 | }
18 | }
19 |
20 |
21 | @Composable
22 | internal fun MaterialTextInputComponent() {
23 | var textValue by remember { mutableStateOf("") }
24 |
25 | Text("Text is ${textValue}", modifier = Modifier)
26 | Spacer(modifier = Modifier.height(10.dp))
27 | TextField(
28 | value = textValue,
29 | onValueChange = { textValue = it },
30 | label = { Text("Enter Your Name") },
31 | placeholder = { Text(text = "John Doe") }
32 | )
33 | }
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/Counter.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.layout.*
4 | import androidx.compose.material.Button
5 | import androidx.compose.material.Text
6 | import androidx.compose.runtime.Composable
7 | import androidx.compose.runtime.compositionLocalOf
8 | import androidx.compose.runtime.mutableStateOf
9 | import androidx.compose.ui.Alignment
10 | import androidx.compose.ui.Modifier
11 | import androidx.compose.ui.unit.dp
12 |
13 | internal val Counter = compositionLocalOf { mutableStateOf(0) }
14 |
15 | @Composable
16 | internal fun Counter(modifier: Modifier = Modifier.fillMaxSize()) {
17 | var count = Counter.current
18 | Column(
19 | modifier = modifier,
20 | verticalArrangement = Arrangement.Center,
21 | horizontalAlignment = Alignment.CenterHorizontally
22 | ) {
23 | Text(text = "${count.value}", modifier = Modifier.height(50.dp))
24 | Row {
25 | Button(onClick = { count.value = count.value + 1 }) {
26 | Text("+")
27 | }
28 | Spacer(Modifier.width(15.dp))
29 | Button(onClick = { count.value = count.value - 1 }) {
30 | Text("-")
31 | }
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/LazyColumnDemo.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.layout.fillMaxSize
4 | import androidx.compose.foundation.lazy.items
5 | import androidx.compose.material.Divider
6 | import androidx.compose.material.Text
7 | import androidx.compose.runtime.Composable
8 | import androidx.compose.ui.Modifier
9 |
10 | @Composable
11 | internal fun LazyColumnDemo() {
12 | val items = (1..25).map { "Line $it" }
13 | androidx.compose.foundation.lazy.LazyColumn(modifier = Modifier.fillMaxSize()) {
14 | item {
15 | Text("Single\nWith\nMultiple\nLines")
16 | }
17 | item {
18 | Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dui erat, consequat eget felis malesuada, gravida pellentesque massa. Suspendisse id aliquet ex. Praesent diam dui, consectetur et orci eu, interdum cursus tortor. Aenean quis laoreet lectus, quis consectetur orci. Quisque ac diam varius, malesuada lacus varius, semper nulla. Ut vitae faucibus justo. Fusce nibh tortor, pulvinar viverra urna et, porttitor viverra ipsum. Proin et lacus ac leo lacinia tempus. Suspendisse dictum tortor nec efficitur faucibus.")
19 | }
20 | items(items) {
21 | Text(it)
22 | Divider()
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/iosApp/Pods/Local Podspecs/test.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "test",
3 | "version": "0.0.1",
4 | "homepage": "https://github.com/cl3m/multiplatform-compose",
5 | "source": {
6 | "http": ""
7 | },
8 | "authors": "",
9 | "license": "",
10 | "summary": "Multiplatform Compose Shared Test Module",
11 | "vendored_frameworks": "build/cocoapods/framework/test.framework",
12 | "libraries": "c++",
13 | "platforms": {
14 | "ios": "10.0"
15 | },
16 | "pod_target_xcconfig": {
17 | "KOTLIN_PROJECT_PATH": ":test",
18 | "PRODUCT_MODULE_NAME": "test"
19 | },
20 | "script_phases": [
21 | {
22 | "name": "Build test",
23 | "execution_position": "before_compile",
24 | "shell_path": "/bin/sh",
25 | "script": " if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n"
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/iosApp/iosApp/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 |
28 | UIRequiredDeviceCapabilities
29 |
30 | armv7
31 |
32 | UISupportedInterfaceOrientations
33 |
34 | UIInterfaceOrientationPortrait
35 | UIInterfaceOrientationLandscapeLeft
36 | UIInterfaceOrientationLandscapeRight
37 |
38 | UISupportedInterfaceOrientations~ipad
39 |
40 | UIInterfaceOrientationPortrait
41 | UIInterfaceOrientationPortraitUpsideDown
42 | UIInterfaceOrientationLandscapeLeft
43 | UIInterfaceOrientationLandscapeRight
44 |
45 | UILaunchScreen
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/test/test.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |spec|
2 | spec.name = 'test'
3 | spec.version = '0.0.1'
4 | spec.homepage = 'https://github.com/cl3m/multiplatform-compose'
5 | spec.source = { :http=> ''}
6 | spec.authors = ''
7 | spec.license = ''
8 | spec.summary = 'Multiplatform Compose Shared Test Module'
9 | spec.vendored_frameworks = 'build/cocoapods/framework/test.framework'
10 | spec.libraries = 'c++'
11 | spec.ios.deployment_target = '10.0'
12 |
13 |
14 | spec.pod_target_xcconfig = {
15 | 'KOTLIN_PROJECT_PATH' => ':test',
16 | 'PRODUCT_MODULE_NAME' => 'test',
17 | }
18 |
19 | spec.script_phases = [
20 | {
21 | :name => 'Build test',
22 | :execution_position => :before_compile,
23 | :shell_path => '/bin/sh',
24 | :script => <<-SCRIPT
25 | if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then
26 | echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\""
27 | exit 0
28 | fi
29 | set -ev
30 | REPO_ROOT="$PODS_TARGET_SRCROOT"
31 | "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
32 | -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \
33 | -Pkotlin.native.cocoapods.archs="$ARCHS" \
34 | -Pkotlin.native.cocoapods.configuration="$CONFIGURATION"
35 | SCRIPT
36 | }
37 | ]
38 |
39 | end
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/Layout.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.background
4 | import androidx.compose.foundation.layout.*
5 | import androidx.compose.material.Text
6 | import androidx.compose.runtime.Composable
7 | import androidx.compose.ui.Alignment
8 | import androidx.compose.ui.Modifier
9 | import androidx.compose.ui.graphics.Color
10 | import androidx.compose.ui.text.TextStyle
11 | import androidx.compose.ui.unit.dp
12 |
13 | @Composable
14 | internal fun Layout() {
15 | Box(modifier = Modifier.background(Color.Green)) {
16 | Column(
17 | modifier = Modifier.fillMaxSize().padding(5.dp).background(Color.Magenta),
18 | verticalArrangement = Arrangement.SpaceEvenly,
19 | horizontalAlignment = Alignment.CenterHorizontally,
20 | content = {
21 | Text("Layout is the new Blue.", modifier = Modifier.background(Color.Blue), style = TextStyle(color = Color.White))
22 | Text("Green.", modifier = Modifier.background(Color.Green))
23 | Row(
24 | modifier = Modifier.fillMaxWidth().background(Color.Yellow),
25 | horizontalArrangement = Arrangement.End,
26 | verticalAlignment = Alignment.Bottom,
27 | content = {
28 | Spacer(modifier = Modifier.background(Color.Red).height(30.dp).width(50.dp))
29 | Spacer(modifier = Modifier.background(Color.Black).height(50.dp).width(30.dp))
30 | Spacer(modifier = Modifier.background(Color.Blue).height(10.dp).width(10.dp))
31 | }
32 | )
33 | }
34 | )
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/TextStyles.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.isSystemInDarkTheme
4 | import androidx.compose.material.Text
5 | import androidx.compose.runtime.Composable
6 | import androidx.compose.ui.graphics.Color
7 | import androidx.compose.ui.text.TextStyle
8 | import androidx.compose.ui.text.font.FontFamily
9 | import androidx.compose.ui.text.font.FontStyle
10 | import androidx.compose.ui.text.font.FontWeight
11 | import androidx.compose.ui.unit.sp
12 |
13 | @Composable
14 | internal fun TextStyles() {
15 | Text("I am Custom Color Blue", style = TextStyle(color = Color.Blue))
16 | // place yuor fonts into the fonts folder inside res folder
17 | // Text("I am Custom Font Montserrat", style = TextStyle(fontFamily = FontFamily(Font(name="montserrat_semibold.otf"))))
18 | // font style is italic here
19 | Text("I am Italic", style = TextStyle(fontStyle = FontStyle.Italic))
20 | // Weight is Bold
21 | Text("I am BOLD", style = TextStyle(fontWeight = FontWeight.Bold))
22 | // Set the font size inside the TextStyle
23 | Text("I am Large Text", style = TextStyle(fontSize = 25.sp))
24 | // This is normal simpler way to write the text
25 | Text("But We are all Custom Made Fonts")
26 | // More
27 | Text("I am Cursive Text", style = TextStyle(fontFamily = FontFamily.Cursive))
28 | Text("I am Monospace Text", style = TextStyle(fontFamily = FontFamily.Monospace))
29 | Text("I am Serif Text", style = TextStyle(fontFamily = FontFamily.Serif))
30 | Text("Big text", fontSize = 30.sp)
31 | Text("Red text", color = Color.Red)
32 | val darkTheme = isSystemInDarkTheme()
33 | if (darkTheme) {
34 | Text("I'm dark text color", color = Color.Green)
35 | } else {
36 | Text("I'm light text color", color = Color.Cyan)
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/Images.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.Image
4 | import androidx.compose.foundation.background
5 | import androidx.compose.foundation.layout.*
6 | import androidx.compose.runtime.*
7 | import androidx.compose.ui.Modifier
8 | import androidx.compose.ui.graphics.Color
9 | import androidx.compose.ui.graphics.ImageBitmap
10 | import androidx.compose.ui.unit.dp
11 | import com.rouge41.kmm.compose.imageResource
12 | import com.rouge41.kmm.compose.toImageBitmap
13 | import io.ktor.client.*
14 | import io.ktor.client.call.*
15 | import io.ktor.client.request.*
16 | import io.ktor.utils.io.core.*
17 |
18 | @Composable
19 | internal fun Images() {
20 | Column {
21 | Image(
22 | imageResource("logo"),
23 | null,
24 | modifier = Modifier.width(200.dp).height(300.dp).background(
25 | Color.LightGray
26 | )
27 | )
28 |
29 | AsyncImage(
30 | url = "https://loremflickr.com/320/320/ocean",
31 | modifier = Modifier.size(200.dp).background(Color.Black)
32 | )
33 | }
34 | }
35 |
36 | @Composable
37 | internal fun AsyncImage(
38 | url: String,
39 | contentDescription: String? = "",
40 | modifier: Modifier = Modifier
41 | ) {
42 | var image by remember { mutableStateOf(null) }
43 | image?.let {
44 | androidx.compose.foundation.Image(
45 | modifier = modifier,
46 | bitmap = it,
47 | contentDescription = contentDescription
48 | )
49 | } ?: run {
50 | Spacer(modifier = modifier)
51 | }
52 | LaunchedEffect(key1 = url, block = {
53 | val bytes: ByteArray = HttpClient().use { client ->
54 | client.get(url).body()
55 | }
56 | image = bytes.toImageBitmap()
57 | })
58 | }
59 |
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
--------------------------------------------------------------------------------
/test/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
2 |
3 | plugins {
4 | kotlin("multiplatform")
5 | kotlin("native.cocoapods")
6 | id("com.android.library")
7 | id("kotlinx-serialization")
8 | id("org.jetbrains.compose") version Version.compose
9 | }
10 |
11 | version = "0.0.1"
12 |
13 | android {
14 | compileSdk = AndroidSdk.compile
15 | defaultConfig {
16 | minSdk = AndroidSdk.min
17 | targetSdk = AndroidSdk.target
18 | }
19 | sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
20 | }
21 |
22 | kotlin {
23 | android()
24 | ios()
25 | cocoapods {
26 | summary = "Multiplatform Compose Shared Test Module"
27 | homepage = "https://github.com/cl3m/multiplatform-compose"
28 | ios.deploymentTarget = iOSSdk.deploymentTarget
29 | podfile = project.file("../iosApp/Podfile")
30 | framework {
31 | baseName = "test"
32 | isStatic = true
33 | }
34 | }
35 | sourceSets {
36 | val commonMain by getting {
37 | dependencies {
38 | implementation(Ktor.client_core)
39 | implementation(Ktor.client_content_negotiation)
40 | implementation(Ktor.client_logging)
41 | implementation(Ktor.serialization_json)
42 | implementation(compose.ui)
43 | implementation(compose.foundation)
44 | implementation(compose.material)
45 | implementation(compose.runtime)
46 | api(precompose)
47 | }
48 | }
49 | val androidMain by getting {
50 | dependencies {
51 | implementation(Ktor.client_logging_jvm)
52 | implementation(Ktor.client_json_jvm)
53 | implementation(Ktor.client_android)
54 | }
55 | }
56 | val iosMain by getting {
57 | dependencies {
58 | implementation(Ktor.client_ios)
59 | }
60 | }
61 | }
62 | }
63 |
64 | kotlin {
65 | targets.withType {
66 | binaries.all {
67 | freeCompilerArgs += "-Xdisable-phases=VerifyBitcode"
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/iosApp/iosApp/AvoidDispose.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AvoidDispose.swift
3 | // iosApp
4 | //
5 | // Created by Clem on 27.10.22.
6 | // Copyright © 2022 orgName. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import test
11 |
12 | // ComposeWindow is disposed on viewDidDisappear so but it inside a container view:
13 | // https://github.com/JetBrains/androidx/blob/jb-main/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/window/ComposeWindow.uikit.kt
14 |
15 | class AvoidDispose: UIViewController {
16 | let controller: UIViewController
17 |
18 | init(_ controller: UIViewController) {
19 | self.controller = controller
20 | super.init(nibName: nil, bundle: nil)
21 | }
22 |
23 | required init?(coder: NSCoder) {
24 | fatalError("init(coder:) has not been implemented")
25 | }
26 |
27 | override func viewWillAppear(_ animated: Bool) {
28 | super.viewWillAppear(animated)
29 | addChild(controller)
30 | view.addSubview(controller.view)
31 | }
32 |
33 | override func viewDidAppear(_ animated: Bool) {
34 | super.viewDidAppear(animated)
35 | }
36 |
37 | override func viewDidDisappear(_ animated: Bool) {
38 | super.viewDidDisappear(animated)
39 | controller.removeFromParent()
40 | controller.view.removeFromSuperview()
41 | }
42 |
43 | override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
44 | super.viewWillTransition(to: size, with: coordinator)
45 | skiaRefresh()
46 | }
47 |
48 | override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
49 | super.traitCollectionDidChange(previousTraitCollection)
50 | skiaRefresh()
51 | }
52 |
53 | override func viewSafeAreaInsetsDidChange() {
54 | super.viewSafeAreaInsetsDidChange()
55 | skiaRefresh()
56 | }
57 |
58 | override var preferredStatusBarStyle: UIStatusBarStyle {
59 | return .lightContent
60 | }
61 |
62 | private func skiaRefresh() {
63 | controller.view.frame = view.bounds
64 | controller.viewWillAppear(false)
65 | RootViewControllersKt.setDarkMode()
66 | RootViewControllersKt.setSafeArea(start: view.safeAreaInsets.left, top: view.safeAreaInsets.top, end: view.safeAreaInsets.right, bottom: view.safeAreaInsets.bottom)
67 | //kotlin compose refresh
68 | controller.view.touchesCancelled([UITouch()], with: UIEvent())
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://kotlinlang.org/docs/reference/multiplatform.html)
2 |
3 | # Multiplatform Compose
4 |
5 | A demo to show usage of Jetbrains Compose in Android and iOS. Originally a Jetpack Compose implementation with native view and yoga for iOS.
6 |
7 | ## Table of contents
8 |
9 | - [Libraries](#libraries)
10 | - [Demos](#demos)
11 | - [Troubleshooting](#troubleshooting)
12 | - [Alternatives](#alternatives)
13 | - [License](#license)
14 |
15 | ## Libraries
16 |
17 | - kotlinx coroutines
18 | - ktor
19 | - Jetbrains Compose (uikit experimental)
20 | - [PreCompose](https://github.com/Tlaster/PreCompose) (for navigation)
21 |
22 | ## Demos
23 |
24 | Run the app to see a demo of compose on ios.
25 |
26 | 
27 |
28 | #### AsyncImage
29 |
30 | The image composable allow url loading
31 |
32 | ```kotlin
33 | AsyncImage(url = "https://loremflickr.com/320/240/ocean", modifier = Modifier.size(200.dp))
34 | ```
35 |
36 | #### SafeArea
37 |
38 | SafeArea.current to get PaddingValues.
39 |
40 | #### DarkMode
41 |
42 | DarkMode.current to fix dark mode on iOS.
43 |
44 |
45 | ## Troubleshooting
46 |
47 | ### e: java.lang.IllegalStateException: No file for ***
48 |
49 | Compose function and CompositonLocal have to be internal and not exposed to iOS module.
50 |
51 | ## Alternatives
52 |
53 | - [Compose Multiplatform by JetBrains](https://github.com/JetBrains/compose-jb) started native support via Skia ([Skiko](https://github.com/JetBrains/skiko)), you can have a look at the [sample](https://github.com/JetBrains/compose-jb/tree/master/experimental/examples/falling-balls-mpp). Touchlab made a demo for [Droidcon NYC App](https://touchlab.co/droidcon-nyc-ios-app-with-compose/) It will use the compose compiler but not native component.
54 |
55 | - [Redwood Compose](https://github.com/cashapp/redwood) by Cash App. [Native UI with multiplatform Compose](https://jakewharton.com/native-ui-with-multiplatform-compose/). Use the compose compiler and native iOS component.
56 |
57 | - [Platform-Kit by IceRock](https://github.com/Alex009/compose-jb/tree/platform-kit-sample/examples/common-platform-uikit) based on Compose Multiplatform by JetBrains, add support via UIKit, thus use the compose compiler and native iOS component.
58 |
59 | - [multiplatform-compose](https://github.com/cl3m/multiplatform-compose/tree/yoga) This original repo, an experiment with native view and yoga for layout. You can also have a look at [kmp-redux](https://github.com/cl3m/kmp-redux/tree/skiko) that show Compose integration with SwiftUI.
60 |
61 |
62 | ## License
63 |
64 | Copyright 2021 Clément Beffa
65 |
66 | Licensed under the Apache License, Version 2.0 (the "License");
67 | you may not use this file except in compliance with the License.
68 | You may obtain a copy of the License at
69 |
70 | http://www.apache.org/licenses/LICENSE-2.0
71 |
72 | Unless required by applicable law or agreed to in writing, software
73 | distributed under the License is distributed on an "AS IS" BASIS,
74 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75 | See the License for the specific language governing permissions and
76 | limitations under the License.
77 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/BottomNavigationDemo.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.background
4 | import androidx.compose.foundation.layout.*
5 | import androidx.compose.material.*
6 | import androidx.compose.material.icons.Icons
7 | import androidx.compose.material.icons.filled.Home
8 | import androidx.compose.runtime.Composable
9 | import androidx.compose.runtime.collectAsState
10 | import androidx.compose.runtime.getValue
11 | import androidx.compose.ui.Modifier
12 | import androidx.compose.ui.unit.LayoutDirection
13 | import androidx.compose.ui.unit.dp
14 | import com.rouge41.kmm.compose.test.SafeArea
15 | import moe.tlaster.precompose.navigation.NavHost
16 | import moe.tlaster.precompose.navigation.rememberNavigator
17 |
18 | @Composable
19 | internal fun BottomNavigationDemo() {
20 | val navigator = rememberNavigator()
21 | val navBackStackEntry by navigator.currentEntry.collectAsState(null)
22 | val currentRoute = navBackStackEntry?.route?.route ?: ""
23 | Scaffold(
24 | bottomBar = {
25 | Box(modifier = Modifier.background(MaterialTheme.colors.primary)) {
26 | BottomNavigation(
27 | modifier = Modifier.height(55.dp + SafeArea.current.value.calculateBottomPadding())
28 | ) {
29 | Tab.values().forEach { screen ->
30 | BottomNavigationItem(
31 | modifier = Modifier.padding(bottom = SafeArea.current.value.calculateBottomPadding()),
32 | icon = {
33 | Icon(
34 | imageVector = Icons.Default.Home,
35 | contentDescription = null
36 | )
37 | },
38 | label = { Text(screen.toString()) },
39 | selected = currentRoute == screen.toString(),
40 | onClick = {
41 | navigator.navigate(route = screen.toString())
42 | },
43 | selectedContentColor = MaterialTheme.colors.onPrimary,
44 | unselectedContentColor = MaterialTheme.colors.onPrimary.copy(alpha = 0.5f)
45 | )
46 | }
47 | }
48 | }
49 | }
50 | ) {
51 | NavHost(
52 | navigator = navigator,
53 | initialRoute = Tab.values().first().toString(),
54 | modifier = Modifier.padding(
55 | start = SafeArea.current.value.calculateStartPadding(
56 | LayoutDirection.Ltr
57 | ),
58 | end = SafeArea.current.value.calculateEndPadding(LayoutDirection.Ltr),
59 | bottom = 55.dp + SafeArea.current.value.calculateBottomPadding()
60 | )
61 | ) {
62 | Tab.values().forEach { screen ->
63 | scene(screen.toString()) {
64 | when (screen) {
65 | Tab.Tab1 -> HelloPlatform()
66 | Tab.Tab2 -> Layout()
67 | Tab.Tab3 -> Counter()
68 | }
69 | }
70 | }
71 | }
72 | }
73 | }
74 |
75 | enum class Tab {
76 | Tab1,
77 | Tab2,
78 | Tab3
79 | }
80 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/Lorem.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.layout.Column
4 | import androidx.compose.foundation.rememberScrollState
5 | import androidx.compose.foundation.verticalScroll
6 | import androidx.compose.material.Text
7 | import androidx.compose.runtime.Composable
8 | import androidx.compose.ui.Modifier
9 |
10 | @Composable
11 | internal fun Lorem() {
12 | Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
13 | Text(
14 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dui erat, consequat eget felis malesuada, gravida pellentesque massa. Suspendisse id aliquet ex. Praesent diam dui, consectetur et orci eu, interdum cursus tortor. Aenean quis laoreet lectus, quis consectetur orci. Quisque ac diam varius, malesuada lacus varius, semper nulla. Ut vitae faucibus justo. Fusce nibh tortor, pulvinar viverra urna et, porttitor viverra ipsum. Proin et lacus ac leo lacinia tempus. Suspendisse dictum tortor nec efficitur faucibus.\n" +
15 | "\n" +
16 | "Integer a vulputate libero, pharetra efficitur nisl. Vivamus viverra lobortis mi eget gravida. Aenean scelerisque, felis ac interdum tempus, leo arcu faucibus purus, id hendrerit dui mi vel arcu. Nam eleifend justo a ligula placerat iaculis. Integer nibh lacus, consectetur in maximus in, finibus id est. Duis massa sapien, cursus a augue vitae, pharetra ullamcorper orci. In sollicitudin dolor id ante maximus mollis. Morbi ut nisi non magna lobortis facilisis a eget odio. Sed consectetur maximus urna, sit amet mollis nisi sodales nec.\n" +
17 | "\n" +
18 | "Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam mollis aliquet ultrices. Morbi sit amet lorem tempor, molestie arcu ut, tincidunt tortor. Sed porta sodales felis sit amet rutrum. Quisque at dui non libero faucibus imperdiet ut vitae eros. Integer ac lorem eu felis commodo eleifend. Pellentesque vulputate diam sodales, ornare nisl a, venenatis sapien. Mauris varius dolor vel maximus vestibulum.\n" +
19 | "\n" +
20 | "Mauris fermentum ligula a urna hendrerit varius. Quisque turpis magna, gravida et gravida eu, sollicitudin et quam. Aenean id dui id leo mollis dictum. Nam ligula justo, fermentum nec rutrum et, mattis eu tortor. Suspendisse ac tincidunt turpis, a sagittis purus. Nulla suscipit aliquam mauris nec luctus. Maecenas in sodales metus, at viverra urna. Donec quis consectetur neque. Sed ut nulla at tortor tempor consectetur.\n" +
21 | "\n" +
22 | "Curabitur volutpat tortor vitae tellus dignissim, eget commodo erat pellentesque. Quisque auctor, urna imperdiet gravida tempus, lorem lorem placerat tellus, volutpat ullamcorper odio est ac nulla. Etiam sodales ac tellus non cursus. Vestibulum eget metus eget justo hendrerit ultrices in vel orci. Integer vel libero sit amet arcu tincidunt facilisis. Mauris dictum venenatis ligula a consequat. Aliquam erat volutpat.\n" +
23 | "\n" +
24 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dui erat, consequat eget felis malesuada, gravida pellentesque massa. Suspendisse id aliquet ex. Praesent diam dui, consectetur et orci eu, interdum cursus tortor. Aenean quis laoreet lectus, quis consectetur orci. Quisque ac diam varius, malesuada lacus varius, semper nulla. Ut vitae faucibus justo. Fusce nibh tortor, pulvinar viverra urna et, porttitor viverra ipsum. Proin et lacus ac leo lacinia tempus. Suspendisse dictum tortor nec efficitur faucibus.\n" +
25 | "\n" +
26 | "Integer a vulputate libero, pharetra efficitur nisl. Vivamus viverra lobortis mi eget gravida. Aenean scelerisque, felis ac interdum tempus, leo arcu faucibus purus, id hendrerit dui mi vel arcu. Nam eleifend justo a ligula placerat iaculis. Integer nibh lacus, consectetur in maximus in, finibus id est. Duis massa sapien, cursus a augue vitae, pharetra ullamcorper orci. In sollicitudin dolor id ante maximus mollis. Morbi ut nisi non magna lobortis facilisis a eget odio. Sed consectetur maximus urna, sit amet mollis nisi sodales nec."
27 | )
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/App.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test
2 |
3 | import androidx.compose.foundation.background
4 | import androidx.compose.foundation.clickable
5 | import androidx.compose.foundation.layout.*
6 | import androidx.compose.foundation.lazy.LazyColumn
7 | import androidx.compose.material.*
8 | import androidx.compose.material.icons.Icons
9 | import androidx.compose.material.icons.filled.Menu
10 | import androidx.compose.runtime.*
11 | import androidx.compose.ui.Modifier
12 | import androidx.compose.ui.unit.LayoutDirection
13 | import com.rouge41.kmm.compose.test.demos.*
14 | import com.rouge41.kmm.compose.test.demos.Counter
15 | import com.rouge41.kmm.compose.test.demos.HelloPlatform
16 | import com.rouge41.kmm.compose.test.demos.Layout
17 | import kotlinx.coroutines.launch
18 | import moe.tlaster.precompose.navigation.NavHost
19 | import moe.tlaster.precompose.navigation.rememberNavigator
20 |
21 | @OptIn(ExperimentalMaterialApi::class)
22 | @Composable
23 | internal fun App() {
24 | val scope = rememberCoroutineScope()
25 | val navigator = rememberNavigator()
26 | val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
27 | val navBackStackEntry by navigator.currentEntry.collectAsState(null)
28 | val currentRoute = navBackStackEntry?.route?.route
29 | Scaffold(
30 | topBar = {
31 | Box(modifier = Modifier.background(MaterialTheme.colors.primary)) {
32 | TopAppBar(
33 | modifier = Modifier.padding(
34 | start = SafeArea.current.value.calculateStartPadding(LayoutDirection.Ltr),
35 | top = SafeArea.current.value.calculateTopPadding(),
36 | end = SafeArea.current.value.calculateEndPadding(LayoutDirection.Ltr)
37 | ),
38 | title = { Text(currentRoute ?: "") },
39 | navigationIcon = {
40 | Icon(
41 | Icons.Default.Menu,
42 | "test",
43 | modifier = Modifier.clickable(
44 | onClick = {
45 | scope.launch { scaffoldState.drawerState.open() }
46 | }
47 | )
48 | )
49 | }
50 | )
51 | }
52 | },
53 | drawerBackgroundColor = MaterialTheme.colors.background,
54 | drawerContent = {
55 | LazyColumn(
56 | modifier = Modifier.padding(
57 | start = SafeArea.current.value.calculateStartPadding(LayoutDirection.Ltr),
58 | top = SafeArea.current.value.calculateTopPadding()
59 | )
60 | ) {
61 | items(Demo.values().size) {
62 | val item = Demo.values()[it]
63 | ListItem(
64 | text = { Text(item.toString()) },
65 | modifier = Modifier.clickable {
66 | navigator.navigate(route = item.toString())
67 | scope.launch { scaffoldState.drawerState.close() }
68 | }
69 | )
70 | Divider()
71 | }
72 | }
73 | },
74 | scaffoldState = scaffoldState
75 | ) {
76 | NavHost(navigator = navigator, initialRoute = Demo.HelloPlatform.toString()) {
77 | Demo.values().forEach { screen ->
78 | scene(screen.toString()) {
79 | if (screen == Demo.BottomNavigation) {
80 | BottomNavigationDemo()
81 | } else {
82 | Box(
83 | modifier = Modifier.padding(
84 | start = SafeArea.current.value.calculateStartPadding(LayoutDirection.Ltr),
85 | end = SafeArea.current.value.calculateEndPadding(LayoutDirection.Ltr),
86 | bottom = SafeArea.current.value.calculateBottomPadding()
87 | )
88 | ) {
89 | when (screen) {
90 | Demo.LazyColumn -> LazyColumnDemo()
91 | Demo.HelloPlatform -> HelloPlatform()
92 | Demo.Lorem -> Lorem()
93 | Demo.Counter -> Counter()
94 | Demo.Layout -> Layout()
95 | Demo.Images -> Images()
96 | Demo.Buttons -> Buttons()
97 | // Demo.Alert -> Alert()
98 | Demo.TextStyles -> Column { TextStyles() }
99 | Demo.TextFields -> TextFields()
100 | else -> {}
101 | }
102 | }
103 | }
104 | }
105 | }
106 | }
107 | }
108 | }
109 |
110 | enum class Demo {
111 | HelloPlatform,
112 | Lorem,
113 | LazyColumn,
114 | Counter,
115 | Layout,
116 | TextStyles,
117 | Images,
118 | Buttons,
119 | TextFields,
120 | BottomNavigation,
121 | }
122 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/test/src/commonMain/kotlin/com/rouge41/kmm/compose/test/demos/Buttons.kt:
--------------------------------------------------------------------------------
1 | package com.rouge41.kmm.compose.test.demos
2 |
3 | import androidx.compose.foundation.BorderStroke
4 | import androidx.compose.foundation.background
5 | import androidx.compose.foundation.layout.*
6 | import androidx.compose.foundation.shape.RoundedCornerShape
7 | import androidx.compose.material.*
8 | import androidx.compose.runtime.Composable
9 | import androidx.compose.ui.*
10 | import androidx.compose.ui.graphics.Color
11 | import androidx.compose.ui.graphics.SolidColor
12 | import androidx.compose.ui.unit.dp
13 | import androidx.compose.ui.unit.sp
14 | import com.rouge41.kmm.compose.*
15 |
16 | // From https://github.com/vinaygaba/Learn-Jetpack-Compose-By-Example/blob/master/app/src/main/java/com/example/jetpackcompose/material/ButtonActivity.kt
17 |
18 | @Composable
19 | internal fun Buttons() {
20 | // Column is a composable that places its children in a vertical sequence. You
21 | // can think of it similar to a LinearLayout with the vertical orientation.
22 |
23 | // You can think of Modifiers as implementations of the decorators pattern that are used to
24 | // modify the composable that its applied to. In the example below, we configure the
25 | // column to occupy the entire available height & width using the Modifier.fillMaxSize()
26 | Column(modifier = Modifier.fillMaxSize()) {
27 | SimpleButtonComponent()
28 | SimpleButtonWithBorderComponent()
29 | RoundedCornerButtonComponent()
30 | OutlinedButtonComponent()
31 | TextButtonComponent()
32 | Button(
33 | modifier = Modifier.padding(16.dp).background(Color.Green),
34 | elevation = null,
35 | colors = ButtonDefaults.textButtonColors(),
36 | onClick = {}
37 | ) {
38 | Text(
39 | text = "Big Button",
40 | modifier = Modifier.padding(16.dp),
41 | fontSize = 30.sp,
42 | color = Color.Red
43 | )
44 | }
45 | }
46 | }
47 |
48 | // We represent a Composable function by annotating it with the @Composable annotation. Composable
49 | // functions can only be called from within the scope of other composable functions. We should
50 | // think of composable functions to be similar to lego blocks - each composable function is in turn
51 | // built up of smaller composable functions.
52 | @Composable
53 | internal fun SimpleButtonComponent() {
54 | // Button is a pre-defined Material Design implementation of a contained button -
55 | // https://material.io/design/components/buttons.html#contained-button.
56 |
57 | // You can think of Modifiers as implementations of the decorators pattern that are used to
58 | // modify the composable that its applied to. In this example, we assign a padding of
59 | // 16dp to the Button.
60 | Button(
61 | modifier = Modifier.padding(16.dp),
62 | // elevation = ButtonDefaults.elevation(5.dp),
63 | onClick = {}
64 | ) {
65 | // The Button composable allows you to provide child composables that inherit this button
66 | // functionality.
67 | // The Text composable is pre-defined by the Compose UI library; you can use this
68 | // composable to render text on the screen
69 | Text(text = "Simple button", modifier = Modifier.padding(16.dp))
70 | }
71 | }
72 |
73 | // We represent a Composable function by annotating it with the @Composable annotation. Composable
74 | // functions can only be called from within the scope of other composable functions. We should
75 | // think of composable functions to be similar to lego blocks - each composable function is in turn
76 | // built up of smaller composable functions.
77 | @Composable
78 | internal fun SimpleButtonWithBorderComponent() {
79 | // Button is a pre-defined Material Design implementation of a contained button -
80 | // https://material.io/design/components/buttons.html#contained-button.
81 |
82 | // You can think of Modifiers as implementations of the decorators pattern that are used to
83 | // modify the composable that its applied to. In this example, we assign a padding of
84 | // 16dp to the Button.
85 | Button(
86 | onClick = {},
87 | modifier = Modifier.padding(16.dp),
88 | elevation = ButtonDefaults.elevation(5.dp),
89 | // Provide a border for this button
90 | border = BorderStroke(width = 5.dp, brush = SolidColor(Color.Black))
91 | ) {
92 | // The Button composable allows you to provide child composables that inherit this button
93 | // functionality.
94 | // The Text composable is pre-defined by the Compose UI library; you can use this
95 | // composable to render text on the screen
96 | Text(text = "Simple button with border", modifier = Modifier.padding(16.dp))
97 | }
98 | }
99 |
100 | // We represent a Composable function by annotating it with the @Composable annotation. Composable
101 | // functions can only be called from within the scope of other composable functions. We should
102 | // think of composable functions to be similar to lego blocks - each composable function is in turn
103 | // built up of smaller composable functions.
104 | @Composable
105 | internal fun RoundedCornerButtonComponent() {
106 | // Button is a pre-defined Material Design implementation of a contained button -
107 | // https://material.io/design/components/buttons.html#contained-button.
108 |
109 | // You can think of Modifiers as implementations of the decorators pattern that are used to
110 | // modify the composable that its applied to. In this example, we assign a padding of
111 | // 16dp to the Button.
112 | Button(
113 | onClick = {},
114 | modifier = Modifier.padding(16.dp),
115 | // Provide a custom shape for this button. In this example. we specify the button to have
116 | // round corners of 16dp radius.
117 | shape = RoundedCornerShape(16.dp),
118 | elevation = ButtonDefaults.elevation(5.dp)
119 | ) {
120 | // The Button composable allows you to provide child composables that inherit this button
121 | // functionality.
122 | // The Text composable is pre-defined by the Compose UI library; you can use this
123 | // composable to render text on the screen
124 | Text(text = "Button with rounded corners", modifier = Modifier.padding(16.dp))
125 | }
126 | }
127 |
128 | // We represent a Composable function by annotating it with the @Composable annotation. Composable
129 | // functions can only be called from within the scope of other composable functions. We should
130 | // think of composable functions to be similar to lego blocks - each composable function is in turn
131 | // built up of smaller composable functions.
132 | @Composable
133 | internal fun OutlinedButtonComponent() {
134 | // Button is a pre-defined Material Design implementation of a outlined button -
135 | // https://material.io/design/components/buttons.html#outlined-button.
136 |
137 | // You can think of Modifiers as implementations of the decorators pattern that are used to
138 | // modify the composable that its applied to. In this example, we assign a padding of
139 | // 16dp to the Button.
140 | OutlinedButton(
141 | onClick = {},
142 | modifier = Modifier.padding(16.dp)
143 | ) {
144 | // The Button composable allows you to provide child composables that inherit this button
145 | // functionality.
146 | // The Text composable is pre-defined by the Compose UI library; you can use this
147 | // composable to render text on the screen
148 | Text(text = "Outlined Button", modifier = Modifier.padding(16.dp))
149 | }
150 | }
151 |
152 | // We represent a Composable function by annotating it with the @Composable annotation. Composable
153 | // functions can only be called from within the scope of other composable functions. We should
154 | // think of composable functions to be similar to lego blocks - each composable function is in turn
155 | // built up of smaller composable functions.
156 | @Composable
157 | internal fun TextButtonComponent() {
158 | // Button is a pre-defined Material Design implementation of a text button -
159 | // https://material.io/design/components/buttons.html#text-button.
160 |
161 | // You can think of Modifiers as implementations of the decorators pattern that are used to
162 | // modify the composable that its applied to. In this example, we assign a padding of
163 | // 16dp to the Button.
164 | TextButton(
165 | onClick = {},
166 | modifier = Modifier.padding(16.dp)
167 | ) {
168 | // The Button composable allows you to provide child composables that inherit this button
169 | // functionality.
170 | // The Text composable is pre-defined by the Compose UI library; you can use this
171 | // composable to render text on the screen
172 | Text(text = "Text Button", modifier = Modifier.padding(16.dp))
173 | }
174 | }
175 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 | set -u
4 | set -o pipefail
5 |
6 | function on_error {
7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
8 | }
9 | trap 'on_error $LINENO' ERR
10 |
11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
13 | # frameworks to, so exit 0 (signalling the script phase was successful).
14 | exit 0
15 | fi
16 |
17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
19 |
20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
22 | BCSYMBOLMAP_DIR="BCSymbolMaps"
23 |
24 |
25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
28 |
29 | # Copies and strips a vendored framework
30 | install_framework()
31 | {
32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
33 | local source="${BUILT_PRODUCTS_DIR}/$1"
34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
36 | elif [ -r "$1" ]; then
37 | local source="$1"
38 | fi
39 |
40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
41 |
42 | if [ -L "${source}" ]; then
43 | echo "Symlinked..."
44 | source="$(readlink "${source}")"
45 | fi
46 |
47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then
48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied
49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do
50 | echo "Installing $f"
51 | install_bcsymbolmap "$f" "$destination"
52 | rm "$f"
53 | done
54 | rmdir "${source}/${BCSYMBOLMAP_DIR}"
55 | fi
56 |
57 | # Use filter instead of exclude so missing patterns don't throw errors.
58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
60 |
61 | local basename
62 | basename="$(basename -s .framework "$1")"
63 | binary="${destination}/${basename}.framework/${basename}"
64 |
65 | if ! [ -r "$binary" ]; then
66 | binary="${destination}/${basename}"
67 | elif [ -L "${binary}" ]; then
68 | echo "Destination binary is symlinked..."
69 | dirname="$(dirname "${binary}")"
70 | binary="${dirname}/$(readlink "${binary}")"
71 | fi
72 |
73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
75 | strip_invalid_archs "$binary"
76 | fi
77 |
78 | # Resign the code if required by the build settings to avoid unstable apps
79 | code_sign_if_enabled "${destination}/$(basename "$1")"
80 |
81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
83 | local swift_runtime_libs
84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u)
85 | for lib in $swift_runtime_libs; do
86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
88 | code_sign_if_enabled "${destination}/${lib}"
89 | done
90 | fi
91 | }
92 | # Copies and strips a vendored dSYM
93 | install_dsym() {
94 | local source="$1"
95 | warn_missing_arch=${2:-true}
96 | if [ -r "$source" ]; then
97 | # Copy the dSYM into the targets temp dir.
98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
100 |
101 | local basename
102 | basename="$(basename -s .dSYM "$source")"
103 | binary_name="$(ls "$source/Contents/Resources/DWARF")"
104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}"
105 |
106 | # Strip invalid architectures from the dSYM.
107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then
108 | strip_invalid_archs "$binary" "$warn_missing_arch"
109 | fi
110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then
111 | # Move the stripped file into its final destination.
112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
114 | else
115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
116 | mkdir -p "${DWARF_DSYM_FOLDER_PATH}"
117 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM"
118 | fi
119 | fi
120 | }
121 |
122 | # Used as a return value for each invocation of `strip_invalid_archs` function.
123 | STRIP_BINARY_RETVAL=0
124 |
125 | # Strip invalid architectures
126 | strip_invalid_archs() {
127 | binary="$1"
128 | warn_missing_arch=${2:-true}
129 | # Get architectures for current target binary
130 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
131 | # Intersect them with the architectures we are building for
132 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
133 | # If there are no archs supported by this binary then warn the user
134 | if [[ -z "$intersected_archs" ]]; then
135 | if [[ "$warn_missing_arch" == "true" ]]; then
136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
137 | fi
138 | STRIP_BINARY_RETVAL=1
139 | return
140 | fi
141 | stripped=""
142 | for arch in $binary_archs; do
143 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then
144 | # Strip non-valid architectures in-place
145 | lipo -remove "$arch" -output "$binary" "$binary"
146 | stripped="$stripped $arch"
147 | fi
148 | done
149 | if [[ "$stripped" ]]; then
150 | echo "Stripped $binary of architectures:$stripped"
151 | fi
152 | STRIP_BINARY_RETVAL=0
153 | }
154 |
155 | # Copies the bcsymbolmap files of a vendored framework
156 | install_bcsymbolmap() {
157 | local bcsymbolmap_path="$1"
158 | local destination="${BUILT_PRODUCTS_DIR}"
159 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}""
160 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"
161 | }
162 |
163 | # Signs a framework with the provided identity
164 | code_sign_if_enabled() {
165 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
166 | # Use the current code_sign_identity
167 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
168 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
169 |
170 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
171 | code_sign_cmd="$code_sign_cmd &"
172 | fi
173 | echo "$code_sign_cmd"
174 | eval "$code_sign_cmd"
175 | fi
176 | }
177 |
178 | if [[ "$CONFIGURATION" == "Debug" ]]; then
179 | install_framework "${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.framework"
180 | install_framework "${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.framework"
181 | fi
182 | if [[ "$CONFIGURATION" == "Release" ]]; then
183 | install_framework "${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.framework"
184 | install_framework "${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.framework"
185 | fi
186 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
187 | wait
188 | fi
189 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/iosApp/iosApp.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 51;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557BA273AAA24004C7B11 /* Assets.xcassets */; };
11 | 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */; };
12 | 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iOSApp.swift */; };
13 | 70DA363B3C4E7DF2CFA2D6CC /* Pods_iosApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC65A9E111E97974DFC13374 /* Pods_iosApp.framework */; };
14 | 75C51A27290B28AC00D5CEF6 /* AvoidDispose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75C51A26290B28AC00D5CEF6 /* AvoidDispose.swift */; };
15 | /* End PBXBuildFile section */
16 |
17 | /* Begin PBXFileReference section */
18 | 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
19 | 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
20 | 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; };
21 | 5D21C11D38A226BF7511F8FD /* Pods-iosApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.debug.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig"; sourceTree = ""; };
22 | 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
23 | 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
24 | 75C51A26290B28AC00D5CEF6 /* AvoidDispose.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvoidDispose.swift; sourceTree = ""; };
25 | CF0A5D02B3CDC59B06E5DB5F /* Pods-iosApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.release.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig"; sourceTree = ""; };
26 | EC65A9E111E97974DFC13374 /* Pods_iosApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
27 | /* End PBXFileReference section */
28 |
29 | /* Begin PBXFrameworksBuildPhase section */
30 | 634185C6AA8517AADC651003 /* Frameworks */ = {
31 | isa = PBXFrameworksBuildPhase;
32 | buildActionMask = 2147483647;
33 | files = (
34 | 70DA363B3C4E7DF2CFA2D6CC /* Pods_iosApp.framework in Frameworks */,
35 | );
36 | runOnlyForDeploymentPostprocessing = 0;
37 | };
38 | /* End PBXFrameworksBuildPhase section */
39 |
40 | /* Begin PBXGroup section */
41 | 058557D7273AAEEB004C7B11 /* Preview Content */ = {
42 | isa = PBXGroup;
43 | children = (
44 | 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */,
45 | );
46 | path = "Preview Content";
47 | sourceTree = "";
48 | };
49 | 2FDA9C18166FCDB47E94FB40 /* Pods */ = {
50 | isa = PBXGroup;
51 | children = (
52 | 5D21C11D38A226BF7511F8FD /* Pods-iosApp.debug.xcconfig */,
53 | CF0A5D02B3CDC59B06E5DB5F /* Pods-iosApp.release.xcconfig */,
54 | );
55 | path = Pods;
56 | sourceTree = "";
57 | };
58 | 7555FF72242A565900829871 = {
59 | isa = PBXGroup;
60 | children = (
61 | 7555FF7D242A565900829871 /* iosApp */,
62 | 7555FF7C242A565900829871 /* Products */,
63 | 2FDA9C18166FCDB47E94FB40 /* Pods */,
64 | 9893B5AEB5382755B31394C0 /* Frameworks */,
65 | );
66 | sourceTree = "";
67 | };
68 | 7555FF7C242A565900829871 /* Products */ = {
69 | isa = PBXGroup;
70 | children = (
71 | 7555FF7B242A565900829871 /* iosApp.app */,
72 | );
73 | name = Products;
74 | sourceTree = "";
75 | };
76 | 7555FF7D242A565900829871 /* iosApp */ = {
77 | isa = PBXGroup;
78 | children = (
79 | 75C51A26290B28AC00D5CEF6 /* AvoidDispose.swift */,
80 | 2152FB032600AC8F00CF470E /* iOSApp.swift */,
81 | 058557BA273AAA24004C7B11 /* Assets.xcassets */,
82 | 7555FF8C242A565B00829871 /* Info.plist */,
83 | 058557D7273AAEEB004C7B11 /* Preview Content */,
84 | );
85 | path = iosApp;
86 | sourceTree = "";
87 | };
88 | 9893B5AEB5382755B31394C0 /* Frameworks */ = {
89 | isa = PBXGroup;
90 | children = (
91 | EC65A9E111E97974DFC13374 /* Pods_iosApp.framework */,
92 | );
93 | name = Frameworks;
94 | sourceTree = "";
95 | };
96 | /* End PBXGroup section */
97 |
98 | /* Begin PBXNativeTarget section */
99 | 7555FF7A242A565900829871 /* iosApp */ = {
100 | isa = PBXNativeTarget;
101 | buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */;
102 | buildPhases = (
103 | ACE43678E29886BA5F9FBC76 /* [CP] Check Pods Manifest.lock */,
104 | 7555FF77242A565900829871 /* Sources */,
105 | 7555FF79242A565900829871 /* Resources */,
106 | 634185C6AA8517AADC651003 /* Frameworks */,
107 | );
108 | buildRules = (
109 | );
110 | dependencies = (
111 | );
112 | name = iosApp;
113 | productName = iosApp;
114 | productReference = 7555FF7B242A565900829871 /* iosApp.app */;
115 | productType = "com.apple.product-type.application";
116 | };
117 | /* End PBXNativeTarget section */
118 |
119 | /* Begin PBXProject section */
120 | 7555FF73242A565900829871 /* Project object */ = {
121 | isa = PBXProject;
122 | attributes = {
123 | LastSwiftUpdateCheck = 1130;
124 | LastUpgradeCheck = 1130;
125 | ORGANIZATIONNAME = orgName;
126 | TargetAttributes = {
127 | 7555FF7A242A565900829871 = {
128 | CreatedOnToolsVersion = 11.3.1;
129 | };
130 | };
131 | };
132 | buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */;
133 | compatibilityVersion = "Xcode 9.3";
134 | developmentRegion = en;
135 | hasScannedForEncodings = 0;
136 | knownRegions = (
137 | en,
138 | Base,
139 | );
140 | mainGroup = 7555FF72242A565900829871;
141 | productRefGroup = 7555FF7C242A565900829871 /* Products */;
142 | projectDirPath = "";
143 | projectRoot = "";
144 | targets = (
145 | 7555FF7A242A565900829871 /* iosApp */,
146 | );
147 | };
148 | /* End PBXProject section */
149 |
150 | /* Begin PBXResourcesBuildPhase section */
151 | 7555FF79242A565900829871 /* Resources */ = {
152 | isa = PBXResourcesBuildPhase;
153 | buildActionMask = 2147483647;
154 | files = (
155 | 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */,
156 | 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */,
157 | );
158 | runOnlyForDeploymentPostprocessing = 0;
159 | };
160 | /* End PBXResourcesBuildPhase section */
161 |
162 | /* Begin PBXShellScriptBuildPhase section */
163 | ACE43678E29886BA5F9FBC76 /* [CP] Check Pods Manifest.lock */ = {
164 | isa = PBXShellScriptBuildPhase;
165 | buildActionMask = 2147483647;
166 | files = (
167 | );
168 | inputFileListPaths = (
169 | );
170 | inputPaths = (
171 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
172 | "${PODS_ROOT}/Manifest.lock",
173 | );
174 | name = "[CP] Check Pods Manifest.lock";
175 | outputFileListPaths = (
176 | );
177 | outputPaths = (
178 | "$(DERIVED_FILE_DIR)/Pods-iosApp-checkManifestLockResult.txt",
179 | );
180 | runOnlyForDeploymentPostprocessing = 0;
181 | shellPath = /bin/sh;
182 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
183 | showEnvVarsInLog = 0;
184 | };
185 | /* End PBXShellScriptBuildPhase section */
186 |
187 | /* Begin PBXSourcesBuildPhase section */
188 | 7555FF77242A565900829871 /* Sources */ = {
189 | isa = PBXSourcesBuildPhase;
190 | buildActionMask = 2147483647;
191 | files = (
192 | 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */,
193 | 75C51A27290B28AC00D5CEF6 /* AvoidDispose.swift in Sources */,
194 | );
195 | runOnlyForDeploymentPostprocessing = 0;
196 | };
197 | /* End PBXSourcesBuildPhase section */
198 |
199 | /* Begin XCBuildConfiguration section */
200 | 7555FFA3242A565B00829871 /* Debug */ = {
201 | isa = XCBuildConfiguration;
202 | buildSettings = {
203 | ALWAYS_SEARCH_USER_PATHS = NO;
204 | "ARCHS[sdk=iphonesimulator*]" = x86_64;
205 | CLANG_ANALYZER_NONNULL = YES;
206 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
207 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
208 | CLANG_CXX_LIBRARY = "libc++";
209 | CLANG_ENABLE_MODULES = YES;
210 | CLANG_ENABLE_OBJC_ARC = YES;
211 | CLANG_ENABLE_OBJC_WEAK = YES;
212 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
213 | CLANG_WARN_BOOL_CONVERSION = YES;
214 | CLANG_WARN_COMMA = YES;
215 | CLANG_WARN_CONSTANT_CONVERSION = YES;
216 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
217 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
218 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
219 | CLANG_WARN_EMPTY_BODY = YES;
220 | CLANG_WARN_ENUM_CONVERSION = YES;
221 | CLANG_WARN_INFINITE_RECURSION = YES;
222 | CLANG_WARN_INT_CONVERSION = YES;
223 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
224 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
225 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
226 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
227 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
228 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
229 | CLANG_WARN_STRICT_PROTOTYPES = YES;
230 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
231 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
232 | CLANG_WARN_UNREACHABLE_CODE = YES;
233 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
234 | COPY_PHASE_STRIP = NO;
235 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
236 | ENABLE_STRICT_OBJC_MSGSEND = YES;
237 | ENABLE_TESTABILITY = YES;
238 | GCC_C_LANGUAGE_STANDARD = gnu11;
239 | GCC_DYNAMIC_NO_PIC = NO;
240 | GCC_NO_COMMON_BLOCKS = YES;
241 | GCC_OPTIMIZATION_LEVEL = 0;
242 | GCC_PREPROCESSOR_DEFINITIONS = (
243 | "DEBUG=1",
244 | "$(inherited)",
245 | );
246 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
247 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
248 | GCC_WARN_UNDECLARED_SELECTOR = YES;
249 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
250 | GCC_WARN_UNUSED_FUNCTION = YES;
251 | GCC_WARN_UNUSED_VARIABLE = YES;
252 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
253 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
254 | MTL_FAST_MATH = YES;
255 | ONLY_ACTIVE_ARCH = YES;
256 | SDKROOT = iphoneos;
257 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
258 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
259 | };
260 | name = Debug;
261 | };
262 | 7555FFA4242A565B00829871 /* Release */ = {
263 | isa = XCBuildConfiguration;
264 | buildSettings = {
265 | ALWAYS_SEARCH_USER_PATHS = NO;
266 | CLANG_ANALYZER_NONNULL = YES;
267 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
268 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
269 | CLANG_CXX_LIBRARY = "libc++";
270 | CLANG_ENABLE_MODULES = YES;
271 | CLANG_ENABLE_OBJC_ARC = YES;
272 | CLANG_ENABLE_OBJC_WEAK = YES;
273 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
274 | CLANG_WARN_BOOL_CONVERSION = YES;
275 | CLANG_WARN_COMMA = YES;
276 | CLANG_WARN_CONSTANT_CONVERSION = YES;
277 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
278 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
279 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
280 | CLANG_WARN_EMPTY_BODY = YES;
281 | CLANG_WARN_ENUM_CONVERSION = YES;
282 | CLANG_WARN_INFINITE_RECURSION = YES;
283 | CLANG_WARN_INT_CONVERSION = YES;
284 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
285 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
286 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
287 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
288 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
289 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
290 | CLANG_WARN_STRICT_PROTOTYPES = YES;
291 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
292 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
293 | CLANG_WARN_UNREACHABLE_CODE = YES;
294 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
295 | COPY_PHASE_STRIP = NO;
296 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
297 | ENABLE_NS_ASSERTIONS = NO;
298 | ENABLE_STRICT_OBJC_MSGSEND = YES;
299 | GCC_C_LANGUAGE_STANDARD = gnu11;
300 | GCC_NO_COMMON_BLOCKS = YES;
301 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
302 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
303 | GCC_WARN_UNDECLARED_SELECTOR = YES;
304 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
305 | GCC_WARN_UNUSED_FUNCTION = YES;
306 | GCC_WARN_UNUSED_VARIABLE = YES;
307 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
308 | MTL_ENABLE_DEBUG_INFO = NO;
309 | MTL_FAST_MATH = YES;
310 | SDKROOT = iphoneos;
311 | SWIFT_COMPILATION_MODE = wholemodule;
312 | SWIFT_OPTIMIZATION_LEVEL = "-O";
313 | VALIDATE_PRODUCT = YES;
314 | };
315 | name = Release;
316 | };
317 | 7555FFA6242A565B00829871 /* Debug */ = {
318 | isa = XCBuildConfiguration;
319 | baseConfigurationReference = 5D21C11D38A226BF7511F8FD /* Pods-iosApp.debug.xcconfig */;
320 | buildSettings = {
321 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
322 | CODE_SIGN_STYLE = Automatic;
323 | DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
324 | ENABLE_PREVIEWS = YES;
325 | INFOPLIST_FILE = iosApp/Info.plist;
326 | LD_RUNPATH_SEARCH_PATHS = (
327 | "$(inherited)",
328 | "@executable_path/Frameworks",
329 | );
330 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp.compose;
331 | PRODUCT_NAME = "$(TARGET_NAME)";
332 | SWIFT_VERSION = 5.0;
333 | TARGETED_DEVICE_FAMILY = "1,2";
334 | };
335 | name = Debug;
336 | };
337 | 7555FFA7242A565B00829871 /* Release */ = {
338 | isa = XCBuildConfiguration;
339 | baseConfigurationReference = CF0A5D02B3CDC59B06E5DB5F /* Pods-iosApp.release.xcconfig */;
340 | buildSettings = {
341 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
342 | CODE_SIGN_STYLE = Automatic;
343 | DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
344 | ENABLE_PREVIEWS = YES;
345 | INFOPLIST_FILE = iosApp/Info.plist;
346 | LD_RUNPATH_SEARCH_PATHS = (
347 | "$(inherited)",
348 | "@executable_path/Frameworks",
349 | );
350 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp.compose;
351 | PRODUCT_NAME = "$(TARGET_NAME)";
352 | SWIFT_VERSION = 5.0;
353 | TARGETED_DEVICE_FAMILY = "1,2";
354 | };
355 | name = Release;
356 | };
357 | /* End XCBuildConfiguration section */
358 |
359 | /* Begin XCConfigurationList section */
360 | 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = {
361 | isa = XCConfigurationList;
362 | buildConfigurations = (
363 | 7555FFA3242A565B00829871 /* Debug */,
364 | 7555FFA4242A565B00829871 /* Release */,
365 | );
366 | defaultConfigurationIsVisible = 0;
367 | defaultConfigurationName = Release;
368 | };
369 | 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = {
370 | isa = XCConfigurationList;
371 | buildConfigurations = (
372 | 7555FFA6242A565B00829871 /* Debug */,
373 | 7555FFA7242A565B00829871 /* Release */,
374 | );
375 | defaultConfigurationIsVisible = 0;
376 | defaultConfigurationName = Release;
377 | };
378 | /* End XCConfigurationList section */
379 | };
380 | rootObject = 7555FF73242A565900829871 /* Project object */;
381 | }
382 |
--------------------------------------------------------------------------------
/iosApp/Pods/Pods.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 51;
7 | objects = {
8 |
9 | /* Begin PBXAggregateTarget section */
10 | 64406E0669EDE9788AAD1AC6A02233B5 /* test */ = {
11 | isa = PBXAggregateTarget;
12 | buildConfigurationList = A8E503B9E184C460ACBE32C8974CDFF4 /* Build configuration list for PBXAggregateTarget "test" */;
13 | buildPhases = (
14 | C0BE51E38296F2BCC852E8336E0AE6F5 /* [CP-User] Build test */,
15 | );
16 | dependencies = (
17 | );
18 | name = test;
19 | };
20 | /* End PBXAggregateTarget section */
21 |
22 | /* Begin PBXBuildFile section */
23 | 97C9C249613576FCB0AB4471BA6C5171 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; };
24 | A06623C6511796201EB50C8BE182B14B /* Pods-iosApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 42DE4C0106600A5B6D599285368F3270 /* Pods-iosApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
25 | B8D2B1EF408A0A40B91D98321E69EBCF /* Pods-iosApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A2475209BEE7612101900020629C625 /* Pods-iosApp-dummy.m */; };
26 | /* End PBXBuildFile section */
27 |
28 | /* Begin PBXContainerItemProxy section */
29 | 11B573E5FD4EC80CE374283BF92BFC37 /* PBXContainerItemProxy */ = {
30 | isa = PBXContainerItemProxy;
31 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
32 | proxyType = 1;
33 | remoteGlobalIDString = 64406E0669EDE9788AAD1AC6A02233B5;
34 | remoteInfo = test;
35 | };
36 | /* End PBXContainerItemProxy section */
37 |
38 | /* Begin PBXFileReference section */
39 | 0011AEE22E8296B3D9E0B0B2CDCAB2EE /* Pods-iosApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-iosApp-acknowledgements.plist"; sourceTree = ""; };
40 | 1A2FB55B5C37861BC78ECD1420D818C3 /* Pods-iosApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-iosApp.release.xcconfig"; sourceTree = ""; };
41 | 1C3C1FC9A5DA31DA72411587B3A52FD5 /* test.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = test.framework; path = build/cocoapods/framework/test.framework; sourceTree = ""; };
42 | 3A2475209BEE7612101900020629C625 /* Pods-iosApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-iosApp-dummy.m"; sourceTree = ""; };
43 | 42DE4C0106600A5B6D599285368F3270 /* Pods-iosApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-iosApp-umbrella.h"; sourceTree = ""; };
44 | 482384ADFE4EF692B16FACB8C2021970 /* Pods-iosApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-iosApp.modulemap"; sourceTree = ""; };
45 | 4E2ABEA715FF7B8D562347FADFC432EB /* test.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = test.release.xcconfig; sourceTree = ""; };
46 | 6256EEF2BDE6B455D4F8EDE58AE86BC6 /* test.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = test.debug.xcconfig; sourceTree = ""; };
47 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
48 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
49 | A43877303056397968EC90C7AAFE17E8 /* Pods-iosApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-iosApp-acknowledgements.markdown"; sourceTree = ""; };
50 | A79C2AA5C063914B2D1BD80187FDF6DE /* Pods-iosApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-iosApp.debug.xcconfig"; sourceTree = ""; };
51 | B097DD7534E741D5C41838011D755842 /* Pods-iosApp */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-iosApp"; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
52 | BCAED803D074E2E9C3B1327F049C8C2A /* Pods-iosApp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-iosApp-Info.plist"; sourceTree = ""; };
53 | FD731C6EB5F3896BC02A48E1D0904E1D /* test.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = test.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
54 | /* End PBXFileReference section */
55 |
56 | /* Begin PBXFrameworksBuildPhase section */
57 | 3CEBDDAEE3F5B20456D7BF97D7984B6E /* Frameworks */ = {
58 | isa = PBXFrameworksBuildPhase;
59 | buildActionMask = 2147483647;
60 | files = (
61 | 97C9C249613576FCB0AB4471BA6C5171 /* Foundation.framework in Frameworks */,
62 | );
63 | runOnlyForDeploymentPostprocessing = 0;
64 | };
65 | /* End PBXFrameworksBuildPhase section */
66 |
67 | /* Begin PBXGroup section */
68 | 1F86AA6785DF34AFD5A71790761717DE /* Products */ = {
69 | isa = PBXGroup;
70 | children = (
71 | B097DD7534E741D5C41838011D755842 /* Pods-iosApp */,
72 | );
73 | name = Products;
74 | sourceTree = "";
75 | };
76 | 30D0161BF5536C722B07D36267B2A200 /* Frameworks */ = {
77 | isa = PBXGroup;
78 | children = (
79 | 1C3C1FC9A5DA31DA72411587B3A52FD5 /* test.framework */,
80 | );
81 | name = Frameworks;
82 | sourceTree = "";
83 | };
84 | 310087C345B86EEF25A054485E0BB5CB /* Pods-iosApp */ = {
85 | isa = PBXGroup;
86 | children = (
87 | 482384ADFE4EF692B16FACB8C2021970 /* Pods-iosApp.modulemap */,
88 | A43877303056397968EC90C7AAFE17E8 /* Pods-iosApp-acknowledgements.markdown */,
89 | 0011AEE22E8296B3D9E0B0B2CDCAB2EE /* Pods-iosApp-acknowledgements.plist */,
90 | 3A2475209BEE7612101900020629C625 /* Pods-iosApp-dummy.m */,
91 | BCAED803D074E2E9C3B1327F049C8C2A /* Pods-iosApp-Info.plist */,
92 | 42DE4C0106600A5B6D599285368F3270 /* Pods-iosApp-umbrella.h */,
93 | A79C2AA5C063914B2D1BD80187FDF6DE /* Pods-iosApp.debug.xcconfig */,
94 | 1A2FB55B5C37861BC78ECD1420D818C3 /* Pods-iosApp.release.xcconfig */,
95 | );
96 | name = "Pods-iosApp";
97 | path = "Target Support Files/Pods-iosApp";
98 | sourceTree = "";
99 | };
100 | 337D5BB64E7010893E85A38A60AB9792 /* test */ = {
101 | isa = PBXGroup;
102 | children = (
103 | 30D0161BF5536C722B07D36267B2A200 /* Frameworks */,
104 | A7CED79A22989D3C8A27662DCA8845F6 /* Pod */,
105 | BC0D440F773FC5789550EF4D379D105F /* Support Files */,
106 | );
107 | name = test;
108 | path = ../../test;
109 | sourceTree = "";
110 | };
111 | 578452D2E740E91742655AC8F1636D1F /* iOS */ = {
112 | isa = PBXGroup;
113 | children = (
114 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */,
115 | );
116 | name = iOS;
117 | sourceTree = "";
118 | };
119 | 7C8E67BF615274690193E12B7C8EDB11 /* Development Pods */ = {
120 | isa = PBXGroup;
121 | children = (
122 | 337D5BB64E7010893E85A38A60AB9792 /* test */,
123 | );
124 | name = "Development Pods";
125 | sourceTree = "";
126 | };
127 | A7CED79A22989D3C8A27662DCA8845F6 /* Pod */ = {
128 | isa = PBXGroup;
129 | children = (
130 | FD731C6EB5F3896BC02A48E1D0904E1D /* test.podspec */,
131 | );
132 | name = Pod;
133 | sourceTree = "";
134 | };
135 | BC0D440F773FC5789550EF4D379D105F /* Support Files */ = {
136 | isa = PBXGroup;
137 | children = (
138 | 6256EEF2BDE6B455D4F8EDE58AE86BC6 /* test.debug.xcconfig */,
139 | 4E2ABEA715FF7B8D562347FADFC432EB /* test.release.xcconfig */,
140 | );
141 | name = "Support Files";
142 | path = "../iosApp/Pods/Target Support Files/test";
143 | sourceTree = "";
144 | };
145 | C9F6DDEE5D76F65BB478A349731F54F4 /* Targets Support Files */ = {
146 | isa = PBXGroup;
147 | children = (
148 | 310087C345B86EEF25A054485E0BB5CB /* Pods-iosApp */,
149 | );
150 | name = "Targets Support Files";
151 | sourceTree = "";
152 | };
153 | CF1408CF629C7361332E53B88F7BD30C = {
154 | isa = PBXGroup;
155 | children = (
156 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
157 | 7C8E67BF615274690193E12B7C8EDB11 /* Development Pods */,
158 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */,
159 | 1F86AA6785DF34AFD5A71790761717DE /* Products */,
160 | C9F6DDEE5D76F65BB478A349731F54F4 /* Targets Support Files */,
161 | );
162 | sourceTree = "";
163 | };
164 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = {
165 | isa = PBXGroup;
166 | children = (
167 | 578452D2E740E91742655AC8F1636D1F /* iOS */,
168 | );
169 | name = Frameworks;
170 | sourceTree = "";
171 | };
172 | /* End PBXGroup section */
173 |
174 | /* Begin PBXHeadersBuildPhase section */
175 | 994E6B23907BBCEE8293004ABCCF7BF9 /* Headers */ = {
176 | isa = PBXHeadersBuildPhase;
177 | buildActionMask = 2147483647;
178 | files = (
179 | A06623C6511796201EB50C8BE182B14B /* Pods-iosApp-umbrella.h in Headers */,
180 | );
181 | runOnlyForDeploymentPostprocessing = 0;
182 | };
183 | /* End PBXHeadersBuildPhase section */
184 |
185 | /* Begin PBXNativeTarget section */
186 | ED39C638569286489CD697A6C8964146 /* Pods-iosApp */ = {
187 | isa = PBXNativeTarget;
188 | buildConfigurationList = 6C21889C8FF55FB8114F2BF618459363 /* Build configuration list for PBXNativeTarget "Pods-iosApp" */;
189 | buildPhases = (
190 | 994E6B23907BBCEE8293004ABCCF7BF9 /* Headers */,
191 | A7F537B6252929C3371EB9881A74FB2B /* Sources */,
192 | 3CEBDDAEE3F5B20456D7BF97D7984B6E /* Frameworks */,
193 | E17EA69F2D832286700F6022987BEA1B /* Resources */,
194 | );
195 | buildRules = (
196 | );
197 | dependencies = (
198 | E912CEFED43F38253A44A773E051A9A9 /* PBXTargetDependency */,
199 | );
200 | name = "Pods-iosApp";
201 | productName = Pods_iosApp;
202 | productReference = B097DD7534E741D5C41838011D755842 /* Pods-iosApp */;
203 | productType = "com.apple.product-type.framework";
204 | };
205 | /* End PBXNativeTarget section */
206 |
207 | /* Begin PBXProject section */
208 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
209 | isa = PBXProject;
210 | attributes = {
211 | LastSwiftUpdateCheck = 1300;
212 | LastUpgradeCheck = 1300;
213 | };
214 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
215 | compatibilityVersion = "Xcode 10.0";
216 | developmentRegion = en;
217 | hasScannedForEncodings = 0;
218 | knownRegions = (
219 | Base,
220 | en,
221 | );
222 | mainGroup = CF1408CF629C7361332E53B88F7BD30C;
223 | productRefGroup = 1F86AA6785DF34AFD5A71790761717DE /* Products */;
224 | projectDirPath = "";
225 | projectRoot = "";
226 | targets = (
227 | ED39C638569286489CD697A6C8964146 /* Pods-iosApp */,
228 | 64406E0669EDE9788AAD1AC6A02233B5 /* test */,
229 | );
230 | };
231 | /* End PBXProject section */
232 |
233 | /* Begin PBXResourcesBuildPhase section */
234 | E17EA69F2D832286700F6022987BEA1B /* Resources */ = {
235 | isa = PBXResourcesBuildPhase;
236 | buildActionMask = 2147483647;
237 | files = (
238 | );
239 | runOnlyForDeploymentPostprocessing = 0;
240 | };
241 | /* End PBXResourcesBuildPhase section */
242 |
243 | /* Begin PBXShellScriptBuildPhase section */
244 | C0BE51E38296F2BCC852E8336E0AE6F5 /* [CP-User] Build test */ = {
245 | isa = PBXShellScriptBuildPhase;
246 | buildActionMask = 2147483647;
247 | files = (
248 | );
249 | name = "[CP-User] Build test";
250 | runOnlyForDeploymentPostprocessing = 0;
251 | shellPath = /bin/sh;
252 | shellScript = " if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n";
253 | };
254 | /* End PBXShellScriptBuildPhase section */
255 |
256 | /* Begin PBXSourcesBuildPhase section */
257 | A7F537B6252929C3371EB9881A74FB2B /* Sources */ = {
258 | isa = PBXSourcesBuildPhase;
259 | buildActionMask = 2147483647;
260 | files = (
261 | B8D2B1EF408A0A40B91D98321E69EBCF /* Pods-iosApp-dummy.m in Sources */,
262 | );
263 | runOnlyForDeploymentPostprocessing = 0;
264 | };
265 | /* End PBXSourcesBuildPhase section */
266 |
267 | /* Begin PBXTargetDependency section */
268 | E912CEFED43F38253A44A773E051A9A9 /* PBXTargetDependency */ = {
269 | isa = PBXTargetDependency;
270 | name = test;
271 | target = 64406E0669EDE9788AAD1AC6A02233B5 /* test */;
272 | targetProxy = 11B573E5FD4EC80CE374283BF92BFC37 /* PBXContainerItemProxy */;
273 | };
274 | /* End PBXTargetDependency section */
275 |
276 | /* Begin XCBuildConfiguration section */
277 | 23871C5F4CDF909EBE19395FF635D088 /* Release */ = {
278 | isa = XCBuildConfiguration;
279 | baseConfigurationReference = 4E2ABEA715FF7B8D562347FADFC432EB /* test.release.xcconfig */;
280 | buildSettings = {
281 | "ARCHS[sdk=iphonesimulator*]" = x86_64;
282 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
283 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
284 | CLANG_ENABLE_OBJC_WEAK = NO;
285 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
286 | LD_RUNPATH_SEARCH_PATHS = (
287 | "$(inherited)",
288 | "@executable_path/Frameworks",
289 | );
290 | SDKROOT = iphoneos;
291 | TARGETED_DEVICE_FAMILY = "1,2";
292 | VALIDATE_PRODUCT = YES;
293 | };
294 | name = Release;
295 | };
296 | 6BAA235ED81449FF8F4BD3F29FBD1611 /* Debug */ = {
297 | isa = XCBuildConfiguration;
298 | baseConfigurationReference = A79C2AA5C063914B2D1BD80187FDF6DE /* Pods-iosApp.debug.xcconfig */;
299 | buildSettings = {
300 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
301 | "ARCHS[sdk=iphonesimulator*]" = x86_64;
302 | CLANG_ENABLE_OBJC_WEAK = NO;
303 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
304 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
305 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
306 | CURRENT_PROJECT_VERSION = 1;
307 | DEFINES_MODULE = YES;
308 | DYLIB_COMPATIBILITY_VERSION = 1;
309 | DYLIB_CURRENT_VERSION = 1;
310 | DYLIB_INSTALL_NAME_BASE = "@rpath";
311 | INFOPLIST_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist";
312 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
313 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
314 | LD_RUNPATH_SEARCH_PATHS = (
315 | "$(inherited)",
316 | "@executable_path/Frameworks",
317 | "@loader_path/Frameworks",
318 | );
319 | MACH_O_TYPE = staticlib;
320 | MODULEMAP_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp.modulemap";
321 | OTHER_LDFLAGS = "";
322 | OTHER_LIBTOOLFLAGS = "";
323 | PODS_ROOT = "$(SRCROOT)";
324 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
325 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
326 | SDKROOT = iphoneos;
327 | SKIP_INSTALL = YES;
328 | TARGETED_DEVICE_FAMILY = "1,2";
329 | VERSIONING_SYSTEM = "apple-generic";
330 | VERSION_INFO_PREFIX = "";
331 | };
332 | name = Debug;
333 | };
334 | 8EF2F30465F04980641EAA6A45115160 /* Release */ = {
335 | isa = XCBuildConfiguration;
336 | baseConfigurationReference = 1A2FB55B5C37861BC78ECD1420D818C3 /* Pods-iosApp.release.xcconfig */;
337 | buildSettings = {
338 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
339 | "ARCHS[sdk=iphonesimulator*]" = x86_64;
340 | CLANG_ENABLE_OBJC_WEAK = NO;
341 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
342 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
343 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
344 | CURRENT_PROJECT_VERSION = 1;
345 | DEFINES_MODULE = YES;
346 | DYLIB_COMPATIBILITY_VERSION = 1;
347 | DYLIB_CURRENT_VERSION = 1;
348 | DYLIB_INSTALL_NAME_BASE = "@rpath";
349 | INFOPLIST_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist";
350 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
351 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
352 | LD_RUNPATH_SEARCH_PATHS = (
353 | "$(inherited)",
354 | "@executable_path/Frameworks",
355 | "@loader_path/Frameworks",
356 | );
357 | MACH_O_TYPE = staticlib;
358 | MODULEMAP_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp.modulemap";
359 | OTHER_LDFLAGS = "";
360 | OTHER_LIBTOOLFLAGS = "";
361 | PODS_ROOT = "$(SRCROOT)";
362 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
363 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
364 | SDKROOT = iphoneos;
365 | SKIP_INSTALL = YES;
366 | TARGETED_DEVICE_FAMILY = "1,2";
367 | VALIDATE_PRODUCT = YES;
368 | VERSIONING_SYSTEM = "apple-generic";
369 | VERSION_INFO_PREFIX = "";
370 | };
371 | name = Release;
372 | };
373 | 903A0004D3E6651EFD5D2E16214D101B /* Release */ = {
374 | isa = XCBuildConfiguration;
375 | buildSettings = {
376 | ALWAYS_SEARCH_USER_PATHS = NO;
377 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
378 | CLANG_ANALYZER_NONNULL = YES;
379 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
380 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
381 | CLANG_CXX_LIBRARY = "libc++";
382 | CLANG_ENABLE_MODULES = YES;
383 | CLANG_ENABLE_OBJC_ARC = YES;
384 | CLANG_ENABLE_OBJC_WEAK = YES;
385 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
386 | CLANG_WARN_BOOL_CONVERSION = YES;
387 | CLANG_WARN_COMMA = YES;
388 | CLANG_WARN_CONSTANT_CONVERSION = YES;
389 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
391 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
392 | CLANG_WARN_EMPTY_BODY = YES;
393 | CLANG_WARN_ENUM_CONVERSION = YES;
394 | CLANG_WARN_INFINITE_RECURSION = YES;
395 | CLANG_WARN_INT_CONVERSION = YES;
396 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
397 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
398 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
399 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
400 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
401 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
402 | CLANG_WARN_STRICT_PROTOTYPES = YES;
403 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
404 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
405 | CLANG_WARN_UNREACHABLE_CODE = YES;
406 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
407 | COPY_PHASE_STRIP = NO;
408 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
409 | ENABLE_NS_ASSERTIONS = NO;
410 | ENABLE_STRICT_OBJC_MSGSEND = YES;
411 | GCC_C_LANGUAGE_STANDARD = gnu11;
412 | GCC_NO_COMMON_BLOCKS = YES;
413 | GCC_PREPROCESSOR_DEFINITIONS = (
414 | "POD_CONFIGURATION_RELEASE=1",
415 | "$(inherited)",
416 | );
417 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
418 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
419 | GCC_WARN_UNDECLARED_SELECTOR = YES;
420 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
421 | GCC_WARN_UNUSED_FUNCTION = YES;
422 | GCC_WARN_UNUSED_VARIABLE = YES;
423 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
424 | MTL_ENABLE_DEBUG_INFO = NO;
425 | MTL_FAST_MATH = YES;
426 | PRODUCT_NAME = "$(TARGET_NAME)";
427 | STRIP_INSTALLED_PRODUCT = NO;
428 | SWIFT_COMPILATION_MODE = wholemodule;
429 | SWIFT_OPTIMIZATION_LEVEL = "-O";
430 | SWIFT_VERSION = 5.0;
431 | SYMROOT = "${SRCROOT}/../build";
432 | };
433 | name = Release;
434 | };
435 | 90CEE425C880CF61BA67F102FE970C5F /* Debug */ = {
436 | isa = XCBuildConfiguration;
437 | baseConfigurationReference = 6256EEF2BDE6B455D4F8EDE58AE86BC6 /* test.debug.xcconfig */;
438 | buildSettings = {
439 | "ARCHS[sdk=iphonesimulator*]" = x86_64;
440 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
441 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
442 | CLANG_ENABLE_OBJC_WEAK = NO;
443 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
444 | LD_RUNPATH_SEARCH_PATHS = (
445 | "$(inherited)",
446 | "@executable_path/Frameworks",
447 | );
448 | SDKROOT = iphoneos;
449 | TARGETED_DEVICE_FAMILY = "1,2";
450 | };
451 | name = Debug;
452 | };
453 | B4EFE046ACF8F37157F6E322C7FCFC28 /* Debug */ = {
454 | isa = XCBuildConfiguration;
455 | buildSettings = {
456 | ALWAYS_SEARCH_USER_PATHS = NO;
457 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
458 | CLANG_ANALYZER_NONNULL = YES;
459 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
460 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
461 | CLANG_CXX_LIBRARY = "libc++";
462 | CLANG_ENABLE_MODULES = YES;
463 | CLANG_ENABLE_OBJC_ARC = YES;
464 | CLANG_ENABLE_OBJC_WEAK = YES;
465 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
466 | CLANG_WARN_BOOL_CONVERSION = YES;
467 | CLANG_WARN_COMMA = YES;
468 | CLANG_WARN_CONSTANT_CONVERSION = YES;
469 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
470 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
471 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
472 | CLANG_WARN_EMPTY_BODY = YES;
473 | CLANG_WARN_ENUM_CONVERSION = YES;
474 | CLANG_WARN_INFINITE_RECURSION = YES;
475 | CLANG_WARN_INT_CONVERSION = YES;
476 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
477 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
478 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
479 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
480 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
481 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
482 | CLANG_WARN_STRICT_PROTOTYPES = YES;
483 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
484 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
485 | CLANG_WARN_UNREACHABLE_CODE = YES;
486 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
487 | COPY_PHASE_STRIP = NO;
488 | DEBUG_INFORMATION_FORMAT = dwarf;
489 | ENABLE_STRICT_OBJC_MSGSEND = YES;
490 | ENABLE_TESTABILITY = YES;
491 | GCC_C_LANGUAGE_STANDARD = gnu11;
492 | GCC_DYNAMIC_NO_PIC = NO;
493 | GCC_NO_COMMON_BLOCKS = YES;
494 | GCC_OPTIMIZATION_LEVEL = 0;
495 | GCC_PREPROCESSOR_DEFINITIONS = (
496 | "POD_CONFIGURATION_DEBUG=1",
497 | "DEBUG=1",
498 | "$(inherited)",
499 | );
500 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
501 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
502 | GCC_WARN_UNDECLARED_SELECTOR = YES;
503 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
504 | GCC_WARN_UNUSED_FUNCTION = YES;
505 | GCC_WARN_UNUSED_VARIABLE = YES;
506 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
507 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
508 | MTL_FAST_MATH = YES;
509 | ONLY_ACTIVE_ARCH = YES;
510 | PRODUCT_NAME = "$(TARGET_NAME)";
511 | STRIP_INSTALLED_PRODUCT = NO;
512 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
513 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
514 | SWIFT_VERSION = 5.0;
515 | SYMROOT = "${SRCROOT}/../build";
516 | };
517 | name = Debug;
518 | };
519 | /* End XCBuildConfiguration section */
520 |
521 | /* Begin XCConfigurationList section */
522 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
523 | isa = XCConfigurationList;
524 | buildConfigurations = (
525 | B4EFE046ACF8F37157F6E322C7FCFC28 /* Debug */,
526 | 903A0004D3E6651EFD5D2E16214D101B /* Release */,
527 | );
528 | defaultConfigurationIsVisible = 0;
529 | defaultConfigurationName = Release;
530 | };
531 | 6C21889C8FF55FB8114F2BF618459363 /* Build configuration list for PBXNativeTarget "Pods-iosApp" */ = {
532 | isa = XCConfigurationList;
533 | buildConfigurations = (
534 | 6BAA235ED81449FF8F4BD3F29FBD1611 /* Debug */,
535 | 8EF2F30465F04980641EAA6A45115160 /* Release */,
536 | );
537 | defaultConfigurationIsVisible = 0;
538 | defaultConfigurationName = Release;
539 | };
540 | A8E503B9E184C460ACBE32C8974CDFF4 /* Build configuration list for PBXAggregateTarget "test" */ = {
541 | isa = XCConfigurationList;
542 | buildConfigurations = (
543 | 90CEE425C880CF61BA67F102FE970C5F /* Debug */,
544 | 23871C5F4CDF909EBE19395FF635D088 /* Release */,
545 | );
546 | defaultConfigurationIsVisible = 0;
547 | defaultConfigurationName = Release;
548 | };
549 | /* End XCConfigurationList section */
550 | };
551 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
552 | }
553 |
--------------------------------------------------------------------------------