Files
fksar/docs/thijooree/00-app-overview.md
T
2026-05-30 19:33:15 +05:00

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 NavHostFragment and NavController
  • The DrawerLayout and NavigationView
  • 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