From 0e737a1a73f5710dbf20a1494000d828002ad854 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 4 Aug 2026 03:41:38 +0000 Subject: [PATCH] Perf: Debounce search inputs and offload filtering - Modifies ExperienceHome and ExperienceLibrary in RockMusicExperience.kt to use `LaunchedEffect` for debouncing search input keystrokes by 300ms. - Offloads expensive `UnifiedHomeLibrary.localTracks` filtering computations to `Dispatchers.Default`. - Replaces synchronous `remember` blocks with state properties that are updated asynchronously, keeping the main thread responsive. Co-authored-by: SayanthRock <202829406+SayanthRock@users.noreply.github.com> --- .../app/presentation/RockMusicExperience.kt | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/rockmusic/app/presentation/RockMusicExperience.kt b/app/src/main/java/com/rockmusic/app/presentation/RockMusicExperience.kt index b5fb1bb..bfd1269 100644 --- a/app/src/main/java/com/rockmusic/app/presentation/RockMusicExperience.kt +++ b/app/src/main/java/com/rockmusic/app/presentation/RockMusicExperience.kt @@ -95,6 +95,9 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil3.compose.AsyncImage import com.rockmusic.app.domain.model.LocalTrack import com.rockmusic.app.player.PlayerUiState +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext private enum class ExperienceDestination(val label: String) { HOME("Home"), @@ -285,9 +288,17 @@ private fun ExperienceHome( if (hasPermission && state.tracks.isEmpty() && !state.isLoading) onLoad() } - val visibleTracks = remember(state.tracks, query, source) { - UnifiedHomeLibrary.localTracks(state.tracks, query, source) + var visibleTracks by remember { mutableStateOf>(emptyList()) } + + // ⚡ Bolt: Debounce keystrokes and offload expensive list filtering to a background thread + // to prevent UI stutter and main thread blocking. + LaunchedEffect(state.tracks, query, source) { + delay(300) + visibleTracks = withContext(Dispatchers.Default) { + UnifiedHomeLibrary.localTracks(state.tracks, query, source) + } } + val featuredTracks = remember(visibleTracks) { UnifiedHomeLibrary.featuredTracks(visibleTracks) } @@ -589,8 +600,15 @@ private fun ExperienceLibrary( onOpenAudio: () -> Unit, ) { var query by remember { mutableStateOf("") } - val results = remember(tracks, query) { - UnifiedHomeLibrary.localTracks(tracks, query, UnifiedHomeSource.SONGS) + var results by remember { mutableStateOf>(emptyList()) } + + // ⚡ Bolt: Debounce keystrokes and offload expensive list filtering to a background thread + // to prevent UI stutter and main thread blocking. + LaunchedEffect(tracks, query) { + delay(300) + results = withContext(Dispatchers.Default) { + UnifiedHomeLibrary.localTracks(tracks, query, UnifiedHomeSource.SONGS) + } } LazyColumn(