# projectgammacompany/eduplayandroidapp architecture

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

- Interactive diagram: https://gitdiagram.com/projectgammacompany/eduplayandroidapp
- Repository: https://github.com/projectgammacompany/eduplayandroidapp

## Overview

#### 1. Purpose and Runtime
EduPlay is a native Android client for authenticated educational events/quests: users discover, join, play task stages, view results, manage profiles, receive notifications, and download events for offline use. The single Android app module is built with Gradle/Kotlin and launches through `app/src/main/AndroidManifest.xml`, `app/src/main/java/com/eduplay/moblie/EduPlayApp.kt`, and `app/src/main/java/com/eduplay/moblie/MainActivity.kt`.

#### 2. Composition Root and UI Layer
Application-wide providers and managers are assembled near the app entry point, with Hilt-related activity integration. Compose-style screen and element packages form the presentation boundary; screen state and user actions are mediated by dedicated view models rather than directly invoking storage/network code.
- `app/src/main/java/com/eduplay/moblie/Providers.kt`
- `app/src/main/java/com/eduplay/moblie/HiltComponentactivity.kt`
- `app/src/main/java/com/eduplay/moblie/ui/screens/MainScreen.kt`
- `app/src/main/java/com/eduplay/moblie/ui/viewmodel/MainScreenViewModel.kt`

#### 3. Event and Task Experience
The central control flow is event selection/joining → event screen/stage progression → task-specific rendering and answer submission → results. Stages support parallel blocks and task types including text, single/multiple choice, and QR scanning. Event roles/statuses and task models provide the domain vocabulary.
- `app/src/main/java/com/eduplay/moblie/ui/screens/EventScreen.kt`
- `app/src/main/java/com/eduplay/moblie/ui/screens/EventStageScreen.kt`
- `app/src/main/java/com/eduplay/moblie/ui/screens/TaskScreen/TaskScreen.kt`
- `app/src/main/java/com/eduplay/moblie/ui/viewmodel/EventStageViewmodel.kt`
- `app/src/main/java/com/eduplay/moblie/models/EventStatus.kt`

#### 4. Repository Boundary and Remote API
`EduRepository`/`Repository` abstract data access for view models and use cases. The web implementation communicates with the EduPlay backend for authentication, event catalogs and details, joining, answers, files, notifications, and profile/event operations. HTTP authentication is a critical boundary: token injection and refresh interception surround API calls.
- `app/src/main/java/com/eduplay/moblie/repository/EduRepository.kt`
- `app/src/main/java/com/eduplay/moblie/repository/webrepository/WebRepository.kt`
- `app/src/main/java/com/eduplay/moblie/repository/webrepository/WebApi.kt`
- `app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthInterceptor.kt`
- `app/src/main/java/com/eduplay/moblie/repository/webrepository/RefreshInterceptor.kt`

#### 5. Identity and Session State
Authorization, registration, password recovery, and token lifecycle are separate from general event operations. UI authentication state flows through `AuthViewModel`; persisted/current credentials are owned by `TokenManager`, with JWT decoding available for client-side identity claims. Unauthorized backend outcomes map to a dedicated exception.
- `app/src/main/java/com/eduplay/moblie/ui/viewmodel/AuthViewModel.kt`
- `app/src/main/java/com/eduplay/moblie/useCases/managers/TokenManager.kt`
- `app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthApi.kt`
- `app/src/main/java/com/eduplay/moblie/exceptions/NotAuthorisedException.kt`

#### 6. Offline Event Cache and Download Pipeline
Room-like local persistence stores normalized event graphs—events, blocks, tasks, answers/options, conditions, groups, files, and user status. A download service/use-case pipeline fetches full remote event data and files, materializes it locally, tracks progress, and supports offline mode. Local paging sources support browsing cached event subsets.
- `app/src/main/java/com/eduplay/moblie/repository/localrepository/EventDatabase.kt`
- `app/src/main/java/com/eduplay/moblie/repository/localrepository/LocalRepository.kt`
- `app/src/main/java/com/eduplay/moblie/useCases/downloadUsecases/EventDownloadService.kt`
- `app/src/main/java/com/eduplay/moblie/useCases/downloadTaskTypes/FullEventData.kt`
- `app/src/main/java/com/eduplay/moblie/useCases/managers/OfflineModeManager.kt`

#### 7. Device Integrations
Bluetooth supports device discovery and data exchange through a view-model/use-case boundary. QR tasks use a camera preview and analyzer; both require Android runtime permissions and keep platform interaction outside event UI orchestration.
- `app/src/main/java/com/eduplay/moblie/ui/viewmodel/BluetoothViewModel.kt`
- `app/src/main/java/com/eduplay/moblie/useCases/bluetoothInteractions/BluetoothDataExchangeUseCase.kt`
- `app/src/main/java/com/eduplay/moblie/ui/screens/TaskScreen/QRCameraPreview.kt`
- `app/src/main/java/com/eduplay/moblie/useCases/QRAnalyser.kt`

Main entry points: [`app/src/main/java/com/eduplay/moblie/repository/EduRepository.kt`](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/EduRepository.kt) (Edu repository), [`app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthInterceptor.kt`](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthInterceptor.kt) (Auth HTTP interceptors), [`app/src/main/java/com/eduplay/moblie/EduPlayApp.kt`](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/EduPlayApp.kt) (EduPlay application), [`app/src/main/java/com/eduplay/moblie/ui/screens/MainScreen.kt`](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/MainScreen.kt) (Main screen)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App &amp; presentation"]
  node_android{{"Android runtime<br/>platform"}}
  node_application["EduPlay application<br/>composition root<br/>[EduPlayApp.kt]"]
  node_activity["Main activity<br/>Android activity<br/>[MainActivity.kt]"]
  node_providers["Providers<br/>dependency assembly<br/>[Providers.kt]"]
  node_main_ui["Main screen<br/>Compose screen<br/>[MainScreen.kt]"]
  node_main_vm["Main screen view model"]
  node_event_flow["Event &amp; stage screens<br/>Compose flow<br/>[EventScreen.kt]"]
  node_stage_vm["Event stage view model"]
  node_task_ui["Task screen<br/>task renderer<br/>[TaskScreen.kt]"]
end

subgraph group_data["Data &amp; session"]
  node_auth_vm["Auth view model<br/>[AuthViewModel.kt]"]
  node_repository["Edu repository<br/>data abstraction<br/>[EduRepository.kt]"]
  node_web_repository["Web repository<br/>remote implementation<br/>[WebRepository.kt]"]
  node_auth_api["Auth API<br/>[AuthApi.kt]"]
  node_web_api["EduPlay web API<br/>remote API<br/>[WebApi.kt]"]
  node_auth_http["Auth HTTP interceptors<br/>HTTP middleware<br/>[AuthInterceptor.kt]"]
  node_token_manager["Token manager<br/>session manager<br/>[TokenManager.kt]"]
end

subgraph group_offline["Offline pipeline"]
  node_download_service["Event download service<br/>download pipeline"]
  node_local_repository["Local repository<br/>offline implementation<br/>[LocalRepository.kt]"]
  node_event_database[("Event database<br/>Room database<br/>[EventDatabase.kt]")]
  node_offline_mode["Offline mode manager"]
end

subgraph group_device["Device integrations"]
  node_bluetooth_vm["Bluetooth view model"]
  node_bluetooth_usecase["Bluetooth exchange<br/>device use case"]
  node_qr_preview["QR camera preview<br/>camera UI<br/>[QRCameraPreview.kt]"]
  node_qr_analyser["QR analyser<br/>camera analyzer<br/>[QRAnalyser.kt]"]
end

node_backend{{"EduPlay backend<br/>external service"}}

node_android -->|"launches"| node_application
node_application -->|"hosts"| node_activity
node_application -->|"assembles"| node_providers
node_activity -->|"renders"| node_main_ui
node_providers -->|"provides"| node_main_vm
node_main_ui -->|"state and actions"| node_main_vm
node_main_ui -->|"navigates to"| node_event_flow
node_event_flow -->|"state and actions"| node_stage_vm
node_event_flow -->|"renders stage tasks"| node_task_ui
node_task_ui -->|"submits answers"| node_stage_vm
node_main_vm -->|"loads events"| node_repository
node_stage_vm -->|"event operations"| node_repository
node_auth_vm -->|"authenticates"| node_auth_api
node_auth_vm -->|"updates session"| node_token_manager
node_repository -->|"remote data"| node_web_repository
node_repository -->|"offline data"| node_local_repository
node_web_repository -->|"calls"| node_web_api
node_auth_api -->|"authenticated HTTP"| node_auth_http
node_web_api -->|"authenticated HTTP"| node_auth_http
node_auth_http -->|"reads and refreshes tokens"| node_token_manager
node_auth_http -->|"requests"| node_backend
node_download_service -->|"fetches full event"| node_web_repository
node_download_service -->|"materializes cache"| node_local_repository
node_local_repository -->|"persists"| node_event_database
node_offline_mode -.->|"selects source"| node_repository
node_bluetooth_vm -->|"device actions"| node_bluetooth_usecase
node_task_ui -->|"QR task camera"| node_qr_preview
node_qr_preview -->|"camera frames"| node_qr_analyser

click node_android "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/AndroidManifest.xml"
click node_application "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/EduPlayApp.kt"
click node_activity "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/MainActivity.kt"
click node_providers "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/Providers.kt"
click node_main_ui "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/MainScreen.kt"
click node_main_vm "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/viewmodel/MainScreenViewModel.kt"
click node_event_flow "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/EventScreen.kt"
click node_stage_vm "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/viewmodel/EventStageViewmodel.kt"
click node_task_ui "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/TaskScreen/TaskScreen.kt"
click node_auth_vm "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/viewmodel/AuthViewModel.kt"
click node_repository "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/EduRepository.kt"
click node_web_repository "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/WebRepository.kt"
click node_auth_api "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthApi.kt"
click node_web_api "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/WebApi.kt"
click node_auth_http "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthInterceptor.kt"
click node_token_manager "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/managers/TokenManager.kt"
click node_download_service "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/downloadUsecases/EventDownloadService.kt"
click node_local_repository "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/localrepository/LocalRepository.kt"
click node_event_database "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/localrepository/EventDatabase.kt"
click node_offline_mode "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/managers/OfflineModeManager.kt"
click node_bluetooth_vm "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/viewmodel/BluetoothViewModel.kt"
click node_bluetooth_usecase "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/bluetoothInteractions/BluetoothDataExchangeUseCase.kt"
click node_qr_preview "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/TaskScreen/QRCameraPreview.kt"
click node_qr_analyser "https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/QRAnalyser.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_android,node_application,node_activity,node_providers,node_main_ui,node_main_vm,node_event_flow,node_stage_vm,node_task_ui toneBlue
class node_auth_vm,node_repository,node_web_repository,node_auth_api,node_web_api,node_auth_http,node_token_manager toneAmber
class node_download_service,node_local_repository,node_event_database,node_offline_mode toneMint
class node_bluetooth_vm,node_bluetooth_usecase,node_qr_preview,node_qr_analyser toneRose
class node_backend toneNeutral
```

## Components

### App & presentation

- [Android runtime](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/AndroidManifest.xml): platform · `app/src/main/AndroidManifest.xml`
- [EduPlay application](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/EduPlayApp.kt): composition root · Assembles app-wide providers and managers. · `app/src/main/java/com/eduplay/moblie/EduPlayApp.kt`
- [Main activity](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/MainActivity.kt): Android activity · `app/src/main/java/com/eduplay/moblie/MainActivity.kt`
- [Providers](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/Providers.kt): dependency assembly · `app/src/main/java/com/eduplay/moblie/Providers.kt`
- [Main screen](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/MainScreen.kt): Compose screen · `app/src/main/java/com/eduplay/moblie/ui/screens/MainScreen.kt`
- [Main screen view model](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/viewmodel/MainScreenViewModel.kt): view model · `app/src/main/java/com/eduplay/moblie/ui/viewmodel/MainScreenViewModel.kt`
- [Event & stage screens](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/EventScreen.kt): Compose flow · Selection, joining, stage progression, and results flow. · `app/src/main/java/com/eduplay/moblie/ui/screens/EventScreen.kt`
- [Event stage view model](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/viewmodel/EventStageViewmodel.kt): view model · `app/src/main/java/com/eduplay/moblie/ui/viewmodel/EventStageViewmodel.kt`
- [Task screen](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/TaskScreen/TaskScreen.kt): task renderer · Renders text, choice, and QR tasks and submits answers. · `app/src/main/java/com/eduplay/moblie/ui/screens/TaskScreen/TaskScreen.kt`

### Data & session

- [Auth view model](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/viewmodel/AuthViewModel.kt): view model · `app/src/main/java/com/eduplay/moblie/ui/viewmodel/AuthViewModel.kt`
- [Edu repository](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/EduRepository.kt): data abstraction · Boundary used by view models and use cases. · `app/src/main/java/com/eduplay/moblie/repository/EduRepository.kt`
- [Web repository](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/WebRepository.kt): remote implementation · `app/src/main/java/com/eduplay/moblie/repository/webrepository/WebRepository.kt`
- [Auth API](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthApi.kt): remote auth API · `app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthApi.kt`
- [EduPlay web API](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/WebApi.kt): remote API · Events, joining, answers, files, notifications, and profile operations. · `app/src/main/java/com/eduplay/moblie/repository/webrepository/WebApi.kt`
- [Auth HTTP interceptors](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthInterceptor.kt): HTTP middleware · Injects tokens and refreshes expired sessions. · `app/src/main/java/com/eduplay/moblie/repository/webrepository/AuthInterceptor.kt`
- [Token manager](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/managers/TokenManager.kt): session manager · Owns persisted and current credentials. · `app/src/main/java/com/eduplay/moblie/useCases/managers/TokenManager.kt`

### Offline pipeline

- [Event download service](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/downloadUsecases/EventDownloadService.kt): download pipeline · Fetches complete event data and files while tracking progress. · `app/src/main/java/com/eduplay/moblie/useCases/downloadUsecases/EventDownloadService.kt`
- [Local repository](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/localrepository/LocalRepository.kt): offline implementation · Serves cached event subsets and local data. · `app/src/main/java/com/eduplay/moblie/repository/localrepository/LocalRepository.kt`
- [Event database](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/repository/localrepository/EventDatabase.kt): Room database · Normalized offline event graph and user status. · `app/src/main/java/com/eduplay/moblie/repository/localrepository/EventDatabase.kt`
- [Offline mode manager](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/managers/OfflineModeManager.kt): mode manager · `app/src/main/java/com/eduplay/moblie/useCases/managers/OfflineModeManager.kt`

### Device integrations

- [Bluetooth view model](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/viewmodel/BluetoothViewModel.kt): view model · `app/src/main/java/com/eduplay/moblie/ui/viewmodel/BluetoothViewModel.kt`
- [Bluetooth exchange](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/bluetoothInteractions/BluetoothDataExchangeUseCase.kt): device use case · Discovers devices and exchanges data. · `app/src/main/java/com/eduplay/moblie/useCases/bluetoothInteractions/BluetoothDataExchangeUseCase.kt`
- [QR camera preview](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/ui/screens/TaskScreen/QRCameraPreview.kt): camera UI · `app/src/main/java/com/eduplay/moblie/ui/screens/TaskScreen/QRCameraPreview.kt`
- [QR analyser](https://github.com/projectgammacompany/eduplayandroidapp/blob/master/app/src/main/java/com/eduplay/moblie/useCases/QRAnalyser.kt): camera analyzer · `app/src/main/java/com/eduplay/moblie/useCases/QRAnalyser.kt`

### Other components

- **EduPlay backend**: external service

## Connections

- Android runtime → EduPlay application: launches
- EduPlay application → Main activity: hosts
- EduPlay application → Providers: assembles
- Main activity → Main screen: renders
- Providers → Main screen view model: provides
- Main screen → Main screen view model: state and actions
- Main screen → Event & stage screens: navigates to
- Event & stage screens → Event stage view model: state and actions
- Event & stage screens → Task screen: renders stage tasks
- Task screen → Event stage view model: submits answers
- Main screen view model → Edu repository: loads events
- Event stage view model → Edu repository: event operations
- Auth view model → Auth API: authenticates
- Auth view model → Token manager: updates session
- Edu repository → Web repository: remote data
- Edu repository → Local repository: offline data
- Web repository → EduPlay web API: calls
- Auth API → Auth HTTP interceptors: authenticated HTTP
- EduPlay web API → Auth HTTP interceptors: authenticated HTTP
- Auth HTTP interceptors → Token manager: reads and refreshes tokens
- Auth HTTP interceptors → EduPlay backend: requests
- Event download service → Web repository: fetches full event
- Event download service → Local repository: materializes cache
- Local repository → Event database: persists
- Offline mode manager → Edu repository: selects source
- Bluetooth view model → Bluetooth exchange: device actions
- Task screen → QR camera preview: QR task camera
- QR camera preview → QR analyser: camera frames
