From 3c7c121c7d25df028a2b2faeafa5671fa1113dc6 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 10 Oct 2026 00:13:51 +0700 Subject: [PATCH] android: expanded width - two-column Connect, 640dp settings --- .../android/ui/compose/HomeScreen.kt | 49 +++++++++++++++---- .../android/ui/compose/SettingsScreen.kt | 4 +- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/HomeScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/HomeScreen.kt index 39ff71ef2..8ffb74dc6 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/HomeScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/HomeScreen.kt @@ -113,6 +113,9 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.flow.StateFlow +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.foundation.layout.fillMaxHeight import org.strongswan.android.R import org.strongswan.android.data.VpnProfile import org.strongswan.android.logic.VpnStateService.ErrorState @@ -221,15 +224,8 @@ fun HomeScreen( Box(Modifier.fillMaxSize()) { StatusGlowBackground(color = statusColor, active = connected || connecting) - LazyColumn( - state = listState, - /* the adaptive navigation scaffold no longer pads the content area, - * so the hero offsets itself below the status bar */ - modifier = Modifier.fillMaxSize().statusBarsPadding(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(ShxSpacing.lg), - ) - { + val wide = LocalConfiguration.current.screenWidthDp >= 840 + val leftItems: LazyListScope.() -> Unit = { item(key = "hero") { Column( modifier = Modifier @@ -304,6 +300,8 @@ fun HomeScreen( TrafficTiles(traffic = traffic, onClick = { viewModel.openDetails(true) }) } } + } + val rightItems: LazyListScope.() -> Unit = { item(key = "banner") { HomeBannerSlot( error = hasError, @@ -329,6 +327,39 @@ fun HomeScreen( } item(key = "space") { Spacer(Modifier.height(ShxSpacing.xl)) } } + if (wide) + { + /* expanded width: hero and profile on the left, status blocks on the right */ + Row(Modifier.fillMaxSize().statusBarsPadding()) + { + LazyColumn( + state = listState, + modifier = Modifier.weight(1f).fillMaxHeight(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(ShxSpacing.lg), + ) { leftItems() } + LazyColumn( + modifier = Modifier.weight(1f).fillMaxHeight().padding(top = ShxSpacing.xl), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(ShxSpacing.lg), + ) { rightItems() } + } + } + else + { + LazyColumn( + state = listState, + /* the adaptive navigation scaffold no longer pads the content area, + * so the hero offsets itself below the status bar */ + modifier = Modifier.fillMaxSize().statusBarsPadding(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(ShxSpacing.lg), + ) + { + leftItems() + rightItems() + } + } } if (pickerOpen) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/SettingsScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/SettingsScreen.kt index c94f5625b..06eb88435 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/SettingsScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/SettingsScreen.kt @@ -95,6 +95,7 @@ import org.strongswan.android.ui.compose.theme.ThemeMode import androidx.compose.material3.Icon import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.widthIn import org.strongswan.android.R import org.strongswan.android.data.VpnProfile import org.strongswan.android.logic.StrongSwanApplication @@ -181,9 +182,10 @@ fun SettingsScreen(profiles: List, showTitle: Boolean = true) val effects = MaterialTheme.motionScheme.defaultEffectsSpec() val spatial = MaterialTheme.motionScheme.defaultSpatialSpec() - Box(Modifier.fillMaxSize()) + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.TopCenter) { AnimatedContent( + modifier = Modifier.widthIn(max = 640.dp), targetState = pageState, transitionSpec = { val forward = targetState != SettingsPage.ROOT