# alexalkhatib/quizzler-android-app architecture

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

- Interactive diagram: https://gitdiagram.com/alexalkhatib/quizzler-android-app
- Repository: https://github.com/alexalkhatib/quizzler-android-app

## Overview

Quizzler is an Android trivia game. The main flow is choosing a player and quiz configuration, loading questions from Open Trivia DB with an offline fallback, playing through timed questions with scoring and lifelines, then reviewing, sharing, replaying, or saving results to local history. The README documents the broader capabilities; source excerpts and the SOURCE INDEX support specific wiring, while unsampled implementations are represented at their existing paths without asserting unshown calls.

Main entry points: [`app/src/main/java/com/quizzler/app/ui/quiz/QuizViewModel.kt`](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/quiz/QuizViewModel.kt) (Quiz coordinator), [`app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt`](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt) (Quiz setup), [`app/src/main/java/com/quizzler/app/core/AppContainer.kt`](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/core/AppContainer.kt) (Dependency container), [`app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt`](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt) (Result screen)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_play["Quiz experience"]
  node_splash["App launch<br/>[SplashActivity.kt]"]
  node_home["Quiz setup<br/>[HomeActivity.kt]"]
  node_homevm["Setup state<br/>[HomeViewModel.kt]"]
  node_quizui["Quiz screen<br/>[QuizActivity.kt]"]
  node_quizvm["Quiz coordinator<br/>[QuizViewModel.kt]"]
  node_feedback["Sound feedback<br/>[FeedbackPlayer.kt]"]
  node_config["Quiz configuration<br/>[QuizConfig.kt]"]
end

subgraph group_questions["Question sourcing"]
  node_repository["Question repository"]
  node_trivia["Trivia API<br/>[TriviaApi.kt]"]
  node_opentdb["Open Trivia DB"]
  node_offline["Offline question bank"]
  node_question["Question model<br/>[Question.kt]"]
end

subgraph group_rules["Game rules"]
  node_engine["Quiz state engine<br/>[QuizEngine.kt]"]
  node_scoring["Score calculation<br/>[Scoring.kt]"]
end

subgraph group_storage["Local data"]
  node_sessions[("Session database<br/>[QuizDatabase.kt]")]
  node_preferences[("User preferences<br/>[UserPreferences.kt]")]
  node_container["Dependency container<br/>[AppContainer.kt]"]
end

subgraph group_results["Results and history"]
  node_resultmodel["Result model<br/>[QuizResult.kt]"]
  node_resultui["Result screen<br/>[ResultActivity.kt]"]
  node_resultvm["Best score state<br/>[ResultViewModel.kt]"]
  node_review["Answer review<br/>[ReviewAdapter.kt]"]
  node_historyui["History screen<br/>[HistoryActivity.kt]"]
  node_historyvm["History state"]
end

node_player(("Player"))
node_share(("Share target"))

node_player -->|"launches"| node_splash
node_splash -->|"opens"| node_home
node_player -->|"configures"| node_home
node_home -->|"observes settings"| node_homevm
node_homevm -->|"reads and saves"| node_preferences
node_home -->|"creates"| node_config
node_home -->|"starts quiz"| node_quizui
node_quizui -->|"sends actions"| node_quizvm
node_quizvm -->|"loads questions"| node_repository
node_repository -->|"requests questions"| node_trivia
node_trivia -->|"fetches trivia"| node_opentdb
node_repository -->|"fills shortfall"| node_offline
node_repository -->|"returns questions"| node_question
node_quizvm -->|"drives quiz"| node_engine
node_engine -->|"calculates points"| node_scoring
node_quizvm -->|"plays cues"| node_feedback
node_quizvm -->|"builds result"| node_resultmodel
node_quizvm -->|"opens on finish"| node_resultui
node_resultui -->|"loads best score"| node_resultvm
node_resultui -->|"shows answers"| node_review
node_resultvm -->|"queries record"| node_sessions
node_quizvm -->|"saves session"| node_sessions
node_home -->|"opens history"| node_historyui
node_historyui -->|"observes history"| node_historyvm
node_historyvm -->|"reads and clears"| node_sessions
node_resultui -->|"shares score"| node_share
node_resultui -->|"replays config"| node_quizui
node_container -->|"provides"| node_repository
node_container -->|"constructs client"| node_trivia
node_container -->|"provides"| node_offline
node_container -->|"provides database"| node_sessions
node_container -->|"provides"| node_preferences

click node_splash "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/splash/SplashActivity.kt"
click node_home "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt"
click node_homevm "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/home/HomeViewModel.kt"
click node_quizui "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/quiz/QuizActivity.kt"
click node_quizvm "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/quiz/QuizViewModel.kt"
click node_feedback "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/util/FeedbackPlayer.kt"
click node_config "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/model/QuizConfig.kt"
click node_repository "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/remote/TriviaRepository.kt"
click node_trivia "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/remote/TriviaApi.kt"
click node_offline "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/local/OfflineQuestionBank.kt"
click node_question "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/model/Question.kt"
click node_engine "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/domain/QuizEngine.kt"
click node_scoring "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/domain/Scoring.kt"
click node_resultmodel "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/model/QuizResult.kt"
click node_resultui "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt"
click node_resultvm "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/result/ResultViewModel.kt"
click node_review "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/result/ReviewAdapter.kt"
click node_historyui "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/history/HistoryActivity.kt"
click node_historyvm "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/history/HistoryViewModel.kt"
click node_sessions "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/local/QuizDatabase.kt"
click node_preferences "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/local/UserPreferences.kt"
click node_container "https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/core/AppContainer.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_splash,node_home,node_homevm,node_quizui,node_quizvm,node_feedback,node_config toneBlue
class node_repository,node_trivia,node_opentdb,node_offline,node_question toneAmber
class node_engine,node_scoring toneMint
class node_sessions,node_preferences,node_container toneRose
class node_resultmodel,node_resultui,node_resultvm,node_review,node_historyui,node_historyvm,node_player,node_share toneIndigo
```

## Components

### Quiz experience

- [App launch](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/splash/SplashActivity.kt): `app/src/main/java/com/quizzler/app/ui/splash/SplashActivity.kt`
- [Quiz setup](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt): `app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt`
- [Setup state](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/home/HomeViewModel.kt): `app/src/main/java/com/quizzler/app/ui/home/HomeViewModel.kt`
- [Quiz screen](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/quiz/QuizActivity.kt): `app/src/main/java/com/quizzler/app/ui/quiz/QuizActivity.kt`
- [Quiz coordinator](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/quiz/QuizViewModel.kt): `app/src/main/java/com/quizzler/app/ui/quiz/QuizViewModel.kt`
- [Sound feedback](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/util/FeedbackPlayer.kt): `app/src/main/java/com/quizzler/app/util/FeedbackPlayer.kt`
- [Quiz configuration](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/model/QuizConfig.kt): `app/src/main/java/com/quizzler/app/data/model/QuizConfig.kt`

### Question sourcing

- [Question repository](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/remote/TriviaRepository.kt): `app/src/main/java/com/quizzler/app/data/remote/TriviaRepository.kt`
- [Trivia API](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/remote/TriviaApi.kt): `app/src/main/java/com/quizzler/app/data/remote/TriviaApi.kt`
- **Open Trivia DB**
- [Offline question bank](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/local/OfflineQuestionBank.kt): `app/src/main/java/com/quizzler/app/data/local/OfflineQuestionBank.kt`
- [Question model](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/model/Question.kt): `app/src/main/java/com/quizzler/app/data/model/Question.kt`

### Game rules

- [Quiz state engine](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/domain/QuizEngine.kt): `app/src/main/java/com/quizzler/app/domain/QuizEngine.kt`
- [Score calculation](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/domain/Scoring.kt): `app/src/main/java/com/quizzler/app/domain/Scoring.kt`

### Local data

- [Session database](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/local/QuizDatabase.kt): `app/src/main/java/com/quizzler/app/data/local/QuizDatabase.kt`
- [User preferences](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/local/UserPreferences.kt): `app/src/main/java/com/quizzler/app/data/local/UserPreferences.kt`
- [Dependency container](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/core/AppContainer.kt): `app/src/main/java/com/quizzler/app/core/AppContainer.kt`

### Results and history

- [Result model](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/data/model/QuizResult.kt): `app/src/main/java/com/quizzler/app/data/model/QuizResult.kt`
- [Result screen](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt): `app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt`
- [Best score state](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/result/ResultViewModel.kt): `app/src/main/java/com/quizzler/app/ui/result/ResultViewModel.kt`
- [Answer review](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/result/ReviewAdapter.kt): `app/src/main/java/com/quizzler/app/ui/result/ReviewAdapter.kt`
- [History screen](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/history/HistoryActivity.kt): `app/src/main/java/com/quizzler/app/ui/history/HistoryActivity.kt`
- [History state](https://github.com/alexalkhatib/quizzler-android-app/blob/main/app/src/main/java/com/quizzler/app/ui/history/HistoryViewModel.kt): `app/src/main/java/com/quizzler/app/ui/history/HistoryViewModel.kt`

### Other components

- **Player**
- **Share target**

## Connections

- Player → App launch: launches (evidence: `README.md`)
- App launch → Quiz setup: opens (evidence: `app/src/main/java/com/quizzler/app/ui/splash/SplashActivity.kt`)
- Player → Quiz setup: configures (evidence: `README.md`)
- Quiz setup → Setup state: observes settings (evidence: `app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt`)
- Setup state → User preferences: reads and saves (evidence: `app/src/main/java/com/quizzler/app/ui/home/HomeViewModel.kt`)
- Quiz setup → Quiz configuration: creates (evidence: `app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt`)
- Quiz setup → Quiz screen: starts quiz (evidence: `app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt`)
- Quiz screen → Quiz coordinator: sends actions (evidence: `app/src/main/java/com/quizzler/app/ui/quiz/QuizActivity.kt`)
- Quiz coordinator → Question repository: loads questions (evidence: `app/src/main/java/com/quizzler/app/ui/quiz/QuizViewModel.kt`)
- Question repository → Trivia API: requests questions (evidence: `app/src/main/java/com/quizzler/app/data/remote/TriviaRepository.kt`)
- Trivia API → Open Trivia DB: fetches trivia (evidence: `README.md`)
- Question repository → Offline question bank: fills shortfall (evidence: `app/src/main/java/com/quizzler/app/data/remote/TriviaRepository.kt`)
- Question repository → Question model: returns questions (evidence: `app/src/main/java/com/quizzler/app/data/remote/TriviaRepository.kt`)
- Quiz coordinator → Quiz state engine: drives quiz (evidence: `app/src/main/java/com/quizzler/app/ui/quiz/QuizViewModel.kt`)
- Quiz state engine → Score calculation: calculates points (evidence: `app/src/main/java/com/quizzler/app/domain/QuizEngine.kt`)
- Quiz coordinator → Sound feedback: plays cues (evidence: `app/src/main/java/com/quizzler/app/ui/quiz/QuizViewModel.kt`)
- Quiz coordinator → Result model: builds result
- Quiz coordinator → Result screen: opens on finish (evidence: `README.md`)
- Result screen → Best score state: loads best score (evidence: `app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt`)
- Result screen → Answer review: shows answers (evidence: `app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt`)
- Best score state → Session database: queries record (evidence: `README.md`)
- Quiz coordinator → Session database: saves session (evidence: `README.md`)
- Quiz setup → History screen: opens history (evidence: `app/src/main/java/com/quizzler/app/ui/home/HomeActivity.kt`)
- History screen → History state: observes history (evidence: `app/src/main/java/com/quizzler/app/ui/history/HistoryActivity.kt`)
- History state → Session database: reads and clears (evidence: `README.md`)
- Result screen → Share target: shares score (evidence: `app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt`)
- Result screen → Quiz screen: replays config (evidence: `app/src/main/java/com/quizzler/app/ui/result/ResultActivity.kt`)
- Dependency container → Question repository: provides (evidence: `app/src/main/java/com/quizzler/app/core/AppContainer.kt`)
- Dependency container → Trivia API: constructs client (evidence: `app/src/main/java/com/quizzler/app/core/AppContainer.kt`)
- Dependency container → Offline question bank: provides (evidence: `app/src/main/java/com/quizzler/app/core/AppContainer.kt`)
- Dependency container → Session database: provides database (evidence: `app/src/main/java/com/quizzler/app/core/AppContainer.kt`)
- Dependency container → User preferences: provides (evidence: `app/src/main/java/com/quizzler/app/core/AppContainer.kt`)
