diff --git a/demo-app/src/main/AndroidManifest.xml b/demo-app/src/main/AndroidManifest.xml
index 1046456dd..a90f304be 100644
--- a/demo-app/src/main/AndroidManifest.xml
+++ b/demo-app/src/main/AndroidManifest.xml
@@ -18,9 +18,14 @@
android:usesCleartextTraffic="true"
tools:targetApi="31">
+
Unit,
) {
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt
index 6e5c2a36e..0826204ac 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt
@@ -28,8 +28,9 @@ import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import io.opentelemetry.android.demo.about.AboutActivity
import io.opentelemetry.android.demo.theme.DemoAppTheme
-import io.opentelemetry.android.demo.ui.shop.AstronomyShopActivity
+import io.opentelemetry.android.demo.shop.ui.AstronomyShopActivity
class MainActivity : ComponentActivity() {
private val viewModel by viewModels()
@@ -73,9 +74,13 @@ class MainActivity : ComponentActivity() {
painterResource(id = R.drawable.otel_icon),
)
val context = LocalContext.current
- OpenStoreButton(text = "Click to begin", onClick = {
+ LauncherButton(text = "Go shopping", onClick = {
context.startActivity(Intent(this@MainActivity, AstronomyShopActivity::class.java))
})
+ LauncherButton(text = "Learn more", onClick = {
+ context.startActivity(Intent(this@MainActivity, AboutActivity::class.java))
+ })
+
}
}
Log.d(TAG, "Main Activity started ")
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/about/AboutActivity.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/about/AboutActivity.kt
new file mode 100644
index 000000000..f01c42ee7
--- /dev/null
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/about/AboutActivity.kt
@@ -0,0 +1,50 @@
+package io.opentelemetry.android.demo.about
+
+import android.content.Intent
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import io.opentelemetry.android.demo.MainActivity
+import io.opentelemetry.android.demo.R
+
+class AboutActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_about)
+
+ val bottomNavigationView: BottomNavigationView = findViewById(R.id.bottom_navigation)
+
+ if (savedInstanceState == null) {
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, AppFeaturesFragment())
+ .commit()
+ bottomNavigationView.selectedItemId = R.id.navigation_app_features
+ }
+
+ bottomNavigationView.setOnItemSelectedListener { item ->
+ when (item.itemId) {
+ R.id.navigation_exit -> {
+ val intent = Intent(this, MainActivity::class.java)
+ intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
+ startActivity(intent)
+ finish()
+ true
+ }
+ R.id.navigation_app_features -> {
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, AppFeaturesFragment())
+ .commit()
+ true
+ }
+ R.id.navigation_about_opentelemetry -> {
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, AboutOpenTelemetryFragment())
+ .commit()
+ true
+ }
+ else -> false
+ }
+ }
+ }
+}
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/about/AboutOpenTelemetryFragment.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/about/AboutOpenTelemetryFragment.kt
new file mode 100644
index 000000000..bb8bd9877
--- /dev/null
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/about/AboutOpenTelemetryFragment.kt
@@ -0,0 +1,18 @@
+package io.opentelemetry.android.demo.about
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import io.opentelemetry.android.demo.R
+
+class AboutOpenTelemetryFragment : Fragment() {
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ return inflater.inflate(R.layout.fragment_about_opentelemetry, container, false)
+ }
+}
\ No newline at end of file
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/about/AppFeaturesFragment.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/about/AppFeaturesFragment.kt
new file mode 100644
index 000000000..66fa31a72
--- /dev/null
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/about/AppFeaturesFragment.kt
@@ -0,0 +1,29 @@
+package io.opentelemetry.android.demo.about
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import io.opentelemetry.android.demo.R
+
+class AppFeaturesFragment : Fragment() {
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ val view = inflater.inflate(R.layout.fragment_app_features, container, false)
+ lateinit var featureAdapter: FeatureAdapter
+ val features = getFeatureList()
+ val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView)
+
+ featureAdapter = FeatureAdapter(features)
+ recyclerView.adapter = featureAdapter
+ recyclerView.layoutManager = LinearLayoutManager(requireContext())
+
+ return view
+ }
+}
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/about/Feature.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/about/Feature.kt
new file mode 100644
index 000000000..77205f6df
--- /dev/null
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/about/Feature.kt
@@ -0,0 +1,45 @@
+package io.opentelemetry.android.demo.about
+
+data class Feature(
+ val title: String,
+ val description: String,
+ var isExpanded: Boolean = false
+)
+
+fun getFeatureList(): List {
+ return listOf(
+ Feature(
+ "Android Activity Lifecycle Monitoring",
+ """
+ - Automatically captures spans for key lifecycle events:
+ - Created: Includes `onCreate`, `onStart`, `onResume`,
+ - Paused: Includes `onPause`,
+ - Stopped: Includes `onStop`,
+ - Destroyed: Includes `onDestroy`.
+ - This covers the entire Activity lifecycle, providing detailed insights into each phase.
+ """.trimIndent()
+ ),
+ Feature(
+ "ANR Detection",
+ """
+ - Automatically detects and reports ANRs in the app.
+ - ANR events are captured as spans with detailed stack traces, providing insights into the exact operations that caused the ANR.
+ - The span includes key attributes such as `screen.name`, `session.id`, and network information to assist in diagnosing the issue.
+ """.trimIndent()
+ ),
+ Feature(
+ "Slow Render Detection",
+ """
+ - Automatically detects instances of slow rendering within the app.
+ - Slow render events are captured as spans, providing information on when and where rendering delays occurred.
+ - The span includes attributes such as `activity.name`, `screen.name`, `count`, and network details to help diagnose performance issues.
+ """.trimIndent()
+ ),
+ Feature(
+ "Manual Instrumentation",
+ """
+ - Provides access to the OpenTelemetry APIs for manual instrumentation, allowing developers to create custom spans and events as needed.
+ """.trimIndent()
+ )
+ )
+}
\ No newline at end of file
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/about/FeatureAdapter.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/about/FeatureAdapter.kt
new file mode 100644
index 000000000..3f9ba7c2f
--- /dev/null
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/about/FeatureAdapter.kt
@@ -0,0 +1,43 @@
+package io.opentelemetry.android.demo.about
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import io.opentelemetry.android.demo.R
+
+class FeatureAdapter(private val features: List) : RecyclerView.Adapter() {
+
+ inner class FeatureViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ private val titleTextView: TextView = itemView.findViewById(R.id.titleTextView)
+ private val descriptionTextView: TextView = itemView.findViewById(R.id.descriptionTextView)
+ private val arrowImageView: ImageView = itemView.findViewById(R.id.arrowImageView)
+
+ fun bind(feature: Feature) {
+ titleTextView.text = feature.title
+ descriptionTextView.text = feature.description
+ descriptionTextView.visibility = if (feature.isExpanded) View.VISIBLE else View.GONE
+ arrowImageView.rotation = if (feature.isExpanded) 180f else 0f
+
+ itemView.setOnClickListener {
+ feature.isExpanded = !feature.isExpanded
+ notifyItemChanged(adapterPosition)
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FeatureViewHolder {
+ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_feature, parent, false)
+ return FeatureViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: FeatureViewHolder, position: Int) {
+ holder.bind(features[position])
+ }
+
+ override fun getItemCount(): Int = features.size
+
+}
+
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/clients/ImageLoader.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/ImageLoader.kt
similarity index 90%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/clients/ImageLoader.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/ImageLoader.kt
index 3d6ba8e56..4fdc66531 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/clients/ImageLoader.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/ImageLoader.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.clients
+package io.opentelemetry.android.demo.shop.clients
import android.content.Context
import android.graphics.Bitmap
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/clients/ProductCatalogClient.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/ProductCatalogClient.kt
similarity index 77%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/clients/ProductCatalogClient.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/ProductCatalogClient.kt
index 9e0de017c..aab17bc0b 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/clients/ProductCatalogClient.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/ProductCatalogClient.kt
@@ -1,10 +1,10 @@
-package io.opentelemetry.android.demo.clients
+package io.opentelemetry.android.demo.shop.clients
import android.content.Context
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
-import io.opentelemetry.android.demo.model.Product
-import io.opentelemetry.android.demo.model.ProductDeserializationWrapper
+import io.opentelemetry.android.demo.shop.model.Product
+import io.opentelemetry.android.demo.shop.model.ProductDeserializationWrapper
const val PRODUCTS_FILE = "products.json"
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/clients/RecommendationService.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/RecommendationService.kt
similarity index 82%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/clients/RecommendationService.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/RecommendationService.kt
index 647f5c2da..1b4e487e6 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/clients/RecommendationService.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/clients/RecommendationService.kt
@@ -1,7 +1,7 @@
-package io.opentelemetry.android.demo.clients
+package io.opentelemetry.android.demo.shop.clients
-import io.opentelemetry.android.demo.model.Product
-import io.opentelemetry.android.demo.ui.shop.cart.CartViewModel
+import io.opentelemetry.android.demo.shop.model.Product
+import io.opentelemetry.android.demo.shop.ui.cart.CartViewModel
class RecommendationService(
private val productCatalogClient: ProductCatalogClient,
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/model/Product.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/model/Product.kt
similarity index 91%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/model/Product.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/model/Product.kt
index c10ac82cd..ad0790809 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/model/Product.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/model/Product.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.model
+package io.opentelemetry.android.demo.shop.model
data class Product(
val id: String,
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/AstronomyShopActivity.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/AstronomyShopActivity.kt
similarity index 90%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/AstronomyShopActivity.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/AstronomyShopActivity.kt
index dd02b637a..a77a6ec88 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/AstronomyShopActivity.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/AstronomyShopActivity.kt
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.android.demo.ui.shop
+package io.opentelemetry.android.demo.shop.ui
import android.app.Activity
import android.content.Intent
@@ -24,19 +24,18 @@ import androidx.compose.ui.platform.LocalContext
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import io.opentelemetry.android.demo.MainActivity
-import io.opentelemetry.android.demo.clients.ProductCatalogClient
+import io.opentelemetry.android.demo.shop.clients.ProductCatalogClient
import io.opentelemetry.android.demo.theme.DemoAppTheme
-import io.opentelemetry.android.demo.ui.shop.cart.CartScreen
-import io.opentelemetry.android.demo.ui.shop.products.ProductDetails
-import io.opentelemetry.android.demo.ui.shop.products.ProductList
-import io.opentelemetry.android.demo.ui.shop.cart.CartViewModel
+import io.opentelemetry.android.demo.shop.ui.cart.CartScreen
+import io.opentelemetry.android.demo.shop.ui.products.ProductDetails
+import io.opentelemetry.android.demo.shop.ui.products.ProductList
+import io.opentelemetry.android.demo.shop.ui.cart.CartViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
-import io.opentelemetry.android.demo.ui.shop.cart.InfoScreen
+import io.opentelemetry.android.demo.shop.ui.cart.InfoScreen
class AstronomyShopActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- title = "Astronomy Shop"
setContent {
AstronomyShopScreen()
}
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/Navigation.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/Navigation.kt
similarity index 98%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/Navigation.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/Navigation.kt
index c462cdd86..92849053f 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/Navigation.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/Navigation.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop
+package io.opentelemetry.android.demo.shop.ui
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ExitToApp
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/Cart.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/Cart.kt
similarity index 90%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/Cart.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/Cart.kt
index f5e18bacb..88f01e181 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/Cart.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/Cart.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop.cart
+package io.opentelemetry.android.demo.shop.ui.cart
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
@@ -8,13 +8,13 @@ import androidx.compose.ui.Modifier
import java.util.Locale
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
-import io.opentelemetry.android.demo.ui.shop.products.ProductCard
+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.clients.ProductCatalogClient
-import io.opentelemetry.android.demo.clients.RecommendationService
-import io.opentelemetry.android.demo.ui.shop.products.RecommendedSection
+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
@Composable
fun CartScreen(
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/CartViewModel.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/CartViewModel.kt
similarity index 90%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/CartViewModel.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/CartViewModel.kt
index 2626aa86c..01a15724e 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/CartViewModel.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/CartViewModel.kt
@@ -1,7 +1,7 @@
-package io.opentelemetry.android.demo.ui.shop.cart
+package io.opentelemetry.android.demo.shop.ui.cart
import androidx.lifecycle.ViewModel
-import io.opentelemetry.android.demo.model.Product
+import io.opentelemetry.android.demo.shop.model.Product
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/CheckoutInfo.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/CheckoutInfo.kt
similarity index 97%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/CheckoutInfo.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/CheckoutInfo.kt
index c725ff34d..2839abced 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/cart/CheckoutInfo.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/cart/CheckoutInfo.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop.cart
+package io.opentelemetry.android.demo.shop.ui.cart
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@@ -15,7 +15,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
-import io.opentelemetry.android.demo.ui.shop.components.UpPressButton
+import io.opentelemetry.android.demo.shop.ui.components.UpPressButton
import androidx.compose.ui.Alignment
import androidx.compose.ui.text.style.TextAlign
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/components/QuantityChooser.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/components/QuantityChooser.kt
similarity index 98%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/components/QuantityChooser.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/components/QuantityChooser.kt
index cd9b6baed..adf079f66 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/components/QuantityChooser.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/components/QuantityChooser.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop.components
+package io.opentelemetry.android.demo.shop.ui.components
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/components/UpPressButton.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/components/UpPressButton.kt
similarity index 94%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/components/UpPressButton.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/components/UpPressButton.kt
index 37b0af39e..a7cda6f3d 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/components/UpPressButton.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/components/UpPressButton.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop.components
+package io.opentelemetry.android.demo.shop.ui.components
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductCard.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductCard.kt
similarity index 94%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductCard.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductCard.kt
index 03ed27620..2319b8299 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductCard.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductCard.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop.products
+package io.opentelemetry.android.demo.shop.ui.products
import android.graphics.Bitmap
import androidx.compose.foundation.Image
@@ -22,9 +22,9 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
-import io.opentelemetry.android.demo.clients.ImageLoader
+import io.opentelemetry.android.demo.shop.clients.ImageLoader
import io.opentelemetry.android.demo.gothamFont
-import io.opentelemetry.android.demo.model.Product
+import io.opentelemetry.android.demo.shop.model.Product
@Composable
fun ProductCard(
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductDetails.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductDetails.kt
similarity index 87%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductDetails.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductDetails.kt
index 65a5f75b2..c771581ec 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductDetails.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductDetails.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop.products
+package io.opentelemetry.android.demo.shop.ui.products
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
@@ -13,16 +13,16 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
-import io.opentelemetry.android.demo.clients.ImageLoader
+import io.opentelemetry.android.demo.shop.clients.ImageLoader
import io.opentelemetry.android.demo.gothamFont
-import io.opentelemetry.android.demo.model.Product
-import io.opentelemetry.android.demo.ui.shop.components.QuantityChooser
+import io.opentelemetry.android.demo.shop.model.Product
+import io.opentelemetry.android.demo.shop.ui.components.QuantityChooser
import androidx.lifecycle.viewmodel.compose.viewModel
-import io.opentelemetry.android.demo.ui.shop.cart.CartViewModel
-import io.opentelemetry.android.demo.ui.shop.components.UpPressButton
+import io.opentelemetry.android.demo.shop.ui.cart.CartViewModel
+import io.opentelemetry.android.demo.shop.ui.components.UpPressButton
import androidx.compose.ui.Alignment
-import io.opentelemetry.android.demo.clients.ProductCatalogClient
-import io.opentelemetry.android.demo.clients.RecommendationService
+import io.opentelemetry.android.demo.shop.clients.ProductCatalogClient
+import io.opentelemetry.android.demo.shop.clients.RecommendationService
@Composable
fun ProductDetails(
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductList.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductList.kt
similarity index 87%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductList.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductList.kt
index 0fbec4f58..96b77d9cd 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/ProductList.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/ProductList.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop.products
+package io.opentelemetry.android.demo.shop.ui.products
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
@@ -8,7 +8,7 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
-import io.opentelemetry.android.demo.model.Product
+import io.opentelemetry.android.demo.shop.model.Product
@Composable
fun ProductList(products: List, onProductClick: (String) -> Unit) {
diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/RecommendedSection.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/RecommendedSection.kt
similarity index 94%
rename from demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/RecommendedSection.kt
rename to demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/RecommendedSection.kt
index 5d26b93a0..ea1193529 100644
--- a/demo-app/src/main/java/io/opentelemetry/android/demo/ui/shop/products/RecommendedSection.kt
+++ b/demo-app/src/main/java/io/opentelemetry/android/demo/shop/ui/products/RecommendedSection.kt
@@ -1,4 +1,4 @@
-package io.opentelemetry.android.demo.ui.shop.products
+package io.opentelemetry.android.demo.shop.ui.products
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
@@ -15,7 +15,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.opentelemetry.android.demo.gothamFont
-import io.opentelemetry.android.demo.model.Product
+import io.opentelemetry.android.demo.shop.model.Product
@Composable
fun RecommendedSection(
diff --git a/demo-app/src/main/res/drawable/ic_arrow_drop_down.xml b/demo-app/src/main/res/drawable/ic_arrow_drop_down.xml
new file mode 100644
index 000000000..a77e33181
--- /dev/null
+++ b/demo-app/src/main/res/drawable/ic_arrow_drop_down.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/demo-app/src/main/res/layout/activity_about.xml b/demo-app/src/main/res/layout/activity_about.xml
new file mode 100644
index 000000000..1626228d2
--- /dev/null
+++ b/demo-app/src/main/res/layout/activity_about.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/demo-app/src/main/res/layout/activity_astronomy_shop.xml b/demo-app/src/main/res/layout/activity_astronomy_shop.xml
deleted file mode 100644
index cd1f2df91..000000000
--- a/demo-app/src/main/res/layout/activity_astronomy_shop.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
\ No newline at end of file
diff --git a/demo-app/src/main/res/layout/fragment_about_opentelemetry.xml b/demo-app/src/main/res/layout/fragment_about_opentelemetry.xml
new file mode 100644
index 000000000..91b22e90d
--- /dev/null
+++ b/demo-app/src/main/res/layout/fragment_about_opentelemetry.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo-app/src/main/res/layout/fragment_app_features.xml b/demo-app/src/main/res/layout/fragment_app_features.xml
new file mode 100644
index 000000000..ee7f07200
--- /dev/null
+++ b/demo-app/src/main/res/layout/fragment_app_features.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
diff --git a/demo-app/src/main/res/layout/item_feature.xml b/demo-app/src/main/res/layout/item_feature.xml
new file mode 100644
index 000000000..613061dd5
--- /dev/null
+++ b/demo-app/src/main/res/layout/item_feature.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo-app/src/main/res/menu/bottom_nav_menu.xml b/demo-app/src/main/res/menu/bottom_nav_menu.xml
index 18964885d..512ea719a 100644
--- a/demo-app/src/main/res/menu/bottom_nav_menu.xml
+++ b/demo-app/src/main/res/menu/bottom_nav_menu.xml
@@ -2,24 +2,16 @@
\ 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
index 9696d1a88..d89600ae0 100644
--- a/demo-app/src/main/res/values/strings.xml
+++ b/demo-app/src/main/res/values/strings.xml
@@ -5,4 +5,8 @@
Dashboard
Cart
Exit
+ Exit
+ App Features
+ About OpenTelemetry
+ Expand or collapse content
\ No newline at end of file