Commit Graph
15175 Commits
Author SHA1 Message Date
Vitor PamplonaandGitHub 5dc1e0ccf5 Merge pull request #3251 from vitorpamplona/claude/hopeful-cori-qpq0ug
Add music playlist composer screen and edit support
2026-06-17 17:25:42 -04:00
Claude 3b9cca19cf feat: add "Mine" option to music + playlist feeds; fix cover in editor
Two changes:

1. "Mine" top-nav filter for the Music and Playlists feeds. Adds a shared
   `musicRoutes` option list (the content-style catalog plus "Mine") to
   TopNavFilterState and points both music top bars at it. The local-cache
   feed filters and the relay sub-assemblers now handle TopFilter.Mine by
   restricting to the logged-in user's own tracks/playlists (by author, over
   their outbox relays) — same pattern as the badges/communities feeds.

2. Fix: editing a track/playlist showed the empty upload placeholder even when
   the event already had a cover. The shared CoverImagePicker now renders the
   already-published cover URL (with tap-to-replace and a remove button) when no
   new local file is picked. The track composer's clearPickedCover now also
   clears the saved URL so "remove cover" sticks on save.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oofoSH7eMXrs2TCU4uncS
2026-06-17 21:14:55 +00:00
Claude 3ee699c555 feat: manage tracks (reorder/remove) inside the playlist editor
Add in-playlist track management to the music playlist composer: each track in
the working list shows its artwork/title/artist with move-up, move-down and
remove controls. The list is seeded from the loaded event when editing and
published in its new order on save. Adding new tracks still happens via the
per-song "Add to playlist" sheet.

- quartz: MusicPlaylistEvent.edit() now takes the ordered track list and resets
  the playlist's music-track `a` tags to it (preserving any non-track `a` tags,
  the d tag, custom hashtags and other metadata). Add MusicPlaylistEventEditTest
  covering reorder, removal, visibility switch, cover/description clearing and
  tag preservation.
- amethyst: NewMusicPlaylistViewModel gains the working track list plus
  moveTrackUp/moveTrackDown/removeTrackAt; NewMusicPlaylistScreen renders the
  editable track section; new string resources.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oofoSH7eMXrs2TCU4uncS
2026-06-17 20:33:54 +00:00
Vitor PamplonaandGitHub 20e1b933ce Merge pull request #3248 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-17 16:28:40 -04:00
Crowdin Bot 378d022e85 New Crowdin translations by GitHub Action 2026-06-17 20:19:17 +00:00
Vitor PamplonaandGitHub d820db9146 Merge pull request #3250 from vitorpamplona/claude/compassionate-tesla-j373vv
Cashu: avoid flickering invoice dialog during payment polling
2026-06-17 16:16:48 -04:00
Vitor PamplonaandGitHub a57c255ac5 Merge pull request #3247 from vitorpamplona/claude/laughing-euler-qmgmd9
Add direct image file sharing without preview dialog
2026-06-17 16:05:20 -04:00
Vitor PamplonaandGitHub 7cadb6b774 Merge pull request #3249 from vitorpamplona/fix/dm-known-sender-classification
fix(chat): track chatroom senders so followed-contact DMs land in Known
2026-06-17 15:59:43 -04:00
Vitor PamplonaandClaude Opus 4.8 6ec65042e2 fix(chat): track chatroom senders so followed-contact DMs land in Known
Chatroom.addMessageSync evaluated `activeSenders + author` but discarded the
result, so `activeSenders` stayed permanently empty and
`Chatroom.senderIntersects()` always returned false. The Known-rooms filter is
`senderIntersects(follows) || hasSentMessagesTo(room)`, so with the follow path
dead a room only counted as Known once the user's own self-addressed NIP-17
gift wrap decrypted. Incoming DMs from followed contacts were misrouted to New
Requests, and the Known tab sat on the "Loading Feed" spinner (empty feed shows
the spinner until gift-wrap history exhausts — minutes with many relays/Tor).

Assign the new set. Prune/remove intentionally do not recompute activeSenders so
a room never flips Known->New when old messages are pruned.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 15:57:11 -04:00
Vitor PamplonaandGitHub 710ca2c92b Merge pull request #3246 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-17 15:49:26 -04:00
Claude af8fffb989 feat: full-screen music playlist composer with cover image and metadata
Replace the name-only "new playlist" dialog with a full-screen create/edit
composer reachable via a dedicated route (Route.NewMusicPlaylist).

The composer surfaces a cover-image upload (same Blossom/NIP-96 pipeline as the
music-track composer), plus title, short description, long-form notes, a
public/private toggle and a collaborative toggle. An edit affordance now appears
on the user's own playlist cards.

- quartz: add MusicPlaylistEvent.edit() — updates the composer-owned metadata
  while preserving the track `a` tags and every other tag of the prior version.
- amethyst: NewMusicPlaylistViewModel + NewMusicPlaylistScreen (create/edit/
  delete); extract the shared cover-picker/placeholder/progress-banner into
  MusicComposerUploadUi so the track composer reuses them; FAB now navigates to
  the route; add edit icon on owned playlist cards; new string resources.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oofoSH7eMXrs2TCU4uncS
2026-06-17 19:43:34 +00:00
Claude 3844b6471d fix: show image thumbnail in share sheet for Share as Image
Attach the cached PNG's content URI as ClipData on the ACTION_SEND intent
so the Android share sheet itself gets read access and renders the image
preview at the top, instead of a generic file icon.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JM7z36GaqCm612rjPnX2G9
2026-06-17 19:30:26 +00:00
Claude 2684ffef54 fix: keep Cashu receive invoice on screen during mint polling
The Receive dialog polls the mint every 3s to see if the bolt11 has
been paid. Each poll flipped the flow state AwaitingPayment ->
Completing -> AwaitingPayment, and since the dialog renders a totally
different body for Completing (an "issuing proofs" spinner, no invoice,
no buttons), the invoice view was replaced by a spinner and then
recreated every 3 seconds — a constant flicker.

Add a `checking` flag to AwaitingPayment instead. The routine poll now
stays in AwaitingPayment and only toggles that flag, so the invoice (and
the Discard button) remain on screen and the dialog just swaps its
status line between "Waiting for the invoice to be paid…" and "Checking
the mint…". The full Completing body is shown only once payment is
actually confirmed and proofs are being issued.

The compareAndSet gate that prevents two concurrent polls from both
reaching completeMintFromLightning is preserved (now gating on
checking=false -> checking=true), with an extra early-out when a check
is already in flight.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GjNqJZFxQinvuR4sGwpWQR
2026-06-17 19:30:20 +00:00
Claude aead3c611d feat: add Share as Image (local file) and rename upload flow to Share as Image Url
Adds a second "Share as Image" entry to a note's 3-dot menu that renders
the same framed card, captures it to a PNG and hands the local file
straight to the Android share sheet — no preview, no upload. The existing
upload-and-share-URL flow is renamed to "Share as Image Url".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JM7z36GaqCm612rjPnX2G9
2026-06-17 18:56:56 +00:00
Crowdin Bot 158af6bafd New Crowdin translations by GitHub Action 2026-06-17 15:29:35 +00:00
Vitor PamplonaandGitHub fa5d126ba7 Merge pull request #3245 from vitorpamplona/release/1.12.1
Release 1.12.1
v1.12.1
2026-06-17 11:27:32 -04:00
Vitor Pamplona 1437d1e0b0 deleting unnecessary file 2026-06-17 11:21:58 -04:00
Vitor PamplonaandClaude Opus 4.8 0c59bb89ee docs: complete the build/release guide and add RELEASE_OPS
Make BUILDING.md everything a fork needs to build and release, and add a
maintainer-facing ship checklist.

- BUILDING.md: full CI secrets inventory (Android keystore vs GPG/Maven, with
  generation commands), a distribution-channels table (GitHub, Maven, Play,
  F-Droid pull, Zapstore, Homebrew/Winget), and a "generated & vendored
  artifacts" section (Material Symbols subset, Arti native libs).
- RELEASE_OPS.md (new, repo root): Amethyst-specific shipping — pre-tag
  checklist, per-channel rollout (manual Play AAB, Zapstore `zsp publish` with
  our nsec, F-Droid build-from-source), the push-notification server
  (amethyst-push-notif-server), secret ownership, and verification.
- README.md: slim the Deploying section to point at both docs, fix the stale
  quartz dependency version, and add a Maven Central badge plus JitPack
  snapshot docs.
- android-expert skill: drop the duplicated build-config block, delegate to
  gradle-expert, keep only the Android-specific flavor note.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:20:36 -04:00
Vitor PamplonaandClaude Opus 4.8 02ee493502 chore(release): 1.12.1
Bump the app version to 1.12.1 (versionCode 449) in the catalog, which now
drives every module. Add the v1.12.01 changelog (Health Connect workouts,
share-as-image, immersive system bars, deterministic Tor Active fix) and index
it. Refresh the quartz-integration skill's artifact-version references.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:20:18 -04:00
Vitor PamplonaandClaude Opus 4.8 270d229d0a build: drive all module versions from the catalog
Make every module read its release version from gradle/libs.versions.toml
instead of carrying its own literal, so a release bump is a single-file edit.

- Move the Android versionCode out of amethyst/build.gradle.kts into the
  catalog as `appCode`; amethyst reads it via libs.versions.appCode.get().
- quartz publishes with version = libs.versions.app.get().
- geode generates a BuildConfig.VERSION from the catalog (new
  generateVersionFile task) and RelayInfo.VERSION reads it, so the NIP-11
  software version tracks releases.
- Update the root build comment to point at the appCode entry.

Version-neutral: everything still resolves to the current 1.12.0 / 448.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:19:52 -04:00
Vitor Pamplona af27b7750e Fixes versions in the Skill file 2026-06-17 10:34:00 -04:00
Vitor PamplonaandGitHub 06cba4e1db Merge pull request #3244 from vitorpamplona/claude/lucid-turing-atp9z3
Support measurement system detection on Android API <28
2026-06-17 10:30:50 -04:00
David KasparandGitHub 61706c167a Merge pull request #3243 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-17 16:13:56 +02:00
Crowdin Bot b608e82cde New Crowdin translations by GitHub Action 2026-06-17 14:12:23 +00:00
Claude ef3c11da15 fix: guard ICU getMeasurementSystem behind API 28 check
LocaleData.getMeasurementSystem requires API level 28 but the module's
minSdk is 26, which lint (NewApi) flagged as an error. Guard the ICU call
behind a Build.VERSION.SDK_INT check and fall back to a country-code based
heuristic on API 26-27.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JDcx7i1VDRyT7rDcuSB5Co
2026-06-17 14:09:38 +00:00
davotoula 92ffc76bb0 update cz, se, pt, de 2026-06-17 16:03:47 +02:00
Vitor PamplonaandGitHub 940458d767 Merge pull request #3242 from vitorpamplona/claude/gallant-bardeen-78e9n1
Add Health Connect integration for workout suggestions
2026-06-17 09:15:24 -04:00
Claude c0df0048bd feat: render workout notes through the kind-1 text pipeline
Replace the plain-text note with TranslatableRichTextViewer (inside
SensitivityWarning), the same renderer kind-1 notes use — so workout notes get
links, mentions, hashtags, embeds, image/URL previews and inline translations.
WorkoutDisplay now receives backgroundColor, canPreview, quotesLeft,
accountViewModel and nav; both call sites (NoteCompose, ThreadFeedView) pass
them through.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 12:29:51 +00:00
Vitor PamplonaandGitHub 9ca1a14145 Merge pull request #3240 from davotoula/fix/immersive-system-bars
Hide Android system bars in immersive scroll and full-screen media
2026-06-17 08:22:44 -04:00
Vitor PamplonaandGitHub 1e8fdfdf2e Merge pull request #3241 from davotoula/l10n/swahili-base
Promote Kenyan Swahili to the base resource qualifier
2026-06-17 08:21:57 -04:00
davotoula 0a7b8300df fix(l10n): promote Kenyan Swahili to the base resource qualifier 2026-06-17 13:13:04 +02:00
David KasparandGitHub 77ff7945d6 Merge pull request #3237 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-17 13:07:26 +02:00
davotoula f920ab0c6f Code review:
- Hoist the constant systemBarsBehavior assignment out of the snapshotFlow collect loop
- Track the top in-app bar's collapse fraction (falling back to the bottom bar on screens with no top bar) instead of max(top, bottom)
2026-06-17 11:40:43 +02:00
davotoula 67764300a8 feat: hide OS system bars during full-screen media
Install a DisposableEffect in ZoomableImageDialog that hides both status
and navigation bars via WindowInsetsControllerCompat when the full-screen
media dialog opens, and restores them on dispose.
2026-06-17 11:24:50 +02:00
davotoula 04d7316e34 feat: hide OS status bar during scroll immersive mode 2026-06-17 11:24:17 +02:00
Claude 5179757019 feat: render workout notes and show metrics in the viewer's units
- Render the kind 1301 content (the user's notes) below the stats grid in
  WorkoutDisplay; previously it was published but never shown.
- Convert distance, pace, speed, elevation, and weight to the viewer's preferred
  measurement system (phonePrefersMiles) via WorkoutInfo.inUnits, so a workout
  stored in km shows in miles for an imperial viewer (and vice versa).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 03:15:13 +00:00
Claude d8c66a4a25 feat: default workout distance unit to the phone's measurement system
Read the phone's measurement preference (Android 14+ Regional preferences
override via the locale's -u-ms- extension, else ICU's locale-derived
US/UK = miles) and default the New Workout composer's km/mi selector to it.
Health Connect distances (always metres) are converted into the chosen unit on
pre-fill instead of being forced to km.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 03:08:43 +00:00
Claude d4c7577828 feat: record the source app/device name from Health Connect
Instead of a generic "health_connect" source, capture the app/device that wrote
the record (the Health Connect data origin) and use it as the workout source —
so the card shows e.g. "SAMSUNG HEALTH" / "GOOGLE FIT" instead of "HEALTH
CONNECT".

resolveSourceName resolves the data-origin package to the installed app's
label, falling back to a known-package map (Samsung Health, Google Fit, Fitbit,
Garmin, Strava, Nike Run Club), then the raw package, then "Health Connect".
DetectedWorkout carries this as `source` and it flows into the published kind
1301 source tag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 02:40:00 +00:00
Claude 89ab47c0ec fix: tighten New Workout composer vertical spacing
Reduce the section spacing from 16dp to 12dp so the gaps around the activity
chip rows aren't oversized.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 01:46:14 +00:00
Claude 631c110a4f fix: center the activity type chips in the New Workout composer
The activity FilterChip FlowRow was start-aligned; center it under the hero
with Arrangement.spacedBy(.., Alignment.CenterHorizontally).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 01:36:41 +00:00
Claude ee1a7aec2f feat: move Health Connect entirely into the New Workout composer
Per request, the Workouts feed no longer has any Health Connect code. Both the
permission prompt and the detected-workout list now live in the New Workout
carousel: it shows a Connect card when permission is missing and the workout
list once granted.

- Remove WorkoutConnectBanner and the feed wiring; revert the FeedLoaded header
  slot that fed it.
- Restore the Connect prompt in DetectedWorkoutCarousel (tri-state permission:
  unknown renders nothing, denied shows Connect, granted shows the list).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 01:15:51 +00:00
Crowdin Bot e5353703e3 New Crowdin translations by GitHub Action 2026-06-17 01:10:46 +00:00
Vitor PamplonaandGitHub ae3883052b Merge pull request #3235 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-16 21:09:00 -04:00
Claude 63aa4102d0 feat: keep only the connect prompt on the feed; workouts list in New Workout
Refine the previous change: the Workouts feed shows a connect-only Health
Connect banner (a new WorkoutConnectBanner) so permission can be granted there,
but never lists detected workouts. The detected-workout list is shown solely in
the New Workout composer's carousel, which reverts to list-only (no connect
card).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 01:03:54 +00:00
Claude a60d2b6c1c feat: drop the Health Connect feed banner; keep it in New Workout only
Per request, Health Connect suggestions no longer appear on the Workouts feed.
The integration now lives solely in the New Workout composer's carousel.

- Remove the feed banner wiring from WorkoutsScreen and revert the FeedLoaded
  header slot that fed it.
- Delete the banner (WorkoutSuggestionCard), its state holder
  (WorkoutSuggestionState), and the handled-id store (HealthConnectStore);
  the carousel shows the full window and needs no dedup. LOOKBACK_DAYS moves to
  HealthConnectManager.
- Fold the Connect prompt into the carousel so Health Connect permission can
  still be granted (the banner was the previous entry point) — it shows a
  Connect card when permission is missing, the carousel once granted.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 00:52:36 +00:00
Claude 125947bf85 feat: modernize the New Workout composer
Give the workout composer more energy and a clearer hierarchy:

- Hero header: a large activity badge (primaryContainer circle) plus the
  activity name, both crossfading as the type changes — the form's focal point.
- Activity selector chips now carry their per-activity icon.
- Distance unit switched from two FilterChips to a Material3 segmented button.
- Leading icons on the inputs (title, distance, calories, notes) and an
  icon + label section header for Duration, for faster visual scanning.
- Roomier 16dp spacing and padding.

Pure presentation; the ViewModel and published event are unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 00:34:37 +00:00
Claude ad1d28d0a6 chore: remove Health Connect workout detection plan doc
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-17 00:21:48 +00:00
Claude 692583cac2 feat: limit the feed workout banner to today's workouts
The Workouts feed banner now only surfaces workouts that started today; older
workouts from the past week remain reachable from the New Workout composer's
carousel. Keeps the feed focused on what just happened while still letting
people post earlier workouts on demand.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qgqQKHSewRHVM8vSCLt9P
2026-06-16 23:52:09 +00:00
Crowdin Bot 66b0428cb2 New Crowdin translations by GitHub Action 2026-06-16 23:48:41 +00:00
Vitor PamplonaandGitHub fc35f5afe3 Merge pull request #3236 from vitorpamplona/claude/fervent-pascal-dy03ve
Add share-as-image feature for notes
2026-06-16 19:46:32 -04:00