├── docs
├── ios1.png
├── xcode.png
└── Android1.png
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── iosApp
├── iosApp
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── ContentView.swift
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ ├── Info.plist
│ └── SceneDelegate.swift
├── iosApp.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ ├── xcuserdata
│ │ │ └── jklingenberg.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── xcuserdata
│ │ └── jklingenberg.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ └── project.pbxproj
├── iosAppTests
│ ├── Info.plist
│ └── iosAppTests.swift
└── iosAppUITests
│ ├── Info.plist
│ └── iosAppUITests.swift
├── androidApp
├── src
│ ├── androidTest
│ │ └── java
│ │ │ └── android
│ │ │ ├── TestRunner.kt
│ │ │ └── ExampleInstrumentedTest.kt
│ └── main
│ │ ├── java
│ │ └── de
│ │ │ └── jensklingenberg
│ │ │ └── basickmm
│ │ │ └── androidApp
│ │ │ ├── MainActivity.kt
│ │ │ ├── SingleFragmentActivity.kt
│ │ │ ├── ListAdapter.kt
│ │ │ └── MainFragment.kt
│ │ ├── res
│ │ ├── values
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ └── layout
│ │ │ ├── activity_fragment.xml
│ │ │ ├── activity_main.xml
│ │ │ └── list_item.xml
│ │ └── AndroidManifest.xml
└── build.gradle.kts
├── shared
├── src
│ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── de
│ │ │ └── jensklingenberg
│ │ │ └── basickmm
│ │ │ └── shared
│ │ │ └── Platform.kt
│ ├── commonMain
│ │ └── kotlin
│ │ │ └── de
│ │ │ └── jensklingenberg
│ │ │ └── basickmm
│ │ │ └── shared
│ │ │ ├── test
│ │ │ ├── test.kt
│ │ │ └── TestEnvironment.kt
│ │ │ ├── Platform.kt
│ │ │ └── Greeting.kt
│ ├── iosMain
│ │ └── kotlin
│ │ │ └── de
│ │ │ └── jensklingenberg
│ │ │ └── basickmm
│ │ │ └── shared
│ │ │ └── Platform.kt
│ ├── iosTest
│ │ └── kotlin
│ │ │ └── de
│ │ │ └── jensklingenberg
│ │ │ └── basickmm
│ │ │ └── shared
│ │ │ └── iosTest.kt
│ └── androidTest
│ │ └── kotlin
│ │ └── de
│ │ └── jensklingenberg
│ │ └── basickmm
│ │ └── shared
│ │ └── androidTest.kt
└── build.gradle.kts
├── gradle.properties
├── settings.gradle.kts
├── .gitignore
├── Readme.md
├── gradlew.bat
└── gradlew
/docs/ios1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Foso/BasicKmm/master/docs/ios1.png
--------------------------------------------------------------------------------
/docs/xcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Foso/BasicKmm/master/docs/xcode.png
--------------------------------------------------------------------------------
/docs/Android1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Foso/BasicKmm/master/docs/Android1.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Foso/BasicKmm/master/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/androidApp/src/androidTest/java/android/TestRunner.kt:
--------------------------------------------------------------------------------
1 | package android
2 |
3 | import androidx.test.runner.AndroidJUnitRunner
4 |
5 | class TestRunner : AndroidJUnitRunner() {
6 |
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/shared/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | kotlin.code.style=official
2 | xcodeproj=./iosApp
3 | android.useAndroidX=true
4 | kotlin.mpp.enableGranularSourceSetsMetadata=true
5 | kotlin.native.enableDependencyPropagation=false
6 |
--------------------------------------------------------------------------------
/iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/de/jensklingenberg/basickmm/shared/test/test.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.shared.test
2 | fun test(given: () -> Unit, whenever: () -> Unit, then: () -> Unit) {
3 | given()
4 | whenever()
5 | then()
6 | }
7 |
--------------------------------------------------------------------------------
/androidApp/src/main/java/de/jensklingenberg/basickmm/androidApp/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.androidApp
2 |
3 | class MainActivity : SingleFragmentActivity() {
4 | override fun createFragment() = MainFragment.newInstance()
5 | }
6 |
--------------------------------------------------------------------------------
/iosApp/iosApp.xcodeproj/xcuserdata/jklingenberg.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/shared/src/androidMain/kotlin/de/jensklingenberg/basickmm/shared/Platform.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.shared
2 |
3 | actual class Platform actual constructor() {
4 | actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
5 | }
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6200EE
4 | #3700B3
5 | #03DAC5
6 |
--------------------------------------------------------------------------------
/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/jklingenberg.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Foso/BasicKmm/master/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/jklingenberg.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/activity_fragment.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu Mar 11 14:14:32 CET 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/de/jensklingenberg/basickmm/shared/Platform.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.shared
2 |
3 | expect class Platform() {
4 | val platform: String
5 | }
6 |
7 |
8 |
9 | data class Movie(val title: String, val year: Int, val image: String)
10 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google()
4 | jcenter()
5 | gradlePluginPortal()
6 | mavenCentral()
7 | }
8 |
9 | }
10 | rootProject.name = "BasicKmm"
11 |
12 |
13 | include(":androidApp")
14 | include(":shared")
15 |
16 |
--------------------------------------------------------------------------------
/shared/src/iosMain/kotlin/de/jensklingenberg/basickmm/shared/Platform.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.shared
2 |
3 |
4 | import platform.UIKit.UIDevice
5 |
6 | actual class Platform actual constructor() {
7 | actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
8 | }
--------------------------------------------------------------------------------
/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/shared/src/iosTest/kotlin/de/jensklingenberg/basickmm/shared/iosTest.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.shared
2 |
3 | import kotlin.test.Test
4 | import kotlin.test.assertTrue
5 |
6 | class IosGreetingTest {
7 |
8 | @Test
9 | fun testExample() {
10 | assertTrue(Greeting().greeting().contains("iOS"), "Check iOS is mentioned")
11 | }
12 | }
--------------------------------------------------------------------------------
/shared/src/androidTest/kotlin/de/jensklingenberg/basickmm/shared/androidTest.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.shared
2 |
3 | import org.junit.Assert.assertTrue
4 | import org.junit.Test
5 |
6 | class AndroidGreetingTest {
7 |
8 | @Test
9 | fun testExample() {
10 | assertTrue("Check Android is mentioned", Greeting().greeting().contains("Android"))
11 | }
12 | }
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /build
12 | /captures
13 | .externalNativeBuild
14 | .cxx
15 | local.properties
16 |
17 | # Project exclude paths
18 | /androidApp/build/
19 | /androidApp/build/intermediates/javac/debug/classes/
20 | /shared/build/
21 | /shared/build/intermediates/javac/debug/classes/
--------------------------------------------------------------------------------
/iosApp/iosApp.xcodeproj/xcuserdata/jklingenberg.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | iosApp.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/iosApp/iosApp/ContentView.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 | import shared
3 |
4 | func greet() -> String {
5 | return Greeting().greeting()
6 | }
7 |
8 | struct ContentView: View {
9 | var body: some View {
10 | VStack{
11 | Text(greet())
12 |
13 | List(Greeting().getnicCageMovies(), id: \.title){
14 | ingredientName in
15 | Text(ingredientName.title)
16 | }
17 | }
18 |
19 | }
20 | }
21 |
22 | struct ContentView_Previews: PreviewProvider {
23 | static var previews: some View {
24 | ContentView()
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/androidApp/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/de/jensklingenberg/basickmm/shared/test/TestEnvironment.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.shared.test
2 |
3 |
4 | class MockUser()
5 |
6 | interface TestEnvironment {
7 | fun launchApp()
8 | fun assertTrue(assert: Boolean)
9 | fun assertEquals(expected: String, actual: String)
10 | fun clickOnNodeWithText(text: String)
11 | fun assertNodeDisplayed(text: String)
12 |
13 | }
14 |
15 |
16 | class OverviewTest(private val testEnvironment: TestEnvironment) {
17 |
18 | fun whenScreenOpensShowKickAssTitle() {
19 | testEnvironment.launchApp()
20 | testEnvironment.assertNodeDisplayed("Kick-Ass")
21 | testEnvironment.assertEquals("1","1")
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/de/jensklingenberg/basickmm/shared/Greeting.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.shared
2 |
3 |
4 | class Greeting {
5 | fun greeting(): String {
6 | return "Hello, ${Platform().platform}!"
7 | }
8 |
9 | fun getnicCageMovies(): List = listOf(
10 | Movie("Raising Arizona", 1987, "raising_arizona.jpg"),
11 | Movie("Vampire's Kiss", 1988, "vampires_kiss.png"),
12 | Movie("Con Air", 1997, "con_air.jpg"),
13 | Movie("Face/Off", 1997, "face_off.jpg"),
14 | Movie("National Treasure", 2004, "national_treasure.jpg"),
15 | Movie("The Wicker Man", 2006, "wicker_man.jpg"),
16 | Movie("Bad Lieutenant", 2009, "bad_lieutenant.jpg"),
17 | Movie("Kick-Ass", 2010, "kickass.jpg")
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/iosApp/iosAppTests/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 |
22 |
23 |
--------------------------------------------------------------------------------
/iosApp/iosAppUITests/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 |
22 |
23 |
--------------------------------------------------------------------------------
/iosApp/iosAppTests/iosAppTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | @testable import iosApp
3 |
4 | class iosAppTests: XCTestCase {
5 |
6 | override func setUp() {
7 | // Put setup code here. This method is called before the invocation of each test method in the class.
8 | }
9 |
10 | override func tearDown() {
11 | // Put teardown code here. This method is called after the invocation of each test method in the class.
12 | }
13 |
14 | func testExample() {
15 | // This is an example of a functional test case.
16 | // Use XCTAssert and related functions to verify your tests produce the correct results.
17 | }
18 |
19 | func testPerformanceExample() {
20 | // This is an example of a performance test case.
21 | self.measure {
22 | // Put the code you want to measure the time of here.
23 | }
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
17 |
24 |
25 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/list_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
18 |
19 |
26 |
27 |
--------------------------------------------------------------------------------
/androidApp/src/main/java/de/jensklingenberg/basickmm/androidApp/SingleFragmentActivity.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.androidApp
2 |
3 | import android.os.Bundle
4 | import androidx.annotation.LayoutRes
5 | import androidx.appcompat.app.AppCompatActivity
6 | import androidx.fragment.app.Fragment
7 |
8 | abstract class SingleFragmentActivity : AppCompatActivity() {
9 |
10 | private val layoutResId: Int
11 | @LayoutRes
12 | get() = R.layout.activity_fragment
13 |
14 | protected abstract fun createFragment(): Fragment
15 |
16 | override fun onCreate(savedInstanceState: Bundle?) {
17 | super.onCreate(savedInstanceState)
18 |
19 | setContentView(layoutResId)
20 |
21 | val fm = supportFragmentManager
22 | var fragment = fm.findFragmentById(R.id.fragment_container)
23 |
24 | // ensures fragments already created will not be created
25 | if (fragment == null) {
26 | fragment = createFragment()
27 | // create and commit a fragment transaction
28 | fm.beginTransaction()
29 | .add(R.id.fragment_container, fragment)
30 | .commit()
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/iosApp/iosApp/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 |
3 | @UIApplicationMain
4 | class AppDelegate: UIResponder, UIApplicationDelegate {
5 |
6 |
7 |
8 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
9 | // Override point for customization after application launch.
10 | return true
11 | }
12 |
13 | // MARK: UISceneSession Lifecycle
14 |
15 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
16 | // Called when a new scene session is being created.
17 | // Use this method to select a configuration to create the new scene with.
18 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
19 | }
20 |
21 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
22 | // Called when the user discards a scene session.
23 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
24 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
25 | }
26 |
27 |
28 | }
29 |
30 |
--------------------------------------------------------------------------------
/androidApp/src/main/java/de/jensklingenberg/basickmm/androidApp/ListAdapter.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.androidApp
2 |
3 | import android.view.LayoutInflater
4 | import android.view.ViewGroup
5 | import android.widget.TextView
6 | import androidx.recyclerview.widget.RecyclerView
7 | import de.jensklingenberg.basickmm.shared.Movie
8 |
9 | class ListAdapter(private val list: List)
10 | : RecyclerView.Adapter() {
11 |
12 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder {
13 | val inflater = LayoutInflater.from(parent.context)
14 | return MovieViewHolder(inflater, parent)
15 | }
16 |
17 | override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
18 | val movie: Movie = list[position]
19 | holder.bind(movie)
20 | }
21 |
22 | override fun getItemCount(): Int = list.size
23 |
24 | }
25 |
26 | class MovieViewHolder(inflater: LayoutInflater, parent: ViewGroup) :
27 | RecyclerView.ViewHolder(inflater.inflate(R.layout.list_item, parent, false)) {
28 | private var mTitleView: TextView? = null
29 | private var mYearView: TextView? = null
30 |
31 |
32 | init {
33 | mTitleView = itemView.findViewById(R.id.list_title)
34 | mYearView = itemView.findViewById(R.id.list_description)
35 | }
36 |
37 | fun bind(movie: Movie) {
38 | mTitleView?.text = movie.title
39 | mYearView?.text = movie.year.toString()
40 | }
41 |
42 | }
--------------------------------------------------------------------------------
/androidApp/src/main/java/de/jensklingenberg/basickmm/androidApp/MainFragment.kt:
--------------------------------------------------------------------------------
1 | package de.jensklingenberg.basickmm.androidApp
2 |
3 | import android.os.Bundle
4 | import android.view.LayoutInflater
5 | import android.view.View
6 | import android.view.ViewGroup
7 | import android.widget.TextView
8 | import androidx.fragment.app.Fragment
9 | import androidx.recyclerview.widget.LinearLayoutManager
10 | import androidx.recyclerview.widget.RecyclerView
11 | import de.jensklingenberg.basickmm.shared.Greeting
12 |
13 |
14 |
15 | class MainFragment : Fragment() {
16 |
17 |
18 |
19 | override fun onCreate(savedInstanceState: Bundle?) {
20 | super.onCreate(savedInstanceState)
21 | retainInstance = true
22 | }
23 |
24 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
25 | inflater.inflate(R.layout.activity_main, container, false)
26 |
27 |
28 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
29 | super.onViewCreated(view, savedInstanceState)
30 | requireActivity().findViewById(R.id.recycler).apply {
31 | layoutManager = LinearLayoutManager(activity)
32 | adapter = ListAdapter(Greeting().getnicCageMovies())
33 | }
34 | requireActivity().findViewById(R.id.platform).setText( Greeting().greeting())
35 | }
36 |
37 | companion object {
38 | fun newInstance(): MainFragment = MainFragment()
39 | }
40 | }
--------------------------------------------------------------------------------
/androidApp/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.application")
3 | kotlin("android")
4 | }
5 |
6 | dependencies {
7 | implementation(project(":shared"))
8 | implementation("com.google.android.material:material:1.2.1")
9 | implementation("androidx.appcompat:appcompat:1.2.0")
10 | implementation("androidx.constraintlayout:constraintlayout:2.0.2")
11 | androidTestImplementation("com.android.support.test.espresso:espresso-core:3.0.2")
12 |
13 | androidTestImplementation ("androidx.test:runner:1.3.0")
14 | androidTestImplementation ("androidx.test.espresso:espresso-intents:3.3.0")
15 |
16 | androidTestImplementation ("androidx.test:core:1.3.0")
17 |
18 | androidTestImplementation ("androidx.test.ext:junit:1.1.2")
19 |
20 | androidTestImplementation ("androidx.test:rules:1.3.0")
21 | androidTestImplementation ("org.mockito:mockito-core:2.28.2")
22 |
23 | androidTestImplementation("androidx.test.ext:junit:1.1.2")
24 | androidTestImplementation("com.schibsted.spain:barista:3.9.0")
25 | }
26 |
27 | android {
28 | compileSdkVersion(29)
29 | defaultConfig {
30 | applicationId = "de.jensklingenberg.basickmm.androidApp"
31 | minSdkVersion(24)
32 | targetSdkVersion(29)
33 | versionCode = 1
34 | versionName = "1.0"
35 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
36 |
37 | }
38 | buildTypes {
39 | getByName("release") {
40 | isMinifyEnabled = false
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | # BasicKmm
2 |
3 | | Android Overview |
4 | | ------------------ |
5 | |
6 |
7 | | iOS Overview
8 | | ------------------ |
9 | |
10 |
11 | ## iOS
12 | Have tested it on XCode v12.
13 |
14 | Just import the iOS project [iosApp](iosApp/) inside Xcode.
15 |
16 | You need to change the Framework Search Path for iosAppUiTest to the path where your shared/build folder is located
17 | |
18 |
19 |
20 | The iOS project compiles a Kotlin module to a framework (see [iosApp](iosApp/)).
21 |
22 |
23 |
24 | ## 📜 License
25 |
26 | -------
27 |
28 | This project is licensed under Apache License, Version 2.0
29 |
30 | Copyright 2021 Jens Klingenberg
31 |
32 | Licensed under the Apache License, Version 2.0 (the "License");
33 | you may not use this file except in compliance with the License.
34 | You may obtain a copy of the License at
35 |
36 | http://www.apache.org/licenses/LICENSE-2.0
37 |
38 | Unless required by applicable law or agreed to in writing, software
39 | distributed under the License is distributed on an "AS IS" BASIS,
40 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
41 | See the License for the specific language governing permissions and
42 | limitations under the License.
43 |
44 |
--------------------------------------------------------------------------------
/iosApp/iosAppUITests/iosAppUITests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import shared
3 |
4 |
5 | class IosTest : TestEnvironment{
6 | func assertNodeDisplayed(text: String) {
7 | //TODO Implement
8 | }
9 |
10 | func clickOnNodeWithText(text: String) {
11 | XCUIApplication().tables.buttons[text].tap()
12 |
13 | }
14 |
15 | func assertEquals(expected: String, actual: String) {
16 | XCTAssertEqual(expected, actual)
17 | }
18 |
19 | func assertTrue(assert: Bool) {
20 | XCTAssertTrue(assert)
21 | }
22 |
23 | let app = XCUIApplication()
24 |
25 | func launchApp() {
26 | app.launch()
27 | }
28 |
29 |
30 | }
31 |
32 |
33 | class appNameUITests: XCTestCase {
34 |
35 | override func setUp() {
36 |
37 | }
38 |
39 | override func tearDown() {
40 | // Put teardown code here. This method is called after the invocation of each test method in the class.
41 | }
42 |
43 | func testExample() {
44 | // UI tests must launch the application that they test.
45 | let testEnvironment = IosTest()
46 |
47 | OverviewTest(testEnvironment:testEnvironment).whenScreenOpensShowKickAssTitle()
48 |
49 | // Use recording to get started writing UI tests.
50 | // Use XCTAssert and related functions to verify your tests produce the correct results.
51 | }
52 |
53 | func testLaunchPerformance() {
54 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) {
55 | // This measures how long it takes to launch your application.
56 | measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) {
57 | XCUIApplication().launch()
58 | }
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/androidApp/src/androidTest/java/android/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package android
2 |
3 |
4 |
5 | import android.content.Intent
6 | import androidx.test.espresso.intent.rule.IntentsTestRule
7 | import com.schibsted.spain.barista.assertion.BaristaVisibilityAssertions
8 | import com.schibsted.spain.barista.interaction.BaristaClickInteractions
9 | import de.jensklingenberg.basickmm.androidApp.MainActivity
10 | import de.jensklingenberg.basickmm.shared.test.OverviewTest
11 | import de.jensklingenberg.basickmm.shared.test.TestEnvironment
12 | import org.junit.Assert
13 | import org.junit.Rule
14 | import org.junit.Test
15 |
16 |
17 | /**
18 | * Instrumented test, which will execute on an Android device.
19 | *
20 | * See [testing documentation](http://d.android.com/tools/testing).
21 | */
22 |
23 | class ExampleInstrumentedTest {
24 |
25 |
26 | @Test
27 | fun whenUserClicksOnListItem_OpenDetailPage() {
28 | OverviewTest(AndroidTestEnv()).whenScreenOpensShowKickAssTitle()
29 | }
30 |
31 | }
32 |
33 | class AndroidTestEnv: TestEnvironment{
34 | @Rule
35 | @JvmField
36 | val rule = IntentsTestRule(MainActivity::class.java, false, false)
37 |
38 |
39 | override fun launchApp() {
40 | rule.launchActivity(Intent())
41 | }
42 |
43 | override fun assertTrue(assert: Boolean) {
44 | Assert.assertTrue(assert)
45 | }
46 |
47 | override fun assertEquals(expected: String, actual: String) {
48 | Assert.assertEquals(expected, actual)
49 | }
50 |
51 | override fun clickOnNodeWithText(text: String) {
52 | BaristaClickInteractions.clickOn(text)
53 | }
54 |
55 | override fun assertNodeDisplayed(text: String) {
56 | BaristaVisibilityAssertions.assertDisplayed(text)
57 | }
58 | }
59 |
60 |
--------------------------------------------------------------------------------
/iosApp/iosApp/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/shared/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
2 |
3 | plugins {
4 | kotlin("multiplatform")
5 | id("com.android.library")
6 | }
7 |
8 | kotlin {
9 | android()
10 | ios {
11 | binaries {
12 | framework {
13 | baseName = "shared"
14 | }
15 | }
16 | }
17 | sourceSets {
18 | val commonMain by getting
19 | val commonTest by getting {
20 | dependencies {
21 | implementation(kotlin("test-common"))
22 | implementation(kotlin("test-annotations-common"))
23 | }
24 | }
25 | val androidMain by getting {
26 | dependencies {
27 | implementation("com.google.android.material:material:1.2.1")
28 | }
29 | }
30 | val androidTest by getting {
31 | dependencies {
32 | implementation(kotlin("test-junit"))
33 | implementation("junit:junit:4.13")
34 | }
35 | }
36 | val iosMain by getting
37 | val iosTest by getting
38 | }
39 | }
40 |
41 | android {
42 | compileSdkVersion(29)
43 | sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
44 | defaultConfig {
45 | minSdkVersion(24)
46 | targetSdkVersion(29)
47 | }
48 | }
49 |
50 | val packForXcode by tasks.creating(Sync::class) {
51 | group = "build"
52 | val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
53 | val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
54 | val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
55 | val framework = kotlin.targets.getByName(targetName).binaries.getFramework(mode)
56 | inputs.property("mode", mode)
57 | dependsOn(framework.linkTask)
58 | val targetDir = File(buildDir, "xcode-frameworks")
59 | from({ framework.outputDirectory })
60 | into(targetDir)
61 | }
62 |
63 | tasks.getByName("build").dependsOn(packForXcode)
--------------------------------------------------------------------------------
/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/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 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/iosApp/iosApp/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import SwiftUI
3 |
4 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
5 |
6 | var window: UIWindow?
7 |
8 |
9 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
10 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
11 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
12 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
13 |
14 | // Create the SwiftUI view that provides the window contents.
15 | let contentView = ContentView()
16 |
17 | // Use a UIHostingController as window root view controller.
18 | if let windowScene = scene as? UIWindowScene {
19 | let window = UIWindow(windowScene: windowScene)
20 | window.rootViewController = UIHostingController(rootView: contentView)
21 | self.window = window
22 | window.makeKeyAndVisible()
23 | }
24 | }
25 |
26 | func sceneDidDisconnect(_ scene: UIScene) {
27 | // Called as the scene is being released by the system.
28 | // This occurs shortly after the scene enters the background, or when its session is discarded.
29 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
30 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
31 | }
32 |
33 | func sceneDidBecomeActive(_ scene: UIScene) {
34 | // Called when the scene has moved from an inactive state to an active state.
35 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
36 | }
37 |
38 | func sceneWillResignActive(_ scene: UIScene) {
39 | // Called when the scene will move from an active state to an inactive state.
40 | // This may occur due to temporary interruptions (ex. an incoming phone call).
41 | }
42 |
43 | func sceneWillEnterForeground(_ scene: UIScene) {
44 | // Called as the scene transitions from the background to the foreground.
45 | // Use this method to undo the changes made on entering the background.
46 | }
47 |
48 | func sceneDidEnterBackground(_ scene: UIScene) {
49 | // Called as the scene transitions from the foreground to the background.
50 | // Use this method to save data, release shared resources, and store enough scene-specific state information
51 | // to restore the scene back to its current state.
52 | }
53 |
54 |
55 | }
56 |
57 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/iosApp/iosApp.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 52;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 13B4DC3125FA6105002FD5ED /* shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* shared.framework */; platformFilter = ios; };
11 | 13B4DC3D25FA629C002FD5ED /* shared.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* shared.framework */; platformFilter = ios; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
12 | 7555FF7F242A565900829871 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF7E242A565900829871 /* AppDelegate.swift */; };
13 | 7555FF81242A565900829871 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF80242A565900829871 /* SceneDelegate.swift */; };
14 | 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; };
15 | 7555FF85242A565B00829871 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF84242A565B00829871 /* Assets.xcassets */; };
16 | 7555FF88242A565B00829871 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF87242A565B00829871 /* Preview Assets.xcassets */; };
17 | 7555FF8B242A565B00829871 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF89242A565B00829871 /* LaunchScreen.storyboard */; };
18 | 7555FF96242A565B00829871 /* iosAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF95242A565B00829871 /* iosAppTests.swift */; };
19 | 7555FFA1242A565B00829871 /* iosAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FFA0242A565B00829871 /* iosAppUITests.swift */; };
20 | 7555FFB2242A642300829871 /* shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* shared.framework */; };
21 | 7555FFB3242A642300829871 /* shared.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* shared.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
22 | /* End PBXBuildFile section */
23 |
24 | /* Begin PBXContainerItemProxy section */
25 | 7555FF92242A565B00829871 /* PBXContainerItemProxy */ = {
26 | isa = PBXContainerItemProxy;
27 | containerPortal = 7555FF73242A565900829871 /* Project object */;
28 | proxyType = 1;
29 | remoteGlobalIDString = 7555FF7A242A565900829871;
30 | remoteInfo = iosApp;
31 | };
32 | 7555FF9D242A565B00829871 /* PBXContainerItemProxy */ = {
33 | isa = PBXContainerItemProxy;
34 | containerPortal = 7555FF73242A565900829871 /* Project object */;
35 | proxyType = 1;
36 | remoteGlobalIDString = 7555FF7A242A565900829871;
37 | remoteInfo = iosApp;
38 | };
39 | /* End PBXContainerItemProxy section */
40 |
41 | /* Begin PBXCopyFilesBuildPhase section */
42 | 13B4DC3C25FA6292002FD5ED /* CopyFiles */ = {
43 | isa = PBXCopyFilesBuildPhase;
44 | buildActionMask = 2147483647;
45 | dstPath = "";
46 | dstSubfolderSpec = 10;
47 | files = (
48 | 13B4DC3D25FA629C002FD5ED /* shared.framework in CopyFiles */,
49 | );
50 | runOnlyForDeploymentPostprocessing = 0;
51 | };
52 | 7555FFB4242A642300829871 /* Embed Frameworks */ = {
53 | isa = PBXCopyFilesBuildPhase;
54 | buildActionMask = 2147483647;
55 | dstPath = "";
56 | dstSubfolderSpec = 10;
57 | files = (
58 | 7555FFB3242A642300829871 /* shared.framework in Embed Frameworks */,
59 | );
60 | name = "Embed Frameworks";
61 | runOnlyForDeploymentPostprocessing = 0;
62 | };
63 | /* End PBXCopyFilesBuildPhase section */
64 |
65 | /* Begin PBXFileReference section */
66 | 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
67 | 7555FF7E242A565900829871 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
68 | 7555FF80242A565900829871 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
69 | 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
70 | 7555FF84242A565B00829871 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
71 | 7555FF87242A565B00829871 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
72 | 7555FF8A242A565B00829871 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
73 | 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
74 | 7555FF91242A565B00829871 /* iosAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
75 | 7555FF95242A565B00829871 /* iosAppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosAppTests.swift; sourceTree = ""; };
76 | 7555FF97242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
77 | 7555FF9C242A565B00829871 /* iosAppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosAppUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
78 | 7555FFA0242A565B00829871 /* iosAppUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosAppUITests.swift; sourceTree = ""; };
79 | 7555FFA2242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
80 | 7555FFB1242A642300829871 /* shared.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = shared.framework; path = "../shared/build/xcode-frameworks/shared.framework"; sourceTree = ""; };
81 | /* End PBXFileReference section */
82 |
83 | /* Begin PBXFrameworksBuildPhase section */
84 | 7555FF78242A565900829871 /* Frameworks */ = {
85 | isa = PBXFrameworksBuildPhase;
86 | buildActionMask = 2147483647;
87 | files = (
88 | 7555FFB2242A642300829871 /* shared.framework in Frameworks */,
89 | );
90 | runOnlyForDeploymentPostprocessing = 0;
91 | };
92 | 7555FF8E242A565B00829871 /* Frameworks */ = {
93 | isa = PBXFrameworksBuildPhase;
94 | buildActionMask = 2147483647;
95 | files = (
96 | );
97 | runOnlyForDeploymentPostprocessing = 0;
98 | };
99 | 7555FF99242A565B00829871 /* Frameworks */ = {
100 | isa = PBXFrameworksBuildPhase;
101 | buildActionMask = 2147483647;
102 | files = (
103 | 13B4DC3125FA6105002FD5ED /* shared.framework in Frameworks */,
104 | );
105 | runOnlyForDeploymentPostprocessing = 0;
106 | };
107 | /* End PBXFrameworksBuildPhase section */
108 |
109 | /* Begin PBXGroup section */
110 | 7555FF72242A565900829871 = {
111 | isa = PBXGroup;
112 | children = (
113 | 7555FF7D242A565900829871 /* iosApp */,
114 | 7555FF94242A565B00829871 /* iosAppTests */,
115 | 7555FF9F242A565B00829871 /* iosAppUITests */,
116 | 7555FF7C242A565900829871 /* Products */,
117 | 7555FFB0242A642200829871 /* Frameworks */,
118 | );
119 | sourceTree = "";
120 | };
121 | 7555FF7C242A565900829871 /* Products */ = {
122 | isa = PBXGroup;
123 | children = (
124 | 7555FF7B242A565900829871 /* iosApp.app */,
125 | 7555FF91242A565B00829871 /* iosAppTests.xctest */,
126 | 7555FF9C242A565B00829871 /* iosAppUITests.xctest */,
127 | );
128 | name = Products;
129 | sourceTree = "";
130 | };
131 | 7555FF7D242A565900829871 /* iosApp */ = {
132 | isa = PBXGroup;
133 | children = (
134 | 7555FF7E242A565900829871 /* AppDelegate.swift */,
135 | 7555FF80242A565900829871 /* SceneDelegate.swift */,
136 | 7555FF82242A565900829871 /* ContentView.swift */,
137 | 7555FF84242A565B00829871 /* Assets.xcassets */,
138 | 7555FF89242A565B00829871 /* LaunchScreen.storyboard */,
139 | 7555FF8C242A565B00829871 /* Info.plist */,
140 | 7555FF86242A565B00829871 /* Preview Content */,
141 | );
142 | path = iosApp;
143 | sourceTree = "";
144 | };
145 | 7555FF86242A565B00829871 /* Preview Content */ = {
146 | isa = PBXGroup;
147 | children = (
148 | 7555FF87242A565B00829871 /* Preview Assets.xcassets */,
149 | );
150 | path = "Preview Content";
151 | sourceTree = "";
152 | };
153 | 7555FF94242A565B00829871 /* iosAppTests */ = {
154 | isa = PBXGroup;
155 | children = (
156 | 7555FF95242A565B00829871 /* iosAppTests.swift */,
157 | 7555FF97242A565B00829871 /* Info.plist */,
158 | );
159 | path = iosAppTests;
160 | sourceTree = "";
161 | };
162 | 7555FF9F242A565B00829871 /* iosAppUITests */ = {
163 | isa = PBXGroup;
164 | children = (
165 | 7555FFA0242A565B00829871 /* iosAppUITests.swift */,
166 | 7555FFA2242A565B00829871 /* Info.plist */,
167 | );
168 | path = iosAppUITests;
169 | sourceTree = "";
170 | };
171 | 7555FFB0242A642200829871 /* Frameworks */ = {
172 | isa = PBXGroup;
173 | children = (
174 | 7555FFB1242A642300829871 /* shared.framework */,
175 | );
176 | name = Frameworks;
177 | sourceTree = "";
178 | };
179 | /* End PBXGroup section */
180 |
181 | /* Begin PBXNativeTarget section */
182 | 7555FF7A242A565900829871 /* iosApp */ = {
183 | isa = PBXNativeTarget;
184 | buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */;
185 | buildPhases = (
186 | 7555FFB5242A651A00829871 /* ShellScript */,
187 | 7555FF77242A565900829871 /* Sources */,
188 | 7555FF78242A565900829871 /* Frameworks */,
189 | 7555FF79242A565900829871 /* Resources */,
190 | 7555FFB4242A642300829871 /* Embed Frameworks */,
191 | );
192 | buildRules = (
193 | );
194 | dependencies = (
195 | );
196 | name = iosApp;
197 | productName = iosApp;
198 | productReference = 7555FF7B242A565900829871 /* iosApp.app */;
199 | productType = "com.apple.product-type.application";
200 | };
201 | 7555FF90242A565B00829871 /* iosAppTests */ = {
202 | isa = PBXNativeTarget;
203 | buildConfigurationList = 7555FFA8242A565B00829871 /* Build configuration list for PBXNativeTarget "iosAppTests" */;
204 | buildPhases = (
205 | 7555FF8D242A565B00829871 /* Sources */,
206 | 7555FF8E242A565B00829871 /* Frameworks */,
207 | 7555FF8F242A565B00829871 /* Resources */,
208 | );
209 | buildRules = (
210 | );
211 | dependencies = (
212 | 7555FF93242A565B00829871 /* PBXTargetDependency */,
213 | );
214 | name = iosAppTests;
215 | productName = iosAppTests;
216 | productReference = 7555FF91242A565B00829871 /* iosAppTests.xctest */;
217 | productType = "com.apple.product-type.bundle.unit-test";
218 | };
219 | 7555FF9B242A565B00829871 /* iosAppUITests */ = {
220 | isa = PBXNativeTarget;
221 | buildConfigurationList = 7555FFAB242A565B00829871 /* Build configuration list for PBXNativeTarget "iosAppUITests" */;
222 | buildPhases = (
223 | 13B4DC3025FA60F3002FD5ED /* ShellScript */,
224 | 7555FF98242A565B00829871 /* Sources */,
225 | 7555FF99242A565B00829871 /* Frameworks */,
226 | 7555FF9A242A565B00829871 /* Resources */,
227 | 13B4DC3C25FA6292002FD5ED /* CopyFiles */,
228 | );
229 | buildRules = (
230 | );
231 | dependencies = (
232 | 7555FF9E242A565B00829871 /* PBXTargetDependency */,
233 | );
234 | name = iosAppUITests;
235 | productName = iosAppUITests;
236 | productReference = 7555FF9C242A565B00829871 /* iosAppUITests.xctest */;
237 | productType = "com.apple.product-type.bundle.ui-testing";
238 | };
239 | /* End PBXNativeTarget section */
240 |
241 | /* Begin PBXProject section */
242 | 7555FF73242A565900829871 /* Project object */ = {
243 | isa = PBXProject;
244 | attributes = {
245 | LastSwiftUpdateCheck = 1130;
246 | LastUpgradeCheck = 1130;
247 | ORGANIZATIONNAME = orgName;
248 | TargetAttributes = {
249 | 7555FF7A242A565900829871 = {
250 | CreatedOnToolsVersion = 11.3.1;
251 | };
252 | 7555FF90242A565B00829871 = {
253 | CreatedOnToolsVersion = 11.3.1;
254 | TestTargetID = 7555FF7A242A565900829871;
255 | };
256 | 7555FF9B242A565B00829871 = {
257 | CreatedOnToolsVersion = 11.3.1;
258 | TestTargetID = 7555FF7A242A565900829871;
259 | };
260 | };
261 | };
262 | buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */;
263 | compatibilityVersion = "Xcode 9.3";
264 | developmentRegion = en;
265 | hasScannedForEncodings = 0;
266 | knownRegions = (
267 | en,
268 | Base,
269 | );
270 | mainGroup = 7555FF72242A565900829871;
271 | productRefGroup = 7555FF7C242A565900829871 /* Products */;
272 | projectDirPath = "";
273 | projectRoot = "";
274 | targets = (
275 | 7555FF7A242A565900829871 /* iosApp */,
276 | 7555FF90242A565B00829871 /* iosAppTests */,
277 | 7555FF9B242A565B00829871 /* iosAppUITests */,
278 | );
279 | };
280 | /* End PBXProject section */
281 |
282 | /* Begin PBXResourcesBuildPhase section */
283 | 7555FF79242A565900829871 /* Resources */ = {
284 | isa = PBXResourcesBuildPhase;
285 | buildActionMask = 2147483647;
286 | files = (
287 | 7555FF8B242A565B00829871 /* LaunchScreen.storyboard in Resources */,
288 | 7555FF88242A565B00829871 /* Preview Assets.xcassets in Resources */,
289 | 7555FF85242A565B00829871 /* Assets.xcassets in Resources */,
290 | );
291 | runOnlyForDeploymentPostprocessing = 0;
292 | };
293 | 7555FF8F242A565B00829871 /* Resources */ = {
294 | isa = PBXResourcesBuildPhase;
295 | buildActionMask = 2147483647;
296 | files = (
297 | );
298 | runOnlyForDeploymentPostprocessing = 0;
299 | };
300 | 7555FF9A242A565B00829871 /* Resources */ = {
301 | isa = PBXResourcesBuildPhase;
302 | buildActionMask = 2147483647;
303 | files = (
304 | );
305 | runOnlyForDeploymentPostprocessing = 0;
306 | };
307 | /* End PBXResourcesBuildPhase section */
308 |
309 | /* Begin PBXShellScriptBuildPhase section */
310 | 13B4DC3025FA60F3002FD5ED /* ShellScript */ = {
311 | isa = PBXShellScriptBuildPhase;
312 | buildActionMask = 8;
313 | files = (
314 | );
315 | inputFileListPaths = (
316 | );
317 | inputPaths = (
318 | );
319 | outputFileListPaths = (
320 | );
321 | outputPaths = (
322 | );
323 | runOnlyForDeploymentPostprocessing = 1;
324 | shellPath = /bin/sh;
325 | shellScript = "# Type a script or drag a script file from your workspace to insert its path.\ncd \"$SRCROOT/..\"\n./gradlew :shared:packForXCode -PXCODE_CONFIGURATION=${CONFIGURATION}\n";
326 | };
327 | 7555FFB5242A651A00829871 /* ShellScript */ = {
328 | isa = PBXShellScriptBuildPhase;
329 | buildActionMask = 2147483647;
330 | files = (
331 | );
332 | inputFileListPaths = (
333 | );
334 | inputPaths = (
335 | );
336 | outputFileListPaths = (
337 | );
338 | outputPaths = (
339 | );
340 | runOnlyForDeploymentPostprocessing = 0;
341 | shellPath = /bin/sh;
342 | shellScript = "cd \"$SRCROOT/..\"\n./gradlew :shared:packForXCode -PXCODE_CONFIGURATION=${CONFIGURATION}\n";
343 | };
344 | /* End PBXShellScriptBuildPhase section */
345 |
346 | /* Begin PBXSourcesBuildPhase section */
347 | 7555FF77242A565900829871 /* Sources */ = {
348 | isa = PBXSourcesBuildPhase;
349 | buildActionMask = 2147483647;
350 | files = (
351 | 7555FF7F242A565900829871 /* AppDelegate.swift in Sources */,
352 | 7555FF81242A565900829871 /* SceneDelegate.swift in Sources */,
353 | 7555FF83242A565900829871 /* ContentView.swift in Sources */,
354 | );
355 | runOnlyForDeploymentPostprocessing = 0;
356 | };
357 | 7555FF8D242A565B00829871 /* Sources */ = {
358 | isa = PBXSourcesBuildPhase;
359 | buildActionMask = 2147483647;
360 | files = (
361 | 7555FF96242A565B00829871 /* iosAppTests.swift in Sources */,
362 | );
363 | runOnlyForDeploymentPostprocessing = 0;
364 | };
365 | 7555FF98242A565B00829871 /* Sources */ = {
366 | isa = PBXSourcesBuildPhase;
367 | buildActionMask = 2147483647;
368 | files = (
369 | 7555FFA1242A565B00829871 /* iosAppUITests.swift in Sources */,
370 | );
371 | runOnlyForDeploymentPostprocessing = 0;
372 | };
373 | /* End PBXSourcesBuildPhase section */
374 |
375 | /* Begin PBXTargetDependency section */
376 | 7555FF93242A565B00829871 /* PBXTargetDependency */ = {
377 | isa = PBXTargetDependency;
378 | target = 7555FF7A242A565900829871 /* iosApp */;
379 | targetProxy = 7555FF92242A565B00829871 /* PBXContainerItemProxy */;
380 | };
381 | 7555FF9E242A565B00829871 /* PBXTargetDependency */ = {
382 | isa = PBXTargetDependency;
383 | target = 7555FF7A242A565900829871 /* iosApp */;
384 | targetProxy = 7555FF9D242A565B00829871 /* PBXContainerItemProxy */;
385 | };
386 | /* End PBXTargetDependency section */
387 |
388 | /* Begin PBXVariantGroup section */
389 | 7555FF89242A565B00829871 /* LaunchScreen.storyboard */ = {
390 | isa = PBXVariantGroup;
391 | children = (
392 | 7555FF8A242A565B00829871 /* Base */,
393 | );
394 | name = LaunchScreen.storyboard;
395 | sourceTree = "";
396 | };
397 | /* End PBXVariantGroup section */
398 |
399 | /* Begin XCBuildConfiguration section */
400 | 7555FFA3242A565B00829871 /* Debug */ = {
401 | isa = XCBuildConfiguration;
402 | buildSettings = {
403 | ALWAYS_SEARCH_USER_PATHS = NO;
404 | CLANG_ANALYZER_NONNULL = YES;
405 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
406 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
407 | CLANG_CXX_LIBRARY = "libc++";
408 | CLANG_ENABLE_MODULES = YES;
409 | CLANG_ENABLE_OBJC_ARC = YES;
410 | CLANG_ENABLE_OBJC_WEAK = YES;
411 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
412 | CLANG_WARN_BOOL_CONVERSION = YES;
413 | CLANG_WARN_COMMA = YES;
414 | CLANG_WARN_CONSTANT_CONVERSION = YES;
415 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
416 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
417 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
418 | CLANG_WARN_EMPTY_BODY = YES;
419 | CLANG_WARN_ENUM_CONVERSION = YES;
420 | CLANG_WARN_INFINITE_RECURSION = YES;
421 | CLANG_WARN_INT_CONVERSION = YES;
422 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
423 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
424 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
425 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
426 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
427 | CLANG_WARN_STRICT_PROTOTYPES = YES;
428 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
429 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
430 | CLANG_WARN_UNREACHABLE_CODE = YES;
431 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
432 | COPY_PHASE_STRIP = NO;
433 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
434 | ENABLE_STRICT_OBJC_MSGSEND = YES;
435 | ENABLE_TESTABILITY = YES;
436 | GCC_C_LANGUAGE_STANDARD = gnu11;
437 | GCC_DYNAMIC_NO_PIC = NO;
438 | GCC_NO_COMMON_BLOCKS = YES;
439 | GCC_OPTIMIZATION_LEVEL = 0;
440 | GCC_PREPROCESSOR_DEFINITIONS = (
441 | "DEBUG=1",
442 | "$(inherited)",
443 | );
444 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
445 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
446 | GCC_WARN_UNDECLARED_SELECTOR = YES;
447 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
448 | GCC_WARN_UNUSED_FUNCTION = YES;
449 | GCC_WARN_UNUSED_VARIABLE = YES;
450 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
451 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
452 | MTL_FAST_MATH = YES;
453 | ONLY_ACTIVE_ARCH = YES;
454 | SDKROOT = iphoneos;
455 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
456 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
457 | };
458 | name = Debug;
459 | };
460 | 7555FFA4242A565B00829871 /* Release */ = {
461 | isa = XCBuildConfiguration;
462 | buildSettings = {
463 | ALWAYS_SEARCH_USER_PATHS = NO;
464 | CLANG_ANALYZER_NONNULL = YES;
465 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
466 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
467 | CLANG_CXX_LIBRARY = "libc++";
468 | CLANG_ENABLE_MODULES = YES;
469 | CLANG_ENABLE_OBJC_ARC = YES;
470 | CLANG_ENABLE_OBJC_WEAK = YES;
471 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
472 | CLANG_WARN_BOOL_CONVERSION = YES;
473 | CLANG_WARN_COMMA = YES;
474 | CLANG_WARN_CONSTANT_CONVERSION = YES;
475 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
476 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
477 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
478 | CLANG_WARN_EMPTY_BODY = YES;
479 | CLANG_WARN_ENUM_CONVERSION = YES;
480 | CLANG_WARN_INFINITE_RECURSION = YES;
481 | CLANG_WARN_INT_CONVERSION = YES;
482 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
483 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
484 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
485 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
486 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
487 | CLANG_WARN_STRICT_PROTOTYPES = YES;
488 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
489 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
490 | CLANG_WARN_UNREACHABLE_CODE = YES;
491 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
492 | COPY_PHASE_STRIP = NO;
493 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
494 | ENABLE_NS_ASSERTIONS = NO;
495 | ENABLE_STRICT_OBJC_MSGSEND = YES;
496 | GCC_C_LANGUAGE_STANDARD = gnu11;
497 | GCC_NO_COMMON_BLOCKS = YES;
498 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
499 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
500 | GCC_WARN_UNDECLARED_SELECTOR = YES;
501 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
502 | GCC_WARN_UNUSED_FUNCTION = YES;
503 | GCC_WARN_UNUSED_VARIABLE = YES;
504 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
505 | MTL_ENABLE_DEBUG_INFO = NO;
506 | MTL_FAST_MATH = YES;
507 | SDKROOT = iphoneos;
508 | SWIFT_COMPILATION_MODE = wholemodule;
509 | SWIFT_OPTIMIZATION_LEVEL = "-O";
510 | VALIDATE_PRODUCT = YES;
511 | };
512 | name = Release;
513 | };
514 | 7555FFA6242A565B00829871 /* Debug */ = {
515 | isa = XCBuildConfiguration;
516 | buildSettings = {
517 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
518 | CODE_SIGN_STYLE = Automatic;
519 | DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
520 | ENABLE_PREVIEWS = YES;
521 | FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks";
522 | INFOPLIST_FILE = iosApp/Info.plist;
523 | LD_RUNPATH_SEARCH_PATHS = (
524 | "$(inherited)",
525 | "@executable_path/Frameworks",
526 | );
527 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp;
528 | PRODUCT_NAME = "$(TARGET_NAME)";
529 | SWIFT_VERSION = 5.0;
530 | TARGETED_DEVICE_FAMILY = "1,2";
531 | };
532 | name = Debug;
533 | };
534 | 7555FFA7242A565B00829871 /* Release */ = {
535 | isa = XCBuildConfiguration;
536 | buildSettings = {
537 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
538 | CODE_SIGN_STYLE = Automatic;
539 | DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
540 | ENABLE_PREVIEWS = YES;
541 | FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks";
542 | INFOPLIST_FILE = iosApp/Info.plist;
543 | LD_RUNPATH_SEARCH_PATHS = (
544 | "$(inherited)",
545 | "@executable_path/Frameworks",
546 | );
547 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp;
548 | PRODUCT_NAME = "$(TARGET_NAME)";
549 | SWIFT_VERSION = 5.0;
550 | TARGETED_DEVICE_FAMILY = "1,2";
551 | };
552 | name = Release;
553 | };
554 | 7555FFA9242A565B00829871 /* Debug */ = {
555 | isa = XCBuildConfiguration;
556 | buildSettings = {
557 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
558 | BUNDLE_LOADER = "$(TEST_HOST)";
559 | CODE_SIGN_STYLE = Automatic;
560 | INFOPLIST_FILE = iosAppTests/Info.plist;
561 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
562 | LD_RUNPATH_SEARCH_PATHS = (
563 | "$(inherited)",
564 | "@executable_path/Frameworks",
565 | "@loader_path/Frameworks",
566 | );
567 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosAppTests;
568 | PRODUCT_NAME = "$(TARGET_NAME)";
569 | SWIFT_VERSION = 5.0;
570 | TARGETED_DEVICE_FAMILY = "1,2";
571 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iosApp.app/iosApp";
572 | };
573 | name = Debug;
574 | };
575 | 7555FFAA242A565B00829871 /* Release */ = {
576 | isa = XCBuildConfiguration;
577 | buildSettings = {
578 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
579 | BUNDLE_LOADER = "$(TEST_HOST)";
580 | CODE_SIGN_STYLE = Automatic;
581 | INFOPLIST_FILE = iosAppTests/Info.plist;
582 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
583 | LD_RUNPATH_SEARCH_PATHS = (
584 | "$(inherited)",
585 | "@executable_path/Frameworks",
586 | "@loader_path/Frameworks",
587 | );
588 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosAppTests;
589 | PRODUCT_NAME = "$(TARGET_NAME)";
590 | SWIFT_VERSION = 5.0;
591 | TARGETED_DEVICE_FAMILY = "1,2";
592 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iosApp.app/iosApp";
593 | };
594 | name = Release;
595 | };
596 | 7555FFAC242A565B00829871 /* Debug */ = {
597 | isa = XCBuildConfiguration;
598 | buildSettings = {
599 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
600 | ALWAYS_SEARCH_USER_PATHS = YES;
601 | CODE_SIGN_STYLE = Automatic;
602 | FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../shared/build/xcode-frameworks";
603 | INFOPLIST_FILE = iosAppUITests/Info.plist;
604 | LD_RUNPATH_SEARCH_PATHS = (
605 | "$(inherited)",
606 | "@executable_path/Frameworks",
607 | "@loader_path/Frameworks",
608 | );
609 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosAppUITests;
610 | PRODUCT_NAME = "$(TARGET_NAME)";
611 | SWIFT_VERSION = 5.0;
612 | TARGETED_DEVICE_FAMILY = "1,2";
613 | TEST_TARGET_NAME = iosApp;
614 | };
615 | name = Debug;
616 | };
617 | 7555FFAD242A565B00829871 /* Release */ = {
618 | isa = XCBuildConfiguration;
619 | buildSettings = {
620 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
621 | ALWAYS_SEARCH_USER_PATHS = YES;
622 | CODE_SIGN_STYLE = Automatic;
623 | FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../shared/build/xcode-frameworks";
624 | INFOPLIST_FILE = iosAppUITests/Info.plist;
625 | LD_RUNPATH_SEARCH_PATHS = (
626 | "$(inherited)",
627 | "@executable_path/Frameworks",
628 | "@loader_path/Frameworks",
629 | );
630 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosAppUITests;
631 | PRODUCT_NAME = "$(TARGET_NAME)";
632 | SWIFT_VERSION = 5.0;
633 | TARGETED_DEVICE_FAMILY = "1,2";
634 | TEST_TARGET_NAME = iosApp;
635 | };
636 | name = Release;
637 | };
638 | /* End XCBuildConfiguration section */
639 |
640 | /* Begin XCConfigurationList section */
641 | 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = {
642 | isa = XCConfigurationList;
643 | buildConfigurations = (
644 | 7555FFA3242A565B00829871 /* Debug */,
645 | 7555FFA4242A565B00829871 /* Release */,
646 | );
647 | defaultConfigurationIsVisible = 0;
648 | defaultConfigurationName = Release;
649 | };
650 | 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = {
651 | isa = XCConfigurationList;
652 | buildConfigurations = (
653 | 7555FFA6242A565B00829871 /* Debug */,
654 | 7555FFA7242A565B00829871 /* Release */,
655 | );
656 | defaultConfigurationIsVisible = 0;
657 | defaultConfigurationName = Release;
658 | };
659 | 7555FFA8242A565B00829871 /* Build configuration list for PBXNativeTarget "iosAppTests" */ = {
660 | isa = XCConfigurationList;
661 | buildConfigurations = (
662 | 7555FFA9242A565B00829871 /* Debug */,
663 | 7555FFAA242A565B00829871 /* Release */,
664 | );
665 | defaultConfigurationIsVisible = 0;
666 | defaultConfigurationName = Release;
667 | };
668 | 7555FFAB242A565B00829871 /* Build configuration list for PBXNativeTarget "iosAppUITests" */ = {
669 | isa = XCConfigurationList;
670 | buildConfigurations = (
671 | 7555FFAC242A565B00829871 /* Debug */,
672 | 7555FFAD242A565B00829871 /* Release */,
673 | );
674 | defaultConfigurationIsVisible = 0;
675 | defaultConfigurationName = Release;
676 | };
677 | /* End XCConfigurationList section */
678 | };
679 | rootObject = 7555FF73242A565900829871 /* Project object */;
680 | }
681 |
--------------------------------------------------------------------------------