Skip to content

Commit 3b43eeb

Browse files
authored
Merge pull request #135 from kalzEOS/feat/perf-dpad-pass-2
Ship v3.3.5: isolate side-nav animation recomposition
2 parents f224691 + 18ca420 commit 3b43eeb

2 files changed

Lines changed: 82 additions & 46 deletions

File tree

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import java.util.Properties
33
import org.gradle.api.provider.Property
44
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
55

6-
val appVersionCode = 131
7-
val appVersionName = "3.3.4"
6+
val appVersionCode = 132
7+
val appVersionName = "3.3.5"
88

99
plugins {
1010
alias(libs.plugins.android.application)

app/src/main/java/com/example/xtreamplayer/BrowseScreen.kt

Lines changed: 80 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,62 @@ import androidx.compose.runtime.withFrameNanos
6767

6868
private const val BROWSE_NAV_ANIM_DURATION_MS = 180
6969

70+
@Composable
71+
private fun BrowseSideNavRail(
72+
selectedSection: Section,
73+
navExpanded: Boolean,
74+
navLayoutExpanded: Boolean,
75+
onSectionSelected: (Section) -> Unit,
76+
onMoveRight: () -> Unit,
77+
allNavItemFocusRequester: FocusRequester,
78+
continueWatchingNavItemFocusRequester: FocusRequester,
79+
favoritesNavItemFocusRequester: FocusRequester,
80+
moviesNavItemFocusRequester: FocusRequester,
81+
seriesNavItemFocusRequester: FocusRequester,
82+
liveNavItemFocusRequester: FocusRequester,
83+
categoriesNavItemFocusRequester: FocusRequester,
84+
localFilesNavItemFocusRequester: FocusRequester,
85+
settingsNavItemFocusRequester: FocusRequester
86+
) {
87+
var navSlideExpanded by remember { mutableStateOf(navExpanded) }
88+
LaunchedEffect(navExpanded) {
89+
if (navExpanded) {
90+
navSlideExpanded = false
91+
withFrameNanos {}
92+
delay(16)
93+
navSlideExpanded = true
94+
} else {
95+
navSlideExpanded = false
96+
}
97+
}
98+
val navProgress by animateFloatAsState(
99+
targetValue = if (navSlideExpanded) 1f else 0f,
100+
animationSpec = tween(durationMillis = BROWSE_NAV_ANIM_DURATION_MS),
101+
label = "browseNavSlide"
102+
)
103+
val navWidthPx = with(LocalDensity.current) { NAV_WIDTH.toPx() }
104+
val navOffsetPx = -navWidthPx * (1f - navProgress)
105+
SideNav(
106+
selectedSection = selectedSection,
107+
onSectionSelected = onSectionSelected,
108+
onMoveRight = onMoveRight,
109+
expanded = navSlideExpanded,
110+
layoutExpanded = navLayoutExpanded,
111+
allNavItemFocusRequester = allNavItemFocusRequester,
112+
continueWatchingNavItemFocusRequester = continueWatchingNavItemFocusRequester,
113+
favoritesNavItemFocusRequester = favoritesNavItemFocusRequester,
114+
moviesNavItemFocusRequester = moviesNavItemFocusRequester,
115+
seriesNavItemFocusRequester = seriesNavItemFocusRequester,
116+
liveNavItemFocusRequester = liveNavItemFocusRequester,
117+
categoriesNavItemFocusRequester = categoriesNavItemFocusRequester,
118+
localFilesNavItemFocusRequester = localFilesNavItemFocusRequester,
119+
settingsNavItemFocusRequester = settingsNavItemFocusRequester,
120+
modifier =
121+
Modifier.graphicsLayer { translationX = navOffsetPx }
122+
.alpha(navProgress)
123+
)
124+
}
125+
70126
@Composable
71127
internal fun BrowseScreen(
72128
context: Context,
@@ -156,29 +212,16 @@ internal fun BrowseScreen(
156212
val focusManager = LocalFocusManager.current
157213
var navMoveToContentTrigger by remember { mutableIntStateOf(0) }
158214
var navLayoutExpanded by remember { mutableStateOf(true) }
159-
var navSlideExpanded by remember { mutableStateOf(true) }
160215
LaunchedEffect(navExpanded) {
161216
if (navExpanded) {
162217
navLayoutExpanded = true
163-
navSlideExpanded = false
164-
withFrameNanos {}
165-
delay(16)
166-
navSlideExpanded = true
167218
} else {
168-
navSlideExpanded = false
169219
delay(BROWSE_NAV_ANIM_DURATION_MS.toLong())
170220
if (!navExpanded) {
171221
navLayoutExpanded = false
172222
}
173223
}
174224
}
175-
val navProgress by animateFloatAsState(
176-
targetValue = if (navSlideExpanded) 1f else 0f,
177-
animationSpec = tween(durationMillis = BROWSE_NAV_ANIM_DURATION_MS),
178-
label = "browseNavSlide"
179-
)
180-
val navWidthPx = with(LocalDensity.current) { NAV_WIDTH.toPx() }
181-
val navOffsetPx = -navWidthPx * (1f - navProgress)
182225
val favoriteContentKeys by
183226
favoritesRepository.favoriteContentKeys.collectAsStateWithLifecycle(initialValue = emptySet())
184227
val favoriteCategoryKeys by
@@ -285,38 +328,31 @@ internal fun BrowseScreen(
285328
}
286329

287330
Row(modifier = Modifier.fillMaxSize()) {
288-
SideNav(
289-
selectedSection = selectedSection,
290-
onSectionSelected = {
291-
selectedSection = it
292-
// Trigger lazy sync for SERIES/LIVE when first accessed
293-
if (it == Section.SERIES || it == Section.LIVE) {
294-
activeConfig?.let { config ->
295-
onTriggerSectionSync(it, config)
296-
}
331+
BrowseSideNavRail(
332+
selectedSection = selectedSection,
333+
navExpanded = navExpanded,
334+
navLayoutExpanded = navLayoutExpanded,
335+
onSectionSelected = { section ->
336+
selectedSection = section
337+
if (section == Section.SERIES || section == Section.LIVE) {
338+
activeConfig?.let { config ->
339+
onTriggerSectionSync(section, config)
297340
}
298-
// Don't auto-focus content - user must press Right to navigate
299-
// there
300-
},
301-
onMoveRight = {
302-
Timber.d("NavItem: onMoveRight called, attempting directional move to content")
303-
navMoveToContentTrigger++
304-
},
305-
expanded = navSlideExpanded,
306-
layoutExpanded = navLayoutExpanded,
307-
allNavItemFocusRequester = allNavItemFocusRequester,
308-
continueWatchingNavItemFocusRequester =
309-
continueWatchingNavItemFocusRequester,
310-
favoritesNavItemFocusRequester = favoritesNavItemFocusRequester,
311-
moviesNavItemFocusRequester = moviesNavItemFocusRequester,
312-
seriesNavItemFocusRequester = seriesNavItemFocusRequester,
313-
liveNavItemFocusRequester = liveNavItemFocusRequester,
314-
categoriesNavItemFocusRequester = categoriesNavItemFocusRequester,
315-
localFilesNavItemFocusRequester = localFilesNavItemFocusRequester,
316-
settingsNavItemFocusRequester = settingsNavItemFocusRequester,
317-
modifier =
318-
Modifier.graphicsLayer { translationX = navOffsetPx }
319-
.alpha(navProgress)
341+
}
342+
},
343+
onMoveRight = {
344+
Timber.d("NavItem: onMoveRight called, attempting directional move to content")
345+
navMoveToContentTrigger++
346+
},
347+
allNavItemFocusRequester = allNavItemFocusRequester,
348+
continueWatchingNavItemFocusRequester = continueWatchingNavItemFocusRequester,
349+
favoritesNavItemFocusRequester = favoritesNavItemFocusRequester,
350+
moviesNavItemFocusRequester = moviesNavItemFocusRequester,
351+
seriesNavItemFocusRequester = seriesNavItemFocusRequester,
352+
liveNavItemFocusRequester = liveNavItemFocusRequester,
353+
categoriesNavItemFocusRequester = categoriesNavItemFocusRequester,
354+
localFilesNavItemFocusRequester = localFilesNavItemFocusRequester,
355+
settingsNavItemFocusRequester = settingsNavItemFocusRequester
320356
)
321357

322358
Box(modifier = Modifier.fillMaxHeight().weight(1f)) {

0 commit comments

Comments
 (0)