Consolidated community contributions: AI architecture overhaul, tablet optimization, localization (ja/ar/pt-BR/fr), customizable library tabs, playlist concurrency fix, UI improvements, security hardening, and code quality pass#2404
Open
daedaevibin wants to merge 108 commits into
Conversation
Updated Italian strings in changelogs for improved clarity and consistency.
[ci skip]
…or the Arabic resource directory
…anguage enum and remove legacy translation keys
Add widthIn(max = 540.dp) to dialogs and several setup pages to constrain content on wide screens and import required layout helpers. Rename the SineWaveLine parameter from `waves` to `wavesDensity`, update its KDoc and default, and adjust the theta calculation to scale density relative to a 380dp baseline width. Update all call sites (BetaInfoBottomSheet, ChangelogBottomSheet, PlaylistContainer, SetupScreen, etc.) to use `wavesDensity`. Also small UI tweaks in SetupScreen: comment out CenterHorizontally alignment, reduce a spacer height, and set the welcome artwork to requiredWidth(380.dp). These changes improve responsive layout behavior and make the sine wave drawing density consistent across different widths.
f again
still working on the min width and the back animation
Renamed the central AI orchestration class from AiOrchestrator to AiHandler and updated all references across the codebase.
…s all providers - Create UnifiedModelFilter utility that filters out embedding, image, TTS, speech, moderation, vision-only, and other non-chat models - Update GeminiAiClient to use UnifiedModelFilter instead of hardcoded markers - Update GenericOpenAiClient to use UnifiedModelFilter instead of inline filter
These providers all use OpenAI-compatible APIs. Switching from dedicated client classes to GenericOpenAiClient eliminates duplicate code. The old class files are kept on disk but no longer referenced.
Add CUSTOM provider with hasConfigurableUrl=true and requiresApiKey=true for user-configured self-hosted/custom API endpoints.
CUSTOM provider uses GenericOpenAiClient with an empty default URL (user configures it via settings). createClientWithUrl allows creating a client with a custom base URL for configurable-URL providers.
…urrently PlaylistPreferencesRepository edited playlists with an unsynchronized read-modify-write: userPlaylistsFlow.first() -> modify list -> updatePlaylist(). Removing several songs in quick succession fired concurrent coroutines that each read the same snapshot, so the last write won and the other removals were silently dropped. The Playlists-menu song count (songIds.size, read from the DB) then stayed stuck high, while the playlist detail screen still looked correct because it updates optimistically per tap. Serialize the read-modify-write editors (add/remove/reorder/rename/updatePlaylist /removeSongFromAllPlaylists) behind a coroutine Mutex so each edit reads and writes atomically. A private updatePlaylistLocked avoids re-entrant locking. Add an instrumentation regression test covering sequential add/remove, the concurrent-removal race, and the exact issue PixelPlayerHQ#2391 reproduction (fails before this change, passes after). Fixes PixelPlayerHQ#2391
Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout). Updates `actions/checkout` from 6 to 7 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](actions/checkout@v6...v7) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps the gradle-dependencies group with 1 update: [com.google.genai:google-genai](https://github.com/googleapis/java-genai). Updates `com.google.genai:google-genai` from 1.58.0 to 1.59.0 - [Release notes](https://github.com/googleapis/java-genai/releases) - [Changelog](https://github.com/googleapis/java-genai/blob/main/CHANGELOG.md) - [Commits](googleapis/java-genai@v1.58.0...v1.59.0) --- updated-dependencies: - dependency-name: com.google.genai:google-genai dependency-version: 1.59.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: gradle-dependencies ... Signed-off-by: dependabot[bot] <support@github.com>
Security:
- Fix OkHttp response body leaks in AI clients by using .use{} blocks
- All HTTP responses now properly closed in OpenAiCompatibleClient base
Error handling:
- Add Timber logging to silent catch blocks in EqualizerPreferencesRepository,
PlaylistViewModel, LyricsStateHolder, FileExplorerStateHolder,
DeviceCapabilitiesViewModel, PhoneDirectWatchTransferCoordinator
Refactoring:
- Extract OpenAiCompatibleClient base class from DeepSeek, Groq, Mistral,
GenericOpenAi clients (~600 lines of duplicated code removed)
- Extract ServerUrlUtils for shared URL normalization/validation logic
used by NavidromeCredentials and JellyfinCredentials
Tests:
- Add AiClientFactoryTest (all providers, blank key validation)
- Add OpenAiCompatibleClientTest (config, model filtering, token counting)
- Add CloudMusicUtilsTest (JSON parsing, artist name parsing)
- Add ServerUrlUtilsTest (URL normalization, validation, local network checks)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
The abstract val 'defaultModel' generated a getDefaultModel() JVM getter that clashed with the AiClient interface's getDefaultModel() function. Renamed to 'providerDefaultModel' and 'providerDefaultModels' to avoid the accidental override. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…/github-actions-640176b5ab chore(deps): bump actions/checkout from 6 to 7 in the github-actions group
…dependencies-8a53d774ef chore(deps): bump com.google.genai:google-genai from 1.58.0 to 1.59.0 in the gradle-dependencies group
Security: - Fix OkHttp response body leaks in GDriveApiService (4 methods) - Fix JSON injection in GDriveApiService.createFolder — use JSONObject builder instead of string interpolation - Harden GDriveApiService.getAuthHeader to require a token instead of silently sending 'Bearer ' with empty token Performance: - Cache 6 Regex patterns in LyricsRepositoryImpl companion object that were recompiled on every call to normalizeForMatch/timingVariantTokens/ looksLikeFlattenedWordByWordCache Thread safety: - Add @volatile to GDriveStreamProxy's server, actualPort, startJob fields accessed from multiple threads Error handling: - Add Timber.w logging to 12 more silent catch blocks across backup (BackupManager, BackupWriter, BackupHistoryRepository, LegacyPayloadAdapter), database (PixelPlayDatabase migrations, SongEntity), network (NeteaseApiService, QQSignGenerator, QqMusicRepository), presentation (ThemeStateHolder, SongRemovalStateHolder), and utils (MediaMetadataRetrieverPool) Code quality: - Remove dead try/catch in ChangelogBottomSheet.openUrl that caught and redid the exact same operation - Make filterModels internal for testability Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Security: - Update Netty constraint from non-existent 4.2.28.Final to latest actual release 4.2.15.Final to address Dependabot alerts #36, #37, #38 Bug fix: - Fix AbsoluteSmoothCornerShape parameter ordering in NavBarCornerRadiusScreen non-full-width preview — smoothness params were misaligned with their corner radius params Code quality: - Sort imports alphabetically in GenreCategoriesGrid; add explicit imports for FilledIconButton, Icon, IconButtonDefaults to replace inline FQN usage - Translate all Spanish comments to English in SongEntity, PlaylistViewModel, OtherShapes, GenreCategoriesGrid Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…-errorhandling-refactor-tests Security hardening, error handling, AI client refactoring, and test coverage
…gs for consistency
…overhaul, new providers, and generation tuning
…plement customizable tab management
…lation and configure app languages Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…sing telegram channel topics and About screen buttons Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…nai:google-genai from 1.58.0 to 1.59.0
…aylist edits from concurrent song removals
…layerHQ#2371 PR #41 refactored AI clients into OpenAiCompatibleClient base class. Upstream PixelPlayerHQ#2371 deleted separate clients entirely, unified into GenericOpenAiClient. Resolution: accept PixelPlayerHQ#2371's deletions, remove now-dead OpenAiCompatibleClient and its test, update AiClientFactoryTest to match new architecture. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…convention Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…ated-upstream-prs Consolidated upstream PRs: AI overhaul, tablet support, localization (ja/ar/pt-BR/fr), tab management, playlist fix, UI fixes, deps bump
Contributor
Author
SummaryBrings together 12 community PRs, security hardening, error observability, code deduplication, performance optimizations, and test coverage across 169 files (7,980 insertions, 4,032 deletions). Community PRs Consolidated
AI Architecture Overhaul (#2371)
Tablet Optimization (#2363)
Localization
Customizable Library Tabs (#2373)
Playlist Concurrency Fix (#2400)
UI Improvements (#2383)
Security Hardening
Code Quality
Tests
Dependency Updates
Conflict Resolution Notes
|
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.
To place everything into one place, along with other improvements and work, I have merged all the pending PRs into my own fork and I am working currently to resolve conflicts.