Skip to content

Fix/comprehensive review v2 - #1

Closed
NecoArc-Chaos wants to merge 123 commits into
MidSanCode:masterfrom
NecoArc-Chaos:fix/comprehensive-review-v2
Closed

Fix/comprehensive review v2#1
NecoArc-Chaos wants to merge 123 commits into
MidSanCode:masterfrom
NecoArc-Chaos:fix/comprehensive-review-v2

Conversation

@NecoArc-Chaos

Copy link
Copy Markdown

No description provided.

- project_serializer_io: include 'id' in info.json and restore it on load
- audio_service_io: await all seek/play futures so tracks start together
- openProject now accepts BuildContext and shows a SnackBar on deserialize failure
- undo/redo marks dirty and unloads cached WAVs for removed tracks
- remove ref.watch(playheadPositionProvider) from AudioEditor build
- introduce _PlayheadOverlay with ListenableBuilder so only the
  2 px playhead line + back-button rebuild on scroll/playhead moves
- replace hand-rolled _encodeWav / DataWriter in audio_service_io,
  synth_service_io, synth_service_web, audio_clip_editor, and
  generator_panel with WavEncoder.encode
- piano roll min/max note, steps per beat, position throttle,
  instrument render limit, and undo limit moved to AppConstants
- preserve project.id in web project serializer
- enable instrument track WAV generation on web via SynthService
- audio_service_io/web: add _trackMutes/_trackSolos, _applyEffectiveVolumes,
  setTrackMute, setTrackSolo; remove setMute and syncAllTracks
- playback_provider: drop effectiveVolume(); pass raw volume + isMuted
  to loadTrackFromPath; apply mute/solo via new AudioService API
- project_provider: drop _syncVolumes(); use setTrackMute/setTrackSolo
  and updateTrackVolume directly
- introduce _UndoState to snapshot project, currentFilePath, and isDirty
- undo/redo restore the full snapshot, preventing stale path after undo
- saveProject accepts optional BuildContext and shows error SnackBar
  on file picker failure or write error
- update all call sites in menu_bar, tool_bar, confirmDiscard,
  and tryNewProject to pass context
- wrap unloadTrack in try-catch; on failure roll back undo stack
- mark dirty flag false on failed removal
- android/app/build.gradle.kts: load signing from key.properties if present,
  otherwise fall back to debug signing
- add android/key.properties.example template
- update README with Android signing instructions
- sanitize archive file names by filtering .. and empty segments
- preserve internal directory structure while preventing escape from extract dir
- unloadTrack now deletes the temp WAV file for the unloaded track
- unloadAll and dispose clean up all cached WAV temp files
- playback_provider.play() now passes raw track.volume plus
  isMuted/isSolo to AudioService instead of computing effective
  volume itself
- this avoids corrupting trackVolume when mute/solo changes
- menu_bar.dart: forward BuildContext to saveProject so users see
  a SnackBar when file picker fails or write errors occur
- forceNewProject now clears the old project's auto-save cache
- openProject clears the previous project's auto-save cache after
  loading the new one to prevent orphaned .zap files
- replace verbose track.type == TrackType.instrument checks
  with track.type.isInstrument across editor, track_tile, and models
- add _loadingProjectId to ProjectNotifier
- openProject and _loadSerialized set the guard before async
  loadTrack calls and check it in callbacks
- prevents race condition where opening project B while A is still
  loading would let A's callbacks overwrite B's state
- openProject now calls confirmDiscard when the current project
  has unsaved changes, matching the behavior of tryNewProject
- search bar now filters placeholder items by label
- close button hides the browser panel via browserVisibilityProvider
- show 'No results' message when query matches nothing
- _DataWriter now throws StateError instead of crashing with
  IndexOutOfRangeException if the calculated fileSize is wrong
- loadTrack, loadTrackFromPath, and loadTracks now log exceptions
  via AppLogger.e so decoding/IO errors are visible in logs
- confirmDiscard and tryNewProject now abort discard/new project
  if saveProject fails, preventing silent data loss
- move _loadingProjectId assignment before state = ... in both
  openProject and _loadSerialized so async loadTrack callbacks
  always see the correct guard value
- if unloadTrack throws, roll back the undo entry and restore
  _isDirty from the saved undo state instead of hardcoding false
…muted param

- playback_provider no longer passes muted to loadTrackFromPath
- AudioService owns mute/solo state via _trackMutes/_trackSolos
- _applyEffectiveVolumes computes final volume uniformly
- recording_provider: expose error type via recordingErrorProvider
- transport_bar: show context-aware SnackBar for permission vs start failure
- browser: scan .projects directory for real .zap files in Projects tab
NecoArc-Chaos and others added 28 commits July 28, 2026 22:10
* fix: comprehensive review fixes

- Remove unsafe media_kit git dependency override
- Decouple BPM and playback speed (independent controls)
- Fix Web Blob URL memory leaks (track and revoke on unload)
- Add null safety to JS interop wrapper in audio_cache_web.dart
- Fix Provider lifecycle: restart autosave on settings change
- Skip autosave on web (file system not available)
- Clean up temp WAV files on dispose and when notes change
- Extract shared WavEncoder to eliminate code duplication
- Fix incomplete undo/redo deep clone (stepPattern)
- Add blob URL tracking and revocation in web audio service

* ci: add automated build verification workflow

* ci: add all platform build verification

* fix: remove duplicate dispose declaration in audio_service_web.dart

* fix: remove unused import in audio_service_web.dart

* fix: resolve remaining lint warnings and errors

- Remove duplicate dispose() method in audio_service_web.dart
- Add avoid_web_libraries_in_flutter ignore comments for web files
- Fix use_build_context_synchronously with mounted checks in track_tile.dart
- Remove unused yBottom variable in waveform_painter.dart
- Make _fftSize final in spectrogram_painter.dart
- Fix sort_child_properties_last in audio_editor.dart
- Fix curly braces in if-else statements

* ci: add --no-fatal-infos and --no-fatal-warnings to analyze step

* fix: add smoke test for CI and use --no-fatal-warnings in analyze

---------

Co-authored-by: Assistant <assistant@example.com>
- Change DialogTheme to DialogThemeData in app_theme.dart
- Fix duplicate _ parameter in project_provider.dart
- Replace app_settings with open_app_settings in transport_bar.dart
flutter_lints ^6.0.0 requires Dart SDK ^3.8.0 which is not available
in Flutter 3.24.5 (Dart 3.5.4) used by the web build job.
record ^7.1.1 requires Dart SDK >=3.12.0 which is not available
in Flutter 3.24.5 (Dart 3.5.4) used by the web build job.
DialogThemeData is not available in Flutter 3.24.5 (web build),
while DialogTheme is deprecated in Flutter 3.44.8. Use DialogTheme
with ignore comment for cross-version compatibility.
fix: review p0 fixes and CI improvements
- Add artifact uploads for all platforms
- Fix Windows artifact path to use Release (capital R) and runner/Release
- Add Windows build output inspection step
- Add --no-fatal-infos --no-fatal-warnings to analyze step
- Keep temurin for Android builds
The app_settings-7.0.0 transitive dependency is compiled with Kotlin 2.2.10,
but Gradle was resolving kotlin-stdlib to 2.0.0, causing metadata version
mismatch errors. Force resolution to match settings.gradle.kts (2.3.20).
* fix: remove broken afterEvaluate block from android/build.gradle.kts

The afterEvaluate block with typed lambda parameter causes Gradle
script compilation errors with AGP 8.0+. The app module already
sets compileSdk and compileOptions in app/build.gradle.kts, so
this root-level override is unnecessary and breaks the build.

* fix: upgrade Android Gradle Plugin to 8.6.0 for Flutter 3.44 compatibility

* fix: replace open_app_settings with app_settings for AGP 8.6+ compatibility

open_app_settings 2.0.1 does not specify a namespace in its Android
build file, which causes build failures with AGP 8.0+. app_settings
6.1.1 properly declares the namespace and is compatible with AGP 8.6+.

* fix: upgrade app_settings to 8.0.3 for iOS Swift 6 compatibility

app_settings 6.1.1 fails on Xcode 16 / Flutter 3.44 with:
  ConformanceIsolation (Xcode): Conformance of 'AppSettingsPlugin'
  to protocol 'FlutterPlugin' crosses into main actor-isolated code

Version 7.0.0 added @preconcurrency annotations for Swift 6.
Version 8.0.3 also includes Android AGP 9 compatibility fixes.
Dart API remains backward-compatible: AppSettings.openAppSettings()
still works without arguments.

* fix: upgrade Kotlin Gradle plugin to 2.2.0 for app_settings 8.0.3 compatibility

app_settings 8.0.3 depends on kotlin-stdlib 2.2.20, which requires
the Kotlin Gradle plugin to be at least 2.2.0. The previous version
(1.9.0) could not read the 2.2.0 metadata, causing compileReleaseKotlin
to fail with:

  Class 'kotlin.Unit' was compiled with an incompatible version of
  Kotlin. The actual metadata version is 2.2.0, but the compiler
  version 2.0.0 can read versions up to 2.1.0.

Fixes Build Android CI failure on PR #4.

* fix: revert Kotlin version to 1.9.0, use app_settings 7.0.3

Reverts the Kotlin Gradle plugin back to 1.9.0 because the Flutter
Gradle plugin internally requires this version. Having 2.2.0 on the
classpath alongside Flutter's 1.9.0 request causes:

  Error resolving plugin [id: 'org.jetbrains.kotlin.android',
  version: '1.9.0', apply: false]
  > already on the classpath with a different version (2.2.0)

Downgrades app_settings to 7.0.3 (compatible with Kotlin 1.9.0,
still includes Android namespace for AGP 8.x). The Swift 6
concurrency annotations from 8.0.3 are deferred to a separate
change that also upgrades the project Kotlin version to 2.2+.

Fixes Build Android CI failure on PR #4.

* fix: downgrade app_settings to 7.0.3 for Kotlin 1.9.0 compatibility

app_settings 8.0.3 bundles kotlin-stdlib 2.2.20, which is
incompatible with the project's Kotlin Gradle plugin 1.9.0
(required by the Flutter Gradle plugin). Version 7.0.3 stays on
Kotlin 1.9.x while still declaring the Android namespace needed for
AGP 8.x compatibility.

The Swift 6 concurrency annotations from 8.0.3 are deferred to a
follow-up change that also upgrades the project Kotlin version to 2.2+.

* fix: use app_settings 7.0.0 (actual published version, not 7.0.3)

app_settings 7.0.3 does not exist on pub.dev — only 7.0.0 was
published in the 7.x series. Version 7.0.0 is compatible with
Kotlin 1.9.0 (no Kotlin 2.2 stdlib dependency) and already declares
the Android namespace required by AGP 8.x.

The Swift 6 @preconcurrency annotations from app_settings 8.0.3
remain deferred to a follow-up that also upgrades the project Kotlin
version to 2.2+.

* fix: upgrade Kotlin to 2.3.20 and force stdlib version

- Update root build.gradle.kts Kotlin plugin from 1.9.0 to 2.3.20
- Add resolutionStrategy to force kotlin-stdlib to 2.3.20 across all subprojects
- Resolves Kotlin metadata version conflict with app_settings-7.0.0/8.0.3
  which is compiled with Kotlin 2.2.x

* fix: upgrade Kotlin plugin version to 2.3.20 in settings.gradle.kts

Align with resolutionStrategy in build.gradle.kts to resolve
Kotlin metadata version conflicts with transitive dependencies.

* fix: migrate kotlinOptions to compilerOptions DSL for Kotlin 2.3.20

The old kotlinOptions { jvmTarget = "17" } syntax is no longer
accepted by Kotlin Gradle plugin 2.3.20. Migrate to the new
compilerOptions DSL with jvmTarget.set(JvmTarget.JVM_17).

---------

Co-authored-by: Assistant <assistant@example.com>
- ci.yml: change Windows artifact upload path from build/windows/x64/release/** to build/windows/x64/runner/Release/** to match actual Flutter Windows release output
- build.yml: quote skip and if expressions to prevent YAML from parsing ! as a custom tag
@NecoArc-Chaos
NecoArc-Chaos deleted the fix/comprehensive-review-v2 branch July 31, 2026 02:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant