4.8 KiB
App Overview
Architecture overview of the app's entry point, main container, navigation system, and global session lifecycle.
Entry Point — MainActivity
MainActivity is a transparent trampoline activity. On onCreate it reads app state and immediately forwards to the correct destination with no visible UI of its own:
| Condition | Destination |
|---|---|
| Onboarding not done | OnboardingActivity |
| No saved credentials | LoginActivity |
| Security lock configured | LockActivity |
| All checks pass | HomeActivity |
Intent Actions
External intents (from NFC, shortcuts, or notifications) are passed through to HomeActivity via the same forwarding intent:
| Action | Effect |
|---|---|
OPEN_TRANSFER |
Opens transfer screen |
OPEN_SCAN_QR |
Opens QR scanner |
OPEN_PAY_WITH_CARD |
Opens BML card QR payment |
TAP_TO_PAY |
Opens BML tap-to-pay NFC flow |
BmlTapToPayActivity is a dedicated NFC entry point registered in the manifest. It immediately re-fires a TAP_TO_PAY intent to MainActivity and finishes.
Main Container — HomeActivity
HomeActivity is the persistent shell containing all in-app screens. It owns:
- The
NavHostFragmentandNavController - The
DrawerLayoutandNavigationView - The
BottomNavigationView - The toolbar (lock icon + hide-amounts eye icon)
- The connectivity banner
- The autolock timer
- The MIB session keepAlive scheduler
Toolbar
| Icon | Behavior |
|---|---|
| Lock icon | Immediately locks the app → LockActivity (animated with scale + alpha) |
| Eye icon | Toggles hideAmounts in HomeViewModel; all balance displays redact to •••• |
Auto-refresh
On launch and after unlock HomeActivity.autoRefresh() fires parallel login refresh calls for all banks with active sessions. Each bank runs independently — a failure in one bank does not block the others.
Connectivity Banner
A persistent banner appears at the top of HomeActivity when network connectivity is lost. It disappears automatically when connectivity is restored. Per-bank connectivity errors (e.g., session expired) are surfaced via HomeViewModel.connectivityErrors.
Navigation Modes
The user can choose between two navigation modes in Settings → Appearance:
Drawer (default)
A slide-out navigation drawer containing up to 10 configurable nav items. The hamburger icon in the toolbar opens it.
Bottom Navigation
A bottom bar with 3 configurable slots plus a fixed Dashboard tab (always leftmost) and a More tab (always rightmost). Tapping More opens NavMoreSheetFragment — a bottom sheet listing all items not assigned to the 3 visible slots.
Navigation Slots
10 possible navigation destinations can be assigned to slots. The user reorders them via drag-and-drop in Settings → Appearance.
| Destination | Default slot |
|---|---|
| Accounts | 1 |
| Transfer | 2 |
| Activities | 3 |
| Contacts | 4 |
| Financing | 5 |
| OTP | 6 |
| PayMV QR | 7 |
| BML QR Pay | 8 |
| Transfer History | 9 |
| Settings | 10 |
Two Quick Action slots appear as FAB-style buttons on the dashboard and are independently configurable.
Autolock
Autolock fires after a configurable period of user inactivity. Any touch event resets the timer.
| Timeout option |
|---|
| 30 seconds |
| 1 minute |
| 3 minutes |
| 5 minutes |
| Never |
When the timeout expires a 10-second countdown warning dialog appears. If dismissed, the timer resets. If ignored, the app calls LockActivity and clears app.isUnlocked.
Global State — BasedBankApp
BasedBankApp holds all in-memory session data. Nothing is stored to disk except encrypted credentials.
| Field | Description |
|---|---|
isUnlocked |
Set to true after successful lock-screen auth; guards against process-restart bypass |
mibSessions |
Map of MIB profile ID → active session (cookies + DH key) |
bmlSessions |
Map of BML profile ID → OAuth token pair |
fahipaySessions |
Map of Fahipay login ID → authID + session cookie |
mibLoginFlows |
Active MibLoginFlow instances per profile |
bmlLoginFlows |
Active BmlLoginFlow instances per profile |
mibMutex |
Coroutine mutex — serializes all MIB API calls to prevent session corruption |
Profile Visibility
Each stored profile has a visibility flag. Hidden profiles are excluded from the accounts list and from all API refresh cycles until re-enabled in Settings → Logins.
MIB Session KeepAlive
MIB web sessions expire after approximately 30 seconds of inactivity. HomeActivity schedules a coroutine that calls the MIB keepAlive endpoint every 25 seconds for each active MIB session while the app is in the foreground.
← README Next → Onboarding