Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,8 @@ composeCompiler {
// Applies Compose's strong skipping optimization (skip composables whose parameters
// haven't changed) in Debug builds as well, making dev-mode performance more
// representative of Release and reducing unnecessary recompositions during development.
enableStrongSkippingMode = true

// Reduces generated code for non-skippable composables, improving runtime
// performance by eliminating unnecessary group bookkeeping.
featureFlags = setOf(
org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag.OptimizeNonSkippingGroups
org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag.StrongSkipping
)
}

Expand Down
4 changes: 4 additions & 0 deletions app/src/debug/res/values-de/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">PixelPlayer [D]</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/debug/res/values-ko/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">PixelPlayer [D]</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/debug/res/values-nb/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">PixelPlayer [D]</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/debug/res/values-ru/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">PixelPlayer [D]</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,9 @@ class TransitionController @Inject constructor(
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
Timber.tag("TransitionDebug").d("onMediaItemTransition: %s (reason=%d)", mediaItem?.mediaId, reason)
// When we naturally move to a new song, ensure pauseAtEnd is OFF by default.
engine.setPauseAtEndOfMediaItems(false)
engine.setPauseAtEndOfMediaItems(shouldPause = false)

if (mediaItem != null) {
scheduleTransitionFor(mediaItem)
}
mediaItem?.let { scheduleTransitionFor(it) }
}

override fun onIsPlayingChanged(isPlaying: Boolean) {
Expand Down Expand Up @@ -115,7 +113,7 @@ class TransitionController @Inject constructor(
// Cancel any existing job first and reset pauseAtEnd so a stale `true`
// from the previous job doesn't cause an unexpected pause.
transitionSchedulerJob?.cancel()
engine.setPauseAtEndOfMediaItems(false)
engine.setPauseAtEndOfMediaItems(shouldPause = false)

transitionSchedulerJob = scope.launch {
// If a transition is currently running, cancel it immediately.
Expand All @@ -138,7 +136,9 @@ class TransitionController @Inject constructor(
if (nextMediaItem == null) {
Timber.tag("TransitionDebug").d(
"No next track (index=%d, count=%d, repeatMode=%d). No transition.",
nextIndex, player.mediaItemCount, repeatMode
nextIndex,
player.mediaItemCount,
repeatMode,
)
engine.cancelNext()
return@launch
Expand Down Expand Up @@ -166,7 +166,7 @@ class TransitionController @Inject constructor(
}
}

kotlinx.coroutines.flow.combine(settingsFlow, isCrossfadeEnabledFlow) { resolution, isEnabled ->
combine(settingsFlow, isCrossfadeEnabledFlow) { resolution, isEnabled ->
Pair(resolution, isEnabled)
}.distinctUntilChanged() // Crucial: prevents restarting the job if the same settings are emitted again
.collectLatest { (resolution, isEnabled) ->
Expand All @@ -183,15 +183,15 @@ class TransitionController @Inject constructor(
if (isGloballyDisabled) {
Timber.tag("TransitionDebug").d("Crossfade globally disabled. Using default gap.")
engine.cancelNext()
engine.setPauseAtEndOfMediaItems(false)
engine.setPauseAtEndOfMediaItems(shouldPause = false)
return@collectLatest
}

// If transition is disabled or has no duration, do nothing.
if (settings.mode == TransitionMode.NONE || settings.durationMs <= 0) {
Timber.tag("TransitionDebug").d("Transition disabled or zero duration.")
engine.cancelNext()
engine.setPauseAtEndOfMediaItems(false)
engine.setPauseAtEndOfMediaItems(shouldPause = false)
return@collectLatest
}

Expand Down Expand Up @@ -232,7 +232,7 @@ class TransitionController @Inject constructor(

// --- CRITICAL FIX: Enable Pause At End ---
// We want to control the transition manually, so we prevent auto-advance.
engine.setPauseAtEndOfMediaItems(true)
engine.setPauseAtEndOfMediaItems(shouldPause = true)
Timber.tag("TransitionDebug").d("Enabled pauseAtEndOfMediaItems to prevent auto-skip.")

if (transitionPoint <= player.currentPosition) {
Expand All @@ -244,7 +244,7 @@ class TransitionController @Inject constructor(
} else {
Timber.tag("TransitionDebug").w("Too close to end (%d ms left). Skipping to avoid glitch.", remaining)
engine.cancelNext()
engine.setPauseAtEndOfMediaItems(false)
engine.setPauseAtEndOfMediaItems(shouldPause = false)
}
return@collectLatest
}
Expand All @@ -270,7 +270,7 @@ class TransitionController @Inject constructor(
engine.performTransition(settings.copy(durationMs = effectiveDuration.toInt()))
} else {
Timber.tag("TransitionDebug").d("Job cancelled before firing.")
engine.setPauseAtEndOfMediaItems(false)
engine.setPauseAtEndOfMediaItems(shouldPause = false)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.theveloper.pixelplay.presentation.viewmodel

import android.util.Log
import com.theveloper.pixelplay.data.model.SearchFilterType
import com.theveloper.pixelplay.data.model.SearchHistoryItem
import com.theveloper.pixelplay.data.model.SearchResultItem
Expand Down Expand Up @@ -45,7 +44,7 @@ class SearchStateHolder @Inject constructor(

private data class SearchRequest(
val query: String,
val requestId: Long
val requestId: Long,
)

// Search State
Expand Down
27 changes: 27 additions & 0 deletions app/src/main/res/values-de/colors.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>

<color name="my_primary">#6750A4</color>
<color name="my_on_primary">#FFFFFF</color>
<color name="my_primary_container">#EADDFF</color>
<color name="my_on_primary_container">#2D2931</color>

<color name="my_secondary">#625B71</color>
<color name="my_on_secondary">#FFFFFF</color>
<color name="my_secondary_container">#E8DEF8</color>
<color name="my_on_secondary_container">#1D192B</color>

<color name="my_tertiary">#7D5260</color>
<color name="my_on_tertiary">#FFFFFF</color>
<color name="pixelplay_widget_background_color">#FF2C1D4D</color>

<color name="pixel_play_purple_dark">#19191B</color>
<color name="light_background">#EDEDED</color>
</resources>
17 changes: 17 additions & 0 deletions app/src/main/res/values-de/font_certs.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="com_google_android_gms_fonts_certs">
<item>@array/com_google_android_gms_fonts_certs_dev</item>
<item>@array/com_google_android_gms_fonts_certs_prod</item>
</array>
<string-array name="com_google_android_gms_fonts_certs_dev">
<item>
MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
</item>
</string-array>
<string-array name="com_google_android_gms_fonts_certs_prod">
<item>
MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
</item>
</string-array>
</resources>
39 changes: 39 additions & 0 deletions app/src/main/res/values-de/plurals.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="sharing_playlists_message">
<item quantity="one">%d Playlist wird geteilt</item>
<item quantity="other">%d Playlists werden geteilt</item>
</plurals>
<plurals name="exported_playlists_message">
<item quantity="one">%1$d Playlist nach %2$s exportiert</item>
<item quantity="other">%1$d Playlists nach %2$s exportiert</item>
</plurals>
<plurals name="n_songs_added_to_queue">
<item quantity="one">%d Song zur Warteschlange hinzugefügt</item>
<item quantity="other">%d Songs zur Warteschlange hinzugefügt</item>
</plurals>
<plurals name="n_songs_will_play_next">
<item quantity="one">%d Song wird als Nächstes gespielt</item>
<item quantity="other">%d Songs werden als Nächstes gespielt</item>
</plurals>
<plurals name="n_songs_added_to_favorites">
<item quantity="one">%d Song zu Favoriten hinzugefügt</item>
<item quantity="other">%d Songs zu Favoriten hinzugefügt</item>
</plurals>
<plurals name="n_songs_removed_from_favorites">
<item quantity="one">%d Song aus Favoriten entfernt</item>
<item quantity="other">%d Songs aus Favoriten entfernt</item>
</plurals>
<plurals name="n_files_deleted">
<item quantity="one">%d Datei gelöscht</item>
<item quantity="other">%d Dateien gelöscht</item>
</plurals>
<plurals name="delete_songs_confirmation_title">
<item quantity="one">%d Song löschen?</item>
<item quantity="other">%d Songs löschen?</item>
</plurals>
<plurals name="sleep_timer_play_count_times">
<item quantity="one">%d Mal</item>
<item quantity="other">%d Male</item>
</plurals>
</resources>
6 changes: 6 additions & 0 deletions app/src/main/res/values-de/preloaded_fonts.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="preloaded_fonts" translatable="false">
<item>@font/montserrat_bold</item>
</array>
</resources>
Loading
Loading