Skip to content

General: Add the Play Console declarations and their demo recorder - #38

Merged
d4rken merged 2 commits into
mainfrom
play/console-prep
Jul 28, 2026
Merged

General: Add the Play Console declarations and their demo recorder#38
d4rken merged 2 commits into
mainfrom
play/console-prep

Conversation

@d4rken

@d4rken d4rken commented Jul 28, 2026

Copy link
Copy Markdown
Member

What changed

No user-facing behavior change in the app.

The store listing no longer lists supported manufacturers and ROM versions. That list goes stale with every OEM system update and can't promise anything reliable — Amply already determines support on the device at runtime, so the listing now says Pixels generally have good support, that everywhere else depends on the specific phone, and that installing and opening the app is how you find out.

The privacy policy now covers the opt-in charging history, which landed after the policy was last written and wasn't described by it.

Technical Context

Play requires, per declared foreground service type, a functionality description, a statement of user impact if the task is deferred or interrupted, and a link to a demo video. None of that existed and it gates review, including for closed testing.

fastlane/play-declarations/ is the copy-paste source for the Console forms (specialUse FGS, app access, data safety) plus the tooling that regenerates the video — label-based UI driving over adb, screenrecord capture, and an ffmpeg pass for title card, timed captions and end card. Butler's play-declarations/ layout, adapted. Scripts are committed; the .mp4 is written to /tmp and is not.

Review guidance:

  • The video demonstrates the unplug stop condition, not the 100% one. It's the condition that cannot work without a running foreground service — Android doesn't deliver the disconnect to a dormant app — which is exactly the argument the declaration makes. It also needs no simulated charge progression, so nothing on screen is faked beyond the disconnect. An earlier take that simulated the level to 100% ended on "Policy not verified", because a simulated battery blocks the hardware verification path; the unplug take ends on "80% limit active — Confirmed by Android's charging hardware".
  • The recorder refuses a bad take. It aborts if the device doesn't start at the 80% limit, and fails the run unless it observed charge_optimization_mode go 1 → 0 → 1 across the take.
  • Privacy hygiene is part of the recorder, not a manual step. The finished video goes to Google; the shade and QS strip would otherwise carry other apps' notifications and the Wi-Fi SSID. It clears the shade, enables DND and disables Wi-Fi for the take, restoring all three via an exit trap.
  • The declaration text and the manifest's PROPERTY_SPECIAL_USE_FGS_SUBTYPE describe the same four functions; they have to be changed together.

Verified alongside this: bundleGplayRelease builds under R8 and is signed with the Play upload key at the path Fastfile expects (this was never exercised before — every artifact so far has been a FOSS APK).

Play requires, per declared foreground service type, a functionality
description, a statement of user impact when the task is deferred or
interrupted, and a link to a video demonstrating the feature. None of
that existed, and it gates review — including for closed testing.

Adds fastlane/play-declarations/ as the copy-paste source for the
specialUse foreground-service declaration, app access, and data safety,
plus the tooling that regenerates the demo video: label-based UI driving
over adb, screenrecord capture, and an ffmpeg pass for title card, timed
captions and end card. The scripts are committed, the .mp4 is not.

The recording demonstrates the unplug stop condition rather than the
100% one. That is the condition which cannot work without a running
foreground service (Android does not deliver the disconnect to a dormant
app), and it needs no simulated charge progression, so nothing on screen
is faked beyond the disconnect. The recorder reads the underlying system
setting before, during and after the take and fails the run unless it
observed protected -> lifted -> protected, so a take that did not
demonstrate the feature is never silently produced. It also clears the
notification shade, mutes and disables Wi-Fi for the take, because the
finished video goes to Google and would otherwise carry the user's
notifications and network name.

Store listing: drop the per-manufacturer support list. It goes stale
with every OEM system update and cannot promise anything reliable;
the app already determines support on the device at runtime.

Privacy policy: cover the opt-in charging history, which was added after
the policy was last written and was not described by it.
@github-actions github-actions Bot added Build/Deploy Build system / CI / release tooling enhancement New feature or request labels Jul 28, 2026
@d4rken
d4rken marked this pull request as ready for review July 28, 2026 19:13
record.sh started the screen capture and then launched Amply, so the
first ~2.5s of every take showed whatever app was previously in the
foreground during the launch animation. In the current take that was
Octi, listing the owner's devices and sync server. Launch and settle
before the capture starts instead.

postprocess.sh gains TRIM_START (or a trim.txt) to salvage an existing
take by dropping N seconds off the front, shifting caption timings to
match; this take renders with 2.5s trimmed. The trim happens inside the
filtergraph with an explicit timestamp reset — input seeking on
screenrecord's variable-rate output made the fps filter pad the cut back
out with ~60 duplicate frames, which silently lengthened the title card.

The render now lands next to its DECLARATION.md and is git-ignored, so
it can be kept on disk ready to upload without entering the repository.
@d4rken
d4rken merged commit bd495e1 into main Jul 28, 2026
12 checks passed
@d4rken
d4rken deleted the play/console-prep branch July 28, 2026 19:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Build/Deploy Build system / CI / release tooling enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant