diff options
-rw-r--r-- | packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsPager.kt | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsPager.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsPager.kt index aa5ce301e9f5..79635a0c8280 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsPager.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsPager.kt @@ -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 } |