Skip to content

Commit f99fb64

Browse files
authored
[ANDR][Example] Add config settings page (#88)
* [ANDR][Example] Add config settings page * Use api and url settings to init bitdrift logger * fmt * reshuffle * add license * Fix test
1 parent d2f5dd9 commit f99fb64

File tree

9 files changed

+104
-8
lines changed

9 files changed

+104
-8
lines changed

platform/jvm/gradle-test-app/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ dependencies {
1515
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
1616
implementation("androidx.navigation:navigation-fragment-ktx:2.5.3")
1717
implementation("androidx.navigation:navigation-ui-ktx:2.5.3")
18+
implementation("androidx.preference:preference-ktx:1.2.1")
1819
implementation("com.apollographql.apollo3:apollo-runtime:3.8.3")
1920
implementation("com.apollographql.apollo3:apollo-runtime:3.8.3")
2021
implementation("com.jakewharton.timber:timber:5.0.1")

platform/jvm/gradle-test-app/src/androidTest/java/io/bitdrift/gradletestapp/AndroidViewReplayTest.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ class AndroidViewReplayTest {
6161
assertThat(metrics.errorViewCount).isEqualTo(0)
6262
assertThat(metrics.exceptionCausingViewCount).isEqualTo(0)
6363
// AppCompatTextView multiline label
64-
assertThat(screen).contains(ReplayRect(type = ReplayType.Label, x = 36, y = 235, width = 758, height = 47))
65-
assertThat(screen).contains(ReplayRect(type = ReplayType.Label, x = 36, y = 277, width = 698, height = 38))
64+
assertThat(screen).contains(ReplayRect(type = ReplayType.Label, x = 36, y = 421, width = 758, height = 47))
65+
assertThat(screen).contains(ReplayRect(type = ReplayType.Label, x = 36, y = 463, width = 698, height = 38))
6666
}
6767
}
6868
}

platform/jvm/gradle-test-app/src/main/java/io/bitdrift/gradletestapp/BitdriftInit.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import okhttp3.HttpUrl;
2121

2222
public class BitdriftInit {
23-
public static void initBitdriftCaptureInJava() {
23+
public static void initBitdriftCaptureInJava(HttpUrl apiUrl, String apiKey) {
2424
String userID = UUID.randomUUID().toString();
2525
List<FieldProvider> fieldProviders = new ArrayList<>();
2626
fieldProviders.add(() -> {
@@ -30,12 +30,12 @@ public static void initBitdriftCaptureInJava() {
3030
});
3131

3232
Capture.Logger.start(
33-
"<YOUR API KEY GOES HERE>",
33+
apiKey,
3434
new SessionStrategy.Fixed(),
3535
new Configuration(),
3636
fieldProviders,
3737
null,
38-
HttpUrl.get("https://api.bitdrift.io")
38+
apiUrl
3939
);
4040
}
4141
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// capture-sdk - bitdrift's client SDK
2+
// Copyright Bitdrift, Inc. All rights reserved.
3+
//
4+
// Use of this source code is governed by a source available license that can be found in the
5+
// LICENSE file or at:
6+
// https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt
7+
8+
package io.bitdrift.gradletestapp
9+
10+
import android.content.Intent
11+
import android.content.pm.PackageManager
12+
import android.os.Bundle
13+
import androidx.preference.EditTextPreference
14+
import androidx.preference.Preference
15+
import androidx.preference.PreferenceCategory
16+
import androidx.preference.PreferenceFragmentCompat
17+
import kotlin.system.exitProcess
18+
19+
class ConfigurationSettingsFragment : PreferenceFragmentCompat() {
20+
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
21+
val context = preferenceManager.context
22+
val screen = preferenceManager.createPreferenceScreen(context)
23+
24+
val backendCategory = PreferenceCategory(context)
25+
backendCategory.key = "control_plane_category"
26+
backendCategory.title = "Control Plane Configuration"
27+
28+
screen.addPreference(backendCategory)
29+
30+
val apiUrlPref = EditTextPreference(context)
31+
apiUrlPref.key = "apiUrl"
32+
apiUrlPref.title = "API URL"
33+
apiUrlPref.summary = "App needs to be restarted for changes to take effect"
34+
35+
backendCategory.addPreference(apiUrlPref)
36+
37+
val apiKeyPref = EditTextPreference(context)
38+
apiKeyPref.key = "apiKey"
39+
apiKeyPref.title = "API Key"
40+
apiKeyPref.summary = "App needs to be restarted for changes to take effect"
41+
42+
backendCategory.addPreference(apiKeyPref)
43+
44+
val restartPreference = Preference(context)
45+
restartPreference.key = "restart"
46+
restartPreference.title = "Restart the App"
47+
restartPreference.setOnPreferenceClickListener {
48+
val launchIntent = context.packageManager.getLaunchIntentForPackage(context.packageName)
49+
val restartIntent = Intent.makeRestartActivityTask(launchIntent!!.component)
50+
// Required for API 34 and later
51+
// Ref: https://developer.android.com/about/versions/14/behavior-changes-14#safer-intents
52+
restartIntent.setPackage(context.packageName);
53+
context.startActivity(restartIntent)
54+
exitProcess(0)
55+
}
56+
57+
screen.addPreference(restartPreference)
58+
59+
preferenceScreen = screen
60+
}
61+
}

platform/jvm/gradle-test-app/src/main/java/io/bitdrift/gradletestapp/FirstFragment.kt

+8-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,11 @@ class FirstFragment : Fragment() {
100100
setContent {
101101
// In Compose world
102102
MaterialTheme {
103-
Text("Hello from Compose!")
103+
Text(
104+
text = "Text in Compose",
105+
style = MaterialTheme.typography.h6,
106+
color = MaterialTheme.colors.secondary,
107+
)
104108
}
105109
}
106110
}
@@ -110,6 +114,9 @@ class FirstFragment : Fragment() {
110114
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
111115
super.onViewCreated(view, savedInstanceState)
112116

117+
binding.btnNavigateConfiguration.setOnClickListener {
118+
findNavController().navigate(R.id.action_FirstFragment_to_ConfigFragment)
119+
}
113120
binding.btnCopySessionUrl.setOnClickListener(this::copySessionUrl)
114121
binding.btnStartNewSession.setOnClickListener(this::startNewSession)
115122
binding.btnTempDeviceCode.setOnClickListener(this::getTempDeviceCode)

platform/jvm/gradle-test-app/src/main/java/io/bitdrift/gradletestapp/GradleTestApp.kt

+10-1
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@ import android.os.Build
4848
import android.os.Bundle
4949
import android.util.Log
5050
import androidx.core.content.ContextCompat
51+
import androidx.preference.PreferenceManager
5152
import io.bitdrift.capture.Capture
5253
import io.bitdrift.capture.Capture.Logger.sessionUrl
5354
import io.bitdrift.capture.LogLevel
5455
import io.bitdrift.capture.events.span.Span
5556
import io.bitdrift.capture.events.span.SpanResult
5657
import io.bitdrift.capture.timber.CaptureTree
58+
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
5759
import papa.AppLaunchType
5860
import papa.PapaEvent
5961
import papa.PapaEventListener
@@ -81,7 +83,14 @@ class GradleTestApp : Application() {
8183
}
8284

8385
private fun initLogging() {
84-
BitdriftInit.initBitdriftCaptureInJava()
86+
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
87+
val stringApiUrl = prefs.getString("apiUrl", null)
88+
val apiUrl = stringApiUrl?.toHttpUrlOrNull()
89+
if (apiUrl == null) {
90+
Log.e("GradleTestApp", "Failed to initialize bitdrift logger due to invalid API URL: $stringApiUrl")
91+
return
92+
}
93+
BitdriftInit.initBitdriftCaptureInJava(apiUrl, prefs.getString("apiKey", ""))
8594
// Timber
8695
if (BuildConfig.DEBUG) {
8796
Timber.plant(Timber.DebugTree())

platform/jvm/gradle-test-app/src/main/res/layout/fragment_first.xml

+8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@
1111
tools:context=".FirstFragment"
1212
>
1313

14+
<Button
15+
android:id="@+id/btnNavigateConfiguration"
16+
style="?attr/materialButtonOutlinedStyle"
17+
android:layout_width="wrap_content"
18+
android:layout_height="wrap_content"
19+
android:text="@string/navigate_config"
20+
/>
21+
1422
<androidx.compose.ui.platform.ComposeView
1523
android:id="@+id/compose_view"
1624
android:layout_width="wrap_content"

platform/jvm/gradle-test-app/src/main/res/navigation/nav_graph.xml

+9-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
<action
1515
android:id="@+id/action_FirstFragment_to_SecondFragment"
1616
app:destination="@id/SecondFragment" />
17+
<action
18+
android:id="@+id/action_FirstFragment_to_ConfigFragment"
19+
app:destination="@id/ConfigurationSettingsFragment" />
1720
</fragment>
1821
<fragment
1922
android:id="@+id/SecondFragment"
@@ -25,4 +28,9 @@
2528
android:id="@+id/action_SecondFragment_to_FirstFragment"
2629
app:destination="@id/FirstFragment" />
2730
</fragment>
28-
</navigation>
31+
<fragment
32+
android:id="@+id/ConfigurationSettingsFragment"
33+
android:name="io.bitdrift.gradletestapp.ConfigurationSettingsFragment"
34+
android:label="@string/config_fragment_label">
35+
</fragment>
36+
</navigation>

platform/jvm/gradle-test-app/src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
<!-- Strings used for fragments for navigation -->
55
<string name="first_fragment_label">First Fragment</string>
66
<string name="second_fragment_label">Second Fragment</string>
7+
<string name="config_fragment_label">Configuration Settings Fragment</string>
8+
<string name="navigate_config">Navigate to Configuration</string>
79
<string name="okhttp">Perform OkHttp Request</string>
810
<string name="graphql">Perform Apollo GraphQL Request</string>
911
<string name="compat_multiline_txt">Text Label on AppCompatTextView\nSecond Line on same Text Label</string>

0 commit comments

Comments
 (0)