# pppscn/smsforwarder architecture

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

- Interactive diagram: https://gitdiagram.com/pppscn/smsforwarder
- Repository: https://github.com/pppscn/smsforwarder

## Overview

SmsForwarder is an Android app for monitoring device events, applying forwarding rules, and delivering messages through configurable channels. Its other major capabilities are remote device control through a local HTTP server and client, and configurable automatic tasks. The graph preserves these distinct workflows and the persistence layer; several links are documented product flows, while unsampled implementation details are left unverified.

Main entry points: [`app/src/main/kotlin/cn/ppps/forwarder/workers/SendWorker.kt`](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/workers/SendWorker.kt) (Message dispatch), [`app/src/main/kotlin/cn/ppps/forwarder/database/repository`](https://github.com/pppscn/smsforwarder/tree/main/app/src/main/kotlin/cn/ppps/forwarder/database/repository) (Data repositories), [`app/src/main/kotlin/cn/ppps/forwarder/core/Core.kt`](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/core/Core.kt) (Repository access), [`app/src/main/kotlin/cn/ppps/forwarder/App.kt`](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/App.kt) (Application setup)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_capture["Event forwarding"]
  node_device_events["Device events"]
  node_receivers["Event receivers<br/>[SmsReceiver.kt]"]
  node_notification_service["Notification capture"]
  node_rules["Forwarding rules<br/>[Rule.kt]"]
  node_send_worker["Message dispatch<br/>[SendWorker.kt]"]
  node_senders["Delivery channels"]
end

subgraph group_tasks["Automatic tasks"]
  node_task_editor["Task editor"]
  node_task_scheduler["Task scheduling<br/>[TaskUtils.kt]"]
  node_task_actions["Task actions<br/>[ActionWorker.kt]"]
end

subgraph group_remote["Remote control"]
  node_client_ui["Remote client<br/>[ClientFragment.kt]"]
  node_http_server["HTTP server<br/>[HttpServerUtils.kt]"]
  node_api_controllers["Control endpoints"]
  node_device_services["Device operations<br/>[LocationService.kt]"]
end

subgraph group_data["Configuration data"]
  node_database[("App database<br/>[AppDatabase.kt]")]
  node_repositories["Data repositories"]
end

subgraph group_app["Android app"]
  node_app_entry["Application setup<br/>[App.kt]"]
  node_core["Repository access<br/>[Core.kt]"]
  node_ui["App screens<br/>[MainActivity.kt]"]
end

node_user(("Phone user"))
node_external_channels["Messaging services"]

node_user -->|"configures"| node_ui
node_device_events -.->|"triggers"| node_receivers
node_device_events -->|"triggers"| node_notification_service
node_receivers -->|"forwards events"| node_send_worker
node_notification_service -->|"dispatches"| node_send_worker
node_send_worker -->|"checks rules"| node_rules
node_send_worker -->|"delivers via"| node_senders
node_senders -->|"sends messages"| node_external_channels
node_user -->|"defines tasks"| node_task_editor
node_task_editor -.->|"schedules"| node_task_scheduler
node_task_scheduler -.->|"runs actions"| node_task_actions
node_user -->|"issues commands"| node_client_ui
node_client_ui -->|"sends requests"| node_http_server
node_http_server -->|"routes requests"| node_api_controllers
node_api_controllers -.->|"controls device"| node_device_services
node_app_entry -->|"initializes"| node_core
node_app_entry -->|"creates repositories"| node_repositories
node_core -->|"exposes"| node_repositories
node_repositories -.->|"accesses"| node_database
node_ui -.->|"uses data access"| node_core

click node_receivers "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/receiver/SmsReceiver.kt"
click node_notification_service "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/service/NotificationService.kt"
click node_rules "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/database/entity/Rule.kt"
click node_send_worker "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/workers/SendWorker.kt"
click node_senders "https://github.com/pppscn/smsforwarder/tree/main/app/src/main/kotlin/cn/ppps/forwarder/utils/sender"
click node_task_editor "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/fragment/TasksEditFragment.kt"
click node_task_scheduler "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/utils/task/TaskUtils.kt"
click node_task_actions "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/workers/ActionWorker.kt"
click node_client_ui "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/fragment/ClientFragment.kt"
click node_http_server "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/utils/HttpServerUtils.kt"
click node_api_controllers "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/server/controller/ContactController.kt"
click node_device_services "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/service/LocationService.kt"
click node_app_entry "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/App.kt"
click node_core "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/core/Core.kt"
click node_database "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/database/AppDatabase.kt"
click node_repositories "https://github.com/pppscn/smsforwarder/tree/main/app/src/main/kotlin/cn/ppps/forwarder/database/repository"
click node_ui "https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/activity/MainActivity.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_device_events,node_receivers,node_notification_service,node_rules,node_send_worker,node_senders,node_user toneBlue
class node_task_editor,node_task_scheduler,node_task_actions toneAmber
class node_client_ui,node_http_server,node_api_controllers,node_device_services toneMint
class node_database,node_repositories toneRose
class node_app_entry,node_core,node_ui,node_external_channels toneIndigo
```

## Components

### Event forwarding

- **Device events**
- [Event receivers](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/receiver/SmsReceiver.kt): `app/src/main/kotlin/cn/ppps/forwarder/receiver/SmsReceiver.kt`
- [Notification capture](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/service/NotificationService.kt): `app/src/main/kotlin/cn/ppps/forwarder/service/NotificationService.kt`
- [Forwarding rules](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/database/entity/Rule.kt): `app/src/main/kotlin/cn/ppps/forwarder/database/entity/Rule.kt`
- [Message dispatch](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/workers/SendWorker.kt): `app/src/main/kotlin/cn/ppps/forwarder/workers/SendWorker.kt`
- [Delivery channels](https://github.com/pppscn/smsforwarder/tree/main/app/src/main/kotlin/cn/ppps/forwarder/utils/sender): `app/src/main/kotlin/cn/ppps/forwarder/utils/sender`

### Automatic tasks

- [Task editor](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/fragment/TasksEditFragment.kt): `app/src/main/kotlin/cn/ppps/forwarder/fragment/TasksEditFragment.kt`
- [Task scheduling](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/utils/task/TaskUtils.kt): `app/src/main/kotlin/cn/ppps/forwarder/utils/task/TaskUtils.kt`
- [Task actions](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/workers/ActionWorker.kt): `app/src/main/kotlin/cn/ppps/forwarder/workers/ActionWorker.kt`

### Remote control

- [Remote client](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/fragment/ClientFragment.kt): `app/src/main/kotlin/cn/ppps/forwarder/fragment/ClientFragment.kt`
- [HTTP server](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/utils/HttpServerUtils.kt): `app/src/main/kotlin/cn/ppps/forwarder/utils/HttpServerUtils.kt`
- [Control endpoints](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/server/controller/ContactController.kt): `app/src/main/kotlin/cn/ppps/forwarder/server/controller/ContactController.kt`
- [Device operations](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/service/LocationService.kt): `app/src/main/kotlin/cn/ppps/forwarder/service/LocationService.kt`

### Configuration data

- [App database](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/database/AppDatabase.kt): `app/src/main/kotlin/cn/ppps/forwarder/database/AppDatabase.kt`
- [Data repositories](https://github.com/pppscn/smsforwarder/tree/main/app/src/main/kotlin/cn/ppps/forwarder/database/repository): `app/src/main/kotlin/cn/ppps/forwarder/database/repository`

### Android app

- [Application setup](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/App.kt): `app/src/main/kotlin/cn/ppps/forwarder/App.kt`
- [Repository access](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/core/Core.kt): `app/src/main/kotlin/cn/ppps/forwarder/core/Core.kt`
- [App screens](https://github.com/pppscn/smsforwarder/blob/main/app/src/main/kotlin/cn/ppps/forwarder/activity/MainActivity.kt): `app/src/main/kotlin/cn/ppps/forwarder/activity/MainActivity.kt`

### Other components

- **Phone user**
- **Messaging services**

## Connections

- Phone user → App screens: configures (evidence: `README.md`)
- Device events → Event receivers: triggers
- Device events → Notification capture: triggers (evidence: `README.md`)
- Event receivers → Message dispatch: forwards events (evidence: `README.md`)
- Notification capture → Message dispatch: dispatches (evidence: `app/src/main/kotlin/cn/ppps/forwarder/service/NotificationService.kt`)
- Message dispatch → Forwarding rules: checks rules (evidence: `README.md`)
- Message dispatch → Delivery channels: delivers via (evidence: `README.md`)
- Delivery channels → Messaging services: sends messages (evidence: `README.md`)
- Phone user → Task editor: defines tasks (evidence: `README.md`)
- Task editor → Task scheduling: schedules
- Task scheduling → Task actions: runs actions
- Phone user → Remote client: issues commands (evidence: `README.md`)
- Remote client → HTTP server: sends requests (evidence: `app/src/main/kotlin/cn/ppps/forwarder/fragment/ClientFragment.kt`)
- HTTP server → Control endpoints: routes requests (evidence: `README.md`)
- Control endpoints → Device operations: controls device
- Application setup → Repository access: initializes (evidence: `app/src/main/kotlin/cn/ppps/forwarder/App.kt`)
- Application setup → Data repositories: creates repositories (evidence: `app/src/main/kotlin/cn/ppps/forwarder/App.kt`)
- Repository access → Data repositories: exposes (evidence: `app/src/main/kotlin/cn/ppps/forwarder/core/Core.kt`)
- Data repositories → App database: accesses
- App screens → Repository access: uses data access
