Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7eb8355 authored by Chaohui Wang's avatar Chaohui Wang Committed by Automerger Merge Worker
Browse files

Merge "Fix race condition in rememberPageStateFixed" into udc-dev am: 78ef8cae am: 5449918f

parents 28c1ac38 5449918f
Loading
Loading
Loading
Loading
+23 −11
Original line number Original line Diff line number Diff line
@@ -21,14 +21,13 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material3.TabRow
import androidx.compose.material3.TabRow
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.runtime.setValue
@@ -50,7 +49,7 @@ fun SettingsPager(titles: List<String>, content: @Composable (page: Int) -> Unit


    Column {
    Column {
        val coroutineScope = rememberCoroutineScope()
        val coroutineScope = rememberCoroutineScope()
        val pagerState by rememberPageStateFixed()
        val pagerState = rememberPageStateFixed()


        TabRow(
        TabRow(
            selectedTabIndex = pagerState.currentPage,
            selectedTabIndex = pagerState.currentPage,
@@ -89,17 +88,30 @@ fun SettingsPager(titles: List<String>, content: @Composable (page: Int) -> Unit
 */
 */
@Composable
@Composable
@OptIn(ExperimentalFoundationApi::class)
@OptIn(ExperimentalFoundationApi::class)
private fun rememberPageStateFixed(): State<PagerState> {
private fun rememberPageStateFixed(): PagerState {
    var currentPage by rememberSaveable { mutableStateOf(0) }
    var currentPage by rememberSaveable { mutableStateOf(0) }
    val pagerStateHolder = remember { mutableStateOf(PagerState(currentPage)) }
    var targetPage by rememberSaveable { mutableStateOf(-1) }
    LaunchedEffect(LocalConfiguration.current.orientation) {
    val pagerState = rememberPagerState()
    val configuration = LocalConfiguration.current
    var lastScreenWidthDp by rememberSaveable { mutableStateOf(-1) }
    val screenWidthDp = configuration.screenWidthDp
    LaunchedEffect(screenWidthDp) {
        // Reset pager state to fix an issue after configuration change.
        // Reset pager state to fix an issue after configuration change.
        // When we declare android:configChanges="orientation" in the manifest, the pager state is
        // When we declare android:configChanges in the manifest, the pager state is in a weird
        // in a weird state after configuration change.
        // state after configuration change.
        pagerStateHolder.value = PagerState(currentPage)
        targetPage = currentPage
        lastScreenWidthDp = screenWidthDp
    }
    LaunchedEffect(targetPage) {
        if (targetPage != -1) {
            pagerState.scrollToPage(targetPage)
            targetPage = -1
        }
    }
    }
    SideEffect {
    SideEffect {
        currentPage = pagerStateHolder.value.currentPage
        if (lastScreenWidthDp == screenWidthDp) {
            currentPage = pagerState.currentPage
        }
    }
    }
    return pagerStateHolder
    return pagerState
}
}