feat(radar): fill radar in split-screen via measured window size

The previous compact-mode trigger used currentWindowAdaptiveInfo(),
which reports the full-screen size class in split-screen / multi-window,
so the radar never enlarged there. Measure the actual window bounds with
BoxWithConstraints: compact (radar weight 1f fills all space, pager fixed
132dp strip) when maxWidth < 600dp && maxHeight < 480dp.

build: release version 4.4.7-ba7opf.17.6 (529)
This commit is contained in:
atsunatsu committed 2026-09-27 20:13:13 +08:00
1 parent f1091acbbd
commit 800494b978
2 files changed
+50 -35

No files matched your search

@@ -30,12 +30,14 @@ import androidx.compose.animation.core.tween
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.HorizontalPager
@@ -74,8 +76,6 @@ import com.rtbishop.look4sat.core.presentation.TimerRow
import com.rtbishop.look4sat.core.presentation.TopBar import com.rtbishop.look4sat.core.presentation.TopBar
import com.rtbishop.look4sat.core.presentation.formatFrequency import com.rtbishop.look4sat.core.presentation.formatFrequency
import com.rtbishop.look4sat.core.presentation.getDefaultPass import com.rtbishop.look4sat.core.presentation.getDefaultPass
import com.rtbishop.look4sat.core.presentation.hasEnoughHeight
import com.rtbishop.look4sat.core.presentation.isVerticalLayout
import com.rtbishop.look4sat.core.presentation.layoutPadding import com.rtbishop.look4sat.core.presentation.layoutPadding
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@@ -88,6 +88,9 @@ private enum class RadarPage(val title: String) {
Sstv("SSTV") Sstv("SSTV")
} }
/** Compact pager strip height in split-screen / small windows. */
private val COMPACT_PAGER_HEIGHT = 132.dp
@Composable @Composable
fun RadarDestination(navigateUp: () -> Unit) { fun RadarDestination(navigateUp: () -> Unit) {
val context = LocalContext.current val context = LocalContext.current
@@ -173,42 +176,54 @@ private fun RadarScreen(
time = it.time time = it.time
) )
} }
Column( BoxWithConstraints(
modifier = Modifier modifier = Modifier
.layoutPadding() .layoutPadding()
.padding(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) .padding(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding())
.keepScreenOn(), .keepScreenOn()
verticalArrangement = Arrangement.spacedBy(6.dp)
) { ) {
val isVertical = isVerticalLayout() // Measure the ACTUAL window constraints instead of the window size
// In split-screen / small windows the vertical space is scarce: give the // class: currentWindowAdaptiveInfo() often reports the full-screen
// radar card the priority share so the plot stays large (its Canvas is a // size in split-screen / multi-window, so the compact branch never
// square limited by the card's smaller dimension), and shrink the pager // triggered there. maxHeight/maxWidth are the real window bounds.
// card — its pages are all scrollable, so nothing gets clipped. val isVertical = maxWidth < 600.dp
val radarWeight = if (isVertical && !hasEnoughHeight()) 1.6f else 1f // In split-screen / small windows the vertical space is scarce: let the
val pagerWeight = if (isVertical && !hasEnoughHeight()) 0.6f else 1f // radar card fill ALL remaining space so the square plot is as large as
if (isVertical) { // possible, and give the pager a compact fixed strip — its pages are all
TopBar { // scrollable, so nothing gets clipped. Full-screen layouts keep the 1:1 split.
IconCard(action = navigateUp, resId = R.drawable.ic_back) val compact = isVertical && maxHeight < 480.dp
TimerRow(timeString = uiState.currentTime, isTimeAos = uiState.isTimeAos) Column(
IconCard(action = addToCalendar, resId = R.drawable.ic_calendar) modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(6.dp)
) {
if (isVertical) {
TopBar {
IconCard(action = navigateUp, resId = R.drawable.ic_back)
TimerRow(timeString = uiState.currentTime, isTimeAos = uiState.isTimeAos)
IconCard(action = addToCalendar, resId = R.drawable.ic_calendar)
}
TopBar { NextPassRow(pass = upcomingPass, isUtc = uiState.isUtc) }
} else {
TopBar {
IconCard(action = navigateUp, resId = R.drawable.ic_back)
TimerRow(timeString = uiState.currentTime, isTimeAos = uiState.isTimeAos)
NextPassRow(pass = upcomingPass, modifier = Modifier.weight(1f), isUtc = uiState.isUtc)
IconCard(action = addToCalendar, resId = R.drawable.ic_calendar)
}
} }
TopBar { NextPassRow(pass = upcomingPass, isUtc = uiState.isUtc) } if (isVertical) {
} else { if (compact) {
TopBar { RadarCard(uiState, trackB, trackBPosition, Modifier.weight(1f))
IconCard(action = navigateUp, resId = R.drawable.ic_back) PagerCard(uiState, onAction, logViewModel, requestMicPermission, Modifier.height(COMPACT_PAGER_HEIGHT))
TimerRow(timeString = uiState.currentTime, isTimeAos = uiState.isTimeAos) } else {
NextPassRow(pass = upcomingPass, modifier = Modifier.weight(1f), isUtc = uiState.isUtc) RadarCard(uiState, trackB, trackBPosition, Modifier.weight(1f))
IconCard(action = addToCalendar, resId = R.drawable.ic_calendar) PagerCard(uiState, onAction, logViewModel, requestMicPermission, Modifier.weight(1f))
} }
} } else {
if (isVertical) { Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {
RadarCard(uiState, trackB, trackBPosition, Modifier.weight(radarWeight)) RadarCard(uiState, trackB, trackBPosition, Modifier.weight(1f))
PagerCard(uiState, onAction, logViewModel, requestMicPermission, Modifier.weight(pagerWeight)) PagerCard(uiState, onAction, logViewModel, requestMicPermission, Modifier.weight(1f))
} else { }
Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {
RadarCard(uiState, trackB, trackBPosition, Modifier.weight(1f))
PagerCard(uiState, onAction, logViewModel, requestMicPermission, Modifier.weight(1f))
} }
} }
} }
+2 -2
View File
@@ -1,8 +1,8 @@
[versions] [versions]
#noinspection UnusedVersionCatalogEntry #noinspection UnusedVersionCatalogEntry
appVersionCode = "527" appVersionCode = "529"
#noinspection UnusedVersionCatalogEntry #noinspection UnusedVersionCatalogEntry
appVersionName = "4.4.7-ba7opf.17.4" appVersionName = "4.4.7-ba7opf.17.6"
#noinspection UnusedVersionCatalogEntry #noinspection UnusedVersionCatalogEntry
compileSdk = "37" compileSdk = "37"
#noinspection UnusedVersionCatalogEntry #noinspection UnusedVersionCatalogEntry