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

Commit 973b4534 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:...

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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23237783



Change-Id: I23c76349ee0ae9afa6d00c42101313f5ec56d8a4
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 0eeb12aa d7eb8355
Loading
Loading
Loading
Loading
+23 −11
Original line number 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.pager.HorizontalPager
import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material3.TabRow
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
@@ -50,7 +49,7 @@ fun SettingsPager(titles: List<String>, content: @Composable (page: Int) -> Unit

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

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