├── 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 | 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 | 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 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 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 | 6 | 7 | 9 | 10 | 11 | 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 | 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 | --------------------------------------------------------------------------------