# aquamarine5/chaoxingsignfaker architecture

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

- Interactive diagram: https://gitdiagram.com/aquamarine5/chaoxingsignfaker
- Repository: https://github.com/aquamarine5/chaoxingsignfaker

## Overview

ChaoxingSignFaker is an Android app for completing Chaoxing course and group sign-ins, including location, photo, QR, gesture, captcha, face-recognition, and multi-account workflows. Users navigate courses or groups, choose a sign-in method, provide any required evidence or verification, and submit through the app’s signing layer to Chaoxing. The tree and README establish several capabilities, but excerpts do not show all screen-to-handler wiring; those uncertain links are omitted. The optional rank-analysis integration is shown separately.

Main entry points: [`app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/signer/ChaoxingSignHandler.kt`](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/signer/ChaoxingSignHandler.kt) (Sign coordinator), [`app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/MainActivity.kt`](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/MainActivity.kt) (App entry), [`app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingHttpClient.kt`](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingHttpClient.kt) (HTTP client), [`app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/LocationSignScreen.kt`](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/LocationSignScreen.kt) (Sign screens)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App navigation"]
  node_main["App entry<br/>[MainActivity.kt]"]
  node_course_screens["Course screens"]
  node_group_screens["Group screens<br/>[GroupListScreen.kt]"]
end

subgraph group_signing["Sign-in workflows"]
  node_sign_screens["Sign screens"]
  node_photo_screen["Photo sign<br/>[PhotoSignScreen.kt]"]
  node_qr_screen["QR sign"]
  node_gesture_screen["Gesture sign"]
  node_handler["Sign coordinator"]
  node_signer["Sign methods<br/>[ChaoxingSigner.kt]"]
  node_captcha["Captcha handling"]
  node_captcha_predict["Captcha prediction"]
  node_face["Face sign support"]
end

subgraph group_platform["Chaoxing services"]
  node_api_helpers["Chaoxing APIs"]
  node_http["HTTP client"]
  node_other_helpers["Course and group APIs"]
end

subgraph group_accounts["Accounts and settings"]
  node_login["Login screen<br/>[LoginScreen.kt]"]
  node_other_users["Other accounts<br/>[OtherUserScreen.kt]"]
  node_import_user["Import account"]
  node_pool["Client pool"]
  node_settings["Preferences<br/>[SettingScreen.kt]"]
  node_store[("Local settings store<br/>[datastore.proto]")]
end

subgraph group_analysis["Rank analysis"]
  node_analyser["Rank analysis"]
end

node_user(("App user"))
node_chaoxing{{"Chaoxing service"}}
node_rank_service{{"Analysis service"}}

node_user -->|"opens"| node_main
node_main -->|"navigates"| node_course_screens
node_main -->|"navigates"| node_group_screens
node_course_screens -->|"selects activity"| node_sign_screens
node_group_screens -->|"selects activity"| node_sign_screens
node_sign_screens -->|"starts sign-in"| node_handler
node_photo_screen -->|"submits photo"| node_handler
node_qr_screen -->|"submits QR"| node_handler
node_gesture_screen -->|"submits gesture"| node_handler
node_handler -->|"dispatches sign"| node_signer
node_captcha -.->|"requests prediction"| node_captcha_predict
node_handler -->|"updates face status"| node_face
node_signer -->|"requests sign"| node_api_helpers
node_api_helpers -->|"uses client"| node_http
node_other_helpers -->|"uses client"| node_http
node_http -->|"sends requests"| node_chaoxing
node_login -->|"authenticates"| node_http
node_other_users -->|"loads account"| node_pool
node_import_user -->|"adds account"| node_other_users
node_pool -->|"reads sessions"| node_store
node_main -->|"loads preferences"| node_store
node_settings -->|"updates preferences"| node_store
node_analyser -.->|"queries rank"| node_rank_service

click node_main "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/MainActivity.kt"
click node_course_screens "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/CourseListScreen.kt"
click node_group_screens "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/GroupListScreen.kt"
click node_sign_screens "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/LocationSignScreen.kt"
click node_photo_screen "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/PhotoSignScreen.kt"
click node_qr_screen "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/QRCodeSignScreen.kt"
click node_gesture_screen "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/GestureSignScreen.kt"
click node_handler "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/signer/ChaoxingSignHandler.kt"
click node_signer "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/signer/ChaoxingSigner.kt"
click node_captcha "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/components/CaptchaHandlerDialog.kt"
click node_captcha_predict "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingCaptchaPredictor.kt"
click node_face "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingFaceHelper.kt"
click node_api_helpers "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingSignHelper.kt"
click node_http "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingHttpClient.kt"
click node_other_helpers "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingCourseHelper.kt"
click node_login "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/LoginScreen.kt"
click node_other_users "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/OtherUserScreen.kt"
click node_import_user "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/ImportOtherUserActivity.kt"
click node_pool "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingHttpClientPool.kt"
click node_settings "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/SettingScreen.kt"
click node_store "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/proto/datastore.proto"
click node_analyser "https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/utilities/ChaoxingAnalyser.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_main,node_course_screens,node_group_screens,node_user toneBlue
class node_sign_screens,node_photo_screen,node_qr_screen,node_gesture_screen,node_handler,node_signer,node_captcha,node_captcha_predict,node_face toneAmber
class node_api_helpers,node_http,node_other_helpers toneMint
class node_login,node_other_users,node_import_user,node_pool,node_settings,node_store toneRose
class node_analyser,node_chaoxing,node_rank_service toneIndigo
```

## Components

### App navigation

- [App entry](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/MainActivity.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/MainActivity.kt`
- [Course screens](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/CourseListScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/CourseListScreen.kt`
- [Group screens](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/GroupListScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/GroupListScreen.kt`

### Sign-in workflows

- [Sign screens](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/LocationSignScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/LocationSignScreen.kt`
- [Photo sign](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/PhotoSignScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/PhotoSignScreen.kt`
- [QR sign](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/QRCodeSignScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/QRCodeSignScreen.kt`
- [Gesture sign](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/GestureSignScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/GestureSignScreen.kt`
- [Sign coordinator](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/signer/ChaoxingSignHandler.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/signer/ChaoxingSignHandler.kt`
- [Sign methods](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/signer/ChaoxingSigner.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/signer/ChaoxingSigner.kt`
- [Captcha handling](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/components/CaptchaHandlerDialog.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/components/CaptchaHandlerDialog.kt`
- [Captcha prediction](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingCaptchaPredictor.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingCaptchaPredictor.kt`
- [Face sign support](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingFaceHelper.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingFaceHelper.kt`

### Chaoxing services

- [Chaoxing APIs](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingSignHelper.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingSignHelper.kt`
- [HTTP client](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingHttpClient.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingHttpClient.kt`
- [Course and group APIs](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingCourseHelper.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingCourseHelper.kt`

### Accounts and settings

- [Login screen](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/LoginScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/LoginScreen.kt`
- [Other accounts](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/OtherUserScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/OtherUserScreen.kt`
- [Import account](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/ImportOtherUserActivity.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/ImportOtherUserActivity.kt`
- [Client pool](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingHttpClientPool.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/api/ChaoxingHttpClientPool.kt`
- [Preferences](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/SettingScreen.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/screen/SettingScreen.kt`
- [Local settings store](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/proto/datastore.proto): `app/src/main/proto/datastore.proto`

### Rank analysis

- [Rank analysis](https://github.com/aquamarine5/chaoxingsignfaker/blob/main/app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/utilities/ChaoxingAnalyser.kt): `app/src/main/java/org/aquamarine5/brainspark/chaoxingsignfaker/utilities/ChaoxingAnalyser.kt`

### Other components

- **App user**
- **Chaoxing service**
- **Analysis service**

## Connections

- App user → App entry: opens
- App entry → Course screens: navigates
- App entry → Group screens: navigates
- Course screens → Sign screens: selects activity
- Group screens → Sign screens: selects activity
- Sign screens → Sign coordinator: starts sign-in
- Photo sign → Sign coordinator: submits photo
- QR sign → Sign coordinator: submits QR
- Gesture sign → Sign coordinator: submits gesture
- Sign coordinator → Sign methods: dispatches sign
- Captcha handling → Captcha prediction: requests prediction
- Sign coordinator → Face sign support: updates face status
- Sign methods → Chaoxing APIs: requests sign
- Chaoxing APIs → HTTP client: uses client
- Course and group APIs → HTTP client: uses client
- HTTP client → Chaoxing service: sends requests
- Login screen → HTTP client: authenticates
- Other accounts → Client pool: loads account
- Import account → Other accounts: adds account
- Client pool → Local settings store: reads sessions
- App entry → Local settings store: loads preferences
- Preferences → Local settings store: updates preferences
- Rank analysis → Analysis service: queries rank
