# catimaloyalty/android architecture

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

- Interactive diagram: https://gitdiagram.com/catimaloyalty/android
- Repository: https://github.com/catimaloyalty/android

## Overview

Catima is an offline Android loyalty- and membership-card manager. The primary workflow is to add or scan a card, keep it on-device, then find and display it for use; the app also supports card images, grouping, pkpass and other-format import/export, and smartwatch access. The graph includes the Wear OS companion and its Bluetooth sync path. Some app entry-point and import details are represented from the README and file tree only; unsampled implementation links are omitted or marked unverified.

Main entry points: [`app/src/main/java/protect/card_locker/ImportExportActivity.kt`](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/ImportExportActivity.kt) (Import and export UI), [`app/src/main/java/protect/card_locker/wearos/BluetoothServerService.kt`](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/wearos/BluetoothServerService.kt) (Bluetooth server), [`wear/src/main/java/me/hackerchick/catima/wear/MainActivity.kt`](https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/MainActivity.kt) (Wear app), [`wear/src/main/java/me/hackerchick/catima/wear/BluetoothCardClient.kt`](https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/BluetoothCardClient.kt) (Watch sync client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_phone["Android app"]
  node_main["Card library<br/>[MainActivity.kt]"]
  node_scanner["Barcode scanner<br/>[ScanActivity.kt]"]
  node_parser["Barcode parsing<br/>[Utils.java]"]
  node_editor["Card editor"]
  node_viewer["Card display"]
  node_groups["Group management"]
  node_settings["App settings<br/>[Settings.java]"]
end

subgraph group_carddata["Card data"]
  node_cardmodel["Card model<br/>[LoyaltyCard.java]"]
  node_database[("Card database<br/>[DBHelper.java]")]
end

subgraph group_exchange["Import and export"]
  node_importactivity["Import and export UI"]
  node_pkpass["Pass parser<br/>[PkpassParser.kt]"]
  node_importers["Format importers"]
  node_exporters["Format exporters"]
end

subgraph group_wearlink["Watch sync"]
  node_bluetooth["Bluetooth server"]
  node_security["Device trust"]
  node_protocol["Sync protocol"]
end

subgraph group_wearapp["Wear OS app"]
  node_watch["Wear app<br/>[MainActivity.kt]"]
  node_watchclient["Watch sync client"]
  node_watchrepo["Watch card repository"]
  node_watchstore[("Watch card store<br/>[WearCardStore.kt]")]
  node_watchlist["Watch card screens<br/>[CardListScreen.kt]"]
end

node_person(("Card holder"))

node_person -->|"manages cards"| node_main
node_person -->|"scans barcode"| node_scanner
node_scanner -.->|"reads barcode"| node_parser
node_person -.->|"edits card"| node_editor
node_main -.->|"opens card"| node_viewer
node_viewer -->|"loads card"| node_database
node_database -->|"loads card data"| node_cardmodel
node_person -.->|"organizes cards"| node_groups
node_person -->|"imports or exports"| node_importactivity
node_importactivity -->|"accepts pkpass"| node_pkpass
node_importactivity -->|"imports formats"| node_importers
node_importactivity -.->|"exports cards"| node_exporters
node_person -->|"uses watch cards"| node_watch
node_watch -->|"starts sync"| node_watchclient
node_watchclient -->|"uses protocol"| node_protocol
node_watchclient -.->|"syncs cards"| node_bluetooth
node_bluetooth -->|"dispatches commands"| node_protocol
node_bluetooth -->|"checks trust"| node_security
node_bluetooth -->|"reads cards"| node_database
node_watch -->|"uses repository"| node_watchrepo
node_watchrepo -->|"stores cards"| node_watchstore
node_watch -->|"shows cards"| node_watchlist
node_person -.->|"configures app"| node_settings

click node_main "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/MainActivity.kt"
click node_scanner "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/ScanActivity.kt"
click node_parser "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/Utils.java"
click node_editor "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java"
click node_viewer "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/cardview/LoyaltyCardViewActivity.java"
click node_groups "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/ManageGroupsActivity.kt"
click node_cardmodel "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/LoyaltyCard.java"
click node_database "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/DBHelper.java"
click node_settings "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/preferences/Settings.java"
click node_importactivity "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/ImportExportActivity.kt"
click node_pkpass "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/PkpassParser.kt"
click node_importers "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java"
click node_exporters "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java"
click node_bluetooth "https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/wearos/BluetoothServerService.kt"
click node_security "https://github.com/catimaloyalty/android/blob/main/shared/src/main/java/protect/card_locker/shared/WearBluetoothSecurity.kt"
click node_protocol "https://github.com/catimaloyalty/android/blob/main/shared/src/main/java/protect/card_locker/shared/WearBluetoothProtocol.kt"
click node_watch "https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/MainActivity.kt"
click node_watchclient "https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/BluetoothCardClient.kt"
click node_watchrepo "https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/WearCardRepository.kt"
click node_watchstore "https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/WearCardStore.kt"
click node_watchlist "https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/ui/CardListScreen.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_scanner,node_parser,node_editor,node_viewer,node_groups,node_settings toneBlue
class node_cardmodel,node_database toneAmber
class node_importactivity,node_pkpass,node_importers,node_exporters toneMint
class node_bluetooth,node_security,node_protocol toneRose
class node_watch,node_watchclient,node_watchrepo,node_watchstore,node_watchlist,node_person toneIndigo
```

## Components

### Android app

- [Card library](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/MainActivity.kt): `app/src/main/java/protect/card_locker/MainActivity.kt`
- [Barcode scanner](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/ScanActivity.kt): `app/src/main/java/protect/card_locker/ScanActivity.kt`
- [Barcode parsing](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/Utils.java): `app/src/main/java/protect/card_locker/Utils.java`
- [Card editor](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java): `app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java`
- [Card display](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/cardview/LoyaltyCardViewActivity.java): `app/src/main/java/protect/card_locker/cardview/LoyaltyCardViewActivity.java`
- [Group management](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/ManageGroupsActivity.kt): `app/src/main/java/protect/card_locker/ManageGroupsActivity.kt`
- [App settings](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/preferences/Settings.java): `app/src/main/java/protect/card_locker/preferences/Settings.java`

### Card data

- [Card model](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/LoyaltyCard.java): `app/src/main/java/protect/card_locker/LoyaltyCard.java`
- [Card database](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/DBHelper.java): `app/src/main/java/protect/card_locker/DBHelper.java`

### Import and export

- [Import and export UI](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/ImportExportActivity.kt): `app/src/main/java/protect/card_locker/ImportExportActivity.kt`
- [Pass parser](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/PkpassParser.kt): `app/src/main/java/protect/card_locker/PkpassParser.kt`
- [Format importers](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java): `app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java`
- [Format exporters](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java): `app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java`

### Watch sync

- [Bluetooth server](https://github.com/catimaloyalty/android/blob/main/app/src/main/java/protect/card_locker/wearos/BluetoothServerService.kt): `app/src/main/java/protect/card_locker/wearos/BluetoothServerService.kt`
- [Device trust](https://github.com/catimaloyalty/android/blob/main/shared/src/main/java/protect/card_locker/shared/WearBluetoothSecurity.kt): `shared/src/main/java/protect/card_locker/shared/WearBluetoothSecurity.kt`
- [Sync protocol](https://github.com/catimaloyalty/android/blob/main/shared/src/main/java/protect/card_locker/shared/WearBluetoothProtocol.kt): `shared/src/main/java/protect/card_locker/shared/WearBluetoothProtocol.kt`

### Wear OS app

- [Wear app](https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/MainActivity.kt): `wear/src/main/java/me/hackerchick/catima/wear/MainActivity.kt`
- [Watch sync client](https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/BluetoothCardClient.kt): `wear/src/main/java/me/hackerchick/catima/wear/BluetoothCardClient.kt`
- [Watch card repository](https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/WearCardRepository.kt): `wear/src/main/java/me/hackerchick/catima/wear/WearCardRepository.kt`
- [Watch card store](https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/WearCardStore.kt): `wear/src/main/java/me/hackerchick/catima/wear/WearCardStore.kt`
- [Watch card screens](https://github.com/catimaloyalty/android/blob/main/wear/src/main/java/me/hackerchick/catima/wear/ui/CardListScreen.kt): `wear/src/main/java/me/hackerchick/catima/wear/ui/CardListScreen.kt`

### Other components

- **Card holder**

## Connections

- Card holder → Card library: manages cards
- Card holder → Barcode scanner: scans barcode
- Barcode scanner → Barcode parsing: reads barcode
- Card holder → Card editor: edits card
- Card library → Card display: opens card
- Card display → Card database: loads card (evidence: `app/src/main/java/protect/card_locker/cardview/LoyaltyCardViewActivity.java`)
- Card database → Card model: loads card data (evidence: `app/src/main/java/protect/card_locker/DBHelper.java`)
- Card holder → Group management: organizes cards
- Card holder → Import and export UI: imports or exports
- Import and export UI → Pass parser: accepts pkpass
- Import and export UI → Format importers: imports formats
- Import and export UI → Format exporters: exports cards
- Card holder → Wear app: uses watch cards
- Wear app → Watch sync client: starts sync (evidence: `wear/src/main/java/me/hackerchick/catima/wear/MainActivity.kt`)
- Watch sync client → Sync protocol: uses protocol (evidence: `wear/src/main/java/me/hackerchick/catima/wear/BluetoothCardClient.kt`)
- Watch sync client → Bluetooth server: syncs cards
- Bluetooth server → Sync protocol: dispatches commands (evidence: `app/src/main/java/protect/card_locker/wearos/BluetoothServerService.kt`)
- Bluetooth server → Device trust: checks trust (evidence: `app/src/main/java/protect/card_locker/wearos/BluetoothServerService.kt`)
- Bluetooth server → Card database: reads cards (evidence: `app/src/main/java/protect/card_locker/wearos/BluetoothServerService.kt`)
- Wear app → Watch card repository: uses repository (evidence: `wear/src/main/java/me/hackerchick/catima/wear/MainActivity.kt`)
- Watch card repository → Watch card store: stores cards (evidence: `wear/src/main/java/me/hackerchick/catima/wear/WearCardRepository.kt`)
- Wear app → Watch card screens: shows cards (evidence: `wear/src/main/java/me/hackerchick/catima/wear/MainActivity.kt`)
- Card holder → App settings: configures app
