tatmapper-app

QA device matrix

Evidence fields

For every run record device/model, OS/API, ABI, app version, commit SHA, installation source, screenshots, sanitized log reference, result, and tester.

Target Status Required focus
Android API 24/25 phone NOT TESTED minimum SDK, picker, camera, PDF share
Android API 30–32 phone NOT TESTED permissions and lifecycle
Android API 36 phone/emulator DEVICE VERIFIED exact CI QA APK installed and exercised on Samsung SM-F966U / Android 16
Android large phone/tablet NOT TESTED unfolded/tablet and large-text states remain open
Physical Android camera device DEVICE VERIFIED rear-camera preview, capture, lifecycle, calibration, trace persistence, and deletion exercised
Current iPhone BLOCKED capture, import, lifecycle, VoiceOver
Current iPad BLOCKED responsive layout, multitasking, sharing

2026-07-21 API 36 attempt

A fresh TatMapper_QA_API_36 AVD was created from the installed Google Play API 36 x86-64 image with the Pixel 7a hardware profile. ADB and the package manager became reachable, but sys.boot_completed never became 1, the launcher never gained focus, and the emulator did not establish a responsive System UI. It was stopped cleanly and no application flow result was recorded.

This remains a FAILED environment attempt, not a TatMapper clean-launch or QA pass. A separate existing API 36 emulator now reports boot completion and responsive services, but the exact minified PR #110 APK cannot be built while hosted CI is account-billing blocked and the local pinned Dart runtime crashes. Its installed 2.0.0+3 package was last updated before PR A and is not used as branch evidence. No PR #110 application or logcat result is recorded from that emulator.

2026-07-25 Android-first local build

Application commit 8956a6a produced an R8/resource-shrunk release APK and AAB locally with Java 17 and Gradle 8.13. Bundletool 1.18.3 validated the AAB. The merged release manifest reports package com.tatmapper.app, min SDK 24, target SDK 36, camera permission, and no internet, storage, billing, advertising-ID, or audio permission. ARMv7, ARM64, and x86-64 Flutter/native libraries are present.

The final device pass instead used the exact CI-QA-signed APK from commit 3ad1fc1 (68,360,976 bytes; SHA-256 318A9E89846AC149A2995AD1BA53F87E8452CDC29430D23DC8114C93F113BADF). It was freshly installed on the authorized Samsung SM-F966U running Android 16 / API 36. Cold launch, real rear-camera capture, coin-reference confirmation, two trace strokes, save/close, force-stop/restart, restored trace geometry, theme persistence, and project deletion were DEVICE VERIFIED. The bundled sample and export review also rendered on the device. Filtered logcat contained no Flutter error, fatal exception, ANR, fatal signal, or camera-access exception.

The permission-denied recovery UI, two-finger gesture arbitration, physical quarter measurement, design import in the new project, PDF share/print, TalkBack, large text, unfolded layout, and all physical print measurements remain NOT TESTED. The QA signature is non-production and the APK is not a store artifact.

The follow-up coin-first artist-polish pass used the exact CI-QA APK from evidence head 4570e40 (70,835,162 bytes; SHA-256 4E5BEB1F55F76E8C1EA28AAFEE01270C42875A93AD3E0D12F7846C5E760CA487). On the same authorized Samsung, the enlarged crest over the translucent tattoo-workstation hero, quarter-first chooser, focused quarter alignment, size confirmation, design opacity controls, mirrored export warning, PDF generation, and Android share sheet were DEVICE VERIFIED. Filtered logcat contained no Flutter error, fatal exception, ANR, fatal signal, camera-access exception, file-system exception, or missing-plugin exception.

An owner/device photo was used only for the local test flow. It was not committed or uploaded; app-owned QA media was cleared and temporary captures were removed. The current-head APK was then reinstalled cleanly, leaving no saved project. Physical scale accuracy, printer output, the final 100 mm ruler, TalkBack, large text, and unfolded layout remain NOT TESTED.

Per-device primary flow

  1. Clean install and launch from the launcher.
  2. Open the synthetic sample project and traverse all five steps.
  3. Start a real project; deny camera permission, recover, then grant/retry.
  4. Import a photo, place both reference points, and enter known millimetres.
  5. Trace at least two separate strokes; verify undo/redo by stroke.
  6. Zoom/pan with two fingers and confirm no accidental stroke.
  7. Import PNG; move, scale, rotate, reset, background/resume, and revisit.
  8. Force-stop/relaunch and resume the saved project.
  9. Export twice; confirm dimensions do not drift.
  10. Share/open PDF and verify page count, artwork, warnings, instructions, and ruler.
  11. Inspect logcat/device logs for fatal exceptions, ANRs, native crashes, permission/file-provider failures, missing classes, and repeated plugin errors.

Calibration-suite flow

  1. Switch System, Light, and Dark modes and confirm restart persistence.
  2. Create direct and multi-stage Print Setups.
  3. Generate A4 and Letter diagnostic/calibration PDFs.
  4. Record fixture values 98 mm X and 97 mm Y; verify independent correction.
  5. Exercise the recommended quarter flow, including focused placement, Reset, Review, Adjust, Size confirmed, Change, and Continue.
  6. Exercise the Placement Card perspective backup and invalid-corner recovery.
  7. Exercise another coin, custom-round, and known-length alternatives.
  8. Export with no setup, a verified setup, and an explicit unverified override; inspect labels and final X/Y rulers.
  9. Verify visible artwork bounds, Fit, Center, Trim padding, Reset, Ghosted, Solid, and the soft outside-photo warning.
  10. Verify Normal versus Mirrored stencil output; the on-photo preview must remain normal.
  11. Background, kill, restart, and confirm project/setup state.
  12. Run large text and TalkBack through Print Setup and calibration.

Accessibility/layout

Physical print

Follow PHYSICAL_PRINT_VALIDATION.md; attach paper-master and final-stencil measurements. Physical validation is an owner/hardware blocker, not inferred from PDF unit tests.