appId: com.edde746.plezy name: TV settings stay navigable and dismiss their overlays tags: - e2e - regression - tv - settings --- # Guards ef310459 and the Apple-only gates touched by 6c14049e, and pins TV # settings navigation generally. # # It deliberately does NOT guard the 15b54e2e density change. That commit took # every settings row from ~80dp to ~61dp, but the rows below the fold stay in # the semantics tree either way, so this flow passes identically on both sides # of it — measured, not assumed. A real guard would need a pixel `height` # assertion, and Maestro has no DPR-relative form, so pinning one here would # only hold for the box it was written on. Row geometry belongs to # test/widgets/setting_tile_test.dart. # # Every step uses D-pad keys, never taps. InputModeTracker flips to pointer # mode on the first touch event and the TV number spinner only builds in # keyboard mode, so a single tapOn anywhere above would silently swap the # spinner for a plain text field. - runFlow: ../subflows/onboard_jellyfin_tv_device.yaml - pressKey: "Remote Dpad Left" - extendedWaitUntil: visible: "Settings" timeout: 15000 - repeat: times: 12 while: notVisible: text: "Settings" focused: true commands: - pressKey: "Remote Dpad Down" - pressKey: "Remote Dpad Center" - extendedWaitUntil: visible: "(?s)^Appearance.*" timeout: 15000 - assertVisible: "(?s)^Video Playback.*" - assertVisible: "(?s)^Manage Libraries.*" - assertVisible: "(?s)^Services.*" # The Connections card sits below the first card, so reaching it also proves # the list scrolled or fits — not that any particular row height applies. - assertVisible: "(?s)^Add connection.*" - assertVisible: "(?s)^Profiles.*" # Manage Libraries takes the TV dialog path, not the overlay-sheet path, and # one Back has to return to Settings rather than leave it. - repeat: times: 6 while: notVisible: text: "(?s)^Manage Libraries.*" focused: true commands: - pressKey: "Remote Dpad Down" - pressKey: "Remote Dpad Center" - extendedWaitUntil: visible: "Maestro Movies" timeout: 15000 - assertVisible: "Maestro Shows" - assertNotVisible: "(?s)^Services.*" - assertNotVisible: "(?s)^Video Playback.*" - pressKey: "back" - waitForAnimationToEnd: timeout: 3000 - assertNotVisible: "Maestro Movies" - extendedWaitUntil: visible: "(?s)^Services.*" timeout: 15000 - assertVisible: "(?s)^Manage Libraries.*" # Services keeps every hub row after losing its own density overrides. - repeat: times: 6 while: notVisible: text: "(?s)^Services.*" focused: true commands: - pressKey: "Remote Dpad Down" - pressKey: "Remote Dpad Center" - extendedWaitUntil: visible: "(?s)^Trakt.*" timeout: 15000 - assertVisible: "(?s)^MyAnimeList.*" - assertVisible: "(?s)^AniList.*" - assertVisible: "(?s)^Simkl.*" - assertVisible: "(?s)^Seerr.*" - pressKey: "back" - extendedWaitUntil: visible: "(?s)^Manage Libraries.*" timeout: 15000 # Video Playback: the Atmos test screen is gated to Apple TV, and the D-pad # numeric dialog must expose the spinner's restored accessibility labels. - repeat: times: 8 while: notVisible: text: "(?s)^Video Playback.*" focused: true commands: - pressKey: "Remote Dpad Up" - pressKey: "Remote Dpad Center" - extendedWaitUntil: visible: "(?s)^Player.*" timeout: 15000 - assertNotVisible: "(?s)^Atmos Output Test.*" - repeat: times: 30 while: notVisible: text: "(?s)^Small Skip Duration.*" focused: true commands: - pressKey: "Remote Dpad Down" - pressKey: "Remote Dpad Center" - extendedWaitUntil: visible: "Decrease" timeout: 15000 - assertVisible: "Increase" - assertVisible: "(?s)^Enter duration.*" - pressKey: "back" - extendedWaitUntil: visible: "(?s)^Small Skip Duration.*" timeout: 15000 - pressKey: "back" - extendedWaitUntil: visible: "(?s)^Manage Libraries.*" timeout: 15000 # Settings is a rail tab on TV rather than a pushed route, so Back hands focus # back to the rail and expands it instead of leaving the screen. - pressKey: "back" - extendedWaitUntil: visible: text: "Settings" focused: true timeout: 20000 - assertVisible: "Home" - assertVisible: "Libraries" - assertVisible: "Downloads"