Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/#98 feedbackonbuttons #99

Merged
merged 6 commits into from
Aug 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,13 @@ def createRaygunNotifyDeploymentTask(token,key,groupName,version,userName,userEm

This function gets called from within the ```android {...}``` block of the Gradle file at each build in Android Studio and creates the appropriate parameterised task to notify the Raygun backend of your app's deployment.

## Sample application

The project contains a small sample application in the `:app` module. It demonstrates common use cases like using a global error handler, custom behaviour for catching and reporting errors and more.

[!image1](app-1.jpg)
[!image2](app-2.jpg)

## Advanced Features

### Affected Customers
Expand Down
Binary file added app-1.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app-2.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ android {
buildConfigField("long", "VERSION_CODE", VERSION_CODE)
buildConfigField("String","VERSION_NAME","\"${VERSION_NAME}-sample\"")
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
multiDexEnabled true
}

lintOptions {
Expand Down Expand Up @@ -131,6 +132,8 @@ dependencies {

implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.multidex:multidex:2.0.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
Expand Down
36 changes: 26 additions & 10 deletions app/src/main/java/com/raygun/raygun4android/sample/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package com.raygun.raygun4android.sample

import android.app.Application
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.raygun.raygun4android.RaygunClient
import com.raygun.raygun4android.messages.shared.RaygunUserInfo
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.snackbar.Snackbar
import com.raygun.raygun4android.RaygunClient
import com.raygun.raygun4android.messages.shared.RaygunUserInfo

class MainActivity : AppCompatActivity() {

Expand Down Expand Up @@ -44,6 +47,7 @@ class MainActivity : AppCompatActivity() {

// Manual exception creation & sending
RaygunClient.send(Exception("Congratulations, you have sent errors with Raygun4Android"), null, tw)
Snackbar.make(it, getString(R.string.you_have_just_sent_an_error_with_raygun4android),Snackbar.LENGTH_SHORT).show()
}

buttonCrash.setOnClickListener {
Expand All @@ -60,40 +64,52 @@ class MainActivity : AppCompatActivity() {
} catch (ex: Exception) {
val i = 4
Log.d("Raygun4Android-Sample", "This is here purely so that our alternative value for i gets used and not optimised away in a release build: $i")
Snackbar.make(it, getString(R.string.you_just_created_and_caught_an_exception),Snackbar.LENGTH_SHORT).show()
}
}

buttonSetUserAnon.setOnClickListener {
val user = RaygunUserInfo()
RaygunClient.setUser(user)
Snackbar.make(it, getString(R.string.user_is_now_set_to_anonymous_for_future_raygun_reports),Snackbar.LENGTH_SHORT).show()
TheRealAgentK marked this conversation as resolved.
Show resolved Hide resolved
}

buttonSetUserA.setOnClickListener {
val user = RaygunUserInfo("superuser3")
user.fullName = "User Name C"
user.firstName = "User C"
user.fullName = "User Name A"
user.firstName = "User A"
user.email = "[email protected]"
RaygunClient.setUser(user)
RaygunClient.recordBreadcrumb("I'm now user C")
RaygunClient.recordBreadcrumb("I'm now user A")
Snackbar.make(it, getString(R.string.user_is_now_set_to_user_a_for_future_raygun_reports),Snackbar.LENGTH_SHORT).show()
}

buttonSetUserB.setOnClickListener{
val user = RaygunUserInfo("superuser4")
user.fullName = "User Name D"
user.firstName = "User D"
user.fullName = "User Name B"
user.firstName = "User B"
user.email = "[email protected]"
RaygunClient.setUser(user)
RaygunClient.recordBreadcrumb("I'm now user D")
RaygunClient.recordBreadcrumb("I'm now user B")
Snackbar.make(it, getString(R.string.user_is_now_set_to_user_b_for_future_raygun_reports),Snackbar.LENGTH_SHORT).show()
}

buttonSecondActivity.setOnClickListener {
startActivity(SecondActivity.getIntent(this@MainActivity))
startSecondActivity.launch(SecondActivity.getIntent(this@MainActivity))
}

textViewAppVersion.text = getString(R.string.app_version_text, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, BuildConfig.BUILD_TYPE)
textViewProviderVersion.text = getString(R.string.provider_version_text, com.raygun.raygun4android.BuildConfig.VERSION_NAME, com.raygun.raygun4android.BuildConfig.VERSION_CODE, com.raygun.raygun4android.BuildConfig.BUILD_TYPE)

RaygunClient.recordBreadcrumb("I'm here in Main Activity")
}

private val startSecondActivity = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == RESULT_OK) {
val rootView: View = findViewById(android.R.id.content)
Snackbar.make(rootView, getString(R.string.we_returned_to_first_activity), Snackbar.LENGTH_SHORT).show()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@ package com.raygun.raygun4android.sample
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.snackbar.Snackbar
TheRealAgentK marked this conversation as resolved.
Show resolved Hide resolved
import com.raygun.raygun4android.RaygunClient
import com.raygun.raygun4android.messages.crashreporting.RaygunBreadcrumbLevel
import com.raygun.raygun4android.messages.crashreporting.RaygunBreadcrumbMessage
import com.raygun.raygun4android.messages.shared.RaygunUserInfo
import java.util.*
import java.util.WeakHashMap
TheRealAgentK marked this conversation as resolved.
Show resolved Hide resolved

class SecondActivity : AppCompatActivity() {

Expand All @@ -36,6 +39,7 @@ class SecondActivity : AppCompatActivity() {

// Manual exception creation & sending
RaygunClient.send(Exception("Congratulations, you have sent errors with Raygun4Android from SecondActivity"), null, tw)
Snackbar.make(it, getString(R.string.you_have_just_sent_an_error_with_raygun4android),Snackbar.LENGTH_SHORT).show()
}

buttonCrash.setOnClickListener {
Expand All @@ -52,33 +56,46 @@ class SecondActivity : AppCompatActivity() {
} catch (ex: Exception) {
val i = 4
Log.d("Raygun4Android-Sample", "This is here purely so that our alternative value for i gets used and not optimised away in a release build: $i")
Snackbar.make(it, getString(R.string.you_just_created_and_caught_an_exception),Snackbar.LENGTH_SHORT).show()
}
}

buttonSetUserAnon.setOnClickListener {
val user = RaygunUserInfo()
RaygunClient.setUser(user)
Snackbar.make(it, getString(R.string.user_is_now_set_to_anonymous_for_future_raygun_reports),Snackbar.LENGTH_SHORT).show()
}

buttonSetUserA.setOnClickListener {
val user = RaygunUserInfo("superuser3")
user.fullName = "User Name C"
user.firstName = "User C"
user.fullName = "User Name A"
user.firstName = "User A"
user.email = "[email protected]"
RaygunClient.setUser(user)
RaygunClient.recordBreadcrumb("I'm now user A")
Snackbar.make(it, getString(R.string.user_is_now_set_to_user_a_for_future_raygun_reports),Snackbar.LENGTH_SHORT).show()
}

buttonSetUserB.setOnClickListener{
val user = RaygunUserInfo("superuser4")
user.fullName = "User Name D"
user.firstName = "User D"
user.fullName = "User Name B"
user.firstName = "User B"
user.email = "[email protected]"
RaygunClient.setUser(user)
RaygunClient.recordBreadcrumb("I'm now user B")
Snackbar.make(it, getString(R.string.user_is_now_set_to_user_b_for_future_raygun_reports),Snackbar.LENGTH_SHORT).show()
}

textViewAppVersion.text = getString(R.string.app_version_text, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, BuildConfig.BUILD_TYPE)
textViewProviderVersion.text = getString(R.string.provider_version_text, com.raygun.raygun4android.BuildConfig.VERSION_NAME, com.raygun.raygun4android.BuildConfig.VERSION_CODE, com.raygun.raygun4android.BuildConfig.BUILD_TYPE)

// Handle hardware and back presses
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishWithResult()
}
})

RaygunClient.clearBreadcrumbs()

val customData = WeakHashMap<String,Any>()
Expand All @@ -94,6 +111,24 @@ class SecondActivity : AppCompatActivity() {
.build()

RaygunClient.recordBreadcrumb(breadcrumbMessage)
val rootView: View = findViewById(android.R.id.content)
Snackbar.make(rootView, getString(R.string.we_re_now_on_the_second_activity_screen), Snackbar.LENGTH_SHORT).show()
}

// Handle action bar item clicks
override fun onOptionsItemSelected(item: android.view.MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
finishWithResult()
return true
}
}
return super.onOptionsItemSelected(item)
}

private fun finishWithResult() {
setResult(RESULT_OK)
finish()
}

companion object {
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/layout/activity_second.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
tools:context=".SecondActivity">
TheRealAgentK marked this conversation as resolved.
Show resolved Hide resolved

<TextView
android:id="@+id/textView"
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,11 @@
<string name="go_to_a_second_activity">Go to a second Activity</string>
<string name="hello_world_main_activity">Hello World! Main Activity!</string>
<string name="hello_world_second_activity">Hello World! Second Activity!</string>
<string name="you_have_just_sent_an_error_with_raygun4android">You have just sent an error with Raygun4Android.</string>
<string name="you_just_created_and_caught_an_exception">You just created and caught an exception.</string>
<string name="user_is_now_set_to_anonymous_for_future_raygun_reports">User is now set to \'Anonymous\' for future Raygun reports.</string>
<string name="user_is_now_set_to_user_a_for_future_raygun_reports">User is now set to \'User A\' for future Raygun reports.</string>
<string name="user_is_now_set_to_user_b_for_future_raygun_reports">User is now set to \'User B\' for future Raygun reports.</string>
<string name="we_re_now_on_the_second_activity_screen">We\'re now on the second activity screen.</string>
TheRealAgentK marked this conversation as resolved.
Show resolved Hide resolved
<string name="we_returned_to_first_activity">We\'re now back from second activity.</string>
</resources>