Focus restore doesn't work for Jetpack-Compose Android

130 Views Asked by At

I have this compose code:

@Composable
fun TabItems(
    viewableViewState: ViewableViewState.Ready,
    onPlayClicked: (viewableInterface: ViewableInterface) -> Unit,
    modifier: Modifier = Modifier,
) {
    var selectedTabIndex by remember { mutableIntStateOf(0) }
    var focusedTabIndex by remember { mutableIntStateOf(0) }

    val tabItems = viewableViewState.viewable?.let {
        getTabItems(it)
    } ?: emptyList()
    val context = LocalContext.current
    val primaryColor = Color(context.partnerTheme.primaryBackground)

    Column(
        modifier = modifier
            .animateContentSize()
            .fillMaxHeight(),
    ) {
        TabRow(
            selectedTabIndex = selectedTabIndex,
            containerColor = Color.Transparent,
            modifier = Modifier.padding(start = 30.dp, end = 16.dp),
            contentColor = primaryColor,
            separator = { Spacer(modifier = Modifier.width(24.dp)) },
            indicator = { _, _ ->
                // set indicator if needed
            },
        ) {
            tabItems.forEachIndexed { index, item ->
                Tab(
                    selected = selectedTabIndex == index,
                    onClick = { selectedTabIndex = index },
                    modifier = Modifier.focusRestorer(),
                    content = {
                        Text(
                            text = stringResource(id = item.textResourceId),
                            maxLines = 2,
                            style = typography.body.copy(
                                fontWeight = if (selectedTabIndex == index) FontWeight.Bold else FontWeight.Normal,
                                textDecoration = if (focusedTabIndex == index) TextDecoration.Underline else TextDecoration.None,
                                color = Color(context.partnerTheme.themePrimaryTint0),
                            ),
                        )
                    },
                    onFocus = {
                        focusedTabIndex = index
                    },
                )
            }
        }
        Spacer(modifier = Modifier.height(16.dp))
        if (tabItems.isNotEmpty()) {
            when (val item = tabItems[selectedTabIndex]) {
                is MoviesTabItem -> MoviesItemContent(
                    modifier = Modifier
                        .fillMaxSize()
                        .padding(start = 30.dp),
                    relatedContents = item.relatedContents,
                    onMoviePlay = onPlayClicked,
                )

                is ReadMoreTabItem -> ReadMoreTabItemContent(
                    modifier = Modifier
                        .fillMaxSize()
                        .padding(start = 30.dp),
                    data = item.data,
                )

                is SeasonTabItem -> SeasonTabItemContent(
                    modifier = Modifier
                        .fillMaxSize()
                        .padding(start = 30.dp),
                    seasons = item.seasons,
                    onEpisodePlay = onPlayClicked,
                )
            }
        }
    }
}

called from here:

 TabItems(
                            viewableViewState = uiState,
                            modifier = Modifier
                                .onFocusChanged {
                                    if (it.hasFocus) {
                                        collapseMovieDetails = true
                                    }
                                },
                            onPlayClicked = { viewable ->
                                context.startActivity(
                                    PlayerActivity.newIntent(
                                        context = context,
                                        viewable = viewable,
                                    ),
                                )
                            },
                        )
                    }

My problem is that after going back to the same page the buttons focus is not restoring properly. Anyone have idea why?

I've tried to set focusRestore to the TabRow/TabItem but didn't helped. Maybe the place where I'm calling this from is "swallowing" the focus?

0

There are 0 best solutions below