# aistra0528/hail architecture

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

- Interactive diagram: https://gitdiagram.com/aistra0528/hail
- Repository: https://github.com/aistra0528/hail

## Overview

Hail is an Android app for managing whether installed apps are stopped, disabled, hidden, or suspended, and for restoring them later. Users find and select apps in Home, then freeze or unfreeze them through the configured working mode; the installed-apps screen also supports filtering and package actions. External intents and Quick Settings provide additional command entry points, while scheduled auto-freezing applies the same management logic subject to skip rules. The README documents privilege modes and API actions; the graph reflects sampled wiring and omits uncertain links for unsampled subsystems.

Main entry points: [`app/src/main/kotlin/com/aistra/hail/app/AppManager.kt`](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/app/AppManager.kt) (Freeze operations), [`app/src/main/kotlin/com/aistra/hail/app/HailData.kt`](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/app/HailData.kt) (App and mode state), [`app/src/main/kotlin/com/aistra/hail/ui/apps/AppsFragment.kt`](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/apps/AppsFragment.kt) (Installed apps), [`app/src/main/kotlin/com/aistra/hail/ui/api/ApiActivity.kt`](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/api/ApiActivity.kt) (Intent API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["User interface"]
  node_main["Main navigation<br/>[MainActivity.kt]"]
  node_home["Home app list<br/>[PagerFragment.kt]"]
  node_apps["Installed apps<br/>[AppsFragment.kt]"]
  node_settings["Settings"]
end

subgraph group_commands["Commands and automation"]
  node_api["Intent API<br/>[ApiActivity.kt]"]
  node_tile["Quick Settings<br/>[QSTileService.kt]"]
  node_auto_service["Auto-freeze service"]
  node_auto_worker["Auto-freeze worker"]
end

subgraph group_domain["App management"]
  node_data[("App and mode state<br/>[HailData.kt]")]
  node_manager["Freeze operations<br/>[AppManager.kt]"]
  node_app_info["App metadata<br/>[AppInfo.kt]"]
end

subgraph group_privileges["Privilege backends"]
  node_packages["Package utilities<br/>[HPackages.kt]"]
  node_policy["Device-owner mode<br/>[HPolicy.kt]"]
  node_shell["Root shell mode<br/>[HShell.kt]"]
  node_shizuku["Shizuku mode<br/>[HShizuku.kt]"]
  node_dhizuku["Dhizuku mode<br/>[HDhizuku.kt]"]
  node_island["Island mode<br/>[HIsland.kt]"]
end

node_user(("User"))
node_external(("External intents"))
node_android(("Android system"))

node_user -->|"opens"| node_main
node_main -->|"navigates"| node_home
node_main -->|"navigates"| node_apps
node_main -->|"navigates"| node_settings
node_user -->|"selects apps"| node_home
node_home -->|"reads and updates"| node_data
node_home -->|"requests freeze"| node_manager
node_user -->|"manages packages"| node_apps
node_apps -->|"updates selection"| node_data
node_apps -->|"queries packages"| node_packages
node_apps -->|"requests package actions"| node_manager
node_settings -->|"sets preferences"| node_data
node_external -->|"sends action"| node_api
node_api -->|"reads selections"| node_data
node_api -->|"dispatches operation"| node_manager
node_api -->|"launches app"| node_android
node_user -->|"taps tile"| node_tile
node_tile -->|"reads and updates"| node_data
node_tile -->|"starts action"| node_api
node_auto_service -->|"checks whitelist"| node_data
node_auto_service -->|"registers screen receiver"| node_android
node_auto_worker -->|"reads rules and list"| node_data
node_auto_worker -->|"freezes eligible apps"| node_manager
node_auto_worker -->|"checks device state"| node_android
node_manager -->|"selects working mode"| node_data
node_manager -->|"queries or changes state"| node_packages
node_manager -->|"dispatches owner mode"| node_policy
node_manager -->|"dispatches root mode"| node_shell
node_manager -->|"dispatches Shizuku mode"| node_shizuku
node_manager -->|"dispatches Dhizuku mode"| node_dhizuku
node_manager -->|"dispatches Island mode"| node_island
node_packages -->|"queries package manager"| node_android
node_policy -->|"changes app policy"| node_android
node_shell -->|"runs system commands"| node_android
node_shizuku -->|"runs privileged commands"| node_android
node_dhizuku -->|"requests app policy"| node_android
node_island -->|"changes app policy"| node_android

click node_main "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/main/MainActivity.kt"
click node_home "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/home/PagerFragment.kt"
click node_apps "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/apps/AppsFragment.kt"
click node_settings "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/settings/SettingsFragment.kt"
click node_api "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/api/ApiActivity.kt"
click node_tile "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/services/QSTileService.kt"
click node_auto_service "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/services/AutoFreezeService.kt"
click node_auto_worker "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/work/AutoFreezeWorker.kt"
click node_data "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/app/HailData.kt"
click node_manager "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/app/AppManager.kt"
click node_app_info "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/app/AppInfo.kt"
click node_packages "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HPackages.kt"
click node_policy "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HPolicy.kt"
click node_shell "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HShell.kt"
click node_shizuku "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HShizuku.kt"
click node_dhizuku "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HDhizuku.kt"
click node_island "https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HIsland.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_home,node_apps,node_settings,node_user toneBlue
class node_api,node_tile,node_auto_service,node_auto_worker toneAmber
class node_data,node_manager,node_app_info toneMint
class node_packages,node_policy,node_shell,node_shizuku,node_dhizuku,node_island toneRose
class node_external,node_android toneIndigo
```

## Components

### User interface

- [Main navigation](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/main/MainActivity.kt): `app/src/main/kotlin/com/aistra/hail/ui/main/MainActivity.kt`
- [Home app list](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/home/PagerFragment.kt): `app/src/main/kotlin/com/aistra/hail/ui/home/PagerFragment.kt`
- [Installed apps](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/apps/AppsFragment.kt): `app/src/main/kotlin/com/aistra/hail/ui/apps/AppsFragment.kt`
- [Settings](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/settings/SettingsFragment.kt): `app/src/main/kotlin/com/aistra/hail/ui/settings/SettingsFragment.kt`

### Commands and automation

- [Intent API](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/ui/api/ApiActivity.kt): `app/src/main/kotlin/com/aistra/hail/ui/api/ApiActivity.kt`
- [Quick Settings](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/services/QSTileService.kt): `app/src/main/kotlin/com/aistra/hail/services/QSTileService.kt`
- [Auto-freeze service](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/services/AutoFreezeService.kt): `app/src/main/kotlin/com/aistra/hail/services/AutoFreezeService.kt`
- [Auto-freeze worker](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/work/AutoFreezeWorker.kt): `app/src/main/kotlin/com/aistra/hail/work/AutoFreezeWorker.kt`

### App management

- [App and mode state](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/app/HailData.kt): `app/src/main/kotlin/com/aistra/hail/app/HailData.kt`
- [Freeze operations](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/app/AppManager.kt): `app/src/main/kotlin/com/aistra/hail/app/AppManager.kt`
- [App metadata](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/app/AppInfo.kt): `app/src/main/kotlin/com/aistra/hail/app/AppInfo.kt`

### Privilege backends

- [Package utilities](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HPackages.kt): `app/src/main/kotlin/com/aistra/hail/utils/HPackages.kt`
- [Device-owner mode](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HPolicy.kt): `app/src/main/kotlin/com/aistra/hail/utils/HPolicy.kt`
- [Root shell mode](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HShell.kt): `app/src/main/kotlin/com/aistra/hail/utils/HShell.kt`
- [Shizuku mode](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HShizuku.kt): `app/src/main/kotlin/com/aistra/hail/utils/HShizuku.kt`
- [Dhizuku mode](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HDhizuku.kt): `app/src/main/kotlin/com/aistra/hail/utils/HDhizuku.kt`
- [Island mode](https://github.com/aistra0528/hail/blob/main/app/src/main/kotlin/com/aistra/hail/utils/HIsland.kt): `app/src/main/kotlin/com/aistra/hail/utils/HIsland.kt`

### Other components

- **User**
- **External intents**
- **Android system**

## Connections

- User → Main navigation: opens
- Main navigation → Home app list: navigates
- Main navigation → Installed apps: navigates
- Main navigation → Settings: navigates
- User → Home app list: selects apps
- Home app list → App and mode state: reads and updates
- Home app list → Freeze operations: requests freeze
- User → Installed apps: manages packages
- Installed apps → App and mode state: updates selection
- Installed apps → Package utilities: queries packages
- Installed apps → Freeze operations: requests package actions
- Settings → App and mode state: sets preferences
- External intents → Intent API: sends action
- Intent API → App and mode state: reads selections
- Intent API → Freeze operations: dispatches operation
- Intent API → Android system: launches app
- User → Quick Settings: taps tile
- Quick Settings → App and mode state: reads and updates
- Quick Settings → Intent API: starts action
- Auto-freeze service → App and mode state: checks whitelist
- Auto-freeze service → Android system: registers screen receiver
- Auto-freeze worker → App and mode state: reads rules and list
- Auto-freeze worker → Freeze operations: freezes eligible apps
- Auto-freeze worker → Android system: checks device state
- Freeze operations → App and mode state: selects working mode
- Freeze operations → Package utilities: queries or changes state
- Freeze operations → Device-owner mode: dispatches owner mode
- Freeze operations → Root shell mode: dispatches root mode
- Freeze operations → Shizuku mode: dispatches Shizuku mode
- Freeze operations → Dhizuku mode: dispatches Dhizuku mode
- Freeze operations → Island mode: dispatches Island mode
- Package utilities → Android system: queries package manager
- Device-owner mode → Android system: changes app policy
- Root shell mode → Android system: runs system commands
- Shizuku mode → Android system: runs privileged commands
- Dhizuku mode → Android system: requests app policy
- Island mode → Android system: changes app policy
