Skip to content

Commit 113f678

Browse files
0xadam-browncodex
andcommitted
feat(android): Add Sentry Buddy recorder module
Add a new local-publishable Android Buddy module that records intent-rich flow artifacts for Hackweek usage. The module includes an experimental public facade, recording model, deterministic JSON serializer, Activity lifecycle screen collection, Sentry tag/transaction correlation, tests, and BOM exclusion. Co-Authored-By: OpenAI GPT-5.5 <noreply@openai.com>
1 parent 96bdcac commit 113f678

21 files changed

Lines changed: 1300 additions & 2 deletions

‎buildSrc/src/main/java/Config.kt‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ object Config {
101101
"sentry-android-timber",
102102
"sentry-compose-android",
103103
"sentry-android-sqlite",
104-
"sentry-android-replay"
104+
"sentry-android-replay",
105+
"sentry-android-buddy"
105106
)
106107

107108
val androidXLibs = listOf(
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
public final class io/sentry/android/buddy/BuddyAppInfo : io/sentry/JsonSerializable {
2+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;)V
3+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
4+
public final fun component1 ()Ljava/lang/String;
5+
public final fun component2 ()Ljava/lang/String;
6+
public final fun component3 ()Ljava/lang/Long;
7+
public final fun component4 ()Ljava/lang/String;
8+
public final fun component5 ()Ljava/lang/String;
9+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;)Lio/sentry/android/buddy/BuddyAppInfo;
10+
public static synthetic fun copy$default (Lio/sentry/android/buddy/BuddyAppInfo;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/android/buddy/BuddyAppInfo;
11+
public fun equals (Ljava/lang/Object;)Z
12+
public final fun getEnvironment ()Ljava/lang/String;
13+
public final fun getPackageName ()Ljava/lang/String;
14+
public final fun getRelease ()Ljava/lang/String;
15+
public final fun getVersionCode ()Ljava/lang/Long;
16+
public final fun getVersionName ()Ljava/lang/String;
17+
public fun hashCode ()I
18+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
19+
public fun toString ()Ljava/lang/String;
20+
}
21+
22+
public final class io/sentry/android/buddy/BuddyDeviceInfo : io/sentry/JsonSerializable {
23+
public fun <init> ()V
24+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
25+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
26+
public final fun component1 ()Ljava/lang/String;
27+
public final fun component2 ()Ljava/lang/String;
28+
public final fun component3 ()Ljava/lang/String;
29+
public final fun component4 ()Ljava/lang/String;
30+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lio/sentry/android/buddy/BuddyDeviceInfo;
31+
public static synthetic fun copy$default (Lio/sentry/android/buddy/BuddyDeviceInfo;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/android/buddy/BuddyDeviceInfo;
32+
public fun equals (Ljava/lang/Object;)Z
33+
public final fun getManufacturer ()Ljava/lang/String;
34+
public final fun getModel ()Ljava/lang/String;
35+
public final fun getOsName ()Ljava/lang/String;
36+
public final fun getOsVersion ()Ljava/lang/String;
37+
public fun hashCode ()I
38+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
39+
public fun toString ()Ljava/lang/String;
40+
}
41+
42+
public final class io/sentry/android/buddy/BuddyFlowImportance : java/lang/Enum {
43+
public static final field BUSINESS_CRITICAL Lio/sentry/android/buddy/BuddyFlowImportance;
44+
public static final field HIGH Lio/sentry/android/buddy/BuddyFlowImportance;
45+
public static final field LOW Lio/sentry/android/buddy/BuddyFlowImportance;
46+
public static final field MEDIUM Lio/sentry/android/buddy/BuddyFlowImportance;
47+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
48+
public final fun getValue ()Ljava/lang/String;
49+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/android/buddy/BuddyFlowImportance;
50+
public static fun values ()[Lio/sentry/android/buddy/BuddyFlowImportance;
51+
}
52+
53+
public final class io/sentry/android/buddy/BuddyFlowIntent : io/sentry/JsonSerializable {
54+
public fun <init> (Ljava/lang/String;)V
55+
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
56+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Lio/sentry/android/buddy/BuddyFlowImportance;)V
57+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Lio/sentry/android/buddy/BuddyFlowImportance;Ljava/util/Map;)V
58+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Lio/sentry/android/buddy/BuddyFlowImportance;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
59+
public final fun component1 ()Ljava/lang/String;
60+
public final fun component2 ()Ljava/lang/String;
61+
public final fun component3 ()Lio/sentry/android/buddy/BuddyFlowImportance;
62+
public final fun component4 ()Ljava/util/Map;
63+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Lio/sentry/android/buddy/BuddyFlowImportance;Ljava/util/Map;)Lio/sentry/android/buddy/BuddyFlowIntent;
64+
public static synthetic fun copy$default (Lio/sentry/android/buddy/BuddyFlowIntent;Ljava/lang/String;Ljava/lang/String;Lio/sentry/android/buddy/BuddyFlowImportance;Ljava/util/Map;ILjava/lang/Object;)Lio/sentry/android/buddy/BuddyFlowIntent;
65+
public fun equals (Ljava/lang/Object;)Z
66+
public final fun getData ()Ljava/util/Map;
67+
public final fun getDeveloperGoal ()Ljava/lang/String;
68+
public final fun getImportance ()Lio/sentry/android/buddy/BuddyFlowImportance;
69+
public final fun getName ()Ljava/lang/String;
70+
public final fun getSlug ()Ljava/lang/String;
71+
public fun hashCode ()I
72+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
73+
public fun toString ()Ljava/lang/String;
74+
}
75+
76+
public final class io/sentry/android/buddy/BuddyFlowRecording : io/sentry/JsonSerializable {
77+
public static final field Companion Lio/sentry/android/buddy/BuddyFlowRecording$Companion;
78+
public static final field PLATFORM Ljava/lang/String;
79+
public static final field TYPE Ljava/lang/String;
80+
public static final field USE_CASE Ljava/lang/String;
81+
public static final field VERSION I
82+
public fun <init> (Lio/sentry/android/buddy/BuddyFlowIntent;Lio/sentry/android/buddy/BuddyRecordingMetadata;Lio/sentry/android/buddy/BuddyAppInfo;Lio/sentry/android/buddy/BuddyDeviceInfo;Lio/sentry/android/buddy/BuddyRecordingSummary;Ljava/util/List;Lio/sentry/android/buddy/BuddySentryCorrelation;)V
83+
public final fun component1 ()Lio/sentry/android/buddy/BuddyFlowIntent;
84+
public final fun component2 ()Lio/sentry/android/buddy/BuddyRecordingMetadata;
85+
public final fun component3 ()Lio/sentry/android/buddy/BuddyAppInfo;
86+
public final fun component4 ()Lio/sentry/android/buddy/BuddyDeviceInfo;
87+
public final fun component5 ()Lio/sentry/android/buddy/BuddyRecordingSummary;
88+
public final fun component6 ()Ljava/util/List;
89+
public final fun component7 ()Lio/sentry/android/buddy/BuddySentryCorrelation;
90+
public final fun copy (Lio/sentry/android/buddy/BuddyFlowIntent;Lio/sentry/android/buddy/BuddyRecordingMetadata;Lio/sentry/android/buddy/BuddyAppInfo;Lio/sentry/android/buddy/BuddyDeviceInfo;Lio/sentry/android/buddy/BuddyRecordingSummary;Ljava/util/List;Lio/sentry/android/buddy/BuddySentryCorrelation;)Lio/sentry/android/buddy/BuddyFlowRecording;
91+
public static synthetic fun copy$default (Lio/sentry/android/buddy/BuddyFlowRecording;Lio/sentry/android/buddy/BuddyFlowIntent;Lio/sentry/android/buddy/BuddyRecordingMetadata;Lio/sentry/android/buddy/BuddyAppInfo;Lio/sentry/android/buddy/BuddyDeviceInfo;Lio/sentry/android/buddy/BuddyRecordingSummary;Ljava/util/List;Lio/sentry/android/buddy/BuddySentryCorrelation;ILjava/lang/Object;)Lio/sentry/android/buddy/BuddyFlowRecording;
92+
public fun equals (Ljava/lang/Object;)Z
93+
public final fun getApp ()Lio/sentry/android/buddy/BuddyAppInfo;
94+
public final fun getDevice ()Lio/sentry/android/buddy/BuddyDeviceInfo;
95+
public final fun getFlow ()Lio/sentry/android/buddy/BuddyFlowIntent;
96+
public final fun getRecording ()Lio/sentry/android/buddy/BuddyRecordingMetadata;
97+
public final fun getSentry ()Lio/sentry/android/buddy/BuddySentryCorrelation;
98+
public final fun getSummary ()Lio/sentry/android/buddy/BuddyRecordingSummary;
99+
public final fun getTimeline ()Ljava/util/List;
100+
public fun hashCode ()I
101+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
102+
public fun toString ()Ljava/lang/String;
103+
}
104+
105+
public final class io/sentry/android/buddy/BuddyFlowRecording$Companion {
106+
}
107+
108+
public final class io/sentry/android/buddy/BuddyFlowRecordingJsonSerializer {
109+
public static final field INSTANCE Lio/sentry/android/buddy/BuddyFlowRecordingJsonSerializer;
110+
public static final fun serialize (Lio/sentry/android/buddy/BuddyFlowRecording;)Ljava/lang/String;
111+
}
112+
113+
public final class io/sentry/android/buddy/BuddyRecordingMetadata : io/sentry/JsonSerializable {
114+
public static final field Companion Lio/sentry/android/buddy/BuddyRecordingMetadata$Companion;
115+
public static final field MANUAL_DEBUG_RECORDING Ljava/lang/String;
116+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Ljava/util/Date;J)V
117+
public final fun component1 ()Ljava/lang/String;
118+
public final fun component2 ()Ljava/lang/String;
119+
public final fun component3 ()Ljava/util/Date;
120+
public final fun component4 ()Ljava/util/Date;
121+
public final fun component5 ()J
122+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Ljava/util/Date;J)Lio/sentry/android/buddy/BuddyRecordingMetadata;
123+
public static synthetic fun copy$default (Lio/sentry/android/buddy/BuddyRecordingMetadata;Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Ljava/util/Date;JILjava/lang/Object;)Lio/sentry/android/buddy/BuddyRecordingMetadata;
124+
public fun equals (Ljava/lang/Object;)Z
125+
public final fun getDurationMs ()J
126+
public final fun getEndedAt ()Ljava/util/Date;
127+
public final fun getId ()Ljava/lang/String;
128+
public final fun getSource ()Ljava/lang/String;
129+
public final fun getStartedAt ()Ljava/util/Date;
130+
public fun hashCode ()I
131+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
132+
public fun toString ()Ljava/lang/String;
133+
}
134+
135+
public final class io/sentry/android/buddy/BuddyRecordingMetadata$Companion {
136+
}
137+
138+
public final class io/sentry/android/buddy/BuddyRecordingSummary : io/sentry/JsonSerializable {
139+
public fun <init> (JIIII)V
140+
public final fun component1 ()J
141+
public final fun component2 ()I
142+
public final fun component3 ()I
143+
public final fun component4 ()I
144+
public final fun component5 ()I
145+
public final fun copy (JIIII)Lio/sentry/android/buddy/BuddyRecordingSummary;
146+
public static synthetic fun copy$default (Lio/sentry/android/buddy/BuddyRecordingSummary;JIIIIILjava/lang/Object;)Lio/sentry/android/buddy/BuddyRecordingSummary;
147+
public fun equals (Ljava/lang/Object;)Z
148+
public final fun getBreadcrumbCount ()I
149+
public final fun getDurationMs ()J
150+
public final fun getScreenCount ()I
151+
public final fun getStepCount ()I
152+
public final fun getTimelineItemCount ()I
153+
public fun hashCode ()I
154+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
155+
public fun toString ()Ljava/lang/String;
156+
}
157+
158+
public final class io/sentry/android/buddy/BuddySentryCorrelation : io/sentry/JsonSerializable {
159+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
160+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
161+
public final fun component1 ()Ljava/lang/String;
162+
public final fun component2 ()Ljava/lang/String;
163+
public final fun component3 ()Ljava/lang/String;
164+
public final fun component4 ()Ljava/util/Map;
165+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)Lio/sentry/android/buddy/BuddySentryCorrelation;
166+
public static synthetic fun copy$default (Lio/sentry/android/buddy/BuddySentryCorrelation;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lio/sentry/android/buddy/BuddySentryCorrelation;
167+
public fun equals (Ljava/lang/Object;)Z
168+
public final fun getRecordingId ()Ljava/lang/String;
169+
public final fun getSpanId ()Ljava/lang/String;
170+
public final fun getTags ()Ljava/util/Map;
171+
public final fun getTraceId ()Ljava/lang/String;
172+
public fun hashCode ()I
173+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
174+
public fun toString ()Ljava/lang/String;
175+
}
176+
177+
public final class io/sentry/android/buddy/BuddyTimelineItem : io/sentry/JsonSerializable {
178+
public fun <init> (Lio/sentry/android/buddy/BuddyTimelineItem$Type;Ljava/util/Date;J)V
179+
public fun <init> (Lio/sentry/android/buddy/BuddyTimelineItem$Type;Ljava/util/Date;JLjava/lang/String;)V
180+
public fun <init> (Lio/sentry/android/buddy/BuddyTimelineItem$Type;Ljava/util/Date;JLjava/lang/String;Ljava/util/Map;)V
181+
public synthetic fun <init> (Lio/sentry/android/buddy/BuddyTimelineItem$Type;Ljava/util/Date;JLjava/lang/String;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
182+
public final fun component1 ()Lio/sentry/android/buddy/BuddyTimelineItem$Type;
183+
public final fun component2 ()Ljava/util/Date;
184+
public final fun component3 ()J
185+
public final fun component4 ()Ljava/lang/String;
186+
public final fun component5 ()Ljava/util/Map;
187+
public final fun copy (Lio/sentry/android/buddy/BuddyTimelineItem$Type;Ljava/util/Date;JLjava/lang/String;Ljava/util/Map;)Lio/sentry/android/buddy/BuddyTimelineItem;
188+
public static synthetic fun copy$default (Lio/sentry/android/buddy/BuddyTimelineItem;Lio/sentry/android/buddy/BuddyTimelineItem$Type;Ljava/util/Date;JLjava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lio/sentry/android/buddy/BuddyTimelineItem;
189+
public fun equals (Ljava/lang/Object;)Z
190+
public final fun getData ()Ljava/util/Map;
191+
public final fun getElapsedMs ()J
192+
public final fun getName ()Ljava/lang/String;
193+
public final fun getTimestamp ()Ljava/util/Date;
194+
public final fun getType ()Lio/sentry/android/buddy/BuddyTimelineItem$Type;
195+
public fun hashCode ()I
196+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
197+
public fun toString ()Ljava/lang/String;
198+
}
199+
200+
public final class io/sentry/android/buddy/BuddyTimelineItem$Type : java/lang/Enum {
201+
public static final field BREADCRUMB Lio/sentry/android/buddy/BuddyTimelineItem$Type;
202+
public static final field RECORDING_STARTED Lio/sentry/android/buddy/BuddyTimelineItem$Type;
203+
public static final field RECORDING_STOPPED Lio/sentry/android/buddy/BuddyTimelineItem$Type;
204+
public static final field SCREEN Lio/sentry/android/buddy/BuddyTimelineItem$Type;
205+
public static final field STEP Lio/sentry/android/buddy/BuddyTimelineItem$Type;
206+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
207+
public final fun getValue ()Ljava/lang/String;
208+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/android/buddy/BuddyTimelineItem$Type;
209+
public static fun values ()[Lio/sentry/android/buddy/BuddyTimelineItem$Type;
210+
}
211+
212+
public final class io/sentry/android/buddy/BuildConfig {
213+
public static final field BUILD_TYPE Ljava/lang/String;
214+
public static final field DEBUG Z
215+
public static final field LIBRARY_PACKAGE_NAME Ljava/lang/String;
216+
public static final field VERSION_NAME Ljava/lang/String;
217+
public fun <init> ()V
218+
}
219+
220+
public final class io/sentry/android/buddy/SentryBuddy {
221+
public static final field INSTANCE Lio/sentry/android/buddy/SentryBuddy;
222+
public static final fun install (Landroid/app/Application;)V
223+
public static final fun recordStep (Ljava/lang/String;)V
224+
public static final fun recordStep (Ljava/lang/String;Ljava/util/Map;)V
225+
public static final fun startRecording (Lio/sentry/android/buddy/BuddyFlowIntent;)V
226+
public static final fun stopRecording ()Lio/sentry/android/buddy/BuddyFlowRecording;
227+
}
228+
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import io.gitlab.arturbosch.detekt.Detekt
2+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
3+
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
4+
5+
plugins {
6+
id("com.android.library")
7+
alias(libs.plugins.kotlin.android)
8+
alias(libs.plugins.gradle.versions)
9+
alias(libs.plugins.detekt)
10+
}
11+
12+
android {
13+
compileSdk = libs.versions.compileSdk.get().toInt()
14+
namespace = "io.sentry.android.buddy"
15+
16+
defaultConfig {
17+
minSdk = libs.versions.minSdk.get().toInt()
18+
19+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
20+
21+
// for AGP 4.1
22+
buildConfigField("String", "VERSION_NAME", "\"${project.version}\"")
23+
}
24+
25+
buildTypes {
26+
getByName("debug") { consumerProguardFiles("proguard-rules.pro") }
27+
getByName("release") { consumerProguardFiles("proguard-rules.pro") }
28+
}
29+
30+
// AGP 9 only generates unit tests for the testBuildType. The debug variant is
31+
// disabled, so unit tests must target release to run at all.
32+
testBuildType = "release"
33+
34+
kotlin {
35+
compilerOptions.jvmTarget = JvmTarget.JVM_1_8
36+
compilerOptions.languageVersion = KotlinVersion.KOTLIN_1_9
37+
compilerOptions.apiVersion = KotlinVersion.KOTLIN_1_9
38+
}
39+
40+
testOptions {
41+
animationsDisabled = true
42+
unitTests.apply {
43+
isReturnDefaultValues = true
44+
isIncludeAndroidResources = true
45+
}
46+
}
47+
48+
lint {
49+
warningsAsErrors = true
50+
checkDependencies = true
51+
52+
// We run a full lint analysis as build part in CI, so skip vital checks for assemble tasks.
53+
checkReleaseBuilds = false
54+
}
55+
56+
buildFeatures { buildConfig = true }
57+
58+
androidComponents.beforeVariants {
59+
it.enable = !Config.Android.shouldSkipDebugVariant(it.buildType)
60+
}
61+
}
62+
63+
kotlin { explicitApi() }
64+
65+
dependencies {
66+
api(projects.sentry)
67+
68+
compileOnly(libs.jetbrains.annotations)
69+
70+
implementation(kotlin(Config.kotlinStdLib, Config.kotlinStdLibVersionAndroid))
71+
72+
// tests
73+
testImplementation(libs.androidx.test.core)
74+
testImplementation(libs.androidx.test.ext.junit)
75+
testImplementation(libs.google.truth)
76+
testImplementation(libs.kotlin.test.junit)
77+
testImplementation(libs.roboelectric)
78+
}
79+
80+
tasks.withType<Detekt>().configureEach {
81+
// Target version of the generated JVM bytecode. It is used for type resolution.
82+
jvmTarget = JavaVersion.VERSION_1_8.toString()
83+
}

‎sentry-android-buddy/proguard-rules.pro‎

Whitespace-only changes.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.sentry.android.buddy
2+
3+
import io.sentry.ILogger
4+
import io.sentry.JsonSerializable
5+
import io.sentry.ObjectWriter
6+
import java.io.IOException
7+
import org.jetbrains.annotations.ApiStatus
8+
9+
@ApiStatus.Experimental
10+
public data class BuddyAppInfo
11+
public constructor(
12+
public val packageName: String,
13+
public val versionName: String? = null,
14+
public val versionCode: Long? = null,
15+
public val release: String? = null,
16+
public val environment: String? = null,
17+
) : JsonSerializable {
18+
@Throws(IOException::class)
19+
override fun serialize(writer: ObjectWriter, logger: ILogger) {
20+
writer.beginObject()
21+
writer.name("packageName").value(packageName)
22+
writer.name("versionName").value(versionName)
23+
if (versionCode != null) {
24+
writer.name("versionCode").value(versionCode)
25+
}
26+
writer.name("release").value(release)
27+
writer.name("environment").value(environment)
28+
writer.endObject()
29+
}
30+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.sentry.android.buddy
2+
3+
import io.sentry.ILogger
4+
import io.sentry.JsonSerializable
5+
import io.sentry.ObjectWriter
6+
import java.io.IOException
7+
import org.jetbrains.annotations.ApiStatus
8+
9+
@ApiStatus.Experimental
10+
public data class BuddyDeviceInfo
11+
public constructor(
12+
public val manufacturer: String? = null,
13+
public val model: String? = null,
14+
public val osName: String = "Android",
15+
public val osVersion: String? = null,
16+
) : JsonSerializable {
17+
@Throws(IOException::class)
18+
override fun serialize(writer: ObjectWriter, logger: ILogger) {
19+
writer.beginObject()
20+
writer.name("manufacturer").value(manufacturer)
21+
writer.name("model").value(model)
22+
writer.name("osName").value(osName)
23+
writer.name("osVersion").value(osVersion)
24+
writer.endObject()
25+
}
26+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.sentry.android.buddy
2+
3+
import org.jetbrains.annotations.ApiStatus
4+
5+
@ApiStatus.Experimental
6+
public enum class BuddyFlowImportance(public val value: String) {
7+
LOW("low"),
8+
MEDIUM("medium"),
9+
HIGH("high"),
10+
BUSINESS_CRITICAL("business_critical"),
11+
}

0 commit comments

Comments
 (0)