package io.sentry.samples.instrumentation.ui import android.os.Bundle import android.widget.EditText import android.widget.Toast import androidx.activity.ComponentActivity import androidx.appcompat.widget.Toolbar import io.sentry.Sentry import io.sentry.SpanStatus import io.sentry.samples.instrumentation.R import io.sentry.samples.instrumentation.SampleApp import io.sentry.samples.instrumentation.data.Track import kotlinx.coroutines.runBlocking class EditActivity : ComponentActivity() { class InnerEditActivityClass { fun testInner() { throw RuntimeException("thrown on purpose to test source context line number mismatch") } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_edit) val nameInput = findViewById(R.id.track_name) val composerInput = findViewById(R.id.track_composer) val durationInput = findViewById(R.id.track_duration) val unitPriceInput = findViewById(R.id.track_unit_price) val originalTrack: Track? = intent.getSerializableExtra(TRACK_EXTRA_KEY) as? Track originalTrack?.run { nameInput.setText(name) composerInput.setText(composer) durationInput.setText(millis.toString()) unitPriceInput.setText(price.toString()) } findViewById(R.id.toolbar).setOnMenuItemClickListener { if (it.itemId == R.id.action_save) { try { // throw RuntimeException("thrown on purpose to test source context line number mismatch") // TestSourceContext().test() InnerEditActivityClass().testInner() } catch (t: Throwable) { Sentry.captureException(t); } val transaction = Sentry.startTransaction( "Track Interaction", if (originalTrack == null) "ui.action.add" else "ui.action.edit", true ) val name = nameInput.text.toString() val composer = composerInput.text.toString() val duration = durationInput.text.toString() val unitPrice = unitPriceInput.text.toString() if (name.isEmpty() || composer.isEmpty() || duration.isEmpty() || duration.toLongOrNull() == null || unitPrice.isEmpty() || unitPrice.toFloatOrNull() == null ) { Toast.makeText( this, "Some of the inputs are empty or have wrong format " + "(duration/unitprice not a number)", Toast.LENGTH_LONG ).show() } else { if (originalTrack == null) { addNewTrack(name, composer, duration.toLong(), unitPrice.toFloat()) val createCount = SampleApp.analytics.getInt("create_count", 0) + 1 SampleApp.analytics.edit().putInt("create_count", createCount).apply() } else { originalTrack.update(name, composer, duration.toLong(), unitPrice.toFloat()) val editCount = SampleApp.analytics.getInt("edit_count", 0) + 1 SampleApp.analytics.edit().putInt("edit_count", editCount).apply() } transaction.finish(SpanStatus.OK) finish() } return@setOnMenuItemClickListener true } return@setOnMenuItemClickListener false } } private fun addNewTrack(name: String, composer: String, duration: Long, unitPrice: Float) { val newTrack = Track( name = name, albumId = null, composer = composer, mediaTypeId = null, genreId = null, millis = duration, bytes = null, price = unitPrice ) runBlocking { SampleApp.database.tracksDao().insert(newTrack) } } private fun Track.update(name: String, composer: String, duration: Long, unitPrice: Float) { val updatedTrack = copy( name = name, composer = composer, millis = duration, price = unitPrice ) runBlocking { SampleApp.database.tracksDao().update(updatedTrack) } } companion object { const val TRACK_EXTRA_KEY = "EditActivity.Track" } }