summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsPager.kt34
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
}