Skip to content

Commit ef04491

Browse files
authored
Merge pull request #2821 from DataDog/tvaleev/feature/RUM-11291-fo-sampleapp-p2
[RUM-11291][Part2/2] FO Sample app integration - adding feature operation block to VitalsFragment
2 parents 670dfbb + 3127ccf commit ef04491

File tree

4 files changed

+147
-1
lines changed

4 files changed

+147
-1
lines changed

sample/kotlin/src/main/kotlin/com/datadog/android/sample/vitals/VitalsFragment.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ import android.os.Bundle
99
import android.view.LayoutInflater
1010
import android.view.View
1111
import android.view.ViewGroup
12+
import android.widget.Button
1213
import android.widget.CheckBox
1314
import android.widget.CompoundButton
1415
import android.widget.ProgressBar
1516
import androidx.fragment.app.Fragment
1617
import androidx.lifecycle.ViewModelProviders
18+
import com.datadog.android.rum.featureoperations.FailureReason
1719
import com.datadog.android.sample.R
20+
import com.google.android.material.textfield.TextInputEditText
1821

1922
internal class VitalsFragment :
2023
Fragment(),
@@ -24,6 +27,8 @@ internal class VitalsFragment :
2427
private lateinit var viewModel: VitalsViewModel
2528
private lateinit var progressView: ProgressBar
2629
private lateinit var badView: BadView
30+
private lateinit var operationName: TextInputEditText
31+
private lateinit var operationKey: TextInputEditText
2732

2833
// region Fragment
2934

@@ -40,8 +45,15 @@ internal class VitalsFragment :
4045
rootView.findViewById<CheckBox>(R.id.vital_slow_frame_rate).setOnCheckedChangeListener(this)
4146
rootView.findViewById<CheckBox>(R.id.vital_memory).setOnCheckedChangeListener(this)
4247
rootView.findViewById<CheckBox>(R.id.vital_stress_test).setOnCheckedChangeListener(this)
48+
rootView.findViewById<Button>(R.id.fo_start).setOnClickListener(this)
49+
rootView.findViewById<Button>(R.id.fo_stop_successfully).setOnClickListener(this)
50+
rootView.findViewById<Button>(R.id.fo_stop_unsuccessfully).setOnClickListener(this)
51+
4352
badView = rootView.findViewById(R.id.vital_slow_view)
4453
progressView = rootView.findViewById(R.id.progress)
54+
55+
operationName = rootView.findViewById(R.id.fo_name_edit_text)
56+
operationKey = rootView.findViewById(R.id.fo_operation_key_edit_text)
4557
return rootView
4658
}
4759

@@ -65,9 +77,25 @@ internal class VitalsFragment :
6577
// region View.OnClickListener
6678

6779
override fun onClick(v: View) {
80+
val operationKey = operationKey.text.toString().ifEmpty { null }
6881
when (v.id) {
6982
R.id.vital_long_task -> viewModel.runLongTask()
7083
R.id.vital_frozen_frame -> viewModel.runFrozenFrame()
84+
R.id.fo_start -> viewModel.startFeatureOperation(
85+
operationName.text.toString(),
86+
operationKey
87+
)
88+
89+
R.id.fo_stop_successfully -> viewModel.stopFeatureOperation(
90+
operationName.text.toString(),
91+
operationKey
92+
)
93+
94+
R.id.fo_stop_unsuccessfully -> viewModel.stopFeatureOperation(
95+
operationName.text.toString(),
96+
operationKey,
97+
FailureReason.ERROR
98+
)
7199
}
72100
}
73101

sample/kotlin/src/main/kotlin/com/datadog/android/sample/vitals/VitalsViewModel.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import android.graphics.Bitmap
1010
import android.os.Handler
1111
import android.os.Looper
1212
import androidx.lifecycle.ViewModel
13+
import com.datadog.android.rum.ExperimentalRumApi
1314
import com.datadog.android.rum.GlobalRumMonitor
1415
import com.datadog.android.rum.RumActionType
16+
import com.datadog.android.rum.featureoperations.FailureReason
1517
import timber.log.Timber
1618
import java.security.SecureRandom
1719

@@ -138,4 +140,18 @@ internal class VitalsViewModel : ViewModel() {
138140
}
139141
}.start()
140142
}
143+
144+
@OptIn(ExperimentalRumApi::class)
145+
fun startFeatureOperation(name: String, operationKey: String?) {
146+
GlobalRumMonitor.get().startFeatureOperation(name, operationKey)
147+
}
148+
149+
@OptIn(ExperimentalRumApi::class)
150+
fun stopFeatureOperation(name: String, operationKey: String?, reason: FailureReason? = null) {
151+
if (reason != null) {
152+
GlobalRumMonitor.get().failFeatureOperation(name, operationKey, reason)
153+
} else {
154+
GlobalRumMonitor.get().succeedFeatureOperation(name, operationKey)
155+
}
156+
}
141157
}

sample/kotlin/src/main/res/layout/fragment_vitals.xml

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@
2626
app:layout_constraintStart_toStartOf="parent"
2727
app:layout_constraintTop_toTopOf="parent"
2828
app:layout_constraintWidth_default="wrap" />
29+
android:id="@+id/title"
30+
android:layout_width="0dp"
31+
android:layout_height="wrap_content"
32+
android:layout_marginTop="8dp"
33+
android:gravity="center_horizontal"
34+
android:padding="16dp"
35+
android:text="@string/title_vitals"
36+
android:textAppearance="@style/TextAppearance.AppCompat.Title"
37+
app:layout_constraintEnd_toStartOf="@id/progress"
38+
app:layout_constraintHorizontal_chainStyle="packed"
39+
app:layout_constraintStart_toStartOf="parent"
40+
app:layout_constraintTop_toTopOf="parent"
41+
app:layout_constraintWidth_default="wrap" />
2942

3043
<ProgressBar
3144
android:id="@+id/progress"
@@ -122,4 +135,85 @@
122135
app:layout_constraintEnd_toEndOf="parent"
123136
app:layout_constraintStart_toStartOf="parent"
124137
app:layout_constraintTop_toBottomOf="@id/vital_slow_frame_rate" />
138+
139+
140+
<com.datadog.android.sample.widget.DividerView
141+
android:id="@+id/divider"
142+
style="@style/DividerView"
143+
android:layout_width="0dp"
144+
android:layout_height="wrap_content"
145+
android:layout_marginTop="24dp"
146+
app:dv_text="@string/divider_feature_operations"
147+
app:layout_constraintEnd_toEndOf="parent"
148+
app:layout_constraintStart_toStartOf="parent"
149+
app:layout_constraintTop_toBottomOf="@id/vital_slow_view" />
150+
151+
<com.google.android.material.textfield.TextInputLayout
152+
android:id="@+id/fo_name"
153+
android:layout_width="0dp"
154+
android:layout_height="wrap_content"
155+
android:layout_marginTop="16dp"
156+
app:layout_constraintEnd_toStartOf="@id/fo_operation_key"
157+
app:layout_constraintHorizontal_chainStyle="spread"
158+
app:layout_constraintHorizontal_weight="1"
159+
app:layout_constraintStart_toStartOf="parent"
160+
app:layout_constraintTop_toBottomOf="@id/divider">
161+
162+
<com.google.android.material.textfield.TextInputEditText
163+
android:id="@+id/fo_name_edit_text"
164+
android:layout_width="match_parent"
165+
android:layout_height="match_parent"
166+
android:hint="@string/text_feature_operation_name_hint"
167+
android:text="@string/text_feature_operation_name" />
168+
</com.google.android.material.textfield.TextInputLayout>
169+
170+
<com.google.android.material.textfield.TextInputLayout
171+
android:id="@+id/fo_operation_key"
172+
android:layout_width="0dp"
173+
android:layout_height="wrap_content"
174+
android:layout_marginStart="8dp"
175+
app:layout_constraintEnd_toEndOf="parent"
176+
app:layout_constraintHorizontal_weight="1"
177+
app:layout_constraintStart_toEndOf="@id/fo_name"
178+
app:layout_constraintTop_toTopOf="@id/fo_name">
179+
180+
<com.google.android.material.textfield.TextInputEditText
181+
android:id="@+id/fo_operation_key_edit_text"
182+
android:layout_width="match_parent"
183+
android:layout_height="match_parent"
184+
android:hint="@string/text_feature_operation_key_hint" />
185+
186+
</com.google.android.material.textfield.TextInputLayout>
187+
188+
<Button
189+
android:id="@+id/fo_start"
190+
android:layout_width="0dp"
191+
android:layout_height="wrap_content"
192+
android:layout_marginTop="16dp"
193+
android:text="@string/button_fo_start"
194+
app:layout_constraintEnd_toStartOf="@id/fo_stop_successfully"
195+
app:layout_constraintStart_toStartOf="parent"
196+
app:layout_constraintTop_toBottomOf="@id/fo_name" />
197+
198+
<Button
199+
android:id="@+id/fo_stop_successfully"
200+
android:layout_width="0dp"
201+
android:layout_height="wrap_content"
202+
android:layout_marginStart="4dp"
203+
android:layout_marginEnd="4dp"
204+
android:text="@string/button_fo_stop_successfully"
205+
app:layout_constraintEnd_toStartOf="@id/fo_stop_unsuccessfully"
206+
app:layout_constraintStart_toEndOf="@id/fo_start"
207+
app:layout_constraintTop_toTopOf="@id/fo_start" />
208+
209+
<Button
210+
android:id="@+id/fo_stop_unsuccessfully"
211+
android:layout_width="0dp"
212+
android:layout_height="wrap_content"
213+
android:text="@string/button_fo_stop_unsuccessfully"
214+
app:layout_constraintEnd_toEndOf="parent"
215+
app:layout_constraintStart_toEndOf="@id/fo_stop_successfully"
216+
app:layout_constraintTop_toTopOf="@id/fo_start" />
217+
218+
125219
</androidx.constraintlayout.widget.ConstraintLayout>

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,17 @@
7171
<string name="button_high_cpu_usage">High CPU usage</string>
7272
<string name="button_high_memory_usage">High RAM usage</string>
7373
<string name="button_stress_test_events">Stress Test Events</string>
74+
<string name="button_fo_start">Start</string>
75+
<string name="button_fo_stop_successfully">Success</string>
76+
<string name="button_fo_stop_unsuccessfully">Fail</string>
77+
<string name="divider_feature_operations">Feature Operations</string>
78+
<string name="divider_performance_degradation">Performance degradation</string>
79+
<string name="text_feature_operation_name">Test</string>
80+
<string name="text_feature_operation_name_hint">Operation name</string>
81+
<string name="text_feature_operation_key_hint">Operation key</string>
82+
7483
<string name="group_image_loader">Image Loader</string>
7584
<string name="group_data_source">Data Source</string>
76-
<string name="divider_performance_degradation">Performance degradation</string>
7785

7886
<string name="choice_coil">Coil</string>
7987
<string name="choice_fresco">Fresco</string>

0 commit comments

Comments
 (0)