Add the on-device data field catalogue, always-on mode, and real icons

Fields
  75 selectable fields across date/time, activity, body, system,
  environment, weather and custom text, numbered to match
  watchface.io/docs/datafields so the two catalogues line up.  All four
  slots (both top, both bottom) pick from the same table and the bottom
  captions follow the selection.  tools/gen_fields.py owns the table and
  emits FieldTable.mc, settings.xml and both languages' strings, so those
  cannot drift apart.

  Fields.Ctx fetches each API at most once per draw, and only if some slot
  asks -- the forecast, user profile and sensor history lookups are lazy.

  The rest of that catalogue is deliberately absent: OpenWeatherMap and
  StormGlass need network calls and user API keys, the per-sport weekly and
  28-day aggregates come from a phone-side Garmin Connect integration rather
  than any on-device API, and the app complications need those apps
  installed.  README section 7 lists what was left out and why.

Permissions
  UserProfile and SensorHistory are now declared; without them resting heart
  rate, VO2 max, pulse ox and body battery throw at runtime.  Sensor turns
  out to be rejected outright for type="watchface", so altitude and pressure
  read from Activity.Info instead.

Always-on display
  AMOLED devices need the lit-pixel count cut while asleep.  drawAmbient
  drops the band fill and the unlit ticks, dims what remains, hides the
  complications, and walks the layout within +/-4 px per minute so nothing
  burns in.  Gated on requiresBurnInProtection, so MIP devices are untouched.

Icons
  The comps' sunrise and weather icons have two- and three-pixel features.
  Rebuilding them from circles and lines looked right at 454 px and turned to
  mush at 280.  They are now rasterised from the design paths once per screen
  width and tinted with drawBitmap2(:tintColor) -- which needs
  packingFormat="png", since a palettised source is refused at runtime.
  Launcher icons are generated at the five sizes the devices ask for.

All 17 devices build; checked on fenix847mm and enduro3 in the simulator.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-09 23:53:18 +08:00
parent 398018b51e
commit d457f8244e
49 changed files with 1852 additions and 379 deletions

View File

@@ -0,0 +1,89 @@
<strings>
<!-- Field names shown in the settings picker. -->
<string id="FldOff">Off</string>
<string id="FldTime">Time</string>
<string id="FldUtcTime">UTC Time</string>
<string id="FldAltTime1">Alternate Time 1</string>
<string id="FldAltTime2">Alternate Time 2</string>
<string id="FldDayMonthDay">Day Month Day</string>
<string id="FldDayDate">Day Date</string>
<string id="FldMonthDay">Month Day</string>
<string id="FldDayOfMonth">Day of Month</string>
<string id="FldDayShort">Day (Tue)</string>
<string id="FldDayFull">Full Day (Tuesday)</string>
<string id="FldMonthName">Month (Jan)</string>
<string id="FldMonthNum">Month (6)</string>
<string id="FldMeridiem">AM/PM</string>
<string id="FldWeekIso">Week Number (ISO)</string>
<string id="FldWeekCal">Week Number</string>
<string id="FldSteps">Steps</string>
<string id="FldStepsRound">Steps Rounded</string>
<string id="FldStepsToGo">Steps to Go</string>
<string id="FldCalories">Calories</string>
<string id="FldActiveCal">Active Calories</string>
<string id="FldActiveMin">Active Minutes</string>
<string id="FldActiveMod">Active Min (Moderate)</string>
<string id="FldActiveVig">Active Min (Vigorous)</string>
<string id="FldActiveWeek">Active Minutes (Week)</string>
<string id="FldDistance">Distance</string>
<string id="FldFloorsUp">Floors Climbed</string>
<string id="FldFloorsDown">Floors Descended</string>
<string id="FldMetersUp">Distance Climbed</string>
<string id="FldPushDist">Push Distance</string>
<string id="FldPushes">Pushes</string>
<string id="FldHeartRate">Heart Rate</string>
<string id="FldRestingHr">Resting Heart Rate</string>
<string id="FldStress">Stress Score</string>
<string id="FldPulseOx">Pulse Ox</string>
<string id="FldRespiration">Respiration Rate</string>
<string id="FldBodyBattery">Body Battery</string>
<string id="FldMoveBar">Move Bar</string>
<string id="FldMoveBarRev">Move Bar Reversed</string>
<string id="FldWeight">Weight</string>
<string id="FldBmi">BMI</string>
<string id="FldRecovery">Time to Recovery</string>
<string id="FldVo2Run">VO2 Max (Run)</string>
<string id="FldVo2Bike">VO2 Max (Bike)</string>
<string id="FldBattery">Battery</string>
<string id="FldBatteryDays">Battery in Days</string>
<string id="FldBatteryBoth">Battery / Days</string>
<string id="FldAlarms">Alarms</string>
<string id="FldNotifications">Notifications</string>
<string id="FldDoNotDisturb">Do Not Disturb</string>
<string id="FldBluetooth">Bluetooth</string>
<string id="FldSolar">Solar Intensity</string>
<string id="FldAltitude">Altitude</string>
<string id="FldSeaPressure">Sea Level Pressure</string>
<string id="FldAmbPressure">Ambient Pressure</string>
<string id="FldSunrise">Sunrise</string>
<string id="FldSunset">Sunset</string>
<string id="FldNextSun">Next Sun Event</string>
<string id="FldUntilSun">Time Until Sun Event</string>
<string id="FldMoonAge">Moon Age</string>
<string id="FldMoonLit">Moon Illumination</string>
<string id="FldTemp">Temperature</string>
<string id="FldTempHiLo">Temperature High/Low</string>
<string id="FldFeelsLike">Feels Like</string>
<string id="FldTempHigh">High Temperature</string>
<string id="FldTempLow">Low Temperature</string>
<string id="FldHumidity">Humidity</string>
<string id="FldPrecip">Precipitation %</string>
<string id="FldWindSpeed">Wind Speed</string>
<string id="FldWindBearing">Wind Bearing</string>
<string id="FldWindDir">Wind Direction</string>
<string id="FldWeatherTime">Weather Update Time</string>
<string id="FldCustom1">Custom Text 1</string>
<string id="FldCustom2">Custom Text 2</string>
<string id="FldCustom3">Custom Text 3</string>
<!-- On-face captions, in FieldTable.IDS order. -->
<string id="FieldLabels">,TIME,UTC,TZ1,TZ2,DATE,DATE,DATE,DAY,DAY,DAY,MON,MON,,WEEK,WEEK,STEP,STEP,TO GO,KCAL,ACAL,MIN,MOD,VIG,WEEK,DST,FLR,DESC,ASC,PUSH,PUSH,HR,RHR,STRS,SPO2,RESP,BODY,MOVE,MOVE,WT,BMI,RCVR,VO2,VO2,BATT,DAYS,BATT,ALRM,MSG,DND,BT,SOLR,ALT,hPa,hPa,RISE,SET,SUN,SUN,MOON,MOON,TEMP,HI/LO,FEEL,HIGH,LOW,HUM,RAIN,WIND,WIND,WIND,WX,,,</string>
<string id="MetricSteps">Steps</string>
<string id="MetricCalories">Calories</string>
<string id="MetricDistance">Distance</string>
<string id="MetricFloors">Floors</string>
<string id="MetricMoveBar">Move Bar</string>
<string id="MetricActiveMin">Active Minutes</string>
<string id="MetricBodyBattery">Body Battery</string>
</strings>