From 125ce676047ee7298fa70e566f88253b74c9a5c8 Mon Sep 17 00:00:00 2001 From: jason plumb <75337021+breedx-splk@users.noreply.github.com> Date: Tue, 7 May 2024 14:50:46 -0700 Subject: [PATCH] Spike demo app (#338) * initial add of sample app * revert * rename main app * placeholder session id * rename theme * more naming fixes * add updated logo images * hacking on the ui * hacking on the ui * cleanup/hacking * fix endpoint, generate spans on click * hacking * cleanup * add readme notes * add comment * spotless and get the build working * ktlint tweak * remove items duplicated from conventions * code review comments * rename --- .editorconfig | 2 + .github/workflows/pr-check.yaml | 2 + .../otel.errorprone-conventions.gradle.kts | 2 + demo-app/README.md | 16 ++++ demo-app/build.gradle.kts | 72 +++++++++++++++ .../android/demo/ExampleInstrumentedTest.kt | 27 ++++++ demo-app/src/main/AndroidManifest.xml | 37 ++++++++ demo-app/src/main/ic_launcher-playstore.png | Bin 0 -> 16177 bytes .../android/demo/AstronomyShopActivity.kt | 42 +++++++++ .../opentelemetry/android/demo/CenterText.kt | 54 ++++++++++++ .../android/demo/DemoViewModel.kt | 38 ++++++++ .../android/demo/MainActivity.kt | 82 ++++++++++++++++++ .../android/demo/MainOtelButton.kt | 53 +++++++++++ .../android/demo/OpenStoreButton.kt | 44 ++++++++++ .../android/demo/OtelSampleApplication.kt | 62 +++++++++++++ .../opentelemetry/android/demo/SessionId.kt | 38 ++++++++ .../opentelemetry/android/demo/theme/Color.kt | 16 ++++ .../opentelemetry/android/demo/theme/Theme.kt | 77 ++++++++++++++++ .../opentelemetry/android/demo/theme/Type.kt | 41 +++++++++ .../demo/ui/dashboard/DashboardFragment.kt | 52 +++++++++++ .../demo/ui/dashboard/DashboardViewModel.kt | 18 ++++ .../android/demo/ui/home/HomeFragment.kt | 52 +++++++++++ .../android/demo/ui/home/HomeViewModel.kt | 18 ++++ .../ui/notifications/NotificationsFragment.kt | 52 +++++++++++ .../notifications/NotificationsViewModel.kt | 18 ++++ .../res/drawable/ic_dashboard_black_24dp.xml | 9 ++ .../main/res/drawable/ic_home_black_24dp.xml | 9 ++ .../res/drawable/ic_launcher_background.xml | 74 ++++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 +++++++ .../drawable/ic_notifications_black_24dp.xml | 9 ++ demo-app/src/main/res/drawable/otel_icon.png | Bin 0 -> 15961 bytes demo-app/src/main/res/font/gotham_bold.ttf | Bin 0 -> 45744 bytes .../res/layout/activity_astronomy_shop.xml | 33 +++++++ .../main/res/layout/fragment_dashboard.xml | 22 +++++ .../src/main/res/layout/fragment_home.xml | 22 +++++ .../res/layout/fragment_notifications.xml | 22 +++++ .../src/main/res/menu/bottom_nav_menu.xml | 19 ++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 ++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 ++ .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1244 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 854 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2718 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 884 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 642 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1756 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1772 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 1090 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3798 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2526 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 1600 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5846 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3368 bytes .../ic_launcher_foreground.webp | Bin 0 -> 2084 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 8098 bytes .../main/res/navigation/mobile_navigation.xml | 25 ++++++ demo-app/src/main/res/values/colors.xml | 10 +++ demo-app/src/main/res/values/dimens.xml | 5 ++ .../res/values/ic_launcher_background.xml | 4 + demo-app/src/main/res/values/strings.xml | 7 ++ demo-app/src/main/res/values/themes.xml | 5 ++ demo-app/src/main/res/xml/backup_rules.xml | 13 +++ .../main/res/xml/data_extraction_rules.xml | 19 ++++ .../main/res/xml/network_security_config.xml | 7 ++ gradle/libs.versions.toml | 20 +++++ settings.gradle.kts | 1 + 65 files changed, 1290 insertions(+) create mode 100644 .editorconfig create mode 100644 demo-app/README.md create mode 100644 demo-app/build.gradle.kts create mode 100644 demo-app/src/androidTest/java/io/opentelemetry/android/demo/ExampleInstrumentedTest.kt create mode 100644 demo-app/src/main/AndroidManifest.xml create mode 100644 demo-app/src/main/ic_launcher-playstore.png create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/AstronomyShopActivity.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/CenterText.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/DemoViewModel.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/MainOtelButton.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/OpenStoreButton.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/OtelSampleApplication.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/SessionId.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/theme/Color.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/theme/Theme.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/theme/Type.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/ui/dashboard/DashboardFragment.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/ui/dashboard/DashboardViewModel.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/ui/home/HomeFragment.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/ui/home/HomeViewModel.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/ui/notifications/NotificationsFragment.kt create mode 100644 demo-app/src/main/java/io/opentelemetry/android/demo/ui/notifications/NotificationsViewModel.kt create mode 100644 demo-app/src/main/res/drawable/ic_dashboard_black_24dp.xml create mode 100644 demo-app/src/main/res/drawable/ic_home_black_24dp.xml create mode 100644 demo-app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 demo-app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 demo-app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 demo-app/src/main/res/drawable/otel_icon.png create mode 100644 demo-app/src/main/res/font/gotham_bold.ttf create mode 100644 demo-app/src/main/res/layout/activity_astronomy_shop.xml create mode 100644 demo-app/src/main/res/layout/fragment_dashboard.xml create mode 100644 demo-app/src/main/res/layout/fragment_home.xml create mode 100644 demo-app/src/main/res/layout/fragment_notifications.xml create mode 100644 demo-app/src/main/res/menu/bottom_nav_menu.xml create mode 100644 demo-app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 demo-app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 demo-app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 demo-app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 demo-app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 demo-app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 demo-app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 demo-app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 demo-app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 demo-app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 demo-app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 demo-app/src/main/res/navigation/mobile_navigation.xml create mode 100644 demo-app/src/main/res/values/colors.xml create mode 100644 demo-app/src/main/res/values/dimens.xml create mode 100644 demo-app/src/main/res/values/ic_launcher_background.xml create mode 100644 demo-app/src/main/res/values/strings.xml create mode 100644 demo-app/src/main/res/values/themes.xml create mode 100644 demo-app/src/main/res/xml/backup_rules.xml create mode 100644 demo-app/src/main/res/xml/data_extraction_rules.xml create mode 100644 demo-app/src/main/res/xml/network_security_config.xml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..5facbdfb4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,2 @@ +[*.{kt,kts}] +ktlint_function_naming_ignore_when_annotated_with=Composable diff --git a/.github/workflows/pr-check.yaml b/.github/workflows/pr-check.yaml index dfa336d1f..1b0d553f6 100644 --- a/.github/workflows/pr-check.yaml +++ b/.github/workflows/pr-check.yaml @@ -13,6 +13,8 @@ jobs: with: distribution: temurin java-version: 17 + - name: touch local props + run: touch local.properties - name: run gradle run: ./gradlew check diff --git a/buildSrc/src/main/kotlin/otel.errorprone-conventions.gradle.kts b/buildSrc/src/main/kotlin/otel.errorprone-conventions.gradle.kts index 669532c42..680f64d28 100644 --- a/buildSrc/src/main/kotlin/otel.errorprone-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/otel.errorprone-conventions.gradle.kts @@ -47,6 +47,8 @@ tasks { nullaway { severity.set(CheckSeverity.ERROR) + // Prevent generated binding code in demo app from failing the build + unannotatedSubPackages.add("io.opentelemetry.android.demo.databinding") } // Builder 'return this;' pattern diff --git a/demo-app/README.md b/demo-app/README.md new file mode 100644 index 000000000..1870f3d76 --- /dev/null +++ b/demo-app/README.md @@ -0,0 +1,16 @@ + +# OpenTelemetry Android Demo App + +This is an app built to demonstrate how to configure and use the OpenTelemetry Android agent +to observe app and user behavior. + +This is very much a work in progress. + +## Features + +* TBD + + +## How to use + +* TBD diff --git a/demo-app/build.gradle.kts b/demo-app/build.gradle.kts new file mode 100644 index 000000000..de5bd6049 --- /dev/null +++ b/demo-app/build.gradle.kts @@ -0,0 +1,72 @@ +import java.io.FileInputStream +import java.util.Properties + +plugins { + id("otel.android-app-conventions") +} + +val localProperties = Properties() +localProperties.load(FileInputStream(rootProject.file("local.properties"))) + +android { + namespace = "io.opentelemetry.android.demo" + + defaultConfig { + applicationId = "io.opentelemetry.android.demo" + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + all { + val accessToken = localProperties["rum.access.token"] as String? + resValue("string", "rum_access_token", accessToken ?: "fakebroken") + } + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro", + ) + } + } + buildFeatures { + compose = true + viewBinding = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.13" + } +} + +dependencies { + implementation(libs.androidx.appcompat) + implementation(libs.androidx.constraintlayout) + implementation(libs.material) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.navigation.fragment.ktx) + implementation(libs.androidx.navigation.ui.ktx) + coreLibraryDesugaring(libs.desugarJdkLibs) + + implementation(project(":android-agent")) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + implementation(libs.opentelemetry.sdk) + implementation(libs.opentelemetry.exporter.otlp) + testImplementation(libs.bundles.junit) + androidTestImplementation(libs.androidx.junit) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) +} diff --git a/demo-app/src/androidTest/java/io/opentelemetry/android/demo/ExampleInstrumentedTest.kt b/demo-app/src/androidTest/java/io/opentelemetry/android/demo/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..36c60ee27 --- /dev/null +++ b/demo-app/src/androidTest/java/io/opentelemetry/android/demo/ExampleInstrumentedTest.kt @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + Assert.assertEquals("io.opentelemetry.android.demo", appContext.packageName) + } +} diff --git a/demo-app/src/main/AndroidManifest.xml b/demo-app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..c1cc57afb --- /dev/null +++ b/demo-app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo-app/src/main/ic_launcher-playstore.png b/demo-app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6d13ee46b317aca6421d8cbedcef3d8ce9efc2 GIT binary patch literal 16177 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 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + DemoAppTheme { + // A surface container using the 'background' color from the theme + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background, + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceEvenly, + ) { + Row( + Modifier.padding(all = 20.dp), + horizontalArrangement = Arrangement.Center, + ) { + CenterText( + fontSize = 40.sp, + text = + buildAnnotatedString { + withStyle(style = SpanStyle(color = Color(0xFFF5A800))) { + append("Open") + } + withStyle(style = SpanStyle(color = Color(0xFF425CC7))) { + append("Telemetry") + } + withStyle(style = SpanStyle(color = Color.Black)) { + append(" Android Demo") + } + toAnnotatedString() + }, + ) + } + SessionId(viewModel.sessionIdState) + MainOtelButton( + painterResource(id = R.drawable.otel_icon), + ) + val context = LocalContext.current + OpenStoreButton(text = "Click to begin", onClick = { + context.startActivity(Intent(this@MainActivity, AstronomyShopActivity::class.java)) + }) + } + } + } + } + } +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/MainOtelButton.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/MainOtelButton.kt new file mode 100644 index 000000000..4d60c81ff --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/MainOtelButton.kt @@ -0,0 +1,53 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.unit.dp +import io.opentelemetry.api.trace.SpanKind + +@Composable +fun MainOtelButton(icon: Painter) { + Row { + Spacer(modifier = Modifier.height(5.dp)) + Button( + onClick = { generateClickEvent() }, + modifier = Modifier.padding(20.dp), + colors = ButtonDefaults.buttonColors(containerColor = Color.Black), + content = { + Image( + painter = icon, + contentDescription = null, + Modifier + .width(150.dp) + .padding(30.dp), + ) + }, + ) + } +} + +fun generateClickEvent() { + // TODO: Make an actual otel event + val tracer = OtelSampleApplication.tracer("otel.demo") + val span = + tracer + ?.spanBuilder("logo.clicked") + ?.setSpanKind(SpanKind.INTERNAL) + ?.startSpan() + span?.end() +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/OpenStoreButton.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/OpenStoreButton.kt new file mode 100644 index 000000000..4a972ed70 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/OpenStoreButton.kt @@ -0,0 +1,44 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun OpenStoreButton( + text: String, + onClick: () -> Unit, +) { + Row { + Spacer(modifier = Modifier.height(5.dp)) + } + Row { + Button( + onClick = onClick, + border = BorderStroke(1.dp, Color.Gray), + modifier = Modifier.padding(20.dp).height(90.dp), + colors = + ButtonDefaults.buttonColors( + containerColor = Color.Transparent, + contentColor = Color(0xFF425CC7), + ), + content = { + CenterText(text = text, fontSize = 30.sp) + }, + ) + } +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/OtelSampleApplication.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/OtelSampleApplication.kt new file mode 100644 index 000000000..4d66d7872 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/OtelSampleApplication.kt @@ -0,0 +1,62 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo + +import android.annotation.SuppressLint +import android.app.Application +import android.util.Log +import io.opentelemetry.android.OpenTelemetryRum +import io.opentelemetry.android.OpenTelemetryRumBuilder +import io.opentelemetry.android.config.OtelRumConfig +import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfiguration +import io.opentelemetry.api.common.AttributeKey.stringKey +import io.opentelemetry.api.common.Attributes +import io.opentelemetry.api.trace.Tracer +import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter + +private const val TAG = "otel.demo" + +class OtelSampleApplication : Application() { + @SuppressLint("RestrictedApi") + override fun onCreate() { + super.onCreate() + + Log.i(TAG, "Initializing the opentelemetry-android-agent") + val diskBufferingConfig = + DiskBufferingConfiguration.builder() + .setEnabled(true) + .setMaxCacheSize(10_000_000) + .build() + val config = + OtelRumConfig() + .setGlobalAttributes(Attributes.of(stringKey("toolkit"), "jetpack compose")) + .setDiskBufferingConfiguration(diskBufferingConfig) + + // 10.0.2.2 is apparently a special binding to the host running the emulator + val ingestUrl = "http://10.0.2.2:4318/v1/traces" + val otelRumBuilder: OpenTelemetryRumBuilder = + OpenTelemetryRum.builder(this, config) + .addSpanExporterCustomizer { + OtlpHttpSpanExporter.builder() + .setEndpoint(ingestUrl) + .build() + } + try { + rum = otelRumBuilder.build() + Log.d(TAG, "RUM session started: " + rum!!.rumSessionId) + } catch (e: Exception) { + Log.e(TAG, "Oh no!", e) + } + } + + companion object { + var rum: OpenTelemetryRum? = null + + fun tracer(name: String): Tracer? { + return rum?.openTelemetry?.tracerProvider?.get(name) + } + } +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/SessionId.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/SessionId.kt new file mode 100644 index 000000000..f702c016e --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/SessionId.kt @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Card +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import kotlinx.coroutines.flow.StateFlow + +@Composable +fun SessionId(sessionId: StateFlow) { + Row { + Card(modifier = Modifier.size(width = 250.dp, height = 75.dp)) { + Column( + modifier = + Modifier + .fillMaxWidth() + .padding(vertical = 25.dp), + Arrangement.Center, + ) { + CenterText(text = "session.id", fontSize = 12.sp) + CenterText(text = sessionId.collectAsState().value, fontSize = 12.sp) + } + } + } +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Color.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Color.kt new file mode 100644 index 000000000..b8c5746b8 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Color.kt @@ -0,0 +1,16 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Theme.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Theme.kt new file mode 100644 index 000000000..6604f1301 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Theme.kt @@ -0,0 +1,77 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val DarkColorScheme = + darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80, + ) + +private val LightColorScheme = + lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40, + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ + ) + +@Composable +fun DemoAppTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit, +) { + val colorScheme = + when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = colorScheme.primary.toArgb() + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme + } + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content, + ) +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Type.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Type.kt new file mode 100644 index 000000000..cac0208a7 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/theme/Type.kt @@ -0,0 +1,41 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = + Typography( + bodyLarge = + TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp, + ), + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ + ) diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/dashboard/DashboardFragment.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/dashboard/DashboardFragment.kt new file mode 100644 index 000000000..9a4481934 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/dashboard/DashboardFragment.kt @@ -0,0 +1,52 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.ui.dashboard + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import io.opentelemetry.android.demo.databinding.FragmentDashboardBinding + +class DashboardFragment : Fragment() { + // Renamed from _binding (default) due to ktlint problem below + private var binding: FragmentDashboardBinding? = null + + // This property is only valid between onCreateView and onDestroyView. + // Currently failing ktlint due to + // https://github.com/pinterest/ktlint/issues/2448 + // which hasn't hit the aging gradle spotless plugin yet +// private val binding get() = _binding!! + fun getBinding(): FragmentDashboardBinding { + return binding!! + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + val dashboardViewModel = + ViewModelProvider(this).get(DashboardViewModel::class.java) + + binding = FragmentDashboardBinding.inflate(inflater, container, false) + val root: View = getBinding().root + + val textView: TextView = getBinding().textDashboard + dashboardViewModel.text.observe(viewLifecycleOwner) { + textView.text = it + } + return root + } + + override fun onDestroyView() { + super.onDestroyView() + binding = null + } +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/dashboard/DashboardViewModel.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/dashboard/DashboardViewModel.kt new file mode 100644 index 000000000..af4464db2 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/dashboard/DashboardViewModel.kt @@ -0,0 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.ui.dashboard + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class DashboardViewModel : ViewModel() { + private val _text = + MutableLiveData().apply { + value = "This is dashboard Fragment" + } + val text: LiveData = _text +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/home/HomeFragment.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/home/HomeFragment.kt new file mode 100644 index 000000000..1b80db8a0 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/home/HomeFragment.kt @@ -0,0 +1,52 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.ui.home + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import io.opentelemetry.android.demo.databinding.FragmentHomeBinding + +class HomeFragment : Fragment() { + // Renamed from _binding (default) due to ktlint problem below + private var binding: FragmentHomeBinding? = null + + // This property is only valid between onCreateView and onDestroyView. + // Currently failing ktlint due to + // https://github.com/pinterest/ktlint/issues/2448 + // which hasn't hit the aging gradle spotless plugin yet +// private val binding get() = _binding!! + private fun getBinding(): FragmentHomeBinding { + return binding!! + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + val homeViewModel = + ViewModelProvider(this).get(HomeViewModel::class.java) + + binding = FragmentHomeBinding.inflate(inflater, container, false) + val root: View = getBinding().root + + val textView: TextView = getBinding().textHome + homeViewModel.text.observe(viewLifecycleOwner) { + textView.text = it + } + return root + } + + override fun onDestroyView() { + super.onDestroyView() + binding = null + } +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/home/HomeViewModel.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/home/HomeViewModel.kt new file mode 100644 index 000000000..ccd2c2157 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/home/HomeViewModel.kt @@ -0,0 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.ui.home + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class HomeViewModel : ViewModel() { + private val _text = + MutableLiveData().apply { + value = "This is home Fragment" + } + val text: LiveData = _text +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/notifications/NotificationsFragment.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/notifications/NotificationsFragment.kt new file mode 100644 index 000000000..34b19adde --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/notifications/NotificationsFragment.kt @@ -0,0 +1,52 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.ui.notifications + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import io.opentelemetry.android.demo.databinding.FragmentNotificationsBinding + +class NotificationsFragment : Fragment() { + // Renamed from _binding (default) due to ktlint problem below + private var binding: FragmentNotificationsBinding? = null + + // This property is only valid between onCreateView and onDestroyView. + // Currently failing ktlint due to + // https://github.com/pinterest/ktlint/issues/2448 + // which hasn't hit the aging gradle spotless plugin yet +// private val binding get() = _binding!! + private fun getBinding(): FragmentNotificationsBinding { + return binding!! + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + val notificationsViewModel = + ViewModelProvider(this).get(NotificationsViewModel::class.java) + + binding = FragmentNotificationsBinding.inflate(inflater, container, false) + val root: View = getBinding().root + + val textView: TextView = getBinding().textNotifications + notificationsViewModel.text.observe(viewLifecycleOwner) { + textView.text = it + } + return root + } + + override fun onDestroyView() { + super.onDestroyView() + binding = null + } +} diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/notifications/NotificationsViewModel.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/notifications/NotificationsViewModel.kt new file mode 100644 index 000000000..678151b81 --- /dev/null +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/ui/notifications/NotificationsViewModel.kt @@ -0,0 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.demo.ui.notifications + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class NotificationsViewModel : ViewModel() { + private val _text = + MutableLiveData().apply { + value = "This is notifications Fragment" + } + val text: LiveData = _text +} diff --git a/demo-app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/demo-app/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 000000000..46fc8deec --- /dev/null +++ b/demo-app/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo-app/src/main/res/drawable/ic_home_black_24dp.xml b/demo-app/src/main/res/drawable/ic_home_black_24dp.xml new file mode 100644 index 000000000..f8bb0b556 --- /dev/null +++ b/demo-app/src/main/res/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo-app/src/main/res/drawable/ic_launcher_background.xml b/demo-app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..ca3826a46 --- /dev/null +++ b/demo-app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo-app/src/main/res/drawable/ic_launcher_foreground.xml b/demo-app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 000000000..2b068d114 --- /dev/null +++ b/demo-app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/drawable/ic_notifications_black_24dp.xml b/demo-app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 000000000..78b75c39b --- /dev/null +++ b/demo-app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo-app/src/main/res/drawable/otel_icon.png b/demo-app/src/main/res/drawable/otel_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3d24a34089ea40faf7b4066c84064b949d0953fa GIT binary patch literal 15961 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 P=xz&jhiUQ;2TuM6{VG!e literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/font/gotham_bold.ttf b/demo-app/src/main/res/font/gotham_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8759d2bd195e89785067d71e85b10c82e0b905ee GIT binary patch literal 45744 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 + + + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/layout/fragment_dashboard.xml b/demo-app/src/main/res/layout/fragment_dashboard.xml new file mode 100644 index 000000000..166ab0e9e --- /dev/null +++ b/demo-app/src/main/res/layout/fragment_dashboard.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/layout/fragment_home.xml b/demo-app/src/main/res/layout/fragment_home.xml new file mode 100644 index 000000000..f3d9b08ff --- /dev/null +++ b/demo-app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/layout/fragment_notifications.xml b/demo-app/src/main/res/layout/fragment_notifications.xml new file mode 100644 index 000000000..d41793572 --- /dev/null +++ b/demo-app/src/main/res/layout/fragment_notifications.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/menu/bottom_nav_menu.xml b/demo-app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 000000000..fb6d040b9 --- /dev/null +++ b/demo-app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/demo-app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..036d09bc5 --- /dev/null +++ b/demo-app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/demo-app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..036d09bc5 --- /dev/null +++ b/demo-app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/mipmap-hdpi/ic_launcher.webp b/demo-app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..de0ab944becf64793e5b340e9d9c9d0c1ef90c6d GIT binary patch literal 1244 zcmV<21S9)WNk&H01ONb6MM6+kP&iD;1ONapN5Byf#|JBtZP&`IbMyTLAsE09t`U%P zJa-RC1mrf797(Ji4eWCbSp(O@Gev8Cop5X0R;{dkpZ%ZzkP3*Xh^pzp-JN^Sf*aem z>SkRrGgqNeELGqh?99cu7j^@bapXRj;U2*O009C72+#sm5FkK+0;q!u2v9OEz!i7| z{~(S3;MWM0Ab|kg^SNVk^ z5OrT54W%nX&pQF7`=oN@OZj#9V>%T91rkt7SN=hg3Zy~=Nsx*JL6Gpz&+pF|85j|K z{tW%Me0&WOfj}fU-&BmZty@mZ0^EZ%28h;8DyPFVZ9se7cgyYAU!+n8(YgT%^7MRo z2MH2B8i-yl37ax@>pDgq&4p7;rXuUwcTD)v_a zSD}*fu3KR~H&0aPuY!SohVzYfFOa)_uLxdpQRK!4U}m{ zO!_4967iKm8n;igqJcF7%{Y}J%8KDt%*#( zuBcv4Q9|xfOrVk6fyT5Oiu%PYg$Ismkgr6C$t_7ZpDKx-o-dk@8`8Pkg#P78;N6Kt zu1pmL+6*5*wntq-Bl^uzm8(+)fKv5q<^zqAMWf#yRhX|&70H`y_J;ktmWh6ILb)+r z5Gq}*aH9e8q^?Dy-#wis2o>ryq}@On=wDL62}+K}qhtUB8VW-u3+&BC${5(lP7n5G zBjt95#cu%iW}}8w`z^rUxKruh1003$n=tNQ(0V${^=zcVMONxrXCY#X{iWxpusJEP zHTyU3g<8yB{%ea^Z3L}Y9Oz}%g0DVDmSl}9V))o>iw^tzkhC8R2>t%$)8`M&{GJ(L z27?)31~W650cJ3m0cJ2he){q~G~j@w(_^1sP;iLhgM)l`d*}i7AKJUe@OuwIN>UGk G(*INv%ukX4 literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/demo-app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..f91d62b78ab9dbe923fc3b9882cd9df57e0b3436 GIT binary patch literal 854 zcmV-c1F8H{Nk&Fa0{{S5MM6+kP&iCN0{{Rop+G1QZv;7#Bt?>E&)UkhqOUAWKgPRM z!%-ValH}~U5DcGTu>3LX|K9C%6-km}W$)eNU-qxyNq7RD8Ri|g0l=nBBpJ)hV=w5d z^hXb3X69CMAflj6w1h6!ewgxP$v3lbcgOj=*Cu~86sVUr7EKzPUi#<16o@^ord4Re zBeAGa974l_N+2dk0O3n0NasPok}xs`0Y zQWS#vBHj94^>1NPl~nFutWi!|Je8;_h&2+cn!xbGGk!*|vMLYyb3qAAaGx z=M~X^hi%(Pl0)6sz~Wkfz&rDQXL&8^>aAvRi>)T#hH9&Z^bwbpw8V+~o;t;(JXO@^ zKJ{sN^jlE-@JNq1oioNPZ1_n@N1&r4QPB};=%|_%bY!;#baYp}-_cb^dA_5oiS>L( zprLOo#vF-)&|%CG2?+bMN6_PQzp6M6Uca4r|Bb+Yx(q{}nRci%(+LgR@7oBln;st6 z+~^;gSkzM6q%muU7L&aJ_D9FaqLNmPF=o`K;~SiAeO5|V4*xHMV7Xl-*&O&5bFa9e zsr+#~0LaOV0ljn8JALUL1~slWSZrXA?DXhB(FQfR0z6sI$w5+qJ_P7E(p-X gB~={L#UXXB1NvkMR0@3xpicV5U>UgdF#)}?g@@sA zpeeJjT-&ye?fI`Xwr$(CZQHhO{TKoc~ZQBgnPDRr_if!ArZQHiZp`DRE zvu)e9b9~NL_o{2Hwbxo*z5l=)&vblZJL%Y&pNegxV|(LtY|nPbPRFWv#nzg|ed1Zi z#vlTgZQG`!k&2VDZQHhO+qV7bF4(qhb-}i+dvhGPjig9P_dxd^^F0BqQi4X=VyJ0| zMKwyKBny7DbSrjRj_$xKrBZ$>LFM@8o8RnvWz@#f0Z=|_Lknp;-K2-~!S(6-U3z)f z!;Rm*Lkmtm7l3Z5iLL=uh{n+|dg}s12EQ7{*>v>s69G+E?Fa{;CbWq@83vcJglri} zI3%+?hRpP~eHG`%T3Igz97~-lK&|OK1%s!zLp-1%J3Z&d`HurC6deathV~1C+gEXg zUS)G`JQjlEFha=y&7$ANRWVo0%~hQK90jb(n3T&kVQ}f6GrJNuT$2|w#j2p{^u$<6 z##{wMD{#sG4sH*_3hap`hir z7H%nI7H37-axK;_0U4BFkx9jJ187BA>0ojvezZA;NvQ3MG^}rvGX@g*nFlb!scyg7?W4JX5Dw6 zMI^?SNT9@TeH_6fYEIqxx)aUnytmzoKm#nyWn(a&ODS2F3+fJ&B-mMLBOf?5DHl8R zo~G!gff3y>63N?1R=~DzD=tfO#ypTb*`D9RQPGMd7LabbK-P8SF%=n|K5=DG2dubM z?VJfEA;yj5$`qo|YSi+to9=xFmjUfXr|$JMG>s6$*V!m8%Q1_Bk)YXG zSPTa=2Ym}lw~VLM6v6`DteD0WdfZ7a8Z+qp#JqQHi^Fj+l(h89gtib+6CyyJ3k&@) zV+IkX5XAxx;*@#vAUSg{xv)>YnMDM~duMeACM0|7PRYvk>Qe5g{Z^ge`#qyT3j(VznoKdWn^h>nG6s_vajwmy$qtn zf&v%gL$ZUhP2#7(PYG<~2@o_h1_0_pSe&PkHvr7&TFXm+ve9qKH*#EpSIGf!4ad~e zN#H8~NqhFB?N*DoN|#`fC1q+`{R8KU|vNQ24m!A3uBQlDV z&}-oDp7$#)u70WTD+MRy0FO=L2h$MYVXW=r+=T&APvMY26C`}w3>Y3c>rM5FaTo6YxI4WA{(25kpG6@zL5-u`jXw{K(o_fr5&-inM+cN_? zVT_f@O&)m4_|aq)2Owb@Q>Mys2|!3&`$ffaN7ej*;gx~Aa2gn}`0(+`0H6_aJu2z$ z0&YdB=6gH^iwit2NO47hivj)0q%iwKRoahf@H#Ms@J`nrXsfOLl)2t!LiS2G9nF_N z89$mT?lgmlQ{!b|Mn+LEa{u;A`g|WaygT>%jCIuGdm7xy)Mys<6ahs$Mrg@Xu&%#o zvwfldQ({qA06O$PJVpmVOH?8}%cAe3tNC_+kGOx!aZ;gZ0dT!7E5qgS)``f%@Zo>L z(PKaaP!?Lccd7anP|STSqHr}mE&^7xkC-1ii%9C73|||i5z#3|>o+4|An!O8XOjdG zy05MM1neOHN5RNb8!rYw3`|U_&wTA7%0(3Hml7_rA@t|?9hTA*v%J-8lhi2*{_K?Y zOl&~b1}F#kfGipJk--Ry`?nadL&oeWppWWjTBE}+!3sFU03jdX+B*s;_95ESlbv+^ z-#5x4k^3_U|6V6N1!&E5=;w#p|0kIm%|xuQk}=s)etK6oO-3M_W)Pu9+~$50c1#T3 z>uSESGanH%zSraR->V301Dr&>tJwLlZvaaKBm2mIQ^FETZ?;XjeUPd3>k}s2`xi3 zn+YGXZ-$#Uath%>GP2ERYw9{u7B4;W{y0@u_KbQI5Q&q(+%Hb?TWSN&ru<5a4 zez&(!?~kV~D&Qzl=vbn(Rbduw#P?Z0?BE33 zQ|--kHOJ#Tudn_+^VQUQ-wZd{SN)H_5zY73*rWmuLWHWu6-iy``v*TJ$_aVs6X#<${r1UXPP|3Cr{@B|-_Kmvazur@PL01+~PfA9lmqAD05 z2<(U5CW0{RDL^Vzl!8h?sZ?6ZN4%*Zf}l{LVu51BAPMY{K2+re6+wa&F`Bcquv7Yo zQC@ma<)wSD(3=EFD51PSkV<6{Llr|pND7jqf>be}onONa!)}8eh8>2Tro$c_47<($ zxZk?JpEI**Ch(WlV5;#|%u<$2DBJq|j6Owx+6b3~+VuSy?SIKsO_{b437JLs{e{Uy z$kI0Aa(mbQqm6K>rZQzRm}=_(w`9rSk^vG32FT#$yRn{+9v_$S?d?=I!}s^O%xc_U z{Vc%*d^7iz>*L?3Z>#_Lc`U%t%=K*rvsE+y=Cx+F_xE$HW-kB#cRs5ztLbq4|1ikk zw(WSExAxm?c~jdq=dJ5(+l({YwrX3!Z1WEb-{)9=zrTq7PXL=Nqavk8dB(vAa(KWQ z!b8I(E8z^>4QCO@rc9Nt9F1Vy-4T_bc-+rb6kf-RICZRKb)4$$cNXOoi4W-_R!EOk zz4^%^U42U<^4o)SB7grs8M&FXG}AZC%OEvvmv(;xsg+vbU?ZjSEn46}BN@xB%T=4T zz`=$L8kT$gy*H{iX@ULoGbtqA9k8P3X7y$*ux|!|q&ovv06jOVwrH`tp1`#MtIOW& zm0Neu&LD8E(-k_5B{do$FVS?Vd$gy$e`4@~a4X07r0?qaD+%J=qx&%=49~``UCH%p zwk^rG2nzb95i6RDcCJ{sW3iy1ZyK^<{Lak1#hRt-G6=*x9kK#=Sh{~f?fT_{Kw|5J z6&QQ0S+sq}+6oGp7uqJQBP}|SQBhYY2ox-vb+K)@MJK%XP1f9sRfqSKoxQCSL~>Rh z(qeU?@U3r9uv)vOP*6g_nvHq1P&6l-m_#qqi2Qc;~3pZdps zIDrSePl;ARvI6s`K+atGzx;gW#7RXel+#~c`MUuR40&$1Nw&WT3FOQ@cLW7Xhl4YZ Ke|(g#u*nk0gtZ<3 literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/demo-app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..fd36de29c944dee45757dc6e80c6dd9091370228 GIT binary patch literal 642 zcmV-|0)72bNk&F`0ssJ4MM6+kP&iC(0ssInYrq;1m*XgsY$?j-al;g%@i1EUIqz-5 zK^sYq9;eC?ePlR9Fd{(nTvgNF<6Tvtg;> zgAOnPVKJh?qKe>PFabaifPz8*K|nx(ppXCn-CzleLF1V6!XiCSzXqN9miYz!JFNAG z?_LL|>$ZBWAHL_8_Wvt}wvI@uMyG{RM8#uZXe8WH1qFcw23^9S;6MNv1PBlSqTFe% zAx6SY{G0rJ`H{!P zeR23Hi;D+BhRi>G9!O+rc8=Hm*)SRQH|%U}@`;b!#_5oPNLo1FyTx zQ+)%b@-3s|^8mOfjvScoBaI^e#5%k^q>R<~5yjbe`;Hh<0+{QfcJ7G_pn-Y-AV-Ra zdE#8#gcCrS2HngPH(y8)rGd#|YGc{wwJ>7^u5MDAs{KSso?pasv)!x$Gee|N08f_h zOj-kg*-~>yH3G2JB<{F9@}K8^4}kZs#^bYt7L*|s}Q=0Az2IC+F40AL|0Yuh#}+up->Y};04 zqxM~QwQbuLfgr^HBL?_K4BR$Sl(x&q@CdktLphuyFTsUN-b)5Ngu^%jtKbCA0i zhp-CM?{SE$cn0rtZY!tCmGj}o)(=uI?|jy?fERd(r#M%fFHWEUE#CTWKgR=JF&UR& z@O3X$a^Nz+IdMNy?w&$0jY*!*Ce31D9yR%bmYuJAO%kc$+RL z;|G*!X}?Iq@SdO#Kp0fh7=WW!zG#yNJn__#uNFClo4UKFs2oK2AiAx`-2`rkUoIV>_|*A@&~{t(aJ0j7_AaS309 z?TM&b;b>AXK9q>mt@&Q3+d!3Om$^;~*e}ziwWjpjz5xNvKV%4?J0ap!M2#BFggG!k zew4`JsPs`EIZ~Ec(Qo^~e76>#m!|?F_|ca_ky1%uymdf+lt2{6k-$-cC?29Xj)~+v zivYkR=&HH|7$T3k7f`t(usmwjYOE@aW5}GWjv9$qmQ>CVcox!O9%4Ag<0La^0GO2E zhb9`Jr&2(ff<}e-p$_#ZQ$)~f|4^OSR*_oM=DXEvpmGJ(G_X)Z5409VUb)kBo}|#A zUWnJpoT zBP`m~x<|c^ciqlcIn1CO-g#jn3cc9gOEp{}bG`qy>yMpaH2^W1cq~H3hS)o)aJi0c; z%UP${B&vtTWSDN%3Ex@(tDZj<>{e+w&T*clGP!98{sE<|#Es1x{xH?=7~{^fsIpgl zzN&DplLA$VEz}{MCfb+)jo|8M^=QTL&@cH8FlhO=;_+L`?Y~%a;2d>gem_|DRW9b} z5G0^BjMAp$J$9*$?VF4!M@Kri2@+ro6u?KB{S?v8!4=a%b^lTms1tRw5}O z0xWqPwUhMx$47k-#qcpKV>5Nppqh2P=EfPeFT7ZGd+?Fjr{fK`Hr`{Jly`h(VV?cD yFeD?TynZ%=Lmr>JzP=;BoP9mz;ajF39%7`9MeV%x4#P9z3y0siwbPsGz7qffx@)ii literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/demo-app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..b02a32f57e442bd59a80e20e090979a936efe7d3 GIT binary patch literal 1772 zcmV%24 z$21OpWC`gvf z&zG<41{(KNSAcf|kxxBY#oWrEEo`6@S!UD`aBN#Uo~_unZJT9QCSZ&vD`ooBsglvy zs%-P;GXZjCZCfPeP8D}|Cvq}(pI+8?ad&rjcXybXChG247``h&W=ZV=xB`mVm~ws5 ziE+&+BD;bQm%lngA}1SCi#=mP+&$N+f*{+LAt|#kwr$%s3)%bM#7~t|RS*OKEE}~w z+qP}nOujR3XWO=I+qP}nzO4TfKwDTN5>W(xT^D!mkP`3Q5r$|Y#Gn|JsE~YU=RP8f zpgV+g%wr9Ac*V=0)VBstynJ+;?g+6E8gYnV0tPBHOv9ySvIw|CiT5{KCLD(Ec=_)7IS)-beRU6GUej7}1nzVh6m9tAt-+MgQ$jC6+!5FKWASIOK*p=X#6kS!La%(>@zukrz^#-@}xk4!(HwtO)8zkL?g`YdcN zA4G(T>W2w5W3mWLfWVaDLQ#ZjBx&?B)#C~loBJ<`t1>~Jrks_kCComCwzj@r%M zKTR@5H6HRk0kV2*a(OMHP|<$G(BzpPLhn-y_Qy-8tj`=7k;M*GDfz5 zC_sZ>KbTF<(3Y=-mLA{);IjG00UGRRan!zqn0`($vvlwTn2Nh}vf`MG*gcn*10t3N zON8RqNja5KIC=mSA~|>KV#RNyy^m^ZP&|vHc zze>jk{KF-(ODhw?A!BU#*yX^PJsm_~0^&4Oy51CoD_3S|LIkFyM3~eOhEmrX{1sjR zya9LuP)p05ds$%+A|vcrVh@fpm_5+PN5iyJ+BPl*}f4VC;=p_-Vxk7>CubmBB1 z3ShsOS?j*A(M4UQw?spa%r9j8PsjfTT0R!_@c^ivJ2L|spVxEQgw}O!+T{OX+`#iD zb_^RoBg5R`|6)^bp&3wV0Tn*txynn*#PAcqfZ09f&Kr|d{BNM-BZPKvr3sY#jN$5! zS;pWSz|e_P=8juqM93X>H9}ZetS|uT+?Mc+LDL6&u>Ci4|G8Zvj>Tc#!qVq+&}U)Y zH>GmOPk7tCfgUT14KAx*bGgshB}BB;(%t|pidc+2za&CtrC-cE2_hzR9EA#FPXHDi ztfiGAf$!~ihOaP7gj)SEW60z&sKD5ct8iiTP$LHQt)-OA2nPVy#PEH{1}f9vJ_!y*WffcN0pDL?}TFiL;!(&2X>uaekdzyQgK<<55#xCkZxd*#utC&MIs O*bL|=(*HFN)0U?8#0|t9009uhFYW*UgDDq3 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 MS*oPd@w|wxMj$C-wg3PC literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..e849b1cad03849532d647614809880aaace48be0 GIT binary patch literal 2526 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 literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..6f53c8e188b9549de31e7580352237694ce444cd GIT binary patch literal 1600 zcmV-G2EX}INk&FE1^@t8MM6+kP&iC01^@srL%~oGrw2K*ZPiNe`~OF0L`3L>!pPnA zzKsRpxRE49ikjUcukL;RyTZ@~Ig%trlIQZi=vaRp?tcQDIy_Sev5_Q2(pA^&%=R;* z18?B_@W#Cn%*=~5omfz`SscMjf+y!FZ^w(8u~i9%1GGAg7Kt@sap9FPwuIA>veA}^ z)Jmf|)iH`x9K$Gtlerklp{gE14@yLnXo*n300$aI@m(NU_Xq9YH)qF>httFBM+HUO zwoTj7if!ArZQHi*if!9=nXy%_IJ?Z)w(|w=ZJl#&YkL+?ME@nYjpRs@Qo`0D&(wL> zvkxE$C-k4te?tEW{U`LF(0@Yz`Ogkx>Z_$9Sd7??6h48V9f1SVwXnb z(u!LKQOhW1!RNw}%vRzRd?skcjGslB0kjPxXm>`?7L1_z7(wIJgV5Ct{>RVy5dn)q^!RijKGs-IqLt$#+7$$1pYB=ld@Z`SDVl&>&*npc zc$bU=nU?^0wk!xQ6M!ClKt%8@&l3@R$8B*46$1#ncedO9g&U+?Hut%+5*bf<1y~)Rq@F%h~&);(<+SW z5#jzFYZqRs3y`ga4|V@0p0@*QWh93V)0Pw$xKpT-I7ARYW!*ngA<~Y_*0>!^5T}9y34L_ zqL>4Pt@p93nap*%QeA+F1$W0{PG3lCTRfR9e%ZJ7)TD-2YTX@gGUmP~Gi zcm^iQbb{bhc;lH&7KH@{$|x_12Inlq9hoT#(+xC{X^c+dBbm7h6Z9k+BvaA-ThDx= z+^~c4@4YFt)MS~g;GBi{O`(MP?jV+GD9AGX<~yBhek8tEm^Fyy>6lz*RjG(V4Y$Aj zQTQ_ND3=_sd0z%~b0z@pRVd2t0*3^p#2PTJueUV@e+-z`io}jW~9~va{p{P;B!Pv zD)rMcB0Uk|RxERm{4L#8vr9((Z)+qX&+eH2A6gLrcID(4m3^S=VT%PjTHDB(J2sG ylMu8iA!tE8njoCee?tEW{U`LF(0@Yz3H|3kMGyc_3m6{& literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..e9bb5ef0f087faf1b7a6182299b9f7ce7b13d497 GIT binary patch literal 5846 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 literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..f34a218c6647103a1e7dc2d5303c76d55930794a GIT binary patch literal 3368 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 y($^Fljb`yWEU4x9ARI z370wzw?=k%%kE7RZ7SY|J_)bWF4Abgj$~VErFYK-ujJ#1wVyfg_25R5?OJ(B zpzhB3|AUK3f~0|~;mkpc^nkzs0KsI>wr$(CZQHhO+qP}nwr$%^65B?SB*_v`&z!xF ztlfDFyH@#6Pvt+A|5W}{`A_9PmH$-!Q~A#Xrpb0lvUSdG`k!n zXZQen>{91IFj0vD*`Eju8-70FCZ$OtgH-F5wgQ7}4a_I&K5n5?nW5yjlK&wDC083t zE-pFLxQ9#RXlQpzek7$#%_MlNveEhp+a^}oqfLHD>U@#V`6HQgw@--@Ilm-vtg?qv zkA&c#gk5mYrN!}#s zDGlC9-9*Wy;Ge`zlw1iOO4}rnwZTV8n=1M~B?Ok(k7ZFxH9@I;C zZwF#CEZS{Mmd$djrxsVEkm8GL#M_oce;#% zsk4-L2Ge&E9W7tA5lxkJvkAsX-eYPQi?%aP*C@9gA{z>+ED#LX zi?~m;AB5#kxsZ~d>G_EOBLnQ!V{|dQgT#Y^(&VGRd$>5d4P4#X+<;k7NX9T?7)Xq+ z(0osH2U^NyMRDY+*IKs90foMqvmXRkjN1;7Dz zAZ>EVUr2h25b7TbLz&!$($Aze0NTmaU2Cax-j8x(IA<@H*^eOcV zbsBL5ok~Xl=#xVB23SDQPB8TgNj;NUeG*}sQkUX&N9aQRLJtHW7sxL@ZT>`gG6V=K z)NiV<@_hYC9)J_EU~hnTp%4Ul{uIiirT!Y|Iagqy;+BMYxsvg>-pk zMbNGS1fZ&%KEX>MG1M=l)mjL~m}1wkz>BF6voDc|ph1!Pg;Yi$WLbE}VK)x4c?46y za;szav$D$tJoO7o_G2do7(#Cx;AVG_G)zW>o#|Pl^$APK(@-)>z74W9B!ZzdBQ}6V zc!eGzBb)%+5u<+JiHeZ_Uq?@Sq!7La*uw810F=}xLaVhQn?TmTkN~Ld5Hb3%OHPK= z1LB?atA4I%EkwN%SfbYOu7& z6#WJ00*?GRGeNoSjT)fj5PIzF6^65&`1T*6=#-o+pEo<>$KKM#KmHYxa^#t{O+!W(z)OeN0pR(^Q;cJ=mWT*>EiK1oa|51v%^b$6VkOv&ZJ#({n~wnw!OP= zKFx!SOCf*5Z?B%Mc)`>ToQ~f%R%Tt6~ zUMk#jL1C7C?+`BSkICEe&Dp}IZTH|k-2iNU6n3rhpUQtK|Ec_^@}J6oD*vhcr}Cf5 Oe=7f}{HOAt2_7Ksq5X*f literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..3257f3a29dc14b794a88a7ed10483f48a508de23 GIT binary patch literal 8098 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 literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/navigation/mobile_navigation.xml b/demo-app/src/main/res/navigation/mobile_navigation.xml new file mode 100644 index 000000000..edf04115c --- /dev/null +++ b/demo-app/src/main/res/navigation/mobile_navigation.xml @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/values/colors.xml b/demo-app/src/main/res/values/colors.xml new file mode 100644 index 000000000..f8c6127d3 --- /dev/null +++ b/demo-app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/demo-app/src/main/res/values/dimens.xml b/demo-app/src/main/res/values/dimens.xml new file mode 100644 index 000000000..e00c2dd14 --- /dev/null +++ b/demo-app/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 16dp + 16dp + \ No newline at end of file diff --git a/demo-app/src/main/res/values/ic_launcher_background.xml b/demo-app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 000000000..c5d5899fd --- /dev/null +++ b/demo-app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/demo-app/src/main/res/values/strings.xml b/demo-app/src/main/res/values/strings.xml new file mode 100644 index 000000000..de0f7312c --- /dev/null +++ b/demo-app/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + OpenTelemetryDemoApp + AstronomyShopActivity + Home + Dashboard + Notifications + \ No newline at end of file diff --git a/demo-app/src/main/res/values/themes.xml b/demo-app/src/main/res/values/themes.xml new file mode 100644 index 000000000..f68cbe809 --- /dev/null +++ b/demo-app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +