@@ -7001,13 +7001,15 @@ fun FavoritesScreen(
70017001 var pendingViewFocus by remember { mutableStateOf(false) }
70027002 var pendingCategoryEnterFocus by remember { mutableStateOf(false) }
70037003 var pendingCategoryReturnFocus by remember { mutableStateOf(false) }
7004+ var returnFocusItem by remember { mutableStateOf<ContentItem?>(null) }
70047005 var lastSelectedFavoriteCategoryId by remember { mutableStateOf<String?>(null) }
70057006 var lastSelectedFavoriteCategoryIndex by remember { mutableIntStateOf(0) }
70067007 var lastMenuSelection by remember { mutableStateOf(FavoritesView.ITEMS) }
70077008 val menuFocusRequesters = remember { listOf(FocusRequester(), FocusRequester()) }
70087009 val backFocusRequester = remember { FocusRequester() }
70097010 val backDownFocusRequester = remember { FocusRequester() }
70107011 val itemsFirstFocusRequester = remember { FocusRequester() }
7012+ val returnFocusFocusRequester = remember { FocusRequester() }
70117013 val episodesFocusRequester = remember { FocusRequester() }
70127014 var pendingEpisodeFocus by remember { mutableStateOf(false) }
70137015 var selectedCategoryContentCount by remember { mutableIntStateOf(0) }
@@ -7091,13 +7093,15 @@ fun FavoritesScreen(
70917093
70927094 LaunchedEffect(pendingSeriesReturnFocus, selectedSeries) {
70937095 if (pendingSeriesReturnFocus && selectedSeries == null) {
7094- val requester =
7095- if (resumeFocusId != null) {
7096- resumeFocusRequester
7097- } else {
7098- contentItemFocusRequester
7099- }
7100- requestFocusWithFrameRetries(requester, frameRetries = 2)
7096+ val returnId = returnFocusItem?.id
7097+ val requester = when {
7098+ returnId != null && returnId == resumeFocusId -> resumeFocusRequester
7099+ returnId != null -> returnFocusFocusRequester
7100+ resumeFocusId != null -> resumeFocusRequester
7101+ else -> itemsFirstFocusRequester
7102+ }
7103+ requestFocusWithFrameRetries(requester, frameRetries = 5)
7104+ returnFocusItem = null
71017105 pendingSeriesReturnFocus = false
71027106 }
71037107 }
@@ -7274,8 +7278,13 @@ fun FavoritesScreen(
72747278 val activeSeries = selectedSeries!!
72757279 val closeSeriesDetails = {
72767280 pendingSeriesPlaybackTransition = false
7277- onItemFocused(activeSeries)
7278- runCatching { contentItemFocusRequester.requestFocus() }
7281+ val itemToFocus = returnFocusItem ?: activeSeries
7282+ val returnId = itemToFocus.id
7283+ runCatching {
7284+ if (returnId == resumeFocusId) resumeFocusRequester.requestFocus()
7285+ else returnFocusFocusRequester.requestFocus()
7286+ }
7287+ onItemFocused(itemToFocus)
72797288 pendingSeriesReturnFocus = true
72807289 selectedSeries = null
72817290 pendingSeriesInfo = null
@@ -7411,9 +7420,10 @@ fun FavoritesScreen(
74117420 (posterColumns - 1).coerceAtMost(sortedContent.lastIndex)
74127421 val requester =
74137422 when {
7423+ item.id == resumeFocusId -> resumeFocusRequester
7424+ item.id == returnFocusItem?.id -> returnFocusFocusRequester
74147425 index == 0 -> itemsFirstFocusRequester
74157426 index == backDownTargetIndex -> backDownFocusRequester
7416- item.id == resumeFocusId -> resumeFocusRequester
74177427 else -> null
74187428 }
74197429 val isLeftEdge = index % posterColumns == 0
@@ -7439,8 +7449,11 @@ fun FavoritesScreen(
74397449 if (item.contentType == ContentType.SERIES &&
74407450 item.containerExtension.isNullOrBlank()
74417451 ) {
7452+ returnFocusItem = item
74427453 pendingSeries = item
74437454 } else if (item.contentType == ContentType.MOVIES) {
7455+ returnFocusItem = item
7456+ runCatching { returnFocusFocusRequester.requestFocus() }
74447457 pendingSeries = null
74457458 onMovieInfo(item, sortedContent)
74467459 } else {
@@ -8910,6 +8923,7 @@ fun ContinueWatchingScreen(
89108923 val episodesFocusRequester = remember { FocusRequester() }
89118924 val clearAllFocusRequester = remember { FocusRequester() }
89128925 val clearAllDownFocusRequester = remember { FocusRequester() }
8926+ val returnFocusFocusRequester = remember { FocusRequester() }
89138927 val gridState = rememberLazyGridState()
89148928 val movieQueueItems =
89158929 remember(displayEntries) {
@@ -8971,18 +8985,18 @@ fun ContinueWatchingScreen(
89718985 if (!pendingSeriesReturnFocus || selectedSeries != null || displayEntries.isEmpty()) {
89728986 return@LaunchedEffect
89738987 }
8974- val shouldResume =
8975- resumeFocusId != null &&
8976- displayEntries.any { entry ->
8977- entry.displayItem.id == resumeFocusId ||
8978- resolvedParents[ entry.key]?.id == resumeFocusId
8979- }
8980- val requester = if (shouldResume) resumeFocusRequester else contentItemFocusRequester
8981- val focused = requestFocusWithFrameRetries(requester, frameRetries = 2)
8982- if (focused) {
8983- pendingSeriesReturnFocus = false
8984- return@LaunchedEffect
8985- }
8988+ val returnId = returnFocusItem?.id
8989+ val requester = when {
8990+ returnId != null && returnId == resumeFocusId -> resumeFocusRequester
8991+ returnId != null -> returnFocusFocusRequester
8992+ resumeFocusId != null && displayEntries.any { entry ->
8993+ entry.displayItem.id == resumeFocusId ||
8994+ resolvedParents[entry.key]?.id == resumeFocusId
8995+ } -> resumeFocusRequester
8996+ else -> contentItemFocusRequester
8997+ }
8998+ requestFocusWithFrameRetries(requester, frameRetries = 5)
8999+ returnFocusItem = null
89869000 pendingSeriesReturnFocus = false
89879001 }
89889002
@@ -9020,6 +9034,11 @@ fun ContinueWatchingScreen(
90209034 val closeSeriesDetails = {
90219035 pendingSeriesPlaybackTransition = false
90229036 val itemToFocus = returnFocusItem ?: activeSeries
9037+ val returnId = itemToFocus.id
9038+ runCatching {
9039+ if (returnId == resumeFocusId) resumeFocusRequester.requestFocus()
9040+ else returnFocusFocusRequester.requestFocus()
9041+ }
90239042 selectedSeries = null
90249043 pendingSeriesInfo = null
90259044 pendingEpisodeFocus = false
@@ -9210,8 +9229,9 @@ fun ContinueWatchingScreen(
92109229 val item = displayItem
92119230 val requester =
92129231 when {
9213- index == clearAllDownTargetIndex -> clearAllDownFocusRequester
92149232 item.id == resumeFocusId -> resumeFocusRequester
9233+ item.id == returnFocusItem?.id -> returnFocusFocusRequester
9234+ index == clearAllDownTargetIndex -> clearAllDownFocusRequester
92159235 index == 0 -> contentItemFocusRequester
92169236 else -> null
92179237 }
@@ -9237,7 +9257,11 @@ fun ContinueWatchingScreen(
92379257 fontScaleFactor = posterFontScale,
92389258 onActivate = {
92399259 when (entry.resumeItem.contentType) {
9240- ContentType.MOVIES -> onMovieInfo(item, movieQueueItems)
9260+ ContentType.MOVIES -> {
9261+ returnFocusItem = item
9262+ runCatching { returnFocusFocusRequester.requestFocus() }
9263+ onMovieInfo(item, movieQueueItems)
9264+ }
92419265 ContentType.SERIES -> {
92429266 if (!firstSeriesLaunchLoadingShown) {
92439267 showFirstSeriesLaunchLoading = true
@@ -9448,14 +9472,13 @@ fun SeriesSeasonsScreen(
94489472 }
94499473
94509474 LaunchedEffect(seriesItem.streamId, focusPlayOnOpen) {
9451- withFrameNanos {}
94529475 headerCollapsed = false
94539476 episodesViewportExpanded = false
94549477 internalEpisodeFocusRequested = false
94559478 if (focusPlayOnOpen) {
9456- playFocusRequester.requestFocus( )
9479+ requestFocusWithFrameRetries(playFocusRequester, frameRetries = 5 )
94579480 } else {
9458- contentItemFocusRequester.requestFocus( )
9481+ requestFocusWithFrameRetries(contentItemFocusRequester, frameRetries = 5 )
94599482 }
94609483 }
94619484
0 commit comments