Files
amethyst/fastlane
Claude 3397c41985 feat: My Fitness — a personal training dashboard over Health Connect
Google rejected the Health Connect declaration a second time, this time as
"use of permission is not a permitted/valid use case". That was correct. The
policy admits six use cases; the nearest is "Fitness, wellness and coaching —
apps designed to help users track, monitor, analyze, manage, and improve their
physical fitness". Amethyst did none of those. Its Workouts section was a feed
of other people's kind 1301 events plus a composer, so the honest description
of the integration was "read health data in order to publish it", which is not
an approved use case and reads as the prohibited "publicly displaying or
socially sharing sensitive data".

So the app now does the thing the permissions are for. My Fitness (Workouts →
chart icon) summarises the user's own training back to them: this week against
last week, the four-week weekly average, where the time goes by activity, best
efforts, active days and a consecutive-day streak. It is computed on device,
requires no account interaction, sends nothing, and never asks the user to
post. Publishing becomes one optional per-workout action on a dashboard row.

Every permission now earns itself against that screen rather than against the
composer: exercise drives counts, time, breakdown, active days and streak;
distance, calories, steps and elevation drive weekly totals, trends and bests;
heart rate drives the duration-weighted effort average and the max.

WorkoutStats holds all the arithmetic as pure Kotlin so it is testable without
Health Connect, a device, or Compose — 13 tests cover window trimming, the
seven-day split, absent-metric handling, duration weighting, ordering, streak
edges (a rest day today does not break a live streak; a missed day does) and
the weekly average.

The window is 28 days, not 30: Health Connect serves 30 days without
READ_HEALTH_DATA_HISTORY, which Amethyst does not request, and four whole weeks
keeps the "this week vs last week" comparison inside that limit.

The declaration, PRIVACY.md and the store listing are rewritten to lead with
tracking and describe sharing as the secondary, per-item, user-confirmed action
it now is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019egdJyBHnrATZHjs86up8f
2026-09-15 14:09:31 +00:00
..