Skip to content

Commit f669ed5

Browse files
authored
Merge pull request #2703 from DataDog/yl/account-info/add-sample-screen
RUM-10274: Add Account Info fragment for sample app
2 parents 087b9cd + a62f0a3 commit f669ed5

File tree

8 files changed

+250
-16
lines changed

8 files changed

+250
-16
lines changed

sample/kotlin/src/main/kotlin/com/datadog/android/sample/NavActivity.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ class NavActivity : AppCompatActivity(), TrackingConsentChangeListener {
9090
R.id.set_user_info -> {
9191
navController.navigate(R.id.fragment_user)
9292
}
93+
R.id.set_account_info -> {
94+
navController.navigate(R.id.fragment_account)
95+
}
9396
R.id.show_snack_bar -> {
9497
Snackbar.make(rootView, LIPSUM, Snackbar.LENGTH_LONG).show()
9598
}

sample/kotlin/src/main/kotlin/com/datadog/android/sample/Preferences.kt

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.datadog.android.privacy.TrackingConsent
1212
import com.datadog.android.sample.datalist.DataSourceType
1313
import com.datadog.android.sample.picture.ImageLoaderType
1414
import timber.log.Timber
15-
import java.lang.IllegalArgumentException
1615

1716
internal object Preferences {
1817

@@ -26,26 +25,26 @@ internal object Preferences {
2625
fun getUserId(): String? {
2726
return PreferenceManager
2827
.getDefaultSharedPreferences(applicationContext)
29-
.getString(PREF_ID, null)
28+
.getString(PREF_USR_ID, null)
3029
}
3130

3231
fun getUserName(): String? {
3332
return PreferenceManager
3433
.getDefaultSharedPreferences(applicationContext)
35-
.getString(PREF_NAME, null)
34+
.getString(PREF_USR_NAME, null)
3635
}
3736

3837
fun getUserEmail(): String? {
3938
return PreferenceManager
4039
.getDefaultSharedPreferences(applicationContext)
41-
.getString(PREF_EMAIL, null)
40+
.getString(PREF_USR_EMAIL, null)
4241
}
4342

4443
fun getUserGender(): String? {
4544
return PreferenceManager
4645
.getDefaultSharedPreferences(applicationContext)
4746
.getString(
48-
PREF_GENDER,
47+
PREF_USR_GENDER,
4948
null
5049
)
5150
}
@@ -54,7 +53,37 @@ internal object Preferences {
5453
return PreferenceManager
5554
.getDefaultSharedPreferences(applicationContext)
5655
.getInt(
57-
PREF_AGE,
56+
PREF_USR_AGE,
57+
0
58+
)
59+
}
60+
61+
fun getAccountId(): String? {
62+
return PreferenceManager
63+
.getDefaultSharedPreferences(applicationContext)
64+
.getString(PREF_ACCOUNT_ID, null)
65+
}
66+
67+
fun getAccountName(): String? {
68+
return PreferenceManager
69+
.getDefaultSharedPreferences(applicationContext)
70+
.getString(PREF_ACCOUNT_NAME, null)
71+
}
72+
73+
fun getAccountRole(): String? {
74+
return PreferenceManager
75+
.getDefaultSharedPreferences(applicationContext)
76+
.getString(
77+
PREF_ACCOUNT_ROLE,
78+
null
79+
)
80+
}
81+
82+
fun getAccountAge(): Int {
83+
return PreferenceManager
84+
.getDefaultSharedPreferences(applicationContext)
85+
.getInt(
86+
PREF_ACCOUNT_AGE,
5887
0
5988
)
6089
}
@@ -90,6 +119,21 @@ internal object Preferences {
90119
}
91120
}
92121

122+
fun setAccountInfo(
123+
id: String,
124+
name: String,
125+
role: String,
126+
age: Int
127+
) {
128+
PreferenceManager.getDefaultSharedPreferences(applicationContext)
129+
.edit()
130+
.putString(PREF_ACCOUNT_ID, id)
131+
.putString(PREF_ACCOUNT_NAME, name)
132+
.putString(PREF_ACCOUNT_ROLE, role)
133+
.putInt(PREF_USR_AGE, age)
134+
.apply()
135+
}
136+
93137
fun setUserCredentials(
94138
id: String,
95139
name: String,
@@ -99,11 +143,11 @@ internal object Preferences {
99143
) {
100144
PreferenceManager.getDefaultSharedPreferences(applicationContext)
101145
.edit()
102-
.putString(PREF_ID, id)
103-
.putString(PREF_NAME, name)
104-
.putString(PREF_EMAIL, email)
105-
.putString(PREF_GENDER, gender)
106-
.putInt(PREF_AGE, age)
146+
.putString(PREF_USR_ID, id)
147+
.putString(PREF_USR_NAME, name)
148+
.putString(PREF_USR_EMAIL, email)
149+
.putString(PREF_USR_GENDER, gender)
150+
.putInt(PREF_USR_AGE, age)
107151
.apply()
108152
}
109153

@@ -145,11 +189,15 @@ internal object Preferences {
145189
}
146190

147191
companion object {
148-
private const val PREF_ID = "user-id"
149-
private const val PREF_NAME = "user-name"
150-
private const val PREF_EMAIL = "user-email"
151-
private const val PREF_GENDER = "user-gender"
152-
private const val PREF_AGE = "user-age"
192+
private const val PREF_USR_ID = "user-id"
193+
private const val PREF_USR_NAME = "user-name"
194+
private const val PREF_USR_EMAIL = "user-email"
195+
private const val PREF_USR_GENDER = "user-gender"
196+
private const val PREF_USR_AGE = "user-age"
197+
private const val PREF_ACCOUNT_ID = "account-id"
198+
private const val PREF_ACCOUNT_NAME = "account-name"
199+
private const val PREF_ACCOUNT_AGE = "account-age"
200+
private const val PREF_ACCOUNT_ROLE = "account-role"
153201
private const val PREF_TRACKING_CONSENT = "tracking-consent"
154202
private const val PREF_LOCAL_DATA_SOURCE = "local-data-source"
155203
private const val PREF_IMAGE_LOADER = "image-loader"

sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import com.datadog.android.rum.RumConfiguration
3434
import com.datadog.android.rum.RumErrorSource
3535
import com.datadog.android.rum.configuration.SlowFramesConfiguration
3636
import com.datadog.android.rum.tracking.NavigationViewTrackingStrategy
37+
import com.datadog.android.sample.account.AccountFragment
3738
import com.datadog.android.sample.data.db.LocalDataSource
3839
import com.datadog.android.sample.data.remote.RemoteDataSource
3940
import com.datadog.android.sample.picture.CoilImageLoader
@@ -163,6 +164,7 @@ class SampleApplication : Application() {
163164
NdkCrashReports.enable()
164165

165166
initializeUserInfo(preferences)
167+
initializeAccountInfo(preferences)
166168

167169
GlobalTracer.registerIfAbsent(
168170
AndroidTracer.Builder()
@@ -202,6 +204,19 @@ class SampleApplication : Application() {
202204
)
203205
}
204206

207+
private fun initializeAccountInfo(preferences: Preferences.DefaultPreferences) {
208+
preferences.getAccountId()?.let { id ->
209+
Datadog.setAccountInfo(
210+
id = id,
211+
name = preferences.getAccountName(),
212+
extraInfo = mapOf(
213+
AccountFragment.ROLE_KEY to preferences.getAccountRole(),
214+
AccountFragment.AGE_KEY to preferences.getUserAge()
215+
)
216+
)
217+
}
218+
}
219+
205220
private fun initializeTraces() {
206221
val tracesConfig = TraceConfiguration.Builder().apply {
207222
if (BuildConfig.DD_OVERRIDE_TRACES_URL.isNotBlank()) {
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
* This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
* Copyright 2016-Present Datadog, Inc.
5+
*/
6+
7+
package com.datadog.android.sample.account
8+
9+
import android.os.Bundle
10+
import android.view.LayoutInflater
11+
import android.view.View
12+
import android.view.ViewGroup
13+
import android.widget.EditText
14+
import androidx.fragment.app.Fragment
15+
import com.datadog.android.Datadog
16+
import com.datadog.android.sample.Preferences
17+
import com.datadog.android.sample.R
18+
import com.datadog.android.trace.withinSpan
19+
import com.google.android.material.snackbar.Snackbar
20+
21+
internal class AccountFragment : Fragment(), View.OnClickListener {
22+
23+
lateinit var idField: EditText
24+
lateinit var nameField: EditText
25+
lateinit var accountRoleField: EditText
26+
lateinit var accountAgeField: EditText
27+
28+
// region Fragment
29+
30+
override fun onCreateView(
31+
inflater: LayoutInflater,
32+
container: ViewGroup?,
33+
savedInstanceState: Bundle?
34+
): View? {
35+
val rootView: View = inflater.inflate(R.layout.fragment_account, container, false)
36+
idField = rootView.findViewById(R.id.account_id)
37+
nameField = rootView.findViewById(R.id.account_name)
38+
accountRoleField = rootView.findViewById(R.id.account_role)
39+
accountAgeField = rootView.findViewById(R.id.account_age)
40+
rootView.findViewById<View>(R.id.save_account).setOnClickListener(this)
41+
return rootView
42+
}
43+
44+
override fun onResume() {
45+
super.onResume()
46+
val preferences = Preferences.defaultPreferences(requireContext())
47+
idField.setText(preferences.getAccountId())
48+
nameField.setText(preferences.getAccountName())
49+
accountRoleField.setText(preferences.getAccountRole())
50+
accountAgeField.setText(preferences.getAccountAge().toString())
51+
}
52+
53+
// endregion
54+
55+
// region View.OnClickListener
56+
57+
override fun onClick(v: View) {
58+
withinSpan("updateAccountInfo") {
59+
val id: String = idField.text.toString()
60+
val name: String = nameField.text.toString()
61+
val role: String = accountRoleField.text.toString()
62+
val age: Int = Integer.valueOf(accountAgeField.text.toString())
63+
Preferences.defaultPreferences(requireContext())
64+
.setAccountInfo(id, name, role, age)
65+
Datadog.setAccountInfo(id, name, emptyMap())
66+
Datadog.addAccountExtraInfo(
67+
mapOf<String, Any>(
68+
ROLE_KEY to role,
69+
AGE_KEY to age
70+
)
71+
)
72+
log("Updated account info")
73+
}
74+
Snackbar.make(view ?: v.rootView, "Account info updated", Snackbar.LENGTH_SHORT).show()
75+
}
76+
77+
// endregion
78+
79+
companion object {
80+
internal const val ROLE_KEY = "role"
81+
internal const val AGE_KEY = "age"
82+
}
83+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?xml version="1.0" encoding="utf-8"?><!--
2+
~ Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
~ This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
~ Copyright 2016-Present Datadog, Inc.
5+
-->
6+
7+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
8+
xmlns:app="http://schemas.android.com/apk/res-auto"
9+
xmlns:tools="http://schemas.android.com/tools"
10+
android:layout_width="match_parent"
11+
android:layout_height="wrap_content"
12+
tools:context=".NavActivity">
13+
14+
<androidx.appcompat.widget.AppCompatEditText
15+
android:id="@+id/account_id"
16+
android:layout_width="match_parent"
17+
android:layout_height="wrap_content"
18+
android:hint="@string/hint_account_id"
19+
android:inputType="number"
20+
android:layout_margin="8dp"
21+
app:layout_constraintTop_toTopOf="parent"
22+
app:layout_constraintStart_toStartOf="parent"
23+
app:layout_constraintEnd_toEndOf="parent" />
24+
25+
<androidx.appcompat.widget.AppCompatEditText
26+
android:id="@+id/account_name"
27+
android:layout_width="match_parent"
28+
android:layout_height="wrap_content"
29+
android:hint="@string/hint_account_name"
30+
android:inputType="text|textCapWords"
31+
android:layout_margin="8dp"
32+
app:layout_constraintStart_toStartOf="parent"
33+
app:layout_constraintEnd_toEndOf="parent"
34+
app:layout_constraintTop_toBottomOf="@id/account_id" />
35+
36+
<androidx.appcompat.widget.AppCompatEditText
37+
android:id="@+id/account_role"
38+
android:layout_width="match_parent"
39+
android:layout_height="wrap_content"
40+
android:hint="@string/hint_account_role"
41+
android:inputType="text"
42+
android:layout_margin="8dp"
43+
app:layout_constraintStart_toStartOf="parent"
44+
app:layout_constraintEnd_toEndOf="parent"
45+
app:layout_constraintTop_toBottomOf="@id/account_name" />
46+
47+
<androidx.appcompat.widget.AppCompatEditText
48+
android:id="@+id/account_age"
49+
android:layout_width="match_parent"
50+
android:layout_height="wrap_content"
51+
android:hint="@string/hint_account_age"
52+
android:inputType="numberDecimal"
53+
android:layout_margin="8dp"
54+
app:layout_constraintStart_toStartOf="parent"
55+
app:layout_constraintEnd_toEndOf="parent"
56+
app:layout_constraintTop_toBottomOf="@id/account_role" />
57+
58+
<androidx.appcompat.widget.AppCompatButton
59+
android:id="@+id/save_account"
60+
android:layout_width="0dp"
61+
android:layout_height="wrap_content"
62+
android:text="@string/button_save"
63+
android:layout_gravity="center_horizontal"
64+
android:layout_margin="8dp"
65+
app:layout_constraintStart_toStartOf="parent"
66+
app:layout_constraintEnd_toEndOf="parent"
67+
app:layout_constraintTop_toBottomOf="@id/account_age" />
68+
</androidx.constraintlayout.widget.ConstraintLayout>

sample/kotlin/src/main/res/menu/navigation.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
android:title="@string/title_user_info"
2525
app:showAsAction="ifRoom"/>
2626

27+
<item
28+
android:id="@+id/set_account_info"
29+
android:icon="@drawable/ic_user_white_24dp"
30+
android:title="@string/title_account_info"
31+
app:showAsAction="ifRoom"/>
32+
2733
<item
2834
android:id="@+id/gdpr"
2935
android:icon="@drawable/ic_baseline_lock_open_24"

sample/kotlin/src/main/res/navigation/nav_graph.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@
5656
android:name="com.datadog.android.sample.user.UserFragment"
5757
android:label="@string/title_user_info"/>
5858

59+
<fragment
60+
android:id="@+id/fragment_account"
61+
android:name="com.datadog.android.sample.account.AccountFragment"
62+
android:label="@string/title_account_info" />
63+
5964
<activity android:id="@+id/activity_jetpack_compose"
6065
android:name="com.datadog.android.sample.compose.JetpackComposeActivity"
6166
android:label="@string/title_compose"/>

sample/kotlin/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<string name="title_foreground_service">Foreground service</string>
2424
<string name="title_picture">Picture loading</string>
2525
<string name="title_user_info">User Info</string>
26+
<string name="title_account_info">Account Info</string>
2627
<string name="title_vitals">Mobile Vitals</string>
2728
<string name="title_about">About…</string>
2829
<string name="title_gdpr">GDPR</string>
@@ -106,6 +107,11 @@
106107
<string name="hint_user_age">Age</string>
107108
<string name="hint_message">Message</string>
108109

110+
<string name="hint_account_id">Account ID</string>
111+
<string name="hint_account_name">Account name</string>
112+
<string name="hint_account_role">Role</string>
113+
<string name="hint_account_age">Age</string>
114+
109115
<string name="load_picture">Load picture</string>
110116
<string name="widget_description">Datadog Sample Widget</string>
111117
<string name="add_widget">Add widget</string>

0 commit comments

Comments
 (0)