feat(widgets): M3 Expressive widget lineup — analog, digital, stopwatch, quick timer

Six widgets, each with minimal settings, styled with M3 Expressive shapes and
Material You colours, and sized proportionally to the placed widget
(SizeMode.Exact + LocalSize):

- Analog clock (new): nine faces on MaterialShapes dials (Round, Numeral,
  Day, Cookie, Sunny, Scallop, Clover, Square, Petal) with per-face hands,
  a seconds dot and Google-Clock-style orbiting date on some faces, and a
  day/date pill on others. Style picker previews inflate the real views.
- Digital clock: rebuilt as RemoteViews faces (Classic, Thin, Bold, Pill,
  Stacked) shared by the widget and its config previews; world clocks are
  opt-in and only on the card faces.
- Next alarm and Timers: shape badges, icon buttons, proportional readouts;
  a lone timer on a tall widget gets a stacked layout.
- Stopwatch (new): large readout with play/pause pill and lap/reset.
- Quick timer (new): a Scallop that is a timer of its own — tap to start a
  transient timer of its configured duration, tap again to reset/stop.

Colours resolve in the launcher (widget_* palette resources, GlanceTheme's
dynamic colours) so widgets follow day/night and the wallpaper. Data widgets
collect their flows inside the composition so a live Glance session never
shows stale state, chronometer bases use elapsedRealtime, and config
activities close cleanly on an invalid widget id.
This commit is contained in:
2026-10-02 18:01:11 +02:00
parent 5d03c654bf
commit 82fff19d3d
103 changed files with 3793 additions and 280 deletions
+35 -1
View File
@@ -348,6 +348,40 @@
<string name="widget_next_alarm_today">Today</string>
<string name="widget_timer_description">Timer</string>
<string name="widget_timer_new">New timer</string>
<string name="widget_timer_expired">Time\'s up</string>
<string name="widget_timer_expired">Done</string>
<string name="widget_clock_description">Clock</string>
<!-- M11: digital clock widget faces + per-instance config -->
<string name="widget_config_title">Digital clock</string>
<string name="widget_config_style">Style</string>
<string name="clock_face_regular">Classic</string>
<string name="clock_face_bold">Bold</string>
<string name="clock_face_light">Thin</string>
<string name="clock_face_pill">Pill</string>
<string name="clock_face_stacked">Stacked</string>
<string name="widget_config_show_date">Show date</string>
<string name="widget_config_show_world_clocks">World clocks</string>
<string name="widget_config_show_world_clocks_hint">Up to three cities from your World clock tab</string>
<!-- M11: analog clock widget -->
<string name="widget_analog_description">Analog clock</string>
<string name="widget_analog_config_title">Analog clock</string>
<string name="analog_style_round">Round</string>
<string name="analog_style_numeral">Numeral</string>
<string name="analog_style_badge">Day</string>
<string name="analog_style_cookie">Cookie</string>
<string name="analog_style_clover">Clover</string>
<string name="analog_style_petal">Petal</string>
<string name="analog_style_sunny">Sunny</string>
<string name="analog_style_square">Square</string>
<string name="analog_style_scallop">Scallop</string>
<!-- M11: stopwatch widget -->
<string name="widget_stopwatch_description">Stopwatch</string>
<string name="widget_stopwatch_laps">Laps: %1$d</string>
<!-- M11: quick-timer widget -->
<string name="widget_quick_timer_description">Quick timer</string>
<string name="widget_quick_timer_config_title">Quick timer</string>
<string name="widget_quick_timer_start">Start %1$s</string>
</resources>