diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/Navigation.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/Navigation.kt index 92849053f..8cd4d6944 100644 --- a/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/Navigation.kt +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/Navigation.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import androidx.compose.material3.* +import io.opentelemetry.android.demo.OtelDemoApplication sealed class BottomNavItem(val route: String, val icon: ImageVector, val label: String) { @@ -29,9 +30,9 @@ object MainDestinations { @Composable fun rememberAstronomyShopNavController(navController: NavHostController = rememberNavController()) -: AstronomyShopNavController = remember(navController) + : InstrumentedAstronomyShopNavController = remember(navController) { - AstronomyShopNavController(navController) + InstrumentedAstronomyShopNavController(AstronomyShopNavController(navController)) } @Stable @@ -52,7 +53,44 @@ class AstronomyShopNavController( fun navigateToCheckoutInfo(){ navController.navigate(MainDestinations.CHECKOUT_INFO_ROUTE) } +} + +class InstrumentedAstronomyShopNavController( + private val delegate : AstronomyShopNavController +){ + val navController: NavHostController + get() = delegate.navController + + val currentRoute: String? + get() = delegate.currentRoute + + fun upPress() { + delegate.upPress() + } + fun navigateToProductDetail(productId: String) { + delegate.navigateToProductDetail(productId) + generateNavigationEvent( + eventName = "navigate.to.product.details", + payload = mapOf("product.id" to productId) + ) + } + + fun navigateToCheckoutInfo() { + delegate.navigateToCheckoutInfo() + generateNavigationEvent( + eventName = "navigate.to.checkout.info", + payload = emptyMap() + ) + } + + private fun generateNavigationEvent(eventName: String, payload: Map) { + val eventBuilder = OtelDemoApplication.eventBuilder("otel.demo.app.navigation", eventName) + payload.forEach { (key, value) -> + eventBuilder.put(key, value) + } + eventBuilder.emit() + } } @Composable diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/Cart.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/Cart.kt index 88f01e181..562dc7403 100644 --- a/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/Cart.kt +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/Cart.kt @@ -12,6 +12,7 @@ import io.opentelemetry.android.demo.shop.ui.products.ProductCard import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import io.opentelemetry.android.demo.OtelDemoApplication import io.opentelemetry.android.demo.shop.clients.ProductCatalogClient import io.opentelemetry.android.demo.shop.clients.RecommendationService import io.opentelemetry.android.demo.shop.ui.products.RecommendedSection @@ -41,7 +42,7 @@ fun CartScreen( contentAlignment = Alignment.TopEnd ) { OutlinedButton( - onClick = { cartViewModel.clearCart() }, + onClick = { clearCart(cartViewModel) }, modifier = Modifier ) { Text("Empty Cart", color = Color.Red) @@ -90,3 +91,14 @@ fun CartScreen( } } } + +private fun clearCart(cartViewModel: CartViewModel) { + generateEmptiedCartEvent(cartViewModel) + cartViewModel.clearCart() +} + +private fun generateEmptiedCartEvent(cartViewModel: CartViewModel) { + val eventBuilder = OtelDemoApplication.eventBuilder("otel.demo.app", "cart.emptied") + eventBuilder.put("cart.total.value", cartViewModel.getTotalPrice()) + .emit() +}