summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LazyListExtensions.kt13
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt13
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationList.kt14
3 files changed, 27 insertions, 13 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LazyListExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LazyListExtensions.kt
index 3e90b6de7e..2c1630f50c 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LazyListExtensions.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LazyListExtensions.kt
@@ -1,7 +1,9 @@
package net.mullvad.mullvadvpn.compose.extensions
+import androidx.compose.foundation.gestures.animateScrollBy
import androidx.compose.foundation.lazy.LazyItemScope
import androidx.compose.foundation.lazy.LazyListScope
+import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.HorizontalDivider
@@ -39,3 +41,14 @@ inline fun <T> LazyListScope.itemsIndexedWithDivider(
itemContent(index, item)
HorizontalDivider(color = Color.Transparent)
}
+
+suspend fun LazyListState.animateScrollAndCentralizeItem(index: Int) {
+ val itemInfo = this.layoutInfo.visibleItemsInfo.firstOrNull { it.index == index }
+ if (itemInfo != null) {
+ val center = layoutInfo.viewportEndOffset / 2
+ val childCenter = itemInfo.offset + itemInfo.size / 2
+ animateScrollBy((childCenter - center).toFloat())
+ } else {
+ animateScrollToItem(index)
+ }
+}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt
index 16234326d2..12d5bde055 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt
@@ -15,6 +15,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -41,6 +42,7 @@ import net.mullvad.mullvadvpn.compose.component.ScaffoldWithSmallTopBar
import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar
import net.mullvad.mullvadvpn.compose.constant.CommonContentKey
import net.mullvad.mullvadvpn.compose.constant.ContentType
+import net.mullvad.mullvadvpn.compose.extensions.animateScrollAndCentralizeItem
import net.mullvad.mullvadvpn.compose.preview.CustomListLocationUiStatePreviewParameterProvider
import net.mullvad.mullvadvpn.compose.state.CustomListLocationsUiState
import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR
@@ -150,6 +152,7 @@ fun CustomListLocationsScreen(
}
Spacer(modifier = Modifier.height(Dimens.verticalSpace))
val lazyListState = rememberLazyListState()
+
LazyColumn(
horizontalAlignment = Alignment.CenterHorizontally,
modifier =
@@ -176,6 +179,16 @@ fun CustomListLocationsScreen(
}
}
}
+
+ if (state is CustomListLocationsUiState.Content.Data && !state.newList) {
+ val firstChecked = state.locations.indexOfFirst { it.checked }
+ LaunchedEffect(Unit) {
+ if (firstChecked != -1) {
+ lazyListState.scrollToItem(firstChecked)
+ lazyListState.animateScrollAndCentralizeItem(firstChecked)
+ }
+ }
+ }
}
}
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationList.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationList.kt
index 08a35f13d8..95bcebdd28 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationList.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationList.kt
@@ -1,6 +1,5 @@
package net.mullvad.mullvadvpn.compose.screen.location
-import androidx.compose.foundation.gestures.animateScrollBy
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
@@ -8,7 +7,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
-import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -28,6 +26,7 @@ import net.mullvad.mullvadvpn.compose.button.PrimaryButton
import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicatorLarge
import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar
import net.mullvad.mullvadvpn.compose.constant.ContentType
+import net.mullvad.mullvadvpn.compose.extensions.animateScrollAndCentralizeItem
import net.mullvad.mullvadvpn.compose.state.RelayListItem
import net.mullvad.mullvadvpn.compose.state.RelayListType
import net.mullvad.mullvadvpn.compose.state.SelectLocationListUiState
@@ -153,14 +152,3 @@ private fun SelectLocationListUiState.indexOfSelectedRelayItem(): Int? =
} else {
null
}
-
-private suspend fun LazyListState.animateScrollAndCentralizeItem(index: Int) {
- val itemInfo = this.layoutInfo.visibleItemsInfo.firstOrNull { it.index == index }
- if (itemInfo != null) {
- val center = layoutInfo.viewportEndOffset / 2
- val childCenter = itemInfo.offset + itemInfo.size / 2
- animateScrollBy((childCenter - center).toFloat())
- } else {
- animateScrollToItem(index)
- }
-}