Tasks · T7
Enable mobile app
Install the mobile app development environment, clone the project, and configure it against the app backend.
Setup notes
Repository and runtime
- Local reference reviewed: ips-lacpass-app.
- Required tooling: Flutter SDK >= 3.32.1, Dart SDK >= 3.8.1, Android Studio or Xcode, and a device or emulator.
- For Android, Java 17 is required.
- Use flutter doctor before setup to confirm the local environment is ready.
flutter doctor
cp .env.sample .env
flutter pub get
flutter gen-l10n
flutter runMobile app environment checklist
- API_ENDPOINT points to the IPS Lacpass backend. For Android emulator local backend access, use http://10.0.2.2:9081.
- KEYCLOAK_ENDPOINT points to Keycloak. For Android emulator local Keycloak access, use http://10.0.2.2:9083.
- KEYCLOAK_REALM, KEYCLOAK_CLIENT_ID, and KEYCLOAK_REFRESH_TOKEN_KEY must match the backend Keycloak setup.
- USE_HTTP=1 allows non-HTTPS endpoints for local/domainless testing. Do not use HTTP in production.
- DEBUG_MODE=1 enables backend request inspection in the app.
- IPS_EXP_DAYS controls how long fetched IPS bundles remain in device storage; VHL_EXPIRATION_DAYS controls generated QR expiry.
- SHOW_WALLET=1 enables wallet UI; USE_MULTIPLE_NODES=1 enables multiple-node behavior when configured.
Participant-facing features to verify
- Login and sign-up through OAuth/Keycloak.
- Load IPS from national backend and display it in the IPS viewer.
- Select IPS resources and generate VHL QR.
- Display/share QR code.
- List ICVP records and generate per-immunization QR.
- Medication Overview tab and per-medication QR generation.
- Scan QR flows are present in the app; verify them against the backend and validator services during country setup.
Customization points
- Replace assets/icon/logo.png with a 512x512 PNG, then run dart run flutter_launcher_icons.
- Replace assets/image/landing_bg.png to customize the landing screen.
- Use Material Theme Builder and replace lib/styles/color_theme.dart for theme changes.
- Add locales under lib/l10n with app_<locale>.arb, run flutter gen-l10n, then register the language in lib/models/language_type.dart.
- Update country options and validation regexes in lib/constants.dart.
dart run flutter_launcher_icons
flutter gen-l10nTest and build commands
- The repository includes mocked integration fixtures, so basic tests do not require the backend.
- Patrol Android tests can be run on an emulator/device for UI flows.
- Use the artifact wrapper when investigating flaky Android Patrol failures; artifacts are stored under build/patrol_artifacts/<timestamp>/.
flutter analyze
flutter test integration_test/test_bundle.dart
flutter pub global activate patrol_cli
patrol test --target integration_test/test_bundle.dart
patrol test
./scripts/run_patrol_with_artifacts.sh
flutter build apk
flutter build apk --release
flutter build ios
flutter build ipa --releaseRequirements
High priority tracking task
Links
Expected response
Mobile app installed on an emulator or smartphone, able to log in, communicate with AppBackend, and display IPS associated with the logged-in patient.
Evidence
Screenshots and flow.
Observations
Countries may use the PH4H app, a customized version, or another app that fulfills the required track operations.
Requests to run
Collection
App Backend - Lacpass App API
Get IPS Bundle with valid VHL QR
curl -X POST "${APP_BACKEND_URL}/qr/fetch" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-d '{"data":"${QR_CONTENT}","pass_code":"0000"}'Expected response
HTTP 200 with the IPS Bundle associated with the valid VHL QR.
Collection
App Backend - Lacpass App API
Generate ICVP certificate from an IPS
curl -X GET "${APP_BACKEND_URL}/ips/icvp?bundleId=${BUNDLE_ID}&immunizationId=${IMMUNIZATION_ID}" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"Expected response
HTTP 200 with generated ICVP certificate data.
Collection
App Backend - Lacpass App API
Generate a wallet link
curl -X POST "${APP_BACKEND_URL}/wallet/generate-link" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-d '{"claims":{"1":"XCL","6":1798675199,"-260":{"-6":{"dob":"1905-08-23","n":"Aulo Agerio","ndt":"NI","nid":"16337361-9","s":"male","v":{"dt":"2017-12-11","vls":"2017-12-11"}}}},"credentialType":"ICVP"}'Expected response
HTTP 200 with coUrl, location, preAuthorizedCode, and qrUrl.
