serving property
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;