* feat: add support chat translations
* feat: add hook to get support group
* feat: add new screen to start support chat
* feat: show chat with support option in user search screen
* style: add empty line to .fvmrc
* chore: change min coverage locally to be 99%
* chore: update lockfiles
* docs: update changelog
* chore: fix production build flags and remove redundant just recipes
- Add --dart-define=APP_FLAVOR=production to Android build in
build_release.sh (was missing, causing debug features to be enabled
in production Android builds due to defaultValue: 'staging')
- Remove fat APK recipes (build-android-apk, build-production-apk,
build-staging-apk, when-apk) — project always uses split APKs
- Remove build-release-apk and build-release-aab aliases — use
build-split-apk and build-aab directly
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* chore: restore when-apk recipe pointing to split APK staging build
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* chore: bump whitenoise-rs to 0.2.1 for 2026.3.5 release
* chore: sync widgetbook lockfile with app version
* fix: export iOS deployment target for Rust iOS build
* chore: align changelog release key with app version
* chore: drop build suffix from changelog release key
* Update iOS icons and app name for staging
* fix(ios): harden build script and correct Release display name
- Add cargo check to environment validation in build_ios.sh
- Add existence check before cd rust to give informative errors
- Replace fragile cd/pod install/cd with pushd/popd and error handling
- Add POSIX-compliant trailing newline to build_ios.sh
- Fix project-level Release APP_DISPLAY_NAME ("White Noise staging" → "White Noise") to match target-level value
* feat(android): add staging flavor launcher icons
Add ic_launcher_foreground, ic_launcher_background, ic_launcher_monochrome,
and legacy ic_launcher PNGs for all densities (mdpi through xxxhdpi) plus
the mipmap-anydpi-v26 adaptive icon XML in the staging source set.
* fix(ios): add CocoaPods availability check to build script
* chore: replace LICENSE copies with symlinks to root
Fixes missing license warnings during iOS builds by ensuring
rust/ and rust_builder/ both symlink to the root LICENSE file.
* fix: handle app upgrade crashes from incompatible data and foreground service
When upgrading from an older version, multiple issues caused crashes:
1. The Rust whitenoise crate's secrets store format changed, causing
"Secrets store error: Key not found" during initialization. Since
the Rust singleton (tokio::sync::OnceCell) can't be reinitialized
after partial failure, a version marker file now detects stale data
and wipes the data directory before Rust init runs.
2. The flutter_foreground_task plugin stored foregroundServiceType
0x201 (dataSync|shortService) in native SharedPreferences, but the
manifest only declares dataSync (0x01). Android rejected
startForeground() with IllegalArgumentException. A one-time cleanup
in MainActivity.onCreate() clears these native prefs.
3. FlutterSecureStorage's internal migration from EncryptedSharedPreferences
re-introduced the old active_account_pubkey after deleteAll(). Fixed by
calling readAll() first to trigger the migration, then deleteAll().
4. The plugin's RebootReceiver and RestartReceiver caused cascade crashes
on package update. Both are now disabled via manifest merge overrides.
* chore: remove stale url_launcher from generated plugin files and add build improvements
Remove url_launcher references from Linux/Windows plugin registrants
(dependency was already removed from pubspec.yaml). Add split APK,
AAB build targets and quiet spinner to OpenSSL build script.
* fix(android): build static OpenSSL for Android and initialize keyring-core
Android doesn't ship a system libcrypto.so, which SQLCipher (via
libsqlite3-sys) requires. This adds a build script that cross-compiles
OpenSSL as a static library for each Android target (aarch64, armv7,
x86_64) and points the Rust build at those per-target installations.
Also adds the Keyring Kotlin class and initializes the NDK context
in MainActivity so keyring-core can access Android's secure storage.
* fix(android): verify OpenSSL tarball SHA-256 integrity after download
The SHA-256 hash was defined but never checked, and the value itself
was truncated (40 chars, not 64). Replace with the correct hash from
the official release and add verification before extracting.
* fix(android): add pipefail and remove tail pipes in OpenSSL build script
set -e alone does not catch failures in pipeline commands. Adding pipefail
ensures configure/make errors propagate instead of being masked by | tail -3.
* fix(android): detect Apple Silicon NDK path and portable SHA-256 check
The Darwin case now inspects uname -m to set HOST_TAG to darwin-arm64 on
Apple Silicon instead of always using darwin-x86_64.
SHA-256 verification falls back from shasum to sha256sum so the script
works on Linux systems that only ship sha256sum. Both tools use the same
output format (hash followed by filename) so awk '{print $1}' works for
either.
* feat(user-search): search by name with improved UX and metadata handling
- Redesign user list tile to match profile switcher pattern (medium avatar,
middle-ellipsis npub, consistent padding)
- Sort follows: users with metadata alphabetically first, then without
- Periodically refresh follows to pick up background metadata updates
- Batch name search stream updates (300ms) to reduce list jerkiness
- Add loading spinner in search field during active name search
- Sanitize malformed UTF-16 in metadata (surrogate pairs + UTF-8 round-trip)
- Pass metadata to start chat screen for instant display
- Truncate long about text to 10 lines in user profile card
* docs: update changelog with PR #234
* fix: screenutil height unit, improve test specificity and coverage
- Fix SizedBox height in search loading indicator to use .h instead of .w
- Target specific about Text widget in truncation test via content match
- Add tests for stream onDone, onError, and whitespace query edge cases
- Coverage improved from 99.31% to 99.41%
* refactor: remove unreachable else branch in useUserSearch
The isNameQuery check always evaluates true at that point since
_isNameSearch returns true for any non-empty query that isn't a hex
pubkey or partial npub — exactly the cases remaining after the
preceding branches.
* fix: log errors in useUserSearch onError instead of swallowing them
* feat: add replying to state to chat input hook
* feat: add reply preview type
* feat: get reply preview in user chat messages hook
* feat: add reply preview widget
* feat: add optional reply preview to message bubble
* feat: add on reply callback to message actions screen
* feat: add reply tags support to message service
* feat: add reply support in chat screen
* chore: ignore coverage of reply preview typedef file cause lcov considers 0% because it has no executabel code, but it does have tests
* fix: author metadata fetch and rebuild
* feat(widgets): add WnProfileSwitcherItem component
- Create reusable profile switcher item for switch profile screen
- Use WnAvatarSize.medium (56px) per Figma specs
- Use WnMiddleEllipsisText for npub display with middle truncation
- Add widgetbook showcase with real npub examples
- Refactor SwitchProfileScreen to use new component
Closes#141
* fix: rename sloth package imports to whitenoise and fix l10n validation
- Update wn_profile_switcher_item imports from sloth to whitenoise
- Update test and widgetbook imports from sloth to whitenoise
- Fix validate-locales-keys.sh to use LC_ALL=C for consistent sorting
- Include auto-generated plugin registrant updates
* refactor: compute formatted pubkey once in WnProfileSwitcherItem build
Extract formatPublicKey(npubFromHex(pubkey) ?? pubkey) into a local
final variable to avoid duplicate computation in the build method.
* Add internationalization support with 8 languages
- Add locale provider with system/manual language selection
- Add ARB translation files for EN, ES, FR, DE, IT, PT, RU, TR
- Localize all 19 screens and 23 widgets
- Add locale-aware date/number/currency formatters
- Add comprehensive locale provider tests (40+ tests)
- Add language selector in app settings
- Include proper ICU plural forms for all languages
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Formatting
* Regenerate flutter_rust_bridge bindings after rebase
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Formatting
* Improve locale persistence and add profile error strings
- Refactor LocaleNotifier to use secure storage for locale preference
- Add profileLoadError and profileSaveError localization strings
- Update tests for new locale provider implementation
- Fix various test issues and remove unused imports
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Improve test coverage and fix CI l10n validation
- Fix CI workflow to use jq for reliable ARB key extraction instead of grep
- Add error handling tests for LocaleProvider storage failures
- Add failure simulation flags to MockWnApi and MockSecureStorage
- Add tests for LocaleFormatters, LocalePersistenceException, and edge cases
- Add UI error handling tests for language update and npub conversion failures
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Improve dropdown scroll UX and fix test reliability
- Add scroll fade indicators to dropdown when options exceed visible items
- Refactor dropdown list into _ScrollableDropdownList widget
- Improve CI l10n validation with better jq error handling
- Remove unused _resolveSystemLanguageCode method
- Fix async test expectations in locale provider tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add atomic locale storage rollback and CI orphaned key detection
- Locale provider now captures previous preference before changes and
restores it atomically if the rust API call fails
- CI l10n validation now detects extra/orphaned keys in locale files
(not just missing keys), with improved error messaging
- Added tests for storage rollback behavior on API failure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Remove unused import
* refactor: move l10n keys validation to scrip folder
* Update spanish localizations
* fix(l10n): improve Spanish key terminology (clave → llave)
Use 'llave' instead of 'clave' for cryptographic keys in Spanish
translations, which is more commonly used in technical contexts.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ci: add pub cache to l10n-validation and locale validation to precommit
- Add Flutter pub cache step to l10n-validation CI job for faster runs
- Add validate-locales-keys to precommit and precommit-check recipes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(ci): use correct github.workspace context in l10n cache
Replace runner.workspace with github.workspace for the pub-cache
path in l10n-validation job. runner.workspace is not a valid
GitHub Actions context.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: josefinalliende <mariajosefinaalliende@gmail.com>