@@ -67,6 +67,62 @@ import androidx.compose.runtime.withFrameNanos
6767
6868private 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
71127internal 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
287330Row (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