* 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.
* feat(widgets): add WnCarouselIndicator component
Implement carousel indicator widget for showing position in paginated content.
- Active dot expands (28px) with primary fill color
- Inactive dots are circular (8px) with secondary fill color
- Directional bounce animation using elasticOut curve (600ms)
- Fast color transition (150ms) for smooth deactivation
- 8px gap between indicator dots
Closes#103
* fix: use .r for border radius and remove context anti-pattern
- Change BorderRadius.circular(4.h) to BorderRadius.circular(4.r)
- Remove stored BuildContext field in _InteractiveCarouselIndicator
* chore: use whitenoise app team and bundle id
* chore: add apk commands
* chore: rename package from sloth to whitenoise
* docs: remove sloth word from readme and agents.md
* chore: replace sloth texts with whitenoise
* chore: remove unused error screen
* docs: copy LICENSE file from whitenoise repo
* chore: upgrade version to 0.3.0+15 so that android apk can replace old whitenoise ones
* refactor: rename MyApp to WnApp
* chore: use new staging bundle id
* chore: rename org.parres to IPF
* chore: remove .so file
* fix: make android signer work after bundle id change
* core: replace org.parres with dev.ipf for widgebtook
* test: improve coverage