v0.9 current behavior: explicit Quick Flag permits Android portrait fallback with immersive/awake requests, localized exit recovery and a Home discovery hint. See release readiness. Physical-rotation mode retains its landscape guard; historical no-button/no-orientation-request statements below apply to ordinary rotation sessions only.
v0.8 update: core features now use FlagItem/FlagId and FlagPreferences. Country-only persistence details below describe the original release; see Generic Flag Catalog and migration for the current schema. Historical release details follow; current changes and QA are linked above.
AllFlag is a digital flag ready for a match, parade, demonstration, recording, or cultural event. Quick Flag shortens the path to showing the country a user belongs to or supports. It is not a country encyclopedia.
Favorites contain many countries. Quick Flag contains zero or one country and is independent of Favorites. Assignment never favorites or records a country as Recent. Showing it moves that ISO code to the front of the existing five-entry, deduplicated Recent list.
The existing immutable CountryPreferences snapshot adds nullable quickFlag.
SharedPreferencesCountryStore stores only the ISO 3166-1 alpha-2 code, under the
existing allflag.country_preferences.v1 JSON key. Older snapshots remain valid.
Missing or wrongly typed values mean no Quick Flag; catalog validation discards
stale/unknown codes. The next normal save writes the validated snapshot.
All copies for theme, language, favorites and recent preserve Quick Flag.
The existing ordered save queue and retry message also cover Quick Flag writes.
An acknowledged local save survives restart and force close. As with other
preferences, killing the process before its asynchronous write completes can
lose the most recent tap. No network, analytics, account or cloud service is used.
Open a country’s three-dot actions menu, then choose Set as Quick Flag / Usar como bandera rápida. Reassignment replaces the previous ISO without confirmation. The same menu removes the current Quick Flag. The compact Home card also offers removal in its menu. Country rows retain their Favorite action; the menu groups Quick Flag actions rather than adding a dedicated Quick Flag toggle icon. The current country has a textual Quick Flag subtitle, independent of color.
A compact themed card appears after the header/search, before the selected-country message and Favorites/Recent/All Countries. It includes the flag thumbnail, localized country name, readiness text, and an explicit Show flag action. It remains available while searching. Without a valid Quick Flag there is no card.
Show flag selects the Quick Flag country, updates Recent, dismisses the keyboard, and enters the same FlagScreen and FlagModeController used by normal rotation. It does not push a duplicate fullscreen implementation. The image uses BoxFit.contain on black, preserving aspect ratio and letterboxing even if rotation is unavailable. The programmatic session requests both landscape orientations through Flutter’s public SystemChrome.setPreferredOrientations API. Ordinary physical-rotation sessions do not request a landscape lock.
The controller serializes and coalesces transitions. Programmatic entry enables the existing native immersive/system-bar and screen-awake implementation. Exit requests an empty orientation list (OS defaults), never a permanent portrait lock. System UI and ordinary sleep behavior are restored. Temporary selection is cleared on Quick Flag exit so Home remains visible even while physically landscape. Quick Flag assignment and Recent persist; the search query remains intact.
Only programmatic Flag Mode shows a small, safe-area, top-left close control. It hides after four seconds; tapping anywhere on the flag reveals it again. Its localized tooltip and semantics say Exit Flag Mode / Salir del modo bandera. The temporary control can briefly cover a flag corner; the unobstructed view is the default after the timeout. It has a 48-pixel minimum touch target. With accessible navigation enabled (for example a screen reader), the control stays discoverable instead of timing out. The flag also exposes a semantic action to reveal controls. Android system Back exits to Home, including after timeout; system edge gestures remain available through the existing native implementation. iOS users use the temporary close control; the home gesture remains available. Normal physical-rotation Flag Mode has no additional controls and returns to Home when the device rotates back, just as before.
Inactive, hidden, paused and detached transitions release orientation, immersive presentation and screen-awake requests. A resumed programmatic session reapplies them; a normal session recomputes actual orientation. Disposal queues cleanup, including after an in-flight enable. Native pause/disconnect cleanup remains the existing safety net. Orientation errors do not prevent display or exit; physical rotation remains available. Immersive failures trigger best-effort cleanup.
Android phones usually honor landscape requests. Android 16/API 36 devices with a display width of at least 600 dp may ignore orientation requests. iPad multitasking can also ignore them. AllFlag does not disable multitasking, change platform manifests or use private orientation APIs to override these policies. iPhone behavior, rotation lock, OEM policies and foldable transitions need real hardware QA. On a device that ignores the request, the same flag is immediately shown in the current viewport and users can physically rotate it.
Reference: Flutter setPreferredOrientations. Android continues using the existing WindowInsetsControllerCompat host rather than Flutter’s legacy immersive mode, which target SDK 36 ignores. iOS retains its idle timer, status-bar and home-indicator implementation. No native signing, application ID, keystore, key.properties or release configuration changes.
All actions, readiness text, exit controls and semantic labels are English/Spanish ARB resources. Country names are resolved from the active locale on every build: DE remains DE when Germany becomes Alemania. Light/Dark use existing BrandTokens and Material theme colors; flags remain the main color element. No runtime dependencies were added or removed.
Run every checklist item for Venezuela (VE), United States (US), Canada (CA), and Japan (JP) on Android and iOS. Record device, OS, app build, rotation-lock setting, locale, theme and results. Automated tests do not establish real sensor, OS gesture, native sleep or iOS build behavior.
Build validation and artifact details are recorded below after local validation.
dart format .: 30 files checked, zero changes in the final pass.flutter analyze: no issues found.flutter test: 125 tests passed (109 existing plus 16 Quick Flag tests).flutter build appbundle --release: passed on the final source.build/app/outputs/bundle/release/app-release.aab.jarsigner -verify: jar verified. Standard warnings: self-signed/untrusted
public-CA chain, no timestamp (certificate expiry 2054-02-02), and unsigned
ZIP permission/symlink metadata. These do not invalidate the matched payload.9F:61:1A:BA:E6:AC:37:EF:F0:E4:A3:73:2F:7E:E7:90:8B:75:5C:45:2D:6D:9D:AE:71:BC:74:15:89:74:36:23.AAB file SHA-256: 6EEBED00BC05E208A016CCAF8B57C762BC6C77B761D275DFA99CAF99F39E89CC.