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