Conversation
- Add `androidx.core:core-splashscreen` dependency to `libs.versions.toml` and `androidApp` build configuration. - Define `Theme.BlockBlast.Starter` in `themes.xml` inheriting from `Theme.SplashScreen` to configure background and icon properties. - Update `AndroidManifest.xml` to use the new splash screen starter theme as the default application theme. - Invoke `installSplashScreen()` in `MainActivity` to manage the splash screen transition before setting the content.
…ed helper classes - Implement `GameAnalyticsLogger` to centralize and standardize game event logging with consistent parameters. - Implement `GameInitializer` to manage game bootstrap logic, including session restoration and score seeding. - Implement `ReviveCountdownManager` to encapsulate the revive timer lifecycle and tick logic. - Simplify the `GameStoreFactory` executor by delegating initialization, logging, and countdown concerns to the new components. - Extract review qualification logic into a private helper function within `GameStoreFactory`. - Remove the unused `StoreReviewRepository` dependency from the store factory and updated relevant tests.
Replace the increment-in-a-loop hack in DefaultGameComponent with `SettingsRepository.suppressReviewPrompts(max)`, so the cap happens in one disk write under the existing write mutex. Also drop the redundant `best > settings.bestScore.value` guard in GameStoreFactory — setBestScore is already monotonic at the repository level — and correct the now-stale doc on setBestScore. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
DefaultGameComponent now goes through GameAnalyticsLogger, eliminating its private gameParams() copy that drifted from the one in the executor. HomeStoreFactory and DefaultHomeComponent share a new HomeAnalyticsLogger so the (best_score, has_saved_game) payload is built in one place. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds concurrent-writer tests for setBestScore (monotonic under shuffled parallel writes), suppressReviewPrompts (idempotent, no-op above max), and the mixed increment + suppress case (floor must hold under races). Catches any future regression that removes withLock from one of the read-modify-write paths. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace the single looped music_ambient track with a shuffled playlist (block, feltwood, mossy) that picks a new track on each completion and never repeats the previous one back-to-back. Avoids ear fatigue from a single short loop during long sessions. One AVAudioPlayer/MediaPlayer at a time — no crossfade, no second decoder in memory. iOS advances via a coroutine that delays for the track duration; Android advances via OnCompletionListener. Also re-encodes audio assets to mono mp3 (80k for music, 96k for voice lines), strips embedded cover art, and drops dead preload entries for files that never existed on disk. Total audio assets: ~10.9 MB → 8.2 MB. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Update `GameComponent` interface to expose a single `Value<Model>` instead of separate properties for game state and countdown. - Define `GameComponent.Model` data class to encapsulate both `GameState` and the game-over `continueCountdown` value. - Implement `stateToModel` mapper in the integration layer to transform `GameStoreState` into the component's UI model. - Update `GameContent` Composable to subscribe to the unified UI model and extract game data and countdown values accordingly. - Refactor `DefaultGameComponent` and unit test mocks to align with the updated component interface.
- Move `ReviewPromptComponent` and its associated tests to the `ge.yet.blockblast.feature.game.reviewprompt` package. - Reorganize the `settings` feature by grouping components, stores, and integration mappers into dedicated `main`, `libraries`, and `more` sub-packages. - Update package declarations and imports across the `composeApp` and feature modules to reflect the new project structure. - Ensure consistency in test source sets by mirroring the package changes for unit tests.
Adds release changelog highlighting rotating background music and the Android SplashScreen API refresh shipped in this version.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
GameComponentstate unified into a single UI model,GameStoreFactorybusiness logic extracted into helpers, analytics payloads unified behind per-feature loggers, review-prompt suppression centralized in one repository call, and write-mutex race conditions inSettingsBackedSettingsRepositorycovered by tests