# ronyaburaihan/netspeedindicator architecture

> Architecture diagram of the GitHub repository ronyaburaihan/netspeedindicator, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ronyaburaihan/netspeedindicator
- Repository: https://github.com/ronyaburaihan/netspeedindicator

## Overview

1. **Repository shape**
   - This is a single-module Android app (`app/`) built in Kotlin with Jetpack Compose.
   - The codebase is organized around **Clean Architecture + MVVM**, with a clear split between presentation, domain, data, and core/platform concerns.

2. **Main runtime entry points**
   - `NetSpeedApplication` is the application-level bootstrap point and is where dependency injection is initialized.
   - `MainActivity` hosts the Compose UI.
   - `SpeedMonitorService` is the key background runtime component: it runs as a foreground service to continuously monitor network speed and usage.
   - `BootCompletedReceiver` is the startup hook for restoring monitoring after device reboot.

3. **Presentation layer**
   - The `presentation/` package contains the Compose UI, navigation, shared components, and theme system.
   - Screens are grouped by feature: `home`, `history`, `settings`, and `onboarding`.
   - `ViewModel`s (`HomeViewModel`, `HistoryViewModel`, `SettingsViewModel`) own UI state and call into domain use cases rather than accessing storage or Android APIs directly.
   - `AppNavigation`, `ScreenRoute`, and shared components like `AppTopBar` and `AppBottomNavigation` define the app’s navigation shell.

4. **Domain layer as the architectural boundary**
   - The `domain/` package is the pure business layer.
   - It defines the app’s stable models (`SpeedInfo`, `UsageInfo`), repository contracts, and use cases.
   - Use cases such as `GetCurrentSpeedUseCase`, `GetDailyUsageUseCase`, `GetMonthlyUsageUseCase`, and `SaveUsageUseCase` encapsulate the app’s core rules and data access orchestration.

5. **Data layer composition**
   - The `data/` package implements the domain contracts and bridges Android/platform APIs to the rest of the app.
   - `SpeedRepositoryImpl` and `UsageRepositoryImpl` are the concrete repository implementations.
   - `SpeedDataSource` and `UsageDataSource` represent lower-level sources of network and usage data.
   - `TrafficStateManager` appears to hold the live network/traffic state used by the monitoring flow.

6. **Local persistence**
   - Persistent usage history is stored locally with Room.
   - `AppDatabase`, `UsageDao`, and `UsageEntity` form the database subsystem, while `UsageMapper` converts between database entities and domain models.
   - `PreferenceManager` stores app settings and user preferences, likely including theme, notification, and monitoring-related flags.

7. **Monitoring and notification flow**
   - The core runtime loop is centered on `SpeedMonitorService`: it samples network activity, updates the user-visible speed indicator, and persists usage periodically.
   - `NotificationHelper` is responsible for the foreground notification that keeps the service alive and shows live status.
   - `FormatUtils` handles user-facing formatting of speed/usage values for both the notification and UI.

8. **Permissions and Android system integration**
   - The app depends heavily on Android permissions and system services: network state, Wi‑Fi state, usage stats, notifications, boot completion, and battery-optimization exceptions.
   - `PermissionUtils` and `AutoStartPermissionUtils` centralize permission-related logic and device-specific startup constraints.
   - This is important architecturally because monitoring is not purely internal; it is gated by platform access rules.

9. **Data flow through the layers**
   - UI events originate in Compose screens, flow to `ViewModel`s, then to use cases, then to repository implementations.
   - Repositories read from Android APIs, Room, and preferences, then return domain models back up the stack.
   - The background service is a second entry path into the same data layer: it gathers live network state and writes usage data so the UI can later read it.

10. **Boundaries to keep in mind for a diagram**
   - Presentation should be shown as depending only on domain, not directly on Room, preferences, or Android traffic APIs.
   - Domain is framework-independent and contains no Android-specific code.
   - Data and core are the platform-facing layers, where Android services, receivers, database, permissions, and notifications live.

11. **External dependencies and infrastructure**
   - There is no backend or remote API in this repository; the product is fully on-device.
   - The key external dependencies are Android platform APIs, Jetpack Compose, Room, DataStore/shared preferences, Hilt, coroutines/Flow, and the foreground-service/notification system.

12. **Operational characteristics**
   - The app is designed for continuous background monitoring with minimal battery impact.
   - Startup resilience comes from the foreground service plus boot-completion handling, while the local database preserves historical usage for the history screens.
   - The test folders indicate both unit and instrumented test coverage, aligned with the clean separation between layers.

Main entry points: [`app/src/main/java/com/englesoft/netspeedindicator/core/service/SpeedMonitorService.kt`](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/service/SpeedMonitorService.kt) (Speed Monitor), [`app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/home/HomeScreen.kt`](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/home/HomeScreen.kt) (Compose Screens), [`app/src/main/java/com/englesoft/netspeedindicator/domain/usecase/GetCurrentSpeedUseCase.kt`](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/domain/usecase/GetCurrentSpeedUseCase.kt) (Use Cases), [`app/src/main/java/com/englesoft/netspeedindicator/NetSpeedApplication.kt`](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/NetSpeedApplication.kt) (App)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_g_entry["Entry & Core"]
  node_n_app(("App"))
  node_n_service["Speed Monitor<br/>foreground service"]
  node_n_boot["Boot Receiver<br/>broadcast receiver"]
  node_n_perm["Permissions<br/>platform utils<br/>[PermissionUtils.kt]"]
  node_n_notify["Notifications<br/>service util"]
end

subgraph group_g_presentation["Presentation"]
  node_n_activity["Main Activity<br/>compose host<br/>[MainActivity.kt]"]
  node_n_nav["Navigation<br/>compose nav<br/>[AppNavigation.kt]"]
  node_n_shell["App Shell<br/>ui shell<br/>[AppTopBar.kt]"]
  node_n_home_vm(("Home VM<br/>view model<br/>[HomeViewModel.kt]"))
  node_n_history_vm(("History VM<br/>view model"))
  node_n_settings_vm(("Settings VM<br/>view model"))
  node_n_screens["Compose Screens<br/>ui screens<br/>[HomeScreen.kt]"]
  node_n_theme["Theme<br/>design system<br/>[Theme.kt]"]
end

subgraph group_g_domain["Domain"]
  node_n_models["Domain Models<br/>value objects<br/>[SpeedInfo.kt]"]
  node_n_repo_contracts["Repo Contracts<br/>interfaces<br/>[SpeedRepository.kt]"]
  node_n_usecases{{"Use Cases<br/>business rules"}}
end

subgraph group_g_data["Data"]
  node_n_speed_repo["Speed Repo<br/>repository impl"]
  node_n_usage_repo["Usage Repo<br/>repository impl"]
  node_n_sources[("Data Sources<br/>platform sources<br/>[SpeedDataSource.kt]")]
  node_n_live_state(("Traffic State<br/>state manager"))
  node_n_room[("Local DB<br/>room storage<br/>[AppDatabase.kt]")]
  node_n_prefs["Preferences<br/>settings storage"]
  node_n_mapper["Usage Mapper<br/>[UsageMapper.kt]"]
end

node_n_app -->|"starts UI"| node_n_activity
node_n_app -->|"injects"| node_n_service
node_n_app -->|"registers"| node_n_boot
node_n_activity -->|"hosts"| node_n_nav
node_n_nav -->|"composes"| node_n_shell
node_n_nav -->|"routes to"| node_n_screens
node_n_screens -->|"uses"| node_n_home_vm
node_n_screens -->|"uses"| node_n_history_vm
node_n_screens -->|"uses"| node_n_settings_vm
node_n_home_vm -->|"calls"| node_n_usecases
node_n_history_vm -->|"calls"| node_n_usecases
node_n_settings_vm -->|"reads/writes"| node_n_prefs
node_n_usecases -->|"depends on"| node_n_repo_contracts
node_n_speed_repo -->|"reads from"| node_n_sources
node_n_speed_repo -->|"tracks"| node_n_live_state
node_n_usage_repo -->|"persists to"| node_n_room
node_n_usage_repo -->|"reads settings"| node_n_prefs
node_n_usage_repo -->|"maps"| node_n_mapper
node_n_service -->|"samples"| node_n_sources
node_n_service -->|"shows"| node_n_notify
node_n_service -->|"persists usage"| node_n_usecases
node_n_boot -->|"restarts"| node_n_service
node_n_perm -->|"gates"| node_n_service
node_n_perm -->|"gates"| node_n_screens
node_n_theme -->|"styles"| node_n_screens

click node_n_app "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/NetSpeedApplication.kt"
click node_n_activity "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/app/MainActivity.kt"
click node_n_service "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/service/SpeedMonitorService.kt"
click node_n_boot "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/receiver/BootCompletedReceiver.kt"
click node_n_perm "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/util/PermissionUtils.kt"
click node_n_notify "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/util/NotificationHelper.kt"
click node_n_nav "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/navigation/AppNavigation.kt"
click node_n_shell "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/component/AppTopBar.kt"
click node_n_home_vm "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/home/HomeViewModel.kt"
click node_n_history_vm "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/history/HistoryViewModel.kt"
click node_n_settings_vm "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/settings/SettingsViewModel.kt"
click node_n_screens "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/home/HomeScreen.kt"
click node_n_theme "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/theme/Theme.kt"
click node_n_models "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/domain/model/SpeedInfo.kt"
click node_n_repo_contracts "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/domain/repository/SpeedRepository.kt"
click node_n_usecases "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/domain/usecase/GetCurrentSpeedUseCase.kt"
click node_n_speed_repo "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/repository/SpeedRepositoryImpl.kt"
click node_n_usage_repo "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/repository/UsageRepositoryImpl.kt"
click node_n_sources "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/datasource/SpeedDataSource.kt"
click node_n_live_state "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/manager/TrafficStateManager.kt"
click node_n_room "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/local/AppDatabase.kt"
click node_n_prefs "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/preferences/PreferenceManager.kt"
click node_n_mapper "https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/mapper/UsageMapper.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_n_app,node_n_service,node_n_boot,node_n_perm,node_n_notify toneBlue
class node_n_activity,node_n_nav,node_n_shell,node_n_home_vm,node_n_history_vm,node_n_settings_vm,node_n_screens,node_n_theme toneAmber
class node_n_models,node_n_repo_contracts,node_n_usecases toneMint
class node_n_speed_repo,node_n_usage_repo,node_n_sources,node_n_live_state,node_n_room,node_n_prefs,node_n_mapper toneRose
```

## Components

### Entry & Core

Application bootstrap, background runtime, platform integration, and shared utilities.

- [App](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/NetSpeedApplication.kt): application · Application class that initializes dependency injection. · `app/src/main/java/com/englesoft/netspeedindicator/NetSpeedApplication.kt`
- [Speed Monitor](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/service/SpeedMonitorService.kt): foreground service · Continuously monitors speed and persists usage in the background. · `app/src/main/java/com/englesoft/netspeedindicator/core/service/SpeedMonitorService.kt`
- [Boot Receiver](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/receiver/BootCompletedReceiver.kt): broadcast receiver · Restores monitoring after device reboot. · `app/src/main/java/com/englesoft/netspeedindicator/core/receiver/BootCompletedReceiver.kt`
- [Permissions](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/util/PermissionUtils.kt): platform utils · Permission and auto-start checks for Android system constraints. · `app/src/main/java/com/englesoft/netspeedindicator/core/util/PermissionUtils.kt`
- [Notifications](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/core/util/NotificationHelper.kt): service util · Builds the foreground notification for the monitoring service. · `app/src/main/java/com/englesoft/netspeedindicator/core/util/NotificationHelper.kt`

### Presentation

Compose UI, navigation shell, screens, and view models.

- [Main Activity](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/app/MainActivity.kt): compose host · Hosts the Compose app UI. · `app/src/main/java/com/englesoft/netspeedindicator/presentation/app/MainActivity.kt`
- [Navigation](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/navigation/AppNavigation.kt): compose nav · App navigation graph and route definitions. · `app/src/main/java/com/englesoft/netspeedindicator/presentation/navigation/AppNavigation.kt`
- [App Shell](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/component/AppTopBar.kt): ui shell · Shared top bar, bottom navigation, and modal UI pieces. · `app/src/main/java/com/englesoft/netspeedindicator/presentation/component/AppTopBar.kt`
- [Home VM](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/home/HomeViewModel.kt): view model · Owns home screen state and invokes domain use cases. · `app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/home/HomeViewModel.kt`
- [History VM](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/history/HistoryViewModel.kt): view model · Loads usage history for the history screen. · `app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/history/HistoryViewModel.kt`
- [Settings VM](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/settings/SettingsViewModel.kt): view model · Coordinates settings state and preference-backed options. · `app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/settings/SettingsViewModel.kt`
- [Compose Screens](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/home/HomeScreen.kt): ui screens · Home, history, settings, and onboarding Compose screens. · `app/src/main/java/com/englesoft/netspeedindicator/presentation/screen/main/home/HomeScreen.kt`
- [Theme](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/presentation/theme/Theme.kt): design system · Colors, typography, dimensions, and composition locals. · `app/src/main/java/com/englesoft/netspeedindicator/presentation/theme/Theme.kt`

### Domain

Pure business rules, models, repository contracts, and use cases.

- [Domain Models](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/domain/model/SpeedInfo.kt): value objects · Stable business models for speed and usage. · `app/src/main/java/com/englesoft/netspeedindicator/domain/model/SpeedInfo.kt`
- [Repo Contracts](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/domain/repository/SpeedRepository.kt): interfaces · Abstract repositories for speed and usage data. · `app/src/main/java/com/englesoft/netspeedindicator/domain/repository/SpeedRepository.kt`
- [Use Cases](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/domain/usecase/GetCurrentSpeedUseCase.kt): business rules · Core orchestration for speed sampling and usage aggregation. · `app/src/main/java/com/englesoft/netspeedindicator/domain/usecase/GetCurrentSpeedUseCase.kt`

### Data

Repository implementations plus Android, Room, and preference-backed sources.

- [Speed Repo](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/repository/SpeedRepositoryImpl.kt): repository impl · Concrete speed repository implementation. · `app/src/main/java/com/englesoft/netspeedindicator/data/repository/SpeedRepositoryImpl.kt`
- [Usage Repo](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/repository/UsageRepositoryImpl.kt): repository impl · Concrete usage repository implementation. · `app/src/main/java/com/englesoft/netspeedindicator/data/repository/UsageRepositoryImpl.kt`
- [Data Sources](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/datasource/SpeedDataSource.kt): platform sources · Low-level speed and usage data collectors. · `app/src/main/java/com/englesoft/netspeedindicator/data/datasource/SpeedDataSource.kt`
- [Traffic State](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/manager/TrafficStateManager.kt): state manager · Holds live network and traffic state for monitoring. · `app/src/main/java/com/englesoft/netspeedindicator/data/manager/TrafficStateManager.kt`
- [Local DB](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/local/AppDatabase.kt): room storage · Room database, DAO, and usage entity storage. · `app/src/main/java/com/englesoft/netspeedindicator/data/local/AppDatabase.kt`
- [Preferences](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/preferences/PreferenceManager.kt): settings storage · Stores app settings and monitoring-related flags. · `app/src/main/java/com/englesoft/netspeedindicator/data/preferences/PreferenceManager.kt`
- [Usage Mapper](https://github.com/ronyaburaihan/netspeedindicator/blob/main/app/src/main/java/com/englesoft/netspeedindicator/data/mapper/UsageMapper.kt): mapper · Converts between Room entities and domain usage models. · `app/src/main/java/com/englesoft/netspeedindicator/data/mapper/UsageMapper.kt`

## Connections

- App → Main Activity: starts UI · Application bootstrap leads into the Compose host.
- App → Speed Monitor: injects · Dependency injection provides service dependencies.
- App → Boot Receiver: registers · Application setup includes reboot handling.
- Main Activity → Navigation: hosts · Main activity renders the navigation shell.
- Navigation → App Shell: composes · Navigation is wrapped by shared app chrome.
- Navigation → Compose Screens: routes to · Routes resolve to feature screens.
- Compose Screens → Home VM: uses · Home screen observes home state.
- Compose Screens → History VM: uses · History screen observes usage history.
- Compose Screens → Settings VM: uses · Settings screen reads and updates preferences.
- Home VM → Use Cases: calls · View models invoke domain use cases.
- History VM → Use Cases: calls · History view model reads aggregated usage.
- Settings VM → Preferences: reads/writes · Settings view model coordinates preference state.
- Use Cases → Repo Contracts: depends on · Use cases are defined against repository interfaces.
- Speed Repo → Data Sources: reads from · Speed repository pulls live network data.
- Speed Repo → Traffic State: tracks · Repository coordinates with traffic state.
- Usage Repo → Local DB: persists to · Usage repository stores and queries history.
- Usage Repo → Preferences: reads settings · Repository uses preferences for runtime configuration.
- Usage Repo → Usage Mapper: maps · Transforms between entities and domain models.
- Speed Monitor → Data Sources: samples · Foreground service continuously gathers traffic data.
- Speed Monitor → Notifications: shows · Service remains foreground via notification.
- Speed Monitor → Use Cases: persists usage · Service writes periodic usage snapshots through domain logic.
- Boot Receiver → Speed Monitor: restarts · Boot receiver restores monitoring after reboot.
- Permissions → Speed Monitor: gates · Permissions and startup constraints affect monitoring.
- Permissions → Compose Screens: gates · UI surfaces permission and setup flows.
- Theme → Compose Screens: styles · Theme system is consumed by Compose screens.
