Feature/add russian translation#1
Merged
Merged
Conversation
Update README.md
Update README.md
Corrected the spelling of 'OpenIA' to 'OpenAI' in the README.
- **Home Screen**: Added a `LoadingIndicator` placeholder for the "Your Mix" section while songs are loading. - **Home Screen**: Conditionally hide the `StatsOverviewCard` if there is no recorded listening activity. - **Search Screen**: Redesigned the header to include a settings button alongside the search bar. - **Search Screen**: Updated layout to properly handle system status bar insets and removed unused background elements.
…laceholder-and-searchscreen-revamps feat: improve Home and Search screen layouts
Fix typo in README for AI
…ervice Add a catch block for `BackgroundServiceStartNotAllowedException` in `MusicService` to prevent crashes when `startForegroundService` is called while the app is in a background-cached state. This ensures the service fails gracefully when background execution limits are enforced.
…ervice-start-not-allowed-crash Handle BackgroundServiceStartNotAllowedException when starting MusicS…
Overrides `onTrimMemory` to invalidate cached widget artwork and clear `lastWidgetPlayerInfo` when the system signals memory pressure (`TRIM_MEMORY_RUNNING_LOW` or higher). This helps reduce the memory footprint of the service by freeing up bitmap data that can be reloaded during the next widget update cycle.
…crash Implement onTrimMemory in MusicService to release widget bitmap caches
The issue was caused by a unit mismatch in remote sources. While the app's internal Song model and UI expect the bitrate in bits per second (bps), several data sources, including Navidrome, Jellyfin, and the fallback metadata readers (TagLib/JAudioTagger), were providing it in kilobits per second (kbps). When a bitrate like 128 (meaning 128 kbps) was passed to the UI, the display logic divided it by 1000, resulting in '0 kbps' (128 / 1000 = 0). Signed-off-by: starry-shivam <touka.krs@gmail.com>
Fix 0kbps bitrate reporting for cloud sources (Navidrome/Jellyfin)
- Refactor AppLanguage from object to enum for better type safety - Use Resource annotations for language labels - Fix German language not being displayed in settings map - Improve normalize function with null safety
- Delete colors.xml, themes.xml, and font configurations from values-de, ko, nb, and ru - Keep only actual string resources in translation directories to avoid duplication
- Add setcat_language_german to all strings_settings.xml files - Fix build failure caused by missing string resources in AppLanguage enum
- Remove duplicate setcat_language_german entry in values-in
- Deleted redundant 'setcat_language_german' entry in values-in/strings_settings.xml - Resolved resource merger build failure
Refactor AppLanguage structure and finalize language localizations
Signed-off-by: starry-shivam <touka.krs@gmail.com>
Getting ready for beta 7 :)
…ranslation ru-lang-support
feat: Navigate to artist page when clicking on artist name in player UI
- Introduce `WearLifecycleState` to track whether the app is in the foreground and the device is in an active (non-ambient) state. - Update `WearMainActivity` to monitor ambient mode transitions using `AmbientLifecycleObserver`. - Gate continuous animations, such as the EQ icon and play-button rotation, on the interactive state to save battery. - Optimize polling loops in `VolumeScreen`, `OutputScreen`, and `WearPlayerViewModel` by increasing delays and pausing work when the screen is off or in ambient mode. - Improve `PlayerScreen` performance by memoizing background brushes to reduce GC churn and aligning clock updates to minute boundaries. - Gate player position updates in `WearLocalPlayerRepository` to avoid unnecessary `StateFlow` churn when the UI is not visible.
…neral-optimizations Optimize power usage by gating UI work and polling on interactivity
Create crowdin.yml
- Implemented parallel album song fetching using kotlin async/await to increase sync speed. - Moved library sync execution to WorkManager for reliable background syncing when the user navigates to a different screen or puts the app in the background and switches to another app. - Added a progress bar and live sync status to the Navidrome dashboard page so user can see the current sync progress. - Added a 24 hour cooldown threshold for auto sync when opening navidrome dashboard Signed-off-by: starry-shivam <touka.krs@gmail.com>
Enhances Google Cast playback reliability by implementing precise MIME type detection for Ogg/Opus/Vorbis streams and preventing seeks on unstable formats that may crash the receiver session. Optimizes local resource usage by lazily initializing auxiliary ExoPlayer instances. - Added `CastAudioMimeUtils` to handle codec detection and MIME normalization for Cast-supported formats. - Implemented `CastRemotePlaybackState` to accurately project remote `MediaStatus` into local playback states, including buffering and recoverable error handling. - Introduced seek-stability checks for Cast playback, blocking seek requests for unstable Ogg streams and notifying the user. - Refactored `DualPlayerEngine` to lazily initialize the auxiliary `ExoPlayer` instance, reducing memory overhead when crossfades/transitions are not in use. - Improved Cast session authorization in `MediaFileHttpServerService` to better support range requests from various LAN endpoints. - Added automatic Cast error recovery logic to end sessions gracefully when a stream becomes unrecoverable. - Optimized cold-start queue preparation in `MusicService` for large playlists. - Added localized strings for Cast seek limitations.
- Improved Cover Workflow: Integrated image cropping and panning directly into the selection process, automatically opening the adjustment view when a cover is added or changed. - Enhanced Adjustment UI: Added guided instructions, a dedicated 'Adjust your cover art' title, and a clear 'Done' action button for better usability. - Better Cover Actions: Added a high-visibility red 'Remove' button and improved the 'Change' workflow in the Image tab. - Reliable Saving: Fixed logic in PlaylistViewModel to ensure framing adjustments are correctly processed and saved for both new and existing playlists. - Refined Navigation: Improved back-button handling to return to the edit form from the adjustment screen instead of closing the dialog.
feat: enhance playlist cover adjustment and management
fix: update license information from MIT to Proprietary License
Introduces a byte-probing mechanism for ISO-BMFF containers to improve audio codec detection and implements a buffering watchdog to handle remote stalls. Refactors the transcode cache to support progressive streaming, decoupling encoder performance from client connection stability. - Added `IsoBmffAudioCodecDetector` to parse MP4 boxes for accurate MIME type identification (ALAC, AAC, AC3). - Refactored `MediaFileHttpServerService` to stream transcoded data progressively from growing temp files, replacing the `TeeOutputStream` implementation. - Implemented a remote buffering watchdog in `CastTransferStateHolder` with multi-stage recovery (status request, item reload, or local fallback). - Improved handling of HTTP Range requests during active transcoding to prevent Cast loading timeouts. - Refined ALAC/AAC identification by combining metadata hints, CSD-0 presence, and byte probing. - Added unit tests for ISO-BMFF codec detection.
Refactors `PlayerViewModel` to identify and reuse existing media items within the current playback queue, reducing unnecessary reloads. Significantly expands `GenreIconProvider` with a comprehensive localized keyword mapping system and additional iconography. Optimizes `PlaybackStatsRepository` performance through event caching and query constraints. - Added `resolveReusablePlaybackTargetIndex` to identify and seek to existing media items when the playback context matches. - Expanded `GenreIconProvider` with extensive internationalized support for dozens of genres across multiple languages (including Spanish, Portuguese, French, German, Japanese, Korean, and Chinese). - Implemented `cachedEvents` in `PlaybackStatsRepository` to minimize file I/O during statistics computation. - Introduced `MAX_SONG_STATS_COUNT` and conditional distribution logic to improve stats processing performance. - Updated `DualPlayerEngine` to notify player swap listeners when a transition is canceled while running. - Cleaned up playback cancellation logic into `cancelPendingDirectPlaybackBuild`.
Refactors how `predictiveBackCollapseProgress` affects sheet transformations by introducing an `effectiveFraction`. This unify expansion and back-gesture states, leading to cleaner interpolation logic for heights, corner radii, and paddings. - Introduced `effectiveFraction` calculation to combine `playerContentExpansionFraction` and `predictiveBackCollapseProgress`. - Simplified `playerContentAreaHeightPxProvider` and corner radius calculations using the unified fraction. - Removed edge-specific horizontal padding logic (`predictiveBackSwipeEdge`), making padding uniform during back gestures. - Set `currentBottomPadding` to a constant `0.dp`. - Removed unnecessary `currentSheetContentState` and `predictiveBackSwipeEdge` dependencies from various state providers.
Introduces the ability to set local audio files as system ringtones, notification sounds, or alarms directly from the `SongInfoBottomSheet`. This includes a new selection dialog, confirmation flow, and the necessary permission handling for modifying system settings. - Added `WRITE_SETTINGS` permission to `AndroidManifest.xml`. - Implemented `setSongAsTone` logic in `SongInfoBottomSheetViewModel` using `RingtoneManager` and `MediaStore` URI resolution. - Added `ToneTargetPickerDialog` and `ToneConfirmationDialog` composables to handle user selection and confirmation. - Integrated `ActivityResultLauncher` in `SongInfoBottomSheet` to request system settings write permissions when needed. - Updated the bottom sheet layout to include a new "Set as" action button alongside existing watch transfer options. - Added localized strings for several languages, including Indonesian, Russian, Norwegian, Korean, German, Chinese, French, Italian, and Spanish.
Replaces the millisecond-based `optimisticPosition` with a fraction-based `targetSeekFraction` to prevent the progress slider from snapping back after a seek operation. This aligns the synchronization logic with the `LyricsSheet` component, ensuring the slider thumb stays at the dropped position until the smooth playback progress catches up. - Replaced `optimisticPosition` with `targetSeekFraction` and `lastSeekFinishedTime`. - Migrated catch-up logic from a manual `while` loop to `snapshotFlow` for better reactivity. - Updated catch-up thresholds to 4% progress difference or a 5-second safety timeout. - Simplified `animatedProgressState` logic using a `when` block. - Ensured seek state is reset when the `songId` changes.
Updates the `MarqueeText` component to better handle overflow scenarios by adding a fade-out gradient effect and refining the scrolling logic. - Simplified the `canStart` derived state logic by removing the `canScroll` dependency. - Added a new layout block for overflowing text that applies a horizontal gradient fade to the right edge using `BlendMode.DstIn`. - Ensured `softWrap = false` is consistently applied to all text states. - Improved layout constraints by adding `fillMaxWidth()` to the marquee container and its internal text components.
Optimizes the progress rendering logic to prevent visual artifacts during significant state changes like track switching or resuming from the background. - Snaps progress immediately if the delta exceeds 10%, avoiding the "slow slide" effect during track changes or large seeks. - Caps the update interval to a maximum of 250ms to prevent excessive tweening when progress resumes after the app was backgrounded or paused. - Updated `lastProgressUpdateNanos` handling to ensure smooth transitions after snapping.
Updates `RecentlyPlayedSongUiModel` to support parcelization and utilizes `rememberSaveable` to ensure the recently played songs list is preserved across configuration changes and process death. - Added `@Parcelize` and `Parcelable` implementation to `RecentlyPlayedSongUiModel`. - Switched from `remember` to `rememberSaveable` for the `recentlyPlayedSongs` state in `HomeScreen`.
Introduces an `AnimatedVisibility` overlay that appears when the player sheet is expanded. This scrim provides a visual backdrop and allows users to collapse the `UnifiedPlayerSheetV2` by tapping the background area. - Added `isExpandedOrExpanding` state derived from the player expansion fraction. - Implemented a semi-transparent `Box` that covers the screen when the sheet is active. - Added `pointerInput` with `detectTapGestures` to trigger `collapsePlayerSheet()` on tap. - Applied fade-in and fade-out animations for the overlay transitions.
Impl/beta 7 prep 2
chore: update zh-CN translations
…ding chore: refine zh-CN wording
zh-rCN translation updates and refinements
Beta 7 last fixes
Beta 7 last fixes
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.
No description provided.