# xiaobutiaoer/vcampro architecture

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

- Interactive diagram: https://gitdiagram.com/xiaobutiaoer/vcampro
- Repository: https://github.com/xiaobutiaoer/vcampro

## Overview

VCAMPRO/VCAMSX is an Android virtual-camera app: users configure a local video or RTMP stream, then the Xposed-side camera hooks are intended to provide replacement camera data to other apps. The sampled UI and controller show stream selection, playback, and persisted settings; the README documents little beyond camera replacement. Hook implementation and wiring are only partially sampled, so those relationships are kept conservative.

Main entry points: [`app/src/main/java/com/wangyiheng/vcamsx/modules/home/controllers/HomeController.kt`](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/modules/home/controllers/HomeController.kt) (Home controller), [`app/src/main/java/com/wangyiheng/vcamsx/modules/home/view/HomeScreen.kt`](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/modules/home/view/HomeScreen.kt) (Home screen), [`app/src/main/java/com/wangyiheng/vcamsx/utils/InfoManage.kt`](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/utils/InfoManage.kt) (Info manager), [`app/src/main/java/com/wangyiheng/vcamsx/MainActivity.kt`](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/MainActivity.kt) (Main activity)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App interface"]
  node_activity["Main activity<br/>[MainActivity.kt]"]
  node_home["Home screen<br/>[HomeScreen.kt]"]
  node_controller["Home controller<br/>[HomeController.kt]"]
  node_disclaimer["Disclaimer dialog"]
end

subgraph group_settings["Configuration state"]
  node_info["Info manager<br/>[InfoManage.kt]"]
  node_status["Video settings<br/>[VideoStatues.kt]"]
  node_video_info["Video selection<br/>[VideoInfo.kt]"]
  node_api_service["IP upload API<br/>[ApiService.kt]"]
end

subgraph group_media["Media playback"]
  node_video_provider["Video provider<br/>[VideoProvider.kt]"]
  node_player_dialog["Video preview"]
  node_live_dialog["Stream preview"]
  node_player["Media playback<br/>[VideoPlayer.kt]"]
end

subgraph group_hooks["Camera integration"]
  node_main_hook["Hook entry<br/>[MainHook.kt]"]
  node_hook_manager["Camera hook manager"]
  node_camera_one["Camera API one<br/>[CameraOne.kt]"]
  node_camera_two["Camera API two<br/>[CameraTwo.kt]"]
end

node_user(("User"))
node_rtmp(("RTMP source"))
node_xposed(("Xposed runtime"))
node_target_app(("Target app"))
node_camera_framework["Android camera APIs"]
node_ip_service["Public IP service"]
node_backend["Upload backend"]

node_user -->|"opens"| node_activity
node_activity -->|"hosts"| node_home
node_home -->|"controls"| node_controller
node_home -.->|"displays"| node_disclaimer
node_home -->|"selects video"| node_info
node_home -->|"sets options"| node_controller
node_controller -->|"loads and saves"| node_info
node_info -->|"stores"| node_status
node_info -->|"stores"| node_video_info
node_controller -->|"uploads IP"| node_api_service
node_controller -->|"reads public IP"| node_ip_service
node_api_service -->|"sends request"| node_backend
node_home -->|"opens preview"| node_player_dialog
node_home -->|"opens preview"| node_live_dialog
node_controller -->|"reads video"| node_video_provider
node_controller -->|"plays stream"| node_player
node_rtmp -->|"provides stream"| node_controller
node_xposed -->|"loads module"| node_main_hook
node_main_hook -.->|"initializes hooks"| node_hook_manager
node_hook_manager -.->|"hooks APIs"| node_camera_framework
node_target_app -->|"requests camera"| node_camera_framework
node_camera_one -.->|"intercepts"| node_camera_framework
node_camera_two -.->|"intercepts"| node_camera_framework

click node_activity "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/MainActivity.kt"
click node_home "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/modules/home/view/HomeScreen.kt"
click node_controller "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/modules/home/controllers/HomeController.kt"
click node_disclaimer "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/components/DisclaimerDialog.kt"
click node_info "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/utils/InfoManage.kt"
click node_status "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/data/models/VideoStatues.kt"
click node_video_info "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/data/models/VideoInfo.kt"
click node_video_provider "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/utils/VideoProvider.kt"
click node_player_dialog "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/components/VideoPlayerDialog.kt"
click node_live_dialog "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/components/LivePlayerDialog.kt"
click node_player "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/utils/VideoPlayer.kt"
click node_main_hook "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/MainHook.kt"
click node_hook_manager "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/hooks/CameraHookManager.kt"
click node_camera_one "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/camerahook/CameraOne.kt"
click node_camera_two "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/camerahook/CameraTwo.kt"
click node_api_service "https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/data/services/ApiService.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_activity,node_home,node_controller,node_disclaimer,node_user toneBlue
class node_info,node_status,node_video_info,node_api_service toneAmber
class node_video_provider,node_player_dialog,node_live_dialog,node_player,node_camera_framework toneMint
class node_main_hook,node_hook_manager,node_camera_one,node_camera_two toneRose
class node_rtmp,node_xposed,node_target_app,node_ip_service,node_backend toneIndigo
```

## Components

### App interface

- [Main activity](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/MainActivity.kt): `app/src/main/java/com/wangyiheng/vcamsx/MainActivity.kt`
- [Home screen](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/modules/home/view/HomeScreen.kt): `app/src/main/java/com/wangyiheng/vcamsx/modules/home/view/HomeScreen.kt`
- [Home controller](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/modules/home/controllers/HomeController.kt): `app/src/main/java/com/wangyiheng/vcamsx/modules/home/controllers/HomeController.kt`
- [Disclaimer dialog](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/components/DisclaimerDialog.kt): `app/src/main/java/com/wangyiheng/vcamsx/components/DisclaimerDialog.kt`

### Configuration state

- [Info manager](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/utils/InfoManage.kt): `app/src/main/java/com/wangyiheng/vcamsx/utils/InfoManage.kt`
- [Video settings](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/data/models/VideoStatues.kt): `app/src/main/java/com/wangyiheng/vcamsx/data/models/VideoStatues.kt`
- [Video selection](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/data/models/VideoInfo.kt): `app/src/main/java/com/wangyiheng/vcamsx/data/models/VideoInfo.kt`
- [IP upload API](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/data/services/ApiService.kt): `app/src/main/java/com/wangyiheng/vcamsx/data/services/ApiService.kt`

### Media playback

- [Video provider](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/utils/VideoProvider.kt): `app/src/main/java/com/wangyiheng/vcamsx/utils/VideoProvider.kt`
- [Video preview](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/components/VideoPlayerDialog.kt): `app/src/main/java/com/wangyiheng/vcamsx/components/VideoPlayerDialog.kt`
- [Stream preview](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/components/LivePlayerDialog.kt): `app/src/main/java/com/wangyiheng/vcamsx/components/LivePlayerDialog.kt`
- [Media playback](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/utils/VideoPlayer.kt): `app/src/main/java/com/wangyiheng/vcamsx/utils/VideoPlayer.kt`

### Camera integration

- [Hook entry](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/MainHook.kt): `app/src/main/java/com/wangyiheng/vcamsx/MainHook.kt`
- [Camera hook manager](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/hooks/CameraHookManager.kt): `app/src/main/java/com/wangyiheng/vcamsx/hooks/CameraHookManager.kt`
- [Camera API one](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/camerahook/CameraOne.kt): `app/src/main/java/com/wangyiheng/vcamsx/camerahook/CameraOne.kt`
- [Camera API two](https://github.com/xiaobutiaoer/vcampro/blob/master/app/src/main/java/com/wangyiheng/vcamsx/camerahook/CameraTwo.kt): `app/src/main/java/com/wangyiheng/vcamsx/camerahook/CameraTwo.kt`

### Other components

- **User**
- **RTMP source**
- **Xposed runtime**
- **Target app**
- **Android camera APIs**
- **Public IP service**
- **Upload backend**

## Connections

- User → Main activity: opens
- Main activity → Home screen: hosts
- Home screen → Home controller: controls
- Home screen → Disclaimer dialog: displays
- Home screen → Info manager: selects video
- Home screen → Home controller: sets options
- Home controller → Info manager: loads and saves
- Info manager → Video settings: stores
- Info manager → Video selection: stores
- Home controller → IP upload API: uploads IP
- Home controller → Public IP service: reads public IP
- IP upload API → Upload backend: sends request
- Home screen → Video preview: opens preview
- Home screen → Stream preview: opens preview
- Home controller → Video provider: reads video
- Home controller → Media playback: plays stream
- RTMP source → Home controller: provides stream
- Xposed runtime → Hook entry: loads module
- Hook entry → Camera hook manager: initializes hooks
- Camera hook manager → Android camera APIs: hooks APIs
- Target app → Android camera APIs: requests camera
- Camera API one → Android camera APIs: intercepts
- Camera API two → Android camera APIs: intercepts
