serving property

bool? serving
final

Whether Play is still handing 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.

"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;