# inckie/anotherglass architecture

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

- Interactive diagram: https://gitdiagram.com/inckie/anotherglass
- Repository: https://github.com/inckie/anotherglass

## Overview

AnotherGlass is a phone companion and Google Glass client system. The phone starts a background host service; Glass connects over Wi-Fi (or Bluetooth on Explorer Edition), after which GPS, notifications, media state, and device status are exchanged, with Glass media controls sent back to the phone. Separate Glass applications implement Explorer and Enterprise experiences. The graph preserves the documented feature branches; some UI and transport wiring is inferred only from README descriptions, so those edges are dashed where source evidence was not sampled.

Main entry points: [`mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt`](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt) (Phone host service), [`glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`](https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java) (Explorer service), [`glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt`](https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt) (Enterprise service), [`glass-shared/src/main/java/com/damn/glass/shared/media/MediaController.kt`](https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/media/MediaController.kt) (Media controller)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_phone["Phone companion"]
  node_mobileui["Companion UI<br/>[MainScreen.kt]"]
  node_servicecontroller["Service controller"]
  node_phonehost["Phone host service<br/>[GlassService.kt]"]
  node_gpsphone["GPS extension<br/>[GPSExtension.kt]"]
  node_mediaphone["Media extension<br/>[MediaExtension.kt]"]
  node_notifservice["Notification listener"]
  node_notifphone["Notification extension"]
end

subgraph group_glass["Glass clients"]
  node_xeclient["Explorer service<br/>[HostService.java]"]
  node_btclient["Bluetooth client"]
  node_eeclient["Enterprise service<br/>[HostService.kt]"]
  node_tiltwake["Tilt to wake"]
end

subgraph group_shared["Shared protocol"]
  node_rpc["RPC messages<br/>[RPCMessage.java]"]
  node_wificlient["Wi-Fi transport<br/>[WiFiClient.kt]"]
  node_locationdata["Location data<br/>[Location.java]"]
  node_notificationdata["Notification data"]
  node_mediadata["Media state and commands<br/>[MediaStateData.kt]"]
end

subgraph group_features["Glass features"]
  node_gps["Mock GPS<br/>[MockGPS.java]"]
  node_mediacontroller["Media controller<br/>[MediaController.kt]"]
  node_notifcontroller["Notification controller"]
  node_xe_media["Media timeline card"]
  node_xe_notifications["Notification cards"]
  node_ee_media["Enterprise media UI<br/>[MediaCard.kt]"]
  node_ee_notifications["Enterprise notifications UI"]
end

subgraph group_notifyui["Notification management"]
  node_filterui["Filter screens"]
  node_historyui["History screens"]
  node_filterdata["Filter and history<br/>[Filter.kt]"]
end

node_user(("Phone user"))

node_user -.->|"configures"| node_mobileui
node_mobileui -.->|"controls service"| node_servicecontroller
node_servicecontroller -->|"starts and binds"| node_phonehost
node_phonehost -->|"starts and stops"| node_gpsphone
node_phonehost -->|"starts and stops"| node_mediaphone
node_phonehost -->|"starts and stops"| node_notifphone
node_notifservice -->|"records events"| node_filterdata
node_filterui -.->|"edits filters"| node_filterdata
node_historyui -.->|"reads history"| node_filterdata
node_phonehost -.->|"uses transport"| node_wificlient
node_phonehost -->|"sends messages"| node_rpc
node_phonehost -.->|"serves Glass"| node_xeclient
node_phonehost -.->|"serves Glass"| node_eeclient
node_xeclient -->|"selects Bluetooth"| node_btclient
node_xeclient -->|"selects Wi-Fi"| node_wificlient
node_eeclient -->|"connects over Wi-Fi"| node_wificlient
node_xeclient -->|"publishes location"| node_gps
node_eeclient -->|"publishes location"| node_gps
node_xeclient -->|"updates card"| node_xe_media
node_xeclient -->|"updates cards"| node_xe_notifications
node_eeclient -.->|"shows media"| node_ee_media
node_eeclient -->|"presents alerts"| node_ee_notifications
node_eeclient -.->|"supports tilt wake"| node_tiltwake
node_mediaphone -.->|"exchanges state"| node_mediadata
node_mediacontroller -->|"forwards commands"| node_mediadata
node_notifservice -->|"converts events"| node_notificationdata
node_notifcontroller -->|"tracks updates"| node_notificationdata
node_xeclient -->|"receives location"| node_locationdata
node_eeclient -->|"receives location"| node_locationdata
node_phonehost -.->|"sends GPS"| node_locationdata
node_phonehost -.->|"forwards notifications"| node_notificationdata
node_phonehost -.->|"mirrors media"| node_mediadata
node_xeclient -->|"handles playback"| node_mediacontroller
node_eeclient -->|"handles playback"| node_mediacontroller

click node_mobileui "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/ui/mainscreen/MainScreen.kt"
click node_servicecontroller "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/ui/mainscreen/ServiceController.kt"
click node_phonehost "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt"
click node_gpsphone "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/GPSExtension.kt"
click node_mediaphone "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/media/MediaExtension.kt"
click node_notifservice "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/notifications/NotificationService.kt"
click node_notifphone "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/notifications/NotificationExtension.kt"
click node_filterui "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/ui/notifications/filters/FilterListScreen.kt"
click node_historyui "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/ui/notifications/history/NotificationHistoryScreen.kt"
click node_filterdata "https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/notifications/filter/Filter.kt"
click node_xeclient "https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java"
click node_btclient "https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/bluetooth/BluetoothClient.java"
click node_eeclient "https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt"
click node_tiltwake "https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/tiltawake/TiltToWakeService.kt"
click node_rpc "https://github.com/inckie/anotherglass/blob/master/shared/src/main/java/com/damn/anotherglass/shared/rpc/RPCMessage.java"
click node_wificlient "https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/rpc/WiFiClient.kt"
click node_gps "https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/gps/MockGPS.java"
click node_mediacontroller "https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/media/MediaController.kt"
click node_notifcontroller "https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/notifications/NotificationController.kt"
click node_xe_media "https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/media/MediaCardController.kt"
click node_xe_notifications "https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/notifications/NotificationsCardController.java"
click node_ee_media "https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/ui/cards/MediaCard.kt"
click node_ee_notifications "https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/NotificationNotifier.kt"
click node_locationdata "https://github.com/inckie/anotherglass/blob/master/shared/src/main/java/com/damn/anotherglass/shared/gps/Location.java"
click node_notificationdata "https://github.com/inckie/anotherglass/blob/master/shared/src/main/java/com/damn/anotherglass/shared/notifications/NotificationData.java"
click node_mediadata "https://github.com/inckie/anotherglass/blob/master/shared/src/main/java/com/damn/anotherglass/shared/media/MediaStateData.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_mobileui,node_servicecontroller,node_phonehost,node_gpsphone,node_mediaphone,node_notifservice,node_notifphone,node_user toneBlue
class node_xeclient,node_btclient,node_eeclient,node_tiltwake toneAmber
class node_rpc,node_wificlient,node_locationdata,node_notificationdata,node_mediadata toneMint
class node_gps,node_mediacontroller,node_notifcontroller,node_xe_media,node_xe_notifications,node_ee_media,node_ee_notifications toneRose
class node_filterui,node_historyui,node_filterdata toneIndigo
```

## Components

### Phone companion

- [Companion UI](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/ui/mainscreen/MainScreen.kt): `mobile/src/main/java/com/damn/anotherglass/ui/mainscreen/MainScreen.kt`
- [Service controller](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/ui/mainscreen/ServiceController.kt): `mobile/src/main/java/com/damn/anotherglass/ui/mainscreen/ServiceController.kt`
- [Phone host service](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt): `mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt`
- [GPS extension](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/GPSExtension.kt): `mobile/src/main/java/com/damn/anotherglass/extensions/GPSExtension.kt`
- [Media extension](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/media/MediaExtension.kt): `mobile/src/main/java/com/damn/anotherglass/extensions/media/MediaExtension.kt`
- [Notification listener](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/notifications/NotificationService.kt): `mobile/src/main/java/com/damn/anotherglass/extensions/notifications/NotificationService.kt`
- [Notification extension](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/notifications/NotificationExtension.kt): `mobile/src/main/java/com/damn/anotherglass/extensions/notifications/NotificationExtension.kt`

### Glass clients

- [Explorer service](https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java): `glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`
- [Bluetooth client](https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/bluetooth/BluetoothClient.java): `glass-xe/src/main/java/com/damn/anotherglass/glass/host/bluetooth/BluetoothClient.java`
- [Enterprise service](https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt): `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt`
- [Tilt to wake](https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/tiltawake/TiltToWakeService.kt): `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/tiltawake/TiltToWakeService.kt`

### Shared protocol

- [RPC messages](https://github.com/inckie/anotherglass/blob/master/shared/src/main/java/com/damn/anotherglass/shared/rpc/RPCMessage.java): `shared/src/main/java/com/damn/anotherglass/shared/rpc/RPCMessage.java`
- [Wi-Fi transport](https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/rpc/WiFiClient.kt): `glass-shared/src/main/java/com/damn/glass/shared/rpc/WiFiClient.kt`
- [Location data](https://github.com/inckie/anotherglass/blob/master/shared/src/main/java/com/damn/anotherglass/shared/gps/Location.java): `shared/src/main/java/com/damn/anotherglass/shared/gps/Location.java`
- [Notification data](https://github.com/inckie/anotherglass/blob/master/shared/src/main/java/com/damn/anotherglass/shared/notifications/NotificationData.java): `shared/src/main/java/com/damn/anotherglass/shared/notifications/NotificationData.java`
- [Media state and commands](https://github.com/inckie/anotherglass/blob/master/shared/src/main/java/com/damn/anotherglass/shared/media/MediaStateData.kt): `shared/src/main/java/com/damn/anotherglass/shared/media/MediaStateData.kt`

### Glass features

- [Mock GPS](https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/gps/MockGPS.java): `glass-shared/src/main/java/com/damn/glass/shared/gps/MockGPS.java`
- [Media controller](https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/media/MediaController.kt): `glass-shared/src/main/java/com/damn/glass/shared/media/MediaController.kt`
- [Notification controller](https://github.com/inckie/anotherglass/blob/master/glass-shared/src/main/java/com/damn/glass/shared/notifications/NotificationController.kt): `glass-shared/src/main/java/com/damn/glass/shared/notifications/NotificationController.kt`
- [Media timeline card](https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/media/MediaCardController.kt): `glass-xe/src/main/java/com/damn/anotherglass/glass/host/media/MediaCardController.kt`
- [Notification cards](https://github.com/inckie/anotherglass/blob/master/glass-xe/src/main/java/com/damn/anotherglass/glass/host/notifications/NotificationsCardController.java): `glass-xe/src/main/java/com/damn/anotherglass/glass/host/notifications/NotificationsCardController.java`
- [Enterprise media UI](https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/ui/cards/MediaCard.kt): `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/ui/cards/MediaCard.kt`
- [Enterprise notifications UI](https://github.com/inckie/anotherglass/blob/master/glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/NotificationNotifier.kt): `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/NotificationNotifier.kt`

### Notification management

- [Filter screens](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/ui/notifications/filters/FilterListScreen.kt): `mobile/src/main/java/com/damn/anotherglass/ui/notifications/filters/FilterListScreen.kt`
- [History screens](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/ui/notifications/history/NotificationHistoryScreen.kt): `mobile/src/main/java/com/damn/anotherglass/ui/notifications/history/NotificationHistoryScreen.kt`
- [Filter and history](https://github.com/inckie/anotherglass/blob/master/mobile/src/main/java/com/damn/anotherglass/extensions/notifications/filter/Filter.kt): `mobile/src/main/java/com/damn/anotherglass/extensions/notifications/filter/Filter.kt`

### Other components

- **Phone user**

## Connections

- Phone user → Companion UI: configures
- Companion UI → Service controller: controls service
- Service controller → Phone host service: starts and binds (evidence: `mobile/src/main/java/com/damn/anotherglass/ui/mainscreen/ServiceController.kt`)
- Phone host service → GPS extension: starts and stops (evidence: `mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt`)
- Phone host service → Media extension: starts and stops (evidence: `mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt`)
- Phone host service → Notification extension: starts and stops (evidence: `mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt`)
- Notification listener → Filter and history: records events (evidence: `mobile/src/main/java/com/damn/anotherglass/extensions/notifications/NotificationService.kt`)
- Filter screens → Filter and history: edits filters
- History screens → Filter and history: reads history
- Phone host service → Wi-Fi transport: uses transport
- Phone host service → RPC messages: sends messages (evidence: `mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt`)
- Phone host service → Explorer service: serves Glass
- Phone host service → Enterprise service: serves Glass
- Explorer service → Bluetooth client: selects Bluetooth (evidence: `glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`)
- Explorer service → Wi-Fi transport: selects Wi-Fi (evidence: `glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`)
- Enterprise service → Wi-Fi transport: connects over Wi-Fi (evidence: `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt`)
- Explorer service → Mock GPS: publishes location (evidence: `glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`)
- Enterprise service → Mock GPS: publishes location (evidence: `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt`)
- Explorer service → Media timeline card: updates card (evidence: `glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`)
- Explorer service → Notification cards: updates cards (evidence: `glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`)
- Enterprise service → Enterprise media UI: shows media
- Enterprise service → Enterprise notifications UI: presents alerts (evidence: `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt`)
- Enterprise service → Tilt to wake: supports tilt wake
- Media extension → Media state and commands: exchanges state
- Media controller → Media state and commands: forwards commands (evidence: `glass-shared/src/main/java/com/damn/glass/shared/media/MediaController.kt`)
- Notification listener → Notification data: converts events (evidence: `mobile/src/main/java/com/damn/anotherglass/extensions/notifications/NotificationService.kt`)
- Notification controller → Notification data: tracks updates (evidence: `glass-shared/src/main/java/com/damn/glass/shared/notifications/NotificationController.kt`)
- Explorer service → Location data: receives location (evidence: `glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`)
- Enterprise service → Location data: receives location (evidence: `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt`)
- Phone host service → Location data: sends GPS
- Phone host service → Notification data: forwards notifications
- Phone host service → Media state and commands: mirrors media (evidence: `mobile/src/main/java/com/damn/anotherglass/core/GlassService.kt`)
- Explorer service → Media controller: handles playback (evidence: `glass-xe/src/main/java/com/damn/anotherglass/glass/host/HostService.java`)
- Enterprise service → Media controller: handles playback (evidence: `glass-ee/src/main/java/com/damn/anotherglass/glass/ee/host/core/HostService.kt`)
