serving property

bool? serving
final

Whether the rollout is still configured to hand this release to new users, or null when that cannot be said.

The question, rather than the vocabulary: true for a completed rollout and for one still in progress, false for a halted one and for an unsent draft. A caller asking this never has to learn Play's status strings.

It is not "the release is live", and the gap is Google's review. The Play Developer API carries no app-review state on any resource, so a completed production release that Google has not yet approved answers true here while the Play Console says In review and no user can install it. A caller rendering a store-status column must not print this as live; print the rollout, and say nothing the API did not.

This is the second correction to this sentence of the same shape as the paragraph below, and the two together are the argument for the wording: the field is about the rollout the developer configured, and every reading of it as availability has so far been wrong. The first was found by a field arriving beside it; the second by a person opening the Play Console after this package's own consumer reported a release live that was not. See PlayReleaseStatus.completed.

"Still being handed out" and not "in front of anybody", and the difference is PlayReleaseStatus.halted. This field said the second thing until userFraction arrived beside it and made the two visibly disagree: Google's own wording for a halted release is "Users who already have these APKs are unaffected", so a halted rollout is in front of the fraction that installed it, while this answers false. The false is right — what an operator asking "is this rollout stopped" means is whether anyone new is still getting it — and the sentence describing it was the part that was wrong. Read audienceFraction for who has it.

Null rather than false for a status this version does not name, and for PlayReleaseStatus.statusUnspecified, which is Play declining to say. A bool cannot carry "I don't know", and both of the answers it would force are wrong: false reports a possibly-healthy rollout as reaching nobody, and true calls an unrecognized state healthy. That is the same three-valued honesty the raw status has one line up — a derived field that flattened it would be a worse answer than the field it is derived from.

A caller wanting the conservative reading writes serving != true; one that wants to say so writes serving == null.

It does not say how much. inProgress means "some of the audience" rather than "all of it", so serving == true cannot tell a 1% rollout from a finished one. audienceFraction is the field that can, and it is a separate one on purpose: a three-valued boolean that also carried a magnitude would be two answers under one key.

And it is not sufficient alone. PlayReleaseStatus.halted and PlayReleaseStatus.draft are both false and call for different advice: one was stopped by a person, the other never started. Read status when the next action differs.

Implementation

final bool? serving;