Jetpack Compose 101
How to create a new screen in the existing app and iterate quickly
To create a new screen in the app and iterate quickly, follow these steps:
- 
Extract the Compose UI screen:
Create a dedicated Kotlin file for your Compose UI screen. Use the@Previewannotation to enable preview capabilities within the IDE. This also makes the screen compatible with screenshot testing. - 
Leverage hot reload:
After the first build of the app, navigate to your screen. Jetpack Compose provides hot reload capabilities out of the box, allowing you to see changes in real-time. However, note that there are some limitations, such as not being able to reload changes to certain structural elements. - 
Use previews effectively:
Use multiple@Previewannotations to test your screen in different configurations (e.g., light/dark mode, different screen sizes). This helps ensure your UI adapts well to various scenarios. 
Theme/Design system
We use a custom Compose theme, io.homeassistant.companion.android.util.compose.HomeAssistantAppTheme, which is based on Material Design 2. You must use this theme to ensure consistency with the application's overall UI.
Key points
- Material Design 2: The theme adheres to Material Design 2 principles, ensuring a cohesive look and feel.
 - Custom components: If you need to create custom components, ensure they align with the existing theme and design system.
 - Dark mode support: The theme supports both light and dark modes. Test your screen in both modes to ensure proper styling.
 
Best practices for working with Jetpack Compose
- Keep UI code modular: Break down your UI into small, reusable composables. This improves readability and makes testing easier.
 - Use state hoisting: Follow the state hoisting pattern to manage state effectively. This ensures that your composables remain stateless and reusable.
 - Test with previews: Use 
@Previewannotations to test your composables in isolation. Add parameters to simulate different states and configurations. - Follow accessibility guidelines: Ensure your UI is accessible by providing meaningful content descriptions and testing with accessibility tools.
 - Use style: Apply appropriate styling to text components.
 
Example: creating a new screen
Here’s an example of how to create a new Compose screen with a preview:
// filepath: /path/to/your/screen/MyNewScreen.kt
@Composable
fun MyNewScreen(
    title: String,
    onButtonClick: () -> Unit
) {
    HomeAssistantAppTheme {
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(16.dp),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = title, style = MaterialTheme.typography.h4)
            Spacer(modifier = Modifier.height(16.dp))
            Button(onClick = onButtonClick) {
                Text(text = "Click Me")
            }
        }
    }
}
@Preview(showBackground = true)
@Composable
fun MyNewScreenPreview() {
    MyNewScreen(
        title = "Welcome to Home Assistant",
        onButtonClick = {}
    )
}