From 782a28196bd558bb54ad1bae8a56077ff6a5bf80 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Fri, 7 Apr 2023 16:52:38 +0200 Subject: [PATCH 01/16] add demo --- gradle/libs.versions.toml | 74 +++ sentry-samples/kmp-app-2/README.md | 21 + .../kmp-app-2/androidApp/build.gradle.kts | 53 +++ .../kmp-app-2/androidApp/proguard-rules.pro | 21 + .../androidApp/src/main/AndroidManifest.xml | 28 ++ .../sentry/kmp/demo/android/MainActivity.kt | 26 ++ .../io/sentry/kmp/demo/android/MainApp.kt | 26 ++ .../io/sentry/kmp/demo/android/theme/Color.kt | 8 + .../sentry/kmp/demo/android/theme/Shapes.kt | 11 + .../io/sentry/kmp/demo/android/theme/Theme.kt | 38 ++ .../kmp/demo/android/theme/Typography.kt | 15 + .../sentry/kmp/demo/android/ui/Composables.kt | 25 + .../sentry/kmp/demo/android/ui/HomeScreen.kt | 83 ++++ .../sentry/kmp/demo/android/ui/LoginScreen.kt | 125 +++++ .../drawable-v24/ic_launcher_foreground.xml | 34 ++ .../main/res/drawable/ic_favorite_24px.xml | 9 + .../res/drawable/ic_favorite_border_24px.xml | 9 + .../res/drawable/ic_launcher_background.xml | 170 +++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes .../androidApp/src/main/res/values/colors.xml | 6 + .../src/main/res/values/strings.xml | 3 + .../androidApp/src/main/res/values/styles.xml | 11 + sentry-samples/kmp-app-2/iosApp/Podfile | 5 + sentry-samples/kmp-app-2/iosApp/Podfile.lock | 30 ++ .../iosApp/iosApp.xcodeproj/project.pbxproj | 426 ++++++++++++++++++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../kmp-app-2/iosApp/iosApp/AppDelegate.swift | 24 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 ++++ .../iosApp/Assets.xcassets/Contents.json | 6 + .../kmp-app-2/iosApp/iosApp/HomeScreen.swift | 50 ++ .../kmp-app-2/iosApp/iosApp/Info.plist | 48 ++ .../kmp-app-2/iosApp/iosApp/Koin.swift | 12 + .../kmp-app-2/iosApp/iosApp/LoginScreen.swift | 70 +++ .../Preview Assets.xcassets/Contents.json | 6 + .../kmp-app-2/shared/build.gradle.kts | 75 +++ .../kmp-app-2/shared/shared.podspec | 39 ++ .../kotlin/io/sentry/kmp/demo/KoinAndroid.kt | 10 + .../io/sentry/kmp/demo/models/ViewModel.kt | 13 + .../kotlin/io/sentry/kmp/demo/Koin.kt | 17 + .../demo/models/AuthenticationViewModel.kt | 35 ++ .../sentry/kmp/demo/models/HomeViewModel.kt | 20 + .../io/sentry/kmp/demo/models/ViewModel.kt | 8 + .../io/sentry/kmp/demo/sentry/SentrySetup.kt | 55 +++ .../kotlin/io/sentry/kmp/demo/KoinIOS.kt | 22 + .../io/sentry/kmp/demo/models/ViewModel.kt | 30 ++ .../iosApp/iosApp.xcodeproj/project.pbxproj | 20 + settings.gradle.kts | 14 + 60 files changed, 1970 insertions(+) create mode 100644 gradle/libs.versions.toml create mode 100644 sentry-samples/kmp-app-2/README.md create mode 100644 sentry-samples/kmp-app-2/androidApp/build.gradle.kts create mode 100644 sentry-samples/kmp-app-2/androidApp/proguard-rules.pro create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/AndroidManifest.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_24px.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_launcher_background.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/values/colors.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/values/strings.xml create mode 100644 sentry-samples/kmp-app-2/androidApp/src/main/res/values/styles.xml create mode 100644 sentry-samples/kmp-app-2/iosApp/Podfile create mode 100644 sentry-samples/kmp-app-2/iosApp/Podfile.lock create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp.xcodeproj/project.pbxproj create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/contents.xcworkspacedata create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/AppDelegate.swift create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/Contents.json create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/HomeScreen.swift create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/Info.plist create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/Koin.swift create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/LoginScreen.swift create mode 100644 sentry-samples/kmp-app-2/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 sentry-samples/kmp-app-2/shared/build.gradle.kts create mode 100644 sentry-samples/kmp-app-2/shared/shared.podspec create mode 100644 sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt create mode 100644 sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt create mode 100644 sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt create mode 100644 sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt create mode 100644 sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt create mode 100644 sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt create mode 100644 sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt create mode 100644 sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt create mode 100644 sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..10b01c96 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,74 @@ +[versions] +## SDK Versions +minSdk = "21" +targetSdk = "33" +compileSdk = "33" + +## Dependencies +com-android-application = "8.1.0-alpha10" +org-jetbrains-kotlin-android = "1.8.0" +core-ktx = "1.9.0" +junit = "4.13.2" +androidx-test-ext-junit = "1.1.5" +espresso-core = "3.5.1" +appcompat = "1.6.1" +material = "1.8.0" +sentry-kotlin-multiplatform = "0.0.3" +koin = "3.2.0" + +coroutines = "1.6.4" + +compose = "1.4.0-alpha03" +composeCompiler = "1.4.0-dev-k1.8.0-33c0ad36f83" + +android-desugaring = "1.1.8" # Don't bump to 1.2.x until AGP is 7.3.x +androidx-core = "1.9.0" +androidx-test-junit = "1.1.3" +androidx-activity-compose = "1.5.1" +androidx-lifecycle = "2.5.1" + +[libraries] +core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } + +sentry-kotlin-multiplatform = { module = "io.sentry:sentry-kotlin-multiplatform", version.ref = "sentry-kotlin-multiplatform" } + +koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } +koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } + +coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } + +android-desugaring = { module = "com.android.tools:desugar_jdk_libs", version.ref = "android-desugaring" } +androidx-core = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } +androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } +androidx-test-junit = { module = "androidx.test.ext:junit-ktx", version.ref = "androidx-test-junit" } + +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } +espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } +appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } + +compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "composeCompiler" } +compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" } +compose-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } +compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose" } +compose-material = { module = "androidx.compose.material:material", version.ref = "compose" } +compose-activity = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" } + +[plugins] +com-android-application = { id = "com.android.application", version.ref = "com-android-application" } +org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin-android" } + +[bundles] +app-ui = [ + "compose-compiler", + "androidx-core", + "androidx-lifecycle-runtime", + "androidx-lifecycle-viewmodel", + "compose-ui", + "compose-tooling", + "compose-foundation", + "compose-material", + "compose-activity", +] diff --git a/sentry-samples/kmp-app-2/README.md b/sentry-samples/kmp-app-2/README.md new file mode 100644 index 00000000..b2c72b38 --- /dev/null +++ b/sentry-samples/kmp-app-2/README.md @@ -0,0 +1,21 @@ +# Sentry KMP Demo App + +This is a demo app for the Sentry Kotlin Multiplatform SDK that includes a native iOS app and a native Android app with shared code. + +## Shared Features + - Dependency Injection with Koin + - ViewModels + - Sentry Setup + +## Getting Started + +### DSN +If you need to change the `DSN` you can do so in the `SentrySetup.kt` file in the `shared` module. + +### DSYMS for iOS +First: you need to have `sentry-cli` installed. + +The build script is already configured to upload the DSYMS to Sentry. +It's called `Sentry dsyms upload` and you can find it under `build phases`. +You only need to change the `SENTRY_AUTH_TOKEN`, `SENTRY_PROJECT` and `SENTRY_ORG` values in the script. + diff --git a/sentry-samples/kmp-app-2/androidApp/build.gradle.kts b/sentry-samples/kmp-app-2/androidApp/build.gradle.kts new file mode 100644 index 00000000..507a055c --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/build.gradle.kts @@ -0,0 +1,53 @@ +plugins { + id("com.android.application") + kotlin("android") +} + +android { + namespace = "io.sentry.kmp.demo.android" + compileSdk = 33 + defaultConfig { + applicationId = "io.sentry.kmp.demo" + minSdk = 21 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + } + packagingOptions { + resources.excludes.add("META-INF/*.kotlin_module") + } + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + compileOptions { + isCoreLibraryDesugaringEnabled = true + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } +} + +dependencies { + implementation(rootProject.project(":sentry-samples:kmp-app-2:shared")) + implementation("androidx.core:core-ktx:1.9.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.8.0") + implementation("androidx.activity:activity-compose:1.5.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.1") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1") + implementation("io.insert-koin:koin-android:3.2.0") + implementation("io.insert-koin:koin-core:3.2.0") + implementation("junit:junit:4.13.2") + implementation("com.android.tools:desugar_jdk_libs:1.1.8") + implementation("androidx.compose.compiler:compiler:1.4.0-dev-k1.8.0-33c0ad36f83") + implementation("androidx.compose.ui:ui:1.4.0-alpha03") + implementation("androidx.compose.ui:ui-tooling:1.4.0-alpha03") + implementation("androidx.compose.foundation:foundation:1.4.0-alpha03") + implementation("androidx.compose.material:material:1.4.0-alpha03") +} diff --git a/sentry-samples/kmp-app-2/androidApp/proguard-rules.pro b/sentry-samples/kmp-app-2/androidApp/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/AndroidManifest.xml b/sentry-samples/kmp-app-2/androidApp/src/main/AndroidManifest.xml new file mode 100644 index 00000000..dc16bc9e --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt new file mode 100644 index 00000000..c11d106f --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt @@ -0,0 +1,26 @@ +package io.sentry.kmp.demo.android + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import io.sentry.kmp.demo.android.theme.Theme +import io.sentry.kmp.demo.android.ui.MyApp +import io.sentry.kmp.demo.models.AuthenticationViewModel +import io.sentry.kmp.demo.models.HomeViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.component.KoinComponent + +class MainActivity : ComponentActivity(), KoinComponent { + + private val authenticationViewModel: AuthenticationViewModel by viewModel() + private val homeViewModel: HomeViewModel by viewModel() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + Theme { + MyApp(authenticationViewModel, homeViewModel) + } + } + } +} diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt new file mode 100644 index 00000000..ef91ac68 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt @@ -0,0 +1,26 @@ +package io.sentry.kmp.demo.android + +import android.app.Application +import android.content.Context +import android.util.Log +import io.sentry.kmp.demo.initKoin +import io.sentry.kmp.demo.sentry.initSentry +import org.koin.dsl.module + +class MainApp : Application() { + + override fun onCreate() { + super.onCreate() + + initSentry(this) + + initKoin( + module { + single { this@MainApp } + single { + { Log.i("Startup", "Hello from Android/Kotlin!") } + } + } + ) + } +} diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt new file mode 100644 index 00000000..699f78d0 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt @@ -0,0 +1,8 @@ +package io.sentry.kmp.demo.android.theme + +import androidx.compose.ui.graphics.Color + +val Purple200 = Color(0xFFBB86FC) +val Purple500 = Color(0xFF6200EE) +val Purple700 = Color(0xFF3700B3) +val Teal200 = Color(0xFF03DAC5) diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt new file mode 100644 index 00000000..3af7284c --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt @@ -0,0 +1,11 @@ +package io.sentry.kmp.demo.android.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Shapes +import androidx.compose.ui.unit.dp + +val Shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(4.dp), + large = RoundedCornerShape(0.dp) +) diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt new file mode 100644 index 00000000..840444a9 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt @@ -0,0 +1,38 @@ +package io.sentry.kmp.demo.android.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material.darkColors +import androidx.compose.material.lightColors +import androidx.compose.runtime.Composable + +private val DarkColorPalette = darkColors( + primary = Purple200, + primaryVariant = Purple700, + secondary = Teal200 +) + +private val LightColorPalette = lightColors( + primary = Purple500, + primaryVariant = Purple700, + secondary = Teal200 +) + +@Composable +fun Theme( + darkTheme: Boolean = isSystemInDarkTheme(), + content: @Composable () -> Unit +) { + val colors = if (darkTheme) { + DarkColorPalette + } else { + LightColorPalette + } + + MaterialTheme( + colors = colors, + typography = Typography, + shapes = Shapes, + content = content + ) +} diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt new file mode 100644 index 00000000..390c3f2c --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt @@ -0,0 +1,15 @@ +package io.sentry.kmp.demo.android.theme + +import androidx.compose.material.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +val Typography = Typography( + body1 = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp + ) +) diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt new file mode 100644 index 00000000..8ace92f3 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt @@ -0,0 +1,25 @@ +package io.sentry.kmp.demo.android.ui + +import androidx.compose.runtime.Composable +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import io.sentry.kmp.demo.models.AuthenticationViewModel +import io.sentry.kmp.demo.models.HomeViewModel + +@Composable +fun MyApp(authenticationViewModel: AuthenticationViewModel, homeViewModel: HomeViewModel) { + val navController = rememberNavController() + + NavHost( + navController = navController, + startDestination = "login" + ) { + composable("login") { + LoginScreen(navController, authenticationViewModel) + } + composable("home") { + HomeScreen(navController, homeViewModel) + } + } +} diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt new file mode 100644 index 00000000..f09f5c7e --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt @@ -0,0 +1,83 @@ +package io.sentry.kmp.demo.android.ui + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.AlertDialog +import androidx.compose.material.Button +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import io.sentry.kmp.demo.models.HomeViewModel + +@Composable +fun HomeScreen(navController: NavController, homeViewModel: HomeViewModel) { + var showDialog by remember { mutableStateOf(false) } + var dialogMessage by remember { mutableStateOf("") } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Center + ) { + Text( + text = "Welcome!", + style = MaterialTheme.typography.h4, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(bottom = 16.dp) + ) + Text( + text = homeViewModel.homeText, + style = MaterialTheme.typography.body1, + fontWeight = FontWeight.Normal, + modifier = Modifier.padding(bottom = 16.dp) + ) + Button( + onClick = { + homeViewModel.updateProfileWithErr() + dialogMessage = "An error occurred during profile update" + showDialog = true + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + ) { + Text("Update Profile (error)") + } + Button( + onClick = { navController.popBackStack() }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + ) { + Text("Log Out") + } + if (showDialog) { + AlertDialog( + onDismissRequest = { showDialog = false }, + title = { Text("Error") }, + text = { Text(dialogMessage) }, + confirmButton = { + Button( + onClick = { showDialog = false } + ) { + Text("OK") + } + } + ) + } + } +} diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt new file mode 100644 index 00000000..88d13152 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt @@ -0,0 +1,125 @@ +package io.sentry.kmp.demo.android.ui + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.AlertDialog +import androidx.compose.material.Button +import androidx.compose.material.Checkbox +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import io.sentry.kmp.demo.models.AuthenticationViewModel + +@Composable +fun LoginScreen(navController: NavController, authenticationViewModel: AuthenticationViewModel) { + val email = remember { mutableStateOf("user@sentrydemo.com") } + val password = remember { mutableStateOf("randompassword") } + val enableLoginError = remember { mutableStateOf(true) } + var showDialog by remember { mutableStateOf(false) } + var dialogMessage by remember { mutableStateOf("") } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = "Sentry Demo", + style = MaterialTheme.typography.h4, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(bottom = 16.dp) + ) + OutlinedTextField( + value = email.value, + onValueChange = { email.value = it }, + label = { Text("Email") }, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Email + ), + modifier = Modifier.fillMaxWidth() + ) + OutlinedTextField( + value = password.value, + onValueChange = { password.value = it }, + label = { Text("Password") }, + visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Password + ), + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + ) + Button( + onClick = { + val succeeded = authenticationViewModel.login(enableLoginError.value) + if (succeeded) { + navController.navigate("home") + } else { + dialogMessage = "An error occurred during login" + showDialog = true + } + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + ) { + Text("Log In ${if (enableLoginError.value) "(error)" else ""}") + } + Button( + onClick = { + authenticationViewModel.signUp() + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + ) { + Text("Sign up (crash)") + } + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Start + ) { + Text("Enable login error") + Checkbox( + checked = enableLoginError.value, + onCheckedChange = { enableLoginError.value = it }, + modifier = Modifier.padding(end = 8.dp) + ) + } + if (showDialog) { + AlertDialog( + onDismissRequest = { showDialog = false }, + title = { Text("Error") }, + text = { Text(dialogMessage) }, + confirmButton = { + Button( + onClick = { showDialog = false } + ) { + Text("OK") + } + } + ) + } + } +} diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..1f6bb290 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_24px.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_24px.xml new file mode 100644 index 00000000..ce351f43 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml new file mode 100644 index 00000000..e6646709 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_launcher_background.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..0d025f9b --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..898f3ed59ac9f3248734a00e5902736c9367d455 GIT binary patch literal 2963 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 JPDHLkV1g@XpTGbB literal 0 HcmV?d00001 diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..dffca3601eba7bf5f409bdd520820e2eb5122c75 GIT binary patch literal 4905 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 lV%Z2*hu);6rydA(}wUDXPCF_W1vnaRBK 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 literal 0 HcmV?d00001 diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..14ed0af35023e4f1901cf03487b6c524257b8483 GIT binary patch literal 6895 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 literal 0 HcmV?d00001 diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b0907cac3bfd8fbfdc46e1108247f0a1055387ec GIT binary patch literal 6387 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 literal 0 HcmV?d00001 diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ae03154975f397f8ed1b84f2d4bf9783ecfa26 GIT binary patch literal 10413 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 XdJ+W}DiIkV00000NkvXXu0mjfKBlg6 literal 0 HcmV?d00001 diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2c18de9e66108411737e910f5c1972476f03ddbf GIT binary patch literal 9128 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 I20H400LcNok^lez literal 0 HcmV?d00001 diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..beed3cdd2c32af5114a7dc70b9ef5b698eb8797e GIT binary patch literal 15132 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 literal 0 HcmV?d00001 diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/values/colors.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/values/colors.xml new file mode 100644 index 00000000..69b22338 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #008577 + #00574B + #D81B60 + diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/values/strings.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/values/strings.xml new file mode 100644 index 00000000..f83b2779 --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Sentry KMP Demo + diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/values/styles.xml b/sentry-samples/kmp-app-2/androidApp/src/main/res/values/styles.xml new file mode 100644 index 00000000..5885930d --- /dev/null +++ b/sentry-samples/kmp-app-2/androidApp/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/sentry-samples/kmp-app-2/iosApp/Podfile b/sentry-samples/kmp-app-2/iosApp/Podfile new file mode 100644 index 00000000..aff9c517 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/Podfile @@ -0,0 +1,5 @@ +target 'iosApp' do + use_frameworks! + platform :ios, '14.1' + pod 'shared', :path => '../shared' +end \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/iosApp/Podfile.lock b/sentry-samples/kmp-app-2/iosApp/Podfile.lock new file mode 100644 index 00000000..7b410697 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/Podfile.lock @@ -0,0 +1,30 @@ +PODS: + - Sentry (8.3.3): + - Sentry/Core (= 8.3.3) + - SentryPrivate (= 8.3.3) + - Sentry/Core (8.3.3): + - SentryPrivate (= 8.3.3) + - SentryPrivate (8.3.3) + - shared (1.0): + - Sentry (~> 8.3.3) + +DEPENDENCIES: + - shared (from `../shared`) + +SPEC REPOS: + trunk: + - Sentry + - SentryPrivate + +EXTERNAL SOURCES: + shared: + :path: "../shared" + +SPEC CHECKSUMS: + Sentry: 8ffc397d98fe58d693e73959b26ed0eaee55646a + SentryPrivate: bf776a47a131648f5023097215987b40fbd47025 + shared: ca840f618eed601b609feebc53a7e930427e5b00 + +PODFILE CHECKSUM: f282da88f39e69507b0a255187c8a6b644477756 + +COCOAPODS: 1.12.0 diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp.xcodeproj/project.pbxproj b/sentry-samples/kmp-app-2/iosApp/iosApp.xcodeproj/project.pbxproj new file mode 100644 index 00000000..1855d50e --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp.xcodeproj/project.pbxproj @@ -0,0 +1,426 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557BA273AAA24004C7B11 /* Assets.xcassets */; }; + 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */; }; + 244CD82229E0579200F8451F /* LoginScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 244CD81E29E0579200F8451F /* LoginScreen.swift */; }; + 244CD82329E0579200F8451F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 244CD81F29E0579200F8451F /* AppDelegate.swift */; }; + 244CD82429E0579200F8451F /* Koin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 244CD82029E0579200F8451F /* Koin.swift */; }; + 244CD82529E0579200F8451F /* HomeScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 244CD82129E0579200F8451F /* HomeScreen.swift */; }; + FFC0DCE8EFC8D0EEA1D14C99 /* Pods_iosApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8242FA7EEBC7E8A55743811E /* Pods_iosApp.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 244CD81E29E0579200F8451F /* LoginScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginScreen.swift; sourceTree = ""; }; + 244CD81F29E0579200F8451F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 244CD82029E0579200F8451F /* Koin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Koin.swift; sourceTree = ""; }; + 244CD82129E0579200F8451F /* HomeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreen.swift; sourceTree = ""; }; + 45A0F05C445532171C74E8C3 /* 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 = ""; }; + 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8242FA7EEBC7E8A55743811E /* Pods_iosApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D39B5469A872DAA2059A5A5D /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + DAA6816987C1F96EB698F1CE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FFC0DCE8EFC8D0EEA1D14C99 /* Pods_iosApp.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 058557D7273AAEEB004C7B11 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 0D5D06B1E380733306423282 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8242FA7EEBC7E8A55743811E /* Pods_iosApp.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 17C2E505E0856C78D3F3AE93 /* Pods */ = { + isa = PBXGroup; + children = ( + D39B5469A872DAA2059A5A5D /* Pods-iosApp.debug.xcconfig */, + 45A0F05C445532171C74E8C3 /* Pods-iosApp.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 7555FF72242A565900829871 = { + isa = PBXGroup; + children = ( + 7555FF7D242A565900829871 /* iosApp */, + 7555FF7C242A565900829871 /* Products */, + 17C2E505E0856C78D3F3AE93 /* Pods */, + 0D5D06B1E380733306423282 /* Frameworks */, + ); + sourceTree = ""; + }; + 7555FF7C242A565900829871 /* Products */ = { + isa = PBXGroup; + children = ( + 7555FF7B242A565900829871 /* iosApp.app */, + ); + name = Products; + sourceTree = ""; + }; + 7555FF7D242A565900829871 /* iosApp */ = { + isa = PBXGroup; + children = ( + 244CD81F29E0579200F8451F /* AppDelegate.swift */, + 244CD82129E0579200F8451F /* HomeScreen.swift */, + 244CD82029E0579200F8451F /* Koin.swift */, + 244CD81E29E0579200F8451F /* LoginScreen.swift */, + 058557BA273AAA24004C7B11 /* Assets.xcassets */, + 7555FF8C242A565B00829871 /* Info.plist */, + 058557D7273AAEEB004C7B11 /* Preview Content */, + ); + path = iosApp; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7555FF7A242A565900829871 /* iosApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */; + buildPhases = ( + 4E7E0840DFEC454A512192BD /* [CP] Check Pods Manifest.lock */, + 7555FF77242A565900829871 /* Sources */, + 7555FF79242A565900829871 /* Resources */, + DAA6816987C1F96EB698F1CE /* Frameworks */, + 80B824D75AE06EF6630365EC /* [CP] Embed Pods Frameworks */, + 244CD81729DF007900F8451F /* Sentry dsyms upload */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iosApp; + productName = iosApp; + productReference = 7555FF7B242A565900829871 /* iosApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7555FF73242A565900829871 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = orgName; + TargetAttributes = { + 7555FF7A242A565900829871 = { + CreatedOnToolsVersion = 11.3.1; + }; + }; + }; + buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7555FF72242A565900829871; + productRefGroup = 7555FF7C242A565900829871 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7555FF7A242A565900829871 /* iosApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7555FF79242A565900829871 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */, + 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 244CD81729DF007900F8451F /* Sentry dsyms upload */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + ); + name = "Sentry dsyms upload"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which sentry-cli >/dev/null; then\nexport SENTRY_ORG=\nexport SENTRY_PROJECT=\nexport SENTRY_AUTH_TOKEN=\nERROR=$(sentry-cli upload-dif \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; + }; + 4E7E0840DFEC454A512192BD /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-iosApp-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + 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"; + showEnvVarsInLog = 0; + }; + 80B824D75AE06EF6630365EC /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7555FF77242A565900829871 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 244CD82229E0579200F8451F /* LoginScreen.swift in Sources */, + 244CD82329E0579200F8451F /* AppDelegate.swift in Sources */, + 244CD82429E0579200F8451F /* Koin.swift in Sources */, + 244CD82529E0579200F8451F /* HomeScreen.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 7555FFA3242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7555FFA4242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7555FFA6242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D39B5469A872DAA2059A5A5D /* Pods-iosApp.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = iosApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 7555FFA7242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 45A0F05C445532171C74E8C3 /* Pods-iosApp.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = iosApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA3242A565B00829871 /* Debug */, + 7555FFA4242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA6242A565B00829871 /* Debug */, + 7555FFA7242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7555FF73242A565900829871 /* Project object */; +} diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/contents.xcworkspacedata b/sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..c009e7d7 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/AppDelegate.swift b/sentry-samples/kmp-app-2/iosApp/iosApp/AppDelegate.swift new file mode 100644 index 00000000..f863295a --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/AppDelegate.swift @@ -0,0 +1,24 @@ +import SwiftUI +import shared + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions + launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + startKoin() + + SentrySetupKt.start() + + let viewController = UIHostingController(rootView: HomeScreen()) + + self.window = UIWindow(frame: UIScreen.main.bounds) + self.window?.rootViewController = viewController + self.window?.makeKeyAndVisible() + + return true + } +} diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..ee7e3ca0 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..fb88a396 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/Contents.json b/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/Contents.json new file mode 100644 index 00000000..4aa7c535 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/HomeScreen.swift b/sentry-samples/kmp-app-2/iosApp/iosApp/HomeScreen.swift new file mode 100644 index 00000000..aa71784f --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/HomeScreen.swift @@ -0,0 +1,50 @@ +import SwiftUI +import shared + +struct HomeScreen: View { + @State private var presentLoginScreen = true + @State private var showDialog = false + @State private var dialogMessage = "" + + @Environment(\.presentationMode) var presentationMode + private var viewModel = KotlinDependencies.shared.getHomeViewModel() + + var body: some View { + VStack(alignment: .center, spacing: 16) { + Text("Welcome!") + .font(.title) + .fontWeight(.bold) + .padding(.bottom, 16) + Text(viewModel.homeText) + .font(.body) + .fontWeight(.regular) + .padding(.bottom, 16) + Button(action: { + viewModel.updateProfileWithErr() + showDialog = true + dialogMessage = "An error occurred during profile update" + }) { + Text("Update Profile (error)") + } + Button(action: { presentLoginScreen = true }) { + Text("Log Out") + } + .sheet(isPresented: $presentLoginScreen) { + LoginScreen() + } + .frame(maxWidth: .infinity) + .padding(.top, 16) + } + .padding(16) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .alert(isPresented: $showDialog) { + Alert( + title: Text("Error"), + message: Text(dialogMessage), + dismissButton: .default(Text("OK")) { + showDialog = false + } + ) + } + } +} diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Info.plist b/sentry-samples/kmp-app-2/iosApp/iosApp/Info.plist new file mode 100644 index 00000000..8044709c --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/Info.plist @@ -0,0 +1,48 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UILaunchScreen + + + \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Koin.swift b/sentry-samples/kmp-app-2/iosApp/iosApp/Koin.swift new file mode 100644 index 00000000..5c01cc17 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/Koin.swift @@ -0,0 +1,12 @@ +import Foundation +import shared + +func startKoin() { + let koinApplication = KoinIOSKt.doInitKoinIos() + _koin = koinApplication.koin +} + +private var _koin: Koin_coreKoin? +var koin: Koin_coreKoin { + return _koin! +} \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/LoginScreen.swift b/sentry-samples/kmp-app-2/iosApp/iosApp/LoginScreen.swift new file mode 100644 index 00000000..f2699fe7 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/LoginScreen.swift @@ -0,0 +1,70 @@ +import SwiftUI +import shared + +struct LoginScreen: View { + @State private var email = "user@sentrydemo.com" + @State private var password = "randompassword" + @State private var enableLoginError = true + @State private var showDialog = false + @State private var dialogMessage = "" + @State private var isLoggedIn = false + @Environment(\.presentationMode) var presentationMode + + private var viewModel = KotlinDependencies.shared.getAuthenticationViewModel() + + var body: some View { + VStack(alignment: .center, spacing: 16) { + Text("Sentry Demo") + .font(.title) + .fontWeight(.bold) + .padding(.bottom, 16) + TextField("Email", text: $email) + .keyboardType(.emailAddress) + .textFieldStyle(RoundedBorderTextFieldStyle()) + SecureField("Password", text: $password) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .padding(.top, 16) + Button(action: { + let succeded = viewModel.login(withError: enableLoginError) + if succeded { + // present home screen + presentationMode.wrappedValue.dismiss() + } else { + dialogMessage = "An error occurred during login" + showDialog = true + } + }) { + if (enableLoginError) { + Text("Log In (error)") + } else { + Text("Log In") + } + } + .frame(maxWidth: .infinity) + .padding(.top, 16) + Button(action: { + viewModel.signUp() + }) { + Text("Sign up (crash)") + } + .frame(maxWidth: .infinity) + .padding(.top, 16) + HStack { + Text("Enable login error") + Toggle("", isOn: $enableLoginError) + .padding(.trailing, 8) + } + } + .padding(16) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .alert(isPresented: $showDialog) { + Alert( + title: Text("Error"), + message: Text(dialogMessage), + dismissButton: .default(Text("OK")) { + showDialog = false + } + ) + } + } +} diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/sentry-samples/kmp-app-2/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000..4aa7c535 --- /dev/null +++ b/sentry-samples/kmp-app-2/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/shared/build.gradle.kts b/sentry-samples/kmp-app-2/shared/build.gradle.kts new file mode 100644 index 00000000..e0d893eb --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/build.gradle.kts @@ -0,0 +1,75 @@ +plugins { + kotlin("multiplatform") + kotlin("native.cocoapods") + id("com.android.library") +} + +kotlin { + android() + iosX64() + iosArm64() + iosSimulatorArm64() + + cocoapods { + summary = "Some description for the Shared Module" + homepage = "Link to the Shared Module homepage" + version = "1.0" + ios.deploymentTarget = "14.1" + podfile = project.file("../iosApp/Podfile") + + pod("Sentry", "~> 8.3.3") + + framework { + baseName = "shared" + export(project(":sentry-kotlin-multiplatform")) + } + } + + sourceSets { + val commonMain by getting { + dependencies { + api(project(":sentry-kotlin-multiplatform")) + implementation("io.insert-koin:koin-core:3.2.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + } + } + val commonTest by getting { + dependencies { + implementation(kotlin("test")) + } + } + val androidMain by getting { + dependencies { + implementation("androidx.lifecycle:lifecycle-viewmodel:2.4.0-alpha03") + } + } + val androidUnitTest by getting + val iosX64Main by getting + val iosArm64Main by getting + val iosSimulatorArm64Main by getting + val iosMain by creating { + dependsOn(commonMain) + iosX64Main.dependsOn(this) + iosArm64Main.dependsOn(this) + iosSimulatorArm64Main.dependsOn(this) + } + val iosX64Test by getting + val iosArm64Test by getting + val iosSimulatorArm64Test by getting + val iosTest by creating { + dependsOn(commonTest) + iosX64Test.dependsOn(this) + iosArm64Test.dependsOn(this) + iosSimulatorArm64Test.dependsOn(this) + } + } +} + +android { + compileSdk = 31 + defaultConfig { + minSdk = 21 + targetSdk = 31 + } + namespace = "io.sentry.kmp.demo" +} diff --git a/sentry-samples/kmp-app-2/shared/shared.podspec b/sentry-samples/kmp-app-2/shared/shared.podspec new file mode 100644 index 00000000..7887ad43 --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/shared.podspec @@ -0,0 +1,39 @@ +Pod::Spec.new do |spec| + spec.name = 'shared' + spec.version = '1.0' + spec.homepage = 'Link to the Shared Module homepage' + spec.source = { :http=> ''} + spec.authors = '' + spec.license = '' + spec.summary = 'Some description for the Shared Module' + spec.vendored_frameworks = 'build/cocoapods/framework/shared.framework' + spec.libraries = 'c++' + spec.ios.deployment_target = '14.1' + spec.dependency 'Sentry', '~> 8.3.3' + + spec.pod_target_xcconfig = { + 'KOTLIN_PROJECT_PATH' => ':sentry-samples:kmp-app-2:shared', + 'PRODUCT_MODULE_NAME' => 'shared', + } + + spec.script_phases = [ + { + :name => 'Build shared', + :execution_position => :before_compile, + :shell_path => '/bin/sh', + :script => <<-SCRIPT + if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then + echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"" + exit 0 + fi + set -ev + REPO_ROOT="$PODS_TARGET_SRCROOT" + "$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" + SCRIPT + } + ] + +end \ No newline at end of file diff --git a/sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt b/sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt new file mode 100644 index 00000000..db9d507f --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt @@ -0,0 +1,10 @@ +package io.sentry.kmp.demo + +import io.sentry.kmp.demo.models.AuthenticationViewModel +import io.sentry.kmp.demo.models.HomeViewModel +import org.koin.dsl.module + +actual val platformModule = module { + single { AuthenticationViewModel() } + single { HomeViewModel() } +} diff --git a/sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt new file mode 100644 index 00000000..cf26f82c --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt @@ -0,0 +1,13 @@ +package io.sentry.kmp.demo.models + +import kotlinx.coroutines.CoroutineScope +import androidx.lifecycle.ViewModel as AndroidXViewModel +import androidx.lifecycle.viewModelScope as androidXViewModelScope + +actual abstract class ViewModel actual constructor() : AndroidXViewModel() { + actual val viewModelScope: CoroutineScope = androidXViewModelScope + + actual override fun onCleared() { + super.onCleared() + } +} diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt new file mode 100644 index 00000000..725cadd3 --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt @@ -0,0 +1,17 @@ +package io.sentry.kmp.demo + +import org.koin.core.KoinApplication +import org.koin.core.context.startKoin +import org.koin.core.module.Module + +fun initKoin(appModule: Module): KoinApplication { + val koinApplication = startKoin { + modules( + appModule, + platformModule + ) + } + return koinApplication +} + +expect val platformModule: Module diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt new file mode 100644 index 00000000..e0489e39 --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt @@ -0,0 +1,35 @@ +package io.sentry.kmp.demo.models + +import io.sentry.kotlin.multiplatform.Sentry +import io.sentry.kotlin.multiplatform.SentryLevel +import io.sentry.kotlin.multiplatform.protocol.Breadcrumb + +class LoginException(message: String) : Exception(message) + +class AuthenticationViewModel : ViewModel() { + + fun login(withError: Boolean): Boolean { + return if (withError) { + try { + throw LoginException("Error logging in") + } catch (exception: Exception) { + Sentry.captureException(exception) { + val breadcrumb = Breadcrumb.error("Error during login").apply { + setData("touch event", "on login") + } + it.addBreadcrumb(breadcrumb) + it.setContext("Login", "Failed due to ...") + it.setTag("login", "failed") + it.level = SentryLevel.ERROR + } + false + } + } else { + true + } + } + + fun signUp() { + Sentry.crash() + } +} diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt new file mode 100644 index 00000000..090b5e12 --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt @@ -0,0 +1,20 @@ +package io.sentry.kmp.demo.models + +import io.sentry.kotlin.multiplatform.ScopeCallback +import io.sentry.kotlin.multiplatform.Sentry + +class ProfileUpdateException(message: String) : Exception(message) + +class HomeViewModel : ViewModel() { + + val homeText = + "This screen will show you how we can change the scope of each Sentry event via captureException!" + + private val scopeConfig: ScopeCallback = { + it.setContext("home", "logged in") + } + + fun updateProfileWithErr() { + Sentry.captureException(ProfileUpdateException("Error updating profile"), scopeConfig) + } +} diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt new file mode 100644 index 00000000..74041621 --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt @@ -0,0 +1,8 @@ +package io.sentry.kmp.demo.models + +import kotlinx.coroutines.CoroutineScope + +expect abstract class ViewModel() { + val viewModelScope: CoroutineScope + protected open fun onCleared() +} diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt new file mode 100644 index 00000000..b7abccfa --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt @@ -0,0 +1,55 @@ +package io.sentry.kmp.demo.sentry + +import io.sentry.kotlin.multiplatform.Attachment +import io.sentry.kotlin.multiplatform.Context +import io.sentry.kotlin.multiplatform.OptionsConfiguration +import io.sentry.kotlin.multiplatform.Sentry +import kotlin.experimental.ExperimentalObjCRefinement +import kotlin.native.HiddenFromObjC + +/** Shared options configuration */ +private val optionsConfiguration: OptionsConfiguration = { + it.dsn = "https://83f281ded2844eda83a8a413b080dbb9@o447951.ingest.sentry.io/5903800" + it.attachStackTrace = true + it.attachThreads = true + it.attachScreenshot = true + it.release = "kmp-release@0.0.1" + it.beforeBreadcrumb = { breadcrumb -> + breadcrumb.message = "Add message before every breadcrumb" + breadcrumb + } +} + +/** + * Initializes Sentry with given options. + * Make sure to hook this into your native platforms as early as possible + */ +@OptIn(ExperimentalObjCRefinement::class) +@HiddenFromObjC +fun initSentry(context: Context) { + Sentry.init(context, optionsConfiguration) + configureSentryScope() +} + +/** + * Convenience initializer for Cocoa targets. + * Kotlin -> ObjC doesn't support default parameters (yet). + */ +fun start() { + Sentry.init(optionsConfiguration) + configureSentryScope() +} + +/** Configure scope applicable to all platforms */ +private fun configureSentryScope() { + Sentry.configureScope { + it.setContext("Custom Context", "Shared Context") + it.setTag("custom-tag", "from shared code") + it.addAttachment( + Attachment( + "This is a shared text attachment".encodeToByteArray(), + "shared.log" + ) + ) + } +} diff --git a/sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt b/sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt new file mode 100644 index 00000000..2c3c3f5e --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt @@ -0,0 +1,22 @@ +package io.sentry.kmp.demo + +import io.sentry.kmp.demo.models.AuthenticationViewModel +import io.sentry.kmp.demo.models.HomeViewModel +import org.koin.core.KoinApplication +import org.koin.core.component.KoinComponent +import org.koin.dsl.module + +fun initKoinIos(): KoinApplication = initKoin( + module { } +) + +actual val platformModule = module { + single { AuthenticationViewModel() } + single { HomeViewModel() } +} + +@Suppress("unused") // Called from Swift +object KotlinDependencies : KoinComponent { + fun getAuthenticationViewModel() = getKoin().get() + fun getHomeViewModel() = getKoin().get() +} diff --git a/sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt new file mode 100644 index 00000000..45e1d9c2 --- /dev/null +++ b/sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt @@ -0,0 +1,30 @@ +package io.sentry.kmp.demo.models + +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel + +/** + * Base class that provides a Kotlin/Native equivalent to the AndroidX `ViewModel`. In particular, this provides + * a [CoroutineScope][kotlinx.coroutines.CoroutineScope] which uses [Dispatchers.Main][kotlinx.coroutines.Dispatchers.Main] + * and can be tied into an arbitrary lifecycle by calling [clear] at the appropriate time. + */ +actual abstract class ViewModel { + + actual val viewModelScope = MainScope() + + /** + * Override this to do any cleanup immediately before the internal [CoroutineScope][kotlinx.coroutines.CoroutineScope] + * is cancelled in [clear] + */ + protected actual open fun onCleared() { + } + + /** + * Cancels the internal [CoroutineScope][kotlinx.coroutines.CoroutineScope]. After this is called, the ViewModel should + * no longer be used. + */ + fun clear() { + onCleared() + viewModelScope.cancel() + } +} diff --git a/sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj b/sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj index ca21bc09..cc7c5f51 100644 --- a/sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj @@ -108,6 +108,7 @@ 7555FF79242A565900829871 /* Resources */, 870B838CCCF9D96E0B41F9F4 /* Frameworks */, 3620F85FA2EFF718C6F7366B /* [CP] Embed Pods Frameworks */, + 244CD82629E05BE700F8451F /* Senry dsyms upload */, ); buildRules = ( ); @@ -165,6 +166,25 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 244CD82629E05BE700F8451F /* Senry dsyms upload */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + ); + name = "Senry dsyms upload"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which sentry-cli >/dev/null; then\nexport SENTRY_ORG=sentry-sdks\nexport SENTRY_PROJECT=sentry-kotlin-multiplatform\nexport SENTRY_AUTH_TOKEN=14e7bf400bc449589fdc32fad8beaad003456b05b784403fb11d109b6276cefe\nERROR=$(sentry-cli upload-dif \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; + }; 3620F85FA2EFF718C6F7366B /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/settings.gradle.kts b/settings.gradle.kts index 05b5c78d..f7268242 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,7 @@ pluginManagement { gradlePluginPortal() mavenCentral() maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev/") } } @@ -12,6 +13,8 @@ dependencyResolutionManagement { mavenCentral() mavenLocal() google() + maven("https://androidx.dev/storage/compose-compiler/repository/") + maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev/") } } @@ -28,3 +31,14 @@ KMP App with targets: include("sentry-samples:kmp-app:shared") include("sentry-samples:kmp-app:androidApp") include("sentry-samples:kmp-app:desktopApp") + +/* +KMP App with targets: + - Android with Jetpack Compose + - iOS with SwiftUI + - Dependency Injection with Koin + - MVVM Architecture + */ +include("sentry-samples:kmp-app-2:iosApp") +include("sentry-samples:kmp-app-2:androidApp") +include("sentry-samples:kmp-app-2:shared") From ad8e5a0b8cac817e8b7aa71c5ae66fafbefdbbc9 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Sat, 8 Apr 2023 00:43:31 +0200 Subject: [PATCH 02/16] rename sample --- gradle/libs.versions.toml | 74 ------------------ .../{kmp-app-2 => kmp-app-mvvm-di}/README.md | 0 .../androidApp/build.gradle.kts | 2 +- .../androidApp/proguard-rules.pro | 0 .../androidApp/src/main/AndroidManifest.xml | 0 .../sentry/kmp/demo/android/MainActivity.kt | 0 .../io/sentry/kmp/demo/android/MainApp.kt | 0 .../io/sentry/kmp/demo/android/theme/Color.kt | 0 .../sentry/kmp/demo/android/theme/Shapes.kt | 0 .../io/sentry/kmp/demo/android/theme/Theme.kt | 0 .../kmp/demo/android/theme/Typography.kt | 0 .../sentry/kmp/demo/android/ui/Composables.kt | 0 .../sentry/kmp/demo/android/ui/HomeScreen.kt | 0 .../sentry/kmp/demo/android/ui/LoginScreen.kt | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../main/res/drawable/ic_favorite_24px.xml | 0 .../res/drawable/ic_favorite_border_24px.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../androidApp/src/main/res/values/colors.xml | 0 .../src/main/res/values/strings.xml | 0 .../androidApp/src/main/res/values/styles.xml | 0 .../iosApp/Podfile | 0 .../iosApp/Podfile.lock | 2 +- .../iosApp/iosApp.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../iosApp/iosApp/AppDelegate.swift | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../iosApp/Assets.xcassets/Contents.json | 0 .../iosApp/iosApp/HomeScreen.swift | 0 .../iosApp/iosApp/Info.plist | 0 .../iosApp/iosApp/Koin.swift | 0 .../iosApp/iosApp/LoginScreen.swift | 0 .../Preview Assets.xcassets/Contents.json | 0 .../shared/build.gradle.kts | 0 .../shared/shared.podspec | 2 +- .../kotlin/io/sentry/kmp/demo/KoinAndroid.kt | 0 .../io/sentry/kmp/demo/models/ViewModel.kt | 0 .../kotlin/io/sentry/kmp/demo/Koin.kt | 0 .../demo/models/AuthenticationViewModel.kt | 0 .../sentry/kmp/demo/models/HomeViewModel.kt | 0 .../io/sentry/kmp/demo/models/ViewModel.kt | 0 .../io/sentry/kmp/demo/sentry/SentrySetup.kt | 0 .../kotlin/io/sentry/kmp/demo/KoinIOS.kt | 0 .../io/sentry/kmp/demo/models/ViewModel.kt | 0 settings.gradle.kts | 6 +- 59 files changed, 6 insertions(+), 80 deletions(-) delete mode 100644 gradle/libs.versions.toml rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/README.md (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/build.gradle.kts (99%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/proguard-rules.pro (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/AndroidManifest.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/drawable/ic_favorite_24px.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/drawable/ic_launcher_background.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/values/colors.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/values/strings.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/androidApp/src/main/res/values/styles.xml (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/Podfile (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/Podfile.lock (91%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp.xcodeproj/project.pbxproj (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp.xcworkspace/contents.xcworkspacedata (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/AppDelegate.swift (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/Assets.xcassets/Contents.json (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/HomeScreen.swift (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/Info.plist (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/Koin.swift (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/LoginScreen.swift (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/build.gradle.kts (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/shared.podspec (95%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt (100%) rename sentry-samples/{kmp-app-2 => kmp-app-mvvm-di}/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt (100%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml deleted file mode 100644 index 10b01c96..00000000 --- a/gradle/libs.versions.toml +++ /dev/null @@ -1,74 +0,0 @@ -[versions] -## SDK Versions -minSdk = "21" -targetSdk = "33" -compileSdk = "33" - -## Dependencies -com-android-application = "8.1.0-alpha10" -org-jetbrains-kotlin-android = "1.8.0" -core-ktx = "1.9.0" -junit = "4.13.2" -androidx-test-ext-junit = "1.1.5" -espresso-core = "3.5.1" -appcompat = "1.6.1" -material = "1.8.0" -sentry-kotlin-multiplatform = "0.0.3" -koin = "3.2.0" - -coroutines = "1.6.4" - -compose = "1.4.0-alpha03" -composeCompiler = "1.4.0-dev-k1.8.0-33c0ad36f83" - -android-desugaring = "1.1.8" # Don't bump to 1.2.x until AGP is 7.3.x -androidx-core = "1.9.0" -androidx-test-junit = "1.1.3" -androidx-activity-compose = "1.5.1" -androidx-lifecycle = "2.5.1" - -[libraries] -core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } - -sentry-kotlin-multiplatform = { module = "io.sentry:sentry-kotlin-multiplatform", version.ref = "sentry-kotlin-multiplatform" } - -koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } -koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } - -coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } - -android-desugaring = { module = "com.android.tools:desugar_jdk_libs", version.ref = "android-desugaring" } -androidx-core = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } -androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidx-lifecycle" } -androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } -androidx-test-junit = { module = "androidx.test.ext:junit-ktx", version.ref = "androidx-test-junit" } - -junit = { group = "junit", name = "junit", version.ref = "junit" } -androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } -espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } -appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } -material = { group = "com.google.android.material", name = "material", version.ref = "material" } - -compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "composeCompiler" } -compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" } -compose-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } -compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose" } -compose-material = { module = "androidx.compose.material:material", version.ref = "compose" } -compose-activity = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" } - -[plugins] -com-android-application = { id = "com.android.application", version.ref = "com-android-application" } -org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin-android" } - -[bundles] -app-ui = [ - "compose-compiler", - "androidx-core", - "androidx-lifecycle-runtime", - "androidx-lifecycle-viewmodel", - "compose-ui", - "compose-tooling", - "compose-foundation", - "compose-material", - "compose-activity", -] diff --git a/sentry-samples/kmp-app-2/README.md b/sentry-samples/kmp-app-mvvm-di/README.md similarity index 100% rename from sentry-samples/kmp-app-2/README.md rename to sentry-samples/kmp-app-mvvm-di/README.md diff --git a/sentry-samples/kmp-app-2/androidApp/build.gradle.kts b/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts similarity index 99% rename from sentry-samples/kmp-app-2/androidApp/build.gradle.kts rename to sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts index 507a055c..8bab49b8 100644 --- a/sentry-samples/kmp-app-2/androidApp/build.gradle.kts +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts @@ -33,7 +33,7 @@ android { } dependencies { - implementation(rootProject.project(":sentry-samples:kmp-app-2:shared")) + implementation(rootProject.project(":sentry-samples:kmp-app-mvvm-di:shared")) implementation("androidx.core:core-ktx:1.9.0") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") implementation("androidx.appcompat:appcompat:1.6.1") diff --git a/sentry-samples/kmp-app-2/androidApp/proguard-rules.pro b/sentry-samples/kmp-app-mvvm-di/androidApp/proguard-rules.pro similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/proguard-rules.pro rename to sentry-samples/kmp-app-mvvm-di/androidApp/proguard-rules.pro diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/AndroidManifest.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/AndroidManifest.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/AndroidManifest.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/AndroidManifest.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_24px.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/drawable/ic_favorite_24px.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_24px.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/drawable/ic_favorite_24px.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_launcher_background.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/drawable/ic_launcher_background.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/drawable/ic_launcher_background.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/values/colors.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/values/colors.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/values/colors.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/values/colors.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/values/strings.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/values/strings.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/values/strings.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/values/strings.xml diff --git a/sentry-samples/kmp-app-2/androidApp/src/main/res/values/styles.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/values/styles.xml similarity index 100% rename from sentry-samples/kmp-app-2/androidApp/src/main/res/values/styles.xml rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/res/values/styles.xml diff --git a/sentry-samples/kmp-app-2/iosApp/Podfile b/sentry-samples/kmp-app-mvvm-di/iosApp/Podfile similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/Podfile rename to sentry-samples/kmp-app-mvvm-di/iosApp/Podfile diff --git a/sentry-samples/kmp-app-2/iosApp/Podfile.lock b/sentry-samples/kmp-app-mvvm-di/iosApp/Podfile.lock similarity index 91% rename from sentry-samples/kmp-app-2/iosApp/Podfile.lock rename to sentry-samples/kmp-app-mvvm-di/iosApp/Podfile.lock index 7b410697..1b11a641 100644 --- a/sentry-samples/kmp-app-2/iosApp/Podfile.lock +++ b/sentry-samples/kmp-app-mvvm-di/iosApp/Podfile.lock @@ -23,7 +23,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Sentry: 8ffc397d98fe58d693e73959b26ed0eaee55646a SentryPrivate: bf776a47a131648f5023097215987b40fbd47025 - shared: ca840f618eed601b609feebc53a7e930427e5b00 + shared: a7939828ea6576c539123cff478ad06568708679 PODFILE CHECKSUM: f282da88f39e69507b0a255187c8a6b644477756 diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp.xcodeproj/project.pbxproj b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp.xcodeproj/project.pbxproj rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/contents.xcworkspacedata b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcworkspace/contents.xcworkspacedata similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/contents.xcworkspacedata rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcworkspace/contents.xcworkspacedata diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/AppDelegate.swift b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/AppDelegate.swift similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/AppDelegate.swift rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/AppDelegate.swift diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/Contents.json b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Assets.xcassets/Contents.json similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/Assets.xcassets/Contents.json rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Assets.xcassets/Contents.json diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/HomeScreen.swift b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/HomeScreen.swift similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/HomeScreen.swift rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/HomeScreen.swift diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Info.plist b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Info.plist similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/Info.plist rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Info.plist diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Koin.swift b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Koin.swift similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/Koin.swift rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Koin.swift diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/LoginScreen.swift b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/LoginScreen.swift similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/LoginScreen.swift rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/LoginScreen.swift diff --git a/sentry-samples/kmp-app-2/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from sentry-samples/kmp-app-2/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json rename to sentry-samples/kmp-app-mvvm-di/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/sentry-samples/kmp-app-2/shared/build.gradle.kts b/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts similarity index 100% rename from sentry-samples/kmp-app-2/shared/build.gradle.kts rename to sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts diff --git a/sentry-samples/kmp-app-2/shared/shared.podspec b/sentry-samples/kmp-app-mvvm-di/shared/shared.podspec similarity index 95% rename from sentry-samples/kmp-app-2/shared/shared.podspec rename to sentry-samples/kmp-app-mvvm-di/shared/shared.podspec index 7887ad43..103b4f00 100644 --- a/sentry-samples/kmp-app-2/shared/shared.podspec +++ b/sentry-samples/kmp-app-mvvm-di/shared/shared.podspec @@ -12,7 +12,7 @@ Pod::Spec.new do |spec| spec.dependency 'Sentry', '~> 8.3.3' spec.pod_target_xcconfig = { - 'KOTLIN_PROJECT_PATH' => ':sentry-samples:kmp-app-2:shared', + 'KOTLIN_PROJECT_PATH' => ':sentry-samples:kmp-app-mvvm-di:shared', 'PRODUCT_MODULE_NAME' => 'shared', } diff --git a/sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt diff --git a/sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt diff --git a/sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt diff --git a/sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt diff --git a/sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt similarity index 100% rename from sentry-samples/kmp-app-2/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index f7268242..24cf6c07 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,6 +39,6 @@ KMP App with targets: - Dependency Injection with Koin - MVVM Architecture */ -include("sentry-samples:kmp-app-2:iosApp") -include("sentry-samples:kmp-app-2:androidApp") -include("sentry-samples:kmp-app-2:shared") +include("sentry-samples:kmp-app-mvvm-di:iosApp") +include("sentry-samples:kmp-app-mvvm-di:androidApp") +include("sentry-samples:kmp-app-mvvm-di:shared") From c459edc90e900adf13d729d359249fc70b67b8ab Mon Sep 17 00:00:00 2001 From: buenaflor Date: Sat, 8 Apr 2023 01:15:00 +0200 Subject: [PATCH 03/16] update instructions --- sentry-samples/kmp-app-mvvm-di/README.md | 19 +++++++++++++++---- .../iosApp/iosApp.xcodeproj/project.pbxproj | 3 ++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/sentry-samples/kmp-app-mvvm-di/README.md b/sentry-samples/kmp-app-mvvm-di/README.md index b2c72b38..e2b71bfe 100644 --- a/sentry-samples/kmp-app-mvvm-di/README.md +++ b/sentry-samples/kmp-app-mvvm-di/README.md @@ -13,9 +13,20 @@ This is a demo app for the Sentry Kotlin Multiplatform SDK that includes a nativ If you need to change the `DSN` you can do so in the `SentrySetup.kt` file in the `shared` module. ### DSYMS for iOS -First: you need to have `sentry-cli` installed. +First you need to have `sentry-cli` installed. -The build script is already configured to upload the DSYMS to Sentry. -It's called `Sentry dsyms upload` and you can find it under `build phases`. -You only need to change the `SENTRY_AUTH_TOKEN`, `SENTRY_PROJECT` and `SENTRY_ORG` values in the script. +Then add the following script to your `Build Phases` in Xcode and change the `org`, `project`, `auth_token` slugs accordingly: +```shell +if which sentry-cli >/dev/null; then +export SENTRY_ORG= +export SENTRY_PROJECT= +export SENTRY_AUTH_TOKEN= +ERROR=$(sentry-cli upload-dif "$DWARF_DSYM_FOLDER_PATH" 2>&1 >/dev/null) +if [ ! $? -eq 0 ]; then +echo "warning: sentry-cli - $ERROR" +fi +else +echo "warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases" +fi +``` diff --git a/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj index 1855d50e..f798f57c 100644 --- a/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj @@ -185,7 +185,8 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if which sentry-cli >/dev/null; then\nexport SENTRY_ORG=\nexport SENTRY_PROJECT=\nexport SENTRY_AUTH_TOKEN=\nERROR=$(sentry-cli upload-dif \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; + shellScript = " +"; }; 4E7E0840DFEC454A512192BD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; From 8926c48fd908987f7b6a7e067ad6821d5cfa0cd7 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Tue, 11 Apr 2023 10:47:32 +0200 Subject: [PATCH 04/16] fix in app detection --- sentry-samples/kmp-app/androidApp/build.gradle.kts | 2 +- sentry-samples/kmp-app/androidApp/src/main/AndroidManifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-samples/kmp-app/androidApp/build.gradle.kts b/sentry-samples/kmp-app/androidApp/build.gradle.kts index a1081d5d..9ea95fc7 100644 --- a/sentry-samples/kmp-app/androidApp/build.gradle.kts +++ b/sentry-samples/kmp-app/androidApp/build.gradle.kts @@ -6,7 +6,7 @@ plugins { android { compileSdk = Config.Android.compileSdkVersion defaultConfig { - applicationId = "sample.kpm_app.android" + applicationId = "sample.kmp.app.android" minSdk = Config.Android.minSdkVersion targetSdk = Config.Android.targetSdkVersion versionCode = 1 diff --git a/sentry-samples/kmp-app/androidApp/src/main/AndroidManifest.xml b/sentry-samples/kmp-app/androidApp/src/main/AndroidManifest.xml index bdfc10f4..7a818feb 100644 --- a/sentry-samples/kmp-app/androidApp/src/main/AndroidManifest.xml +++ b/sentry-samples/kmp-app/androidApp/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="sample.kmp.app.android"> Date: Tue, 11 Apr 2023 10:04:02 +0200 Subject: [PATCH 05/16] remove cli config --- .../iosApp/iosApp.xcodeproj/project.pbxproj | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj index f798f57c..f9a6201c 100644 --- a/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj @@ -111,7 +111,7 @@ 7555FF79242A565900829871 /* Resources */, DAA6816987C1F96EB698F1CE /* Frameworks */, 80B824D75AE06EF6630365EC /* [CP] Embed Pods Frameworks */, - 244CD81729DF007900F8451F /* Sentry dsyms upload */, + 244CD82729E54BA500F8451F /* Sentry dsyms upload */, ); buildRules = ( ); @@ -168,7 +168,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 244CD81729DF007900F8451F /* Sentry dsyms upload */ = { + 244CD82729E54BA500F8451F /* Sentry dsyms upload */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -185,8 +185,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = " -"; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n"; }; 4E7E0840DFEC454A512192BD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; From e65f7d40f69d4923bb5ea104d756956fe3d5320f Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 10:06:39 +0200 Subject: [PATCH 06/16] add pod install info --- sentry-samples/kmp-app-mvvm-di/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sentry-samples/kmp-app-mvvm-di/README.md b/sentry-samples/kmp-app-mvvm-di/README.md index e2b71bfe..2756be9d 100644 --- a/sentry-samples/kmp-app-mvvm-di/README.md +++ b/sentry-samples/kmp-app-mvvm-di/README.md @@ -9,6 +9,12 @@ This is a demo app for the Sentry Kotlin Multiplatform SDK that includes a nativ ## Getting Started +### Cocoapods +You need Cocoapods installed on your machine. + +`pod install` will automatically run through gradle if you run the iOS app. +However, you can still run `pod install` on the ios folder manually if you want to make sure the pods are up to date. + ### DSN If you need to change the `DSN` you can do so in the `SentrySetup.kt` file in the `shared` module. From 6166fb628cd761f7e7777ddb8a5af07e74d945bd Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 10:10:15 +0200 Subject: [PATCH 07/16] sample dsym script upload --- .../kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj index f9a6201c..2d95045f 100644 --- a/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcodeproj/project.pbxproj @@ -185,7 +185,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n"; + shellScript = "if which sentry-cli >/dev/null; then\nexport SENTRY_ORG=\nexport SENTRY_PROJECT=\nexport SENTRY_AUTH_TOKEN=\nERROR=$(sentry-cli upload-dif \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; }; 4E7E0840DFEC454A512192BD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; From d68c96800bfed44a971e80a917c5cdd3c03787e8 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 11:07:38 +0200 Subject: [PATCH 08/16] fix build --- sentry-samples/kmp-app-mvvm-di/README.md | 23 +++++++++++---- .../androidApp/build.gradle.kts | 28 ++++++++++--------- .../kmp-app-mvvm-di/shared/build.gradle.kts | 2 +- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/sentry-samples/kmp-app-mvvm-di/README.md b/sentry-samples/kmp-app-mvvm-di/README.md index 2756be9d..3283ec50 100644 --- a/sentry-samples/kmp-app-mvvm-di/README.md +++ b/sentry-samples/kmp-app-mvvm-di/README.md @@ -9,19 +9,29 @@ This is a demo app for the Sentry Kotlin Multiplatform SDK that includes a nativ ## Getting Started -### Cocoapods +### IDE + +Install the [Kotlin Multiplatform Mobile plugin](https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform-mobile) for Android Studio. + +You can use Android Studio to run both the Android and iOS sample apps. + + +### Android +- Export your `ANDROID_HOME` environment variable if you haven't done already. + +### iOS + +#### Cocoapods You need Cocoapods installed on your machine. `pod install` will automatically run through gradle if you run the iOS app. However, you can still run `pod install` on the ios folder manually if you want to make sure the pods are up to date. -### DSN -If you need to change the `DSN` you can do so in the `SentrySetup.kt` file in the `shared` module. - ### DSYMS for iOS First you need to have `sentry-cli` installed. -Then add the following script to your `Build Phases` in Xcode and change the `org`, `project`, `auth_token` slugs accordingly: +Then add the following script to your `Build Phases` in Xcode and change the `org`, `project`, `auth_token` slug placeholders accordingly: +Make sure to change the placeholders correctly, otherwise the iOS app will not run. ```shell if which sentry-cli >/dev/null; then @@ -36,3 +46,6 @@ else echo "warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases" fi ``` + +### Setup +If you need to change the `DSN` or any options you can do so in the `SentrySetup.kt` file in the `shared` module. diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts b/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts index 8bab49b8..4ea3ae8f 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts @@ -13,8 +13,8 @@ android { versionCode = 1 versionName = "1.0" } - packagingOptions { - resources.excludes.add("META-INF/*.kotlin_module") + buildFeatures { + compose = true } buildTypes { getByName("release") { @@ -23,31 +23,33 @@ android { } } compileOptions { - isCoreLibraryDesugaringEnabled = true sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } + composeOptions { + kotlinCompilerExtensionVersion = "1.4.0-dev-k1.8.0-33c0ad36f83" + } } dependencies { implementation(rootProject.project(":sentry-samples:kmp-app-mvvm-di:shared")) - implementation("androidx.core:core-ktx:1.9.0") + implementation("androidx.core:core-ktx:1.10.0") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.8.0") - implementation("androidx.activity:activity-compose:1.5.1") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.1") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1") + implementation("androidx.activity:activity-compose:1.7.0") + implementation("androidx.lifecycle:lifecycle-runtime:2.6.1") + implementation("androidx.lifecycle:lifecycle-viewmodel:2.6.1") + implementation("androidx.navigation:navigation-compose:2.5.3") + implementation("androidx.navigation:navigation-runtime:2.5.3") implementation("io.insert-koin:koin-android:3.2.0") implementation("io.insert-koin:koin-core:3.2.0") - implementation("junit:junit:4.13.2") - implementation("com.android.tools:desugar_jdk_libs:1.1.8") implementation("androidx.compose.compiler:compiler:1.4.0-dev-k1.8.0-33c0ad36f83") - implementation("androidx.compose.ui:ui:1.4.0-alpha03") - implementation("androidx.compose.ui:ui-tooling:1.4.0-alpha03") - implementation("androidx.compose.foundation:foundation:1.4.0-alpha03") - implementation("androidx.compose.material:material:1.4.0-alpha03") + implementation("androidx.compose.ui:ui:1.5.0-alpha02") + implementation("androidx.compose.ui:ui-tooling:1.5.0-alpha02") + implementation("androidx.compose.foundation:foundation:1.5.0-alpha02") + implementation("androidx.compose.material:material:1.5.0-alpha02") } diff --git a/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts b/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts index e0d893eb..76fb03e1 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts +++ b/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts @@ -40,7 +40,7 @@ kotlin { } val androidMain by getting { dependencies { - implementation("androidx.lifecycle:lifecycle-viewmodel:2.4.0-alpha03") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1") } } val androidUnitTest by getting From 93b5a4adb3408dd6d492a1f1eca9ed522c922a40 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 11:13:17 +0200 Subject: [PATCH 09/16] update readme --- sentry-samples/kmp-app-mvvm-di/README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sentry-samples/kmp-app-mvvm-di/README.md b/sentry-samples/kmp-app-mvvm-di/README.md index 3283ec50..c1bcb703 100644 --- a/sentry-samples/kmp-app-mvvm-di/README.md +++ b/sentry-samples/kmp-app-mvvm-di/README.md @@ -15,19 +15,23 @@ Install the [Kotlin Multiplatform Mobile plugin](https://plugins.jetbrains.com/p You can use Android Studio to run both the Android and iOS sample apps. +The targets are both available as `sentry-samples.kmp-app-mvvm-di.iosApp` and `sentry-samples.kmp-app-mvvm-di.androidApp`. ### Android - Export your `ANDROID_HOME` environment variable if you haven't done already. +- You can run `./gradlew :sentry-samples:kmp-app:androidApp:assembleDebug` to compile the Android app. ### iOS #### Cocoapods You need Cocoapods installed on your machine. +Run `export LANG=en_US.UTF-8` to avoid encoding issues. + `pod install` will automatically run through gradle if you run the iOS app. -However, you can still run `pod install` on the ios folder manually if you want to make sure the pods are up to date. +However, you can still run `pod install` on the iOS folder manually if you want to make sure the pods are up to date. -### DSYMS for iOS +#### DSYMS First you need to have `sentry-cli` installed. Then add the following script to your `Build Phases` in Xcode and change the `org`, `project`, `auth_token` slug placeholders accordingly: @@ -47,5 +51,5 @@ echo "warning: sentry-cli not installed, download from https://github.com/getsen fi ``` -### Setup +### Sentry Setup If you need to change the `DSN` or any options you can do so in the `SentrySetup.kt` file in the `shared` module. From 86d2d208c14c4cfe3ba615b02efb1824a0c166d3 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 11:15:19 +0200 Subject: [PATCH 10/16] remove auth token --- sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj b/sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj index cc7c5f51..00439763 100644 --- a/sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sentry-samples/kmp-app/iosApp/iosApp.xcodeproj/project.pbxproj @@ -183,7 +183,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if which sentry-cli >/dev/null; then\nexport SENTRY_ORG=sentry-sdks\nexport SENTRY_PROJECT=sentry-kotlin-multiplatform\nexport SENTRY_AUTH_TOKEN=14e7bf400bc449589fdc32fad8beaad003456b05b784403fb11d109b6276cefe\nERROR=$(sentry-cli upload-dif \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; + shellScript = "if which sentry-cli >/dev/null; then\nexport SENTRY_ORG=\nexport SENTRY_PROJECT=\nexport SENTRY_AUTH_TOKEN=\nERROR=$(sentry-cli upload-dif \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; }; 3620F85FA2EFF718C6F7366B /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; From a179878bc1407b1b6aed42b3c4940ac9508544b1 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 11:38:51 +0200 Subject: [PATCH 11/16] add ide alternative --- sentry-samples/kmp-app-mvvm-di/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry-samples/kmp-app-mvvm-di/README.md b/sentry-samples/kmp-app-mvvm-di/README.md index c1bcb703..9b8ec0ad 100644 --- a/sentry-samples/kmp-app-mvvm-di/README.md +++ b/sentry-samples/kmp-app-mvvm-di/README.md @@ -14,6 +14,7 @@ This is a demo app for the Sentry Kotlin Multiplatform SDK that includes a nativ Install the [Kotlin Multiplatform Mobile plugin](https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform-mobile) for Android Studio. You can use Android Studio to run both the Android and iOS sample apps. +Alternatively you can also run the iOS app directly from Xcode. The targets are both available as `sentry-samples.kmp-app-mvvm-di.iosApp` and `sentry-samples.kmp-app-mvvm-di.androidApp`. From 8eea0eb92a71b4a47da0a36253a98fb1f70e5d6b Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 12:07:23 +0200 Subject: [PATCH 12/16] format --- .../kmp-app-mvvm-di/androidApp/build.gradle.kts | 4 ++-- .../androidApp/src/main/AndroidManifest.xml | 4 ++-- .../{io => }/sentry/kmp/demo/android/MainActivity.kt | 10 +++++----- .../kotlin/{io => }/sentry/kmp/demo/android/MainApp.kt | 6 +++--- .../{io => }/sentry/kmp/demo/android/theme/Color.kt | 2 +- .../{io => }/sentry/kmp/demo/android/theme/Shapes.kt | 2 +- .../{io => }/sentry/kmp/demo/android/theme/Theme.kt | 2 +- .../sentry/kmp/demo/android/theme/Typography.kt | 2 +- .../{io => }/sentry/kmp/demo/android/ui/Composables.kt | 6 +++--- .../{io => }/sentry/kmp/demo/android/ui/HomeScreen.kt | 4 ++-- .../{io => }/sentry/kmp/demo/android/ui/LoginScreen.kt | 4 ++-- sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts | 2 +- .../kotlin/{io => }/sentry/kmp/demo/KoinAndroid.kt | 6 +++--- .../{io => }/sentry/kmp/demo/models/ViewModel.kt | 2 +- .../{io/sentry/kmp/demo => sentry.kmp.demo}/Koin.kt | 2 +- .../models/AuthenticationViewModel.kt | 2 +- .../demo => sentry.kmp.demo}/models/HomeViewModel.kt | 2 +- .../kmp/demo => sentry.kmp.demo}/models/ViewModel.kt | 2 +- .../kmp/demo => sentry.kmp.demo}/sentry/SentrySetup.kt | 2 +- .../{io/sentry/kmp/demo => sentry.kmp.demo}/KoinIOS.kt | 6 +++--- .../kmp/demo => sentry.kmp.demo}/models/ViewModel.kt | 2 +- 21 files changed, 37 insertions(+), 37 deletions(-) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/MainActivity.kt (74%) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/MainApp.kt (80%) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/theme/Color.kt (81%) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/theme/Shapes.kt (86%) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/theme/Theme.kt (95%) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/theme/Typography.kt (90%) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/ui/Composables.kt (81%) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/ui/HomeScreen.kt (96%) rename sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/{io => }/sentry/kmp/demo/android/ui/LoginScreen.kt (97%) rename sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/{io => }/sentry/kmp/demo/KoinAndroid.kt (51%) rename sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/{io => }/sentry/kmp/demo/models/ViewModel.kt (91%) rename sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/{io/sentry/kmp/demo => sentry.kmp.demo}/Koin.kt (92%) rename sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/{io/sentry/kmp/demo => sentry.kmp.demo}/models/AuthenticationViewModel.kt (96%) rename sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/{io/sentry/kmp/demo => sentry.kmp.demo}/models/HomeViewModel.kt (94%) rename sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/{io/sentry/kmp/demo => sentry.kmp.demo}/models/ViewModel.kt (82%) rename sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/{io/sentry/kmp/demo => sentry.kmp.demo}/sentry/SentrySetup.kt (97%) rename sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/{io/sentry/kmp/demo => sentry.kmp.demo}/KoinIOS.kt (79%) rename sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/{io/sentry/kmp/demo => sentry.kmp.demo}/models/ViewModel.kt (96%) diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts b/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts index 4ea3ae8f..88c03a11 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/build.gradle.kts @@ -4,10 +4,10 @@ plugins { } android { - namespace = "io.sentry.kmp.demo.android" + namespace = "sentry.kmp.demo.android" compileSdk = 33 defaultConfig { - applicationId = "io.sentry.kmp.demo" + applicationId = "sentry.kmp.demo" minSdk = 21 targetSdk = 33 versionCode = 1 diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/AndroidManifest.xml b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/AndroidManifest.xml index dc16bc9e..f6802f44 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/AndroidManifest.xml +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainActivity.kt similarity index 74% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainActivity.kt index c11d106f..d66aaab1 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainActivity.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainActivity.kt @@ -1,14 +1,14 @@ -package io.sentry.kmp.demo.android +package sentry.kmp.demo.android import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import io.sentry.kmp.demo.android.theme.Theme -import io.sentry.kmp.demo.android.ui.MyApp -import io.sentry.kmp.demo.models.AuthenticationViewModel -import io.sentry.kmp.demo.models.HomeViewModel import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.component.KoinComponent +import sentry.kmp.demo.android.theme.Theme +import sentry.kmp.demo.android.ui.MyApp +import sentry.kmp.demo.models.AuthenticationViewModel +import sentry.kmp.demo.models.HomeViewModel class MainActivity : ComponentActivity(), KoinComponent { diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainApp.kt similarity index 80% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainApp.kt index ef91ac68..719a6e06 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/MainApp.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainApp.kt @@ -1,11 +1,11 @@ -package io.sentry.kmp.demo.android +package sentry.kmp.demo.android import android.app.Application import android.content.Context import android.util.Log -import io.sentry.kmp.demo.initKoin -import io.sentry.kmp.demo.sentry.initSentry import org.koin.dsl.module +import sentry.kmp.demo.initKoin +import sentry.kmp.demo.sentry.initSentry class MainApp : Application() { diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Color.kt similarity index 81% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Color.kt index 699f78d0..81b515ff 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Color.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Color.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.android.theme +package sentry.kmp.demo.android.theme import androidx.compose.ui.graphics.Color diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Shapes.kt similarity index 86% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Shapes.kt index 3af7284c..ee7ee816 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Shapes.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Shapes.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.android.theme +package sentry.kmp.demo.android.theme import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Shapes diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Theme.kt similarity index 95% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Theme.kt index 840444a9..a1c77b63 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Theme.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Theme.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.android.theme +package sentry.kmp.demo.android.theme import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.MaterialTheme diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Typography.kt similarity index 90% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Typography.kt index 390c3f2c..327d3dde 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/theme/Typography.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/theme/Typography.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.android.theme +package sentry.kmp.demo.android.theme import androidx.compose.material.Typography import androidx.compose.ui.text.TextStyle diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/Composables.kt similarity index 81% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/Composables.kt index 8ace92f3..810ac516 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/Composables.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/Composables.kt @@ -1,11 +1,11 @@ -package io.sentry.kmp.demo.android.ui +package sentry.kmp.demo.android.ui import androidx.compose.runtime.Composable import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import io.sentry.kmp.demo.models.AuthenticationViewModel -import io.sentry.kmp.demo.models.HomeViewModel +import sentry.kmp.demo.models.AuthenticationViewModel +import sentry.kmp.demo.models.HomeViewModel @Composable fun MyApp(authenticationViewModel: AuthenticationViewModel, homeViewModel: HomeViewModel) { diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/HomeScreen.kt similarity index 96% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/HomeScreen.kt index f09f5c7e..dd20aafb 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/HomeScreen.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/HomeScreen.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.android.ui +package sentry.kmp.demo.android.ui import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -19,7 +19,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import io.sentry.kmp.demo.models.HomeViewModel +import sentry.kmp.demo.models.HomeViewModel @Composable fun HomeScreen(navController: NavController, homeViewModel: HomeViewModel) { diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/LoginScreen.kt similarity index 97% rename from sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt rename to sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/LoginScreen.kt index 88d13152..c7c668c8 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/io/sentry/kmp/demo/android/ui/LoginScreen.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/ui/LoginScreen.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.android.ui +package sentry.kmp.demo.android.ui import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -25,7 +25,7 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import io.sentry.kmp.demo.models.AuthenticationViewModel +import sentry.kmp.demo.models.AuthenticationViewModel @Composable fun LoginScreen(navController: NavController, authenticationViewModel: AuthenticationViewModel) { diff --git a/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts b/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts index 76fb03e1..80c8fab9 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts +++ b/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts @@ -71,5 +71,5 @@ android { minSdk = 21 targetSdk = 31 } - namespace = "io.sentry.kmp.demo" + namespace = "sentry.kmp.demo" } diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/sentry/kmp/demo/KoinAndroid.kt similarity index 51% rename from sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/sentry/kmp/demo/KoinAndroid.kt index db9d507f..d91c9842 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/KoinAndroid.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/sentry/kmp/demo/KoinAndroid.kt @@ -1,8 +1,8 @@ -package io.sentry.kmp.demo +package sentry.kmp.demo -import io.sentry.kmp.demo.models.AuthenticationViewModel -import io.sentry.kmp.demo.models.HomeViewModel import org.koin.dsl.module +import sentry.kmp.demo.models.AuthenticationViewModel +import sentry.kmp.demo.models.HomeViewModel actual val platformModule = module { single { AuthenticationViewModel() } diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/sentry/kmp/demo/models/ViewModel.kt similarity index 91% rename from sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/sentry/kmp/demo/models/ViewModel.kt index cf26f82c..bbb35589 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/androidMain/kotlin/sentry/kmp/demo/models/ViewModel.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.models +package sentry.kmp.demo.models import kotlinx.coroutines.CoroutineScope import androidx.lifecycle.ViewModel as AndroidXViewModel diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/Koin.kt similarity index 92% rename from sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/Koin.kt index 725cadd3..4b30583d 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/Koin.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/Koin.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo +package sentry.kmp.demo import org.koin.core.KoinApplication import org.koin.core.context.startKoin diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/AuthenticationViewModel.kt similarity index 96% rename from sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/AuthenticationViewModel.kt index e0489e39..b0d3f153 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/AuthenticationViewModel.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/AuthenticationViewModel.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.models +package sentry.kmp.demo.models import io.sentry.kotlin.multiplatform.Sentry import io.sentry.kotlin.multiplatform.SentryLevel diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/HomeViewModel.kt similarity index 94% rename from sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/HomeViewModel.kt index 090b5e12..712a4a9d 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/HomeViewModel.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/HomeViewModel.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.models +package sentry.kmp.demo.models import io.sentry.kotlin.multiplatform.ScopeCallback import io.sentry.kotlin.multiplatform.Sentry diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/ViewModel.kt similarity index 82% rename from sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/ViewModel.kt index 74041621..82b5aa83 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/models/ViewModel.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.models +package sentry.kmp.demo.models import kotlinx.coroutines.CoroutineScope diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/sentry/SentrySetup.kt similarity index 97% rename from sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/sentry/SentrySetup.kt index b7abccfa..f8aabda1 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/io/sentry/kmp/demo/sentry/SentrySetup.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/sentry/SentrySetup.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.sentry +package sentry.kmp.demo.sentry import io.sentry.kotlin.multiplatform.Attachment import io.sentry.kotlin.multiplatform.Context diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/sentry.kmp.demo/KoinIOS.kt similarity index 79% rename from sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/sentry.kmp.demo/KoinIOS.kt index 2c3c3f5e..7cd50c18 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/KoinIOS.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/sentry.kmp.demo/KoinIOS.kt @@ -1,10 +1,10 @@ -package io.sentry.kmp.demo +package sentry.kmp.demo -import io.sentry.kmp.demo.models.AuthenticationViewModel -import io.sentry.kmp.demo.models.HomeViewModel import org.koin.core.KoinApplication import org.koin.core.component.KoinComponent import org.koin.dsl.module +import sentry.kmp.demo.models.AuthenticationViewModel +import sentry.kmp.demo.models.HomeViewModel fun initKoinIos(): KoinApplication = initKoin( module { } diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/sentry.kmp.demo/models/ViewModel.kt similarity index 96% rename from sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt rename to sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/sentry.kmp.demo/models/ViewModel.kt index 45e1d9c2..e157e877 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/io/sentry/kmp/demo/models/ViewModel.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/iosMain/kotlin/sentry.kmp.demo/models/ViewModel.kt @@ -1,4 +1,4 @@ -package io.sentry.kmp.demo.models +package sentry.kmp.demo.models import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel From 1d2a452319b1c925dadcbdc1a889e2208587b2dc Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 12:11:55 +0200 Subject: [PATCH 13/16] update readme --- sentry-samples/kmp-app-mvvm-di/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sentry-samples/kmp-app-mvvm-di/README.md b/sentry-samples/kmp-app-mvvm-di/README.md index 9b8ec0ad..d06c9d2f 100644 --- a/sentry-samples/kmp-app-mvvm-di/README.md +++ b/sentry-samples/kmp-app-mvvm-di/README.md @@ -14,9 +14,10 @@ This is a demo app for the Sentry Kotlin Multiplatform SDK that includes a nativ Install the [Kotlin Multiplatform Mobile plugin](https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform-mobile) for Android Studio. You can use Android Studio to run both the Android and iOS sample apps. -Alternatively you can also run the iOS app directly from Xcode. -The targets are both available as `sentry-samples.kmp-app-mvvm-di.iosApp` and `sentry-samples.kmp-app-mvvm-di.androidApp`. +The android target is available as `sentry-samples.kmp-app-mvvm-di.androidApp` automatically. +The iOS target needs to be configured: add a new run configuration and select an iOS application as a new target. +You can then select the `iosApp.xcworkspace` file for the required `Xcode project file`. ### Android - Export your `ANDROID_HOME` environment variable if you haven't done already. From afe12b8d5f0ff886d2e373234e5151277daed66c Mon Sep 17 00:00:00 2001 From: buenaflor Date: Tue, 11 Apr 2023 12:16:53 +0200 Subject: [PATCH 14/16] update readme --- sentry-samples/kmp-app-mvvm-di/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-samples/kmp-app-mvvm-di/README.md b/sentry-samples/kmp-app-mvvm-di/README.md index d06c9d2f..36969957 100644 --- a/sentry-samples/kmp-app-mvvm-di/README.md +++ b/sentry-samples/kmp-app-mvvm-di/README.md @@ -30,7 +30,7 @@ You need Cocoapods installed on your machine. Run `export LANG=en_US.UTF-8` to avoid encoding issues. -`pod install` will automatically run through gradle if you run the iOS app. +`pod install` will automatically run through gradle if you run the iOS app through Android Studio. However, you can still run `pod install` on the iOS folder manually if you want to make sure the pods are up to date. #### DSYMS From 81f5538c1dd2f9e0bf5f29fec2fad6f876182bf4 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Tue, 11 Apr 2023 13:45:32 +0200 Subject: [PATCH 15/16] stick to ios v8.2.0 --- .../kmp-app-mvvm-di/iosApp/Podfile.lock | 20 +++++++++---------- .../kmp-app-mvvm-di/shared/build.gradle.kts | 2 +- .../kmp-app-mvvm-di/shared/shared.podspec | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/sentry-samples/kmp-app-mvvm-di/iosApp/Podfile.lock b/sentry-samples/kmp-app-mvvm-di/iosApp/Podfile.lock index 1b11a641..b65af76a 100644 --- a/sentry-samples/kmp-app-mvvm-di/iosApp/Podfile.lock +++ b/sentry-samples/kmp-app-mvvm-di/iosApp/Podfile.lock @@ -1,12 +1,12 @@ PODS: - - Sentry (8.3.3): - - Sentry/Core (= 8.3.3) - - SentryPrivate (= 8.3.3) - - Sentry/Core (8.3.3): - - SentryPrivate (= 8.3.3) - - SentryPrivate (8.3.3) + - Sentry (8.2.0): + - Sentry/Core (= 8.2.0) + - SentryPrivate (= 8.2.0) + - Sentry/Core (8.2.0): + - SentryPrivate (= 8.2.0) + - SentryPrivate (8.2.0) - shared (1.0): - - Sentry (~> 8.3.3) + - Sentry (~> 8.2.0) DEPENDENCIES: - shared (from `../shared`) @@ -21,9 +21,9 @@ EXTERNAL SOURCES: :path: "../shared" SPEC CHECKSUMS: - Sentry: 8ffc397d98fe58d693e73959b26ed0eaee55646a - SentryPrivate: bf776a47a131648f5023097215987b40fbd47025 - shared: a7939828ea6576c539123cff478ad06568708679 + Sentry: cf1d35c866266da58964fe7b62526bda93ffcb38 + SentryPrivate: 2909bcc7b19a827b49e9bde0e56116b08d40dfdf + shared: 2d28ef1f501f48e94cfddbaa9dfff0435cc81b97 PODFILE CHECKSUM: f282da88f39e69507b0a255187c8a6b644477756 diff --git a/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts b/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts index 76fb03e1..cde76892 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts +++ b/sentry-samples/kmp-app-mvvm-di/shared/build.gradle.kts @@ -17,7 +17,7 @@ kotlin { ios.deploymentTarget = "14.1" podfile = project.file("../iosApp/Podfile") - pod("Sentry", "~> 8.3.3") + pod("Sentry", "~> 8.2.0") framework { baseName = "shared" diff --git a/sentry-samples/kmp-app-mvvm-di/shared/shared.podspec b/sentry-samples/kmp-app-mvvm-di/shared/shared.podspec index 103b4f00..4079bc34 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/shared.podspec +++ b/sentry-samples/kmp-app-mvvm-di/shared/shared.podspec @@ -9,7 +9,7 @@ Pod::Spec.new do |spec| spec.vendored_frameworks = 'build/cocoapods/framework/shared.framework' spec.libraries = 'c++' spec.ios.deployment_target = '14.1' - spec.dependency 'Sentry', '~> 8.3.3' + spec.dependency 'Sentry', '~> 8.2.0' spec.pod_target_xcconfig = { 'KOTLIN_PROJECT_PATH' => ':sentry-samples:kmp-app-mvvm-di:shared', From 00dc7cd299e7b8bd658599c8f7f920fd4000fa86 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Tue, 11 Apr 2023 14:32:02 +0200 Subject: [PATCH 16/16] add to makefile --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 81cf1e51..81c7860f 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,9 @@ compile: ./gradlew build sudo xcode-select --switch /Applications/Xcode.app && /usr/bin/xcodebuild -version cd ./sentry-samples/kmp-app/iosApp; pod install + cd ./sentry-samples/kmp-app-mvvm-di/iosApp; pod install xcodebuild -workspace ./sentry-samples/kmp-app/iosApp/iosApp.xcworkspace -scheme iosApp -configuration Debug -sdk iphonesimulator -arch arm64 + xcodebuild -workspace ./sentry-samples/kmp-app-mvvm-di/iosApp/iosApp.xcworkspace -scheme iosApp -configuration Debug -sdk iphonesimulator -arch arm64 # We stop gradle at the end to make sure the cache folders # don't contain any lock files and are free to be cached.