├── shared
├── src
│ ├── desktopMain
│ │ └── kotlin
│ │ │ ├── DesktopApp.kt
│ │ │ └── com
│ │ │ └── aman
│ │ │ └── cryptotracker
│ │ │ ├── Platform.kt
│ │ │ └── network
│ │ │ └── getKtorClientEngine.kt
│ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── aman
│ │ │ └── cryptotracker
│ │ │ ├── Platform.kt
│ │ │ └── network
│ │ │ └── getKtorClientEngine.kt
│ ├── commonMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── aman
│ │ │ └── cryptotracker
│ │ │ ├── Platform.kt
│ │ │ ├── network
│ │ │ ├── KtorClient.kt
│ │ │ ├── CryptoRepository.kt
│ │ │ └── CryptoApi.kt
│ │ │ ├── Greeting.kt
│ │ │ ├── viewmodel
│ │ │ └── CryptoViewModel.kt
│ │ │ ├── ui
│ │ │ └── CryptoComposeViews.kt
│ │ │ └── entity
│ │ │ └── CryptoResponse.kt
│ ├── iosMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── aman
│ │ │ └── cryptotracker
│ │ │ ├── network
│ │ │ └── getKtorClientEngine.kt
│ │ │ └── Platform.kt
│ ├── iosTest
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── aman
│ │ │ └── cryptotracker
│ │ │ └── iosTest.kt
│ ├── commonTest
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── aman
│ │ │ └── cryptotracker
│ │ │ └── commonTest.kt
│ └── androidTest
│ │ └── kotlin
│ │ └── com
│ │ └── aman
│ │ └── cryptotracker
│ │ └── androidTest.kt
├── shared.podspec
└── build.gradle.kts
├── .idea
├── .gitignore
├── codeStyles
│ ├── codeStyleConfig.xml
│ └── Project.xml
├── compiler.xml
├── misc.xml
├── deploymentTargetDropDown.xml
├── gradle.xml
└── jarRepositories.xml
├── media
├── android.png
├── desktop.png
└── structure.png
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── iosApp
├── Podfile
├── Pods
│ ├── Target Support Files
│ │ ├── Pods-iosApp
│ │ │ ├── Pods-iosApp.modulemap
│ │ │ ├── Pods-iosApp-dummy.m
│ │ │ ├── Pods-iosApp-acknowledgements.markdown
│ │ │ ├── Pods-iosApp-umbrella.h
│ │ │ ├── Pods-iosApp.debug.xcconfig
│ │ │ ├── Pods-iosApp.release.xcconfig
│ │ │ ├── Pods-iosApp-Info.plist
│ │ │ └── Pods-iosApp-acknowledgements.plist
│ │ └── shared
│ │ │ ├── shared.debug.xcconfig
│ │ │ └── shared.release.xcconfig
│ ├── Manifest.lock
│ ├── Pods.xcodeproj
│ │ ├── xcuserdata
│ │ │ └── aman.bansal.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── xcschememanagement.plist
│ │ │ │ ├── shared.xcscheme
│ │ │ │ └── Pods-iosApp.xcscheme
│ │ └── project.pbxproj
│ └── Local Podspecs
│ │ └── shared.podspec.json
├── iosApp
│ ├── iOSApp.swift
│ ├── ContentView.swift
│ └── Info.plist
├── iosApp.xcworkspace
│ └── contents.xcworkspacedata
├── Podfile.lock
└── iosApp.xcodeproj
│ └── project.pbxproj
├── desktop
├── src
│ └── jvmMain
│ │ └── kotlin
│ │ └── main.kt
└── build.gradle.kts
├── .gitignore
├── androidApp
├── src
│ └── main
│ │ ├── res
│ │ ├── values
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ └── layout
│ │ │ └── activity_main.xml
│ │ ├── java
│ │ └── com
│ │ │ └── aman
│ │ │ └── cryptotracker
│ │ │ └── MainActivity.kt
│ │ └── AndroidManifest.xml
└── build.gradle.kts
├── gradle.properties
├── settings.gradle.kts
├── README.md
├── gradlew.bat
└── gradlew
/shared/src/desktopMain/kotlin/DesktopApp.kt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/media/android.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamanbansal/Crypto-KMM/HEAD/media/android.png
--------------------------------------------------------------------------------
/media/desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamanbansal/Crypto-KMM/HEAD/media/desktop.png
--------------------------------------------------------------------------------
/media/structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamanbansal/Crypto-KMM/HEAD/media/structure.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamanbansal/Crypto-KMM/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/iosApp/Podfile:
--------------------------------------------------------------------------------
1 | target 'iosApp' do
2 | use_frameworks!
3 | platform :ios, '14.1'
4 | pod 'shared', :path => '../shared'
5 | end
--------------------------------------------------------------------------------
/shared/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/com/aman/cryptotracker/Platform.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
2 |
3 | expect class Platform() {
4 | val platform: String
5 | }
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/desktop/src/jvmMain/kotlin/main.kt:
--------------------------------------------------------------------------------
1 | import androidx.compose.ui.window.singleWindowApplication
2 | import com.aman.cryptotracker.ui.App
3 |
4 | fun main() = singleWindowApplication {
5 | App()
6 | }
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/iosApp/iosApp/iOSApp.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 |
3 | @main
4 | struct iOSApp: App {
5 | var body: some Scene {
6 | WindowGroup {
7 | ContentView()
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/com/aman/cryptotracker/network/KtorClient.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.network
2 |
3 | import io.ktor.client.engine.*
4 |
5 | expect fun getKtorClientEngine():HttpClientEngine
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/com/aman/cryptotracker/Greeting.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
2 |
3 | class Greeting {
4 | fun greeting(): String {
5 | return "Hello, ${Platform().platform}!"
6 | }
7 | }
--------------------------------------------------------------------------------
/shared/src/desktopMain/kotlin/com/aman/cryptotracker/Platform.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
2 |
3 | actual class Platform actual constructor() {
4 | actual val platform: String
5 | get() = "Desktop"
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 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/
5 | .DS_Store
6 | /build
7 | */build
8 | /captures
9 | .externalNativeBuild
10 | .cxx
11 | local.properties
12 | package com.aman.cryptotracker.network.ApiKey
--------------------------------------------------------------------------------
/shared/src/androidMain/kotlin/com/aman/cryptotracker/Platform.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
2 |
3 | actual class Platform actual constructor() {
4 | actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
5 | }
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6200EE
4 | #3700B3
5 | #03DAC5
6 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | #Gradle
2 | org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"
3 |
4 | #Kotlin
5 | kotlin.code.style=official
6 |
7 | #Android
8 | android.useAndroidX=true
9 |
10 | org.jetbrains.compose.experimental.uikit.enabled=true
--------------------------------------------------------------------------------
/shared/src/desktopMain/kotlin/com/aman/cryptotracker/network/getKtorClientEngine.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.network
2 |
3 | import io.ktor.client.engine.*
4 | import io.ktor.client.engine.java.*
5 |
6 | actual fun getKtorClientEngine(): HttpClientEngine = Java.create()
--------------------------------------------------------------------------------
/shared/src/androidMain/kotlin/com/aman/cryptotracker/network/getKtorClientEngine.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.network
2 |
3 | import io.ktor.client.engine.*
4 | import io.ktor.client.engine.android.*
5 |
6 | actual fun getKtorClientEngine(): HttpClientEngine = Android.create()
7 |
--------------------------------------------------------------------------------
/shared/src/iosMain/kotlin/com/aman/cryptotracker/network/getKtorClientEngine.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.network
2 |
3 | import io.ktor.client.engine.HttpClientEngine
4 | import io.ktor.client.engine.darwin.Darwin
5 |
6 |
7 | actual fun getKtorClientEngine(): HttpClientEngine = Darwin.create()
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google()
4 | jcenter()
5 | gradlePluginPortal()
6 | mavenCentral()
7 | }
8 | }
9 |
10 | rootProject.name = "CryptoTracker"
11 | include(":androidApp")
12 | include(":shared")
13 | include(":desktop")
--------------------------------------------------------------------------------
/shared/src/iosMain/kotlin/com/aman/cryptotracker/Platform.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
2 |
3 | import platform.UIKit.UIDevice
4 |
5 | actual class Platform actual constructor() {
6 | actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
7 | }
--------------------------------------------------------------------------------
/iosApp/iosApp.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/shared/src/iosTest/kotlin/com/aman/cryptotracker/iosTest.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
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 | }
--------------------------------------------------------------------------------
/iosApp/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - shared (1.0)
3 |
4 | DEPENDENCIES:
5 | - shared (from `../shared`)
6 |
7 | EXTERNAL SOURCES:
8 | shared:
9 | :path: "../shared"
10 |
11 | SPEC CHECKSUMS:
12 | shared: 2d3b24a8fe27b7d9e65b8d075a9672fbc6a1aa10
13 |
14 | PODFILE CHECKSUM: f282da88f39e69507b0a255187c8a6b644477756
15 |
16 | COCOAPODS: 1.10.2
17 |
--------------------------------------------------------------------------------
/shared/src/commonTest/kotlin/com/aman/cryptotracker/commonTest.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
2 |
3 | import kotlin.test.Test
4 | import kotlin.test.assertTrue
5 |
6 | class CommonGreetingTest {
7 |
8 | @Test
9 | fun testExample() {
10 | assertTrue(Greeting().greeting().contains("Hello"), "Check 'Hello' is mentioned")
11 | }
12 | }
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/iosApp/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - shared (1.0)
3 |
4 | DEPENDENCIES:
5 | - shared (from `../shared`)
6 |
7 | EXTERNAL SOURCES:
8 | shared:
9 | :path: "../shared"
10 |
11 | SPEC CHECKSUMS:
12 | shared: 2d3b24a8fe27b7d9e65b8d075a9672fbc6a1aa10
13 |
14 | PODFILE CHECKSUM: f282da88f39e69507b0a255187c8a6b644477756
15 |
16 | COCOAPODS: 1.10.2
17 |
--------------------------------------------------------------------------------
/iosApp/iosApp/ContentView.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 | import shared
3 |
4 | struct ContentView: View {
5 | let greet = Greeting().greeting()
6 |
7 | var body: some View {
8 | Text(greet)
9 | }
10 | }
11 |
12 | struct ContentView_Previews: PreviewProvider {
13 | static var previews: some View {
14 | ContentView()
15 | }
16 | }
--------------------------------------------------------------------------------
/shared/src/androidTest/kotlin/com/aman/cryptotracker/androidTest.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
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 | }
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/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/java/com/aman/cryptotracker/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker
2 |
3 | import android.os.Bundle
4 | import androidx.activity.compose.setContent
5 | import androidx.appcompat.app.AppCompatActivity
6 | import androidx.compose.foundation.layout.*
7 | import com.aman.cryptotracker.ui.App
8 |
9 |
10 | class MainActivity : AppCompatActivity() {
11 |
12 | override fun onCreate(savedInstanceState: Bundle?) {
13 | super.onCreate(savedInstanceState)
14 |
15 | setContent {
16 | App()
17 | }
18 |
19 | }
20 | }
--------------------------------------------------------------------------------
/iosApp/Pods/Pods.xcodeproj/xcuserdata/aman.bansal.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Pods-iosApp.xcscheme
8 |
9 | isShown
10 |
11 |
12 | shared.xcscheme
13 |
14 | isShown
15 |
16 |
17 |
18 | SuppressBuildableAutocreation
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/com/aman/cryptotracker/network/CryptoRepository.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.network
2 |
3 | import com.aman.cryptotracker.entity.Data
4 |
5 |
6 | /**
7 | * Created by Aman Bansal on 22/05/21.
8 | */
9 | class CryptoRepository(private val api: CryptoApi) {
10 |
11 |
12 | @Throws(Exception::class)
13 | suspend fun getCryptoData(): List {
14 |
15 | val data = api.getCryptoData()
16 |
17 | if (data.status?.errorCode == 0) {
18 | return data.data!!
19 | } else {
20 | throw Exception("Api Error")
21 | }
22 | }
23 |
24 |
25 | }
--------------------------------------------------------------------------------
/.idea/deploymentTargetDropDown.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/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}/../../shared/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 "shared"
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}/../../shared/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 "shared"
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 |
--------------------------------------------------------------------------------
/androidApp/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
11 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
20 |
21 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/shared/shared.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/shared
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | KOTLIN_PROJECT_PATH = :shared
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}/../../shared
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | PRODUCT_MODULE_NAME = shared
14 | SKIP_INSTALL = YES
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/iosApp/Pods/Target Support Files/shared/shared.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/shared
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | KOTLIN_PROJECT_PATH = :shared
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}/../../shared
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | PRODUCT_MODULE_NAME = shared
14 | SKIP_INSTALL = YES
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
18 |
19 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/desktop/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.jetbrains.compose.compose
2 | import org.jetbrains.compose.desktop.application.dsl.TargetFormat
3 |
4 | plugins {
5 | kotlin("multiplatform") // kotlin("jvm") doesn't work well in IDEA/AndroidStudio (https://github.com/JetBrains/compose-jb/issues/22)
6 | id("org.jetbrains.compose")
7 | }
8 |
9 | kotlin {
10 | jvm {
11 | withJava()
12 | }
13 | sourceSets {
14 | val jvmMain by getting {
15 | dependencies {
16 | implementation(compose.desktop.currentOs)
17 | implementation(project(":shared"))
18 | }
19 | }
20 | }
21 | }
22 |
23 | compose.desktop {
24 | application {
25 | mainClass = "MainKt"
26 |
27 | nativeDistributions {
28 | targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
29 | packageName = "KotlinMultiplatformComposeDesktopApplication"
30 | packageVersion = "1.0.0"
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/androidApp/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.application")
3 | kotlin("android")
4 | id("org.jetbrains.compose")
5 | }
6 |
7 | android {
8 | compileSdk = 33
9 | defaultConfig {
10 | applicationId = "com.aman.cryptotracker"
11 | minSdk = 23
12 | targetSdk = 33
13 | versionCode = 1
14 | versionName = "1.0"
15 | }
16 | buildTypes {
17 | getByName("release") {
18 | isMinifyEnabled = true
19 | }
20 | }
21 |
22 | buildFeatures {
23 | compose = true
24 | }
25 |
26 | compileOptions {
27 | sourceCompatibility = JavaVersion.VERSION_1_8
28 | targetCompatibility = JavaVersion.VERSION_1_8
29 | }
30 |
31 | kotlinOptions {
32 | jvmTarget = "1.8"
33 | }
34 |
35 | composeOptions {
36 | kotlinCompilerExtensionVersion = Dependencies.Compose.composeVersion
37 | }
38 |
39 | }
40 |
41 | dependencies {
42 | implementation(project(":shared"))
43 | implementation("com.google.android.material:material:1.3.0")
44 | implementation("androidx.appcompat:appcompat:1.2.0")
45 | implementation("androidx.constraintlayout:constraintlayout:2.0.4")
46 |
47 |
48 | implementation(Dependencies.Compose.activity)
49 |
50 | }
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/com/aman/cryptotracker/viewmodel/CryptoViewModel.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.viewmodel
2 |
3 | import com.aman.cryptotracker.entity.Data
4 | import com.aman.cryptotracker.network.CryptoRepository
5 | import kotlinx.coroutines.CoroutineScope
6 | import kotlinx.coroutines.Dispatchers
7 | import kotlinx.coroutines.SupervisorJob
8 | import kotlinx.coroutines.flow.MutableStateFlow
9 | import kotlinx.coroutines.flow.StateFlow
10 | import kotlinx.coroutines.launch
11 |
12 |
13 | /**
14 | * Created by Aman Bansal on 30/05/21.
15 | */
16 |
17 | /**
18 | * This is not actual android AAC ViewModel. I couldn't think of better so I used this :p
19 | */
20 | class CryptoViewModel (private val cryptoRepository:CryptoRepository) {
21 |
22 |
23 | private val mainScope = CoroutineScope(SupervisorJob())
24 | private val _list = MutableStateFlow>(emptyList())
25 | val list:StateFlow> = _list
26 |
27 | fun getCryptoData(){
28 |
29 | mainScope.launch {
30 |
31 | try {
32 | val data = cryptoRepository.getCryptoData()
33 | _list.value = data
34 |
35 | } catch (e: Exception) {
36 | e.printStackTrace()
37 | //todo handle error
38 | }
39 | }
40 |
41 | }
42 | }
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
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 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/iosApp/Pods/Local Podspecs/shared.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "shared",
3 | "version": "1.0",
4 | "homepage": "Link to the Shared Module homepage",
5 | "source": {
6 | "http": ""
7 | },
8 | "authors": "",
9 | "license": "",
10 | "summary": "Some description for the Shared Module",
11 | "vendored_frameworks": "build/cocoapods/framework/shared.framework",
12 | "libraries": "c++",
13 | "platforms": {
14 | "ios": "14.1"
15 | },
16 | "pod_target_xcconfig": {
17 | "KOTLIN_PROJECT_PATH": ":shared",
18 | "PRODUCT_MODULE_NAME": "shared"
19 | },
20 | "script_phases": [
21 | {
22 | "name": "Build shared",
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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | This is the codebase of Crypto currency Tracking Kotlin Multiplatform App.
3 |
4 |
5 | # Components
6 | #### Shared Components
7 | 1. Ktor (Network Client)
8 | 1. SQL Delight (Local DB)
9 |
10 | #### Android Specific Components
11 | 1. Jetpack Compose
12 |
13 | #### iOS Specific Components
14 | - SwiftUI (PRs are welcome)
15 |
16 | #### JVM Specific Components
17 | - Jetpack compose for desktop
18 |
19 | ### TODOs
20 | - Local DB implementation
21 | - SwiftUI
22 | - ~~Jetpack compose for desktop~~
23 |
24 | ## Screenshots
25 | ### Android
26 |
27 |
28 | ### Desktop
29 |
30 |
31 |
32 | ## Structure
33 |
34 |
35 |
36 |
37 | ### Android Studio Version
38 | I've been using "Android Studio Arctic Fox (2020.3.1) Canary 8".
39 |
40 |
41 | ### Kotlin Version
42 | 1.5
43 |
44 | ### Setup
45 | - This project is using [CoinMarketCap](https://coinmarketcap.com/)'s API to get coins' data. Get your API key from [here](https://coinmarketcap.com/api/)
46 | - Then create file in `ApiKey` in `com.aman.cryptotracker.network` in `shared` module
47 |
48 | ```
49 | object ApiKey {
50 | const val COIN_MARKET_KEY = "Your API key"
51 | }
52 | ```
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/com/aman/cryptotracker/network/CryptoApi.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.network
2 |
3 | import com.aman.cryptotracker.entity.CryptoResponse
4 | import com.aman.cryptotracker.network.ApiKey.COIN_MARKET_KEY
5 | import io.ktor.client.*
6 | import io.ktor.client.call.*
7 | import io.ktor.client.plugins.contentnegotiation.*
8 | import io.ktor.client.request.*
9 | import io.ktor.serialization.kotlinx.json.*
10 | import kotlinx.coroutines.Dispatchers
11 | import kotlinx.coroutines.withContext
12 | import kotlinx.serialization.json.Json
13 |
14 | /**
15 | * Created by Aman Bansal on 22/05/21.
16 | */
17 | class CryptoApi {
18 |
19 | private val httpClient by lazy {
20 | HttpClient(getKtorClientEngine()) {
21 | install(ContentNegotiation) {
22 | json(Json {
23 | ignoreUnknownKeys = true
24 | isLenient = true
25 | })
26 | }
27 |
28 | }
29 | }
30 |
31 |
32 | suspend fun getCryptoData(limit: Int = DEFAULT_LIMIT): CryptoResponse =
33 | withContext(Dispatchers.Default) {
34 |
35 | return@withContext httpClient.get(URL) {
36 | parameter("start", 1)
37 | parameter("limit", limit)
38 | parameter("convert", "USD")
39 |
40 | headers {
41 | append("X-CMC_PRO_API_KEY", COIN_MARKET_KEY)
42 | }
43 |
44 | }.body()
45 | }
46 |
47 | companion object {
48 | private const val DEFAULT_LIMIT = 50
49 | private const val URL =
50 | "https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest"
51 | }
52 | }
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/shared/shared.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |spec|
2 | spec.name = 'shared'
3 | spec.version = '1.0'
4 | spec.homepage = 'Link to the Shared Module homepage'
5 | spec.source = { :http=> ''}
6 | spec.authors = ''
7 | spec.license = ''
8 | spec.summary = 'Some description for the Shared Module'
9 | spec.vendored_frameworks = 'build/cocoapods/framework/shared.framework'
10 | spec.libraries = 'c++'
11 | spec.ios.deployment_target = '14.1'
12 |
13 |
14 | spec.pod_target_xcconfig = {
15 | 'KOTLIN_PROJECT_PATH' => ':shared',
16 | 'PRODUCT_MODULE_NAME' => 'shared',
17 | }
18 |
19 | spec.script_phases = [
20 | {
21 | :name => 'Build shared',
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
--------------------------------------------------------------------------------
/iosApp/Pods/Pods.xcodeproj/xcuserdata/aman.bansal.xcuserdatad/xcschemes/shared.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/iosApp/Pods/Pods.xcodeproj/xcuserdata/aman.bansal.xcuserdatad/xcschemes/Pods-iosApp.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
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 |
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/com/aman/cryptotracker/ui/CryptoComposeViews.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.ui
2 |
3 | import androidx.compose.foundation.background
4 | import androidx.compose.foundation.layout.*
5 | import androidx.compose.foundation.lazy.LazyColumn
6 | import androidx.compose.foundation.lazy.items
7 | import androidx.compose.foundation.shape.RoundedCornerShape
8 | import androidx.compose.material.Card
9 | import androidx.compose.material.MaterialTheme
10 | import androidx.compose.material.Text
11 | import androidx.compose.runtime.Composable
12 | import androidx.compose.runtime.collectAsState
13 | import androidx.compose.runtime.getValue
14 | import androidx.compose.ui.Modifier
15 | import androidx.compose.ui.graphics.Color
16 | import androidx.compose.ui.unit.dp
17 | import com.aman.cryptotracker.entity.Data
18 | import com.aman.cryptotracker.network.CryptoApi
19 | import com.aman.cryptotracker.network.CryptoRepository
20 | import com.aman.cryptotracker.viewmodel.CryptoViewModel
21 |
22 |
23 | val viewModel = CryptoViewModel(CryptoRepository((CryptoApi())))
24 |
25 |
26 | @Composable
27 | fun App() {
28 |
29 | MaterialTheme {
30 | CryptoListView(viewModel)
31 | }
32 |
33 | viewModel.getCryptoData()
34 | }
35 |
36 | @Composable
37 | fun CryptoListView(viewModel: CryptoViewModel) {
38 | val dataList by viewModel.list.collectAsState()
39 |
40 | return LazyColumn(
41 | verticalArrangement = Arrangement.spacedBy(10.dp),
42 | modifier = Modifier.fillMaxWidth()
43 | ) {
44 |
45 | items(dataList) { data ->
46 |
47 | CoinItem(data)
48 | }
49 |
50 | }
51 | }
52 |
53 | @Composable
54 | fun CoinItem(data: Data) {
55 | Card(
56 | shape = RoundedCornerShape(8.dp),
57 | elevation = 4.dp,
58 | modifier = Modifier
59 | .fillMaxWidth()
60 | .background(color = Color.White)
61 |
62 | ) {
63 | Column(Modifier.padding(5.dp)) {
64 |
65 | Row(
66 | horizontalArrangement = Arrangement.SpaceBetween,
67 | modifier = Modifier.fillMaxWidth()
68 | ) {
69 |
70 | Text(
71 | text = data.name.toString(),
72 | modifier = Modifier.padding(2.dp),
73 | style = MaterialTheme.typography.h5
74 | )
75 | Text(text = "$${data.quote?.uSD?.price?.toFloat()}")
76 | }
77 | Spacer(modifier = Modifier.padding(4.dp))
78 | Text(text = "${data.symbol}")
79 | }
80 |
81 | }
82 | }
--------------------------------------------------------------------------------
/shared/src/commonMain/kotlin/com/aman/cryptotracker/entity/CryptoResponse.kt:
--------------------------------------------------------------------------------
1 | package com.aman.cryptotracker.entity
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 |
7 | /**
8 | * Created by Aman Bansal on 16/05/21.
9 | */
10 | @Serializable
11 | data class CryptoResponse(
12 | @SerialName("data")
13 | val `data`: List?,
14 | @SerialName("status")
15 | val status: Status?
16 | )
17 |
18 |
19 | @Serializable
20 | data class Data(
21 | @SerialName("id")
22 | val id: Int?,
23 | @SerialName("name")
24 | val name: String?,
25 | @SerialName("symbol")
26 | val symbol: String?,
27 | @SerialName("slug")
28 | val slug: String?,
29 | @SerialName("num_market_pairs")
30 | val numMarketPairs: Int?,
31 | @SerialName("date_added")
32 | val dateAdded: String?,
33 | @SerialName("tags")
34 | val tags: List?,
35 | @SerialName("max_supply")
36 | val maxSupply: Double?,
37 | @SerialName("circulating_supply")
38 | val circulatingSupply: Double?,
39 | @SerialName("total_supply")
40 | val totalSupply: Double?,
41 | @SerialName("cmc_rank")
42 | val cmcRank: Int?,
43 | @SerialName("last_updated")
44 | val lastUpdated: String?,
45 | @SerialName("quote")
46 | val quote: Quote?
47 | )
48 |
49 | @Serializable
50 | data class Status(
51 | @SerialName("credit_count")
52 | val creditCount: Int?,
53 | @SerialName("elapsed")
54 | val elapsed: Int?,
55 | @SerialName("error_code")
56 | val errorCode: Int?,
57 | @SerialName("error_message")
58 | val errorMessage: String?,
59 | @SerialName("notice")
60 | val notice: String?,
61 | @SerialName("timestamp")
62 | val timestamp: String?,
63 | @SerialName("total_count")
64 | val totalCount: Int?
65 | )
66 |
67 | @Serializable
68 | data class Quote(
69 | @SerialName("USD")
70 | val uSD: USD?
71 | )
72 |
73 | @Serializable
74 | data class USD(
75 | @SerialName("price")
76 | val price: Double?,
77 | @SerialName("volume_24h")
78 | val volume24h: Double?,
79 | @SerialName("percent_change_1h")
80 | val percentChange1h: Double?,
81 | @SerialName("percent_change_24h")
82 | val percentChange24h: Double?,
83 | @SerialName("percent_change_7d")
84 | val percentChange7d: Double?,
85 | @SerialName("percent_change_30d")
86 | val percentChange30d: Double?,
87 | @SerialName("percent_change_60d")
88 | val percentChange60d: Double?,
89 | @SerialName("percent_change_90d")
90 | val percentChange90d: Double?,
91 | @SerialName("market_cap")
92 | val marketCap: Double?,
93 | @SerialName("last_updated")
94 | val lastUpdated: String?
95 | )
96 |
97 |
98 |
--------------------------------------------------------------------------------
/shared/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | kotlin("multiplatform")
3 | kotlin("native.cocoapods")
4 | id("com.android.library")
5 | kotlin(Dependencies.Plugins.serialization)
6 | id(Dependencies.Plugins.sqlDelight)
7 | id("org.jetbrains.compose")
8 | }
9 |
10 | version = "1.0"
11 |
12 | kotlin {
13 | android()
14 | jvm("desktop")
15 |
16 | iosX64()
17 | iosArm64()
18 | iosSimulatorArm64()
19 |
20 | cocoapods {
21 | summary = "Some description for the Shared Module"
22 | homepage = "Link to the Shared Module homepage"
23 | ios.deploymentTarget = "14.1"
24 | framework {
25 | baseName = "shared"
26 | }
27 | podfile = project.file("../iosApp/Podfile")
28 | }
29 |
30 |
31 | sourceSets {
32 | val commonMain by getting {
33 | dependencies {
34 | implementation(Dependencies.Ktor.core)
35 | implementation(Dependencies.Ktor.contentNegotiation)
36 | implementation(Dependencies.Ktor.clientSerialization)
37 | implementation(Dependencies.Ktor.logging)
38 | implementation(Dependencies.Ktor.serialization)
39 | implementation(Dependencies.SQLDelight.runtime)
40 | api(compose.runtime)
41 | api(compose.foundation)
42 | api(compose.material)
43 |
44 | }
45 | }
46 | val commonTest by getting {
47 | dependencies {
48 | implementation(kotlin("test-common"))
49 | implementation(kotlin("test-annotations-common"))
50 | }
51 | }
52 | val androidMain by getting {
53 | dependencies {
54 | implementation(Dependencies.Ktor.androidClient)
55 | implementation(Dependencies.SQLDelight.androidDriver)
56 | }
57 | }
58 |
59 | val androidTest by getting {
60 | dependencies {
61 | implementation(kotlin("test-junit"))
62 | implementation("junit:junit:4.13.2")
63 | }
64 | }
65 |
66 | val iosX64Main by getting
67 | val iosArm64Main by getting
68 | val iosSimulatorArm64Main by getting
69 | val iosMain by creating {
70 | dependsOn(commonMain)
71 | iosX64Main.dependsOn(this)
72 | iosArm64Main.dependsOn(this)
73 | iosSimulatorArm64Main.dependsOn(this)
74 | dependencies {
75 | implementation(Dependencies.Ktor.iosClient)
76 | implementation(Dependencies.SQLDelight.nativeDriver)
77 | }
78 | }
79 | val iosX64Test by getting
80 | val iosArm64Test by getting
81 | val iosSimulatorArm64Test by getting
82 | val iosTest by creating {
83 | dependsOn(commonTest)
84 | iosX64Test.dependsOn(this)
85 | iosArm64Test.dependsOn(this)
86 | iosSimulatorArm64Test.dependsOn(this)
87 | }
88 |
89 | val desktopMain by getting {
90 | dependencies {
91 | implementation(Dependencies.Ktor.javaClient)
92 | }
93 | }
94 | }
95 | }
96 |
97 | android {
98 | compileSdk = 33
99 | sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
100 | defaultConfig {
101 | minSdk = 23
102 | }
103 | }
104 |
105 | sqldelight {
106 | database(name = "CryptoDatabase") { // This will be the name of the generated database class.
107 | packageName = "database"
108 | }
109 | }
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | xmlns:android
23 |
24 | ^$
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | xmlns:.*
34 |
35 | ^$
36 |
37 |
38 | BY_NAME
39 |
40 |
41 |
42 |
43 |
44 |
45 | .*:id
46 |
47 | http://schemas.android.com/apk/res/android
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | .*:name
57 |
58 | http://schemas.android.com/apk/res/android
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | name
68 |
69 | ^$
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | style
79 |
80 | ^$
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 | .*
90 |
91 | ^$
92 |
93 |
94 | BY_NAME
95 |
96 |
97 |
98 |
99 |
100 |
101 | .*
102 |
103 | http://schemas.android.com/apk/res/android
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 | .*
113 |
114 | .*
115 |
116 |
117 | BY_NAME
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
--------------------------------------------------------------------------------
/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 = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iOSApp.swift */; };
11 | 55F6213B08ADD0D71922401D /* Pods_iosApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C61B6A48E03A6C31526927B /* Pods_iosApp.framework */; };
12 | 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; };
13 | /* End PBXBuildFile section */
14 |
15 | /* Begin PBXFileReference section */
16 | 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; };
17 | 57573530B0202B27A7316A13 /* 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 = ""; };
18 | 68D25F655AFC61595696B76A /* 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 = ""; };
19 | 6C61B6A48E03A6C31526927B /* Pods_iosApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
20 | 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
21 | 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
22 | 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
23 | /* End PBXFileReference section */
24 |
25 | /* Begin PBXFrameworksBuildPhase section */
26 | 0BE4D4A3BA45EF6F93929607 /* Frameworks */ = {
27 | isa = PBXFrameworksBuildPhase;
28 | buildActionMask = 2147483647;
29 | files = (
30 | 55F6213B08ADD0D71922401D /* Pods_iosApp.framework in Frameworks */,
31 | );
32 | runOnlyForDeploymentPostprocessing = 0;
33 | };
34 | /* End PBXFrameworksBuildPhase section */
35 |
36 | /* Begin PBXGroup section */
37 | 21053752F7AC5D2B6224C860 /* Pods */ = {
38 | isa = PBXGroup;
39 | children = (
40 | 57573530B0202B27A7316A13 /* Pods-iosApp.debug.xcconfig */,
41 | 68D25F655AFC61595696B76A /* Pods-iosApp.release.xcconfig */,
42 | );
43 | name = Pods;
44 | path = Pods;
45 | sourceTree = "";
46 | };
47 | 422BA38DE8FB85308157B928 /* Frameworks */ = {
48 | isa = PBXGroup;
49 | children = (
50 | 6C61B6A48E03A6C31526927B /* Pods_iosApp.framework */,
51 | );
52 | name = Frameworks;
53 | sourceTree = "";
54 | };
55 | 7555FF72242A565900829871 = {
56 | isa = PBXGroup;
57 | children = (
58 | 7555FF7D242A565900829871 /* iosApp */,
59 | 7555FF7C242A565900829871 /* Products */,
60 | 21053752F7AC5D2B6224C860 /* Pods */,
61 | 422BA38DE8FB85308157B928 /* Frameworks */,
62 | );
63 | sourceTree = "";
64 | };
65 | 7555FF7C242A565900829871 /* Products */ = {
66 | isa = PBXGroup;
67 | children = (
68 | 7555FF7B242A565900829871 /* iosApp.app */,
69 | );
70 | name = Products;
71 | sourceTree = "";
72 | };
73 | 7555FF7D242A565900829871 /* iosApp */ = {
74 | isa = PBXGroup;
75 | children = (
76 | 7555FF82242A565900829871 /* ContentView.swift */,
77 | 7555FF8C242A565B00829871 /* Info.plist */,
78 | 2152FB032600AC8F00CF470E /* iOSApp.swift */,
79 | );
80 | path = iosApp;
81 | sourceTree = "";
82 | };
83 | /* End PBXGroup section */
84 |
85 | /* Begin PBXNativeTarget section */
86 | 7555FF7A242A565900829871 /* iosApp */ = {
87 | isa = PBXNativeTarget;
88 | buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */;
89 | buildPhases = (
90 | 963ED78AD42161AD8FCAE00D /* [CP] Check Pods Manifest.lock */,
91 | 7555FF77242A565900829871 /* Sources */,
92 | 7555FF79242A565900829871 /* Resources */,
93 | 0BE4D4A3BA45EF6F93929607 /* Frameworks */,
94 | );
95 | buildRules = (
96 | );
97 | dependencies = (
98 | );
99 | name = iosApp;
100 | productName = iosApp;
101 | productReference = 7555FF7B242A565900829871 /* iosApp.app */;
102 | productType = "com.apple.product-type.application";
103 | };
104 | /* End PBXNativeTarget section */
105 |
106 | /* Begin PBXProject section */
107 | 7555FF73242A565900829871 /* Project object */ = {
108 | isa = PBXProject;
109 | attributes = {
110 | LastSwiftUpdateCheck = 1130;
111 | LastUpgradeCheck = 1130;
112 | ORGANIZATIONNAME = orgName;
113 | TargetAttributes = {
114 | 7555FF7A242A565900829871 = {
115 | CreatedOnToolsVersion = 11.3.1;
116 | };
117 | };
118 | };
119 | buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */;
120 | compatibilityVersion = "Xcode 9.3";
121 | developmentRegion = en;
122 | hasScannedForEncodings = 0;
123 | knownRegions = (
124 | en,
125 | Base,
126 | );
127 | mainGroup = 7555FF72242A565900829871;
128 | productRefGroup = 7555FF7C242A565900829871 /* Products */;
129 | projectDirPath = "";
130 | projectRoot = "";
131 | targets = (
132 | 7555FF7A242A565900829871 /* iosApp */,
133 | );
134 | };
135 | /* End PBXProject section */
136 |
137 | /* Begin PBXResourcesBuildPhase section */
138 | 7555FF79242A565900829871 /* Resources */ = {
139 | isa = PBXResourcesBuildPhase;
140 | buildActionMask = 2147483647;
141 | files = (
142 | );
143 | runOnlyForDeploymentPostprocessing = 0;
144 | };
145 | /* End PBXResourcesBuildPhase section */
146 |
147 | /* Begin PBXShellScriptBuildPhase section */
148 | 963ED78AD42161AD8FCAE00D /* [CP] Check Pods Manifest.lock */ = {
149 | isa = PBXShellScriptBuildPhase;
150 | buildActionMask = 2147483647;
151 | files = (
152 | );
153 | inputFileListPaths = (
154 | );
155 | inputPaths = (
156 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
157 | "${PODS_ROOT}/Manifest.lock",
158 | );
159 | name = "[CP] Check Pods Manifest.lock";
160 | outputFileListPaths = (
161 | );
162 | outputPaths = (
163 | "$(DERIVED_FILE_DIR)/Pods-iosApp-checkManifestLockResult.txt",
164 | );
165 | runOnlyForDeploymentPostprocessing = 0;
166 | shellPath = /bin/sh;
167 | 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";
168 | showEnvVarsInLog = 0;
169 | };
170 | /* End PBXShellScriptBuildPhase section */
171 |
172 | /* Begin PBXSourcesBuildPhase section */
173 | 7555FF77242A565900829871 /* Sources */ = {
174 | isa = PBXSourcesBuildPhase;
175 | buildActionMask = 2147483647;
176 | files = (
177 | 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */,
178 | 7555FF83242A565900829871 /* ContentView.swift in Sources */,
179 | );
180 | runOnlyForDeploymentPostprocessing = 0;
181 | };
182 | /* End PBXSourcesBuildPhase section */
183 |
184 | /* Begin XCBuildConfiguration section */
185 | 7555FFA3242A565B00829871 /* Debug */ = {
186 | isa = XCBuildConfiguration;
187 | buildSettings = {
188 | ALWAYS_SEARCH_USER_PATHS = NO;
189 | CLANG_ANALYZER_NONNULL = YES;
190 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
191 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
192 | CLANG_CXX_LIBRARY = "libc++";
193 | CLANG_ENABLE_MODULES = YES;
194 | CLANG_ENABLE_OBJC_ARC = YES;
195 | CLANG_ENABLE_OBJC_WEAK = YES;
196 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
197 | CLANG_WARN_BOOL_CONVERSION = YES;
198 | CLANG_WARN_COMMA = YES;
199 | CLANG_WARN_CONSTANT_CONVERSION = YES;
200 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
201 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
202 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
203 | CLANG_WARN_EMPTY_BODY = YES;
204 | CLANG_WARN_ENUM_CONVERSION = YES;
205 | CLANG_WARN_INFINITE_RECURSION = YES;
206 | CLANG_WARN_INT_CONVERSION = YES;
207 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
208 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
209 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
210 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
211 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
212 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
213 | CLANG_WARN_STRICT_PROTOTYPES = YES;
214 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
215 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
216 | CLANG_WARN_UNREACHABLE_CODE = YES;
217 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
218 | COPY_PHASE_STRIP = NO;
219 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
220 | ENABLE_STRICT_OBJC_MSGSEND = YES;
221 | ENABLE_TESTABILITY = YES;
222 | GCC_C_LANGUAGE_STANDARD = gnu11;
223 | GCC_DYNAMIC_NO_PIC = NO;
224 | GCC_NO_COMMON_BLOCKS = YES;
225 | GCC_OPTIMIZATION_LEVEL = 0;
226 | GCC_PREPROCESSOR_DEFINITIONS = (
227 | "DEBUG=1",
228 | "$(inherited)",
229 | );
230 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
231 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
232 | GCC_WARN_UNDECLARED_SELECTOR = YES;
233 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
234 | GCC_WARN_UNUSED_FUNCTION = YES;
235 | GCC_WARN_UNUSED_VARIABLE = YES;
236 | IPHONEOS_DEPLOYMENT_TARGET = 14.1;
237 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
238 | MTL_FAST_MATH = YES;
239 | ONLY_ACTIVE_ARCH = YES;
240 | SDKROOT = iphoneos;
241 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
242 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
243 | };
244 | name = Debug;
245 | };
246 | 7555FFA4242A565B00829871 /* Release */ = {
247 | isa = XCBuildConfiguration;
248 | buildSettings = {
249 | ALWAYS_SEARCH_USER_PATHS = NO;
250 | CLANG_ANALYZER_NONNULL = YES;
251 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
252 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
253 | CLANG_CXX_LIBRARY = "libc++";
254 | CLANG_ENABLE_MODULES = YES;
255 | CLANG_ENABLE_OBJC_ARC = YES;
256 | CLANG_ENABLE_OBJC_WEAK = YES;
257 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
258 | CLANG_WARN_BOOL_CONVERSION = YES;
259 | CLANG_WARN_COMMA = YES;
260 | CLANG_WARN_CONSTANT_CONVERSION = YES;
261 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
262 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
263 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
264 | CLANG_WARN_EMPTY_BODY = YES;
265 | CLANG_WARN_ENUM_CONVERSION = YES;
266 | CLANG_WARN_INFINITE_RECURSION = YES;
267 | CLANG_WARN_INT_CONVERSION = YES;
268 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
269 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
270 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
271 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
272 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
273 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
274 | CLANG_WARN_STRICT_PROTOTYPES = YES;
275 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
276 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
277 | CLANG_WARN_UNREACHABLE_CODE = YES;
278 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
279 | COPY_PHASE_STRIP = NO;
280 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
281 | ENABLE_NS_ASSERTIONS = NO;
282 | ENABLE_STRICT_OBJC_MSGSEND = YES;
283 | GCC_C_LANGUAGE_STANDARD = gnu11;
284 | GCC_NO_COMMON_BLOCKS = YES;
285 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
286 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
287 | GCC_WARN_UNDECLARED_SELECTOR = YES;
288 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
289 | GCC_WARN_UNUSED_FUNCTION = YES;
290 | GCC_WARN_UNUSED_VARIABLE = YES;
291 | IPHONEOS_DEPLOYMENT_TARGET = 14.1;
292 | MTL_ENABLE_DEBUG_INFO = NO;
293 | MTL_FAST_MATH = YES;
294 | SDKROOT = iphoneos;
295 | SWIFT_COMPILATION_MODE = wholemodule;
296 | SWIFT_OPTIMIZATION_LEVEL = "-O";
297 | VALIDATE_PRODUCT = YES;
298 | };
299 | name = Release;
300 | };
301 | 7555FFA6242A565B00829871 /* Debug */ = {
302 | isa = XCBuildConfiguration;
303 | baseConfigurationReference = 57573530B0202B27A7316A13 /* Pods-iosApp.debug.xcconfig */;
304 | buildSettings = {
305 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
306 | CODE_SIGN_STYLE = Automatic;
307 | ENABLE_PREVIEWS = YES;
308 | INFOPLIST_FILE = iosApp/Info.plist;
309 | LD_RUNPATH_SEARCH_PATHS = (
310 | "$(inherited)",
311 | "@executable_path/Frameworks",
312 | );
313 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp;
314 | PRODUCT_NAME = "$(TARGET_NAME)";
315 | SWIFT_VERSION = 5.0;
316 | TARGETED_DEVICE_FAMILY = "1,2";
317 | };
318 | name = Debug;
319 | };
320 | 7555FFA7242A565B00829871 /* Release */ = {
321 | isa = XCBuildConfiguration;
322 | baseConfigurationReference = 68D25F655AFC61595696B76A /* Pods-iosApp.release.xcconfig */;
323 | buildSettings = {
324 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
325 | CODE_SIGN_STYLE = Automatic;
326 | ENABLE_PREVIEWS = YES;
327 | INFOPLIST_FILE = iosApp/Info.plist;
328 | LD_RUNPATH_SEARCH_PATHS = (
329 | "$(inherited)",
330 | "@executable_path/Frameworks",
331 | );
332 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp;
333 | PRODUCT_NAME = "$(TARGET_NAME)";
334 | SWIFT_VERSION = 5.0;
335 | TARGETED_DEVICE_FAMILY = "1,2";
336 | };
337 | name = Release;
338 | };
339 | /* End XCBuildConfiguration section */
340 |
341 | /* Begin XCConfigurationList section */
342 | 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = {
343 | isa = XCConfigurationList;
344 | buildConfigurations = (
345 | 7555FFA3242A565B00829871 /* Debug */,
346 | 7555FFA4242A565B00829871 /* Release */,
347 | );
348 | defaultConfigurationIsVisible = 0;
349 | defaultConfigurationName = Release;
350 | };
351 | 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = {
352 | isa = XCConfigurationList;
353 | buildConfigurations = (
354 | 7555FFA6242A565B00829871 /* Debug */,
355 | 7555FFA7242A565B00829871 /* Release */,
356 | );
357 | defaultConfigurationIsVisible = 0;
358 | defaultConfigurationName = Release;
359 | };
360 | /* End XCConfigurationList section */
361 | };
362 | rootObject = 7555FF73242A565900829871 /* Project object */;
363 | }
364 |
--------------------------------------------------------------------------------
/iosApp/Pods/Pods.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXAggregateTarget section */
10 | 8777C9F6889E59EFFD631D80AEE9048B /* shared */ = {
11 | isa = PBXAggregateTarget;
12 | buildConfigurationList = 8349D8E2EC974421A14EF8ABFF6AD6DC /* Build configuration list for PBXAggregateTarget "shared" */;
13 | buildPhases = (
14 | BEA8885189D408D600647BDC228A6A20 /* [CP-User] Build shared */,
15 | );
16 | dependencies = (
17 | );
18 | name = shared;
19 | };
20 | /* End PBXAggregateTarget section */
21 |
22 | /* Begin PBXBuildFile section */
23 | 3E24CD244F43AEBE0B2CF486CFA92444 /* Pods-iosApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 42DE4C0106600A5B6D599285368F3270 /* Pods-iosApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
24 | 83DD0A9A93DC369DE93CA302F4A7B822 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; };
25 | E5A1731E8D5C3354A9722C0A8EEA4E60 /* Pods-iosApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A2475209BEE7612101900020629C625 /* Pods-iosApp-dummy.m */; };
26 | /* End PBXBuildFile section */
27 |
28 | /* Begin PBXContainerItemProxy section */
29 | BAB923A448EF5C10A46311E77715306C /* PBXContainerItemProxy */ = {
30 | isa = PBXContainerItemProxy;
31 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
32 | proxyType = 1;
33 | remoteGlobalIDString = 8777C9F6889E59EFFD631D80AEE9048B;
34 | remoteInfo = shared;
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 | 35548E3BD8DA30925E8FE97E67B84868 /* shared.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = shared.release.xcconfig; 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 | 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; };
46 | 73D4D08B8C9FAD17B10E8E5C0EB49A76 /* shared.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = shared.framework; path = build/cocoapods/framework/shared.framework; sourceTree = ""; };
47 | 95B09EA82E7AF9ACCCCAF3E55C859116 /* shared.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = shared.debug.xcconfig; sourceTree = ""; };
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.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_iosApp.framework; 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 | FB1BF8BE937671FB0F330C2D28634477 /* shared.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = shared.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
54 | /* End PBXFileReference section */
55 |
56 | /* Begin PBXFrameworksBuildPhase section */
57 | 50706A9A6A281AC41A7BD581AA264A20 /* Frameworks */ = {
58 | isa = PBXFrameworksBuildPhase;
59 | buildActionMask = 2147483647;
60 | files = (
61 | 83DD0A9A93DC369DE93CA302F4A7B822 /* Foundation.framework in Frameworks */,
62 | );
63 | runOnlyForDeploymentPostprocessing = 0;
64 | };
65 | /* End PBXFrameworksBuildPhase section */
66 |
67 | /* Begin PBXGroup section */
68 | 310087C345B86EEF25A054485E0BB5CB /* Pods-iosApp */ = {
69 | isa = PBXGroup;
70 | children = (
71 | 482384ADFE4EF692B16FACB8C2021970 /* Pods-iosApp.modulemap */,
72 | A43877303056397968EC90C7AAFE17E8 /* Pods-iosApp-acknowledgements.markdown */,
73 | 0011AEE22E8296B3D9E0B0B2CDCAB2EE /* Pods-iosApp-acknowledgements.plist */,
74 | 3A2475209BEE7612101900020629C625 /* Pods-iosApp-dummy.m */,
75 | BCAED803D074E2E9C3B1327F049C8C2A /* Pods-iosApp-Info.plist */,
76 | 42DE4C0106600A5B6D599285368F3270 /* Pods-iosApp-umbrella.h */,
77 | A79C2AA5C063914B2D1BD80187FDF6DE /* Pods-iosApp.debug.xcconfig */,
78 | 1A2FB55B5C37861BC78ECD1420D818C3 /* Pods-iosApp.release.xcconfig */,
79 | );
80 | name = "Pods-iosApp";
81 | path = "Target Support Files/Pods-iosApp";
82 | sourceTree = "";
83 | };
84 | 313FE5FE915A4A924C55AAC02A910D61 /* Development Pods */ = {
85 | isa = PBXGroup;
86 | children = (
87 | EEF3277DCE2E4B31CF76A57AB68C2BA1 /* shared */,
88 | );
89 | name = "Development Pods";
90 | sourceTree = "";
91 | };
92 | 3FE6C4172A7EA3C0BDE73E5A54AE7875 /* Products */ = {
93 | isa = PBXGroup;
94 | children = (
95 | B097DD7534E741D5C41838011D755842 /* Pods_iosApp.framework */,
96 | );
97 | name = Products;
98 | sourceTree = "";
99 | };
100 | 569B56E5B05425CAE32676C6049DC8CB /* Pod */ = {
101 | isa = PBXGroup;
102 | children = (
103 | FB1BF8BE937671FB0F330C2D28634477 /* shared.podspec */,
104 | );
105 | name = Pod;
106 | sourceTree = "";
107 | };
108 | 578452D2E740E91742655AC8F1636D1F /* iOS */ = {
109 | isa = PBXGroup;
110 | children = (
111 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */,
112 | );
113 | name = iOS;
114 | sourceTree = "";
115 | };
116 | 5CB66AAACA3977B45E9869C360E9F289 /* Support Files */ = {
117 | isa = PBXGroup;
118 | children = (
119 | 95B09EA82E7AF9ACCCCAF3E55C859116 /* shared.debug.xcconfig */,
120 | 35548E3BD8DA30925E8FE97E67B84868 /* shared.release.xcconfig */,
121 | );
122 | name = "Support Files";
123 | path = "../iosApp/Pods/Target Support Files/shared";
124 | sourceTree = "";
125 | };
126 | 7DBF81461E18ACE1B4BD971BAC841CF7 /* Frameworks */ = {
127 | isa = PBXGroup;
128 | children = (
129 | 73D4D08B8C9FAD17B10E8E5C0EB49A76 /* shared.framework */,
130 | );
131 | name = Frameworks;
132 | sourceTree = "";
133 | };
134 | C9F6DDEE5D76F65BB478A349731F54F4 /* Targets Support Files */ = {
135 | isa = PBXGroup;
136 | children = (
137 | 310087C345B86EEF25A054485E0BB5CB /* Pods-iosApp */,
138 | );
139 | name = "Targets Support Files";
140 | sourceTree = "";
141 | };
142 | CF1408CF629C7361332E53B88F7BD30C = {
143 | isa = PBXGroup;
144 | children = (
145 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
146 | 313FE5FE915A4A924C55AAC02A910D61 /* Development Pods */,
147 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */,
148 | 3FE6C4172A7EA3C0BDE73E5A54AE7875 /* Products */,
149 | C9F6DDEE5D76F65BB478A349731F54F4 /* Targets Support Files */,
150 | );
151 | sourceTree = "";
152 | };
153 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = {
154 | isa = PBXGroup;
155 | children = (
156 | 578452D2E740E91742655AC8F1636D1F /* iOS */,
157 | );
158 | name = Frameworks;
159 | sourceTree = "";
160 | };
161 | EEF3277DCE2E4B31CF76A57AB68C2BA1 /* shared */ = {
162 | isa = PBXGroup;
163 | children = (
164 | 7DBF81461E18ACE1B4BD971BAC841CF7 /* Frameworks */,
165 | 569B56E5B05425CAE32676C6049DC8CB /* Pod */,
166 | 5CB66AAACA3977B45E9869C360E9F289 /* Support Files */,
167 | );
168 | name = shared;
169 | path = ../../shared;
170 | sourceTree = "";
171 | };
172 | /* End PBXGroup section */
173 |
174 | /* Begin PBXHeadersBuildPhase section */
175 | 9C9745A6FDE502F52E51158FE62EBF4B /* Headers */ = {
176 | isa = PBXHeadersBuildPhase;
177 | buildActionMask = 2147483647;
178 | files = (
179 | 3E24CD244F43AEBE0B2CF486CFA92444 /* 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 = ADD6EF48792A689B82F024EED67757F9 /* Build configuration list for PBXNativeTarget "Pods-iosApp" */;
189 | buildPhases = (
190 | 9C9745A6FDE502F52E51158FE62EBF4B /* Headers */,
191 | 62CF16F852C132AAB2DDD605D7C4CE2C /* Sources */,
192 | 50706A9A6A281AC41A7BD581AA264A20 /* Frameworks */,
193 | BEE4073670B0B2B3DFB30EE5E276AE07 /* Resources */,
194 | );
195 | buildRules = (
196 | );
197 | dependencies = (
198 | 63057CE9AED66DCB0DC136311D297884 /* PBXTargetDependency */,
199 | );
200 | name = "Pods-iosApp";
201 | productName = "Pods-iosApp";
202 | productReference = B097DD7534E741D5C41838011D755842 /* Pods_iosApp.framework */;
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 9.3";
216 | developmentRegion = en;
217 | hasScannedForEncodings = 0;
218 | knownRegions = (
219 | en,
220 | Base,
221 | );
222 | mainGroup = CF1408CF629C7361332E53B88F7BD30C;
223 | productRefGroup = 3FE6C4172A7EA3C0BDE73E5A54AE7875 /* Products */;
224 | projectDirPath = "";
225 | projectRoot = "";
226 | targets = (
227 | ED39C638569286489CD697A6C8964146 /* Pods-iosApp */,
228 | 8777C9F6889E59EFFD631D80AEE9048B /* shared */,
229 | );
230 | };
231 | /* End PBXProject section */
232 |
233 | /* Begin PBXResourcesBuildPhase section */
234 | BEE4073670B0B2B3DFB30EE5E276AE07 /* Resources */ = {
235 | isa = PBXResourcesBuildPhase;
236 | buildActionMask = 2147483647;
237 | files = (
238 | );
239 | runOnlyForDeploymentPostprocessing = 0;
240 | };
241 | /* End PBXResourcesBuildPhase section */
242 |
243 | /* Begin PBXShellScriptBuildPhase section */
244 | BEA8885189D408D600647BDC228A6A20 /* [CP-User] Build shared */ = {
245 | isa = PBXShellScriptBuildPhase;
246 | buildActionMask = 2147483647;
247 | files = (
248 | );
249 | name = "[CP-User] Build shared";
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 | 62CF16F852C132AAB2DDD605D7C4CE2C /* Sources */ = {
258 | isa = PBXSourcesBuildPhase;
259 | buildActionMask = 2147483647;
260 | files = (
261 | E5A1731E8D5C3354A9722C0A8EEA4E60 /* Pods-iosApp-dummy.m in Sources */,
262 | );
263 | runOnlyForDeploymentPostprocessing = 0;
264 | };
265 | /* End PBXSourcesBuildPhase section */
266 |
267 | /* Begin PBXTargetDependency section */
268 | 63057CE9AED66DCB0DC136311D297884 /* PBXTargetDependency */ = {
269 | isa = PBXTargetDependency;
270 | name = shared;
271 | target = 8777C9F6889E59EFFD631D80AEE9048B /* shared */;
272 | targetProxy = BAB923A448EF5C10A46311E77715306C /* PBXContainerItemProxy */;
273 | };
274 | /* End PBXTargetDependency section */
275 |
276 | /* Begin XCBuildConfiguration section */
277 | 58AC45285D5CB6F44A61E063876A7497 /* Release */ = {
278 | isa = XCBuildConfiguration;
279 | baseConfigurationReference = 1A2FB55B5C37861BC78ECD1420D818C3 /* Pods-iosApp.release.xcconfig */;
280 | buildSettings = {
281 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
282 | CLANG_ENABLE_OBJC_WEAK = NO;
283 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
284 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
285 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
286 | CURRENT_PROJECT_VERSION = 1;
287 | DEFINES_MODULE = YES;
288 | DYLIB_COMPATIBILITY_VERSION = 1;
289 | DYLIB_CURRENT_VERSION = 1;
290 | DYLIB_INSTALL_NAME_BASE = "@rpath";
291 | INFOPLIST_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist";
292 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
293 | IPHONEOS_DEPLOYMENT_TARGET = 14.1;
294 | LD_RUNPATH_SEARCH_PATHS = (
295 | "$(inherited)",
296 | "@executable_path/Frameworks",
297 | "@loader_path/Frameworks",
298 | );
299 | MACH_O_TYPE = staticlib;
300 | MODULEMAP_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp.modulemap";
301 | OTHER_LDFLAGS = "";
302 | OTHER_LIBTOOLFLAGS = "";
303 | PODS_ROOT = "$(SRCROOT)";
304 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
305 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
306 | SDKROOT = iphoneos;
307 | SKIP_INSTALL = YES;
308 | TARGETED_DEVICE_FAMILY = "1,2";
309 | VALIDATE_PRODUCT = YES;
310 | VERSIONING_SYSTEM = "apple-generic";
311 | VERSION_INFO_PREFIX = "";
312 | };
313 | name = Release;
314 | };
315 | 593F10BFFA94DAC7D6E17FB8A7F32D72 /* Release */ = {
316 | isa = XCBuildConfiguration;
317 | buildSettings = {
318 | ALWAYS_SEARCH_USER_PATHS = NO;
319 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
320 | CLANG_ANALYZER_NONNULL = YES;
321 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
322 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
323 | CLANG_CXX_LIBRARY = "libc++";
324 | CLANG_ENABLE_MODULES = YES;
325 | CLANG_ENABLE_OBJC_ARC = YES;
326 | CLANG_ENABLE_OBJC_WEAK = YES;
327 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
328 | CLANG_WARN_BOOL_CONVERSION = YES;
329 | CLANG_WARN_COMMA = YES;
330 | CLANG_WARN_CONSTANT_CONVERSION = YES;
331 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
332 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
333 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
334 | CLANG_WARN_EMPTY_BODY = YES;
335 | CLANG_WARN_ENUM_CONVERSION = YES;
336 | CLANG_WARN_INFINITE_RECURSION = YES;
337 | CLANG_WARN_INT_CONVERSION = YES;
338 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
339 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
340 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
341 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
342 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
343 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
344 | CLANG_WARN_STRICT_PROTOTYPES = YES;
345 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
346 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
347 | CLANG_WARN_UNREACHABLE_CODE = YES;
348 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
349 | COPY_PHASE_STRIP = NO;
350 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
351 | ENABLE_NS_ASSERTIONS = NO;
352 | ENABLE_STRICT_OBJC_MSGSEND = YES;
353 | GCC_C_LANGUAGE_STANDARD = gnu11;
354 | GCC_NO_COMMON_BLOCKS = YES;
355 | GCC_PREPROCESSOR_DEFINITIONS = (
356 | "POD_CONFIGURATION_RELEASE=1",
357 | "$(inherited)",
358 | );
359 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
360 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
361 | GCC_WARN_UNDECLARED_SELECTOR = YES;
362 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
363 | GCC_WARN_UNUSED_FUNCTION = YES;
364 | GCC_WARN_UNUSED_VARIABLE = YES;
365 | IPHONEOS_DEPLOYMENT_TARGET = 14.1;
366 | MTL_ENABLE_DEBUG_INFO = NO;
367 | MTL_FAST_MATH = YES;
368 | PRODUCT_NAME = "$(TARGET_NAME)";
369 | STRIP_INSTALLED_PRODUCT = NO;
370 | SWIFT_COMPILATION_MODE = wholemodule;
371 | SWIFT_OPTIMIZATION_LEVEL = "-O";
372 | SWIFT_VERSION = 5.0;
373 | SYMROOT = "${SRCROOT}/../build";
374 | };
375 | name = Release;
376 | };
377 | A0374B8CF9A7D6A45F6D116D698D1C19 /* Debug */ = {
378 | isa = XCBuildConfiguration;
379 | buildSettings = {
380 | ALWAYS_SEARCH_USER_PATHS = NO;
381 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
382 | CLANG_ANALYZER_NONNULL = YES;
383 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
384 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
385 | CLANG_CXX_LIBRARY = "libc++";
386 | CLANG_ENABLE_MODULES = YES;
387 | CLANG_ENABLE_OBJC_ARC = YES;
388 | CLANG_ENABLE_OBJC_WEAK = YES;
389 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
390 | CLANG_WARN_BOOL_CONVERSION = YES;
391 | CLANG_WARN_COMMA = YES;
392 | CLANG_WARN_CONSTANT_CONVERSION = YES;
393 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
394 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
395 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
396 | CLANG_WARN_EMPTY_BODY = YES;
397 | CLANG_WARN_ENUM_CONVERSION = YES;
398 | CLANG_WARN_INFINITE_RECURSION = YES;
399 | CLANG_WARN_INT_CONVERSION = YES;
400 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
401 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
402 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
403 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
404 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
405 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
406 | CLANG_WARN_STRICT_PROTOTYPES = YES;
407 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
408 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
409 | CLANG_WARN_UNREACHABLE_CODE = YES;
410 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
411 | COPY_PHASE_STRIP = NO;
412 | DEBUG_INFORMATION_FORMAT = dwarf;
413 | ENABLE_STRICT_OBJC_MSGSEND = YES;
414 | ENABLE_TESTABILITY = YES;
415 | GCC_C_LANGUAGE_STANDARD = gnu11;
416 | GCC_DYNAMIC_NO_PIC = NO;
417 | GCC_NO_COMMON_BLOCKS = YES;
418 | GCC_OPTIMIZATION_LEVEL = 0;
419 | GCC_PREPROCESSOR_DEFINITIONS = (
420 | "POD_CONFIGURATION_DEBUG=1",
421 | "DEBUG=1",
422 | "$(inherited)",
423 | );
424 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
425 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
426 | GCC_WARN_UNDECLARED_SELECTOR = YES;
427 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
428 | GCC_WARN_UNUSED_FUNCTION = YES;
429 | GCC_WARN_UNUSED_VARIABLE = YES;
430 | IPHONEOS_DEPLOYMENT_TARGET = 14.1;
431 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
432 | MTL_FAST_MATH = YES;
433 | ONLY_ACTIVE_ARCH = YES;
434 | PRODUCT_NAME = "$(TARGET_NAME)";
435 | STRIP_INSTALLED_PRODUCT = NO;
436 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
437 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
438 | SWIFT_VERSION = 5.0;
439 | SYMROOT = "${SRCROOT}/../build";
440 | };
441 | name = Debug;
442 | };
443 | A7B4967B71249851CABD6EC29251E481 /* Debug */ = {
444 | isa = XCBuildConfiguration;
445 | baseConfigurationReference = 95B09EA82E7AF9ACCCCAF3E55C859116 /* shared.debug.xcconfig */;
446 | buildSettings = {
447 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
448 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
449 | CLANG_ENABLE_OBJC_WEAK = NO;
450 | IPHONEOS_DEPLOYMENT_TARGET = 14.1;
451 | LD_RUNPATH_SEARCH_PATHS = (
452 | "$(inherited)",
453 | "@executable_path/Frameworks",
454 | );
455 | SDKROOT = iphoneos;
456 | TARGETED_DEVICE_FAMILY = "1,2";
457 | };
458 | name = Debug;
459 | };
460 | A96D4527F178BD8C0DEB7EE72B9AAE09 /* Release */ = {
461 | isa = XCBuildConfiguration;
462 | baseConfigurationReference = 35548E3BD8DA30925E8FE97E67B84868 /* shared.release.xcconfig */;
463 | buildSettings = {
464 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
465 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
466 | CLANG_ENABLE_OBJC_WEAK = NO;
467 | IPHONEOS_DEPLOYMENT_TARGET = 14.1;
468 | LD_RUNPATH_SEARCH_PATHS = (
469 | "$(inherited)",
470 | "@executable_path/Frameworks",
471 | );
472 | SDKROOT = iphoneos;
473 | TARGETED_DEVICE_FAMILY = "1,2";
474 | VALIDATE_PRODUCT = YES;
475 | };
476 | name = Release;
477 | };
478 | C169CD86F404B5703A041CBD81F7AE1D /* Debug */ = {
479 | isa = XCBuildConfiguration;
480 | baseConfigurationReference = A79C2AA5C063914B2D1BD80187FDF6DE /* Pods-iosApp.debug.xcconfig */;
481 | buildSettings = {
482 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
483 | CLANG_ENABLE_OBJC_WEAK = NO;
484 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
485 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
486 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
487 | CURRENT_PROJECT_VERSION = 1;
488 | DEFINES_MODULE = YES;
489 | DYLIB_COMPATIBILITY_VERSION = 1;
490 | DYLIB_CURRENT_VERSION = 1;
491 | DYLIB_INSTALL_NAME_BASE = "@rpath";
492 | INFOPLIST_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist";
493 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
494 | IPHONEOS_DEPLOYMENT_TARGET = 14.1;
495 | LD_RUNPATH_SEARCH_PATHS = (
496 | "$(inherited)",
497 | "@executable_path/Frameworks",
498 | "@loader_path/Frameworks",
499 | );
500 | MACH_O_TYPE = staticlib;
501 | MODULEMAP_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp.modulemap";
502 | OTHER_LDFLAGS = "";
503 | OTHER_LIBTOOLFLAGS = "";
504 | PODS_ROOT = "$(SRCROOT)";
505 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
506 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
507 | SDKROOT = iphoneos;
508 | SKIP_INSTALL = YES;
509 | TARGETED_DEVICE_FAMILY = "1,2";
510 | VERSIONING_SYSTEM = "apple-generic";
511 | VERSION_INFO_PREFIX = "";
512 | };
513 | name = Debug;
514 | };
515 | /* End XCBuildConfiguration section */
516 |
517 | /* Begin XCConfigurationList section */
518 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
519 | isa = XCConfigurationList;
520 | buildConfigurations = (
521 | A0374B8CF9A7D6A45F6D116D698D1C19 /* Debug */,
522 | 593F10BFFA94DAC7D6E17FB8A7F32D72 /* Release */,
523 | );
524 | defaultConfigurationIsVisible = 0;
525 | defaultConfigurationName = Release;
526 | };
527 | 8349D8E2EC974421A14EF8ABFF6AD6DC /* Build configuration list for PBXAggregateTarget "shared" */ = {
528 | isa = XCConfigurationList;
529 | buildConfigurations = (
530 | A7B4967B71249851CABD6EC29251E481 /* Debug */,
531 | A96D4527F178BD8C0DEB7EE72B9AAE09 /* Release */,
532 | );
533 | defaultConfigurationIsVisible = 0;
534 | defaultConfigurationName = Release;
535 | };
536 | ADD6EF48792A689B82F024EED67757F9 /* Build configuration list for PBXNativeTarget "Pods-iosApp" */ = {
537 | isa = XCConfigurationList;
538 | buildConfigurations = (
539 | C169CD86F404B5703A041CBD81F7AE1D /* Debug */,
540 | 58AC45285D5CB6F44A61E063876A7497 /* Release */,
541 | );
542 | defaultConfigurationIsVisible = 0;
543 | defaultConfigurationName = Release;
544 | };
545 | /* End XCConfigurationList section */
546 | };
547 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
548 | }
549 |
--------------------------------------------------------------------------------